<?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>40425</bug_id>
          
          <creation_ts>2010-06-10 09:03:23 -0700</creation_ts>
          <short_desc>Web Inspector: provide API for content scripts to interact with the inspector</short_desc>
          <delta_ts>2010-10-31 14:37:44 -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>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Andrey Kosyakov">caseq</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>bweinstein</cc>
    
    <cc>christoph</cc>
    
    <cc>eric</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>masterov</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rik</cc>
    
    <cc>sroussey</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>236384</commentid>
    <comment_count>0</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-06-10 09:03:23 -0700</bug_when>
    <thetext>Rationale for supporting extensions:
- Integration for existing development tools into WebInspector
- Stuff that is not generic enough to be a part of WebKit (audits/validators, support for specific server frameworks or client libraries)
- Stuff with incompatible licenses, lack of browser support etc.

Proposed integration points:
- UI integration: be able to create a pane or add a sidebar to an existing pane, request inspector to display particular resource etc.
- access inspector objects associated with the inspected page, such as resource records, console messages, potentially scripts etc.
- ability to evaluate JS code on inspected page (to access DOM and JS state);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236385</commentid>
    <comment_count>1</comment_count>
      <attachid>58376</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-06-10 09:07:12 -0700</bug_when>
    <thetext>Created attachment 58376
Extension API draft

This is very preliminary, just to get discussion started.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236387</commentid>
    <comment_count>2</comment_count>
      <attachid>58377</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-06-10 09:17:40 -0700</bug_when>
    <thetext>Created attachment 58377
A demo of extension in action

This one is pretty useless, but gives an idea of what is currently supported.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256024</commentid>
    <comment_count>3</comment_count>
      <attachid>62567</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-26 06:52:56 -0700</bug_when>
    <thetext>Created attachment 62567
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256027</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-07-26 06:57:15 -0700</bug_when>
    <thetext>Attachment 62567 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/inspector/front-end/ExtensionServer.js:1:  One or more unexpected \r (^M) found; better to use only a \n  [whitespace/carriage_return] [1]
Suppressing further [whitespace/carriage_return] reports for this file.
WebCore/inspector/front-end/ExtensionRegistryStub.js:1:  One or more unexpected \r (^M) found; better to use only a \n  [whitespace/carriage_return] [1]
Suppressing further [whitespace/carriage_return] reports for this file.
WebCore/inspector/front-end/ExtensionAPI.js:1:  One or more unexpected \r (^M) found; better to use only a \n  [whitespace/carriage_return] [1]
Suppressing further [whitespace/carriage_return] reports for this file.
Total errors found: 646 in 25 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256031</commentid>
    <comment_count>5</comment_count>
      <attachid>62568</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-26 07:12:34 -0700</bug_when>
    <thetext>Created attachment 62568
patch (EOLs fixed)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256052</commentid>
    <comment_count>6</comment_count>
      <attachid>62578</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-26 08:36:23 -0700</bug_when>
    <thetext>Created attachment 62578
updated API draft</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256473</commentid>
    <comment_count>7</comment_count>
      <attachid>62568</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-07-27 02:49:05 -0700</bug_when>
    <thetext>Comment on attachment 62568
patch (EOLs fixed)

I started it, but got distracted. Will continue a bit later.

WebCore/inspector/InspectorController.cpp:461
 +      if (m_scriptsToEvaluateOnLoad.size()) {
Why did this move? Looks fragile in case something depends on such a move internally.

WebCore/inspector/InspectorFrontendHost.cpp:195
 +  void InspectorFrontendHost::setExtensionAPI(const String&amp; script)
Here and below: we should refer to extensions api as to plural. Also, we might want to make this functionality generic, no need to explicitly mention &quot;extension&quot; here.



WebCore/inspector/front-end/ElementsPanel.js:61
 +              WebInspector.extensionServer.notifyObjectSelected(&quot;elements&quot;, &quot;DOMNode&quot;);
extensionsServer?

WebCore/inspector/front-end/ElementsPanel.js:61
 +              WebInspector.extensionServer.notifyObjectSelected(&quot;elements&quot;, &quot;DOMNode&quot;);
What does &quot;elements&quot; stand for? Should it be a const?


WebCore/inspector/front-end/ExtensionAPI.js:31
 +  var extensionAPI = function(InjectedScriptHost, inspectedWindow, injectedScriptId)
extensionsAPI

WebCore/inspector/front-end/ExtensionAPI.js:31
 +  var extensionAPI = function(InjectedScriptHost, inspectedWindow, injectedScriptId)
This looks as if it is injected into the target page. You don&apos;t use InjectedScriptHost, inspectWindow and injectedScriptID, do you?

WebCore/inspector/front-end/ExtensionAPI.js:55
 +                  listeners[i] = listeners[listeners.length - 1];
splice?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256483</commentid>
    <comment_count>8</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-27 03:09:05 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 62568 [details])
&gt; I started it, but got distracted. Will continue a bit later.
&gt; 
&gt; WebCore/inspector/InspectorController.cpp:461
&gt;  +      if (m_scriptsToEvaluateOnLoad.size()) {
&gt; Why did this move? Looks fragile in case something depends on such a move internally.

It just happened to be put at the wrong place initially -- it gets injected too late in certain cases (namely, for iframes that get attached to a a detached tree initially, and then the tree is attached to the document). The only thing that depends on this is workers debugging and it still works.

&apos;
&gt; 
&gt; WebCore/inspector/InspectorFrontendHost.cpp:195
&gt;  +  void InspectorFrontendHost::setExtensionAPI(const String&amp; script)
&gt; Here and below: we should refer to extensions api as to plural. 

Will fix.

&gt; Also, we might want to make this functionality generic, no need to explicitly mention &quot;extension&quot; here.

Well, I guess these other APIs would still qualify as extensions, wouldn&apos;t they?

&gt; WebCore/inspector/front-end/ElementsPanel.js:61
&gt;  +              WebInspector.extensionServer.notifyObjectSelected(&quot;elements&quot;, &quot;DOMNode&quot;);
&gt; extensionsServer?
&gt; 
&gt; WebCore/inspector/front-end/ElementsPanel.js:61
&gt;  +              WebInspector.extensionServer.notifyObjectSelected(&quot;elements&quot;, &quot;DOMNode&quot;);
&gt; What does &quot;elements&quot; stand for? Should it be a const?

It&apos;s a panel id. Agree, will make a const.

&gt; WebCore/inspector/front-end/ExtensionAPI.js:31
&gt;  +  var extensionAPI = function(InjectedScriptHost, inspectedWindow, injectedScriptId)
&gt; extensionsAPI
&gt; 
&gt; WebCore/inspector/front-end/ExtensionAPI.js:31
&gt;  +  var extensionAPI = function(InjectedScriptHost, inspectedWindow, injectedScriptId)
&gt; This looks as if it is injected into the target page. You don&apos;t use InjectedScriptHost, inspectWindow and injectedScriptID, do you?
&gt; 

It is injected into the front-end page, but otherwise it&apos;s the same as if it were a tatget page (the means used to do injection are the same). injectedScriptId is actually used to derive unique object ids on the client side.

&gt; WebCore/inspector/front-end/ExtensionAPI.js:55
&gt;  +                  listeners[i] = listeners[listeners.length - 1];
&gt; splice?

Yes!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256534</commentid>
    <comment_count>9</comment_count>
      <attachid>62568</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-07-27 06:00:27 -0700</bug_when>
    <thetext>Comment on attachment 62568
patch (EOLs fixed)

WebCore/inspector/front-end/ExtensionAPI.js:34
 +  function EventSink(type)
Add comment claiming that it is not externally visible.

WebCore/inspector/front-end/ExtensionAPI.js:66
 +          for (listener in this._listeners)
Never fire while iterating over collection.

WebCore/inspector/front-end/ExtensionAPI.js:69
 +  };
no need for ;

WebCore/inspector/front-end/ExtensionAPI.js:92
 +      getAll: function(callback)
Lets start using JSDoc here.

WebCore/inspector/front-end/ExtensionAPI.js:123
 +      get: function(id)
I am not sure we need this accessor.

WebCore/inspector/front-end/ExtensionAPI.js:146
 +          extensionServer.sendRequest({ command: &quot;createPanel&quot;, id: id, label: label, url: expandURL(pageURL), icon: expandURL(iconURL) }, callback &amp;&amp; bind(callbackWrapper, this));
i&apos;d start formatting these vertically.

WebCore/inspector/front-end/ExtensionAPI.js:174
 +      this.onSearch = new EventSink(&quot;panel-search-&quot; + id);
Lets save onSearch until v5? :)

WebCore/inspector/front-end/ExtensionAPI.js:159
 +          var id = &quot;extension-sidebar-&quot; + extensionServer.nextObjectId;
make this a function

WebCore/inspector/front-end/ExtensionAPI.js:193
 +      setExpansion: function(state)
setExpanded(expanded)

WebCore/inspector/front-end/ExtensionPanel.js:33
 +      this.toolbarItemLabel = label;
Lets pull this property up and add it into the Panel&apos;s constructor.

WebCore/inspector/front-end/ExtensionPanel.js:36
 +      this.attach(); // Extension panel has to be attached so that extension can see it in DOM tree
You only need to call WebInspector.addPanelToolbarIcon here.

WebCore/inspector/front-end/ExtensionServer.js:125
 +          WebInspector.addPanelToolbarIcon(toolbarElement, panel, lastToolbarItem);
Ok.

WebCore/inspector/front-end/ExtensionServer.js:126
 +          WebInspector.panels[id] = panel;
This can kill all our code.

WebCore/inspector/front-end/ExtensionServer.js:134
 +              return this._status(&quot;E_NOTFOUND&quot;, message.panel);
Nice magic strings!

WebCore/inspector/front-end/ExtensionServer.js:226
 +          InspectorExtensionRegistry.getExtensions();
getExtensionsAsync

WebCore/inspector/front-end/ExtensionServer.js:235
 +      _addExtension: function(extension)
inline ?

WebCore/inspector/front-end/InjectedScript.js:246
 +          if (value != null &amp;&amp; typeof value !== &quot;string&quot;)
I&apos;d do try / catch JSON.stringify.

WebCore/inspector/front-end/inspector.js:1208
 +          this.extensionServer.notifyObjectCreated(&quot;resource&quot;, WebInspector.extensionServer.convertResource(resource));
here and below, only use constants for notifyObjectCreated and postEvent. Or do postResetEvent.

WebCore/inspector/front-end/inspector.js:1606
 +  WebInspector.addExtensions = function(extensions)
You can define this method in ExtensionServer.js and made server&apos;s one private to the unit.

General comment on tests: you should add a test for extension-facing API that would enumerate and whitelist all the accessible properties (see window.* tests).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256536</commentid>
    <comment_count>10</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-07-27 06:02:00 -0700</bug_when>
    <thetext>We are going to land this with the provision status. It is experimental, by no means it is final. Tim, Joe, we&apos;d like to open discussion about this can you look at it and post comments / chat over IRC / we could talk using Skype.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256577</commentid>
    <comment_count>11</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-07-27 07:38:15 -0700</bug_when>
    <thetext>A few comments:

* The access point should be webInspector or WebInspector, not webinspector.
* The use of Chrome style event listeners makes me sad. I think event sinks are ugly (the onFoo naming) and prefer the DOM addEventListener design.
* webinspector.panels.setExpanded(boolean expandedState) is listed under ExtensionSidebarPane, but that line of code is using the panels object not a sidebar. is that correct?
* webinspector.panels.revealAndSelect(string type, any id) does this select the right panel? Where do I get the id to use?
* All the &quot;The callback parameter should specify a function that looks like this&quot; examples are code snippets that are not valid JavaScript.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256628</commentid>
    <comment_count>12</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-27 08:45:07 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; A few comments:
&gt; 
&gt; * The access point should be webInspector or WebInspector, not webinspector.

Agree, will rename to webInspector.

&gt; * The use of Chrome style event listeners makes me sad. I think event sinks are ugly (the onFoo naming) and prefer the DOM addEventListener design.

There are couple of practical reasons (aside from mimicking Chrome :)) I thought it&apos;s going to be better this way:
- We don&apos;t rely on string constants, so whatever typos may be in event type, these are going to be quickly caught in the runtime (i.e. &quot;Cannot call method &apos;addListener&apos; of undefined&quot;, vs. quietly swallowing invalid event types as DOM does). We&apos;re generally trying to get rid of any magic strings in the interface for similar reasons. And those with smart IDEs (or using our console) are going to enjoy name completion ;)
- These aren&apos;t really DOM events, so any similarity may actually be confusing. There&apos;s also no support for bubbling, so third argument to addEventListener() wouldn&apos;t is not applicable either.

If you&apos;re still feeling bad because it&apos;s not consistent with Safari extension API style, we can have some wrappers, so that webInspector.foo.addEventListener(bar, func) translates into webInspector.foo.onBar.addListener(func).

&gt; * webinspector.panels.setExpanded(boolean expandedState) is listed under ExtensionSidebarPane, but that line of code is using the panels object not a sidebar. is that correct?

Oops, sorry -- this is a bug in template that is used to render the API schema (the schema itself is correct). I borrowed template from Chrome extension API docs, which is somewhat too specific for Chrome API conventions. I fixed some stuff there to fit our API  better, but some bugs still remain. I&apos;m only publishing it this way because it&apos;s better than nothing -- we need some API reference for convenience of review, but this is not appropriate for the end users. I guess we may want to supply just the JSON schema as part of WebCore, and rendering it to HTML would be specific for the browser and in accordance with browser&apos;s documentation conventions.

&gt; * webinspector.panels.revealAndSelect(string type, any id) does this select the right panel? 

Again, sorry for the poor rendering -- this is the method of the panel object, so it&apos;s mean to switch to given panel and cause the panel to display specified object.

&gt; Where do I get the id to use?

This is the ids you get in onCreated events or with getAll methods. We only have this for resources so far, but the plan is to have similar methods for console messages and scripts.

&gt; * All the &quot;The callback parameter should specify a function that looks like this&quot; examples are code snippets that are not valid JavaScript.

So are most of other function &quot;signatures&quot; -- obviously, we have to choose between showing valid JS and being able to specify types and other possible attributes. Again, this is just the template that I borrowed and I realize the rendering may be questionable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256688</commentid>
    <comment_count>13</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2010-07-27 10:46:48 -0700</bug_when>
    <thetext>&gt; webinspector.panels.onSelectionChanged
&gt; Fired when an objects (script, resource, DOM element etc) is selected in the panel.

I don&apos;t see the usefulness of this. Wouldn&apos;t you know when someone is selected
in your own panel? Was this added to handle a specific use case?

Or maybe I&apos;m misreading this and it means when an element is selected in a
native different Panel, like the Elements or Storage panel.


&gt; webinspector.panels.onShown

There is an onShown but not an onHidden? If an inspector extension wants to do
something really wild, they may need to detect when a panel change is made.


&gt; webinspector.consoleMessages

I think webInspector.console seems more appropriate. It would change the events
to &quot;addMessage&quot; and &quot;onMessageAdded&quot;, but it opens the door to future console
related tasks.


&gt; webinspector.consoleMessages.add(ConsoleMessage message)

Directly using the WebInspector.ConsoleMessage type is nice, but it means that
changing the internal ConsoleMessage type in the future could break extensions.
Should there be an intermediate representation for conversion?

This concern goes for all places where internal objects would be used directly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256690</commentid>
    <comment_count>14</comment_count>
      <attachid>62568</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2010-07-27 10:47:01 -0700</bug_when>
    <thetext>Comment on attachment 62568
patch (EOLs fixed)

&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,107 @@
&gt; +2010-07-26  Andrey Kosyakov  &lt;caseq@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Web Inspector: basic support of WebInspector extensions API.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=40425
&gt; +        Test: inspector/extensions.html
&gt; +
&gt;          ...

This is pretty bare. I think it would go a long way to add at least
a comment that this is experimental. Also, I always recommend giving
a brief description of new files in the ChangeLog.


&gt; +            &apos;inspector/front-end/ExtensionAPI.js&apos;,
&gt; +            &apos;inspector/front-end/ExtensionPanel.js&apos;,
&gt; +            &apos;inspector/front-end/ExtensionRegistryStub.js&apos;,
&gt; +            &apos;inspector/front-end/ExtensionServer.js&apos;,

New inspector files are typically added to WebCore/inspector/front-end/WebKit.qrc.
There is a helper script to generate it, but I actually have never used it:
WebKitTools/Scripts/generate-qt-inspector-resource



&gt; Index: WebCore/inspector/InspectorController.cpp
&gt; ===================================================================
&gt; +    if (m_scriptsToEvaluateOnLoad.size()) {
&gt; +        ScriptState* scriptState = mainWorldScriptState(frame);
&gt; +        for (Vector&lt;String&gt;::iterator it = m_scriptsToEvaluateOnLoad.begin();
&gt; +             it != m_scriptsToEvaluateOnLoad.end(); ++it) {
&gt; +            m_injectedScriptHost-&gt;injectScript(*it, scriptState);
&gt; +        }
&gt; +    }
&gt; +
&gt;      if (!enabled() || !m_frontend || frame != m_inspectedPage-&gt;mainFrame())
&gt;          return;

Seems weird to inject scripts before checking if the Web Inspector is
enabled() or not. I don&apos;t think this is correct.


&gt; Index: WebCore/inspector/front-end/ExtensionAPI.js
&gt; ===================================================================
&gt; +function bind(func, thisObject)
&gt; +{
&gt; +    var args = Array.prototype.slice.call(arguments, 2);
&gt; +    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))); };
&gt; +}

Can you use the utilities.js&apos;s Function.prototype.bind?


&gt; Index: WebCore/inspector/front-end/ExtensionServer.js
&gt; ===================================================================

&gt; +    initExtensions: function(extensions)
&gt; +    {
&gt; +        InspectorFrontendHost.setExtensionAPI(&quot;(&quot; + extensionAPI + &quot;)&quot;);
&gt; +        InspectorExtensionRegistry.getExtensions();
&gt; +    },

This could use a comment because extensionAPI is defined in a different file,
and its actually a function. I think it would be nice to see toString() on it.
Also, the parameter, &quot;extensions&quot; is not used.


&gt; +    _addExtension: function(extension)
&gt; +    {
&gt;          ...
&gt; +        } catch (e) {
&gt; +            console.log(&quot;Failed to initialize extension &quot; + extension.startPage + &quot;:&quot; + e);
&gt; +        }
&gt; +    },

Typically we make these console.error(). They show up in red in the inspector&apos;s
inspector which makes them more noticeable.


&gt; Index: WebCore/inspector/front-end/InjectedScript.js
&gt; ===================================================================

&gt; +        if (value != null &amp;&amp; typeof value !== &quot;string&quot;)

We strive for === as much as possible, but this might be acceptable.
&quot;value != null&quot; is only true when value is null or undefined. But
it still takes a bit of memorization.


This code looked pretty solid too me. Huge patch though, so I skimmed
quite a bit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256700</commentid>
    <comment_count>15</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-27 11:04:32 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; &gt; webinspector.panels.onSelectionChanged
&gt; &gt; Fired when an objects (script, resource, DOM element etc) is selected in the panel.
&gt; 
&gt; I don&apos;t see the usefulness of this. Wouldn&apos;t you know when someone is selected
&gt; in your own panel? Was this added to handle a specific use case?
&gt; 
&gt; Or maybe I&apos;m misreading this and it means when an element is selected in a
&gt; native different Panel, like the Elements or Storage panel.

Exactly -- this is meant to let the extension know when inspector object is selected in inspector&apos;s panel, not extension panel. The primary use case for that is to update contents of sidebar panes or any other UI that depends on a currently selected item.

&gt; &gt; webinspector.panels.onShown
&gt; 
&gt; There is an onShown but not an onHidden? If an inspector extension wants to do
&gt; something really wild, they may need to detect when a panel change is made.
&gt; 

Yes, I&apos;ll add that. The intent of onShown was primarily to let the panel do some expensive stuff lazily only when it is shown, but I think having onHidden is good for consistency.

&gt; &gt; webinspector.consoleMessages
&gt; 
&gt; I think webInspector.console seems more appropriate. It would change the events
&gt; to &quot;addMessage&quot; and &quot;onMessageAdded&quot;, but it opens the door to future console
&gt; related tasks.

This also makes sense. Anyway, console functionality only exists in the API draft at the moment, we need some more time to think over it.


&gt; &gt; webinspector.consoleMessages.add(ConsoleMessage message)
&gt; 
&gt; Directly using the WebInspector.ConsoleMessage type is nice, but it means that
&gt; changing the internal ConsoleMessage type in the future could break extensions.
&gt; Should there be an intermediate representation for conversion?

Sure, there definitely going to be an intermediate representation.

&gt; This concern goes for all places where internal objects would be used directly.

We already do that for the only object type we support (which is resource).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256716</commentid>
    <comment_count>16</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-27 11:28:42 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; (From update of attachment 62568 [details])
&gt; &gt; +++ WebCore/ChangeLog	(working copy)
&gt; &gt; @@ -1,3 +1,107 @@
&gt; &gt; +2010-07-26  Andrey Kosyakov  &lt;caseq@chromium.org&gt;
&gt; &gt; +
&gt; &gt; +        Reviewed by NOBODY (OOPS!).
&gt; &gt; +
&gt; &gt; +        Web Inspector: basic support of WebInspector extensions API.
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=40425
&gt; &gt; +        Test: inspector/extensions.html
&gt; &gt; +
&gt; &gt;          ...
&gt; 
&gt; This is pretty bare. I think it would go a long way to add at least
&gt; a comment that this is experimental. Also, I always recommend giving
&gt; a brief description of new files in the ChangeLog.

Yup, will fix.

&gt; &gt; +            &apos;inspector/front-end/ExtensionAPI.js&apos;,
&gt; &gt; +            &apos;inspector/front-end/ExtensionPanel.js&apos;,
&gt; &gt; +            &apos;inspector/front-end/ExtensionRegistryStub.js&apos;,
&gt; &gt; +            &apos;inspector/front-end/ExtensionServer.js&apos;,
&gt; 
&gt; New inspector files are typically added to WebCore/inspector/front-end/WebKit.qrc.
&gt; There is a helper script to generate it, but I actually have never used it:
&gt; WebKitTools/Scripts/generate-qt-inspector-resource

Thanks for spotting this, I used to know that but keep forgetting :)

&gt; &gt; Index: WebCore/inspector/InspectorController.cpp
&gt; &gt; ===================================================================
&gt; &gt; +    if (m_scriptsToEvaluateOnLoad.size()) {
&gt; &gt; +        ScriptState* scriptState = mainWorldScriptState(frame);
&gt; &gt; +        for (Vector&lt;String&gt;::iterator it = m_scriptsToEvaluateOnLoad.begin();
&gt; &gt; +             it != m_scriptsToEvaluateOnLoad.end(); ++it) {
&gt; &gt; +            m_injectedScriptHost-&gt;injectScript(*it, scriptState);
&gt; &gt; +        }
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt;      if (!enabled() || !m_frontend || frame != m_inspectedPage-&gt;mainFrame())
&gt; &gt;          return;
&gt; 
&gt; Seems weird to inject scripts before checking if the Web Inspector is
&gt; enabled() or not. I don&apos;t think this is correct.

The only way to add scripts to m_scriptsToEvaluateOnLoad is via inspector, so it&apos;s going to be empty unless it&apos;s enabled. Adding an extra check won&apos;t hurt, though.


&gt; &gt; Index: WebCore/inspector/front-end/ExtensionAPI.js
&gt; &gt; ===================================================================
&gt; &gt; +function bind(func, thisObject)
&gt; &gt; +{
&gt; &gt; +    var args = Array.prototype.slice.call(arguments, 2);
&gt; &gt; +    return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))); };
&gt; &gt; +}
&gt; 
&gt; Can you use the utilities.js&apos;s Function.prototype.bind?

No -- this is an injected script, so utilities.js is not there, and Function.prototype is visible in client context, so we don&apos;t want to touch it.

&gt; &gt; +    initExtensions: function(extensions)
&gt; 
&gt; This could use a comment because extensionAPI is defined in a different file,
&gt; and its actually a function. I think it would be nice to see toString() on it.

It looks like it&apos;s a common pattern now, given that we also do this for InjectedScript and InjectedFakeWorkers. I don&apos;t mind adding this, though. Just thought it could be renamed to injectedExtensionAPI or even injectedExtensionAPIConstructor for consistency with other two cases.

&gt; Also, the parameter, &quot;extensions&quot; is not used.
&gt; &gt; +    _addExtension: function(extension)
&gt; &gt; +    {
&gt; &gt;          ...
&gt; &gt; +        } catch (e) {
&gt; &gt; +            console.log(&quot;Failed to initialize extension &quot; + extension.startPage + &quot;:&quot; + e);
&gt; &gt; +        }
&gt; &gt; +    },
&gt; 
&gt; Typically we make these console.error(). They show up in red in the inspector&apos;s
&gt; inspector which makes them more noticeable.

Thanks, fixed both of the above!

&gt; &gt; Index: WebCore/inspector/front-end/InjectedScript.js
&gt; &gt; ===================================================================
&gt; 
&gt; &gt; +        if (value != null &amp;&amp; typeof value !== &quot;string&quot;)
&gt; 
&gt; We strive for === as much as possible, but this might be acceptable.
&gt; &quot;value != null&quot; is only true when value is null or undefined. But
&gt; it still takes a bit of memorization.

value != null was there on purpose, as I actually wanted this to cover both null and undefined. This will go away, though, as we decided just to do a JSON.stringify() on the resulting object unconditionally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257225</commentid>
    <comment_count>17</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-28 10:02:35 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 62568 [details])
&gt; WebCore/inspector/front-end/ExtensionAPI.js:34
&gt;  +  function EventSink(type)
&gt; Add comment claiming that it is not externally visible.
&gt; 
&gt; WebCore/inspector/front-end/ExtensionAPI.js:66
&gt;  +          for (listener in this._listeners)
&gt; Never fire while iterating over collection.
&gt; 
&gt; WebCore/inspector/front-end/ExtensionAPI.js:69
&gt;  +  };
&gt; no need for ;

Fixed.

&gt; 
&gt; WebCore/inspector/front-end/ExtensionAPI.js:92
&gt;  +      getAll: function(callback)
&gt; Lets start using JSDoc here.

Let&apos;s do this later -- whatever JSDoc we may have in ExtensionsAPI.js would not map directly on API that is visible to user because of xxxImpl classes we use to hide internal properties in closures and because callback parameters are often formed on the server sides and passed by the API side as is.


&gt; WebCore/inspector/front-end/ExtensionAPI.js:123
&gt;  +      get: function(id)
&gt; I am not sure we need this accessor.

Dropped it. The idea was that we may want to get extension panels in other extensions or in other iframes of the same extension, but we agreed that we don&apos;t want this for the moment.

&gt; WebCore/inspector/front-end/ExtensionAPI.js:146
&gt;  +          extensionServer.sendRequest({ command: &quot;createPanel&quot;, id: id, label: label, url: expandURL(pageURL), icon: expandURL(iconURL) }, callback &amp;&amp; bind(callbackWrapper, this));
&gt; i&apos;d start formatting these vertically.
Done.

&gt; WebCore/inspector/front-end/ExtensionAPI.js:174
&gt;  +      this.onSearch = new EventSink(&quot;panel-search-&quot; + id);
&gt; Lets save onSearch until v5? :)

Why -- it doesn&apos;t cost us much?

&gt; WebCore/inspector/front-end/ExtensionAPI.js:159
&gt;  +          var id = &quot;extension-sidebar-&quot; + extensionServer.nextObjectId;
&gt; make this a function
&gt; 
&gt; WebCore/inspector/front-end/ExtensionAPI.js:193
&gt;  +      setExpansion: function(state)
&gt; setExpanded(expanded)

Fixed.

&gt; WebCore/inspector/front-end/ExtensionPanel.js:33
&gt;  +      this.toolbarItemLabel = label;
&gt; Lets pull this property up and add it into the Panel&apos;s constructor.

Let&apos;s make it a separate change -- it&apos;s a refactoring, is logically independent and will touch every panel.

&gt; WebCore/inspector/front-end/ExtensionPanel.js:36
&gt;  +      this.attach(); // Extension panel has to be attached so that extension can see it in DOM tree
&gt; You only need to call WebInspector.addPanelToolbarIcon here.

Removed attach, addPanelToolbarIcon is one layer up for consistency with other panels.

&gt; WebCore/inspector/front-end/ExtensionServer.js:125
&gt;  +          WebInspector.addPanelToolbarIcon(toolbarElement, panel, lastToolbarItem);
&gt; Ok.
&gt; 
&gt; WebCore/inspector/front-end/ExtensionServer.js:126
&gt;  +          WebInspector.panels[id] = panel;
&gt; This can kill all our code.
Fixed.

&gt; 
&gt; WebCore/inspector/front-end/ExtensionServer.js:134
&gt;  +              return this._status(&quot;E_NOTFOUND&quot;, message.panel);
&gt; Nice magic strings!

Replaced magic strings with functions, i.e. this._stauts.E_NOTFOUND(message.panel);

&gt; WebCore/inspector/front-end/ExtensionServer.js:226
&gt;  +          InspectorExtensionRegistry.getExtensions();
&gt; getExtensionsAsync
&gt; WebCore/inspector/front-end/ExtensionServer.js:235
&gt;  +      _addExtension: function(extension)
&gt; inline ?
&gt; 
&gt; WebCore/inspector/front-end/InjectedScript.js:246
&gt;  +          if (value != null &amp;&amp; typeof value !== &quot;string&quot;)
&gt; I&apos;d do try / catch JSON.stringify.
&gt; 
&gt; WebCore/inspector/front-end/inspector.js:1208
&gt;  +          this.extensionServer.notifyObjectCreated(&quot;resource&quot;, WebInspector.extensionServer.convertResource(resource));
&gt; here and below, only use constants for notifyObjectCreated and postEvent. Or do postResetEvent.
&gt; 
&gt; WebCore/inspector/front-end/inspector.js:1606
&gt;  +  WebInspector.addExtensions = function(extensions)
&gt; You can define this method in ExtensionServer.js and made server&apos;s one private to the unit.
&gt; 
&gt; General comment on tests: you should add a test for extension-facing API that would enumerate and whitelist all the accessible properties (see window.* tests).

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257231</commentid>
    <comment_count>18</comment_count>
      <attachid>62843</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-28 10:14:03 -0700</bug_when>
    <thetext>Created attachment 62843
patch

- Removed magic strings when sending notifications on server side and when creating statuses
- Do not attach panel upon creation
- Invoke callbacks right after client iframes are created, not in their onload (to support detached panels; may need ExtensionPanel.onLoad and ExtensionSidebarPane.onLoad)
- Hidden internal fields in API classes in closures
- Added dumping API fields in layout tests
- JSON.stringify everything resulting from eval in inspected page
- Removed webInspector.panels.get()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257245</commentid>
    <comment_count>19</comment_count>
      <attachid>62843</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-07-28 10:49:38 -0700</bug_when>
    <thetext>Comment on attachment 62843
patch

LayoutTests/inspector/extensions-expected.txt:50
 +              createSidebarPane : &lt;function&gt;
resources panel does not have sidebar. r- for this.

LayoutTests/inspector/extensions-expected.txt:56
 +              createSidebarPane : &lt;function&gt;
ditto.

LayoutTests/inspector/extensions-expected.txt:59
 +              createSidebarPane : &lt;function&gt;
ditto.

LayoutTests/inspector/extensions-expected.txt:62
 +              createSidebarPane : &lt;function&gt;
ditto.

LayoutTests/inspector/extensions-expected.txt:65
 +              createSidebarPane : &lt;function&gt;
ditto.

LayoutTests/inspector/extensions-expected.txt:68
 +              createSidebarPane : &lt;function&gt;
ditto.

For LayoutTests/inspector/extensions-expected.txt:30
 +          onLoaded : {
Lets mimic these with reflective addEventListener(&quot;load&quot;) as Timothy suggested. r- for this.

LayoutTests/inspector/extensions-expected.txt:73
 +          onCreated : {
onFinished?

LayoutTests/inspector/extensions-expected.txt:91
 +  &gt;&gt;&gt; test_resourceNotification
&gt;&gt;&gt; will be used by the conflict resolve tool as well. Change to something else?

LayoutTests/inspector/extensions-expected.txt:5
 +  &gt;&gt;&gt; test_createPanel
Each test should be in its own file. Or at least separate panel tests from APIs from inspectedWindow&apos;s and such. This could be done in a follow-up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257310</commentid>
    <comment_count>20</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-28 12:56:58 -0700</bug_when>
    <thetext>(In reply to comment #19)

&gt; For LayoutTests/inspector/extensions-expected.txt:30
&gt;  +          onLoaded : {
&gt; Lets mimic these with reflective addEventListener(&quot;load&quot;) as Timothy suggested. r- for this.

This is possible, but comes at a cost: presently, &quot;chrome-style&quot; event handles have arbitrary signatures -- i.e. they may have a number of parameters. With DOM-style handlers, these parameters would have to be converted to named properties of a DOM event. So for every event type we&apos;d have to maintain a wrapper that converts the arguments from array to object with named property (or vice-versa, depending on how we send them). This will lead to some code bloat, obviously.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258198</commentid>
    <comment_count>21</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-30 08:08:49 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; (From update of attachment 62843 [details])
&gt; LayoutTests/inspector/extensions-expected.txt:50
&gt;  +              createSidebarPane : &lt;function&gt;
&gt; resources panel does not have sidebar. r- for this.
&gt; 
&gt; LayoutTests/inspector/extensions-expected.txt:56
&gt;  +              createSidebarPane : &lt;function&gt;
&gt; ditto.
&gt; 
&gt; LayoutTests/inspector/extensions-expected.txt:59
&gt;  +              createSidebarPane : &lt;function&gt;
&gt; ditto.
&gt; 
&gt; LayoutTests/inspector/extensions-expected.txt:62
&gt;  +              createSidebarPane : &lt;function&gt;
&gt; ditto.
&gt; 
&gt; LayoutTests/inspector/extensions-expected.txt:65
&gt;  +              createSidebarPane : &lt;function&gt;
&gt; ditto.
&gt; 
&gt; LayoutTests/inspector/extensions-expected.txt:68
&gt;  +              createSidebarPane : &lt;function&gt;
&gt; ditto.
&gt; 

I&apos;m dropping support for panels other than scripts and elements now, will add it back later when we have some other methods (e.g. revealAndSelect) supported.

&gt; For LayoutTests/inspector/extensions-expected.txt:30
&gt;  +          onLoaded : {
&gt; Lets mimic these with reflective addEventListener(&quot;load&quot;) as Timothy suggested. r- for this.

Will do later, filed https://bugs.webkit.org/show_bug.cgi?id=43251 for that.

&gt; 
&gt; LayoutTests/inspector/extensions-expected.txt:73
&gt;  +          onCreated : {
&gt; onFinished?

Done.

&gt; 
&gt; LayoutTests/inspector/extensions-expected.txt:91
&gt;  +  &gt;&gt;&gt; test_resourceNotification
&gt; &gt;&gt;&gt; will be used by the conflict resolve tool as well. Change to something else?
&gt;

Done.
 
&gt; LayoutTests/inspector/extensions-expected.txt:5
&gt;  +  &gt;&gt;&gt; test_createPanel
&gt; Each test should be in its own file. Or at least separate panel tests from APIs from inspectedWindow&apos;s and such. This could be done in a follow-up.

I&apos;ve changed the extension tests to make splitting the tests easier and separated the API dump. The other tests are still together, but Im going to split them when more tests are introduced.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258201</commentid>
    <comment_count>22</comment_count>
      <attachid>63061</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-30 08:23:12 -0700</bug_when>
    <thetext>Created attachment 63061
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258222</commentid>
    <comment_count>23</comment_count>
      <attachid>63061</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-07-30 09:17:48 -0700</bug_when>
    <thetext>Comment on attachment 63061
patch

Please land by hand.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258235</commentid>
    <comment_count>24</comment_count>
      <attachid>63061</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2010-07-30 09:49:57 -0700</bug_when>
    <thetext>Comment on attachment 63061
patch

&gt; Index: WebCore/inspector/InspectorController.cpp
&gt; ===================================================================
&gt; -    if (!enabled() || !m_frontend || frame != m_inspectedPage-&gt;mainFrame())
&gt; +    if (!enabled())
&gt; +        return;
&gt; +
&gt; +    if (m_scriptsToEvaluateOnLoad.size()) {
&gt; +        ScriptState* scriptState = mainWorldScriptState(frame);
&gt; +        for (Vector&lt;String&gt;::iterator it = m_scriptsToEvaluateOnLoad.begin();
&gt; +             it != m_scriptsToEvaluateOnLoad.end(); ++it) {
&gt; +            m_injectedScriptHost-&gt;injectScript(*it, scriptState);
&gt; +        }
&gt; +    }
&gt; +
&gt; +    if (!m_frontend || frame != m_inspectedPage-&gt;mainFrame())
&gt;          return;
&gt;      m_injectedScriptHost-&gt;discardInjectedScripts();
&gt;  }

Minor point, which shouldn&apos;t prevent landing.
This still doesn&apos;t look right to me. It looks like:

  1. if its disabled leave.
  2. inject scripts.
  3. if there is no frontend, leave.
  4. discard injected scripts map.

It could be we just don&apos;t need the injected scripts any more,
but if that is the case shouldn&apos;t we discard in the early return
as well?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258283</commentid>
    <comment_count>25</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-30 10:39:24 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; (From update of attachment 63061 [details])
&gt; &gt; Index: WebCore/inspector/InspectorController.cpp
&gt; &gt; ===================================================================
&gt; &gt; -    if (!enabled() || !m_frontend || frame != m_inspectedPage-&gt;mainFrame())
&gt; &gt; +    if (!enabled())
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    if (m_scriptsToEvaluateOnLoad.size()) {
&gt; &gt; +        ScriptState* scriptState = mainWorldScriptState(frame);
&gt; &gt; +        for (Vector&lt;String&gt;::iterator it = m_scriptsToEvaluateOnLoad.begin();
&gt; &gt; +             it != m_scriptsToEvaluateOnLoad.end(); ++it) {
&gt; &gt; +            m_injectedScriptHost-&gt;injectScript(*it, scriptState);
&gt; &gt; +        }
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    if (!m_frontend || frame != m_inspectedPage-&gt;mainFrame())
&gt; &gt;          return;
&gt; &gt;      m_injectedScriptHost-&gt;discardInjectedScripts();
&gt; &gt;  }
&gt; 
&gt; Minor point, which shouldn&apos;t prevent landing.
&gt; This still doesn&apos;t look right to me. It looks like:
&gt; 
&gt;   1. if its disabled leave.
&gt;   2. inject scripts.
&gt;   3. if there is no frontend, leave.
&gt;   4. discard injected scripts map.
&gt; 
&gt; It could be we just don&apos;t need the injected scripts any more,
&gt; but if that is the case shouldn&apos;t we discard in the early return
&gt; as well?

The discardInjectedScripts() logic does not change with this patch. We used to skip it if ether (a) inspector is not enabled, (b) frontend is not attached, or (c) the event comes for a subframe. I&apos;m just inserting my code between (a) and (b). Actually, I think (a) is redundant both for injection of scriptsToEvaluateOnLoad and discardInjectedScripts(), as both are supposed to be a NOP in this case -- so we _could_ discard in early return as well (or remove the check altogether), but my idea was to leave the discardInjectedScripts() logic intact -- just in case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258291</commentid>
    <comment_count>26</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-07-30 10:52:41 -0700</bug_when>
    <thetext>&gt; The discardInjectedScripts() logic does not change with this patch. We used to skip it if ether (a) inspector is not enabled, (b) frontend is not attached, or (c) the event comes for a subframe. I&apos;m just inserting my code between (a) and (b). Actually, I think (a) is redundant both for injection of scriptsToEvaluateOnLoad and discardInjectedScripts(), as both are supposed to be a NOP in this case -- so we _could_ discard in early return as well (or remove the check altogether), but my idea was to leave the discardInjectedScripts() logic intact -- just in case.

Ugh, sorry, I realized that you refer to second return as early return and imply that we may be clearing the ids of injected scripts we just created under certain circumstances. Well, this should not cause problems as the ids of this sort of injected scripts are never used, but I agree it would be better to do this consistently. I think we&apos;ll change this to

if (enabled()) {
    if (m_frontend &amp;&amp; frame == m_inspectedPage-&gt;mainFrame())
        m_injectedScriptHost-&gt;discardInjectedScripts();

    // inject m_scriptsToEvaluateOnLoad() here.
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258809</commentid>
    <comment_count>27</comment_count>
      <attachid>63199</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-08-02 05:38:42 -0700</bug_when>
    <thetext>Created attachment 63199
patch to land

- Fixed API script injection
- Fixed tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258828</commentid>
    <comment_count>28</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-02 06:14:16 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/64458 might have broken Qt Linux Release</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259017</commentid>
    <comment_count>29</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-08-02 11:46:34 -0700</bug_when>
    <thetext>Just to make sure:

Was this landed as experimental behing a flag? Before it leaves experimental status we need to have API review with the broader WebKit community.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259026</commentid>
    <comment_count>30</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-08-02 12:04:00 -0700</bug_when>
    <thetext>(In reply to comment #29)
&gt; Just to make sure:
&gt; 
&gt; Was this landed as experimental behing a flag? Before it leaves experimental status we need to have API review with the broader WebKit community.

This change has been landed, but extensions can&apos;t yet be instantiated: registry that would do that is not ready. We&apos;d like to silently (with people on Web Inspector list involved) iterate over the feature until we feel it is ready for broader WebKit community. There are no plans on making extensions available / announcing / blog posing on then any time soon.

Wrt API review by WebKit community, whom would you like to involve? I&apos;d like to see Web Inspector, Extensions and FireBug extensions people discussing it. I&apos;d really prefer to keep this feature small and unimportant so that we could iterate over it rapidly. Otherwise, if we feel review process is slowing us down, we might have to drop it...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259335</commentid>
    <comment_count>31</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-08-03 03:00:14 -0700</bug_when>
    <thetext>Committed r64458
	M	WebCore/ChangeLog
	M	WebCore/WebCore.vcproj/WebCore.vcproj
	M	WebCore/WebCore.gypi
	M	WebCore/inspector/InspectorFrontendHost.cpp
	M	WebCore/inspector/InspectorController.cpp
	M	WebCore/inspector/InspectorFrontendHost.h
	A	WebCore/inspector/front-end/ExtensionAPI.js
	M	WebCore/inspector/front-end/InspectorFrontendHostStub.js
	M	WebCore/inspector/front-end/inspector.html
	M	WebCore/inspector/front-end/inspector.js
	M	WebCore/inspector/front-end/InjectedScript.js
	A	WebCore/inspector/front-end/ExtensionPanel.js
	M	WebCore/inspector/front-end/ElementsPanel.js
	A	WebCore/inspector/front-end/ExtensionServer.js
	A	WebCore/inspector/front-end/ExtensionRegistryStub.js
	M	WebCore/inspector/front-end/InjectedScriptAccess.js
	M	WebCore/inspector/front-end/WebKit.qrc
	M	WebCore/inspector/InspectorFrontendHost.idl
	M	LayoutTests/http/tests/inspector/inspector-test.js
	M	LayoutTests/platform/chromium/test_expectations.txt
	A	LayoutTests/inspector/extensions-test.js
	A	LayoutTests/inspector/extensions-api-expected.txt
	A	LayoutTests/inspector/extensions-api.html
	A	LayoutTests/inspector/extensions-expected.txt
	A	LayoutTests/inspector/extensions.html
	A	LayoutTests/inspector/resources/extension-main.html
	A	LayoutTests/inspector/resources/extension-sidebar.html
	A	LayoutTests/inspector/resources/extension-main.js
	A	LayoutTests/inspector/resources/extension-panel.html
	M	LayoutTests/ChangeLog
r64458 = 6a07f07ffe5acc63ca14e52486c2bd1162f8bea6 (refs/remotes/trunk)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259336</commentid>
    <comment_count>32</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-08-03 03:01:23 -0700</bug_when>
    <thetext>Web Inspector: Extensions API tests fail on Qt &amp; GTK
https://bugs.webkit.org/show_bug.cgi?id=43344</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259604</commentid>
    <comment_count>33</comment_count>
    <who name="Patrick Mueller">pmuellr</who>
    <bug_when>2010-08-03 12:02:51 -0700</bug_when>
    <thetext>(In reply to comment #30)
&gt; Wrt API review by WebKit community, whom would you like to involve? I&apos;d like to see Web Inspector, Extensions and FireBug extensions people discussing it. I&apos;d really prefer to keep this feature small and unimportant so that we could iterate over it rapidly. Otherwise, if we feel review process is slowing us down, we might have to drop it...

I chatted with John Barton from FireBug, and he would be interested in discussing.  Perhaps we could arrange a call, or IRC, or notes?

One thing John mentioned, was that there might be a desire to have Web Inspector support running FireBug extensions, but I don&apos;t think that&apos;s quite the shape of where this is going, but I haven&apos;t looked that deeply.  That certainly sounds like an interesting goal!

It would be good to state what the goal of having FireBug actually involved is; is there a suggestion that FireBug might support the Web Inspector Extension API, for instance?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259683</commentid>
    <comment_count>34</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-08-03 14:14:54 -0700</bug_when>
    <thetext>I doubt we will ever be able to run Firebug extensions because XUL is (almost always) used.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259687</commentid>
    <comment_count>35</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2010-08-03 14:23:45 -0700</bug_when>
    <thetext>Iterating rapidly is fine, but before flipping the switch to be something we need to support and keep from breaking, we need to have a good review of the API. Keeping it initially to ourselves is fine for now, but we need to solicit feedback from developers and other WebKit developers before making it all official. Otherwise there might be resentment about the design, after the point where it can&apos;t change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259698</commentid>
    <comment_count>36</comment_count>
    <who name="Christoph Dorn">christoph</who>
    <bug_when>2010-08-03 14:37:34 -0700</bug_when>
    <thetext>(In reply to comment #34)
&gt; I doubt we will ever be able to run Firebug extensions because XUL is (almost always) used.

That is not the case. Firefox extensions do rely on XUL a lot, but Firebug extensions primarily leverage the Firebug API and domplate template system which is pure JS/HTML/CSS.

I believe the goal for Firebug is to move towards dynamically loadable pure JS/HTML/CSS extensions possibly conforming to CommonJS and/or Jetpacks.

This kind of setup makes Firebug extensions an ideal candidate to run in other browsers as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>259860</commentid>
    <comment_count>37</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-08-03 21:41:40 -0700</bug_when>
    <thetext>I don&apos;t think we should aim API compatibility with FB. We have different UI, a bit different lifetime of things and such. In either case, extension authors would be able to split their code into the core, ui and client (host interaction). Core will be reused. It is much more important that we provide sufficient API for features that add value. When I was saying I&apos;d involve &quot;Firebug extensions&quot; people in the discussion, I meant extensions&apos; authors, not the framework owners. But having framework owners on board is surely great.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>299942</commentid>
    <comment_count>38</comment_count>
    <who name="Steven Roussey">sroussey</who>
    <bug_when>2010-10-26 19:53:47 -0700</bug_when>
    <thetext>It is difficult to discuss an API without using it. How does one build Chromium or WebKit with this enabled?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300074</commentid>
    <comment_count>39</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-10-27 02:10:00 -0700</bug_when>
    <thetext>(In reply to comment #38)
&gt; It is difficult to discuss an API without using it. How does one build Chromium or WebKit with this enabled?

This is already part of the build in the default configuration. For Chromium, however, you need to pass --enable-experimental-extension-apis flag when starting the browser. The layout tests (inspector/extensions-*.html) may be used as a reference for the current state of the API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300274</commentid>
    <comment_count>40</comment_count>
    <who name="Steven Roussey">sroussey</who>
    <bug_when>2010-10-27 09:13:20 -0700</bug_when>
    <thetext>Thanks. I already run with --enable-experimental-extension-apis though, and I have an extension with &quot;experimental&quot; added to the permissions of the manifest.json file, yet webInspector is still not defined.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300276</commentid>
    <comment_count>41</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2010-10-27 09:22:19 -0700</bug_when>
    <thetext>(In reply to comment #40)
&gt; Thanks. I already run with --enable-experimental-extension-apis though, and I have an extension with &quot;experimental&quot; added to the permissions of the manifest.json file, yet webInspector is still not defined.

This isn&apos;t exposed to extension pages other than designated Web Inspector / DevTools extensions. You need to have &quot;devtools_page&quot;: &quot;devtools.html&quot; in your manifest.json, which will cause devtools.html to be loaded as a hidden iframe into DevTools page and will get the webInspector.* API exposed. Sorry we don&apos;t have any public documentation yet (still working on it).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>302490</commentid>
    <comment_count>42</comment_count>
    <who name="Steven Roussey">sroussey</who>
    <bug_when>2010-10-31 14:21:19 -0700</bug_when>
    <thetext>I only need help getting to &quot;hello world&quot;. After that, I understand I am on my own until docs are made and that won&apos;t happen until the API is stable, and that is a ways away...

So I created a chrome extension and run chrome with the specified command line switch. I used the files below, but nothing happens. No iframe gets added (I checked with the inspector on the inspector). Using Chrom dev channel.

I could just get to step one...


manifest.json:

{
  &quot;name&quot;: &quot;test&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;test...&quot;,
  &quot;permissions&quot;: [&quot;experimental&quot;, &quot;tabs&quot;, &quot;http://*/*&quot;, &quot;https://*/*&quot;],
  &quot;devtools_page&quot;: &quot;illumination_devtools.html&quot;
}


devtools.html:

&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;script&gt;
    webInspector.panels.create(&quot;Test Panel&quot;, &quot;extension-panel.html&quot;, &quot;extension-panel.png&quot;, function(){});
    webInspector.panels.scripts.createSidebarPane(&quot;Test Sidebar&quot;, &quot;extension-sidebar.html&quot;, function(){});
    console.log(&quot;hello&quot;);
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>302491</commentid>
    <comment_count>43</comment_count>
    <who name="Steven Roussey">sroussey</who>
    <bug_when>2010-10-31 14:37:44 -0700</bug_when>
    <thetext>Scratch that, I&apos;m an idiot and misspelled my how html file (usually chrome complains if a file in the manifest does not exist, so *that* ought to be an issue perhaps).</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>58376</attachid>
            <date>2010-06-10 09:07:12 -0700</date>
            <delta_ts>2010-07-26 08:36:23 -0700</delta_ts>
            <desc>Extension API draft</desc>
            <filename>inspector-extension-api.html</filename>
            <type>text/html</type>
            <size>44575</size>
            <attacher name="Andrey Kosyakov">caseq</attacher>
            
              <data encoding="base64">PGh0bWw+DQo8aGVhZD4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KdmFyIGlu
c3BlY3RvckFQSSA9IFsNCiAgew0KICAgICJuYW1lc3BhY2UiOiAiaW5zcGVjdG9yIiwNCiAgICAi
dHlwZXMiOiBbDQogICAgICB7DQogICAgICAgICJpZCI6ICJJbnNwZWN0b3JPYmplY3QiLA0KICAg
ICAgICAidHlwZSI6ICJvYmplY3QiLA0KICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBnZW5lcmlj
IHdyYXBwZXIgdXNlZCB0byBzZW5kIG9iamVjdHMgdG8gZ2V0IG1ldGhvZCBjYWxsYmFja3MuIiwN
CiAgICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICAgImlkIjogew0KICAgICAgICAgICAg
InR5cGUiOiAic3RyaW5nIiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBpZCBmb3Ig
dGhlIG9iamVjdC4iIA0KICAgICAgICAgIH0sDQogICAgICAgICAgInZhbHVlIjogew0KICAgICAg
ICAgICAgInR5cGUiOiAib2JqZWN0IiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHZh
bHVlIG9mIHJlcXVlc3RlZCBvYmplY3QuIg0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAg
fQ0KICAgIF0sDQogICAgImZ1bmN0aW9ucyI6IFsNCiAgICAgIHsNCiAgICAgICAgIm5hbWUiOiAi
bG9nIiwNCiAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLA0KICAgICAgICAiZGVzY3JpcHRpb24i
OiAiTG9ncyBhIGxpbmUgdG8gaW5zcGVjdG9yJ3MgY29uc29sZS4iLA0KICAgICAgICAicGFyYW1l
dGVycyI6IFsNCiAgICAgICAgICB7DQogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLA0KICAg
ICAgICAgICAgIm5hbWUiOiAibWVzc2FnZSIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi
QSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gY29uc29sZS4iDQogICAgICAgICAgfQ0KICAgICAgICBd
DQogICAgICB9DQogICAgXQ0KICB9LA0KICB7DQogICAgIm5hbWVzcGFjZSI6ICJpbnNwZWN0b3Iu
aW5zcGVjdGVkUGFnZSIsDQogICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGFjY2VzcyB0byB0
aGUgcGFnZSBiZWluZyBpbnNwZWN0ZWQiLA0KICAgICJ0eXBlcyI6IFsNCiAgICAgIHsgDQogICAg
ICAgICJpZCI6ICJFdmFsdWF0aW9uUmVzdWx0IiwNCiAgICAgICAgInR5cGUiOiAib2JqZWN0IiwN
CiAgICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICAgImlzRXhjZXB0aW9uIjogew0KICAg
ICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi
U2V0IGlmIGV4Y2VwdGlvbiBoYXMgb2NjdXJlZCB3aGlsZSBldmFsdWF0aW5nIHRoZSBleHByZXNz
aW9uLiIsDQogICAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlDQogICAgICAgICAgfSwNCiAgICAg
ICAgICAidmFsdWUiOiB7DQogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLA0KICAgICAgICAg
ICAgImRlc2NyaXB0aW9uIjogIlJlc3VsdCBvZiBldmFsdWF0aW9uIChvciBleGNlcHRpb24gZGVz
Y3JpcHRpb24gaWYgaXNFeGNlcHRpb24gaXMgc2V0LiINCiAgICAgICAgICB9DQogICAgICAgIH0N
CiAgICAgIH0NCiAgICBdLA0KICAgICJmdW5jdGlvbnMiOiBbDQogICAgICB7DQogICAgICAgICJu
YW1lIjogImV2YWx1YXRlIiwNCiAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLA0KICAgICAgICAi
ZGVzY3JpcHRpb24iOiAiRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluIHRoZSBj
b250ZXh0IG9mIGluc3BlY3RlZCBwYWdlIChOT1RFOiB0aGUgZXhwcmVzc2lvbiBtdXN0IGV2YWx1
YXRlIHRvIHN0cmluZy4gVXNlIEpTT04uc3RyaW5naWZ5KCkgdG8gcGFzcyBvYmplY3RzKSIsDQog
ICAgICAgICJwYXJhbWV0ZXJzIjogWw0KICAgICAgICAgIHsNCiAgICAgICAgICAgICJuYW1lIjog
ImV4cHJlc3Npb24iLA0KICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwNCiAgICAgICAgICAg
ICJkZXNjcmlwdGlvbiI6ICJBbiBleHByZXNzaW9uIHRvIGV2YWx1YXRlIg0KICAgICAgICAgIH0s
DQogICAgICAgICAgew0KICAgICAgICAgICAgIm5hbWUiOiAiY2FsbGJhY2siLA0KICAgICAgICAg
ICAgInR5cGUiOiAiZnVuY3Rpb24iLA0KICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgZnVu
Y3Rpb24gY2FsbGVkIHdoZW4gZXZhbHVhdGlvbiBjb21wbGV0ZXMuIiwNCiAgICAgICAgICAgICJw
YXJhbWV0ZXJzIjogWw0KICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIm5hbWUiOiAi
cmVzdWx0IiwNCiAgICAgICAgICAgICAgICAiJHJlZiI6ICJFdmFsdWF0aW9uUmVzdWx0Ig0KICAg
ICAgICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgICAgfQ0KICAgICAgICBdDQogICAg
ICB9LA0KICAgICAgeyANCiAgICAgICAgIm5hbWUiOiAicmVsb2FkIiwNCiAgICAgICAgInR5cGUi
OiAiZnVuY3Rpb24iLA0KICAgICAgICAiZGVzY3JpcHRpb24iOiAiUmVsb2FkcyB0aGUgcGFnZSBi
ZWluZyBpbnNwZWN0ZWQuIg0KICAgICAgfQ0KICAgIF0sDQogICAgImV2ZW50cyI6IFsNCiAgICAg
IHsNCiAgICAgICAgIm5hbWUiOiAib25Mb2FkZWQiLA0KICAgICAgICAidHlwZSI6ICJmdW5jdGlv
biIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaXJlZCBhZnRlciBET00gbG9hZCBldmVudCBv
biBpbnNwZWN0ZWQgcGFnZSBpcyBmaXJlZC4iDQogICAgICB9LA0KICAgICAgew0KICAgICAgICAi
bmFtZSI6ICJvbk5hdmlnYXRlZCIsDQogICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIiwNCiAgICAg
ICAgImRlc2NyaXB0aW9uIjogIkZpcmVkIHdoZW4gbmF2aWdhdGlvbiBvY2N1cnMgaW4gdGhlIHdp
bmRvdyBiZWluZyBpbnNwZWN0ZWQuIg0KICAgICAgfQ0KICAgIF0NCiAgfSwNCiAgew0KICAgICJu
YW1lc3BhY2UiOiAiaW5zcGVjdG9yLnBhbmVscyIsDQogICAgInR5cGVzIjogWw0KICAgICAgew0K
ICAgICAgICAiaWQiOiAiUGFuZWwiLA0KICAgICAgICAidHlwZSI6ICJvYmplY3QiLA0KICAgICAg
ICAiZGVzY3JpcHRpb24iOiAiQSB0b3AtbGV2ZWwgcGFuZWwgd2l0aGluIFdlYiBJbnNwZWN0b3Ig
VUkuIiwNCiAgICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICAgImlkIjogew0KICAgICAg
ICAgICAgInR5cGUiOiAic3RyaW5nIiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHN0
cmluZyBpZGVudGlmeWluZyB0aGUgcGFuZWwsIGUuZy4gJ2VsZW1lbnRzJywgJ3Njcml0cHMnIGV0
Yy4iDQogICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICAicHJvcGVydGllcyI6IHsNCiAg
ICAgICAgICAiYWRkU2lkZWJhclBhbmUiOiB7DQogICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlv
biIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ3JlYXRlcyBhIHBhbmUgd2l0aGluIHBh
bmVsJ3Mgc2lkZWJhci4iLA0KICAgICAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAg
ICAgIHsNCiAgICAgICAgICAgICAgICAibmFtZSI6ICJ0aXRsZSIsDQogICAgICAgICAgICAgICAg
InR5cGUiOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSB0ZXh0
IHRoYXQgaXMgZGlzcGxheWVkIGluIHNpZGViYXIgY2FwdGlvbi4iDQogICAgICAgICAgICAgIH0N
CiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAicmV0dXJucyI6IHsNCiAgICAgICAgICAgICAg
IiRyZWYiOiAiRXh0ZW5zaW9uU2lkZWJhclBhbmUiLA0KICAgICAgICAgICAgICAiZGVzY3JpcHRp
b24iOiAiVGhlIHNpZGViYXIgcGFuZSBjcmVhdGVkLiINCiAgICAgICAgICAgIH0NCiAgICAgICAg
ICB9LA0KICAgICAgICAgICJyZXZlYWxBbmRTZWxlY3QiOiB7DQogICAgICAgICAgICAidHlwZSI6
ICJmdW5jdGlvbiIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2F1c2VzIHBhbmVsIHRv
IGRpc3BsYXkgYW4gb2JqZWN0LiIsDQogICAgICAgICAgICAicGFyYW1ldGVycyI6IFsNCiAgICAg
ICAgICAgICAgew0KICAgICAgICAgICAgICAgICJuYW1lIjogInR5cGUiLA0KICAgICAgICAgICAg
ICAgICJ0eXBlIjogInN0cmluZyIsDQogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEg
dHlwZSBvZiBvYmplY3QgdG8gZGlzcGxheSwgZS5nLiAncmVzb3VyY2UnIG9yICdzY3JpcHQnLiIN
CiAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICJuYW1l
IjogImlkIiwNCiAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiLA0KICAgICAgICAgICAgICAg
ICJkZXNjcmlwdGlvbiI6ICJBIHR5cGUtc3BlY2lmaWMgaWRlbnRpZmllciBvZiB0aGUgb2JqZWN0
LiINCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgXQ0KICAgICAgICAgIH0NCiAgICAgICAg
fSwNCiAgICAgICAgImV2ZW50cyI6IFsNCiAgICAgICAgICB7DQogICAgICAgICAgICAibmFtZSI6
ICJvblNob3duIiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaXJlZCB3aGVuIHVzZXIg
c3dpdGNoZXMgdG8gdGhlIHBhbmVsLiINCiAgICAgICAgICB9LA0KICAgICAgICAgIHsNCiAgICAg
ICAgICAgICJuYW1lIjogIm9uU2VsZWN0aW9uQ2hhbmdlZCIsDQogICAgICAgICAgICAiZGVzY3Jp
cHRpb24iOiAiRmlyZWQgd2hlbiBhbiBvYmplY3RzIChzY3JpcHQsIHJlc291cmNlLCBET00gZWxl
bWVudCBldGMpIGlzIHNlbGVjdGVkIGluIHRoZSBwYW5lbC4iLA0KICAgICAgICAgICAgInBhcmFt
ZXRlcnMiOiBbDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAibmFtZSI6ICJ0eXBl
IiwNCiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgICJk
ZXNjcmlwdGlvbiI6ICJPYmplY3QgdHlwZSINCiAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAg
ICAgew0KICAgICAgICAgICAgICAgICJuYW1lIjogImlkIiwNCiAgICAgICAgICAgICAgICAidHlw
ZSI6ICJhbnkiLA0KICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPYmplY3QgaWQgKGlm
IGF2YWlsYWJsZSkiDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF0NCiAgICAgICAgICB9
DQogICAgICAgIF0NCiAgICAgIH0sDQogICAgICB7DQogICAgICAgICJpZCI6ICJFeHRlbnNpb25Q
YW5lbCIsDQogICAgICAgICJ0eXBlIjogIm9iamVjdCIsDQogICAgICAgICJpc0luc3RhbmNlT2Yi
OiAiUGFuZWwiLA0KICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBwYW5lbCBjcmVhdGVkIGJ5IHRo
ZSBleHRlbnNpb24uIiwNCiAgICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICAgImVsZW1l
bnQiOiB7DQogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLA0KICAgICAgICAgICAgImlzSW5z
dGFuY2VPZiI6ICJIVE1MRGl2RWxlbWVudCIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi
QW4gaW5uZXIgZWxlbWVudCBvZiB0aGUgcGFuZWwsIHN1aXRhYmxlIGZvciByZW5kZXJpbmcgY29u
dGVudC4iDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9LA0KICAgICAgew0KICAgICAg
ICAiaWQiOiAiQ29uc29sZVBhbmVsIiwNCiAgICAgICAgInR5cGUiOiAib2JqZWN0IiwNCiAgICAg
ICAgImlzSW5zdGFuY2VPZiI6ICJQYW5lbCIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGNv
bnNvbGUgcGFuZWwuIiwNCiAgICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICAgImFkZEVs
ZW1lbnQiOiB7DQogICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICAgICAi
cGFyYW1ldGVycyI6IFsNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICJuYW1lIjog
ImVsZW1lbnQiLA0KICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsDQogICAgICAgICAg
ICAgICAgImlzSW5zdGFuY2VPZiI6ICJIVE1MRWxlbWVudCIsDQogICAgICAgICAgICAgICAgImRl
c2NyaXB0aW9uIjogIkVsZW1lbnQgdG8gYmUgYXBwZW5kZWQgdG8gY29uc29sZSBwYW5lbC4iDQog
ICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAg
ICAgIH0sDQogICAgICB7DQogICAgICAgICJpZCI6ICJFeHRlbnNpb25TaWRlYmFyUGFuZSIsDQog
ICAgICAgICJ0eXBlIjogIm9iamVjdCIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHNpZGVi
YXIgY3JlYXRlZCBieSB0aGUgZXh0ZW5zaW9uLiIsDQogICAgICAgICJwcm9wZXJ0aWVzIjogew0K
ICAgICAgICAgICJ0aXRsZUVsZW1lbnQiOiB7DQogICAgICAgICAgICAidHlwZSI6ICJvYmplY3Qi
LA0KICAgICAgICAgICAgImlzSW5zdGFuY2VPZiI6ICJIVE1MRGl2RWxlbWVudCIsDQogICAgICAg
ICAgICAiZGVzY3JpcHRpb24iOiAiQW4gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHNpZGViYXIgdGl0
bGUuIg0KICAgICAgICAgIH0sDQogICAgICAgICAgInRpdGxlRWxlbWVudCI6IHsNCiAgICAgICAg
ICAgICJ0eXBlIjogIm9iamVjdCIsDQogICAgICAgICAgICAiaXNJbnN0YW5jZU9mIjogIkhUTUxE
aXZFbGVtZW50IiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBlbGVtZW50IHN1aXRh
YmxlIGZvciByZW5kZXJpbmcgc2lkZWJhciBjb250ZW50LiINCiAgICAgICAgICB9DQogICAgICAg
IH0NCiAgICAgIH0NCiAgICBdLA0KICAgICJmdW5jdGlvbnMiOiBbDQogICAgICB7DQogICAgICAg
ICJuYW1lIjogImdldCIsDQogICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIiwNCiAgICAgICAgImRl
c2NyaXB0aW9uIjogIlJldHVybnMgYSBQYW5lbCBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUg
aWQuIiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgew0KICAgICAgICAgICAg
Im5hbWUiOiAiaWQiLA0KICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwNCiAgICAgICAgICAg
ICJkZXNjcmlwdGlvbiI6ICJBIHN0cmluZyBpZGVudGlmeWluZyB0aGUgcGFuZWwsIGUuZy4gJ3Jl
c291cmNlcycgb3IgJ3NjcmlwdHMnLiINCiAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAg
ICJyZXR1cm5zIiA6IHsNCiAgICAgICAgICAiJHJlZiI6ICJQYW5lbCIsDQogICAgICAgICAgImRl
c2NyaXB0aW9uIjogIkEgUGFuZWwgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlkLiINCiAg
ICAgICAgfQ0KICAgICAgfSwNCiAgICAgIHsNCiAgICAgICAgIm5hbWUiOiAiY3JlYXRlIiwNCiAg
ICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLA0KICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ3JlYXRl
cyBhbiBleHRlbnNpb24gcGFuZWwuIiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAg
ICAgew0KICAgICAgICAgICAgIm5hbWUiOiAibmFtZSIsDQogICAgICAgICAgICAidHlwZSI6ICJz
dHJpbmciLA0KICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc3RyaW5nIHRoYXQgdW5pcXVl
bHkgaWRlbnRpZmllcyB0aGUgcGFuZWwgKGUuZy4gdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiki
DQogICAgICAgICAgfSwNCiAgICAgICAgICB7DQogICAgICAgICAgICAibmFtZSI6ICJsYWJlbCIs
DQogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLA0KICAgICAgICAgICAgImRlc2NyaXB0aW9u
IjogIkxhYmVsIHRoYXQgaXMgZGlzcGxheWVkIHVuZGVyIHRoZSBleHRlbnNpb24gaWNvbiBpbiB0
aGUgdG9vbGJhciwiDQogICAgICAgICAgfSwNCiAgICAgICAgICB7DQogICAgICAgICAgICAibmFt
ZSI6ICJpY29uVVJMIiwNCiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsDQogICAgICAgICAg
ICAiZGVzY3JpcHRpb24iOiAiQW4gVVJMIG9mIHRoZSB0b29sYmFyIGljbm9uLiINCiAgICAgICAg
ICB9DQogICAgICAgIF0sDQogICAgICAgICJyZXR1cm5zIiA6IHsNCiAgICAgICAgICAiJHJlZiI6
ICJFeHRlbnNpb25QYW5lbCIsDQogICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgcGFuZWwgdGhh
dCB3YXMgY3JlYXRlZC4iDQogICAgICAgIH0NCiAgICAgIH0NCiAgICBdDQogIH0sDQogIHsNCiAg
ICAibmFtZXNwYWNlIjogImluc3BlY3Rvci5yZXNvdXJjZXMiLA0KICAgICJmdW5jdGlvbnMiOiBb
DQogICAgICB7DQogICAgICAgICJuYW1lIjogImdldCIsDQogICAgICAgICJ0eXBlIjogImZ1bmN0
aW9uIiwNCiAgICAgICAgImRlc2NyaXB0aW9uIjogIlJldHVybnMgYSByZXNvdXJjZSBvYmplY3Qg
Y29ycmVzcG9uZGluZyB0byB0aGUgaWQuIiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAg
ICAgICAgew0KICAgICAgICAgICAgIm5hbWUiOiAiaWQiLA0KICAgICAgICAgICAgInR5cGUiOiAi
bnVtYmVyIiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIG51bWJlciBpZGVudGlmeWlu
ZyB0aGUgcmVzb3VyY2UuIg0KICAgICAgICAgIH0sDQogICAgICAgICAgew0KICAgICAgICAgICAg
Im5hbWUiOiAiY2FsbGJhY2siLA0KICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLA0KICAg
ICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdXBvbiBy
ZXF1ZXN0IGNvbXBsZXRpb24uIiwNCiAgICAgICAgICAgICJwYXJhbWV0ZXJzIjogWw0KICAgICAg
ICAgICAgICB7DQogICAgICAgICAgICAgICAgIm5hbWUiOiAicmVzdWx0IiwNCiAgICAgICAgICAg
ICAgICAiJHJlZiI6ICJJbnNwZWN0b3JPYmplY3QiDQogICAgICAgICAgICAgIH0NCiAgICAgICAg
ICAgIF0NCiAgICAgICAgICB9DQogICAgICAgIF0NCiAgICAgIH0sDQogICAgICB7DQogICAgICAg
ICJuYW1lIjogImdldEFsbCIsDQogICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIiwNCiAgICAgICAg
ImRlc2NyaXB0aW9uIjogIlJldHVybnMgYWxsIGtub3duIHJlc291cmNlIG9iamVjdHMuIiwNCiAg
ICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgew0KICAgICAgICAgICAgIm5hbWUiOiAi
Y2FsbGJhY2siLA0KICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLA0KICAgICAgICAgICAg
ImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdXBvbiByZXF1ZXN0IGNv
bXBsZXRpb24uIiwNCiAgICAgICAgICAgICJwYXJhbWV0ZXJzIjogWw0KICAgICAgICAgICAgICB7
DQogICAgICAgICAgICAgICAgIm5hbWUiOiAicmVzdWx0IiwNCiAgICAgICAgICAgICAgICAidHlw
ZSI6ICJhcnJheSIsDQogICAgICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJlZiI6ICJJbnNwZWN0
b3JPYmplY3QiIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgXQ0KICAgICAgICAgIH0N
CiAgICAgICAgXQ0KICAgICAgfQ0KICAgIF0sDQogICAgImV2ZW50cyI6IFsNCiAgICAgIHsNCiAg
ICAgICAgIm5hbWUiOiAib25BZGRlZCIsDQogICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIiwNCiAg
ICAgICAgImRlc2NyaXB0aW9uIjogIkZpcmVkIHdoZW4gYSBuZXcgcmVzb3VyY2UgaXMgYWRkZWQu
IiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgeyAibmFtZSI6ICJpZCIsICJ0
eXBlIjogIm51bWJlciIsICJkZXNjcmlwdGlvbiI6ICJyZXNvdXJjZSBpZCIgfSwNCiAgICAgICAg
ICB7ICJuYW1lIjogInZhbHVlIiwgIiRyZWYiOiAiSEFSRW50cnkiLCAiZGVzY3JpcHRpb24iOiAi
UmVzb3VyY2UgcmVjb3JkLiIgfQ0KICAgICAgICBdDQogICAgICB9DQogICAgXQ0KICB9LA0KICB7
DQogICAgIm5hbWVzcGFjZSI6ICJpbnNwZWN0b3IuY29uc29sZU1lc3NhZ2VzIiwNCiAgICAiZnVu
Y3Rpb25zIjogWw0KICAgICAgew0KICAgICAgICAibmFtZSI6ICJhZGQiLA0KICAgICAgICAidHlw
ZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJBZGRzIGEgY29uc29sZSBt
ZXNzYWdlLiIsDQogICAgICAgICJwYXJhbWV0ZXJzIjogWw0KICAgICAgICAgIHsgIm5hbWUiOiAi
bWVzc2FnZSIsICIkcmVmIjogIkNvbnNvbGVNZXNzYWdlIiwgImRlc2NyaXB0aW9uIjogIkNvbnNv
bGUgbWVzc2FnZSIgfQ0KICAgICAgICBdDQogICAgICB9DQogICAgXSwNCiAgICAiZXZlbnRzIjog
Ww0KICAgICAgew0KICAgICAgICAibmFtZSI6ICJvbkFkZGVkIiwNCiAgICAgICAgInR5cGUiOiAi
ZnVuY3Rpb24iLA0KICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmlyZWQgd2hlbiBhIG1lc3NhZ2Ug
aXMgYWRkZWQgdG8gdGhlIGNvbnNvbGUuIiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAg
ICAgICAgeyAibmFtZSI6ICJpZCIsICJ0eXBlIjogIm51bWJlciIsICJkZXNjcmlwdGlvbiI6ICJN
ZXNzYWdlIGlkLiIgfSwNCiAgICAgICAgICB7ICJuYW1lIjogInZhbHVlIiwgIiRyZWYiOiAiQ29u
c29sZU1lc3NhZ2UiLCAiZGVzY3JpcHRpb24iOiAiQ29uc29sZSBtZXNzYWdlIiB9DQogICAgICAg
IF0NCiAgICAgIH0NCiAgICBdDQogIH0NCl07DQo8L3NjcmlwdD4NCg0KPHN0eWxlPg0KLnRvZG8s
IC5jb21tZW50IHsgLyogd2hpbGUgd2UncmUgd29ya2luZyBvbiBkb2MsIGNvbW1lbnQgb3V0IGRp
c3BsYXkgKi8NCiAgY29sb3I6IHJnYigyNTUsIDAsIDApOw0KICBkaXNwbGF5OiBub25lOw0KfQ0K
DQoudGJkIHsgLyogc3R5bGUgZm9yIGNvbW1lbnRzIHRoYXQgc2hvdWxkIGJlIHZpc2libGUgdG8g
YWxsIGRldnMgKi8NCiAgY29sb3I6IHJnYigxMjUsIDEyNSwgMTI1KTsNCn0NCg0KLyogVGhpcyBp
cyB0aGUgc3RhcnQgb2YgdGhlIHN0eWxlcyBpbXBvcnRlZCBmcm9tIENvZGVzaXRlLiAqLw0KDQou
Zy1zZWN0aW9uOmFmdGVyIHsNCiAgY29udGVudDoiLiI7DQogIGRpc3BsYXk6YmxvY2s7DQogIGhl
aWdodDowOw0KICBjbGVhcjpib3RoOw0KICB2aXNpYmlsaXR5OmhpZGRlbg0KfQ0KDQouZy1zZWN0
aW9uLC5nLXVuaXQgew0KICB6b29tOjENCn0NCg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OkhlbHZl
dGljYSxBcmlhbCxzYW5zLXNlcmlmOw0KICBmb250LXNpemU6c21hbGw7DQogIGNvbG9yOiMwMDA7
DQogIGJhY2tncm91bmQtY29sb3I6I2ZmZjsNCiAgbWFyZ2luOjNweCA4cHgNCn0NCg0KYSxhOmxp
bmsgew0KICBjb2xvcjojMDBjDQp9DQoNCmE6YWN0aXZlIHsNCiAgY29sb3I6cmVkDQp9DQoNCmE6
dmlzaXRlZCB7DQogIGNvbG9yOiM1NTFhOGINCn0NCg0KcCB7DQogIC8qIHBhZGRpbmc6MWVtIDAg
MCAwOyAqLw0KICBtYXJnaW46MWVtIDAgMCAwOw0KICBsaW5lLWhlaWdodDoxMjUlDQp9DQoNCmlt
ZyB7DQogIGJvcmRlcjpub25lOw0KICBwYWRkaW5nOjA7DQogIG1hcmdpbjoxZW0gMCAwIDA7DQp9
DQoNCmEgaW1nIHsNCiAgYm9yZGVyOjFweCBzb2xpZDsNCiAgcGFkZGluZzoxcHgNCn0NCg0KcHJl
IGIgew0KICBiYWNrZ3JvdW5kOnllbGxvdw0KfQ0KDQpjb2RlLHByZSB7DQogIGZvbnQtZmFtaWx5
Om1vbm9zcGFjZTsNCiAgY29sb3I6IzAwNzAwMA0KfQ0KDQpjb2RlIHsNCiAgZm9udC1zaXplOjEw
cHQNCn0NCg0KcHJlIHsNCiAgZm9udC1zaXplOjlwdDsNCiAgYmFja2dyb3VuZC1jb2xvcjojZmFm
YWZhOw0KICBib3JkZXI6MXB4IHNvbGlkICNiYmI7DQogIG1hcmdpbjoxZW0gMCAwIDA7DQogIHBh
ZGRpbmc6Ljk5ZW07DQogIG92ZXJmbG93OmF1dG87DQogIHdvcmQtd3JhcDpicmVhay13b3JkDQp9
DQoNCmJsb2NrcXVvdGUgew0KICB0ZXh0LWFsaWduOmp1c3RpZnk7DQogIG1hcmdpbjoxZW0gOTBw
eCAwIDcwcHg7DQogIHBhZGRpbmc6MCAyMHB4DQp9DQoNCmhyIHsNCiAgYm9yZGVyOjFweCBzb2xp
ZDsNCiAgYm9yZGVyLWNvbG9yOiMzNkM7DQogIG1hcmdpbjoxZW0gMA0KfQ0KDQpoMSB7DQogIGxp
bmUtaGVpZ2h0OiAxMzAlOw0KICBmb250LXNpemU6IDE3MCU7DQogIG1hcmdpbjogMDsNCiAgcGFk
ZGluZzogLjhlbSAwIDA7DQogIGJvcmRlcjogbm9uZTsNCiAgYmFja2dyb3VuZDogbm9uZTsNCn0N
Cg0KaDIgew0KICBmb250LXNpemU6IDEzMCU7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBtYXJn
aW46IDJlbSAwIDAgLTEwcHg7DQogIHBhZGRpbmc6IDFweCAxMHB4Ow0KICAvKiBwb3NpdGlvbjog
cmVsYXRpdmU7ICovDQogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMzM2NkNDOw0KICBiYWNrZ3Jv
dW5kLWNvbG9yOiAjZTVlY2Y5Ow0KfQ0KDQpoMiB7DQogIGJhY2tncm91bmQtY29sb3I6ICNkY2Y2
ZGI7DQogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMDA5OTAwOw0KfQ0KDQpoMyB7DQogIGZvbnQt
c2l6ZTogMTMwJTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIG1hcmdpbjogMS41ZW0gMCAwIDA7
DQogIHRvcDogMGVtOw0KfQ0KDQpoNCB7DQogIGZvbnQtc2l6ZTogMTEwJTsNCiAgbWFyZ2luOiAu
N2VtIDAgMCAwOw0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIHRvcDogLjRlbTsNCn0NCg0KaDUg
ew0KICBmb250LXNpemU6IDEwMCU7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBtYXJnaW46IC42
ZW0gMCAwIDA7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgdG9wOiAuNGVtOw0KICB6LWluZGV4
OiA1Ow0KfQ0KDQpoNiB7DQogIGZvbnQtc2l6ZTogMTAwJTsNCiAgZm9udC13ZWlnaHQ6IG5vcm1h
bDsNCiAgZm9udC1zdHlsZTogaXRhbGljOw0KICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsN
CiAgbWFyZ2luOiAuNGVtIDAgMCAwOw0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIHRvcDogLjRl
bTsNCiAgei1pbmRleDogNTsNCn0NCg0KaDEucGFnZV90aXRsZSwgaDIucGFnZV90aXRsZSB7DQog
IGxpbmUtaGVpZ2h0OjEzMCU7DQogIGZvbnQtc2l6ZToxNzAlOw0KICBtYXJnaW46MCAwIDAgLTEw
cHg7DQogIHBhZGRpbmc6LjhlbSAwIDA7DQogIGJvcmRlcjpub25lOw0KICBiYWNrZ3JvdW5kOm5v
bmUNCn0NCg0Kb2wsdWwgew0KICBwYWRkaW5nOjA7DQogIG1hcmdpbjouNWVtIDAgMCAxNXB4Ow0K
ICBsaW5lLWhlaWdodDoxMjUlDQp9DQoNCmxpIG9sLGxpIHVsIHsNCiAgcGFkZGluZzowOw0KICBt
YXJnaW46MCAwIDAgMTBweA0KfQ0KDQpsaSB7DQogIG1hcmdpbjouM2VtIDAgMCAxLjVlbTsNCiAg
cGFkZGluZzowDQp9DQoNCmRsIHsNCiAgbWFyZ2luOjA7DQogIHBhZGRpbmc6MDsNCiAgbGluZS1o
ZWlnaHQ6MTI1JQ0KfQ0KDQpkdCB7DQogIGZvbnQtd2VpZ2h0OmJvbGQ7DQogIG1hcmdpbjouNzVl
bSAwIDAgMDsNCiAgcGFkZGluZzowDQp9DQoNCmRkIHsNCiAgbWFyZ2luOi40ZW0gMCAwIDJlbTsN
CiAgcGFkZGluZzowOw0KICBmb250LXdlaWdodDpub3JtYWwNCn0NCg0KbGkgcHJlIHsNCiAgbWFy
Z2luOi41ZW0gMCAuNmVtIDANCn0NCg0KbGkgcCxkZCBwIHsNCiAgcGFkZGluZzouNWVtIDAgLjZl
bSAwOw0KICBtYXJnaW46MA0KfQ0KDQpvbC5hbHBoYSB7DQogIGxpc3Qtc3R5bGU6bG93ZXItYWxw
aGENCn0NCg0Kb2wuYWxwaGFjYXAgew0KICBsaXN0LXN0eWxlOnVwcGVyLWFscGhhDQp9DQoNCm9s
LnJvbWFuIHsNCiAgbGlzdC1zdHlsZTpsb3dlci1yb21hbg0KfQ0KDQpvbC5yb21hbmNhcCB7DQog
IGxpc3Qtc3R5bGU6dXBwZXItcm9tYW4NCn0NCg0Kb2wudGVybXNsaXN0IHsNCiAgbGlzdC1zdHls
ZS10eXBlOmRlY2ltYWwNCn0NCg0Kb2wudGVybXNsaXN0PmxpPm9sIHsNCiAgbGlzdC1zdHlsZS10
eXBlOmxvd2VyLWFscGhhDQp9DQoNCm9sLnRlcm1zbGlzdD5saT5vbD5saT5vbCB7DQogIGxpc3Qt
c3R5bGUtdHlwZTpsb3dlci1yb21hbg0KfQ0KDQoubGlzdGhlYWQgbGkgew0KICBmb250LXdlaWdo
dDpib2xkDQp9DQoNCi5saXN0aGVhZCBsaSAqLC5saXN0aGVhZCBsaSBsaSB7DQogIGZvbnQtd2Vp
Z2h0Om5vcm1hbA0KfQ0KDQouY29kZSBsaSB7DQogIGZvbnQtZmFtaWx5Om1vbm9zcGFjZTsNCiAg
Zm9udC1zaXplOjEwcHQNCn0NCg0KLmNvZGUgbGkgcCwuY29kZSBsaSBsaSB7DQogIGZvbnQtZmFt
aWx5OkFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmDQp9DQoNCmxpIHAubm90ZSxsaSBwLndhcm5p
bmcsbGkgcC5sYWJzd2FybmluZyxsaSBwLmNhdXRpb24gew0KICBtYXJnaW46LjhlbSAwIDAgMDsN
CiAgcGFkZGluZzouMmVtIC41ZW0gLjJlbSAuOWVtDQp9DQoNCmRpdiN0b2Mgew0KICBiYWNrZ3Jv
dW5kLWNvbG9yOiByZ2IoMjMyLCAyMzcsIDIzNSk7DQogIGJvcmRlcjogMXB4IHNvbGlkICMwOTA7
DQogIGRpc3BsYXk6IGlubGluZTsNCiAgZmxvYXQ6IHJpZ2h0Ow0KICBtYXJnaW46IDVweCAwcHgg
NXB4IDIwcHg7DQogIHBhZGRpbmc6IDVweDsNCiAgd2lkdGg6IDI1MHB4Ow0KfQ0KDQojdG9jIHAg
ew0KICBmb250LXdlaWdodDogYm9sZDsNCiAgbWFyZ2luOiAwcHg7DQp9DQoNCiN0b2Mgb2wgew0K
ICBtYXJnaW46MWVtIDAgMCAwOw0KICBwYWRkaW5nOjA7DQogIGxpc3Qtc3R5bGU6bm9uZQ0KfQ0K
DQojdG9jIG9sIGxpIHsNCiAgbWFyZ2luOi40ZW0gMCAwIDFlbTsNCiAgcGFkZGluZzowDQp9DQoN
CiN0b2Mgb2wgbGkgb2wgew0KICBtYXJnaW46MDsNCiAgcGFkZGluZzowDQp9DQoNCiN0b2Mgb2wg
bGkgb2wgbGkgew0KICBwYWRkaW5nOjA7DQogIG1hcmdpbjouMWVtIDAgMCAxZW07DQogIGZvbnQt
d2VpZ2h0Om5vcm1hbDsNCiAgbGlzdC1zdHlsZTpub25lDQp9DQoNCnRhYmxlIHsNCiAgYm9yZGVy
LWNvbGxhcHNlOmNvbGxhcHNlOw0KICBsaW5lLWhlaWdodDoxMjUlDQp9DQoNCnRoLHRkIHsNCiAg
dGV4dC1hbGlnbjpsZWZ0Ow0KICB2ZXJ0aWNhbC1hbGlnbjp0b3ANCn0NCg0KdGFibGUgew0KICBt
YXJnaW46MCAwIDAgMXB4Ow0KICAvKiBib3JkZXI6MXB4IHNvbGlkOyAqLw0KICBib3JkZXItY29s
b3I6IzM2QzsNCiAgYm9yZGVyLXNwYWNpbmc6MDsNCiAgY2xlYXI6cmlnaHQNCn0NCg0KdGFibGUg
ew0KICBib3JkZXItY29sb3I6IzA5MA0KfQ0KDQp0aCB7DQogIGZvbnQtd2VpZ2h0OmJvbGQ7DQog
IHRleHQtYWxpZ246bGVmdDsNCiAgcGFkZGluZzo2cHggMTJweDsNCg0KICAvKiBJRSBpZ25vcmVz
IGxhYnMgKi8NCiAgLyogYm9yZGVyOjFweCBzb2xpZCAjMzZDOyAqLw0KICAvKiBiYWNrZ3JvdW5k
LWNvbG9yOiNlNWVjZjkgKi8NCn0NCg0KdGggew0KICBib3JkZXItY29sb3I6IzA5MCBpbXBvcnRh
bnQhOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiNkY2Y2ZGIgaW1wb3J0YW50IQ0KfQ0KDQp0ZCB7DQog
IHBhZGRpbmc6NnB4IDEycHg7DQogIGJvcmRlcjoxcHggc29saWQgIzM2QzsNCiAgYmFja2dyb3Vu
ZC1jb2xvcjojZmZmOw0KICB0ZXh0LWFsaWduOmxlZnQ7DQogIHZlcnRpY2FsLWFsaWduOnRvcA0K
fQ0KDQp0ZCB7DQogIGJvcmRlci1jb2xvcjojMDkwDQp9DQoNCnRkIGgxLHRkIGgyLHRkIGgzLHRk
IGg0LHRkIGg1IHsNCiAgbWFyZ2luLWxlZnQ6MA0KfQ0KDQp0ZCB1bCx0ZCBvbCB7DQogIG1hcmdp
bjowIDAgMWVtIDE1cHg7DQogIHBhZGRpbmc6MA0KfQ0KDQp0ZCBwLHRkIGRsIHsNCiAgbWFyZ2lu
OjAgMCAxZW0gMDsNCiAgcGFkZGluZzowDQp9DQoNCnRkICorcCB7DQogIG1hcmdpbjoxZW0gMCAw
IDA7DQogIHBhZGRpbmc6MA0KfQ0KDQp0YWJsZS5jb2x1bW5zIHsNCiAgYm9yZGVyOm5vbmU7DQog
IG1hcmdpbjoxZW0gMCAwOw0KICAvKiBtYXJnaW4tcmlnaHQgb21pdHRlZCB0byBhdm9pZCBJRTYg
YnVnICovDQp9DQoNCnRhYmxlLmNvbHVtbnMgdGggew0KICBib3JkZXI6bm9uZTsNCiAgYmFja2dy
b3VuZC1jb2xvcjp3aGl0ZTsNCiAgcGFkZGluZzoxZW0gMWVtIDAgMA0KICBtYXJnaW46MWVtIDAg
MDsNCn0NCg0KdGFibGUuY29sdW1ucyB0aCB7DQogIGJvcmRlcjpub25lOw0KICBiYWNrZ3JvdW5k
LWNvbG9yOndoaXRlOw0KfQ0KDQp0YWJsZS5jb2x1bW5zIHRkIHsNCiAgYm9yZGVyOm5vbmU7DQog
IHBhZGRpbmc6MCAxZW0gMCAwDQp9DQoNCnRhYmxlLmNvbHVtbnMgdGQgcCB7DQogIG1hcmdpbjox
ZW0gMCAwIDA7DQogIHBhZGRpbmc6MA0KfQ0KDQouZGVwcmVjYXRlZCwuZGVwcmVjYXRlZCAqLC5k
ZXByZWNhdGVkIGE6bGluaywuZGVwcmVjYXRlZCBhOmhvdmVyLC5kZXByZWNhdGVkIGE6dmlzaXRl
ZCB7DQogIGNvbG9yOiM5YjliOWINCn0NCg0KLmdyZXkgew0KICBjb2xvcjojNjY2DQp9DQoNCi5i
bHVlIHsNCiAgY29sb3I6IzM2ZQ0KfQ0KDQoudG9wbWFyZ2luIHsNCiAgbWFyZ2luLXRvcDoxZW0g
IWltcG9ydGFudA0KfQ0KDQoubm9tYXJnaW4gew0KICBtYXJnaW46MCAhaW1wb3J0YW50DQp9DQoN
Ci5ub3BhZGRpbmcgew0KICBwYWRkaW5nOjAgIWltcG9ydGFudA0KfQ0KDQoubm9ib3JkZXIgew0K
ICBib3JkZXI6bm9uZSAhaW1wb3J0YW50DQp9DQoNCi5ib3JkZXIgew0KICBib3JkZXI6MXB4IHNv
bGlkIGdyYXk7DQogIHBhZGRpbmc6MXB4DQp9DQoNCi5ub3JtYWxzaXplIHsNCiAgZm9udC1zaXpl
OjEwMCUgIWltcG9ydGFudA0KfQ0KDQoubm9saXN0IGxpIHsNCiAgbWFyZ2luLWxlZnQ6MDsNCiAg
bGlzdC1zdHlsZTpub25lDQp9DQoNCi5ub2luZGVudCB7DQogIG1hcmdpbi1sZWZ0OjANCn0NCg0K
LmRvdWJsZXNwYWNlLC5kb3VibGVzcGFjZSBsaSB7DQogIG1hcmdpbi10b3A6MWVtDQp9DQoNCnVs
LmRvdWJsZXNwYWNlLG9sLmRvdWJsZXNwYWNlIHsNCiAgbWFyZ2luLXRvcDowOw0KICBwYWRkaW5n
LXRvcDowDQp9DQoNCmRpdi5yb3cgew0KICBmbG9hdDpsZWZ0Ow0KICBjbGVhcjpsZWZ0Ow0KICBw
b3NpdGlvbjpyZWxhdGl2ZTsNCiAgbWFyZ2luOjFlbSAwIDA7DQogIHBhZGRpbmc6MA0KfQ0KDQou
bGVmdCB7DQogIGZsb2F0OmxlZnQ7DQogIG1hcmdpbjowIDFlbSAwIDA7DQogIHBhZGRpbmc6MA0K
fQ0KDQpkaXYuc3BlY2lhbCB7DQogIGJvcmRlcjoxcHggc29saWQ7DQogIHBhZGRpbmc6MCAuOWVt
IC45ZW07DQogIG1hcmdpbjoxZW0gMCAwIDA7DQogIGJhY2tncm91bmQtY29sb3I6I2U1ZWNmOTsN
CiAgYm9yZGVyLWNvbG9yOiMzNkMNCn0NCg0KZGl2LnNwZWNpYWwgew0KICBiYWNrZ3JvdW5kLWNv
bG9yOiNkY2Y2ZGI7DQogIGJvcmRlcjoxcHggc29saWQgIzA5MA0KfQ0KDQpwLm5vdGUscC5jYXV0
aW9uLHAud2FybmluZyB7DQogIG1hcmdpbjoxZW0gMCAwIDA7DQogIHBhZGRpbmc6LjJlbSAuNWVt
IC4yZW0gLjllbTsNCiAgYmFja2dyb3VuZC1jb2xvcjojZWZlZmVmOw0KICBib3JkZXItdG9wOjFw
eCBzb2xpZDsNCiAgYm9yZGVyLWJvdHRvbToxcHggc29saWQNCn0NCg0KcC5sYWJzd2FybmluZyB7
DQogIG1hcmdpbjoxZW0gMCAwIDA7DQogIHBhZGRpbmc6LjJlbSAuNWVtIC4yZW0gMjBweDsNCiAg
YmFja2dyb3VuZDp1cmwoL2ltYWdlcy9sYWJzLTExLnBuZykgdG9wIGxlZnQgbm8tcmVwZWF0Ow0K
ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjRweCA2cHg7DQogIGJhY2tncm91bmQtY29sb3I6I2RjZjZk
YjsNCiAgYm9yZGVyLXRvcDoxcHggc29saWQ7DQogIGJvcmRlci1ib3R0b206MXB4IHNvbGlkOw0K
ICBib3JkZXItY29sb3I6IzA5MA0KfQ0KDQpwLm5vdGUgew0KICBib3JkZXItY29sb3I6IzM2Qw0K
fQ0KDQpwLmNhdXRpb24gew0KICBib3JkZXItY29sb3I6I2ZjMw0KfQ0KDQpwLndhcm5pbmcgew0K
ICBib3JkZXItY29sb3I6I2EwMw0KfQ0KDQpwLndhcm5pbmcgYixwLndhcm5pbmcgZW0scC53YXJu
aW5nIHN0cm9uZyB7DQogIGNvbG9yOiNhMDM7DQogIGZvbnQtd2VpZ2h0OmJvbGQNCn0NCg0KcC5j
YXB0aW9uIHsNCiAgcGFkZGluZzoxcHggMCAwOw0KICBtYXJnaW46MA0KfQ0KDQpwI2RhdGUscC5k
YXRlIHsNCiAgdGV4dC1hbGlnbjpsZWZ0Ow0KICBtYXJnaW46MDsNCiAgcGFkZGluZzoxZW07DQog
IGZvbnQtc3R5bGU6aXRhbGljOw0KICBmb250LXNpemU6eC1zbWFsbA0KfQ0KDQpwLmJhY2t0b3Rv
cCB7DQogIGZsb2F0OnJpZ2h0Ow0KICBtYXJnaW46LjVlbSAwIDAgNGVtOw0KICBwb3NpdGlvbjpy
ZWxhdGl2ZTsNCiAgcGFkZGluZzowOw0KICBmb250LXNpemU6eC1zbWFsbDsNCiAgei1pbmRleDo5
OQ0KfQ0KDQouaGlkZGVuLC5oaWRkZW4gKiwjc2tpcHRvLCNza2lwdG8gKiwjc2tpcHRvIGEsI3Nr
aXB0byBhOmhvdmVyLCNza2lwdG8gYTp2aXNpdGVkIHsNCiAgcG9zaXRpb246cmVsYXRpdmU7DQog
IHRvcDotOTk5OXB4Ow0KICBsZWZ0Oi05OTk5cHg7DQogIGhlaWdodDowOw0KICB3aWR0aDowOw0K
ICBvdmVyZmxvdzpoaWRkZW47DQogIHotaW5kZXg6NDQ0NA0KfQ0KDQojc2tpcHRvLCNza2lwdG8g
Kiwjc2tpcHRvIGEsI3NraXB0byBhOmhvdmVyLCNza2lwdG8gYTp2aXNpdGVkIHsNCiAgX3Bvc2l0
aW9uOnJlbGF0aXZlDQp9DQoNCiNza2lwdG8gYTpmb2N1cyB7DQogIHBvc2l0aW9uOmZpeGVkOw0K
ICB0b3A6NXB4Ow0KICBsZWZ0OjVweDsNCiAgaGVpZ2h0OmF1dG87DQogIHdpZHRoOmF1dG87DQog
IGJhY2tncm91bmQtY29sb3I6I2ZmZjsNCiAgYm9yZGVyOjJweCBzb2xpZCAjMDBDOw0KICBmb250
LXdlaWdodDpib2xkOw0KICBwYWRkaW5nOjVweA0KfQ0KDQojZ2MtY29udGFpbmVyIHsNCiAgbWFy
Z2luOjA7DQogIHBhZGRpbmc6MDsNCiAgbWF4LXdpZHRoOjExNjBweDsNCiAgcG9zaXRpb246cmVs
YXRpdmU7DQogIG1pbi1oZWlnaHQ6MTAwJTsNCiAgaGVpZ2h0OmF1dG8gIWltcG9ydGFudDsNCiAg
X2hlaWdodDoxMDAlDQp9DQoNCi5tb3JlcmlnaHQgew0KICBtYXJnaW46MnB4IDAgMnB4IDA7DQog
IHRleHQtYWxpZ246cmlnaHQNCn0NCg0KI2djLXRvYyB7DQogIGNsZWFyOmxlZnQ7DQogIHBhZGRp
bmc6LjVlbSAwIDE0MHB4IDAgIWltcG9ydGFudDsNCiAgZGlzcGxheTpibG9jazsNCiAgbWFyZ2lu
OjA7DQogIHdpZHRoOjE3MXB4Ow0KICBmbG9hdDpsZWZ0DQp9DQoNCiNnYy10b2MgKiB7DQogIHpv
b206MQ0KfQ0KDQojZ2MtdG9jIHVsLCNnYy10b2Mgb2wgew0KICBwYWRkaW5nOi42ZW0gMCAwOw0K
ICBtYXJnaW46MDsNCiAgbGluZS1oZWlnaHQ6MTIwJQ0KfQ0KDQojZ2MtdG9jIHVsIHVsLCNnYy10
b2Mgb2wgb2wgew0KICBwYWRkaW5nOjA7DQogIG1hcmdpbjowDQp9DQoNCiNnYy10b2MgdWwgKiwj
Z2MtdG9jIG9sICosLnRyZWVsaXN0ICogew0KICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGUNCn0NCg0K
I2djLXRvYyBsaSBhIHsNCiAgcGFkZGluZy1yaWdodDo0cHg7DQogIF9wYWRkaW5nLXJpZ2h0OjAN
Cn0NCg0KI2djLXRvYyB1bCBsaSwjZ2MtdG9jIG9sIGxpLCNnYy10b2MgLnRyZWVsaXN0IGxpIHsN
CiAgbGlzdC1zdHlsZTpub25lOw0KICBwYWRkaW5nOi4yZW0gMCAuMmVtIDJweDsNCiAgbWFyZ2lu
OjANCn0NCg0KI2djLXRvYyB1bCBsaSBsaSwjZ2MtdG9jIG9sIGxpIGxpLCNnYy10b2MgLnRyZWVs
aXN0IGxpIGxpIHsNCiAgcGFkZGluZzouMmVtIDAgLjJlbSAxNXB4DQp9DQoNCiNnYy10b2MgdWwg
aDEsI2djLXRvYyBvbCBoMSwjZ2MtdG9jIHVsIGgyLCNnYy10b2Mgb2wgaDIgew0KICBmb250LXdl
aWdodDpib2xkOw0KICBmb250LXNpemU6MTAwJTsNCiAgbWFyZ2luOjA7DQogIHBhZGRpbmc6LjJl
bSAwOw0KICBib3JkZXI6bm9uZTsNCiAgYmFja2dyb3VuZDojZmZmDQp9DQoNCiN0b2MgaDIgew0K
ICBmb250LXdlaWdodDpib2xkOw0KICBmb250LXNpemU6MTAwJTsNCiAgbWFyZ2luOjA7DQogIGJv
cmRlcjpub25lICFpbXBvcnRhbnQ7DQogIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzIsIDIzNywg
MjM1KSAhaW1wb3J0YW50Ow0KICBwYWRkaW5nOjANCn0NCg0KI2djLXRvYyB1bCAubGVmdE5hdlNl
bGVjdGVkLCNnYy10b2Mgb2wgLmxlZnROYXZTZWxlY3RlZCwudHJlZWxpc3QgLmxlZnROYXZTZWxl
Y3RlZCB7DQogIGJhY2tncm91bmQtY29sb3I6I2U1ZWNmOTsNCiAgY29sb3I6IzAwMDsNCiAgdGV4
dC1kZWNvcmF0aW9uOm5vbmU7DQogIHotaW5kZXg6MjsNCiAgcG9zaXRpb246cmVsYXRpdmUNCn0N
Cg0KI2djLXRvYyB1bCAubGVmdE5hdlNlbGVjdGVkLCNnYy10b2Mgb2wgLmxlZnROYXZTZWxlY3Rl
ZCwudHJlZWxpc3QgLmxlZnROYXZTZWxlY3RlZCB7DQogIGJhY2tncm91bmQtY29sb3I6I2RjZjZk
Yg0KfQ0KDQouZGVwciAjZ2MtdG9jIHVsIC5sZWZ0TmF2U2VsZWN0ZWQsLmRlcHIgI2djLXRvYyBv
bCAubGVmdE5hdlNlbGVjdGVkLC5kZXByIC50cmVlbGlzdCAubGVmdE5hdlNlbGVjdGVkIHsNCiAg
YmFja2dyb3VuZC1jb2xvcjojZGRkDQp9DQoNCiNnYy10b2MgdWwgZGl2LnRsdy10aXRsZSwjZ2Mt
dG9jIG9sIGRpdi50bHctdGl0bGUsI2djLXRvYyAudHJlZWxpc3QgZGl2LnRsdy10aXRsZSB7DQog
IHBvc2l0aW9uOnJlbGF0aXZlOw0KICBtYXJnaW46MCAwIDAgLTE1cHg7DQogIHBhZGRpbmc6LjJl
bSAwIC4yZW0gMTVweA0KfQ0KDQojZ2MtdG9jIHVsIGRpdi50bHctdGl0bGUgaW1nLnRsdy1jb250
cm9sLCNnYy10b2Mgb2wgZGl2LnRsdy10aXRsZSBpbWcudGx3LWNvbnRyb2wsLnRyZWVsaXN0IGRp
di50bHctdGl0bGUgaW1nLnRsdy1jb250cm9sIHsNCiAgcG9zaXRpb246cmVsYXRpdmU7DQogIGhl
aWdodDppbmhlcml0Ow0KICB3aWR0aDo5cHg7DQogIG1hcmdpbjowICFpbXBvcnRhbnQ7DQogIHBh
ZGRpbmc6MDsNCiAgYm9yZGVyOm5vbmUNCn0NCg0KI2djLXRvYyB1bCAudGx3LXBsdXMsI2djLXRv
YyBvbCAudGx3LXBsdXMsLnRyZWVsaXN0IC50bHctcGx1cyB7DQogIGJhY2tncm91bmQtaW1hZ2U6
dXJsKC9pbWFnZXMvc3ByaXRlczA4MTMyMDA4LnBuZyk7DQogIGJhY2tncm91bmQtcG9zaXRpb246
LTI4cHggLTE0NnB4Ow0KICB3aWR0aDo5cHg7DQogIGhlaWdodDo5cHgNCn0NCg0KI2djLXRvYyB1
bCAudGx3LW1pbnVzLCNnYy10b2Mgb2wgLnRsdy1taW51cywudHJlZWxpc3QgLnRsdy1taW51cyB7
DQogIGJhY2tncm91bmQtaW1hZ2U6dXJsKC9pbWFnZXMvc3ByaXRlczA4MTMyMDA4LnBuZyk7DQog
IGJhY2tncm91bmQtcG9zaXRpb246LTI4cHggLTIxMHB4Ow0KICB3aWR0aDo5cHg7DQogIGhlaWdo
dDo5cHgNCn0NCg0KI2djLXRvYyB1bCAudGx3LXBsdXM6aG92ZXIsI2djLXRvYyBvbCAudGx3LXBs
dXM6aG92ZXIsLnRyZWVsaXN0IC50bHctcGx1czpob3ZlciB7DQogIGJhY2tncm91bmQtaW1hZ2U6
dXJsKC9pbWFnZXMvc3ByaXRlczA4MTMyMDA4LnBuZyk7DQogIGJhY2tncm91bmQtcG9zaXRpb246
LTI4cHggLTM0NHB4Ow0KICB3aWR0aDo5cHg7DQogIGhlaWdodDo5cHgNCn0NCg0KI2djLXRvYyB1
bCAudGx3LW1pbnVzOmhvdmVyLCNnYy10b2Mgb2wgLnRsdy1taW51czpob3ZlciwudHJlZWxpc3Qg
LnRsdy1taW51czpob3ZlciB7DQogIGJhY2tncm91bmQtaW1hZ2U6dXJsKC9pbWFnZXMvc3ByaXRl
czA4MTMyMDA4LnBuZyk7DQogIGJhY2tncm91bmQtcG9zaXRpb246LTI4cHggLTQwOHB4Ow0KICB3
aWR0aDo5cHg7DQogIGhlaWdodDo5cHgNCn0NCg0KI2djLXRvYyBoMSwjZ2MtdG9jIGgyIHsNCiAg
Zm9udC13ZWlnaHQ6Ym9sZDsNCiAgZm9udC1zaXplOjEwMCU7DQogIG1hcmdpbjowOw0KICBwYWRk
aW5nOjA7DQogIGJvcmRlcjpub25lOw0KICBiYWNrZ3JvdW5kOiNmZmYNCn0NCg0KI2djLXRvYyBk
aXYubGluZSB7DQogIGJvcmRlci10b3A6dGhpbiBkb3R0ZWQgI2JiYjsNCiAgaGVpZ2h0OjFweDsN
CiAgbWFyZ2luOjEuM2VtIDFlbSAwIDA7DQogIHBhZGRpbmc6MA0KfQ0KDQojZ2MtdG9jLmhpZGRl
biB7DQogIGRpc3BsYXk6bm9uZQ0KfQ0KDQojZ2MtdG9jLnZpc2libGUgKiB7DQogIHpvb206MQ0K
fQ0KDQojZ2MtcGFnZWNvbnRlbnQuZXhwYW5kZWQgew0KICBtYXJnaW4tbGVmdDowOw0KICB3aWR0
aDphdXRvDQp9DQoNCiNnYy1jb2xsYXBzaWJsZSB7DQogIHBvc2l0aW9uOmFic29sdXRlOw0KICBs
ZWZ0Oi01cHg7DQogIHRvcDowOw0KICB3aWR0aDozcHg7DQogIG92ZXJmbG93OmhpZGRlbjsNCiAg
Ym9yZGVyOjJweCBzb2xpZCAjZmZmOw0KICBib3JkZXItdG9wOm5vbmU7DQogIGJvcmRlci1ib3R0
b206bm9uZTsNCiAgYmFja2dyb3VuZDojZTVlY2Y5Ow0KICBjdXJzb3I6cG9pbnRlcg0KfQ0KDQoj
Z2MtY29sbGFwc2libGUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiNkY2Y2ZGINCn0NCg0KLmRlcHIg
I2djLWNvbGxhcHNpYmxlIHsNCiAgYmFja2dyb3VuZC1jb2xvcjojZGRkDQp9DQoNCiNnYy1jb2xs
YXBzaWJsZS5ob3ZlciB7DQogIGJvcmRlci1jb2xvcjojZDNkOWU1Ow0KICBib3JkZXItd2lkdGg6
MXB4Ow0KICB3aWR0aDo1cHgNCn0NCg0KI2djLWNvbGxhcHNpYmxlLmhvdmVyIHsNCiAgYm9yZGVy
LWNvbG9yOiMwOTANCn0NCg0KLmRlcHIgI2djLWNvbGxhcHNpYmxlLmhvdmVyIHsNCiAgYm9yZGVy
LWNvbG9yOiMzMzMNCn0NCg0KI2djLWNvbGxhcHNpYmxlLWFycm93IHsNCiAgd2lkdGg6NHB4Ow0K
ICBoZWlnaHQ6MTJweDsNCiAgYmFja2dyb3VuZDp1cmwoL2ltYWdlcy9oaWRlLWFycm93LmdpZikg
dG9wIGxlZnQgbm8tcmVwZWF0Ow0KICBwb3NpdGlvbjphYnNvbHV0ZTsNCiAgbWFyZ2luLWxlZnQ6
LTE1cHg7DQogIGRpc3BsYXk6bm9uZTsNCiAgei1pbmRleDo1DQp9DQoNCiNnYy1jb2xsYXBzaWJs
ZS1hcnJvdy5jb2xsYXBzZWQgew0KICBiYWNrZ3JvdW5kOnVybCgvaW1hZ2VzL3Nob3ctYXJyb3cu
Z2lmKSB0b3AgbGVmdCBuby1yZXBlYXQ7DQogIG1hcmdpbi1sZWZ0OjE3cHgNCn0NCg0KI2djLWZv
b3RlciB7DQogIGNsZWFyOmJvdGg7DQogIG1hcmdpbjowOw0KICBjb2xvcjojNjY2DQp9DQoNCiNn
Yy1mb290ZXIgLnRleHQgew0KICB0ZXh0LWFsaWduOmNlbnRlcjsNCiAgcGFkZGluZzozMHB4IDA7
DQogIG1hcmdpbjowIDAgMCAwDQp9DQoNCiNnYy1mb290ZXIgLm5vdGljZSB7DQogIHBhZGRpbmc6
MCAwIDhweCAwDQp9DQoNCiNzZWFyY2ggew0KICBtYXJnaW46MTJweCAwIDAgMTcwcHgNCn0NCg0K
I3NlYXJjaCB0YWJsZSwjc2VhcmNoIHRhYmxlIHRkIHsNCiAgYm9yZGVyOm5vbmU7DQogIHBhZGRp
bmc6MDsNCiAgbWFyZ2luOjA7DQogIGNsZWFyOm5vbmUNCn0NCg0KI3NlYXJjaCBmb3JtIHsNCiAg
bWFyZ2luOjANCn0NCg0KLmdyZXl0ZXh0IHsNCiAgY29sb3I6I2FhYTsNCiAgZm9udC1zaXplOnNt
YWxsOw0KICBoZWlnaHQ6MTRweA0KfQ0KDQpkaXYuc2VhcmNoLWNvbnRyb2wgew0KICBkaXNwbGF5
Om5vbmU7DQogIG1hcmdpbi10b3A6M3B4Ow0KICBwYWRkaW5nOjNweA0KfQ0KDQpkaXYuc2VhcmNo
LWNvbnRyb2wgLmdzYy1jb250cm9sIHsNCiAgd2lkdGg6MTAwJQ0KfQ0KDQpkaXYuc2VhcmNoLWNv
bnRyb2wgLmdzYy1hZC1ib3ggew0KICBkaXNwbGF5Om5vbmUNCn0NCg0KLmdzYy1jb250cm9sIGZv
cm0uZ3NjLXNlYXJjaC1ib3ggew0KICBkaXNwbGF5Om5vbmUNCn0NCg0KdGQuZ3NjLWNsZWFyLWJ1
dHRvbiB7DQogIGRpc3BsYXk6bm9uZQ0KfQ0KDQouZ3NjLXNlYXJjaC1idXR0b24gew0KICBtYXJn
aW4tbGVmdDoxcHgNCn0NCg0KLmdzYy1icmFuZGluZyB7DQogIGRpc3BsYXk6bm9uZQ0KfQ0KDQou
Z3NjLXRhYnNBcmVhIHsNCiAgYm9yZGVyLXRvcDoxcHggc29saWQgIzM2QzsNCiAgYmFja2dyb3Vu
ZDojZTVlY2Y5IG5vbmUgcmVwZWF0IHNjcm9sbCAwOw0KICBwYWRkaW5nOjVweCAxcHggNHB4Ow0K
ICB3aWR0aDoxMDAlDQp9DQoNCi5nc2MtdGFic0FyZWEgLmdzLXNwYWNlciB7DQogIGZvbnQtc2l6
ZTowOw0KICBtYXJnaW4tcmlnaHQ6MDsNCiAgb3ZlcmZsb3c6aGlkZGVuDQp9DQoNCi5nc2MtdGFi
c0FyZWEgLmdzLXNwYWNlci1vcGVyYSB7DQogIG1hcmdpbi1yaWdodDowDQp9DQoNCi5nc2MtdGFi
c0FyZWFJbnZpc2libGUgew0KICBkaXNwbGF5Om5vbmUNCn0NCg0KLmdzYy10YWJIZWFkZXIgew0K
ICBkaXNwbGF5OmlubGluZTsNCiAgY3Vyc29yOnBvaW50ZXI7DQogIHBhZGRpbmctbGVmdDowOw0K
ICBwYWRkaW5nLXJpZ2h0OjA7DQogIG1hcmdpbi1yaWdodDowOw0KICBmb250LXdlaWdodDpib2xk
DQp9DQoNCi5nc2MtdGFiSGVhZGVyLmdzYy10YWJoQWN0aXZlIHsNCiAgcG9zaXRpb246cmVsYXRp
dmU7DQogIHBhZGRpbmc6MCAxMHB4IDAgNXB4Ow0KICBmb250LXdlaWdodDpib2xkOw0KICBjb2xv
cjojMDAwOw0KICBjdXJzb3I6YXV0bw0KfQ0KDQouZ3NjLXRhYkhlYWRlci5nc2MtdGFiaEluYWN0
aXZlIHsNCiAgcGFkZGluZzowIDEwcHggMCA1cHg7DQogIGZvbnQtd2VpZ2h0Om5vcm1hbDsNCiAg
dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsNCiAgY29sb3I6IzAwQw0KfQ0KDQouZ3NjLXRhYkRh
dGEuZ3NjLXRhYmRBY3RpdmUgew0KICBkaXNwbGF5OmJsb2NrDQp9DQoNCi5nc2MtdGFiRGF0YS5n
c2MtdGFiZEluYWN0aXZlIHsNCiAgZGlzcGxheTpub25lDQp9DQoNCi5nc2MtcmVzdWx0c2JveC12
aXNpYmxlIHsNCiAgd2lkdGg6NDJlbQ0KfQ0KDQouZ3NjLXJlc3VsdHMgew0KICBjbGVhcjpib3Ro
Ow0KICBwYWRkaW5nLWJvdHRvbToycHg7DQogIHBhZGRpbmctdG9wOjE1cHgNCn0NCg0KLmdzYy1y
ZXN1bHRzIHRhYmxlLC5nc2MtcmVzdWx0cyB0ZCB7DQogIGJvcmRlcjowDQp9DQoNCiNzZWFyY2hD
b250cm9sIC5ncy1wdWJsaXNoZXIgew0KICBkaXNwbGF5Om5vbmUNCn0NCg0KLmdzYy1yZXN1bHQg
ew0KICBtYXJnaW4tYm90dG9tOjEuMmVtDQp9DQoNCi5nc2MtcmVzdWx0IC5ncy10aXRsZSB7DQog
IGhlaWdodDoxLjRlbTsNCiAgb3ZlcmZsb3c6aGlkZGVuOw0KICBmb250LXNpemU6MTEwJQ0KfQ0K
DQouZ3NjLXJlc3VsdCBkaXYuZ3Mtd2F0ZXJtYXJrIHsNCiAgZGlzcGxheTpub25lDQp9DQoNCi5n
c2MtcmVzdWx0c0hlYWRlciB7DQogIGRpc3BsYXk6bm9uZQ0KfQ0KDQouZ3NjLXJlc3VsdHMgLmdz
Yy10cmFpbGluZy1tb3JlLXJlc3VsdHMgew0KICBtYXJnaW4tYm90dG9tOjEwcHgNCn0NCg0KLmdz
Yy1yZXN1bHRzIC5nc2MtdHJhaWxpbmctbW9yZS1yZXN1bHRzLC5nc2MtcmVzdWx0cyAuZ3NjLXRy
YWlsaW5nLW1vcmUtcmVzdWx0cyAqIHsNCiAgY29sb3I6IzAwYzsNCiAgdGV4dC1kZWNvcmF0aW9u
OnVuZGVybGluZQ0KfQ0KDQouZ3NjLXJlc3VsdHMgLmdzYy1jdXJzb3ItYm94IC5nc2MtdHJhaWxp
bmctbW9yZS1yZXN1bHRzIHsNCiAgbWFyZ2luLWJvdHRvbTowOw0KICBkaXNwbGF5OmlubGluZQ0K
fQ0KDQouZ3NjLXJlc3VsdHMgLmdzYy1jdXJzb3Igew0KICBkaXNwbGF5OmlubGluZQ0KfQ0KDQou
Z3NjLXJlc3VsdHMgLmdzYy1jdXJzb3ItYm94IHsNCiAgbWFyZ2luLWJvdHRvbToxMHB4DQp9DQoN
Ci5nc2MtcmVzdWx0cyAuZ3NjLWN1cnNvci1ib3ggLmdzYy1jdXJzb3ItcGFnZSB7DQogIGN1cnNv
cjpwb2ludGVyOw0KICBjb2xvcjojMDAwOw0KICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOw0K
ICBtYXJnaW4tcmlnaHQ6OHB4Ow0KICBkaXNwbGF5OmlubGluZQ0KfQ0KDQouZ3NjLXJlc3VsdHMg
LmdzYy1jdXJzb3ItYm94IC5nc2MtY3Vyc29yLWN1cnJlbnQtcGFnZSB7DQogIGNvbG9yOiNhOTBh
MDg7DQogIGZvbnQtd2VpZ2h0OmJvbGQ7DQogIHRleHQtZGVjb3JhdGlvbjpub25lDQp9DQoNCi5n
cy1yZXN1bHQgLmdzLXRpdGxlLC5ncy1yZXN1bHQgLmdzLXRpdGxlICogew0KICBjb2xvcjojMDBj
Ow0KICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lDQp9DQoNCi5ncy1kaXZpZGVyIHsNCiAgcGFk
ZGluZy1ib3R0b206OHB4Ow0KICB0ZXh0LWFsaWduOmNlbnRlcjsNCiAgY29sb3I6IzY3Njc2Nw0K
fQ0KDQouZ3MtcmVzdWx0IGEuZ3MtdmlzaWJsZVVybCwuZ3MtcmVzdWx0IC5ncy12aXNpYmxlVXJs
IHsNCiAgY29sb3I6Z3JlZW47DQogIHRleHQtZGVjb3JhdGlvbjpub25lDQp9DQoNCi5nc2Mtd2Vi
UmVzdWx0IGRpdi5ncy12aXNpYmxlVXJsLXNob3J0IHsNCiAgZGlzcGxheTpub25lDQp9DQoNCi5n
cy13ZWJSZXN1bHQgZGl2LmdzLXZpc2libGVVcmwtbG9uZyB7DQogIHdpZHRoOjEwMCU7DQogIG92
ZXJmbG93OmhpZGRlbjsNCiAgZGlzcGxheTpibG9jazsNCiAgd2hpdGUtc3BhY2U6bm93cmFwDQp9
DQoNCi5nLXRwbC0xNzAgLmctdW5pdCwuZy11bml0IC5nLXRwbC0xNzAgLmctdW5pdCwuZy11bml0
IC5nLXVuaXQgLmctdHBsLTE3MCAuZy11bml0IHsNCiAgZGlzcGxheTpibG9jazsNCiAgbWFyZ2lu
OjAgMCAwIDE3MXB4Ow0KICB3aWR0aDphdXRvOw0KICBmbG9hdDpub25lDQp9DQoNCi5nLXVuaXQg
LmctdW5pdCAuZy10cGwtMTcwIC5nLWZpcnN0LC5nLXVuaXQgLmctdHBsLTE3MCAuZy1maXJzdCwu
Zy10cGwtMTcwIC5nLWZpcnN0IHsNCiAgZGlzcGxheTpibG9jazsNCiAgbWFyZ2luOjA7DQogIHdp
ZHRoOjE3MXB4Ow0KICBmbG9hdDpsZWZ0DQp9DQoNCiNjcy1zZWFyY2hhcmVhIGEudW5zZWxlY3Rh
YmxlIHsNCiAgLW1vei11c2VyLXNlbGVjdDpub25lOw0KICAtdXNlci1zZWxlY3Q6bm9uZQ0KfQ0K
DQojY3MtcmVjb21tZW5kZWQgew0KICB0ZXh0LWFsaWduOmxlZnQ7DQogIGJhY2tncm91bmQtY29s
b3I6I2UzZWZmZTsNCiAgZm9udC1zdHlsZTppdGFsaWMNCn0NCg0KI2NzLXNlYXJjaHJlc3VsdHMg
ew0KICBwb3NpdGlvbjphYnNvbHV0ZTsNCiAgbWFyZ2luLWxlZnQ6LS4zZW07DQogIGJhY2tncm91
bmQ6I2ZmZjsNCiAgbGluZS1oZWlnaHQ6MTQwJTsNCiAgYm9yZGVyOjFweCAjYzljOWM5IHNvbGlk
Ow0KICBjdXJzb3I6cG9pbnRlcjsNCiAgcG9zaXRpb246YWJzb2x1dGU7DQogIHotaW5kZXg6MjAx
MDsNCiAgZGlzcGxheTpub25lDQp9DQoNCiNjcy1zZWFyY2hyZXN1bHRzIGEgew0KICB0ZXh0LWRl
Y29yYXRpb246bm9uZTsNCiAgY29sb3I6IzAwMA0KfQ0KDQouY3Mtc2VhcmNocmVzdWx0IHsNCiAg
cGFkZGluZzowOw0KICBkaXNwbGF5OmJsb2NrDQp9DQoNCmltZy5jb2xsYXBzaWJsZS1jb250cm9s
IHsNCiAgd2lkdGg6OXB4Ow0KICBoZWlnaHQ6OXB4Ow0KICBjdXJzb3I6cG9pbnRlcjsNCiAgbWFy
Z2luOjFweDsNCiAgdmVydGljYWwtYWxpZ246bWlkZGxlDQp9DQoNCmltZy5jb2xsYXBzaWJsZS1j
b250cm9sLmNvbGxhcHNpYmxlLXBsdXMgew0KICBiYWNrZ3JvdW5kLWltYWdlOnVybCgvaW1hZ2Vz
L3BsdXMuZ2lmKQ0KfQ0KDQppbWcuY29sbGFwc2libGUtY29udHJvbC5jb2xsYXBzaWJsZS1wbHVz
LmNvbGxhcHNpYmxlLWhvdmVyIHsNCiAgYmFja2dyb3VuZC1pbWFnZTp1cmwoL2ltYWdlcy9wbHVz
X2hvdmVyLmdpZikNCn0NCg0KaW1nLmNvbGxhcHNpYmxlLWNvbnRyb2wuY29sbGFwc2libGUtbWlu
dXMgew0KICBiYWNrZ3JvdW5kLWltYWdlOnVybCgvaW1hZ2VzL21pbnVzLmdpZikNCn0NCg0KaW1n
LmNvbGxhcHNpYmxlLWNvbnRyb2wuY29sbGFwc2libGUtbWludXMuY29sbGFwc2libGUtaG92ZXIg
ew0KICBiYWNrZ3JvdW5kLWltYWdlOnVybCgvaW1hZ2VzL21pbnVzX2hvdmVyLmdpZikNCn0NCg0K
I21haW5Db2x1bW4gew0KICBkaXNwbGF5OmJsb2NrOw0KICBtYXJnaW46MCAwIDAgMTcxcHg7DQog
IHdpZHRoOmF1dG87DQogIGZsb2F0Om5vbmUNCn0NCg0KZGl2LnN1bW1hcnkgLnN1YmR1ZWQgew0K
ICBjb2xvcjogcmdiKDE0NywgMTgwLCAyMTcpOw0KfQ0KDQoub3B0aW9uYWwgew0KICBjb2xvcjog
cmdiKDEyNSwgMTI1LCAxMjUpOw0KfQ0KDQouYXBpR3JvdXAgZGl2LmRlc2NyaXB0aW9uIHsNCiAg
bWFyZ2luLWxlZnQ6IDJlbTsNCn0NCg0KLmFwaUdyb3VwIGRpdi5zdW1tYXJ5IHsNCiAgYm9yZGVy
OiAxcHggc29saWQgcmdiKDE0NywgMTgwLCAyMTcpOw0KICBmb250LWZhbWlseTogIkNvdXJpZXIg
TmV3IiwgY291cmllciwgbW9ub3NwYWNlOw0KICBwYWRkaW5nOiAwLjVlbTsNCiAgYmFja2dyb3Vu
ZC1jb2xvcjogcmdiKDIwMiwgMjIyLCAyNDQpOw0KICBtYXJnaW4tdG9wOiAxZW07DQp9DQoNCmRp
di5zdW1tYXJ5IGRpdiB7DQogIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KfQ0KDQpkaXYjYnJlYWRj
cnVtYnMgew0KICBkaXNwbGF5OiBpbmxpbmU7DQogIGZvbnQtc2l6ZTogODAlOw0KfQ0KDQouZXhh
bXBsZUxpbmsgew0KICBmb250LXNpemU6IDgwJTsNCn0NCg0KZGQgew0KICBtYXJnaW4tYm90dG9t
OiAwLjc1ZW07DQp9DQoNCm9sIGxpIHsNCiAgbWFyZ2luLXRvcDogMWVtOw0KfQ0KDQouZXhhbXBs
ZSB7DQp9DQoNCnAjY2xhc3NTdW1tYXJ5IHsNCn0NCg0KLmFwaUl0ZW0gew0KfQ0KDQpkaXYubm90
ZSB7DQogIGJhY2tncm91bmQtY29sb3I6IHJnYigyMDIsIDIyMiwgMjQ0KTsNCiAgYm9yZGVyOiAx
cHggc29saWQgcmdiKDE0NywgMTgwLCAyMTcpOw0KICBwYWRkaW5nOiAwLjVlbTsNCiAgbWFyZ2lu
OiAxZW0gMHB4Ow0KfQ0KDQouaGlkZGVuIHsNCiAgZGlzcGxheTogbm9uZTsNCn0NCg0KI2djLXBh
Z2Vjb250ZW50IHsNCn0NCg0KI21haW5Db2x1bW4gdGFibGUuaW1hZ2VsYXlvdXQgew0KICBib3Jk
ZXI6bm9uZTsNCn0NCg0KI21haW5Db2x1bW4gdGFibGUuaW1hZ2VsYXlvdXQgdGQgew0KICBib3Jk
ZXI6bm9uZTsNCiAgcGFkZGluZzowcHggNnB4IDZweDsNCiAgdGV4dC1hbGlnbjpjZW50ZXI7DQp9
DQoNCiNtYWluQ29sdW1uIHRhYmxlLmltYWdlbGF5b3V0IHRyLmltYWdlcyB0ZCB7DQogIHZlcnRp
Y2FsLWFsaWduOmJvdHRvbTsNCn0NCg0KdGFibGUubm9ib3JkZXJzIHsNCiAgcGFkZGluZzowcHg7
DQp9DQoNCnRhYmxlLm5vYm9yZGVycyB0aCB7DQogIGJvcmRlcjpub25lOw0KICBwYWRkaW5nOjEy
cHggMTJweCA2cHggMHB4DQp9DQp0YWJsZS5ub2JvcmRlcnMgdGQgew0KICBib3JkZXI6bm9uZTsN
CiAgcGFkZGluZzo2cHggMTJweCA2cHggMHB4DQp9DQoNCiNjb2Rlc2l0ZUNvbnRlbnQuaGlkZVNp
ZGVOYXYgI2djLXBhZ2Vjb250ZW50IHsNCiAgcGFkZGluZy1sZWZ0OjI0cHg7DQogIGJvcmRlci1s
ZWZ0OjBweDsNCn0NCg0KI2NvZGVzaXRlQ29udGVudC5oaWRlU2lkZU5hdiAuZy10cGwtMTcwIC5n
LXVuaXQgew0KICBkaXNwbGF5OmJsb2NrOw0KICBtYXJnaW46MCAwIDAgMHB4Ow0KICB3aWR0aDph
dXRvOw0KICBmbG9hdDpub25lDQp9DQo8L3N0eWxlPg0KDQo8c2NyaXB0IHR5cGU9InRleHQvamF2
YXNjcmlwdCI+DQooZnVuY3Rpb24oKXtmdW5jdGlvbiBqKGEsYil7Zm9yKHZhciBjIGluIGIpYVtj
XT1iW2NdfWZ1bmN0aW9uIGwoKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYXBwbHko
QXJyYXkucHJvdG90eXBlLnNsaWNlLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbShhLGIpe3ZhciBjPWwo
YXJndW1lbnRzLDIpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiLmFwcGx5KGEsYyl9fXZhciBu
PTk7ZnVuY3Rpb24gbyhhLGIpe2I9bmV3IHAoYik7Zm9yKGIuZj1bYV07Yi5mLmxlbmd0aDspe2E9
Yi5mLnNoaWZ0KCk7Yi5nKGEpO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylh
Lm5vZGVUeXBlPT0xJiZiLmYucHVzaChhKX19ZnVuY3Rpb24gcChhKXt0aGlzLmc9YX1mdW5jdGlv
biBxKGEsYixjKXthLnNldEF0dHJpYnV0ZShiLGMpfWZ1bmN0aW9uIHIoYSxiKXthLnJlbW92ZUF0
dHJpYnV0ZShiKX1mdW5jdGlvbiBzKGEpe2Euc3R5bGUuZGlzcGxheT0iIn0NCmZ1bmN0aW9uIHQo
YSl7YS5zdHlsZS5kaXNwbGF5PSJub25lIn07dmFyIHU9IjoiLHY9L1xzKjtccyovO2Z1bmN0aW9u
IHcoKXt0aGlzLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXcucHJvdG90eXBlLmk9ZnVuY3Rpb24o
YSxiKXt2YXIgYz10aGlzO2lmKCFjLmEpYy5hPXt9O2I/aihjLmEsYi5hKTpqKGMuYSx4KTtjLmEu
JHRoaXM9YTtjLmEuJGNvbnRleHQ9YztjLmQ9dHlwZW9mIGEhPSJ1bmRlZmluZWQiJiZhIT1udWxs
P2E6IiI7aWYoIWIpYy5hLiR0b3A9Yy5kfTt2YXIgeD17fTsoZnVuY3Rpb24oYSxiKXt4W2FdPWJ9
KSgiJGRlZmF1bHQiLG51bGwpO3ZhciB5PVtdO2Z1bmN0aW9uIHooYSl7Zm9yKHZhciBiIGluIGEu
YSlkZWxldGUgYS5hW2JdO2EuZD1udWxsO3kucHVzaChhKX1mdW5jdGlvbiBBKGEsYixjKXt0cnl7
cmV0dXJuIGIuY2FsbChjLGEuYSxhLmQpfWNhdGNoKGUpe3JldHVybiB4LiRkZWZhdWx0fX0NCmZ1
bmN0aW9uIEIoYSxiLGMsZSl7aWYoeS5sZW5ndGg+MCl7dmFyIGQ9eS5wb3AoKTt3LmNhbGwoZCxi
LGEpO2E9ZH1lbHNlIGE9bmV3IHcoYixhKTthLmEuJGluZGV4PWM7YS5hLiRjb3VudD1lO3JldHVy
biBhfXZhciBDPSJhXyIsRT0iYl8iLEY9IndpdGggKGFfKSB3aXRoIChiXykgcmV0dXJuICIsRz17
fTtmdW5jdGlvbiBIKGEpe2lmKCFHW2FdKXRyeXtHW2FdPW5ldyBGdW5jdGlvbihDLEUsRithKX1j
YXRjaChiKXt9cmV0dXJuIEdbYV19ZnVuY3Rpb24gSShhKXtyZXR1cm4gYX1mdW5jdGlvbiBKKGEp
e3ZhciBiPVtdO2E9YS5zcGxpdCh2KTtmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTsrK2Mpe3Zh
ciBkPWFbY10uaW5kZXhPZih1KTtpZighKGQ8MCkpe3ZhciBmO2Y9YVtjXS5zdWJzdHIoMCxkKS5y
ZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpO2Q9SChhW2NdLnN1YnN0cihkKzEp
KTtiLnB1c2goZixkKX19cmV0dXJuIGJ9DQpmdW5jdGlvbiBLKGEpe3ZhciBiPVtdO2E9YS5zcGxp
dCh2KTtmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTsrK2MpaWYoYVtjXSl7dmFyIGQ9SChhW2Nd
KTtiLnB1c2goZCl9cmV0dXJuIGJ9O3ZhciBMPSJqc2luc3RhbmNlIixhYT0ianN0cyIsTT0iKiIs
Tj0iZGl2IixiYT0iaWQiO2Z1bmN0aW9uIGNhKGEsYil7dmFyIGM9bmV3IE87UChiKTtjLmo9Yj9i
Lm5vZGVUeXBlPT1uP2I6Yi5vd25lckRvY3VtZW50fHxkb2N1bWVudDpkb2N1bWVudDt2YXIgZT1t
KGMsYy5lLGEsYik7YT1jLmg9W107Yj1jLms9W107Yy5jPVtdO2UoKTtmb3IodmFyIGQsZixnO2Eu
bGVuZ3RoOyl7ZD1hW2EubGVuZ3RoLTFdO2U9YltiLmxlbmd0aC0xXTtpZihlPj1kLmxlbmd0aCl7
ZT1hLnBvcCgpO2UubGVuZ3RoPTA7Yy5jLnB1c2goZSk7Yi5wb3AoKX1lbHNle2Y9ZFtlKytdO2c9
ZFtlKytdO2Q9ZFtlKytdO2JbYi5sZW5ndGgtMV09ZTtmLmNhbGwoYyxnLGQpfX19ZnVuY3Rpb24g
Tygpe312YXIgZGE9MCxRPXt9O1FbMF09e307dmFyIFI9e30sUz17fSxUPVtdO2Z1bmN0aW9uIFAo
YSl7YS5fX2pzdGNhY2hlfHxvKGEsZnVuY3Rpb24oYil7VShiKX0pfQ0KdmFyIFY9W1sianNzZWxl
Y3QiLEhdLFsianNkaXNwbGF5IixIXSxbImpzdmFsdWVzIixKXSxbImpzdmFycyIsSl0sWyJqc2V2
YWwiLEtdLFsidHJhbnNjbHVkZSIsSV0sWyJqc2NvbnRlbnQiLEhdLFsianNza2lwIixIXV07DQpm
dW5jdGlvbiBVKGEpe2lmKGEuX19qc3RjYWNoZSlyZXR1cm4gYS5fX2pzdGNhY2hlO3ZhciBiPWEu
Z2V0QXR0cmlidXRlKCJqc3RjYWNoZSIpO2lmKGIhPW51bGwpcmV0dXJuIGEuX19qc3RjYWNoZT1R
W2JdO2I9VC5sZW5ndGg9MDtmb3IodmFyIGM9Vi5sZW5ndGg7YjxjOysrYil7dmFyIGU9VltiXVsw
XSxkPWEuZ2V0QXR0cmlidXRlKGUpO1NbZV09ZDtkIT1udWxsJiZULnB1c2goZSsiPSIrZCl9aWYo
VC5sZW5ndGg9PTApe2Euc2V0QXR0cmlidXRlKCJqc3RjYWNoZSIsIjAiKTtyZXR1cm4gYS5fX2pz
dGNhY2hlPVFbMF19dmFyIGY9VC5qb2luKCImIik7aWYoYj1SW2ZdKXthLnNldEF0dHJpYnV0ZSgi
anN0Y2FjaGUiLGIpO3JldHVybiBhLl9fanN0Y2FjaGU9UVtiXX12YXIgZz17fTtiPTA7Zm9yKGM9
Vi5sZW5ndGg7YjxjOysrYil7ZD1WW2JdO2U9ZFswXTt2YXIgaT1kWzFdO2Q9U1tlXTtpZihkIT1u
dWxsKWdbZV09aShkKX1iPSIiKyArK2RhO2Euc2V0QXR0cmlidXRlKCJqc3RjYWNoZSIsDQpiKTtR
W2JdPWc7UltmXT1iO3JldHVybiBhLl9fanN0Y2FjaGU9Z31mdW5jdGlvbiBXKGEsYil7YS5oLnB1
c2goYik7YS5rLnB1c2goMCl9ZnVuY3Rpb24gWChhKXtyZXR1cm4gYS5jLmxlbmd0aD9hLmMucG9w
KCk6W119Ty5wcm90b3R5cGUuZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZT1ZKGMsYiksZD1l
LnRyYW5zY2x1ZGU7aWYoZClpZihlPVooZCkpe2IucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSxi
KTtiPVgoYyk7Yi5wdXNoKGMuZSxhLGUpO1coYyxiKX1lbHNlIGIucGFyZW50Tm9kZS5yZW1vdmVD
aGlsZChiKTtlbHNlKGU9ZS5qc3NlbGVjdCk/ZWEoYyxhLGIsZSk6Yy5iKGEsYil9Ow0KTy5wcm90
b3R5cGUuYj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZT1ZKGMsYiksZD1lLmpzZGlzcGxheTtp
ZihkKXtpZighQShhLGQsYikpe3QoYik7cmV0dXJufXMoYil9KGQ9ZS5qc3ZhcnMpJiZmYShjLGEs
YixkKTsoZD1lLmpzdmFsdWVzKSYmZ2EoYyxhLGIsZCk7aWYoZD1lLmpzZXZhbClmb3IodmFyIGY9
MCxnPWQubGVuZ3RoO2Y8ZzsrK2YpQShhLGRbZl0sYik7aWYoZD1lLmpzc2tpcClpZihBKGEsZCxi
KSlyZXR1cm47aWYoZT1lLmpzY29udGVudCl7YT0iIitBKGEsZSxiKTtpZihiLmlubmVySFRNTCE9
YSl7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIuZmlyc3RDaGlsZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxk
KGIuZmlyc3RDaGlsZCk7Yz1jLmouY3JlYXRlVGV4dE5vZGUoYSk7Yi5hcHBlbmRDaGlsZChjKX19
ZWxzZXtlPVgoYyk7Zm9yKGI9Yi5maXJzdENoaWxkO2I7Yj1iLm5leHRTaWJsaW5nKWIubm9kZVR5
cGU9PTEmJmUucHVzaChjLmUsYSxiKTtlLmxlbmd0aCYmVyhjLGUpfX07DQpmdW5jdGlvbiBlYShh
LGIsYyxlKXtlPUEoYixlLGMpO3ZhciBkPWMuZ2V0QXR0cmlidXRlKEwpLGY9ZmFsc2U7aWYoZClp
ZihkLmNoYXJBdCgwKT09TSl7dmFyIGc9ZC5zdWJzdHIoMSk7ZD1wYXJzZUludChnLDEwKTtmPXRy
dWV9ZWxzZSBkPXBhcnNlSW50KGQsMTApO3ZhciBpPWUhPW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0
IiYmdHlwZW9mIGUubGVuZ3RoPT0ibnVtYmVyIjtnPWk/ZS5sZW5ndGg6MTt2YXIgaD1pJiZnPT0w
O2lmKGkpaWYoaClpZihkKWMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKTtlbHNle2Muc2V0QXR0
cmlidXRlKEwsIiowIik7dChjKX1lbHNle3MoYyk7aWYoZD09PW51bGx8fGQ9PT0iInx8ZiYmZDxn
LTEpe2Y9WChhKTtkPWR8fDA7Zm9yKGk9Zy0xO2Q8aTsrK2Qpe3ZhciBrPWMuY2xvbmVOb2RlKHRy
dWUpO2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoayxjKTskKGssZSxkKTtoPUIoYixlW2RdLGQs
Zyk7Zi5wdXNoKGEuYixoLGsseixoLG51bGwpfSQoYywNCmUsZCk7aD1CKGIsZVtkXSxkLGcpO2Yu
cHVzaChhLmIsaCxjLHosaCxudWxsKTtXKGEsZil9ZWxzZSBpZihkPGcpe2Y9ZVtkXTskKGMsZSxk
KTtoPUIoYixmLGQsZyk7Zj1YKGEpO2YucHVzaChhLmIsaCxjLHosaCxudWxsKTtXKGEsZil9ZWxz
ZSBjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9ZWxzZSBpZihlPT1udWxsKXQoYyk7ZWxzZXtz
KGMpO2g9QihiLGUsMCwxKTtmPVgoYSk7Zi5wdXNoKGEuYixoLGMseixoLG51bGwpO1coYSxmKX19
ZnVuY3Rpb24gZmEoYSxiLGMsZSl7YT0wO2Zvcih2YXIgZD1lLmxlbmd0aDthPGQ7YSs9Mil7dmFy
IGY9ZVthXSxnPUEoYixlW2ErMV0sYyk7Yi5hW2ZdPWd9fQ0KZnVuY3Rpb24gZ2EoYSxiLGMsZSl7
YT0wO2Zvcih2YXIgZD1lLmxlbmd0aDthPGQ7YSs9Mil7dmFyIGY9ZVthXSxnPUEoYixlW2ErMV0s
Yyk7aWYoZi5jaGFyQXQoMCk9PSIkIiliLmFbZl09ZztlbHNlIGlmKGYuY2hhckF0KDApPT0iLiIp
e2Y9Zi5zdWJzdHIoMSkuc3BsaXQoIi4iKTtmb3IodmFyIGk9YyxoPWYubGVuZ3RoLGs9MCxoYT1o
LTE7azxoYTsrK2spe3ZhciBEPWZba107aVtEXXx8KGlbRF09e30pO2k9aVtEXX1pW2ZbaC0xXV09
Z31lbHNlIGlmKGYpaWYodHlwZW9mIGc9PSJib29sZWFuIilnP3EoYyxmLGYpOnIoYyxmKTtlbHNl
IGMuc2V0QXR0cmlidXRlKGYsIiIrZyl9fWZ1bmN0aW9uIFkoYSxiKXtpZihiLl9fanN0Y2FjaGUp
cmV0dXJuIGIuX19qc3RjYWNoZTtpZihhPWIuZ2V0QXR0cmlidXRlKCJqc3RjYWNoZSIpKXJldHVy
biBiLl9fanN0Y2FjaGU9UVthXTtyZXR1cm4gVShiKX0NCmZ1bmN0aW9uIFooYSxiKXt2YXIgYz1k
b2N1bWVudDtpZihhPWI/aWEoYyxhLGIpOmMuZ2V0RWxlbWVudEJ5SWQoYSkpe1AoYSk7YT1hLmNs
b25lTm9kZSh0cnVlKTthLnJlbW92ZUF0dHJpYnV0ZShiYSk7cmV0dXJuIGF9ZWxzZSByZXR1cm4g
bnVsbH1mdW5jdGlvbiBpYShhLGIsYyxlKXt2YXIgZD1hLmdldEVsZW1lbnRCeUlkKGIpO2lmKGQp
cmV0dXJuIGQ7Yz1jKCk7ZT1lfHxhYTtpZihkPWEuZ2V0RWxlbWVudEJ5SWQoZSkpZD1kO2Vsc2V7
ZD1hLmNyZWF0ZUVsZW1lbnQoTik7ZC5pZD1lO3QoZCk7ZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1
dGUiO2EuYm9keS5hcHBlbmRDaGlsZChkKX1lPWEuY3JlYXRlRWxlbWVudChOKTtkLmFwcGVuZENo
aWxkKGUpO2UuaW5uZXJIVE1MPWM7cmV0dXJuIGQ9YS5nZXRFbGVtZW50QnlJZChiKX1mdW5jdGlv
biAkKGEsYixjKXtjPT1iLmxlbmd0aC0xP3EoYSxMLE0rYyk6cShhLEwsIiIrYyl9O3dpbmRvdy5q
c3RHZXRUZW1wbGF0ZT1aO3dpbmRvdy5Kc0V2YWxDb250ZXh0PXc7d2luZG93LmpzdFByb2Nlc3M9
Y2E7DQp9KSgpDQo8L3NjcmlwdD4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0K
QXJyYXkucHJvdG90eXBlLmVhY2ggPSBmdW5jdGlvbihmKSB7DQogIGZvciAodmFyIGkgPSAwOyBp
IDwgdGhpcy5sZW5ndGg7IGkrKykgew0KICAgIGYodGhpc1tpXSwgaSk7DQogIH0NCn0NCg0KLy8g
VmlzaXRzIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBpbi1vcmRlci4gU3RvcHMgd2hlbiBmIHJldHVy
bnMgYW55IHRydXRoeQ0KLy8gdmFsdWUgYW5kIHJldHVybnMgdGhhdCBub2RlLg0KQXJyYXkucHJv
dG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uKGYpIHsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlz
Lmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGYodGhpc1tpXSwgaSkpDQogICAgICByZXR1cm4gdGhp
c1tpXTsNCiAgfQ0KfQ0KDQpBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24oZikgew0KICB2
YXIgcmV0dmFsID0gW107DQogIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykg
ew0KICAgIHJldHZhbC5wdXNoKGYodGhpc1tpXSwgaSkpOw0KICB9DQogIHJldHVybiByZXR2YWw7
DQp9DQoNCi8vIEFzc2lnbnMgYWxsIGtleXMgJiB2YWx1ZXMgb2YgfG9iajJ8IHRvIHxvYmoxfC4N
CmZ1bmN0aW9uIGV4dGVuZChvYmosIG9iajIpIHsNCiAgZm9yICh2YXIgayBpbiBvYmoyKSB7DQog
ICAgb2JqW2tdID0gb2JqMltrXTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBnZXRGdWxseVF1YWxpZmll
ZEZ1bmN0aW9uTmFtZShuYW1lc3BhY2UsIGZ1bmMpIHsNCiAgcmV0dXJuIG5hbWVzcGFjZSArICIu
IiArIGZ1bmMubmFtZTsNCn0NCg0KZnVuY3Rpb24gaGFzQ2FsbGJhY2socGFyYW1ldGVycykgew0K
ICByZXR1cm4gKHBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJg0KICAgICAgICAgIHBhcmFtZXRlcnNb
cGFyYW1ldGVycy5sZW5ndGggLSAxXS50eXBlID09ICJmdW5jdGlvbiIpOw0KfQ0KDQpmdW5jdGlv
biBnZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1ldGVycykgew0KICByZXR1cm4gcGFyYW1ldGVy
c1twYXJhbWV0ZXJzLmxlbmd0aCAtIDFdOw0KfQ0KDQpmdW5jdGlvbiBzaG91bGRFeHBhbmRPYmpl
Y3Qob2JqZWN0KSB7DQogIHJldHVybiAob2JqZWN0LnR5cGUgPT0gIm9iamVjdCIgJiYgb2JqZWN0
LnByb3BlcnRpZXMpDQp9DQoNCmZ1bmN0aW9uIGlzQXJyYXkodHlwZSkgew0KICByZXR1cm4gdHlw
ZS50eXBlID09ICdhcnJheSc7DQp9DQoNCmZ1bmN0aW9uIGdldFR5cGVSZWYodHlwZSkgew0KICBy
ZXR1cm4gdHlwZVsiJHJlZiJdOw0KfQ0KDQpmdW5jdGlvbiBnZXRQcm9wZXJ0eUxpc3RGcm9tT2Jq
ZWN0KG9iamVjdCkgew0KICB2YXIgcHJvcGVydHlMaXN0ID0gW107DQogIGZvciAodmFyIHAgaW4g
b2JqZWN0LnByb3BlcnRpZXMpIHsNCiAgICB2YXIgcHJvcCA9IG9iamVjdC5wcm9wZXJ0aWVzW3Bd
Ow0KICAgIHByb3AubmFtZSA9IHA7DQogICAgcHJvcGVydHlMaXN0LnB1c2gocHJvcCk7DQogIH0N
CiAgcmV0dXJuIHByb3BlcnR5TGlzdDsNCn0NCg0KZnVuY3Rpb24gZ2V0VHlwZU5hbWUoc2NoZW1h
KSB7DQogIGlmIChzY2hlbWEuJHJlZikNCiAgICByZXR1cm4gc2NoZW1hLiRyZWY7DQoNCiAgaWYg
KHNjaGVtYS5jaG9pY2VzKSB7DQogICAgdmFyIHR5cGVOYW1lcyA9IFtdOw0KICAgIHNjaGVtYS5j
aG9pY2VzLmVhY2goZnVuY3Rpb24oYykgew0KICAgICAgdHlwZU5hbWVzLnB1c2goZ2V0VHlwZU5h
bWUoYykpOw0KICAgIH0pOw0KDQogICAgcmV0dXJuIHR5cGVOYW1lcy5qb2luKCIgb3IgIik7DQog
IH0NCg0KICBpZiAoc2NoZW1hLnR5cGUgPT0gImFycmF5IikNCiAgICByZXR1cm4gImFycmF5IG9m
ICIgKyBnZXRUeXBlTmFtZShzY2hlbWEuaXRlbXMpOw0KDQogIGlmIChzY2hlbWEuaXNJbnN0YW5j
ZU9mKQ0KICAgIHJldHVybiBzY2hlbWEuaXNJbnN0YW5jZU9mOw0KDQogIHJldHVybiBzY2hlbWEu
dHlwZTsNCn0NCg0KZnVuY3Rpb24gZ2V0VHlwZU5hbWUoc2NoZW1hKSB7DQogIGlmIChzY2hlbWEu
JHJlZikNCiAgICByZXR1cm4gc2NoZW1hLiRyZWY7DQoNCiAgaWYgKHNjaGVtYS5jaG9pY2VzKSB7
DQogICAgdmFyIHR5cGVOYW1lcyA9IFtdOw0KICAgIHNjaGVtYS5jaG9pY2VzLmVhY2goZnVuY3Rp
b24oYykgew0KICAgICAgdHlwZU5hbWVzLnB1c2goZ2V0VHlwZU5hbWUoYykpOw0KICAgIH0pOw0K
DQogICAgcmV0dXJuIHR5cGVOYW1lcy5qb2luKCIgb3IgIik7DQogIH0NCg0KICBpZiAoc2NoZW1h
LnR5cGUgPT0gImFycmF5IikNCiAgICByZXR1cm4gImFycmF5IG9mICIgKyBnZXRUeXBlTmFtZShz
Y2hlbWEuaXRlbXMpOw0KDQogIGlmIChzY2hlbWEuaXNJbnN0YW5jZU9mKQ0KICAgIHJldHVybiBz
Y2hlbWEuaXNJbnN0YW5jZU9mOw0KDQogIHJldHVybiBzY2hlbWEudHlwZTsNCn0NCg0KZnVuY3Rp
b24gZ2V0U2lnbmF0dXJlU3RyaW5nKHBhcmFtZXRlcnMpIHsNCiAgaWYgKCFwYXJhbWV0ZXJzKQ0K
ICAgIHJldHVybiAiIjsNCiAgdmFyIHJldHZhbCA9IFtdOw0KICBwYXJhbWV0ZXJzLmVhY2goZnVu
Y3Rpb24ocGFyYW0sIGkpIHsNCiAgICByZXR2YWwucHVzaChnZXRUeXBlTmFtZShwYXJhbSkgKyAi
ICIgKyBwYXJhbS5uYW1lKTsNCiAgfSk7DQoNCiAgcmV0dXJuIHJldHZhbC5qb2luKCIsICIpOw0K
fQ0KDQpmdW5jdGlvbiBzb3J0QnlOYW1lKGEsIGIpIHsNCiAgaWYgKGEubmFtZSA8IGIubmFtZSkg
ew0KICAgIHJldHVybiAtMTsNCiAgfQ0KICBpZiAoYS5uYW1lID4gYi5uYW1lKSB7DQogICAgcmV0
dXJuIDE7DQogIH0NCiAgcmV0dXJuIDA7DQp9DQoNCmZ1bmN0aW9uIHJlbmRlclBhZ2UoKQ0Kew0K
ICAgIHZhciBpbnB1dCA9IG5ldyBKc0V2YWxDb250ZXh0KGluc3BlY3RvckFQSSk7DQogICAgdmFy
IG91dHB1dCA9IGRvY3VtZW50LmJvZHk7DQogICAganN0UHJvY2VzcyhpbnB1dCwgb3V0cHV0KTsN
Cg0KfQ0KPC9zY3JpcHQ+DQo8L2hlYWQ+DQoNCjxib2R5IG9ubG9hZD0icmVuZGVyUGFnZSgpIj4N
Cg0KPCEtLSBjb21tb24gdGVtcGxhdGVzIC0tPg0KDQo8ZGl2IGpzc2tpcD0idHJ1ZSIgc3R5bGU9
ImRpc3BsYXk6bm9uZSI+DQoNCiAgPCEtLSBWQUxVRSAtLT4NCiAgPGRpdiBpZD0idmFsdWVUZW1w
bGF0ZSI+DQogICAgPGR0Pg0KICAgICAgPHZhciBqc2Rpc3BsYXk9IiR0aGlzLm5hbWUiIGpzY29u
dGVudD0iJHRoaXMubmFtZSI+cGFyYW1OYW1lPC92YXI+DQogICAgICAgIDxlbT4NCg0KICAgICAg
ICAgIDwhLS0gVFlQRSAtLT4NCiAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmlubGluZSI+
DQogICAgICAgICAgICAoDQogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJvcHRpb25hbCIganNk
aXNwbGF5PSJvcHRpb25hbCI+b3B0aW9uYWw8L3NwYW4+DQogICAgICAgICAgICAgIDxzcGFuIGlk
PSJ0eXBlVGVtcGxhdGUiPg0KICAgICAgICAgICAgICAgIDxzcGFuIGpzZGlzcGxheT0iZ2V0VHlw
ZVJlZigkdGhpcykiPg0KICAgICAgICAgICAgICAgICAgPGEganN2YWx1ZXM9Ii5ocmVmOiAnI3R5
cGUtJyArIGdldFR5cGVSZWYoJHRoaXMpIiBqc2NvbnRlbnQ9ImdldFR5cGVSZWYoJHRoaXMpIj4g
VHlwZTwvYT4NCiAgICAgICAgICAgICAgICA8L3NwYW4+DQogICAgICAgICAgICAgICAgPHNwYW4g
anNkaXNwbGF5PSIhZ2V0VHlwZVJlZigkdGhpcykiPg0KICAgICAgICAgICAgICAgICAgPHNwYW4g
anNkaXNwbGF5PSJpc0FycmF5KCR0aGlzKSI+DQogICAgICAgICAgICAgICAgICAgIGFycmF5IG9m
IDxzcGFuIGpzc2VsZWN0PSJpdGVtcyI+PHNwYW4gdHJhbnNjbHVkZT0idHlwZVRlbXBsYXRlIj48
L3NwYW4+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgPC9zcGFuPg0KICAgICAgICAgICAgICAg
ICAgPHNwYW4ganNkaXNwbGF5PSIhaXNBcnJheSgkdGhpcykiIGpzY29udGVudD0iZ2V0VHlwZU5h
bWUoJHRoaXMpIj5wYXJhbVR5cGU8L3NwYW4+DQogICAgICAgICAgICAgICAgPC9zcGFuPg0KICAg
ICAgICAgICAgICA8L3NwYW4+DQogICAgICAgICAgICApDQogICAgICAgICAgPC9kaXY+DQoNCiAg
ICAgICAgPC9lbT4NCiAgICA8L2R0Pg0KICAgIDxkZCBjbGFzcz0idG9kbyIganNkaXNwbGF5PSIh
JHRoaXMuZGVzY3JpcHRpb24iPg0KICAgICAgVW5kb2N1bWVudGVkLg0KICAgIDwvZGQ+DQogICAg
PGRkIGpzZGlzcGxheT0iJHRoaXMuZGVzY3JpcHRpb24iDQogICAgICAgIGpzdmFsdWVzPSIuaW5u
ZXJIVE1MOiR0aGlzLmRlc2NyaXB0aW9uIj4NCiAgICAgIERlc2NyaXB0aW9uIG9mIHRoaXMgcGFy
YW1ldGVyIGZyb20gdGhlIGpzb24gc2NoZW1hLg0KICAgIDwvZGQ+DQoNCiAgICA8IS0tIE9CSkVD
VCBQUk9QRVJUSUVTIC0tPg0KICAgIDxkZCBqc2Rpc3BsYXk9InNob3VsZEV4cGFuZE9iamVjdCgk
dGhpcykiPg0KICAgICAgPGRsPg0KICAgICAgICA8ZGl2IGpzc2VsZWN0PSJnZXRQcm9wZXJ0eUxp
c3RGcm9tT2JqZWN0KCR0aGlzKSI+DQogICAgICAgICAgPGRpdiB0cmFuc2NsdWRlPSJ2YWx1ZVRl
bXBsYXRlIj4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgICA8L2RsPg0K
ICAgIDwvZGQ+DQogIDwvZGl2PiA8IS0tIC9WQUxVRSAtLT4NCg0KPC9kaXY+IDwhLS0gL1NVQlRF
TVBMQVRFUyAtLT4NCg0KPGgxPldlYkluc3BlY3RvciBFeHRlbnNpb24gQVBJPC9oMT4NCg0KICAg
ICAgPCEtLSBBUEkgUEFHRSAtLT4NCiAgICAgIDxkaXYgY2xhc3M9ImFwaVBhZ2UiIGpzc2VsZWN0
PSIkdGhpcyIganN2YWx1ZXM9IiRtb2R1bGU6JHRoaXM7JG1vZG5hbWU6JHRoaXMubmFtZXNwYWNl
Ij4NCiAgICAgIDxhIGpzdmFsdWVzPSIubmFtZTonYXBpUmVmZXJlbmNlLScgKyAkbW9kbmFtZSI+
PC9hPg0KICAgICAgPGgyIGpzY29udGVudD0iJ01vZHVsZTogJyArICRtb2RuYW1lIj48L2gyPg0K
DQogICAgICAgIDwhLS0gUFJPUEVSVElFUyAtLT4NCiAgICAgICAgPGRpdiBqc2Rpc3BsYXk9IiR0
aGlzLnByb3BlcnRpZXMiIGNsYXNzPSJhcGlHcm91cCI+DQogICAgICAgICAgPGEganN2YWx1ZXM9
Ii5uYW1lOidwcm9wZXJ0aWVzLScgKyAkbW9kbmFtZSI+PC9hPg0KICAgICAgICAgIDxoMyBpZD0i
cHJvcGVydGllcyI+UHJvcGVydGllczwvaDM+DQoNCiAgICAgICAgICA8ZGl2IGpzc2VsZWN0PSJn
ZXRQcm9wZXJ0eUxpc3RGcm9tT2JqZWN0KCR0aGlzKSI+DQogICAgICAgICAgICA8YSBqc3ZhbHVl
cz0iLm5hbWU6J3Byb3BlcnR5LScgKyBuYW1lIj48L2E+DQogICAgICAgICAgICA8aDQganNjb250
ZW50PSJuYW1lIj5nZXRMYXN0RXJyb3I8L2g0Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3Vt
bWFyeSI+DQogICAgICAgICAgICAgIDwhLS0gTm90ZTogaW50ZW50aW9uYWxseSBsb25nZXIgODAg
Y29sdW1ucyAtLT4NCiAgICAgICAgICAgICAgPHNwYW4ganNjb250ZW50PSIkbW9kbmFtZSArICcu
JyI+PC9zcGFuPjxzcGFuIGpzY29udGVudD0iJHRoaXMubmFtZSI+PC9zcGFuPg0KICAgICAgICAg
ICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IHRyYW5zY2x1ZGU9InZhbHVlVGVtcGxhdGUiPg0K
ICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgPC9kaXY+IDwh
LS0gL2FwaUdyb3VwIC0tPg0KDQogICAgICAgIDwhLS0gTUVUSE9EUyAtLT4NCiAgICAgICAgPGRp
diBqc2Rpc3BsYXk9ImZ1bmN0aW9ucyAmJiBmdW5jdGlvbnMubGVuZ3RoID4gMCIgY2xhc3M9ImFw
aUdyb3VwIiBpZD0ibWV0aG9kcyI+DQogICAgICAgICAgPGEganN2YWx1ZXM9Ii5uYW1lOidtb2Ru
YW1lLScgKyAkbW9kbmFtZSI+PC9hPg0KICAgICAgICAgIDxoMz5NZXRob2RzPC9oMz4NCg0KICAg
ICAgICAgIDwhLS0gaXRlcmF0ZXMgb3ZlciBhbGwgZnVuY3Rpb25zIC0tPg0KICAgICAgICAgIDxk
aXYgY2xhc3M9ImFwaUl0ZW0iIGpzc2VsZWN0PSJmdW5jdGlvbnMuc29ydChzb3J0QnlOYW1lKSIN
CiAgICAgICAgICAgICAgIGpzZGlzcGxheT0iISgkdGhpcy5ub2RvYykiPg0KICAgICAgICAgICAg
PGEganN2YWx1ZXM9Ii5uYW1lOidtZXRob2QtJyArICRtb2RtYW5lICsgJy0nICsgbmFtZSI+PC9h
PiA8IS0tIG1ldGhvZC1hbmNob3IgLS0+DQogICAgICAgICAgICA8aDQganNjb250ZW50PSJuYW1l
Ij5tZXRob2QgbmFtZTwvaDQ+DQoNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnkiPjxz
cGFuIGpzZGlzcGxheT0icmV0dXJucyIganNjb250ZW50PSJnZXRUeXBlTmFtZShyZXR1cm5zKSI+
dm9pZDwvc3Bhbj4NCiAgICAgICAgICAgICAgICA8IS0tIE5vdGU6IGludGVudGlvbmFsbHkgbG9u
Z2VyIDgwIGNvbHVtbnMgLS0+DQogICAgICAgICAgICAgICAgPHNwYW4ganNjb250ZW50PSJnZXRG
dWxseVF1YWxpZmllZEZ1bmN0aW9uTmFtZSgkbW9kbmFtZSwgJHRoaXMpIj48L3NwYW4+KDxzcGFu
IGpzc2VsZWN0PSJwYXJhbWV0ZXJzIiBqc3ZhbHVlcz0iY2xhc3M6b3B0aW9uYWwgPyAnb3B0aW9u
YWwnIDogJyciPjxzcGFuIGpzZGlzcGxheT0iJGluZGV4Ij4sIDwvc3Bhbj48c3BhbiBqc2NvbnRl
bnQ9ImdldFR5cGVOYW1lKCR0aGlzKSI+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICA8dmFy
PjxzcGFuIGpzY29udGVudD0iJHRoaXMubmFtZSI+PC9zcGFuPjwvdmFyPjwvc3Bhbj4pPC9kaXY+
DQoNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uIj4NCiAgICAgICAgICAgICAg
PHAgY2xhc3M9InRvZG8iIGpzZGlzcGxheT0iIWRlc2NyaXB0aW9uIj5VbmRvY3VtZW50ZWQuPC9w
Pg0KICAgICAgICAgICAgICA8cCBqc2Rpc3BsYXk9ImRlc2NyaXB0aW9uIiBqc3ZhbHVlcz0iLmlu
bmVySFRNTDpkZXNjcmlwdGlvbiI+DQogICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiBmcm9t
IHRoZSBqc29uIHNjaGVtYSBkZWYgb2YgdGhlIGZ1bmN0aW9uIGdvZXMgaGVyZS4NCiAgICAgICAg
ICAgICAgPC9wPg0KDQogICAgICAgICAgICAgIDwhLS0gUEFSQU1FVEVSUyAtLT4NCiAgICAgICAg
ICAgICAgPGg0IGpzZGlzcGxheT0iJHRoaXMucGFyYW1ldGVycyAmJiAkdGhpcy5wYXJhbWV0ZXJz
Lmxlbmd0aCA+IDAiPlBhcmFtZXRlcnM8L2g0Pg0KICAgICAgICAgICAgICA8ZGw+DQogICAgICAg
ICAgICAgICAgPGRpdiBqc3NlbGVjdD0iJHRoaXMucGFyYW1ldGVycyI+DQogICAgICAgICAgICAg
ICAgICA8ZGl2IHRyYW5zY2x1ZGU9InZhbHVlVGVtcGxhdGUiPg0KICAgICAgICAgICAgICAgICAg
PC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgIDwvZGw+DQoNCiAg
ICAgICAgICAgICAgPCEtLSBSRVRVUk5TIC0tPg0KICAgICAgICAgICAgICA8aDQganNkaXNwbGF5
PSJyZXR1cm5zIj5SZXR1cm5zPC9oND4NCiAgICAgICAgICAgICAgPGRsPg0KICAgICAgICAgICAg
ICAgIDxkaXYganNzZWxlY3Q9InJldHVybnMiPg0KICAgICAgICAgICAgICAgICAgPGRpdiB0cmFu
c2NsdWRlPSJ2YWx1ZVRlbXBsYXRlIj4NCiAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAg
ICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICA8L2RsPg0KDQogICAgICAgICAgICAgIDwh
LS0gQ0FMTEJBQ0sgLS0+DQogICAgICAgICAgICAgIDxkaXYganNkaXNwbGF5PSJoYXNDYWxsYmFj
ayhwYXJhbWV0ZXJzKSI+DQogICAgICAgICAgICAgICAgPGRpdiBqc3NlbGVjdD0iZ2V0Q2FsbGJh
Y2tQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpIj4NCiAgICAgICAgICAgICAgICA8aDQ+Q2FsbGJhY2sg
ZnVuY3Rpb248L2g0Pg0KICAgICAgICAgICAgICAgIDxwIGpzZGlzcGxheT0iISR0aGlzLm9wdGlv
bmFsIj4NCiAgICAgICAgICAgICAgICAgIFRoZSBjYWxsYmFjayA8ZW0+cGFyYW1ldGVyPC9lbT4g
c2hvdWxkIHNwZWNpZnkgYSBmdW5jdGlvbg0KICAgICAgICAgICAgICAgICAgdGhhdCBsb29rcyBs
aWtlIHRoaXM6DQogICAgICAgICAgICAgICAgPC9wPg0KICAgICAgICAgICAgICAgIDxwIGpzZGlz
cGxheT0iJHRoaXMub3B0aW9uYWwiPg0KICAgICAgICAgICAgICAgICAgSWYgeW91IHNwZWNpZnkg
dGhlIDxlbT5jYWxsYmFjazwvZW0+IHBhcmFtZXRlciwgaXQgc2hvdWxkDQogICAgICAgICAgICAg
ICAgICBzcGVjaWZ5IGEgZnVuY3Rpb24gdGhhdCBsb29rcyBsaWtlIHRoaXM6DQogICAgICAgICAg
ICAgICAgPC9wPg0KDQogICAgICAgICAgICAgICAgPCEtLSBOb3RlOiBpbnRlbnRpb25hbGx5IGxv
bmdlciA4MCBjb2x1bW5zIC0tPg0KICAgICAgICAgICAgICAgIDxwcmU+ZnVuY3Rpb24oPHNwYW4g
anNjb250ZW50PSJnZXRTaWduYXR1cmVTdHJpbmcocGFyYW1ldGVycykiPlR5cGUgcGFyYW0xLCBU
eXBlIHBhcmFtMjwvc3Bhbj4pIDxzcGFuIGNsYXNzPSJzdWJkdWVkIj57Li4ufTwvc3Bhbj4pOzwv
cHJlPg0KICAgICAgICAgICAgICAgIDxkbD4NCiAgICAgICAgICAgICAgICAgIDxkaXYganNzZWxl
Y3Q9InBhcmFtZXRlcnMiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRyYW5zY2x1ZGU9InZh
bHVlVGVtcGxhdGUiPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAg
ICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGw+DQogICAgICAgICAgICAgICAgPC9kaXY+
DQogICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICA8L2Rpdj4gPCEtLSAvZGVzY3Jp
cHRpb24gLS0+DQoNCiAgICAgICAgICA8L2Rpdj4gIDwhLS0gL2FwaUl0ZW0gLS0+DQoNCiAgICAg
ICAgPC9kaXY+ICA8IS0tIC9hcGlHcm91cCAtLT4NCg0KICAgICAgICA8IS0tIEVWRU5UUyAtLT4N
CiAgICAgICAgPGRpdiBqc2Rpc3BsYXk9IiRtb2R1bGUuZXZlbnRzICYmICRtb2R1bGUuZXZlbnRz
Lmxlbmd0aCA+IDAiIGNsYXNzPSJhcGlHcm91cCI+DQogICAgICAgICAgPGEganN2YWx1ZXM9Ii5u
YW1lOidldmVudHMtJyArICRtb2RuYW1lIj48L2E+DQogICAgICAgICAgPGgzIGlkPSJldmVudHMi
PkV2ZW50czwvaDM+DQoNCiAgICAgICAgICA8IS0tIGl0ZXJhdGVzIG92ZXIgYWxsIGV2ZW50cyAt
LT4NCiAgICAgICAgICA8ZGl2IGpzc2VsZWN0PSIkbW9kdWxlLmV2ZW50cy5zb3J0KHNvcnRCeU5h
bWUpIiBjbGFzcz0iYXBpSXRlbSINCiAgICAgICAgICAgICAgIGpzZGlzcGxheT0iISgkdGhpcy5u
b2RvYykiPg0KICAgICAgICAgICAgPGEganN2YWx1ZXM9Ii5uYW1lOidldmVudC0nICsgJG1vZG5h
bWUgKyAnLScgKyBuYW1lIj48L2E+DQogICAgICAgICAgICA8aDQganNjb250ZW50PSJuYW1lIj5l
dmVudCBuYW1lPC9oND4NCg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VtbWFyeSI+DQogICAg
ICAgICAgICAgIDwhLS0gTm90ZTogaW50ZW50aW9uYWxseSBsb25nZXIgODAgY29sdW1ucyAtLT4N
CiAgICAgICAgICAgICAgPHNwYW4ganNjb250ZW50PSIkbW9kbmFtZSArICcuJyIgY2xhc3M9InN1
YmR1ZWQiPjwvc3Bhbj48c3BhbiBqc2NvbnRlbnQ9Im5hbWUiPjwvc3Bhbj48c3BhbiBjbGFzcz0i
c3ViZHVlZCI+LmFkZExpc3RlbmVyPC9zcGFuPihmdW5jdGlvbig8c3BhbiBqc2NvbnRlbnQ9Imdl
dFNpZ25hdHVyZVN0cmluZygkdGhpcy5wYXJhbWV0ZXJzKSI+VHlwZSBwYXJhbTEsIFR5cGUgcGFy
YW0yPC9zcGFuPikgPHNwYW4gY2xhc3M9InN1YmR1ZWQiPnsuLi59PC9zcGFuPik7DQogICAgICAg
ICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVzY3JpcHRpb24iPg0KICAg
ICAgICAgICAgICA8cCBjbGFzcz0idG9kbyIganNkaXNwbGF5PSIhZGVzY3JpcHRpb24iPlVuZG9j
dW1lbnRlZC48L3A+DQogICAgICAgICAgICAgIDxwIGpzZGlzcGxheT0iZGVzY3JpcHRpb24iIGpz
dmFsdWVzPSIuaW5uZXJIVE1MOmRlc2NyaXB0aW9uIj4NCiAgICAgICAgICAgICAgICBBIGRlc2Ny
aXB0aW9uIGZyb20gdGhlIGpzb24gc2NoZW1hIGRlZiBvZiB0aGUgZXZlbnQgZ29lcyBoZXJlLg0K
ICAgICAgICAgICAgICA8L3A+DQoNCiAgICAgICAgICAgICAgPCEtLSBQQVJBTUVURVJTIC0tPg0K
ICAgICAgICAgICAgICA8aDQganNkaXNwbGF5PSJwYXJhbWV0ZXJzIj5QYXJhbWV0ZXJzPC9oND4N
CiAgICAgICAgICAgICAgPGRsPg0KICAgICAgICAgICAgICAgIDxkaXYganNzZWxlY3Q9InBhcmFt
ZXRlcnMiPg0KICAgICAgICAgICAgICAgICAgPGRpdiB0cmFuc2NsdWRlPSJ2YWx1ZVRlbXBsYXRl
Ij4NCiAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAg
ICAgICAgICAgICA8L2RsPg0KDQogICAgICAgICAgICA8L2Rpdj4gPCEtLSAvZGVjcmlwdGlvbiAt
LT4NCg0KICAgICAgICAgIDwvZGl2PiA8IS0tIC9hcGlJdGVtIC0tPg0KDQogICAgICAgIDwvZGl2
PiA8IS0tIC9hcGlHcm91cCAtLT4NCg0KICAgICAgICA8IS0tIFRZUEVTIC0tPg0KICAgICAgICA8
ZGl2IGpzZGlzcGxheT0iJG1vZHVsZS50eXBlcyAmJiAkbW9kdWxlLnR5cGVzLmxlbmd0aCA+IDAi
IGNsYXNzPSJhcGlHcm91cCI+DQogICAgICAgICAgPGEganN2YWx1ZXM9Ii5uYW1lOid0eXBlcy0n
ICsgJG1vZG5hbWUiPjwvYT4NCiAgICAgICAgICA8aDMgaWQ9InR5cGVzIj5UeXBlczwvaDM+DQoN
CiAgICAgICAgICA8IS0tIGl0ZXJhdGVzIG92ZXIgYWxsIHR5cGVzIC0tPg0KICAgICAgICAgIDxk
aXYganNzZWxlY3Q9IiRtb2R1bGUudHlwZXMiIGNsYXNzPSJhcGlJdGVtIj4NCiAgICAgICAgICAg
IDxhIGpzdmFsdWVzPSIubmFtZTondHlwZS0nICsgaWQiPjwvYT4NCiAgICAgICAgICAgIDxoNCBq
c2NvbnRlbnQ9ImlkIj50eXBlIG5hbWU8L2g0Pg0KDQogICAgICAgICAgICA8ZGl2IHRyYW5zY2x1
ZGU9InZhbHVlVGVtcGxhdGUiPg0KICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICA8L2Rp
dj4gPCEtLSAvYXBpSXRlbSAtLT4NCg0KICAgICAgICA8L2Rpdj4gPCEtLSAvYXBpR3JvdXAgLS0+
DQoNCiAgICAgIDwvZGl2PiA8IS0tIC9hcGlQYWdlIC0tPg0KDQo8L2JvZHk+DQoNCjwvaHRtbD4N
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>58377</attachid>
            <date>2010-06-10 09:17:40 -0700</date>
            <delta_ts>2010-06-10 09:17:40 -0700</delta_ts>
            <desc>A demo of extension in action</desc>
            <filename>inspector-extension-demo.swf</filename>
            <type>application/x-shockwave-flash</type>
            <size>0</size>
            <attacher name="Andrey Kosyakov">caseq</attacher>
            
              <data encoding="base64"></data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62567</attachid>
            <date>2010-07-26 06:52:56 -0700</date>
            <delta_ts>2010-07-26 07:12:34 -0700</delta_ts>
            <desc>patch</desc>
            <filename>extensions.patch</filename>
            <type>text/plain</type>
            <size>54865</size>
            <attacher name="Andrey Kosyakov">caseq</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDA0MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTA3IEBACisyMDEwLTA3LTI2ICBBbmRyZXkgS29zeWFrb3YgIDxjYXNlcUBjaHJv
bWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgV2ViIEluc3BlY3RvcjogYmFzaWMgc3VwcG9ydCBvZiBXZWJJbnNwZWN0b3IgZXh0ZW5zaW9u
cyBBUEkuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00
MDQyNQorICAgICAgICBUZXN0OiBpbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1sCisKKyAgICAgICAg
KiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2o6
CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6SW5zcGVjdG9yQ29udHJvbGxlcjo6aW5zcGVjdGVkV2luZG93U2NyaXB0T2JqZWN0
Q2xlYXJlZCk6CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JDb250cm9sbGVyOjpkaWRDb21t
aXRMb2FkKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckZyb250ZW5kSG9zdDo6c2V0RXh0ZW5zaW9uQVBJ
KToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0Lmg6CisgICAgICAg
ICogaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9zdC5pZGw6CisgICAgICAgICogaW5zcGVj
dG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkVs
ZW1lbnRzUGFuZWwudGhpcy50cmVlT3V0bGluZS5mb2N1c2VkTm9kZUNoYW5nZWQpOgorICAgICAg
ICAoV2ViSW5zcGVjdG9yLkVsZW1lbnRzUGFuZWwpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9u
dC1lbmQvRXh0ZW5zaW9uQVBJLmpzOiBBZGRlZC4KKyAgICAgICAgKGV4dGVuc2lvbkFQSSk6Cisg
ICAgICAgIChleHRlbnNpb25BUEkuRXZlbnRTaW5rLnByb3RvdHlwZS5hZGRMaXN0ZW5lcik6Cisg
ICAgICAgIChleHRlbnNpb25BUEkuRXZlbnRTaW5rLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcik6
CisgICAgICAgIChleHRlbnNpb25BUEkuRXZlbnRTaW5rLnByb3RvdHlwZS5fZmlyZSk6CisgICAg
ICAgIChleHRlbnNpb25BUEkuSW5zcGVjdG9yRXh0ZW5zaW9uQVBJKToKKyAgICAgICAgKGV4dGVu
c2lvbkFQSS5JbnNwZWN0b3JFeHRlbnNpb25BUEkucHJvdG90eXBlLmxvZyk6CisgICAgICAgIChl
eHRlbnNpb25BUEkuUmVzb3VyY2VzLnByb3RvdHlwZS5nZXRBbGwpOgorICAgICAgICAoZXh0ZW5z
aW9uQVBJLlJlc291cmNlcy5wcm90b3R5cGUuZ2V0IHJldHVybik6CisgICAgICAgIChleHRlbnNp
b25BUEkuUmVzb3VyY2VzLnByb3RvdHlwZSk6CisgICAgICAgIChleHRlbnNpb25BUEkuZ2V0IFBh
bmVscy5wcm90b3R5cGUuY3JlYXRlLmNhbGxiYWNrV3JhcHBlcik6CisgICAgICAgIChleHRlbnNp
b25BUEkuZ2V0IFBhbmVscy5wcm90b3R5cGUuY3JlYXRlKToKKyAgICAgICAgKGV4dGVuc2lvbkFQ
SS5QYW5lbC5wcm90b3R5cGUuY3JlYXRlU2lkZWJhclBhbmUuY2FsbGJhY2tXcmFwcGVyKToKKyAg
ICAgICAgKGV4dGVuc2lvbkFQSS5QYW5lbC5wcm90b3R5cGUuY3JlYXRlU2lkZWJhclBhbmUpOgor
ICAgICAgICAoZXh0ZW5zaW9uQVBJLkV4dGVuc2lvblNpZGViYXJQYW5lKToKKyAgICAgICAgKGV4
dGVuc2lvbkFQSS5FeHRlbnNpb25TaWRlYmFyUGFuZS5wcm90b3R5cGUuc2V0SGVpZ2h0KToKKyAg
ICAgICAgKGV4dGVuc2lvbkFQSS5FeHRlbnNpb25TaWRlYmFyUGFuZS5wcm90b3R5cGUuc2V0RXhw
YW5zaW9uKToKKyAgICAgICAgKGV4dGVuc2lvbkFQSS5JbnNwZWN0ZWRXaW5kb3cucHJvdG90eXBl
LnJlbG9hZCk6CisgICAgICAgIChleHRlbnNpb25BUEkuSW5zcGVjdGVkV2luZG93LnByb3RvdHlw
ZS5ldmFsdWF0ZSk6CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVyQ2xpZW50
LnByb3RvdHlwZS5zZW5kUmVxdWVzdCk6CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0ZW5zaW9u
U2VydmVyQ2xpZW50LnByb3RvdHlwZS5yZWdpc3RlckhhbmRsZXIpOgorICAgICAgICAoZXh0ZW5z
aW9uQVBJLkV4dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5cGUuZ2V0IG5leHRPYmplY3RJZCk6
CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZS5f
cmVnaXN0ZXJDYWxsYmFjayk6CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVy
Q2xpZW50LnByb3RvdHlwZS5fb25DYWxsYmFjayk6CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0
ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZS5fb25NZXNzYWdlKToKKyAgICAgICAgKGV4dGVu
c2lvbkFQSS5leHBhbmRVUkwpOgorICAgICAgICAoZXh0ZW5zaW9uQVBJLik6CisgICAgICAgICog
aW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25QYW5lbC5qczogQWRkZWQuCisgICAgICAgIChX
ZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVu
c2lvblBhbmVsLnByb3RvdHlwZS5nZXQgZGVmYXVsdEZvY3VzZWRFbGVtZW50KToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5wcm90b3R5cGUudXBkYXRlTWFpblZpZXdXaWR0
aCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlLnNlYXJj
aENhbmNlbGVkKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5wcm90b3R5
cGUucGVyZm9ybVNlYXJjaCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwu
cHJvdG90eXBlLmp1bXBUb05leHRTZWFyY2hSZXN1bHQpOgorICAgICAgICAoV2ViSW5zcGVjdG9y
LkV4dGVuc2lvblBhbmVsLnByb3RvdHlwZS5qdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdCk6Cisg
ICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlLl9hZGRTdHlsZVJ1
bGUpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0cnlTdHVi
LmpzOiBBZGRlZC4KKyAgICAgICAgKC5XZWJJbnNwZWN0b3IuSW5zcGVjdG9yRXh0ZW5zaW9uUmVn
aXN0cnlTdHViKToKKyAgICAgICAgKC5XZWJJbnNwZWN0b3IuSW5zcGVjdG9yRXh0ZW5zaW9uUmVn
aXN0cnlTdHViLnByb3RvdHlwZS5nZXRFeHRlbnNpb25zKToKKyAgICAgICAgKiBpbnNwZWN0b3Iv
ZnJvbnQtZW5kL0V4dGVuc2lvblNlcnZlci5qczogQWRkZWQuCisgICAgICAgIChXZWJJbnNwZWN0
b3IuRXh0ZW5zaW9uU2VydmVyKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2
ZXIucHJvdG90eXBlLm5vdGlmeVBhbmVsU2hvd24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4
dGVuc2lvblNlcnZlci5wcm90b3R5cGUubm90aWZ5T2JqZWN0U2VsZWN0ZWQpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUubm90aWZ5T2JqZWN0Q3JlYXRl
ZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5ub3Rp
ZnlTZWFyY2hBY3Rpb24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5w
cm90b3R5cGUucG9zdEV2ZW50KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2
ZXIucHJvdG90eXBlLmNvbnZlcnRSZXNvdXJjZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0
ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fcG9zdE5vdGlmaWNhdGlvbik6CisgICAgICAgIChXZWJJ
bnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25TdWJzY3JpYmUpOgorICAgICAg
ICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uVW5zdWJzY3JpYmUp
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uQ3Jl
YXRlUGFuZWwpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5
cGUuX29uQ3JlYXRlU2lkZWJhcik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2Vy
dmVyLnByb3RvdHlwZS5fY3JlYXRlQ2xpZW50SWZyYW1lKToKKyAgICAgICAgKFdlYkluc3BlY3Rv
ci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vblNldFNpZGViYXJIZWlnaHQpOgorICAgICAg
ICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uU2V0U2lkZWJhckV4
cGFuc2lvbik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlw
ZS5fb25Mb2cpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5
cGUuX29uRXZhbHVhdGVPbkluc3BlY3RlZFBhZ2UpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4
dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uUmV2ZWFsQW5kU2VsZWN0KToKKyAgICAgICAgKFdl
Ykluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vblJldmVhbEFuZFNlbGVjdFJl
c291cmNlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBl
Ll9kaXNwYXRjaENhbGxiYWNrKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2
ZXIucHJvdG90eXBlLl9vbkdldFJlc291cmNlcyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0
ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5pbml0RXh0ZW5zaW9ucyk6CisgICAgICAgIChXZWJJbnNw
ZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5hZGRFeHRlbnNpb25zKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9hZGRFeHRlbnNpb24pOgor
ICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uV2luZG93
TWVzc2FnZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlw
ZS5fb25tZXNzYWdlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJv
dG90eXBlLl9yZWdpc3RlckhhbmRsZXIpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lv
blNlcnZlci5wcm90b3R5cGUuX3N0YXR1cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5z
aW9uU3RhdHVzKToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVkU2NyaXB0
LmpzOgorICAgICAgICAoaW5qZWN0ZWRTY3JpcHRDb25zdHJ1Y3Rvcik6CisgICAgICAgICogaW5z
cGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdEFjY2Vzcy5qczoKKyAgICAgICAgKiBpbnNw
ZWN0b3IvZnJvbnQtZW5kL0luc3BlY3RvckZyb250ZW5kSG9zdFN0dWIuanM6CisgICAgICAgICgu
V2ViSW5zcGVjdG9yLkluc3BlY3RvckZyb250ZW5kSG9zdFN0dWIucHJvdG90eXBlLnNldEV4dGVu
c2lvbkFQSSk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbDoK
KyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5qczoKKyAgICAgICAgKFdl
Ykluc3BlY3Rvci5sb2FkZWQpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLnVwZGF0ZVJlc291cmNl
KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5wYXJzZWRTY3JpcHRTb3VyY2UpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLnJlc2V0KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5pbnNwZWN0ZWRVUkxD
aGFuZ2VkKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5kaWRDb21taXRMb2FkKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5hZGRFeHRlbnNpb25zKToKKwogMjAxMC0wNy0yNiAgU2F0aXNoIFNhbXBh
dGggIDxzYXRpc2hAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFN0ZXZlIEJs
b2NrLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9X
ZWJDb3JlLmd5cGkJKHJldmlzaW9uIDY0MDM0KQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdv
cmtpbmcgY29weSkKQEAgLTQwMTgsNiArNDAxOCwxMCBAQAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9mcm9udC1lbmQvRWxlbWVudHNQYW5lbC5qcycsCiAgICAgICAgICAgICAnaW5zcGVjdG9yL2Zy
b250LWVuZC9FbGVtZW50c1RyZWVPdXRsaW5lLmpzJywKICAgICAgICAgICAgICdpbnNwZWN0b3Iv
ZnJvbnQtZW5kL0V2ZW50TGlzdGVuZXJzU2lkZWJhclBhbmUuanMnLAorICAgICAgICAgICAgJ2lu
c3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uQVBJLmpzJywKKyAgICAgICAgICAgICdpbnNwZWN0
b3IvZnJvbnQtZW5kL0V4dGVuc2lvblBhbmVsLmpzJywKKyAgICAgICAgICAgICdpbnNwZWN0b3Iv
ZnJvbnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5qcycsCisgICAgICAgICAgICAnaW5zcGVj
dG9yL2Zyb250LWVuZC9FeHRlbnNpb25TZXJ2ZXIuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9mcm9udC1lbmQvRm9udFZpZXcuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1l
bmQvSEFSRW50cnkuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQvSGVscFNj
cmVlbi5qcycsCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlz
aW9uIDY0MDM0KQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29y
a2luZyBjb3B5KQpAQCAtNTA3MTIsNiArNTA3MTIsMjIgQEAKIAkJCQkJPg0KIAkJCQk8L0ZpbGU+
DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRc
RXh0ZW5zaW9uQVBJLmpzIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQorCQkJ
CQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRcRXh0ZW5zaW9uUGFuZWwuanMi
DQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0i
Li5caW5zcGVjdG9yXGZyb250LWVuZFxFeHRlbnNpb25SZWdpc3RyeVN0dWIuanMiDQorCQkJCQk+
DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVj
dG9yXGZyb250LWVuZFxFeHRlbnNpb25TZXJ2ZXIuanMiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4N
CisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVuZFxG
b250Vmlldy5qcyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KSW5kZXg6IFdlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiA2NDAzNCkKKysrIFdlYkNvcmUv
aW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NTgs
NiArNDU4LDE0IEBAIHZvaWQgSW5zcGVjdG9yQ29udHJvbGxlcjo6aW5zcGVjdGVkV2luZG8KICAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENsaWVudCAmJiBmcmFtZSA9PSBtX2luc3BlY3RlZFBh
Z2UtPm1haW5GcmFtZSgpKQogICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2xpZW50LT53aW5k
b3dPYmplY3RDbGVhcmVkKCk7CiAKKyAgICBpZiAobV9zY3JpcHRzVG9FdmFsdWF0ZU9uTG9hZC5z
aXplKCkpIHsKKyAgICAgICAgU2NyaXB0U3RhdGUqIHNjcmlwdFN0YXRlID0gbWFpbldvcmxkU2Ny
aXB0U3RhdGUoZnJhbWUpOworICAgICAgICBmb3IgKFZlY3RvcjxTdHJpbmc+OjppdGVyYXRvciBp
dCA9IG1fc2NyaXB0c1RvRXZhbHVhdGVPbkxvYWQuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAh
PSBtX3NjcmlwdHNUb0V2YWx1YXRlT25Mb2FkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBt
X2luamVjdGVkU2NyaXB0SG9zdC0+aW5qZWN0U2NyaXB0KCppdCwgc2NyaXB0U3RhdGUpOworICAg
ICAgICB9CisgICAgfQorCiAgICAgaWYgKCFlbmFibGVkKCkgfHwgIW1fZnJvbnRlbmQgfHwgZnJh
bWUgIT0gbV9pbnNwZWN0ZWRQYWdlLT5tYWluRnJhbWUoKSkKICAgICAgICAgcmV0dXJuOwogICAg
IG1faW5qZWN0ZWRTY3JpcHRIb3N0LT5kaXNjYXJkSW5qZWN0ZWRTY3JpcHRzKCk7CkBAIC04MDIs
MTQgKzgxMCw2IEBAIHZvaWQgSW5zcGVjdG9yQ29udHJvbGxlcjo6ZGlkQ29tbWl0TG9hZCgKICAg
ICBmb3IgKEZyYW1lKiBmcmFtZSA9IGxvYWRlci0+ZnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJh
bWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KGxvYWRlci0+ZnJhbWUoKSkpCiAgICAgICAgIGlmIChS
ZXNvdXJjZXNNYXAqIHJlc291cmNlTWFwID0gbV9mcmFtZVJlc291cmNlcy5nZXQoZnJhbWUpKQog
ICAgICAgICAgICAgcHJ1bmVSZXNvdXJjZXMocmVzb3VyY2VNYXAsIGxvYWRlcik7Ci0KLSAgICBp
ZiAobV9zY3JpcHRzVG9FdmFsdWF0ZU9uTG9hZC5zaXplKCkpIHsKLSAgICAgICAgU2NyaXB0U3Rh
dGUqIHNjcmlwdFN0YXRlID0gbWFpbldvcmxkU2NyaXB0U3RhdGUobG9hZGVyLT5mcmFtZSgpKTsK
LSAgICAgICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBtX3NjcmlwdHNUb0V2
YWx1YXRlT25Mb2FkLmJlZ2luKCk7Ci0gICAgICAgICAgICAgaXQgIT0gbV9zY3JpcHRzVG9FdmFs
dWF0ZU9uTG9hZC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgbV9pbmplY3RlZFNjcmlwdEhv
c3QtPmluamVjdFNjcmlwdCgqaXQsIHNjcmlwdFN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KIH0K
IAogdm9pZCBJbnNwZWN0b3JDb250cm9sbGVyOjpmcmFtZURldGFjaGVkRnJvbVBhcmVudChGcmFt
ZSogZnJhbWUpCkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3Qu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9z
dC5jcHAJKHJldmlzaW9uIDY0MDM0KQorKysgV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJv
bnRlbmRIb3N0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTkyLDYgKzE5MiwxNCBAQCB2b2lkIElu
c3BlY3RvckZyb250ZW5kSG9zdDo6bW92ZVdpbmRvd0J5CiAgICAgICAgIG1fY2xpZW50LT5tb3Zl
V2luZG93QnkoeCwgeSk7CiB9CiAKK3ZvaWQgSW5zcGVjdG9yRnJvbnRlbmRIb3N0OjpzZXRFeHRl
bnNpb25BUEkoY29uc3QgU3RyaW5nJiBzY3JpcHQpCit7CisgICAgSW5zcGVjdG9yQ29udHJvbGxl
ciogaW5zcGVjdG9yID0gbV9mcm9udGVuZFBhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKTsKKwor
ICAgIGluc3BlY3Rvci0+cmVtb3ZlQWxsU2NyaXB0c1RvRXZhbHVhdGVPbkxvYWQoKTsKKyAgICBp
bnNwZWN0b3ItPmFkZFNjcmlwdFRvRXZhbHVhdGVPbkxvYWQoc2NyaXB0KTsKK30KKwogU3RyaW5n
IEluc3BlY3RvckZyb250ZW5kSG9zdDo6bG9jYWxpemVkU3RyaW5nc1VSTCgpCiB7CiAgICAgcmV0
dXJuIG1fY2xpZW50LT5sb2NhbGl6ZWRTdHJpbmdzVVJMKCk7CkluZGV4OiBXZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAkocmV2aXNpb24gNjQwMzQpCisrKyBXZWJDb3Jl
L2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAkod29ya2luZyBjb3B5KQpAQCAtNjcs
NiArNjcsNyBAQCBwdWJsaWM6CiAKICAgICB2b2lkIHNldEF0dGFjaGVkV2luZG93SGVpZ2h0KHVu
c2lnbmVkIGhlaWdodCk7CiAgICAgdm9pZCBtb3ZlV2luZG93QnkoZmxvYXQgeCwgZmxvYXQgeSkg
Y29uc3Q7CisgICAgdm9pZCBzZXRFeHRlbnNpb25BUEkoY29uc3QgU3RyaW5nJiBzY3JpcHQpOwog
CiAgICAgU3RyaW5nIGxvY2FsaXplZFN0cmluZ3NVUkwoKTsKICAgICBTdHJpbmcgaGlkZGVuUGFu
ZWxzKCk7CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaWRs
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9zdC5p
ZGwJKHJldmlzaW9uIDY0MDM0KQorKysgV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRl
bmRIb3N0LmlkbAkod29ya2luZyBjb3B5KQpAQCAtNDEsNiArNDEsNyBAQCBtb2R1bGUgY29yZSB7
CiAgICAgICAgIHZvaWQgcmVxdWVzdERldGFjaFdpbmRvdygpOwogICAgICAgICB2b2lkIHNldEF0
dGFjaGVkV2luZG93SGVpZ2h0KGluIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KTsKICAgICAgICAgdm9p
ZCBtb3ZlV2luZG93QnkoaW4gZmxvYXQgeCwgaW4gZmxvYXQgeSk7CisgICAgICAgIHZvaWQgc2V0
RXh0ZW5zaW9uQVBJKGluIERPTVN0cmluZyBzY3JpcHQpOwogCiAgICAgICAgIERPTVN0cmluZyBs
b2NhbGl6ZWRTdHJpbmdzVVJMKCk7CiAgICAgICAgIERPTVN0cmluZyBoaWRkZW5QYW5lbHMoKTsK
SW5kZXg6IFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzCShy
ZXZpc2lvbiA2NDAzNCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1Bh
bmVsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC01Niw4ICs1NiwxMCBAQCBXZWJJbnNwZWN0b3IuRWxl
bWVudHNQYW5lbCA9IGZ1bmN0aW9uKCkKICAgICAgICAgdGhpcy5wYW5lbC51cGRhdGVQcm9wZXJ0
aWVzKCk7CiAgICAgICAgIHRoaXMucGFuZWwudXBkYXRlRXZlbnRMaXN0ZW5lcnMoKTsKIAotICAg
ICAgICBpZiAodGhpcy5fZm9jdXNlZERPTU5vZGUpCisgICAgICAgIGlmICh0aGlzLl9mb2N1c2Vk
RE9NTm9kZSkgewogICAgICAgICAgICAgSW5zcGVjdG9yQmFja2VuZC5hZGRJbnNwZWN0ZWROb2Rl
KHRoaXMuX2ZvY3VzZWRET01Ob2RlLmlkKTsKKyAgICAgICAgICAgIFdlYkluc3BlY3Rvci5leHRl
bnNpb25TZXJ2ZXIubm90aWZ5T2JqZWN0U2VsZWN0ZWQoImVsZW1lbnRzIiwgIkRPTU5vZGUiKTsK
KyAgICAgICAgfQogICAgIH07CiAKICAgICB0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxk
KHRoaXMudHJlZU91dGxpbmUuZWxlbWVudCk7CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9mcm9u
dC1lbmQvRXh0ZW5zaW9uQVBJLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zy
b250LWVuZC9FeHRlbnNpb25BUEkuanMJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvRXh0ZW5zaW9uQVBJLmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI5OSBA
QAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4NCisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisgKiBtZXQ6DQor
ICoNCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cg0KKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUNCisgKiBkaXN0cmlidXRpb24uDQorICogICAgICogTmVpdGhlciB0aGUgbmFt
ZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKyAqIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQor
ICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4NCisgKg0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMNCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0K
KyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUDQorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLA0KKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UNCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqLw0KKw0KK3ZhciBleHRlbnNpb25BUEkgPSBmdW5jdGlv
bihJbmplY3RlZFNjcmlwdEhvc3QsIGluc3BlY3RlZFdpbmRvdywgaW5qZWN0ZWRTY3JpcHRJZCkN
Cit7DQorDQorZnVuY3Rpb24gRXZlbnRTaW5rKHR5cGUpDQorew0KKyAgICB0aGlzLl90eXBlID0g
dHlwZTsNCisgICAgdGhpcy5fbGlzdGVuZXJzID0gW107DQorfQ0KKw0KK0V2ZW50U2luay5wcm90
b3R5cGUgPSB7DQorICAgIGFkZExpc3RlbmVyOiBmdW5jdGlvbihjYWxsYmFjaykNCisgICAgew0K
KyAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPT09IDApDQorICAgICAgICAgICAg
ZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogInN1YnNjcmliZSIsIHR5cGU6
IHRoaXMuX3R5cGUgfSk7DQorICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChjYWxsYmFjayk7
DQorICAgICAgICBleHRlbnNpb25TZXJ2ZXIucmVnaXN0ZXJIYW5kbGVyKCJub3RpZnktIiArIHRo
aXMuX3R5cGUsIGJpbmQodGhpcy5fZmlyZSwgdGhpcykpOw0KKyAgICB9LA0KKw0KKyAgICByZW1v
dmVMaXN0ZW5lcjogZnVuY3Rpb24oY2FsbGJhY2spDQorICAgIHsNCisgICAgICAgIHZhciBsaXN0
ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7DQorDQorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgew0KKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0g
PT09IGNhbGxiYWNrKSB7DQorICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tpXSA9IGxpc3RlbmVy
c1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV07DQorICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wb3Ao
KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0K
KyAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPT09IDApDQorICAgICAgICAgICAg
ZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogInVuc3Vic2NyaWJlIiwgdHlw
ZTogdGhpcy5fdHlwZSB9KTsNCisgICAgfSwNCisNCisgICAgX2ZpcmU6IGZ1bmN0aW9uKHJlcXVl
c3QpDQorICAgIHsNCisgICAgICAgIGZvciAobGlzdGVuZXIgaW4gdGhpcy5fbGlzdGVuZXJzKQ0K
KyAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1tsaXN0ZW5lcl0uYXBwbHkobnVsbCwgcmVxdWVz
dC5hcmd1bWVudHMpOw0KKyAgICB9DQorfTsNCisNCitmdW5jdGlvbiBJbnNwZWN0b3JFeHRlbnNp
b25BUEkoKQ0KK3sNCisgICAgdGhpcy5pbnNwZWN0ZWRXaW5kb3cgPSBuZXcgSW5zcGVjdGVkV2lu
ZG93KCk7DQorICAgIHRoaXMucGFuZWxzID0gbmV3IFBhbmVscygpOw0KKyAgICB0aGlzLnJlc291
cmNlcyA9IG5ldyBSZXNvdXJjZXMoKTsNCisgICAgdGhpcy5vblJlc2V0ID0gbmV3IEV2ZW50U2lu
aygicmVzZXQiKTsNCit9DQorDQorSW5zcGVjdG9yRXh0ZW5zaW9uQVBJLnByb3RvdHlwZSA9IHsN
CisgICAgbG9nOiBmdW5jdGlvbihtZXNzYWdlKQ0KKyAgICB7DQorICAgICAgICBleHRlbnNpb25T
ZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21tYW5kOiAibG9nIiwgbWVzc2FnZTogbWVzc2FnZSB9KTsN
CisgICAgfQ0KK307DQorDQorZnVuY3Rpb24gUmVzb3VyY2VzKCkNCit7DQorICAgIHRoaXMub25D
cmVhdGVkID0gbmV3IEV2ZW50U2luaygiY3JlYXRlZC1yZXNvdXJjZSIpOw0KK30NCisNCitSZXNv
dXJjZXMucHJvdG90eXBlID0gew0KKyAgICBnZXRBbGw6IGZ1bmN0aW9uKGNhbGxiYWNrKQ0KKyAg
ICB7DQorICAgICAgICByZXR1cm4gZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFu
ZDogImdldFJlc291cmNlcyIgfSwgY2FsbGJhY2spOw0KKyAgICB9LA0KKw0KKyAgICBnZXQ6IGZ1
bmN0aW9uKGlkLCBjYWxsYmFjaykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvblNl
cnZlci5zZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJnZXRSZXNvdXJjZXMiLCBpZDogaWQgfSwgY2Fs
bGJhY2spOw0KKyAgICB9DQorfTsNCisNCit2YXIgd2VsbEtub3duUGFuZWxOYW1lcyA9IFsNCisg
ICAgImVsZW1lbnRzIiwNCisgICAgInJlc291cmNlcyIsDQorICAgICJzY3JpcHRzIiwNCisgICAg
InRpbWVsaW5lIiwNCisgICAgInByb2ZpbGVzIiwNCisgICAgInN0b3JhZ2UiLA0KKyAgICAiYXVk
aXRzIiwNCisgICAgImNvbnNvbGUiDQorXTsNCisNCitmdW5jdGlvbiBQYW5lbHMoKQ0KK3sNCisg
ICAgdGhpcy5fcGFuZWxzID0gW107DQorICAgIHZhciB0aGF0ID0gdGhpczsNCisgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCB3ZWxsS25vd25QYW5lbE5hbWVzLmxlbmd0aDsgKytpKQ0KKyAgICAgICAg
dGhpcy5fX2RlZmluZUdldHRlcl9fKHdlbGxLbm93blBhbmVsTmFtZXNbaV0sIGJpbmQodGhpcy5n
ZXQsIHRoaXMsIHdlbGxLbm93blBhbmVsTmFtZXNbaV0pKTsNCit9DQorDQorUGFuZWxzLnByb3Rv
dHlwZSA9IHsNCisgICAgZ2V0OiBmdW5jdGlvbihpZCkNCisgICAgew0KKyAgICAgICAgaWYgKHRo
aXMuX3BhbmVsc1tpZF0pDQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhbmVsc1tpZF07DQor
DQorICAgICAgICB2YXIgcGFuZWwgPSBuZXcgUGFuZWwoaWQpOw0KKyAgICAgICAgdGhpcy5fcGFu
ZWxzW2lkXSA9IHBhbmVsOw0KKyAgICAgICAgcmV0dXJuIHBhbmVsOw0KKyAgICB9LA0KKw0KKyAg
ICBjcmVhdGU6IGZ1bmN0aW9uKGxhYmVsLCBwYWdlVVJMLCBpY29uVVJMLCBjYWxsYmFjaykNCisg
ICAgew0KKyAgICAgICAgdmFyIGlkID0gImV4dGVuc2lvbi1wYW5lbC0iICsgZXh0ZW5zaW9uU2Vy
dmVyLm5leHRPYmplY3RJZDsNCisgICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrV3JhcHBlcihyZXN1
bHQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0Vycm9yKQ0KKyAgICAg
ICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOw0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAg
ICAgICAgICAgICBwYW5lbCA9IG5ldyBFeHRlbnNpb25QYW5lbChpZCk7DQorICAgICAgICAgICAg
ICAgIHRoaXMuX3BhbmVsc1twYW5lbC5pZF0gPSBwYW5lbDsNCisgICAgICAgICAgICAgICAgY2Fs
bGJhY2socGFuZWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGV4dGVu
c2lvblNlcnZlci5zZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJjcmVhdGVQYW5lbCIsIGlkOiBpZCwg
bGFiZWw6IGxhYmVsLCB1cmw6IGV4cGFuZFVSTChwYWdlVVJMKSwgaWNvbjogZXhwYW5kVVJMKGlj
b25VUkwpIH0sIGNhbGxiYWNrICYmIGJpbmQoY2FsbGJhY2tXcmFwcGVyLCB0aGlzKSk7DQorICAg
IH0NCit9Ow0KKw0KK2Z1bmN0aW9uIFBhbmVsKGlkKQ0KK3sNCisgICAgdGhpcy5faWQgPSBpZDsN
CisgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRTaW5rKCJwYW5lbC1vYmpl
Y3RTZWxlY3RlZC0iICsgaWQpOw0KK30NCisNCitQYW5lbC5wcm90b3R5cGUgPSB7DQorICAgIGNy
ZWF0ZVNpZGViYXJQYW5lOiBmdW5jdGlvbih0aXRsZSwgdXJsLCBjYWxsYmFjaykNCisgICAgew0K
KyAgICAgICAgdmFyIGlkID0gImV4dGVuc2lvbi1zaWRlYmFyLSIgKyBleHRlbnNpb25TZXJ2ZXIu
bmV4dE9iamVjdElkOw0KKyAgICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc3VsdCkN
CisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyb3IpDQorICAgICAgICAg
ICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAg
ICAgICBjYWxsYmFjayhuZXcgRXh0ZW5zaW9uU2lkZWJhclBhbmUoaWQpKTsNCisgICAgICAgIH0N
CisgICAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJjcmVhdGVT
aWRlYmFyUGFuZSIsIHBhbmVsOiB0aGlzLl9pZCwgaWQ6IGlkLCB0aXRsZTogdGl0bGUsIHVybDog
ZXhwYW5kVVJMKHVybCkgfSwgY2FsbGJhY2sgJiYgY2FsbGJhY2tXcmFwcGVyKTsNCisgICAgfQ0K
K307DQorDQorZnVuY3Rpb24gRXh0ZW5zaW9uUGFuZWwoaWQpDQorew0KKyAgICBQYW5lbC5jYWxs
KHRoaXMsIGlkKTsNCisgICAgdGhpcy5vblNlYXJjaCA9IG5ldyBFdmVudFNpbmsoInBhbmVsLXNl
YXJjaC0iICsgaWQpOw0KK30NCisNCitFeHRlbnNpb25QYW5lbC5wcm90b3R5cGUgPSB7DQorfTsN
CisNCitFeHRlbnNpb25QYW5lbC5wcm90b3R5cGUuX19wcm90b19fID0gUGFuZWwucHJvdG90eXBl
Ow0KKw0KK2Z1bmN0aW9uIEV4dGVuc2lvblNpZGViYXJQYW5lKGlkKQ0KK3sNCisgICAgdGhpcy5f
aWQgPSBpZDsNCit9DQorDQorRXh0ZW5zaW9uU2lkZWJhclBhbmUucHJvdG90eXBlID0gew0KKyAg
ICBzZXRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCkNCisgICAgew0KKyAgICAgICAgZXh0ZW5zaW9u
U2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogInNldFNpZGViYXJIZWlnaHQiLCBpZDogdGhp
cy5faWQsIGhlaWdodDogaGVpZ2h0IH0pOw0KKyAgICB9LA0KKw0KKyAgICBzZXRFeHBhbnNpb246
IGZ1bmN0aW9uKHN0YXRlKQ0KKyAgICB7DQorICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJl
cXVlc3QoeyBjb21tYW5kOiAic2V0U2lkZWJhckV4cGFuc2lvbiIsIGlkOiB0aGlzLl9pZCwgZXhw
YW5kZWQ6IHN0YXRlIH0pOw0KKyAgICB9DQorfTsNCisNCitmdW5jdGlvbiBJbnNwZWN0ZWRXaW5k
b3coKQ0KK3sNCisgICAgdGhpcy5vbkxvYWRlZCA9IG5ldyBFdmVudFNpbmsoImluc3BlY3RlZFBh
Z2VMb2FkZWQiKTsNCisgICAgdGhpcy5vbk5hdmlnYXRlZCA9IG5ldyBFdmVudFNpbmsoImluc3Bl
Y3RlZFVSTENoYW5nZWQiKTsNCisgICAgdGhpcy5vbkRPTUNvbnRlbnRMb2FkZWQgPSBuZXcgRXZl
bnRTaW5rKCJET01Db250ZW50TG9hZGVkIik7DQorfQ0KKw0KK0luc3BlY3RlZFdpbmRvdy5wcm90
b3R5cGUgPSB7DQorICAgIHJlbG9hZDogZnVuY3Rpb24oKQ0KKyAgICB7DQorICAgICAgICByZXR1
cm4gZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogInJlbG9hZCIgfSk7DQor
ICAgIH0sDQorDQorICAgIGV2YWx1YXRlOiBmdW5jdGlvbihleHByZXNzaW9uLCBjYWxsYmFjaykN
CisgICAgew0KKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7IGNv
bW1hbmQ6ICJldmFsdWF0ZU9uSW5zcGVjdGVkUGFnZSIsIGV4cHJlc3Npb246IGV4cHJlc3Npb24g
fSwgY2FsbGJhY2spOw0KKyAgICB9DQorfTsNCisNCitmdW5jdGlvbiBFeHRlbnNpb25TZXJ2ZXJD
bGllbnQoKQ0KK3sNCisgICAgdGhpcy5fY2FsbGJhY2tzID0ge307DQorICAgIHRoaXMuX2hhbmRs
ZXJzID0ge307DQorICAgIHRoaXMuX2xhc3RSZXF1ZXN0SWQgPSAwOw0KKyAgICB0aGlzLl9sYXN0
T2JqZWN0SWQgPSAwOw0KKw0KKyAgICB0aGlzLnJlZ2lzdGVySGFuZGxlcigiY2FsbGJhY2siLCBi
aW5kKHRoaXMuX29uQ2FsbGJhY2ssIHRoaXMpKTsNCisNCisgICAgdmFyIGNoYW5uZWwgPSBuZXcg
TWVzc2FnZUNoYW5uZWwoKTsNCisgICAgdGhpcy5fcG9ydCA9IGNoYW5uZWwucG9ydDE7DQorICAg
IHRoaXMuX3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIGJpbmQodGhpcy5fb25NZXNz
YWdlLCB0aGlzKSwgZmFsc2UpOw0KKyAgICB0aGlzLl9wb3J0LnN0YXJ0KCk7DQorDQorICAgIHRv
cC5wb3N0TWVzc2FnZSgicmVnaXN0ZXJFeHRlbnNpb24iLCBbIGNoYW5uZWwucG9ydDIgXSwgIioi
KTsNCit9DQorDQorRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZSA9IHsNCisgICAgc2Vu
ZFJlcXVlc3Q6IGZ1bmN0aW9uKG1lc3NhZ2UsIGNhbGxiYWNrKQ0KKyAgICB7DQorICAgICAgICBp
ZiAodHlwZW9mIGNhbGxiYWNrID09PSAiZnVuY3Rpb24iKQ0KKyAgICAgICAgICAgIG1lc3NhZ2Uu
cmVxdWVzdElkID0gdGhpcy5fcmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFjayk7DQorICAgICAgICBy
ZXR1cm4gdGhpcy5fcG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlKTsNCisgICAgfSwNCisNCisgICAg
cmVnaXN0ZXJIYW5kbGVyOiBmdW5jdGlvbihjb21tYW5kLCBoYW5kbGVyKQ0KKyAgICB7DQorICAg
ICAgICB0aGlzLl9oYW5kbGVyc1tjb21tYW5kXSA9IGhhbmRsZXI7DQorICAgIH0sDQorDQorICAg
IGdldCBuZXh0T2JqZWN0SWQoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gaW5qZWN0ZWRTY3Jp
cHRJZCArICJfIiArICsrdGhpcy5fbGFzdE9iamVjdElkOw0KKyAgICB9LA0KKw0KKyAgICBfcmVn
aXN0ZXJDYWxsYmFjazogZnVuY3Rpb24oY2FsbGJhY2spDQorICAgIHsNCisgICAgICAgIHZhciBp
ZCA9ICsrdGhpcy5fbGFzdFJlcXVlc3RJZDsNCisgICAgICAgIHRoaXMuX2NhbGxiYWNrc1tpZF0g
PSBjYWxsYmFjazsNCisgICAgICAgIHJldHVybiBpZDsNCisgICAgfSwNCisNCisgICAgX29uQ2Fs
bGJhY2s6IGZ1bmN0aW9uKHJlcXVlc3QpDQorICAgIHsNCisgICAgICAgIGlmIChyZXF1ZXN0LnJl
cXVlc3RJZCBpbiB0aGlzLl9jYWxsYmFja3MpIHsNCisgICAgICAgICAgICB0aGlzLl9jYWxsYmFj
a3NbcmVxdWVzdC5yZXF1ZXN0SWRdKHJlcXVlc3QucmVzdWx0KTsNCisgICAgICAgICAgICBkZWxl
dGUgdGhpcy5fY2FsbGJhY2tzW3JlcXVlc3QucmVxdWVzdElkXTsNCisgICAgICAgIH0NCisgICAg
fSwNCisNCisgICAgX29uTWVzc2FnZTogZnVuY3Rpb24oZXZlbnQpDQorICAgIHsNCisgICAgICAg
IHZhciByZXF1ZXN0ID0gZXZlbnQuZGF0YTsNCisgICAgICAgIHZhciBoYW5kbGVyID0gdGhpcy5f
aGFuZGxlcnNbcmVxdWVzdC5jb21tYW5kXTsNCisgICAgICAgIGlmIChoYW5kbGVyKQ0KKyAgICAg
ICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCByZXF1ZXN0KTsNCisgICAgfQ0KK307DQorDQorZnVu
Y3Rpb24gZXhwYW5kVVJMKHVybCkNCit7DQorICAgIGlmICghdXJsKQ0KKyAgICAgICAgcmV0dXJu
IHVybDsNCisgICAgaWYgKC9eW14vXSs6Ly5leGVjKHVybCkpIC8vIFNlZSBpZiB1cmwgaGFzIHNj
aGVtYS4NCisgICAgICAgIHJldHVybiB1cmw7DQorICAgIHZhciBiYXNlVVJMID0gbG9jYXRpb24u
cHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdG5hbWUgKyBsb2NhdGlvbi5wb3J0Ow0KKyAg
ICBpZiAoL15cLy8uZXhlYyh1cmwpKQ0KKyAgICAgICAgcmV0dXJuIGJhc2VVUkwgKyB1cmw7DQor
ICAgIHJldHVybiBiYXNlVVJMICsgbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXi9dKiQv
LCIvIikgKyB1cmw7DQorfQ0KKw0KK2Z1bmN0aW9uIGJpbmQoZnVuYywgdGhpc09iamVjdCkNCit7
DQorICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAy
KTsNCisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gZnVuYy5hcHBseSh0aGlzT2JqZWN0
LCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApKSk7
IH07DQorfQ0KKw0KK3ZhciBleHRlbnNpb25TZXJ2ZXIgPSBuZXcgRXh0ZW5zaW9uU2VydmVyQ2xp
ZW50KCk7DQorDQord2ViaW5zcGVjdG9yID0gbmV3IEluc3BlY3RvckV4dGVuc2lvbkFQSSgpOw0K
Kw0KK30NCkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUGFuZWwu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblBh
bmVsLmpzCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVu
c2lvblBhbmVsLmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlv
bi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworV2ViSW5zcGVjdG9yLkV4
dGVuc2lvblBhbmVsID0gZnVuY3Rpb24oaWQsIGxhYmVsLCBpY29uVVJMLCBvcHRpb25zKQorewor
ICAgIHRoaXMudG9vbGJhckl0ZW1MYWJlbCA9IGxhYmVsOworICAgIHRoaXMuX2FkZFN0eWxlUnVs
ZSgiLnRvb2xiYXItaXRlbS4iICsgaWQgKyAiIC50b29sYmFyLWljb24iLCAiYmFja2dyb3VuZC1p
bWFnZTogdXJsKCIgKyBpY29uVVJMICsgIik7Iik7CisgICAgV2ViSW5zcGVjdG9yLlBhbmVsLmNh
bGwodGhpcywgaWQpOworICAgIHRoaXMuYXR0YWNoKCk7IC8vIEV4dGVuc2lvbiBwYW5lbCBoYXMg
dG8gYmUgYXR0YWNoZWQgc28gdGhhdCBleHRlbnNpb24gY2FuIHNlZSBpdCBpbiBET00gdHJlZQor
fQorCitXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlID0geworICAgIGdldCBk
ZWZhdWx0Rm9jdXNlZEVsZW1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJh
clRyZWVFbGVtZW50IHx8IHRoaXMuZWxlbWVudDsKKyAgICB9LAorCisgICAgdXBkYXRlTWFpblZp
ZXdXaWR0aDogZnVuY3Rpb24od2lkdGgpCisgICAgeworICAgICAgICB0aGlzLmJvZHlFbGVtZW50
LnN0eWxlLmxlZnQgPSB3aWR0aCArICJweCI7CisgICAgICAgIHRoaXMucmVzaXplKCk7CisgICAg
fSwKKworICAgIHNlYXJjaENhbmNlbGVkOiBmdW5jdGlvbihzdGFydGluZ05ld1NlYXJjaCkKKyAg
ICB7CisgICAgICAgIFdlYkluc3BlY3Rvci5leHRlbnNpb25TZXJ2ZXIubm90aWZ5U2VhcmNoQWN0
aW9uKHRoaXMuX2lkLCAiY2FuY2VsU2VhcmNoIik7CisgICAgICAgIFdlYkluc3BlY3Rvci5QYW5l
bC5wcm90b3R5cGUuc2VhcmNoQ2FuY2VsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9
LAorCisgICAgcGVyZm9ybVNlYXJjaDogZnVuY3Rpb24ocXVlcnkpCisgICAgeworICAgICAgICBX
ZWJJbnNwZWN0b3IuZXh0ZW5zaW9uU2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCwg
InBlcmZvcm1TZWFyY2giLCBxdWVyeSk7CisgICAgICAgIFdlYkluc3BlY3Rvci5QYW5lbC5wcm90
b3R5cGUucGVyZm9ybVNlYXJjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAg
ICBqdW1wVG9OZXh0U2VhcmNoUmVzdWx0OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBXZWJJ
bnNwZWN0b3IuZXh0ZW5zaW9uU2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCwgIm5l
eHRTZWFyY2hSZXN1bHQiKTsKKyAgICAgICAgV2ViSW5zcGVjdG9yLlBhbmVsLnByb3RvdHlwZS5q
dW1wVG9OZXh0U2VhcmNoUmVzdWx0LmNhbGwodGhpcyk7CisgICAgfSwKKworICAgIGp1bXBUb1By
ZXZpb3VzU2VhcmNoUmVzdWx0OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBXZWJJbnNwZWN0
b3IuZXh0ZW5zaW9uU2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCwgInByZXZpb3Vz
U2VhcmNoUmVzdWx0Iik7CisgICAgICAgIFdlYkluc3BlY3Rvci5QYW5lbC5wcm90b3R5cGUuanVt
cFRvUHJldmlvdXNTZWFyY2hSZXN1bHQuY2FsbCh0aGlzKTsKKyAgICB9LAorCisgICAgX2FkZFN0
eWxlUnVsZTogZnVuY3Rpb24oc2VsZWN0b3IsIGJvZHkpCisgICAgeworICAgICAgICB2YXIgc3R5
bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOworICAgICAgICBzdHlsZS50ZXh0
Q29udGVudCA9IHNlbGVjdG9yICsgIiB7ICIgKyBib2R5ICsgIiB9IjsKKyAgICAgICAgZG9jdW1l
bnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuRXh0
ZW5zaW9uUGFuZWwucHJvdG90eXBlLl9fcHJvdG9fXyA9IFdlYkluc3BlY3Rvci5QYW5lbC5wcm90
b3R5cGU7CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0
cnlTdHViLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRl
bnNpb25SZWdpc3RyeVN0dWIuanMJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2luc3BlY3Rvci9m
cm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0cnlTdHViLmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDQ1IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLg0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKyAqIG1l
dDoNCisgKg0KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisgKiBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyDQorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQ0KKyAqIGRpc3RyaWJ1dGlvbi4NCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorICogY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20NCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorICogTElNSVRFRCBU
TywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SDQorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQNCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsDQorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorICogVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQ0KKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorICovDQorDQoraWYgKCF3aW5kb3cuSW5zcGVjdG9y
RXh0ZW5zaW9uUmVnaXN0cnkpIHsNCisNCitXZWJJbnNwZWN0b3IuSW5zcGVjdG9yRXh0ZW5zaW9u
UmVnaXN0cnlTdHViID0gZnVuY3Rpb24oKQ0KK3sNCit9DQorDQorV2ViSW5zcGVjdG9yLkluc3Bl
Y3RvckV4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5wcm90b3R5cGUgPSB7DQorICAgIGdldEV4dGVuc2lv
bnM6IGZ1bmN0aW9uKCkNCisgICAgew0KKyAgICB9DQorfTsNCisNCitJbnNwZWN0b3JFeHRlbnNp
b25SZWdpc3RyeSA9IG5ldyBXZWJJbnNwZWN0b3IuSW5zcGVjdG9yRXh0ZW5zaW9uUmVnaXN0cnlT
dHViKCk7DQorDQorfQ0KSW5kZXg6IFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNp
b25TZXJ2ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4
dGVuc2lvblNlcnZlci5qcwkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250
LWVuZC9FeHRlbnNpb25TZXJ2ZXIuanMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzAyIEBACisv
Kg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
Lg0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKyAqIG1ldDoNCisgKg0K
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0DQorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisgKiBjb3B5cmlnaHQgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQ0KKyAqIGRpc3RyaWJ1dGlvbi4NCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9m
IEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0K
KyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERF
UlMgQU5EIENPTlRSSUJVVE9SUw0KKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQNCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsDQorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZDQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0K
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuDQorICovDQorDQorV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlciA9
IGZ1bmN0aW9uKCkNCit7DQorICAgIHRoaXMuX2NsaWVudE9iamVjdHMgPSB7fTsNCisgICAgdGhp
cy5faGFuZGxlcnMgPSB7fTsNCisgICAgdGhpcy5fc3Vic2NyaWJlcnMgPSB7fTsNCisNCisgICAg
dGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJzdWJzY3JpYmUiLCB0aGlzLl9vblN1YnNjcmliZS5iaW5k
KHRoaXMpKTsNCisgICAgdGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJ1bnN1YnNjcmliZSIsIHRoaXMu
X29uVW5zdWJzY3JpYmUuYmluZCh0aGlzKSk7DQorICAgIHRoaXMuX3JlZ2lzdGVySGFuZGxlcigi
Z2V0UmVzb3VyY2VzIiwgdGhpcy5fb25HZXRSZXNvdXJjZXMuYmluZCh0aGlzKSk7DQorICAgIHRo
aXMuX3JlZ2lzdGVySGFuZGxlcigiY3JlYXRlUGFuZWwiLCB0aGlzLl9vbkNyZWF0ZVBhbmVsLmJp
bmQodGhpcykpOw0KKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoImNyZWF0ZVNpZGViYXJQYW5l
IiwgdGhpcy5fb25DcmVhdGVTaWRlYmFyLmJpbmQodGhpcykpOw0KKyAgICB0aGlzLl9yZWdpc3Rl
ckhhbmRsZXIoImxvZyIsIHRoaXMuX29uTG9nLmJpbmQodGhpcykpOyANCisgICAgdGhpcy5fcmVn
aXN0ZXJIYW5kbGVyKCJldmFsdWF0ZU9uSW5zcGVjdGVkUGFnZSIsIHRoaXMuX29uRXZhbHVhdGVP
bkluc3BlY3RlZFBhZ2UuYmluZCh0aGlzKSk7DQorICAgIHRoaXMuX3JlZ2lzdGVySGFuZGxlcigi
c2V0U2lkZWJhckhlaWdodCIsIHRoaXMuX29uU2V0U2lkZWJhckhlaWdodC5iaW5kKHRoaXMpKTsN
CisgICAgdGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJzZXRTaWRlYmFyRXhwYW5zaW9uIiwgdGhpcy5f
b25TZXRTaWRlYmFyRXhwYW5zaW9uLmJpbmQodGhpcykpOw0KKw0KKyAgICB3aW5kb3cuYWRkRXZl
bnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uV2luZG93TWVzc2FnZS5iaW5kKHRoaXMpLCBm
YWxzZSk7DQorfQ0KKw0KK1dlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlID0g
ew0KKyAgICBub3RpZnlQYW5lbFNob3duOiBmdW5jdGlvbihwYW5lbE5hbWUpDQorICAgIHsNCisg
ICAgICAgIHRoaXMuX3Bvc3ROb3RpZmljYXRpb24oInBhbmVsLXNob3duLSIgKyBwYW5lbE5hbWUp
Ow0KKyAgICB9LA0KKw0KKyAgICBub3RpZnlPYmplY3RTZWxlY3RlZDogZnVuY3Rpb24ocGFuZWxJ
ZCwgb2JqZWN0VHlwZSwgb2JqZWN0SWQpDQorICAgIHsNCisgICAgICAgIHRoaXMuX3Bvc3ROb3Rp
ZmljYXRpb24oInBhbmVsLW9iamVjdFNlbGVjdGVkLSIgKyBwYW5lbElkLCBvYmplY3RUeXBlLCBv
YmplY3RJZCk7DQorICAgIH0sDQorDQorICAgIG5vdGlmeU9iamVjdENyZWF0ZWQ6IGZ1bmN0aW9u
KG9iamVjdFR5cGUsIG9iaikNCisgICAgew0KKyAgICAgICAgdGhpcy5fcG9zdE5vdGlmaWNhdGlv
bigiY3JlYXRlZC0iICsgb2JqZWN0VHlwZSwgb2JqKTsNCisgICAgfSwNCisNCisgICAgbm90aWZ5
U2VhcmNoQWN0aW9uOiBmdW5jdGlvbihwYW5lbElkLCBhY3Rpb24sIHNlYXJjaFN0cmluZykNCisg
ICAgew0KKyAgICAgICAgdGhpcy5fcG9zdE5vdGlmaWNhdGlvbigicGFuZWwtc2VhcmNoLSIgKyBw
YW5lbElkLCBhY3Rpb24sIHNlYXJjaFN0cmluZyk7DQorICAgIH0sDQorDQorICAgIHBvc3RFdmVu
dDogZnVuY3Rpb24oZXZlbnROYW1lKQ0KKyAgICB7DQorICAgICAgICB0aGlzLl9wb3N0Tm90aWZp
Y2F0aW9uKGV2ZW50TmFtZSk7DQorICAgIH0sDQorDQorICAgIGNvbnZlcnRSZXNvdXJjZTogZnVu
Y3Rpb24ocmVzb3VyY2UpDQorICAgIHsNCisgICAgICAgIHJldHVybiB7DQorICAgICAgICAgICAg
aWQ6IHJlc291cmNlLmlkZW50aWZpZXIsDQorICAgICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlw
ZSwNCisgICAgICAgICAgICBoYXI6IChuZXcgV2ViSW5zcGVjdG9yLkhBUkVudHJ5KHJlc291cmNl
KSkuYnVpbGQoKSwNCisgICAgICAgIH07DQorICAgIH0sDQorDQorICAgIF9wb3N0Tm90aWZpY2F0
aW9uOiBmdW5jdGlvbih0eXBlLCBkZXRhaWxzKQ0KKyAgICB7DQorICAgICAgICB2YXIgc3Vic2Ny
aWJlcnMgPSB0aGlzLl9zdWJzY3JpYmVyc1t0eXBlXTsNCisgICAgICAgIGlmICghc3Vic2NyaWJl
cnMpDQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgdmFyIG1lc3NhZ2UgPSB7DQorICAg
ICAgICAgICAgY29tbWFuZDogIm5vdGlmeS0iICsgdHlwZSwNCisgICAgICAgICAgICBhcmd1bWVu
dHM6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgDQorICAgICAgICB9
Ow0KKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJzY3JpYmVycy5sZW5ndGg7ICsraSkN
CisgICAgICAgICAgICBzdWJzY3JpYmVyc1tpXS5wb3N0TWVzc2FnZShtZXNzYWdlKTsNCisgICAg
fSwNCisNCisgICAgX29uU3Vic2NyaWJlOiBmdW5jdGlvbihtZXNzYWdlLCBwb3J0KQ0KKyAgICB7
DQorICAgICAgICB2YXIgc3Vic2NyaWJlcnMgPSB0aGlzLl9zdWJzY3JpYmVyc1ttZXNzYWdlLnR5
cGVdOw0KKyAgICAgICAgaWYgKHN1YnNjcmliZXJzKQ0KKyAgICAgICAgICAgIHN1YnNjcmliZXJz
LnB1c2gocG9ydCk7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJl
cnNbbWVzc2FnZS50eXBlXSA9IFsgcG9ydCBdOw0KKyAgICB9LA0KKw0KKyAgICBfb25VbnN1YnNj
cmliZTogZnVuY3Rpb24obWVzc2FnZSwgcG9ydCkNCisgICAgew0KKyAgICAgICAgdmFyIHN1YnNj
cmliZXJzID0gdGhpcy5fc3Vic2NyaWJlcnNbbWVzc2FnZS50eXBlXTsNCisgICAgICAgIGlmICgh
c3Vic2NyaWJlcnMpDQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgc3Vic2NyaWJlcnMu
cmVtb3ZlKHBvcnQpOw0KKyAgICAgICAgaWYgKCFzdWJzY3JpYmVycy5sZW5ndGgpDQorICAgICAg
ICAgICAgZGVsZXRlIHRoaXMuX3N1YnNjcmliZXJzW21lc3NhZ2UudHlwZV07DQorICAgIH0sDQor
DQorICAgIF9vbkNyZWF0ZVBhbmVsOiBmdW5jdGlvbihtZXNzYWdlLCBwb3J0KQ0KKyAgICB7DQor
ICAgICAgICB2YXIgaWQgPSBtZXNzYWdlLmlkOw0KKyAgICAgICAgdmFyIHBhbmVsID0gbmV3IFdl
Ykluc3BlY3Rvci5FeHRlbnNpb25QYW5lbChpZCwgbWVzc2FnZS5sYWJlbCwgbWVzc2FnZS5pY29u
KTsNCisgICAgICAgIHRoaXMuX2NsaWVudE9iamVjdHNbaWRdID0gcGFuZWw7DQorDQorICAgICAg
ICB2YXIgdG9vbGJhckVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9vbGJhciIp
Ow0KKyAgICAgICAgdmFyIGxhc3RUb29sYmFySXRlbSA9IFdlYkluc3BlY3Rvci5wYW5lbE9yZGVy
W1dlYkluc3BlY3Rvci5wYW5lbE9yZGVyLmxlbmd0aCAtIDFdLnRvb2xiYXJJdGVtOw0KKyAgICAg
ICAgV2ViSW5zcGVjdG9yLmFkZFBhbmVsVG9vbGJhckljb24odG9vbGJhckVsZW1lbnQsIHBhbmVs
LCBsYXN0VG9vbGJhckl0ZW0pOw0KKyAgICAgICAgV2ViSW5zcGVjdG9yLnBhbmVsc1tpZF0gPSBw
YW5lbDsNCisgICAgICAgIHRoaXMuX2NyZWF0ZUNsaWVudElmcmFtZShwYW5lbC5lbGVtZW50LCBt
ZXNzYWdlLnVybCwgbWVzc2FnZS5yZXF1ZXN0SWQsIHBvcnQpOw0KKyAgICB9LA0KKw0KKyAgICBf
b25DcmVhdGVTaWRlYmFyOiBmdW5jdGlvbihtZXNzYWdlLCBwb3J0KQ0KKyAgICB7DQorICAgICAg
ICB2YXIgcGFuZWwgPSBXZWJJbnNwZWN0b3IucGFuZWxzW21lc3NhZ2UucGFuZWxdOw0KKyAgICAg
ICAgaWYgKCFwYW5lbCkNCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzKCJFX05PVEZP
VU5EIiwgbWVzc2FnZS5wYW5lbCk7DQorICAgICAgICBpZiAoIXBhbmVsLnNpZGViYXJFbGVtZW50
IHx8ICFwYW5lbC5zaWRlYmFyUGFuZXMpDQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1
cygiRV9OT1RTVVBQT1JURUQiKTsNCisgICAgICAgIHZhciBpZCA9IG1lc3NhZ2UuaWQ7DQorICAg
ICAgICB2YXIgc2lkZWJhciA9IG5ldyBXZWJJbnNwZWN0b3IuU2lkZWJhclBhbmUobWVzc2FnZS50
aXRsZSk7DQorICAgICAgICB0aGlzLl9jbGllbnRPYmplY3RzW2lkXSA9IHNpZGViYXI7DQorICAg
ICAgICBwYW5lbC5zaWRlYmFyUGFuZXNbaWRdID0gc2lkZWJhcjsNCisgICAgICAgIHBhbmVsLnNp
ZGViYXJFbGVtZW50LmFwcGVuZENoaWxkKHNpZGViYXIuZWxlbWVudCk7DQorICAgICAgICB0aGlz
Ll9jcmVhdGVDbGllbnRJZnJhbWUoc2lkZWJhci5ib2R5RWxlbWVudCwgbWVzc2FnZS51cmwsIG1l
c3NhZ2UucmVxdWVzdElkLCBwb3J0KTsNCisgICAgfSwNCisNCisgICAgX2NyZWF0ZUNsaWVudElm
cmFtZTogZnVuY3Rpb24ocGFyZW50LCB1cmwsIHJlcXVlc3RJZCwgcG9ydCkNCisgICAgew0KKyAg
ICAgICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOw0KKyAg
ICAgICAgaWZyYW1lLnNyYyA9IHVybDsNCisgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9ICIx
MDAlIjsNCisgICAgICAgIGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgdGhpcy5fZGlz
cGF0Y2hDYWxsYmFjay5iaW5kKHRoaXMsIHJlcXVlc3RJZCwgcG9ydCwgdGhpcy5fc3RhdHVzKCJP
SyIpKSk7DQorICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoaWZyYW1lKTsNCisgICAgfSwNCisN
CisgICAgX29uU2V0U2lkZWJhckhlaWdodDogZnVuY3Rpb24obWVzc2FnZSkNCisgICAgew0KKyAg
ICAgICAgdmFyIHNpZGViYXIgPSB0aGlzLl9jbGllbnRPYmplY3RzW21lc3NhZ2UuaWRdOw0KKyAg
ICAgICAgaWYgKCFzaWRlYmFyKQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXMoIkVf
Tk9URk9VTkQiLCBtZXNzYWdlLmlkKTsNCisgICAgICAgIHNpZGViYXIuYm9keUVsZW1lbnQuZmly
c3RDaGlsZC5zdHlsZS5oZWlnaHQgPSBtZXNzYWdlLmhlaWdodDsNCisgICAgfSwNCisNCisgICAg
X29uU2V0U2lkZWJhckV4cGFuc2lvbjogZnVuY3Rpb24obWVzc2FnZSkNCisgICAgew0KKyAgICAg
ICAgdmFyIHNpZGViYXIgPSB0aGlzLl9jbGllbnRPYmplY3RzW21lc3NhZ2UuaWRdOw0KKyAgICAg
ICAgaWYgKCFzaWRlYmFyKQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXMoIkVfTk9U
Rk9VTkQiLCBtZXNzYWdlLmlkKTsNCisgICAgICAgIGlmIChtZXNzYWdlLmV4cGFuZGVkKQ0KKyAg
ICAgICAgICAgIHNpZGViYXIuZXhwYW5kKCk7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAg
c2lkZWJhci5jb2xsYXBzZSgpOw0KKyAgICB9LA0KKw0KKyAgICBfb25Mb2c6IGZ1bmN0aW9uKG1l
c3NhZ2UpDQorICAgIHsNCisgICAgICAgIFdlYkluc3BlY3Rvci5sb2cobWVzc2FnZS5tZXNzYWdl
KTsNCisgICAgfSwNCisNCisgICAgX29uRXZhbHVhdGVPbkluc3BlY3RlZFBhZ2U6IGZ1bmN0aW9u
KG1lc3NhZ2UsIHBvcnQpDQorICAgIHsNCisgICAgICAgIEluamVjdGVkU2NyaXB0QWNjZXNzLmdl
dERlZmF1bHQoKS5ldmFsdWF0ZVdpdGhTdHJpbmdSZXN1bHQobWVzc2FnZS5leHByZXNzaW9uLCB0
aGlzLl9kaXNwYXRjaENhbGxiYWNrLmJpbmQodGhpcywgbWVzc2FnZS5yZXF1ZXN0SWQsIHBvcnQp
KTsNCisgICAgfSwNCisNCisgICAgX29uUmV2ZWFsQW5kU2VsZWN0OiBmdW5jdGlvbihtZXNzYWdl
KQ0KKyAgICB7DQorICAgICAgICBpZiAobWVzc2FnZS5wYW5lbElkID09PSAicmVzb3VyY2VzIiAm
JiB0eXBlID09PSAicmVzb3VyY2UiKQ0KKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblJldmVh
bEFuZFNlbGVjdFJlc291cmNlKG1lc3NhZ2UpOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAg
IHJldHVybiB0aGlzLl9zdGF0dXMoIkVfTk9UU1VQUE9SVEVEIiwgbWVzc2FnZS5wYW5lbElkLCBt
ZXNzYWdlLnR5cGUpOw0KKyAgICB9LA0KKw0KKyAgICBfb25SZXZlYWxBbmRTZWxlY3RSZXNvdXJj
ZTogZnVuY3Rpb24obWVzc2FnZSkNCisgICAgew0KKyAgICAgICAgdmFyIGlkID0gbWVzc2FnZS5p
ZDsNCisgICAgICAgIHZhciByZXNvdXJjZSA9IG51bGw7DQorDQorICAgICAgICByZXNvdXJjZSA9
IHR5cGVvZiBpZCA9PT0gIm51bWJlciIgPyBXZWJJbnNwZWN0b3IucmVzb3VyY2VzW2lkXSA6IFdl
Ykluc3BlY3Rvci5yZXNvdXJjZUZvclVSTChpZCk7DQorICAgICAgICBpZiAoIXJlc291cmNlKQ0K
KyAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXMoIkVfTk9URk9VTkQiLCB0eXBlb2YgaWQg
KyAiOiAiICsgaWQpOw0KKyAgICAgICAgV2ViSW5zcGVjdG9yLnBhbmVscy5yZXNvdXJjZXMuc2hv
d1Jlc291cmNlKHJlc291cmNlLCBtZXNzYWdlLmxpbmUpOw0KKyAgICAgICAgV2ViSW5zcGVjdG9y
LnNob3dSZXNvdXJjZXNQYW5lbCgpOw0KKyAgICB9LA0KKw0KKyAgICBfZGlzcGF0Y2hDYWxsYmFj
azogZnVuY3Rpb24ocmVxdWVzdElkLCBwb3J0LCByZXN1bHQpDQorICAgIHsNCisgICAgICAgIHBv
cnQucG9zdE1lc3NhZ2UoeyBjb21tYW5kOiAiY2FsbGJhY2siLCByZXF1ZXN0SWQ6IHJlcXVlc3RJ
ZCwgcmVzdWx0OiByZXN1bHQgfSk7DQorICAgIH0sDQorDQorICAgIF9vbkdldFJlc291cmNlczog
ZnVuY3Rpb24ocmVxdWVzdCkNCisgICAgew0KKyAgICAgICAgZnVuY3Rpb24gcmVzb3VyY2VXcmFw
cGVyKGlkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBXZWJJbnNwZWN0b3IuZXh0
ZW5zaW9uU2VydmVyLmNvbnZlcnRSZXNvdXJjZShXZWJJbnNwZWN0b3IucmVzb3VyY2VzW2lkXSk7
DQorICAgICAgICB9DQorDQorICAgICAgICB2YXIgcmVzcG9uc2U7DQorICAgICAgICBpZiAocmVx
dWVzdC5pZCkNCisgICAgICAgICAgICByZXNwb25zZSA9IFdlYkluc3BlY3Rvci5yZXNvdXJjZXNb
cmVxdWVzdC5pZF0gPyByZXNvdXJjZVdyYXBwZXIocmVxdWVzdC5pZCkgOiB0aGlzLl9zdGF0dXMo
IkVfTk9URk9VTkQiLCByZXF1ZXN0LmlkKTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICBy
ZXNwb25zZSA9IE9iamVjdC5wcm9wZXJ0aWVzKFdlYkluc3BlY3Rvci5yZXNvdXJjZXMpLm1hcChy
ZXNvdXJjZVdyYXBwZXIpOw0KKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KKyAgICB9LA0KKw0K
KyAgICBpbml0RXh0ZW5zaW9uczogZnVuY3Rpb24oZXh0ZW5zaW9ucykNCisgICAgew0KKyAgICAg
ICAgSW5zcGVjdG9yRnJvbnRlbmRIb3N0LnNldEV4dGVuc2lvbkFQSSgiKCIgKyBleHRlbnNpb25B
UEkgKyAiKSIpOw0KKyAgICAgICAgSW5zcGVjdG9yRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5z
aW9ucygpOw0KKyAgICB9LA0KKw0KKyAgICBhZGRFeHRlbnNpb25zOiBmdW5jdGlvbihleHRlbnNp
b25zKQ0KKyAgICB7DQorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVu
Z3RoOyArK2kpDQorICAgICAgICAgICAgdGhpcy5fYWRkRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0p
Ow0KKyAgICB9LA0KKw0KKyAgICBfYWRkRXh0ZW5zaW9uOiBmdW5jdGlvbihleHRlbnNpb24pDQor
ICAgIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgaWYgKCFleHRlbnNpb24uc3RhcnRQ
YWdlKQ0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgdmFyIGlmcmFtZSA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOw0KKyAgICAgICAgICAgIGlmcmFtZS5z
cmMgPSBleHRlbnNpb24uc3RhcnRQYWdlOw0KKyAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5kaXNw
bGF5ID0gIm5vbmUiOw0KKyAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZy
YW1lKTsNCisgICAgICAgIH0gY2F0Y2ggKGUpIHsNCisgICAgICAgICAgICBjb25zb2xlLmxvZygi
RmFpbGVkIHRvIGluaXRpYWxpemUgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uc3RhcnRQYWdlICsg
IjoiICsgZSk7DQorICAgICAgICB9DQorICAgIH0sDQorDQorICAgIF9vbldpbmRvd01lc3NhZ2U6
IGZ1bmN0aW9uKGV2ZW50KQ0KKyAgICB7DQorICAgICAgICBpZiAoZXZlbnQuZGF0YSAhPT0gInJl
Z2lzdGVyRXh0ZW5zaW9uIikNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB2YXIgcG9y
dCA9IGV2ZW50LnBvcnRzWzBdOw0KKyAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNz
YWdlIiwgdGhpcy5fb25tZXNzYWdlLmJpbmQodGhpcyksIGZhbHNlKTsNCisgICAgICAgIHBvcnQu
c3RhcnQoKTsNCisgICAgfSwNCisNCisgICAgX29ubWVzc2FnZTogZnVuY3Rpb24oZXZlbnQpDQor
ICAgIHsNCisgICAgICAgIHZhciByZXF1ZXN0ID0gZXZlbnQuZGF0YTsNCisgICAgICAgIHZhciBy
ZXN1bHQ7DQorDQorICAgICAgICBpZiAocmVxdWVzdC5jb21tYW5kIGluIHRoaXMuX2hhbmRsZXJz
KQ0KKyAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2hhbmRsZXJzW3JlcXVlc3QuY29tbWFuZF0o
cmVxdWVzdCwgZXZlbnQudGFyZ2V0KTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICByZXN1
bHQgPSB0aGlzLl9zdGF0dXMoIkVfTk9UU1VQUE9SVEVEIiwgcmVxdWVzdC5jb21tYW5kKTsNCisN
CisgICAgICAgIGlmIChyZXN1bHQgJiYgcmVxdWVzdC5yZXF1ZXN0SWQpDQorICAgICAgICAgICAg
dGhpcy5fZGlzcGF0Y2hDYWxsYmFjayhyZXF1ZXN0LnJlcXVlc3RJZCwgZXZlbnQudGFyZ2V0LCBy
ZXN1bHQpOw0KKyAgICB9LA0KKw0KKyAgICBfcmVnaXN0ZXJIYW5kbGVyOiBmdW5jdGlvbihjb21t
YW5kLCBjYWxsYmFjaykNCisgICAgew0KKyAgICAgICAgdGhpcy5faGFuZGxlcnNbY29tbWFuZF0g
PSBjYWxsYmFjazsNCisgICAgfSwNCisNCisgICAgX3N0YXR1czogZnVuY3Rpb24oY29kZSkNCisg
ICAgew0KKyAgICAgICAgdmFyIGRlc2NyaXB0aW9uID0gV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNl
cnZlci5fZXJyb3JzW2NvZGVdIHx8IGNvZGU7DQorICAgICAgICB2YXIgZGV0YWlscyA9IEFycmF5
LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7IA0KKyAgICAgICAgdmFyIHN0YXR1
cyA9IG5ldyBXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU3RhdHVzKGNvZGUsIGRlc2NyaXB0aW9uLCBk
ZXRhaWxzKTsNCisgICAgICAgIGlmIChjb2RlICE9PSAiT0siKSB7DQorICAgICAgICAgICAgc3Rh
dHVzLmlzRXJyb3IgPSB0cnVlOw0KKyAgICAgICAgICAgIGNvbnNvbGUubG9nKCJFeHRlbnNpb24g
c2VydmVyIGVycm9yOiAiICsgU3RyaW5nLnZzcHJpbnRmKGRlc2NyaXB0aW9uLCBkZXRhaWxzKSk7
DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gc3RhdHVzOw0KKyAgICB9DQorfTsNCisNCitX
ZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLl9lcnJvcnMgPSANCit7DQorICAgIE9LOiAiIiwN
CisgICAgRV9OT1RGT1VORDogIk9iamVjdCBub3QgZm91bmQgKCVzKSIsDQorICAgIEVfTk9UU1VQ
UE9SVEVEOiAiT2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgcmVxdWVzdGVkIG9wZXJhdGlvbiAoJXMp
IiwNCit9DQorDQorV2ViSW5zcGVjdG9yLkV4dGVuc2lvblN0YXR1cyA9IGZ1bmN0aW9uKGNvZGUs
IGRlc2NyaXB0aW9uLCBkZXRhaWxzKQ0KK3sNCisgICAgdGhpcy5jb2RlID0gY29kZTsNCisgICAg
dGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KKyAgICB0aGlzLmRldGFpbHMgPSBkZXRh
aWxzOw0KK30NCkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvSW5qZWN0ZWRTY3Jp
cHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVk
U2NyaXB0LmpzCShyZXZpc2lvbiA2NDAzNCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC9JbmplY3RlZFNjcmlwdC5qcwkod29ya2luZyBjb3B5KQpAQCAtMjM4LDYgKzIzOCwyMSBAQCBJ
bmplY3RlZFNjcmlwdC5nZXRDb21wbGV0aW9ucyA9IGZ1bmN0aW9uCiAgICAgcmV0dXJuIHByb3Bz
OwogfQogCitJbmplY3RlZFNjcmlwdC5ldmFsdWF0ZVdpdGhTdHJpbmdSZXN1bHQgPSBmdW5jdGlv
bihleHByZXNzaW9uKQoreworICAgIHZhciByZXN1bHQgPSB7fTsKKyAgICB0cnkgeworICAgICAg
ICB2YXIgdmFsdWUgPSBJbmplY3RlZFNjcmlwdC5fZXZhbHVhdGVPbihpbnNwZWN0ZWRXaW5kb3cu
ZXZhbCwgaW5zcGVjdGVkV2luZG93LCBleHByZXNzaW9uLCBmYWxzZSk7CisgICAgICAgIGlmICh2
YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSAhPT0gInN0cmluZyIpCisgICAgICAgICAgICB0
aHJvdyAiRXZhbHVhdGlvbiByZXN1bHQgaXMgbm90IGEgc3RyaW5nIjsKKyAgICAgICAgcmVzdWx0
LnZhbHVlID0gdmFsdWU7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgICByZXN1bHQudmFsdWUg
PSBlLnRvU3RyaW5nKCk7CisgICAgICAgIHJlc3VsdC5pc0V4Y2VwdGlvbiA9IHRydWU7CisgICAg
fQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIEluamVjdGVkU2NyaXB0LmV2YWx1YXRlID0gZnVu
Y3Rpb24oZXhwcmVzc2lvbiwgb2JqZWN0R3JvdXApCiB7CiAgICAgcmV0dXJuIEluamVjdGVkU2Ny
aXB0Ll9ldmFsdWF0ZUFuZFdyYXAoaW5zcGVjdGVkV2luZG93LmV2YWwsIGluc3BlY3RlZFdpbmRv
dywgZXhwcmVzc2lvbiwgb2JqZWN0R3JvdXApOwpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvZnJv
bnQtZW5kL0luamVjdGVkU2NyaXB0QWNjZXNzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5z
cGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdEFjY2Vzcy5qcwkocmV2aXNpb24gNjQwMzQp
CisrKyBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTc2LDEzICs3NiwxNCBAQCBJbmplY3RlZFNjcmlwdEFjY2Vzcy5f
aW5zdGFsbEhhbmRsZXIgPSBmCiAvLyBXZSBrZWVwIHRoZXNlIHNvcnRlZC4KIEluamVjdGVkU2Ny
aXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZXZhbHVhdGUiKTsKIEluamVjdGVkU2NyaXB0QWNj
ZXNzLl9pbnN0YWxsSGFuZGxlcigiZXZhbHVhdGVJbkNhbGxGcmFtZSIpOworSW5qZWN0ZWRTY3Jp
cHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJldmFsdWF0ZU9uU2VsZiIpOworSW5qZWN0ZWRTY3Jp
cHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJldmFsdWF0ZVdpdGhTdHJpbmdSZXN1bHQiKTsKIElu
amVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZ2V0Q29tcGxldGlvbnMiKTsKIElu
amVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZ2V0UHJvcGVydGllcyIpOwogSW5q
ZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJnZXRQcm90b3R5cGVzIik7CiBJbmpl
Y3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoIm9wZW5Jbkluc3BlY3RlZFdpbmRvdyIp
OwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJwdXNoTm9kZVRvRnJvbnRl
bmQiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigic2V0UHJvcGVydHlW
YWx1ZSIpOwotSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJldmFsdWF0ZU9u
U2VsZiIpOwogCiAvLyBTb21lIG1ldGhvZHMgY2FuJ3QgcnVuIHN5bmNocm9ub3VzbHkgZXZlbiBv
biB0aGUgaW5qZWN0ZWQgc2NyaXB0IHNpZGUgKHN1Y2ggYXMgREIgdHJhbnNhY3Rpb25zKS4KIC8v
IE1hcmsgdGhlbSBhcyBhc3luY2hyb25vdXMgaGVyZS4KSW5kZXg6IFdlYkNvcmUvaW5zcGVjdG9y
L2Zyb250LWVuZC9JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzCShy
ZXZpc2lvbiA2NDAzNCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbnNwZWN0b3JG
cm9udGVuZEhvc3RTdHViLmpzCSh3b3JraW5nIGNvcHkpCkBAIC04NCw2ICs4NCwxMCBAQCBXZWJJ
bnNwZWN0b3IuSW5zcGVjdG9yRnJvbnRlbmRIb3N0U3R1Yi5wCiAgICAgewogICAgIH0sCiAKKyAg
ICBzZXRFeHRlbnNpb25BUEk6IGZ1bmN0aW9uKHNjcmlwdCkKKyAgICB7CisgICAgfSwKKwogICAg
IGxvYWRlZDogZnVuY3Rpb24oKQogICAgIHsKICAgICB9LApJbmRleDogV2ViQ29yZS9pbnNwZWN0
b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVj
dG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbAkocmV2aXNpb24gNjQwMzQpCisrKyBXZWJDb3Jl
L2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTM5
LDYgKzM5LDcgQEAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQTwogICAg
IDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imluc3BlY3Rvci5qcyI+PC9zY3Jp
cHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iSW5zcGVjdG9yQmFj
a2VuZFN0dWIuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0
IiBzcmM9Ikluc3BlY3RvckZyb250ZW5kSG9zdFN0dWIuanMiPjwvc2NyaXB0PgorICAgIDxzY3Jp
cHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkV4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5qcyI+
PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iT2JqZWN0
LmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJT
ZXR0aW5ncy5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQi
IHNyYz0iQ1NTU3R5bGVNb2RlbC5qcyI+PC9zY3JpcHQ+CkBAIC05Niw2ICs5Nyw5IEBAIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE8KICAgICA8c2NyaXB0IHR5cGU9InRl
eHQvamF2YXNjcmlwdCIgc3JjPSJTdG9yYWdlUGFuZWwuanMiPjwvc2NyaXB0PgogICAgIDxzY3Jp
cHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IlByb2ZpbGVzUGFuZWwuanMiPjwvc2NyaXB0
PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkNvbnNvbGVQYW5lbC5q
cyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iRXh0
ZW5zaW9uQVBJLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlw
dCIgc3JjPSJFeHRlbnNpb25TZXJ2ZXIuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0i
dGV4dC9qYXZhc2NyaXB0IiBzcmM9IkV4dGVuc2lvblBhbmVsLmpzIj48L3NjcmlwdD4KICAgICA8
c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJBdWRpdHNQYW5lbC5qcyI+PC9zY3Jp
cHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iQXVkaXRSZXN1bHRW
aWV3LmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3Jj
PSJBdWRpdExhdW5jaGVyVmlldy5qcyI+PC9zY3JpcHQ+CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9y
L2Zyb250LWVuZC9pbnNwZWN0b3IuanMJKHJldmlzaW9uIDY0MDM0KQorKysgV2ViQ29yZS9pbnNw
ZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5qcwkod29ya2luZyBjb3B5KQpAQCAtNTI2LDYgKzUy
Niw5IEBAIFdlYkluc3BlY3Rvci5sb2FkZWQgPSBmdW5jdGlvbigpCiAgICAgZG9jdW1lbnQuZ2V0
RWxlbWVudEJ5SWQoImNsb3NlLWJ1dHRvbi1sZWZ0IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2si
LCB0aGlzLmNsb3NlLCB0cnVlKTsKICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2xvc2Ut
YnV0dG9uLXJpZ2h0IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmNsb3NlLCB0cnVl
KTsKIAorICAgIHRoaXMuZXh0ZW5zaW9uU2VydmVyID0gbmV3IFdlYkluc3BlY3Rvci5FeHRlbnNp
b25TZXJ2ZXIoKTsKKyAgICB0aGlzLmV4dGVuc2lvblNlcnZlci5pbml0RXh0ZW5zaW9ucygpOwor
CiAgICAgSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmxvYWRlZCgpOwogfQogCkBAIC0xMjAyLDYgKzEy
MDUsNyBAQCBXZWJJbnNwZWN0b3IudXBkYXRlUmVzb3VyY2UgPSBmdW5jdGlvbihpCiAgICAgICAg
IHJlc291cmNlLmZpbmlzaGVkID0gcGF5bG9hZC5maW5pc2hlZDsKICAgICAgICAgaWYgKHRoaXMu
cGFuZWxzLmF1ZGl0cykKICAgICAgICAgICAgIHRoaXMucGFuZWxzLmF1ZGl0cy5yZXNvdXJjZUZp
bmlzaGVkKHJlc291cmNlKTsKKyAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2ZXIubm90aWZ5T2Jq
ZWN0Q3JlYXRlZCgicmVzb3VyY2UiLCBXZWJJbnNwZWN0b3IuZXh0ZW5zaW9uU2VydmVyLmNvbnZl
cnRSZXNvdXJjZShyZXNvdXJjZSkpOwogICAgIH0KIAogICAgIGlmIChwYXlsb2FkLmRpZFRpbWlu
Z0NoYW5nZSkgewpAQCAtMTM3Miw2ICsxMzc2LDcgQEAgV2ViSW5zcGVjdG9yLnByb2ZpbGVyV2Fz
RGlzYWJsZWQgPSBmdW5jdAogV2ViSW5zcGVjdG9yLnBhcnNlZFNjcmlwdFNvdXJjZSA9IGZ1bmN0
aW9uKHNvdXJjZUlELCBzb3VyY2VVUkwsIHNvdXJjZSwgc3RhcnRpbmdMaW5lLCBzY3JpcHRXb3Js
ZFR5cGUpCiB7CiAgICAgdGhpcy5wYW5lbHMuc2NyaXB0cy5hZGRTY3JpcHQoc291cmNlSUQsIHNv
dXJjZVVSTCwgc291cmNlLCBzdGFydGluZ0xpbmUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBzY3Jp
cHRXb3JsZFR5cGUpOworICAgIHRoaXMuZXh0ZW5zaW9uU2VydmVyLm5vdGlmeU9iamVjdENyZWF0
ZWQoInNjcmlwdCIsIHsgaWQ6IHNvdXJjZUlELCBuYW1lOiBzb3VyY2VVUkwsIHNvdXJjZTogc291
cmNlLCBsaW5lOiBzdGFydGluZ0xpbmUgfSk7CiB9CiAKIFdlYkluc3BlY3Rvci5yZXN0b3JlZEJy
ZWFrcG9pbnQgPSBmdW5jdGlvbihzb3VyY2VJRCwgc291cmNlVVJMLCBsaW5lLCBlbmFibGVkLCBj
b25kaXRpb24pCkBAIC0xNDI2LDYgKzE0MzEsNyBAQCBXZWJJbnNwZWN0b3IucmVzZXQgPSBmdW5j
dGlvbigpCiAgICAgZGVsZXRlIHRoaXMubWFpblJlc291cmNlOwogCiAgICAgdGhpcy5jb25zb2xl
LmNsZWFyTWVzc2FnZXMoKTsKKyAgICB0aGlzLmV4dGVuc2lvblNlcnZlci5wb3N0RXZlbnQoInJl
c2V0Iik7CiB9CiAKIFdlYkluc3BlY3Rvci5yZXNldFByb2ZpbGVzUGFuZWwgPSBmdW5jdGlvbigp
CkBAIC0xNDQyLDYgKzE0NDgsNyBAQCBXZWJJbnNwZWN0b3IuYnJpbmdUb0Zyb250ID0gZnVuY3Rp
b24oKQogV2ViSW5zcGVjdG9yLmluc3BlY3RlZFVSTENoYW5nZWQgPSBmdW5jdGlvbih1cmwpCiB7
CiAgICAgSW5zcGVjdG9yRnJvbnRlbmRIb3N0Lmluc3BlY3RlZFVSTENoYW5nZWQodXJsKTsKKyAg
ICB0aGlzLmV4dGVuc2lvblNlcnZlci5wb3N0RXZlbnQoImluc3BlY3RlZFVSTENoYW5nZWQiKTsK
IH0KIAogV2ViSW5zcGVjdG9yLnJlc291cmNlVVJMQ2hhbmdlZCA9IGZ1bmN0aW9uKHJlc291cmNl
LCBvbGRVUkwpCkBAIC0xNDU0LDYgKzE0NjEsNyBAQCBXZWJJbnNwZWN0b3IuZGlkQ29tbWl0TG9h
ZCA9IGZ1bmN0aW9uKCkKIHsKICAgICAvLyBDbGVhbnVwIGVsZW1lbnRzIHBhbmVsIGVhcmx5IG9u
IGluc3BlY3RlZCBwYWdlIHJlZnJlc2guCiAgICAgV2ViSW5zcGVjdG9yLnNldERvY3VtZW50KG51
bGwpOworICAgIHRoaXMuZXh0ZW5zaW9uU2VydmVyLnBvc3RFdmVudCgiaW5zcGVjdGVkUGFnZUxv
YWRlZCIpOwogfQogCiBXZWJJbnNwZWN0b3IudXBkYXRlQ29uc29sZU1lc3NhZ2VFeHBpcmVkQ291
bnQgPSBmdW5jdGlvbihjb3VudCkKQEAgLTE1OTUsNiArMTYwMywxMSBAQCBXZWJJbnNwZWN0b3Iu
c2V0UmVjb3JkaW5nUHJvZmlsZSA9IGZ1bmN0CiAgICAgdGhpcy5wYW5lbHMucHJvZmlsZXMudXBk
YXRlUHJvZmlsZVR5cGVCdXR0b25zKCk7CiB9CiAKK1dlYkluc3BlY3Rvci5hZGRFeHRlbnNpb25z
ID0gZnVuY3Rpb24oZXh0ZW5zaW9ucykKK3sKKyAgICBXZWJJbnNwZWN0b3IuZXh0ZW5zaW9uU2Vy
dmVyLmFkZEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Cit9CisKIFdlYkluc3BlY3Rvci5kcmF3TG9h
ZGluZ1BpZUNoYXJ0ID0gZnVuY3Rpb24oY2FudmFzLCBwZXJjZW50KSB7CiAgICAgdmFyIGcgPSBj
YW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICB2YXIgZGFya0NvbG9yID0gInJnYigxMjIsIDE2
OCwgMjE4KSI7CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA2NDA0MykKKysrIExheW91dFRlc3RzL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM4IEBACisyMDEwLTA3LTI2ICBBbmRyZXkg
S29zeWFrb3YgIDxjYXNlcUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViIEluc3BlY3RvcjogZXh0ZW5zaW9uIEFQSSB0ZXN0
cy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQwNDI1
CisKKyAgICAgICAgKiBpbnNwZWN0b3IvZXh0ZW5zaW9ucy1leHBlY3RlZC50eHQ6IEFkZGVkLgor
ICAgICAgICAqIGluc3BlY3Rvci9leHRlbnNpb25zLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGlu
c3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLW1haW4uaHRtbDogQWRkZWQuCisgICAgICAgICog
aW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5qczogQWRkZWQuCisgICAgICAgICh0
ZXN0X2V2YWxTdHJpbmcpOgorICAgICAgICAodGVzdF9ldmFsTm9uU3RyaW5nKToKKyAgICAgICAg
KHRlc3RfZ2V0QWxsUmVzb3VyY2VzLmNvbXBhcmVSZXNvdXJjZXMpOgorICAgICAgICAodGVzdF9n
ZXRBbGxSZXNvdXJjZXMub25SZXNvdXJjZSk6CisgICAgICAgICh0ZXN0X2dldEFsbFJlc291cmNl
cyk6CisgICAgICAgICh0ZXN0X2dldEludmFsaWRSZXNvdXJjZS5vblJlc291cmNlKToKKyAgICAg
ICAgKHRlc3RfZ2V0SW52YWxpZFJlc291cmNlKToKKyAgICAgICAgKGdldCB0ZXN0X2NyZWF0ZVBh
bmVsLm9uUGFuZWxDcmVhdGVkKToKKyAgICAgICAgKGdldCB0ZXN0X2NyZWF0ZVBhbmVsKToKKyAg
ICAgICAgKHRlc3RfY3JlYXRlU2lkZWJhci5vblNpZGViYXJDcmVhdGVkKToKKyAgICAgICAgKHRl
c3RfY3JlYXRlU2lkZWJhck5vdFN1cHBvcnRlZC5vblNpZGViYXJDcmVhdGVkKToKKyAgICAgICAg
KHRlc3RfY3JlYXRlU2lkZWJhck5vdFN1cHBvcnRlZCk6CisgICAgICAgICh0ZXN0X3Jlc291cmNl
Tm90aWZpY2F0aW9uLm9uUmVzb3VyY2VDcmVhdGVkKToKKyAgICAgICAgKHRlc3RfcmVzb3VyY2VO
b3RpZmljYXRpb24pOgorICAgICAgICAob25FdmFsdWF0ZSk6CisgICAgICAgIChvblRlc3RzRG9u
ZSk6CisgICAgICAgIChydW5UZXN0cyk6CisgICAgICAgIChydW5UZXN0KToKKyAgICAgICAgKGNh
bGxiYWNrQW5kTmV4dFRlc3QuY2FsbGJhY2tXcmFwcGVyKToKKyAgICAgICAgKGNhbGxiYWNrQW5k
TmV4dFRlc3QpOgorICAgICAgICAqIGluc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXBhbmVs
Lmh0bWw6IEFkZGVkLgorICAgICAgICAqIGluc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXNp
ZGViYXIuaHRtbDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0vdGVzdF9leHBl
Y3RhdGlvbnMudHh0OgorCiAyMDEwLTA3LTI2ICBNYXJjdXMgQnVsYWNoICA8YnVsYWNoQGNocm9t
aXVtLm9yZz4KIAogICAgICAgICBVbnJldmlld2VkLiAgQWRkIGNocm9taXVtIGV4cGVjdGF0aW9u
cyBmb3IgZmFpbGluZyB0ZXN0cy4KSW5kZXg6IExheW91dFRlc3RzL2luc3BlY3Rvci9leHRlbnNp
b25zLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0
ZW5zaW9ucy1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9pbnNwZWN0
b3IvZXh0ZW5zaW9ucy1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjQgQEAK
K1Rlc3RzIFdlYkluc3BlY3RvciBleHRlbnNpb24gQVBJCisKK1N0YXJ0ZWQgZXh0ZW5zaW9uLgor
UnVubmluZyB0ZXN0cy4uLgorPj4+IHRlc3RfY3JlYXRlUGFuZWwKK2RvbmUgY3JlYXRlUGFuZWwK
K1BhbmVsIGNyZWF0ZWQKKz4+PiB0ZXN0X2NyZWF0ZVNpZGViYXIKK1NpZGViYXIgY3JlYXRlZAor
Pj4+IHRlc3RfY3JlYXRlU2lkZWJhck5vdFN1cHBvcnRlZAorU2lkZWJhciBjcmVhdGlvbiByZXN1
bHQ6IHsiY29kZSI6IkVfTk9UU1VQUE9SVEVEIiwiZGVzY3JpcHRpb24iOiJPYmplY3QgZG9lcyBu
b3Qgc3VwcG9ydCByZXF1ZXN0ZWQgb3BlcmF0aW9uICglcykiLCJkZXRhaWxzIjpbXSwiaXNFcnJv
ciI6dHJ1ZX0KKz4+PiB0ZXN0X2V2YWxOb25TdHJpbmcKK0V2YWx1YXRlOiBFdmFsdWF0aW9uIHJl
c3VsdCBpcyBub3QgYSBzdHJpbmcoZXhjZXB0aW9uOiB0cnVlKQorPj4+IHRlc3RfZXZhbFN0cmlu
ZworRXZhbHVhdGU6IGZvbyhleGNlcHRpb246IHVuZGVmaW5lZCkKKz4+PiB0ZXN0X2dldEFsbFJl
c291cmNlcworcmVzb3VyY2U6IC4uLi90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9yLXRlc3QuanMK
K3Jlc291cmNlOiAuLi4vTGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMuaHRtbAorPj4+
IHRlc3RfZ2V0SW52YWxpZFJlc291cmNlCitBdHRlbXB0ZWQgdG8gcmV0cmlldmUgaW52YWxpZCBy
ZXNvdXJjZTogeyJjb2RlIjoiRV9OT1RGT1VORCIsImRlc2NyaXB0aW9uIjoiT2JqZWN0IG5vdCBm
b3VuZCAoJXMpIiwiZGV0YWlscyI6WzIxMjg1MDZdLCJpc0Vycm9yIjp0cnVlfQorPj4+IHRlc3Rf
cmVzb3VyY2VOb3RpZmljYXRpb24KK1Jlc291cmNlIGNyZWF0ZWQ6IC4uLi9pbnNwZWN0b3IvcmVz
b3VyY2VzL2V4dGVuc2lvbi1tYWluLmh0bWwKK0FsbCB0ZXN0cyBkb25lLgorCkluZGV4OiBMYXlv
dXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1sCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL2luc3BlY3Rvci9leHRlbnNpb25zLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMzIEBA
Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uL2h0dHAvdGVzdHMvaW5zcGVjdG9yL2lu
c3BlY3Rvci10ZXN0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0
Ij4KKworZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgb3V0cHV0KG1lc3NhZ2UpOworfQor
Cit3aW5kb3cuaW5zcGVjdGVkU3RyaW5nVmFsdWUgPSAiZm9vIjsKK3dpbmRvdy5pbnNwZWN0ZWRJ
bnRWYWx1ZSA9IDQyOworCitmdW5jdGlvbiBmcm9udGVuZF9pbml0aWFsaXplRXh0ZW5zaW9uKHVy
bCkKK3sKKyAgICBpZiAoV2ViSW5zcGVjdG9yLnBhbmVscy5yZXNvdXJjZXMucmVzb3VyY2VUcmFj
a2luZ0VuYWJsZWQpCisgICAgICAgIFdlYkluc3BlY3Rvci5hZGRFeHRlbnNpb25zKFt7IHN0YXJ0
UGFnZTogdXJsIH1dKTsKKyAgICBlbHNlCisgICAgICAgIEluc3BlY3RvckJhY2tlbmQuZW5hYmxl
UmVzb3VyY2VUcmFja2luZyhmYWxzZSk7Cit9CisKK2Z1bmN0aW9uIGRvaXQoKQoreworICAgIHZh
ciBleHRlbnNpb25VUkwgPSBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1wvW14vXSokLywgIi9yZXNv
dXJjZXMvZXh0ZW5zaW9uLW1haW4uaHRtbCIpOworICAgIGV2YWx1YXRlSW5XZWJJbnNwZWN0b3Io
ImZyb250ZW5kX2luaXRpYWxpemVFeHRlbnNpb24oJyIgKyBleHRlbnNpb25VUkwgKyAiJykiKTsK
K30KKworPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keSBvbmxvYWQ9Im9ubG9hZCgpIj4KKzxwPlRl
c3RzIFdlYkluc3BlY3RvciBleHRlbnNpb24gQVBJPC9wPgorPC9ib2R5PgorPC9odG1sPgpJbmRl
eDogTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5odG1sCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLW1h
aW4uaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMv
ZXh0ZW5zaW9uLW1haW4uaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNCBAQAorPGh0bWw+
Cis8aGVhZD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK2Z1bmN0aW9uIGxvZyht
ZXNzYWdlKQoreworICAgIHdlYmluc3BlY3Rvci5pbnNwZWN0ZWRXaW5kb3cuZXZhbHVhdGUoImxv
Zyh1bmVzY2FwZSgnIiArIGVzY2FwZShtZXNzYWdlKSArICInKSk7Iik7Cit9CisKK2xvZygiU3Rh
cnRlZCBleHRlbnNpb24uIik7Cis8L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9ImV4dGVuc2lvbi1t
YWluLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2lu
c3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLW1haW4uanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0
VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5qcwkocmV2aXNpb24gMCkK
KysrIExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLW1haW4uanMJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsMTI4IEBACitmdW5jdGlvbiB0ZXN0X2V2YWxTdHJpbmcobmV4
dFRlc3QpCit7CisgICAgd2ViaW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgiaW5z
cGVjdGVkU3RyaW5nVmFsdWUiLCBjYWxsYmFja0FuZE5leHRUZXN0KG9uRXZhbHVhdGUsIG5leHRU
ZXN0KSk7Cit9CisKK2Z1bmN0aW9uIHRlc3RfZXZhbE5vblN0cmluZyhuZXh0VGVzdCkKK3sKKyAg
ICB3ZWJpbnNwZWN0b3IuaW5zcGVjdGVkV2luZG93LmV2YWx1YXRlKCJpbnNwZWN0ZWRJbnRWYWx1
ZSIsIGNhbGxiYWNrQW5kTmV4dFRlc3Qob25FdmFsdWF0ZSwgbmV4dFRlc3QpKTsKK30KKworZnVu
Y3Rpb24gdGVzdF9nZXRBbGxSZXNvdXJjZXMobmV4dFRlc3QpCit7CisgICAgZnVuY3Rpb24gY29t
cGFyZVJlc291cmNlcyhhLCBiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGEuaGFyLnJlcXVlc3Qu
dXJsLmxvY2FsZUNvbXBhcmUoYi5oYXIucmVxdWVzdC51cmwpOworICAgIH0KKworICAgIGZ1bmN0
aW9uIG9uUmVzb3VyY2UocmVzdWx0KQorICAgIHsKKyAgICAgICAgdmFyIHJlc291cmNlcyA9IHJl
c3VsdC5zb3J0KGNvbXBhcmVSZXNvdXJjZXMpOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgcmVzb3VyY2VzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgbG9nKCJyZXNvdXJjZTogIiAr
IHJlc291cmNlc1tpXS5oYXIucmVxdWVzdC51cmwucmVwbGFjZSgvLiooKFwvW14vXSopezN9JCkv
LCIuLi4kMSIpKTsKKyAgICB9CisgICAgd2ViaW5zcGVjdG9yLnJlc291cmNlcy5nZXRBbGwoY2Fs
bGJhY2tBbmROZXh0VGVzdChvblJlc291cmNlLCBuZXh0VGVzdCkpOworfQorCitmdW5jdGlvbiB0
ZXN0X2dldEludmFsaWRSZXNvdXJjZShuZXh0VGVzdCkKK3sKKyAgICBmdW5jdGlvbiBvblJlc291
cmNlKHJlc3VsdCkKKyAgICB7CisgICAgICAgIGxvZygiQXR0ZW1wdGVkIHRvIHJldHJpZXZlIGlu
dmFsaWQgcmVzb3VyY2U6ICIgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTsKKyAgICB9CisgICAg
d2ViaW5zcGVjdG9yLnJlc291cmNlcy5nZXQoMjEyODUwNiwgY2FsbGJhY2tBbmROZXh0VGVzdChv
blJlc291cmNlLCBuZXh0VGVzdCkpOworfQorCitmdW5jdGlvbiB0ZXN0X2NyZWF0ZVBhbmVsKG5l
eHRUZXN0KQoreworICAgIGZ1bmN0aW9uIG9uUGFuZWxDcmVhdGVkKCkKKyAgICB7CisgICAgICAg
IGxvZygiUGFuZWwgY3JlYXRlZCIpOworICAgIH0KKyAgICB3ZWJpbnNwZWN0b3IucGFuZWxzLmNy
ZWF0ZSgiVGVzdCBQYW5lbCIsICJleHRlbnNpb24tcGFuZWwuaHRtbCIsICJleHRlbnNpb24tcGFu
ZWwucG5nIiwgY2FsbGJhY2tBbmROZXh0VGVzdChvblBhbmVsQ3JlYXRlZCwgbmV4dFRlc3QpKTsK
KyAgICBsb2coImRvbmUgY3JlYXRlUGFuZWwiKTsKK30KKworZnVuY3Rpb24gdGVzdF9jcmVhdGVT
aWRlYmFyKG5leHRUZXN0KQoreworICAgIGZ1bmN0aW9uIG9uU2lkZWJhckNyZWF0ZWQoKQorICAg
IHsKKyAgICAgICAgbG9nKCJTaWRlYmFyIGNyZWF0ZWQiKTsKKyAgICB9CisgICAgd2ViaW5zcGVj
dG9yLnBhbmVscy5nZXQoImVsZW1lbnRzIikuY3JlYXRlU2lkZWJhclBhbmUoIlRlc3QgU2lkZWJh
ciIsICJleHRlbnNpb24tc2lkZWJhci5odG1sIiwgY2FsbGJhY2tBbmROZXh0VGVzdChvblNpZGVi
YXJDcmVhdGVkLCBuZXh0VGVzdCkpOworfQorCitmdW5jdGlvbiB0ZXN0X2NyZWF0ZVNpZGViYXJO
b3RTdXBwb3J0ZWQobmV4dFRlc3QpCit7CisgICAgZnVuY3Rpb24gb25TaWRlYmFyQ3JlYXRlZChy
ZXN1bHQpCisgICAgeworICAgICAgICBsb2coIlNpZGViYXIgY3JlYXRpb24gcmVzdWx0OiAiICsg
SlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7CisgICAgfQorICAgIHdlYmluc3BlY3Rvci5wYW5lbHMu
Y29uc29sZS5jcmVhdGVTaWRlYmFyUGFuZSgiVGVzdCBTaWRlYmFyIiwgImV4dGVuc2lvbi1zaWRl
YmFyLmh0bWwiLCBjYWxsYmFja0FuZE5leHRUZXN0KG9uU2lkZWJhckNyZWF0ZWQsIG5leHRUZXN0
KSk7Cit9CisKK2Z1bmN0aW9uIHRlc3RfcmVzb3VyY2VOb3RpZmljYXRpb24obmV4dFRlc3QpCit7
CisgICAgZnVuY3Rpb24gb25SZXNvdXJjZUNyZWF0ZWQocmVzb3VyY2UpCisgICAgeworICAgICAg
ICBsb2coIlJlc291cmNlIGNyZWF0ZWQ6ICIgKyByZXNvdXJjZS5oYXIucmVxdWVzdC51cmwucmVw
bGFjZSgvLiooKFwvW14vXSopezN9JCkvLCIuLi4kMSIpKTsKKyAgICB9CisKKyAgICB3ZWJpbnNw
ZWN0b3IucmVzb3VyY2VzLm9uQ3JlYXRlZC5hZGRMaXN0ZW5lcihjYWxsYmFja0FuZE5leHRUZXN0
KG9uUmVzb3VyY2VDcmVhdGVkLCBuZXh0VGVzdCkpOworICAgIHdlYmluc3BlY3Rvci5pbnNwZWN0
ZWRXaW5kb3cuZXZhbHVhdGUoInZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgeGhyLm9w
ZW4oJ0dFVCcsICciICsgbG9jYXRpb24uaHJlZiArICInLCBmYWxzZSk7IHhoci5zZW5kKG51bGwp
OycnIik7Cit9CisKK2Z1bmN0aW9uIG9uRXZhbHVhdGUocmVzdWx0KQoreworICAgIGxvZygiRXZh
bHVhdGU6ICIgKyByZXN1bHQudmFsdWUgKyAiKGV4Y2VwdGlvbjogIiArIHJlc3VsdC5pc0V4Y2Vw
dGlvbiArICIpIik7Cit9CisKK2Z1bmN0aW9uIG9uVGVzdHNEb25lKCkKK3sKKyAgICBsb2coIkFs
bCB0ZXN0cyBkb25lLiIpOworICAgIHdlYmluc3BlY3Rvci5pbnNwZWN0ZWRXaW5kb3cuZXZhbHVh
dGUoIm5vdGlmeURvbmUoKTsiKTsKK30KKworZnVuY3Rpb24gcnVuVGVzdHMoKQoreworICAgIGxv
ZygiUnVubmluZyB0ZXN0cy4uLiIpOworICAgIHZhciB0ZXN0cyA9IFtdOworICAgIGZvciAodmFy
IHN5bWJvbCBpbiB0aGlzKSB7CisgICAgICAgIGlmICgvXnRlc3RfLy5leGVjKHN5bWJvbCkgJiYg
dHlwZW9mIHRoaXNbc3ltYm9sXSA9PT0gImZ1bmN0aW9uIikKKyAgICAgICAgICAgIHRlc3RzLnB1
c2goc3ltYm9sKTsKKyAgICB9CisgICAgdGVzdHMgPSB0ZXN0cy5zb3J0KCk7CisgICAgdmFyIHRl
c3RDaGFpbiA9IG9uVGVzdHNEb25lOworICAgIGZvciAodmFyIHRlc3QgPSB0ZXN0cy5wb3AoKTsg
dGVzdDsgdGVzdCA9IHRlc3RzLnBvcCgpKQorICAgICAgICB0ZXN0Q2hhaW4gPSBiaW5kKHJ1blRl
c3QsIHRoaXMsIGJpbmQodGhpc1t0ZXN0XSwgdGhpcywgdGVzdENoYWluKSwgdGVzdCk7CisgICAg
dGVzdENoYWluKCk7Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3QodGVzdCwgbmFtZSkKK3sKKyAgICBs
b2coIj4+PiAiICsgbmFtZSk7CisgICAgdHJ5IHsKKyAgICAgICAgdGVzdCgpOworICAgIH0gY2F0
Y2ggKGUpIHsKKyAgICAgICAgbG9nKG5hbWUgKyAiOiAiICsgZSk7CisgICAgfQorfQorCitmdW5j
dGlvbiBjYWxsYmFja0FuZE5leHRUZXN0KGNhbGxiYWNrLCBuZXh0VGVzdCkKK3sKKyAgICBmdW5j
dGlvbiBjYWxsYmFja1dyYXBwZXIoKSAKKyAgICB7CisgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisgICAgICAgIG5leHRUZXN0LmNhbGwodGhpcyk7CisgICAgfQorICAg
IHJldHVybiBjYWxsYmFja1dyYXBwZXI7Cit9CisKK2Z1bmN0aW9uIGJpbmQoZnVuYywgdGhpc09i
amVjdCkKK3sKKyAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMik7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gZnVuYy5hcHBseSh0aGlz
T2JqZWN0LCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMs
IDApKSk7IH07Cit9CisKK3J1blRlc3RzKCk7CkluZGV4OiBMYXlvdXRUZXN0cy9pbnNwZWN0b3Iv
cmVzb3VyY2VzL2V4dGVuc2lvbi1wYW5lbC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3Rz
L2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXBhbmVsLmh0bWwJKHJldmlzaW9uIDApCisr
KyBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1wYW5lbC5odG1sCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIgQEAKKzxodG1sPgorPC9odG1sPgpJbmRleDogTGF5b3V0
VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tc2lkZWJhci5odG1sCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXNpZGViYXIu
aHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0
ZW5zaW9uLXNpZGViYXIuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyIEBACis8aHRtbD4K
KzwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtL3Rlc3RfZXhwZWN0
YXRpb25zLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS90
ZXN0X2V4cGVjdGF0aW9ucy50eHQJKHJldmlzaW9uIDY0MDM0KQorKysgTGF5b3V0VGVzdHMvcGxh
dGZvcm0vY2hyb21pdW0vdGVzdF9leHBlY3RhdGlvbnMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0x
OTgsNiArMTk4LDcgQEAgV09OVEZJWCBTS0lQIDogZmFzdC9ldmVudHMvbWVzc2FnZS1wb3J0LQog
V09OVEZJWCBTS0lQIDogZmFzdC9ldmVudHMvbWVzc2FnZS1wb3J0Lmh0bWwgPSBGQUlMCiBXT05U
RklYIFNLSVAgOiBmYXN0L2V2ZW50cy9tZXNzYWdlLXBvcnQtbXVsdGkuaHRtbCA9IEZBSUwKIFdP
TlRGSVggU0tJUCA6IGh0dHAvdGVzdHMvc2VjdXJpdHkvTWVzc2FnZVBvcnQvZXZlbnQtbGlzdGVu
ZXItY29udGV4dC5odG1sID0gRkFJTAorV09OVEZJWCBTS0lQIDogaW5zcGVjdG9yL2V4dGVuc2lv
bnMuaHRtbCA9IEZBSUwKIAogLy8gSW1wbGVtZW50IGphdmEgdGVzdGluZyBoYXJuZXNzLgogQlVH
MzY2ODEgREVGRVIgU0tJUCA6IGphdmEgPSBURVhUCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62568</attachid>
            <date>2010-07-26 07:12:34 -0700</date>
            <delta_ts>2010-07-28 10:14:03 -0700</delta_ts>
            <desc>patch (EOLs fixed)</desc>
            <filename>extensions.patch</filename>
            <type>text/plain</type>
            <size>54219</size>
            <attacher name="Andrey Kosyakov">caseq</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDA0MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTA3IEBACisyMDEwLTA3LTI2ICBBbmRyZXkgS29zeWFrb3YgIDxjYXNlcUBjaHJv
bWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgV2ViIEluc3BlY3RvcjogYmFzaWMgc3VwcG9ydCBvZiBXZWJJbnNwZWN0b3IgZXh0ZW5zaW9u
cyBBUEkuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00
MDQyNQorICAgICAgICBUZXN0OiBpbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1sCisKKyAgICAgICAg
KiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2o6
CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6SW5zcGVjdG9yQ29udHJvbGxlcjo6aW5zcGVjdGVkV2luZG93U2NyaXB0T2JqZWN0
Q2xlYXJlZCk6CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JDb250cm9sbGVyOjpkaWRDb21t
aXRMb2FkKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckZyb250ZW5kSG9zdDo6c2V0RXh0ZW5zaW9uQVBJ
KToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0Lmg6CisgICAgICAg
ICogaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9zdC5pZGw6CisgICAgICAgICogaW5zcGVj
dG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkVs
ZW1lbnRzUGFuZWwudGhpcy50cmVlT3V0bGluZS5mb2N1c2VkTm9kZUNoYW5nZWQpOgorICAgICAg
ICAoV2ViSW5zcGVjdG9yLkVsZW1lbnRzUGFuZWwpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9u
dC1lbmQvRXh0ZW5zaW9uQVBJLmpzOiBBZGRlZC4KKyAgICAgICAgKGV4dGVuc2lvbkFQSSk6Cisg
ICAgICAgIChleHRlbnNpb25BUEkuRXZlbnRTaW5rLnByb3RvdHlwZS5hZGRMaXN0ZW5lcik6Cisg
ICAgICAgIChleHRlbnNpb25BUEkuRXZlbnRTaW5rLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcik6
CisgICAgICAgIChleHRlbnNpb25BUEkuRXZlbnRTaW5rLnByb3RvdHlwZS5fZmlyZSk6CisgICAg
ICAgIChleHRlbnNpb25BUEkuSW5zcGVjdG9yRXh0ZW5zaW9uQVBJKToKKyAgICAgICAgKGV4dGVu
c2lvbkFQSS5JbnNwZWN0b3JFeHRlbnNpb25BUEkucHJvdG90eXBlLmxvZyk6CisgICAgICAgIChl
eHRlbnNpb25BUEkuUmVzb3VyY2VzLnByb3RvdHlwZS5nZXRBbGwpOgorICAgICAgICAoZXh0ZW5z
aW9uQVBJLlJlc291cmNlcy5wcm90b3R5cGUuZ2V0IHJldHVybik6CisgICAgICAgIChleHRlbnNp
b25BUEkuUmVzb3VyY2VzLnByb3RvdHlwZSk6CisgICAgICAgIChleHRlbnNpb25BUEkuZ2V0IFBh
bmVscy5wcm90b3R5cGUuY3JlYXRlLmNhbGxiYWNrV3JhcHBlcik6CisgICAgICAgIChleHRlbnNp
b25BUEkuZ2V0IFBhbmVscy5wcm90b3R5cGUuY3JlYXRlKToKKyAgICAgICAgKGV4dGVuc2lvbkFQ
SS5QYW5lbC5wcm90b3R5cGUuY3JlYXRlU2lkZWJhclBhbmUuY2FsbGJhY2tXcmFwcGVyKToKKyAg
ICAgICAgKGV4dGVuc2lvbkFQSS5QYW5lbC5wcm90b3R5cGUuY3JlYXRlU2lkZWJhclBhbmUpOgor
ICAgICAgICAoZXh0ZW5zaW9uQVBJLkV4dGVuc2lvblNpZGViYXJQYW5lKToKKyAgICAgICAgKGV4
dGVuc2lvbkFQSS5FeHRlbnNpb25TaWRlYmFyUGFuZS5wcm90b3R5cGUuc2V0SGVpZ2h0KToKKyAg
ICAgICAgKGV4dGVuc2lvbkFQSS5FeHRlbnNpb25TaWRlYmFyUGFuZS5wcm90b3R5cGUuc2V0RXhw
YW5zaW9uKToKKyAgICAgICAgKGV4dGVuc2lvbkFQSS5JbnNwZWN0ZWRXaW5kb3cucHJvdG90eXBl
LnJlbG9hZCk6CisgICAgICAgIChleHRlbnNpb25BUEkuSW5zcGVjdGVkV2luZG93LnByb3RvdHlw
ZS5ldmFsdWF0ZSk6CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVyQ2xpZW50
LnByb3RvdHlwZS5zZW5kUmVxdWVzdCk6CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0ZW5zaW9u
U2VydmVyQ2xpZW50LnByb3RvdHlwZS5yZWdpc3RlckhhbmRsZXIpOgorICAgICAgICAoZXh0ZW5z
aW9uQVBJLkV4dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5cGUuZ2V0IG5leHRPYmplY3RJZCk6
CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZS5f
cmVnaXN0ZXJDYWxsYmFjayk6CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVy
Q2xpZW50LnByb3RvdHlwZS5fb25DYWxsYmFjayk6CisgICAgICAgIChleHRlbnNpb25BUEkuRXh0
ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZS5fb25NZXNzYWdlKToKKyAgICAgICAgKGV4dGVu
c2lvbkFQSS5leHBhbmRVUkwpOgorICAgICAgICAoZXh0ZW5zaW9uQVBJLik6CisgICAgICAgICog
aW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25QYW5lbC5qczogQWRkZWQuCisgICAgICAgIChX
ZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVu
c2lvblBhbmVsLnByb3RvdHlwZS5nZXQgZGVmYXVsdEZvY3VzZWRFbGVtZW50KToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5wcm90b3R5cGUudXBkYXRlTWFpblZpZXdXaWR0
aCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlLnNlYXJj
aENhbmNlbGVkKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5wcm90b3R5
cGUucGVyZm9ybVNlYXJjaCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwu
cHJvdG90eXBlLmp1bXBUb05leHRTZWFyY2hSZXN1bHQpOgorICAgICAgICAoV2ViSW5zcGVjdG9y
LkV4dGVuc2lvblBhbmVsLnByb3RvdHlwZS5qdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdCk6Cisg
ICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlLl9hZGRTdHlsZVJ1
bGUpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0cnlTdHVi
LmpzOiBBZGRlZC4KKyAgICAgICAgKC5XZWJJbnNwZWN0b3IuSW5zcGVjdG9yRXh0ZW5zaW9uUmVn
aXN0cnlTdHViKToKKyAgICAgICAgKC5XZWJJbnNwZWN0b3IuSW5zcGVjdG9yRXh0ZW5zaW9uUmVn
aXN0cnlTdHViLnByb3RvdHlwZS5nZXRFeHRlbnNpb25zKToKKyAgICAgICAgKiBpbnNwZWN0b3Iv
ZnJvbnQtZW5kL0V4dGVuc2lvblNlcnZlci5qczogQWRkZWQuCisgICAgICAgIChXZWJJbnNwZWN0
b3IuRXh0ZW5zaW9uU2VydmVyKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2
ZXIucHJvdG90eXBlLm5vdGlmeVBhbmVsU2hvd24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4
dGVuc2lvblNlcnZlci5wcm90b3R5cGUubm90aWZ5T2JqZWN0U2VsZWN0ZWQpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUubm90aWZ5T2JqZWN0Q3JlYXRl
ZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5ub3Rp
ZnlTZWFyY2hBY3Rpb24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5w
cm90b3R5cGUucG9zdEV2ZW50KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2
ZXIucHJvdG90eXBlLmNvbnZlcnRSZXNvdXJjZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0
ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fcG9zdE5vdGlmaWNhdGlvbik6CisgICAgICAgIChXZWJJ
bnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25TdWJzY3JpYmUpOgorICAgICAg
ICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uVW5zdWJzY3JpYmUp
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uQ3Jl
YXRlUGFuZWwpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5
cGUuX29uQ3JlYXRlU2lkZWJhcik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2Vy
dmVyLnByb3RvdHlwZS5fY3JlYXRlQ2xpZW50SWZyYW1lKToKKyAgICAgICAgKFdlYkluc3BlY3Rv
ci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vblNldFNpZGViYXJIZWlnaHQpOgorICAgICAg
ICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uU2V0U2lkZWJhckV4
cGFuc2lvbik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlw
ZS5fb25Mb2cpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5
cGUuX29uRXZhbHVhdGVPbkluc3BlY3RlZFBhZ2UpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4
dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uUmV2ZWFsQW5kU2VsZWN0KToKKyAgICAgICAgKFdl
Ykluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vblJldmVhbEFuZFNlbGVjdFJl
c291cmNlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBl
Ll9kaXNwYXRjaENhbGxiYWNrKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2
ZXIucHJvdG90eXBlLl9vbkdldFJlc291cmNlcyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0
ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5pbml0RXh0ZW5zaW9ucyk6CisgICAgICAgIChXZWJJbnNw
ZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5hZGRFeHRlbnNpb25zKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9hZGRFeHRlbnNpb24pOgor
ICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uV2luZG93
TWVzc2FnZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlw
ZS5fb25tZXNzYWdlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJv
dG90eXBlLl9yZWdpc3RlckhhbmRsZXIpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lv
blNlcnZlci5wcm90b3R5cGUuX3N0YXR1cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5z
aW9uU3RhdHVzKToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVkU2NyaXB0
LmpzOgorICAgICAgICAoaW5qZWN0ZWRTY3JpcHRDb25zdHJ1Y3Rvcik6CisgICAgICAgICogaW5z
cGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdEFjY2Vzcy5qczoKKyAgICAgICAgKiBpbnNw
ZWN0b3IvZnJvbnQtZW5kL0luc3BlY3RvckZyb250ZW5kSG9zdFN0dWIuanM6CisgICAgICAgICgu
V2ViSW5zcGVjdG9yLkluc3BlY3RvckZyb250ZW5kSG9zdFN0dWIucHJvdG90eXBlLnNldEV4dGVu
c2lvbkFQSSk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbDoK
KyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5qczoKKyAgICAgICAgKFdl
Ykluc3BlY3Rvci5sb2FkZWQpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLnVwZGF0ZVJlc291cmNl
KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5wYXJzZWRTY3JpcHRTb3VyY2UpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLnJlc2V0KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5pbnNwZWN0ZWRVUkxD
aGFuZ2VkKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5kaWRDb21taXRMb2FkKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5hZGRFeHRlbnNpb25zKToKKwogMjAxMC0wNy0yNiAgU2F0aXNoIFNhbXBh
dGggIDxzYXRpc2hAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFN0ZXZlIEJs
b2NrLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9X
ZWJDb3JlLmd5cGkJKHJldmlzaW9uIDY0MDM0KQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdv
cmtpbmcgY29weSkKQEAgLTQwMTgsNiArNDAxOCwxMCBAQAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9mcm9udC1lbmQvRWxlbWVudHNQYW5lbC5qcycsCiAgICAgICAgICAgICAnaW5zcGVjdG9yL2Zy
b250LWVuZC9FbGVtZW50c1RyZWVPdXRsaW5lLmpzJywKICAgICAgICAgICAgICdpbnNwZWN0b3Iv
ZnJvbnQtZW5kL0V2ZW50TGlzdGVuZXJzU2lkZWJhclBhbmUuanMnLAorICAgICAgICAgICAgJ2lu
c3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uQVBJLmpzJywKKyAgICAgICAgICAgICdpbnNwZWN0
b3IvZnJvbnQtZW5kL0V4dGVuc2lvblBhbmVsLmpzJywKKyAgICAgICAgICAgICdpbnNwZWN0b3Iv
ZnJvbnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5qcycsCisgICAgICAgICAgICAnaW5zcGVj
dG9yL2Zyb250LWVuZC9FeHRlbnNpb25TZXJ2ZXIuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9mcm9udC1lbmQvRm9udFZpZXcuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1l
bmQvSEFSRW50cnkuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQvSGVscFNj
cmVlbi5qcycsCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlz
aW9uIDY0MDM0KQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29y
a2luZyBjb3B5KQpAQCAtNTA3MTIsNiArNTA3MTIsMjIgQEAKIAkJCQkJPg0KIAkJCQk8L0ZpbGU+
DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRc
RXh0ZW5zaW9uQVBJLmpzIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQorCQkJ
CQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRcRXh0ZW5zaW9uUGFuZWwuanMi
DQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0i
Li5caW5zcGVjdG9yXGZyb250LWVuZFxFeHRlbnNpb25SZWdpc3RyeVN0dWIuanMiDQorCQkJCQk+
DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVj
dG9yXGZyb250LWVuZFxFeHRlbnNpb25TZXJ2ZXIuanMiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4N
CisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVuZFxG
b250Vmlldy5qcyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KSW5kZXg6IFdlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiA2NDAzNCkKKysrIFdlYkNvcmUv
aW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NTgs
NiArNDU4LDE0IEBAIHZvaWQgSW5zcGVjdG9yQ29udHJvbGxlcjo6aW5zcGVjdGVkV2luZG8KICAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENsaWVudCAmJiBmcmFtZSA9PSBtX2luc3BlY3RlZFBh
Z2UtPm1haW5GcmFtZSgpKQogICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2xpZW50LT53aW5k
b3dPYmplY3RDbGVhcmVkKCk7CiAKKyAgICBpZiAobV9zY3JpcHRzVG9FdmFsdWF0ZU9uTG9hZC5z
aXplKCkpIHsKKyAgICAgICAgU2NyaXB0U3RhdGUqIHNjcmlwdFN0YXRlID0gbWFpbldvcmxkU2Ny
aXB0U3RhdGUoZnJhbWUpOworICAgICAgICBmb3IgKFZlY3RvcjxTdHJpbmc+OjppdGVyYXRvciBp
dCA9IG1fc2NyaXB0c1RvRXZhbHVhdGVPbkxvYWQuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAh
PSBtX3NjcmlwdHNUb0V2YWx1YXRlT25Mb2FkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBt
X2luamVjdGVkU2NyaXB0SG9zdC0+aW5qZWN0U2NyaXB0KCppdCwgc2NyaXB0U3RhdGUpOworICAg
ICAgICB9CisgICAgfQorCiAgICAgaWYgKCFlbmFibGVkKCkgfHwgIW1fZnJvbnRlbmQgfHwgZnJh
bWUgIT0gbV9pbnNwZWN0ZWRQYWdlLT5tYWluRnJhbWUoKSkKICAgICAgICAgcmV0dXJuOwogICAg
IG1faW5qZWN0ZWRTY3JpcHRIb3N0LT5kaXNjYXJkSW5qZWN0ZWRTY3JpcHRzKCk7CkBAIC04MDIs
MTQgKzgxMCw2IEBAIHZvaWQgSW5zcGVjdG9yQ29udHJvbGxlcjo6ZGlkQ29tbWl0TG9hZCgKICAg
ICBmb3IgKEZyYW1lKiBmcmFtZSA9IGxvYWRlci0+ZnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJh
bWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KGxvYWRlci0+ZnJhbWUoKSkpCiAgICAgICAgIGlmIChS
ZXNvdXJjZXNNYXAqIHJlc291cmNlTWFwID0gbV9mcmFtZVJlc291cmNlcy5nZXQoZnJhbWUpKQog
ICAgICAgICAgICAgcHJ1bmVSZXNvdXJjZXMocmVzb3VyY2VNYXAsIGxvYWRlcik7Ci0KLSAgICBp
ZiAobV9zY3JpcHRzVG9FdmFsdWF0ZU9uTG9hZC5zaXplKCkpIHsKLSAgICAgICAgU2NyaXB0U3Rh
dGUqIHNjcmlwdFN0YXRlID0gbWFpbldvcmxkU2NyaXB0U3RhdGUobG9hZGVyLT5mcmFtZSgpKTsK
LSAgICAgICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBtX3NjcmlwdHNUb0V2
YWx1YXRlT25Mb2FkLmJlZ2luKCk7Ci0gICAgICAgICAgICAgaXQgIT0gbV9zY3JpcHRzVG9FdmFs
dWF0ZU9uTG9hZC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgbV9pbmplY3RlZFNjcmlwdEhv
c3QtPmluamVjdFNjcmlwdCgqaXQsIHNjcmlwdFN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KIH0K
IAogdm9pZCBJbnNwZWN0b3JDb250cm9sbGVyOjpmcmFtZURldGFjaGVkRnJvbVBhcmVudChGcmFt
ZSogZnJhbWUpCkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3Qu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9z
dC5jcHAJKHJldmlzaW9uIDY0MDM0KQorKysgV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJv
bnRlbmRIb3N0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTkyLDYgKzE5MiwxNCBAQCB2b2lkIElu
c3BlY3RvckZyb250ZW5kSG9zdDo6bW92ZVdpbmRvd0J5CiAgICAgICAgIG1fY2xpZW50LT5tb3Zl
V2luZG93QnkoeCwgeSk7CiB9CiAKK3ZvaWQgSW5zcGVjdG9yRnJvbnRlbmRIb3N0OjpzZXRFeHRl
bnNpb25BUEkoY29uc3QgU3RyaW5nJiBzY3JpcHQpCit7CisgICAgSW5zcGVjdG9yQ29udHJvbGxl
ciogaW5zcGVjdG9yID0gbV9mcm9udGVuZFBhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKTsKKwor
ICAgIGluc3BlY3Rvci0+cmVtb3ZlQWxsU2NyaXB0c1RvRXZhbHVhdGVPbkxvYWQoKTsKKyAgICBp
bnNwZWN0b3ItPmFkZFNjcmlwdFRvRXZhbHVhdGVPbkxvYWQoc2NyaXB0KTsKK30KKwogU3RyaW5n
IEluc3BlY3RvckZyb250ZW5kSG9zdDo6bG9jYWxpemVkU3RyaW5nc1VSTCgpCiB7CiAgICAgcmV0
dXJuIG1fY2xpZW50LT5sb2NhbGl6ZWRTdHJpbmdzVVJMKCk7CkluZGV4OiBXZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAkocmV2aXNpb24gNjQwMzQpCisrKyBXZWJDb3Jl
L2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAkod29ya2luZyBjb3B5KQpAQCAtNjcs
NiArNjcsNyBAQCBwdWJsaWM6CiAKICAgICB2b2lkIHNldEF0dGFjaGVkV2luZG93SGVpZ2h0KHVu
c2lnbmVkIGhlaWdodCk7CiAgICAgdm9pZCBtb3ZlV2luZG93QnkoZmxvYXQgeCwgZmxvYXQgeSkg
Y29uc3Q7CisgICAgdm9pZCBzZXRFeHRlbnNpb25BUEkoY29uc3QgU3RyaW5nJiBzY3JpcHQpOwog
CiAgICAgU3RyaW5nIGxvY2FsaXplZFN0cmluZ3NVUkwoKTsKICAgICBTdHJpbmcgaGlkZGVuUGFu
ZWxzKCk7CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaWRs
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9zdC5p
ZGwJKHJldmlzaW9uIDY0MDM0KQorKysgV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRl
bmRIb3N0LmlkbAkod29ya2luZyBjb3B5KQpAQCAtNDEsNiArNDEsNyBAQCBtb2R1bGUgY29yZSB7
CiAgICAgICAgIHZvaWQgcmVxdWVzdERldGFjaFdpbmRvdygpOwogICAgICAgICB2b2lkIHNldEF0
dGFjaGVkV2luZG93SGVpZ2h0KGluIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KTsKICAgICAgICAgdm9p
ZCBtb3ZlV2luZG93QnkoaW4gZmxvYXQgeCwgaW4gZmxvYXQgeSk7CisgICAgICAgIHZvaWQgc2V0
RXh0ZW5zaW9uQVBJKGluIERPTVN0cmluZyBzY3JpcHQpOwogCiAgICAgICAgIERPTVN0cmluZyBs
b2NhbGl6ZWRTdHJpbmdzVVJMKCk7CiAgICAgICAgIERPTVN0cmluZyBoaWRkZW5QYW5lbHMoKTsK
SW5kZXg6IFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzCShy
ZXZpc2lvbiA2NDAzNCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1Bh
bmVsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC01Niw4ICs1NiwxMCBAQCBXZWJJbnNwZWN0b3IuRWxl
bWVudHNQYW5lbCA9IGZ1bmN0aW9uKCkKICAgICAgICAgdGhpcy5wYW5lbC51cGRhdGVQcm9wZXJ0
aWVzKCk7CiAgICAgICAgIHRoaXMucGFuZWwudXBkYXRlRXZlbnRMaXN0ZW5lcnMoKTsKIAotICAg
ICAgICBpZiAodGhpcy5fZm9jdXNlZERPTU5vZGUpCisgICAgICAgIGlmICh0aGlzLl9mb2N1c2Vk
RE9NTm9kZSkgewogICAgICAgICAgICAgSW5zcGVjdG9yQmFja2VuZC5hZGRJbnNwZWN0ZWROb2Rl
KHRoaXMuX2ZvY3VzZWRET01Ob2RlLmlkKTsKKyAgICAgICAgICAgIFdlYkluc3BlY3Rvci5leHRl
bnNpb25TZXJ2ZXIubm90aWZ5T2JqZWN0U2VsZWN0ZWQoImVsZW1lbnRzIiwgIkRPTU5vZGUiKTsK
KyAgICAgICAgfQogICAgIH07CiAKICAgICB0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxk
KHRoaXMudHJlZU91dGxpbmUuZWxlbWVudCk7CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9mcm9u
dC1lbmQvRXh0ZW5zaW9uQVBJLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zy
b250LWVuZC9FeHRlbnNpb25BUEkuanMJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvRXh0ZW5zaW9uQVBJLmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI5OSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0
aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
CisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJ
bmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
K3ZhciBleHRlbnNpb25BUEkgPSBmdW5jdGlvbihJbmplY3RlZFNjcmlwdEhvc3QsIGluc3BlY3Rl
ZFdpbmRvdywgaW5qZWN0ZWRTY3JpcHRJZCkKK3sKKworZnVuY3Rpb24gRXZlbnRTaW5rKHR5cGUp
Cit7CisgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgdGhpcy5fbGlzdGVuZXJzID0gW107Cit9
CisKK0V2ZW50U2luay5wcm90b3R5cGUgPSB7CisgICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKGNh
bGxiYWNrKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPT09IDAp
CisgICAgICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21tYW5kOiAic3Vi
c2NyaWJlIiwgdHlwZTogdGhpcy5fdHlwZSB9KTsKKyAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1
c2goY2FsbGJhY2spOworICAgICAgICBleHRlbnNpb25TZXJ2ZXIucmVnaXN0ZXJIYW5kbGVyKCJu
b3RpZnktIiArIHRoaXMuX3R5cGUsIGJpbmQodGhpcy5fZmlyZSwgdGhpcykpOworICAgIH0sCisK
KyAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24oY2FsbGJhY2spCisgICAgeworICAgICAgICB2
YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOworCisgICAgICAgIGZvciAodmFyIGkgPSAw
OyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAobGlzdGVuZXJz
W2ldID09PSBjYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tpXSA9IGxpc3Rl
bmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnBv
cCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnMubGVuZ3RoID09PSAwKQorICAgICAgICAgICAgZXh0
ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogInVuc3Vic2NyaWJlIiwgdHlwZTog
dGhpcy5fdHlwZSB9KTsKKyAgICB9LAorCisgICAgX2ZpcmU6IGZ1bmN0aW9uKHJlcXVlc3QpCisg
ICAgeworICAgICAgICBmb3IgKGxpc3RlbmVyIGluIHRoaXMuX2xpc3RlbmVycykKKyAgICAgICAg
ICAgIHRoaXMuX2xpc3RlbmVyc1tsaXN0ZW5lcl0uYXBwbHkobnVsbCwgcmVxdWVzdC5hcmd1bWVu
dHMpOworICAgIH0KK307CisKK2Z1bmN0aW9uIEluc3BlY3RvckV4dGVuc2lvbkFQSSgpCit7Cisg
ICAgdGhpcy5pbnNwZWN0ZWRXaW5kb3cgPSBuZXcgSW5zcGVjdGVkV2luZG93KCk7CisgICAgdGhp
cy5wYW5lbHMgPSBuZXcgUGFuZWxzKCk7CisgICAgdGhpcy5yZXNvdXJjZXMgPSBuZXcgUmVzb3Vy
Y2VzKCk7CisgICAgdGhpcy5vblJlc2V0ID0gbmV3IEV2ZW50U2luaygicmVzZXQiKTsKK30KKwor
SW5zcGVjdG9yRXh0ZW5zaW9uQVBJLnByb3RvdHlwZSA9IHsKKyAgICBsb2c6IGZ1bmN0aW9uKG1l
c3NhZ2UpCisgICAgeworICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21t
YW5kOiAibG9nIiwgbWVzc2FnZTogbWVzc2FnZSB9KTsKKyAgICB9Cit9OworCitmdW5jdGlvbiBS
ZXNvdXJjZXMoKQoreworICAgIHRoaXMub25DcmVhdGVkID0gbmV3IEV2ZW50U2luaygiY3JlYXRl
ZC1yZXNvdXJjZSIpOworfQorCitSZXNvdXJjZXMucHJvdG90eXBlID0geworICAgIGdldEFsbDog
ZnVuY3Rpb24oY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gZXh0ZW5zaW9uU2VydmVy
LnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogImdldFJlc291cmNlcyIgfSwgY2FsbGJhY2spOworICAg
IH0sCisKKyAgICBnZXQ6IGZ1bmN0aW9uKGlkLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJl
dHVybiBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21tYW5kOiAiZ2V0UmVzb3VyY2Vz
IiwgaWQ6IGlkIH0sIGNhbGxiYWNrKTsKKyAgICB9Cit9OworCit2YXIgd2VsbEtub3duUGFuZWxO
YW1lcyA9IFsKKyAgICAiZWxlbWVudHMiLAorICAgICJyZXNvdXJjZXMiLAorICAgICJzY3JpcHRz
IiwKKyAgICAidGltZWxpbmUiLAorICAgICJwcm9maWxlcyIsCisgICAgInN0b3JhZ2UiLAorICAg
ICJhdWRpdHMiLAorICAgICJjb25zb2xlIgorXTsKKworZnVuY3Rpb24gUGFuZWxzKCkKK3sKKyAg
ICB0aGlzLl9wYW5lbHMgPSBbXTsKKyAgICB2YXIgdGhhdCA9IHRoaXM7CisgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCB3ZWxsS25vd25QYW5lbE5hbWVzLmxlbmd0aDsgKytpKQorICAgICAgICB0aGlz
Ll9fZGVmaW5lR2V0dGVyX18od2VsbEtub3duUGFuZWxOYW1lc1tpXSwgYmluZCh0aGlzLmdldCwg
dGhpcywgd2VsbEtub3duUGFuZWxOYW1lc1tpXSkpOworfQorCitQYW5lbHMucHJvdG90eXBlID0g
eworICAgIGdldDogZnVuY3Rpb24oaWQpCisgICAgeworICAgICAgICBpZiAodGhpcy5fcGFuZWxz
W2lkXSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYW5lbHNbaWRdOworCisgICAgICAgIHZh
ciBwYW5lbCA9IG5ldyBQYW5lbChpZCk7CisgICAgICAgIHRoaXMuX3BhbmVsc1tpZF0gPSBwYW5l
bDsKKyAgICAgICAgcmV0dXJuIHBhbmVsOworICAgIH0sCisKKyAgICBjcmVhdGU6IGZ1bmN0aW9u
KGxhYmVsLCBwYWdlVVJMLCBpY29uVVJMLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHZhciBp
ZCA9ICJleHRlbnNpb24tcGFuZWwtIiArIGV4dGVuc2lvblNlcnZlci5uZXh0T2JqZWN0SWQ7Cisg
ICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrV3JhcHBlcihyZXN1bHQpCisgICAgICAgIHsKKyAgICAg
ICAgICAgIGlmIChyZXN1bHQuaXNFcnJvcikKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXN1
bHQpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcGFuZWwgPSBuZXcgRXh0
ZW5zaW9uUGFuZWwoaWQpOworICAgICAgICAgICAgICAgIHRoaXMuX3BhbmVsc1twYW5lbC5pZF0g
PSBwYW5lbDsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhwYW5lbCk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFu
ZDogImNyZWF0ZVBhbmVsIiwgaWQ6IGlkLCBsYWJlbDogbGFiZWwsIHVybDogZXhwYW5kVVJMKHBh
Z2VVUkwpLCBpY29uOiBleHBhbmRVUkwoaWNvblVSTCkgfSwgY2FsbGJhY2sgJiYgYmluZChjYWxs
YmFja1dyYXBwZXIsIHRoaXMpKTsKKyAgICB9Cit9OworCitmdW5jdGlvbiBQYW5lbChpZCkKK3sK
KyAgICB0aGlzLl9pZCA9IGlkOworICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkID0gbmV3IEV2
ZW50U2luaygicGFuZWwtb2JqZWN0U2VsZWN0ZWQtIiArIGlkKTsKK30KKworUGFuZWwucHJvdG90
eXBlID0geworICAgIGNyZWF0ZVNpZGViYXJQYW5lOiBmdW5jdGlvbih0aXRsZSwgdXJsLCBjYWxs
YmFjaykKKyAgICB7CisgICAgICAgIHZhciBpZCA9ICJleHRlbnNpb24tc2lkZWJhci0iICsgZXh0
ZW5zaW9uU2VydmVyLm5leHRPYmplY3RJZDsKKyAgICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFw
cGVyKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0Vycm9yKQor
ICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7CisgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgY2FsbGJhY2sobmV3IEV4dGVuc2lvblNpZGViYXJQYW5lKGlkKSk7CisgICAg
ICAgIH0KKyAgICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogImNy
ZWF0ZVNpZGViYXJQYW5lIiwgcGFuZWw6IHRoaXMuX2lkLCBpZDogaWQsIHRpdGxlOiB0aXRsZSwg
dXJsOiBleHBhbmRVUkwodXJsKSB9LCBjYWxsYmFjayAmJiBjYWxsYmFja1dyYXBwZXIpOworICAg
IH0KK307CisKK2Z1bmN0aW9uIEV4dGVuc2lvblBhbmVsKGlkKQoreworICAgIFBhbmVsLmNhbGwo
dGhpcywgaWQpOworICAgIHRoaXMub25TZWFyY2ggPSBuZXcgRXZlbnRTaW5rKCJwYW5lbC1zZWFy
Y2gtIiArIGlkKTsKK30KKworRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlID0geworfTsKKworRXh0
ZW5zaW9uUGFuZWwucHJvdG90eXBlLl9fcHJvdG9fXyA9IFBhbmVsLnByb3RvdHlwZTsKKworZnVu
Y3Rpb24gRXh0ZW5zaW9uU2lkZWJhclBhbmUoaWQpCit7CisgICAgdGhpcy5faWQgPSBpZDsKK30K
KworRXh0ZW5zaW9uU2lkZWJhclBhbmUucHJvdG90eXBlID0geworICAgIHNldEhlaWdodDogZnVu
Y3Rpb24oaGVpZ2h0KQorICAgIHsKKyAgICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0
KHsgY29tbWFuZDogInNldFNpZGViYXJIZWlnaHQiLCBpZDogdGhpcy5faWQsIGhlaWdodDogaGVp
Z2h0IH0pOworICAgIH0sCisKKyAgICBzZXRFeHBhbnNpb246IGZ1bmN0aW9uKHN0YXRlKQorICAg
IHsKKyAgICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogInNldFNp
ZGViYXJFeHBhbnNpb24iLCBpZDogdGhpcy5faWQsIGV4cGFuZGVkOiBzdGF0ZSB9KTsKKyAgICB9
Cit9OworCitmdW5jdGlvbiBJbnNwZWN0ZWRXaW5kb3coKQoreworICAgIHRoaXMub25Mb2FkZWQg
PSBuZXcgRXZlbnRTaW5rKCJpbnNwZWN0ZWRQYWdlTG9hZGVkIik7CisgICAgdGhpcy5vbk5hdmln
YXRlZCA9IG5ldyBFdmVudFNpbmsoImluc3BlY3RlZFVSTENoYW5nZWQiKTsKKyAgICB0aGlzLm9u
RE9NQ29udGVudExvYWRlZCA9IG5ldyBFdmVudFNpbmsoIkRPTUNvbnRlbnRMb2FkZWQiKTsKK30K
KworSW5zcGVjdGVkV2luZG93LnByb3RvdHlwZSA9IHsKKyAgICByZWxvYWQ6IGZ1bmN0aW9uKCkK
KyAgICB7CisgICAgICAgIHJldHVybiBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21t
YW5kOiAicmVsb2FkIiB9KTsKKyAgICB9LAorCisgICAgZXZhbHVhdGU6IGZ1bmN0aW9uKGV4cHJl
c3Npb24sIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvblNlcnZlci5z
ZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJldmFsdWF0ZU9uSW5zcGVjdGVkUGFnZSIsIGV4cHJlc3Np
b246IGV4cHJlc3Npb24gfSwgY2FsbGJhY2spOworICAgIH0KK307CisKK2Z1bmN0aW9uIEV4dGVu
c2lvblNlcnZlckNsaWVudCgpCit7CisgICAgdGhpcy5fY2FsbGJhY2tzID0ge307CisgICAgdGhp
cy5faGFuZGxlcnMgPSB7fTsKKyAgICB0aGlzLl9sYXN0UmVxdWVzdElkID0gMDsKKyAgICB0aGlz
Ll9sYXN0T2JqZWN0SWQgPSAwOworCisgICAgdGhpcy5yZWdpc3RlckhhbmRsZXIoImNhbGxiYWNr
IiwgYmluZCh0aGlzLl9vbkNhbGxiYWNrLCB0aGlzKSk7CisKKyAgICB2YXIgY2hhbm5lbCA9IG5l
dyBNZXNzYWdlQ2hhbm5lbCgpOworICAgIHRoaXMuX3BvcnQgPSBjaGFubmVsLnBvcnQxOworICAg
IHRoaXMuX3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIGJpbmQodGhpcy5fb25NZXNz
YWdlLCB0aGlzKSwgZmFsc2UpOworICAgIHRoaXMuX3BvcnQuc3RhcnQoKTsKKworICAgIHRvcC5w
b3N0TWVzc2FnZSgicmVnaXN0ZXJFeHRlbnNpb24iLCBbIGNoYW5uZWwucG9ydDIgXSwgIioiKTsK
K30KKworRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZSA9IHsKKyAgICBzZW5kUmVxdWVz
dDogZnVuY3Rpb24obWVzc2FnZSwgY2FsbGJhY2spCisgICAgeworICAgICAgICBpZiAodHlwZW9m
IGNhbGxiYWNrID09PSAiZnVuY3Rpb24iKQorICAgICAgICAgICAgbWVzc2FnZS5yZXF1ZXN0SWQg
PSB0aGlzLl9yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIHRoaXMu
X3BvcnQucG9zdE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfSwKKworICAgIHJlZ2lzdGVySGFuZGxl
cjogZnVuY3Rpb24oY29tbWFuZCwgaGFuZGxlcikKKyAgICB7CisgICAgICAgIHRoaXMuX2hhbmRs
ZXJzW2NvbW1hbmRdID0gaGFuZGxlcjsKKyAgICB9LAorCisgICAgZ2V0IG5leHRPYmplY3RJZCgp
CisgICAgeworICAgICAgICByZXR1cm4gaW5qZWN0ZWRTY3JpcHRJZCArICJfIiArICsrdGhpcy5f
bGFzdE9iamVjdElkOworICAgIH0sCisKKyAgICBfcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rpb24o
Y2FsbGJhY2spCisgICAgeworICAgICAgICB2YXIgaWQgPSArK3RoaXMuX2xhc3RSZXF1ZXN0SWQ7
CisgICAgICAgIHRoaXMuX2NhbGxiYWNrc1tpZF0gPSBjYWxsYmFjazsKKyAgICAgICAgcmV0dXJu
IGlkOworICAgIH0sCisKKyAgICBfb25DYWxsYmFjazogZnVuY3Rpb24ocmVxdWVzdCkKKyAgICB7
CisgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3RJZCBpbiB0aGlzLl9jYWxsYmFja3MpIHsKKyAg
ICAgICAgICAgIHRoaXMuX2NhbGxiYWNrc1tyZXF1ZXN0LnJlcXVlc3RJZF0ocmVxdWVzdC5yZXN1
bHQpOworICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tyZXF1ZXN0LnJlcXVlc3RJ
ZF07CisgICAgICAgIH0KKyAgICB9LAorCisgICAgX29uTWVzc2FnZTogZnVuY3Rpb24oZXZlbnQp
CisgICAgeworICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LmRhdGE7CisgICAgICAgIHZhciBo
YW5kbGVyID0gdGhpcy5faGFuZGxlcnNbcmVxdWVzdC5jb21tYW5kXTsKKyAgICAgICAgaWYgKGhh
bmRsZXIpCisgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgcmVxdWVzdCk7CisgICAgfQor
fTsKKworZnVuY3Rpb24gZXhwYW5kVVJMKHVybCkKK3sKKyAgICBpZiAoIXVybCkKKyAgICAgICAg
cmV0dXJuIHVybDsKKyAgICBpZiAoL15bXi9dKzovLmV4ZWModXJsKSkgLy8gU2VlIGlmIHVybCBo
YXMgc2NoZW1hLgorICAgICAgICByZXR1cm4gdXJsOworICAgIHZhciBiYXNlVVJMID0gbG9jYXRp
b24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdG5hbWUgKyBsb2NhdGlvbi5wb3J0Owor
ICAgIGlmICgvXlwvLy5leGVjKHVybCkpCisgICAgICAgIHJldHVybiBiYXNlVVJMICsgdXJsOwor
ICAgIHJldHVybiBiYXNlVVJMICsgbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXi9dKiQv
LCIvIikgKyB1cmw7Cit9CisKK2Z1bmN0aW9uIGJpbmQoZnVuYywgdGhpc09iamVjdCkKK3sKKyAg
ICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7Cisg
ICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gZnVuYy5hcHBseSh0aGlzT2JqZWN0LCBhcmdz
LmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApKSk7IH07Cit9
CisKK3ZhciBleHRlbnNpb25TZXJ2ZXIgPSBuZXcgRXh0ZW5zaW9uU2VydmVyQ2xpZW50KCk7CisK
K3dlYmluc3BlY3RvciA9IG5ldyBJbnNwZWN0b3JFeHRlbnNpb25BUEkoKTsKKworfQpJbmRleDog
V2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblBhbmVsLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25QYW5lbC5qcwkocmV2aXNp
b24gMCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25QYW5lbC5qcwko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK1dlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbCA9
IGZ1bmN0aW9uKGlkLCBsYWJlbCwgaWNvblVSTCwgb3B0aW9ucykKK3sKKyAgICB0aGlzLnRvb2xi
YXJJdGVtTGFiZWwgPSBsYWJlbDsKKyAgICB0aGlzLl9hZGRTdHlsZVJ1bGUoIi50b29sYmFyLWl0
ZW0uIiArIGlkICsgIiAudG9vbGJhci1pY29uIiwgImJhY2tncm91bmQtaW1hZ2U6IHVybCgiICsg
aWNvblVSTCArICIpOyIpOworICAgIFdlYkluc3BlY3Rvci5QYW5lbC5jYWxsKHRoaXMsIGlkKTsK
KyAgICB0aGlzLmF0dGFjaCgpOyAvLyBFeHRlbnNpb24gcGFuZWwgaGFzIHRvIGJlIGF0dGFjaGVk
IHNvIHRoYXQgZXh0ZW5zaW9uIGNhbiBzZWUgaXQgaW4gRE9NIHRyZWUKK30KKworV2ViSW5zcGVj
dG9yLkV4dGVuc2lvblBhbmVsLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgZGVmYXVsdEZvY3VzZWRF
bGVtZW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnNpZGViYXJUcmVlRWxlbWVudCB8
fCB0aGlzLmVsZW1lbnQ7CisgICAgfSwKKworICAgIHVwZGF0ZU1haW5WaWV3V2lkdGg6IGZ1bmN0
aW9uKHdpZHRoKQorICAgIHsKKyAgICAgICAgdGhpcy5ib2R5RWxlbWVudC5zdHlsZS5sZWZ0ID0g
d2lkdGggKyAicHgiOworICAgICAgICB0aGlzLnJlc2l6ZSgpOworICAgIH0sCisKKyAgICBzZWFy
Y2hDYW5jZWxlZDogZnVuY3Rpb24oc3RhcnRpbmdOZXdTZWFyY2gpCisgICAgeworICAgICAgICBX
ZWJJbnNwZWN0b3IuZXh0ZW5zaW9uU2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCwg
ImNhbmNlbFNlYXJjaCIpOworICAgICAgICBXZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlLnNl
YXJjaENhbmNlbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKworICAgIHBlcmZv
cm1TZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5KQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmV4
dGVuc2lvblNlcnZlci5ub3RpZnlTZWFyY2hBY3Rpb24odGhpcy5faWQsICJwZXJmb3JtU2VhcmNo
IiwgcXVlcnkpOworICAgICAgICBXZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlLnBlcmZvcm1T
ZWFyY2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9LAorCisgICAganVtcFRvTmV4dFNl
YXJjaFJlc3VsdDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmV4dGVu
c2lvblNlcnZlci5ub3RpZnlTZWFyY2hBY3Rpb24odGhpcy5faWQsICJuZXh0U2VhcmNoUmVzdWx0
Iik7CisgICAgICAgIFdlYkluc3BlY3Rvci5QYW5lbC5wcm90b3R5cGUuanVtcFRvTmV4dFNlYXJj
aFJlc3VsdC5jYWxsKHRoaXMpOworICAgIH0sCisKKyAgICBqdW1wVG9QcmV2aW91c1NlYXJjaFJl
c3VsdDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmV4dGVuc2lvblNl
cnZlci5ub3RpZnlTZWFyY2hBY3Rpb24odGhpcy5faWQsICJwcmV2aW91c1NlYXJjaFJlc3VsdCIp
OworICAgICAgICBXZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlLmp1bXBUb1ByZXZpb3VzU2Vh
cmNoUmVzdWx0LmNhbGwodGhpcyk7CisgICAgfSwKKworICAgIF9hZGRTdHlsZVJ1bGU6IGZ1bmN0
aW9uKHNlbGVjdG9yLCBib2R5KQorICAgIHsKKyAgICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgic3R5bGUiKTsKKyAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBzZWxl
Y3RvciArICIgeyAiICsgYm9keSArICIgfSI7CisgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5k
Q2hpbGQoc3R5bGUpOworICAgIH0KK30KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsLnBy
b3RvdHlwZS5fX3Byb3RvX18gPSBXZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlOwpJbmRleDog
V2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0cnlT
dHViLmpzCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVu
c2lvblJlZ2lzdHJ5U3R1Yi5qcwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0
cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2lmICghd2lu
ZG93Lkluc3BlY3RvckV4dGVuc2lvblJlZ2lzdHJ5KSB7CisKK1dlYkluc3BlY3Rvci5JbnNwZWN0
b3JFeHRlbnNpb25SZWdpc3RyeVN0dWIgPSBmdW5jdGlvbigpCit7Cit9CisKK1dlYkluc3BlY3Rv
ci5JbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeVN0dWIucHJvdG90eXBlID0geworICAgIGdldEV4
dGVuc2lvbnM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgfQorfTsKKworSW5zcGVjdG9yRXh0ZW5z
aW9uUmVnaXN0cnkgPSBuZXcgV2ViSW5zcGVjdG9yLkluc3BlY3RvckV4dGVuc2lvblJlZ2lzdHJ5
U3R1YigpOworCit9CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9u
U2VydmVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRl
bnNpb25TZXJ2ZXIuanMJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1l
bmQvRXh0ZW5zaW9uU2VydmVyLmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMwMiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK1dlYklu
c3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIgPSBmdW5jdGlvbigpCit7CisgICAgdGhpcy5fY2xpZW50
T2JqZWN0cyA9IHt9OworICAgIHRoaXMuX2hhbmRsZXJzID0ge307CisgICAgdGhpcy5fc3Vic2Ny
aWJlcnMgPSB7fTsKKworICAgIHRoaXMuX3JlZ2lzdGVySGFuZGxlcigic3Vic2NyaWJlIiwgdGhp
cy5fb25TdWJzY3JpYmUuYmluZCh0aGlzKSk7CisgICAgdGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJ1
bnN1YnNjcmliZSIsIHRoaXMuX29uVW5zdWJzY3JpYmUuYmluZCh0aGlzKSk7CisgICAgdGhpcy5f
cmVnaXN0ZXJIYW5kbGVyKCJnZXRSZXNvdXJjZXMiLCB0aGlzLl9vbkdldFJlc291cmNlcy5iaW5k
KHRoaXMpKTsKKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoImNyZWF0ZVBhbmVsIiwgdGhpcy5f
b25DcmVhdGVQYW5lbC5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoImNy
ZWF0ZVNpZGViYXJQYW5lIiwgdGhpcy5fb25DcmVhdGVTaWRlYmFyLmJpbmQodGhpcykpOworICAg
IHRoaXMuX3JlZ2lzdGVySGFuZGxlcigibG9nIiwgdGhpcy5fb25Mb2cuYmluZCh0aGlzKSk7IAor
ICAgIHRoaXMuX3JlZ2lzdGVySGFuZGxlcigiZXZhbHVhdGVPbkluc3BlY3RlZFBhZ2UiLCB0aGlz
Ll9vbkV2YWx1YXRlT25JbnNwZWN0ZWRQYWdlLmJpbmQodGhpcykpOworICAgIHRoaXMuX3JlZ2lz
dGVySGFuZGxlcigic2V0U2lkZWJhckhlaWdodCIsIHRoaXMuX29uU2V0U2lkZWJhckhlaWdodC5i
aW5kKHRoaXMpKTsKKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoInNldFNpZGViYXJFeHBhbnNp
b24iLCB0aGlzLl9vblNldFNpZGViYXJFeHBhbnNpb24uYmluZCh0aGlzKSk7CisKKyAgICB3aW5k
b3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uV2luZG93TWVzc2FnZS5iaW5k
KHRoaXMpLCBmYWxzZSk7Cit9CisKK1dlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90
eXBlID0geworICAgIG5vdGlmeVBhbmVsU2hvd246IGZ1bmN0aW9uKHBhbmVsTmFtZSkKKyAgICB7
CisgICAgICAgIHRoaXMuX3Bvc3ROb3RpZmljYXRpb24oInBhbmVsLXNob3duLSIgKyBwYW5lbE5h
bWUpOworICAgIH0sCisKKyAgICBub3RpZnlPYmplY3RTZWxlY3RlZDogZnVuY3Rpb24ocGFuZWxJ
ZCwgb2JqZWN0VHlwZSwgb2JqZWN0SWQpCisgICAgeworICAgICAgICB0aGlzLl9wb3N0Tm90aWZp
Y2F0aW9uKCJwYW5lbC1vYmplY3RTZWxlY3RlZC0iICsgcGFuZWxJZCwgb2JqZWN0VHlwZSwgb2Jq
ZWN0SWQpOworICAgIH0sCisKKyAgICBub3RpZnlPYmplY3RDcmVhdGVkOiBmdW5jdGlvbihvYmpl
Y3RUeXBlLCBvYmopCisgICAgeworICAgICAgICB0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKCJjcmVh
dGVkLSIgKyBvYmplY3RUeXBlLCBvYmopOworICAgIH0sCisKKyAgICBub3RpZnlTZWFyY2hBY3Rp
b246IGZ1bmN0aW9uKHBhbmVsSWQsIGFjdGlvbiwgc2VhcmNoU3RyaW5nKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fcG9zdE5vdGlmaWNhdGlvbigicGFuZWwtc2VhcmNoLSIgKyBwYW5lbElkLCBhY3Rp
b24sIHNlYXJjaFN0cmluZyk7CisgICAgfSwKKworICAgIHBvc3RFdmVudDogZnVuY3Rpb24oZXZl
bnROYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5fcG9zdE5vdGlmaWNhdGlvbihldmVudE5hbWUp
OworICAgIH0sCisKKyAgICBjb252ZXJ0UmVzb3VyY2U6IGZ1bmN0aW9uKHJlc291cmNlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIGlkOiByZXNvdXJjZS5pZGVudGlmaWVy
LAorICAgICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSwKKyAgICAgICAgICAgIGhhcjogKG5l
dyBXZWJJbnNwZWN0b3IuSEFSRW50cnkocmVzb3VyY2UpKS5idWlsZCgpLAorICAgICAgICB9Owor
ICAgIH0sCisKKyAgICBfcG9zdE5vdGlmaWNhdGlvbjogZnVuY3Rpb24odHlwZSwgZGV0YWlscykK
KyAgICB7CisgICAgICAgIHZhciBzdWJzY3JpYmVycyA9IHRoaXMuX3N1YnNjcmliZXJzW3R5cGVd
OworICAgICAgICBpZiAoIXN1YnNjcmliZXJzKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB2YXIgbWVzc2FnZSA9IHsKKyAgICAgICAgICAgIGNvbW1hbmQ6ICJub3RpZnktIiArIHR5cGUs
CisgICAgICAgICAgICBhcmd1bWVudHM6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSkgCisgICAgICAgIH07CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2Ny
aWJlcnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBzdWJzY3JpYmVyc1tpXS5wb3N0TWVzc2Fn
ZShtZXNzYWdlKTsKKyAgICB9LAorCisgICAgX29uU3Vic2NyaWJlOiBmdW5jdGlvbihtZXNzYWdl
LCBwb3J0KQorICAgIHsKKyAgICAgICAgdmFyIHN1YnNjcmliZXJzID0gdGhpcy5fc3Vic2NyaWJl
cnNbbWVzc2FnZS50eXBlXTsKKyAgICAgICAgaWYgKHN1YnNjcmliZXJzKQorICAgICAgICAgICAg
c3Vic2NyaWJlcnMucHVzaChwb3J0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5f
c3Vic2NyaWJlcnNbbWVzc2FnZS50eXBlXSA9IFsgcG9ydCBdOworICAgIH0sCisKKyAgICBfb25V
bnN1YnNjcmliZTogZnVuY3Rpb24obWVzc2FnZSwgcG9ydCkKKyAgICB7CisgICAgICAgIHZhciBz
dWJzY3JpYmVycyA9IHRoaXMuX3N1YnNjcmliZXJzW21lc3NhZ2UudHlwZV07CisgICAgICAgIGlm
ICghc3Vic2NyaWJlcnMpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN1YnNjcmliZXJz
LnJlbW92ZShwb3J0KTsKKyAgICAgICAgaWYgKCFzdWJzY3JpYmVycy5sZW5ndGgpCisgICAgICAg
ICAgICBkZWxldGUgdGhpcy5fc3Vic2NyaWJlcnNbbWVzc2FnZS50eXBlXTsKKyAgICB9LAorCisg
ICAgX29uQ3JlYXRlUGFuZWw6IGZ1bmN0aW9uKG1lc3NhZ2UsIHBvcnQpCisgICAgeworICAgICAg
ICB2YXIgaWQgPSBtZXNzYWdlLmlkOworICAgICAgICB2YXIgcGFuZWwgPSBuZXcgV2ViSW5zcGVj
dG9yLkV4dGVuc2lvblBhbmVsKGlkLCBtZXNzYWdlLmxhYmVsLCBtZXNzYWdlLmljb24pOworICAg
ICAgICB0aGlzLl9jbGllbnRPYmplY3RzW2lkXSA9IHBhbmVsOworCisgICAgICAgIHZhciB0b29s
YmFyRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyIik7CisgICAgICAg
IHZhciBsYXN0VG9vbGJhckl0ZW0gPSBXZWJJbnNwZWN0b3IucGFuZWxPcmRlcltXZWJJbnNwZWN0
b3IucGFuZWxPcmRlci5sZW5ndGggLSAxXS50b29sYmFySXRlbTsKKyAgICAgICAgV2ViSW5zcGVj
dG9yLmFkZFBhbmVsVG9vbGJhckljb24odG9vbGJhckVsZW1lbnQsIHBhbmVsLCBsYXN0VG9vbGJh
ckl0ZW0pOworICAgICAgICBXZWJJbnNwZWN0b3IucGFuZWxzW2lkXSA9IHBhbmVsOworICAgICAg
ICB0aGlzLl9jcmVhdGVDbGllbnRJZnJhbWUocGFuZWwuZWxlbWVudCwgbWVzc2FnZS51cmwsIG1l
c3NhZ2UucmVxdWVzdElkLCBwb3J0KTsKKyAgICB9LAorCisgICAgX29uQ3JlYXRlU2lkZWJhcjog
ZnVuY3Rpb24obWVzc2FnZSwgcG9ydCkKKyAgICB7CisgICAgICAgIHZhciBwYW5lbCA9IFdlYklu
c3BlY3Rvci5wYW5lbHNbbWVzc2FnZS5wYW5lbF07CisgICAgICAgIGlmICghcGFuZWwpCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzKCJFX05PVEZPVU5EIiwgbWVzc2FnZS5wYW5lbCk7
CisgICAgICAgIGlmICghcGFuZWwuc2lkZWJhckVsZW1lbnQgfHwgIXBhbmVsLnNpZGViYXJQYW5l
cykKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXMoIkVfTk9UU1VQUE9SVEVEIik7Cisg
ICAgICAgIHZhciBpZCA9IG1lc3NhZ2UuaWQ7CisgICAgICAgIHZhciBzaWRlYmFyID0gbmV3IFdl
Ykluc3BlY3Rvci5TaWRlYmFyUGFuZShtZXNzYWdlLnRpdGxlKTsKKyAgICAgICAgdGhpcy5fY2xp
ZW50T2JqZWN0c1tpZF0gPSBzaWRlYmFyOworICAgICAgICBwYW5lbC5zaWRlYmFyUGFuZXNbaWRd
ID0gc2lkZWJhcjsKKyAgICAgICAgcGFuZWwuc2lkZWJhckVsZW1lbnQuYXBwZW5kQ2hpbGQoc2lk
ZWJhci5lbGVtZW50KTsKKyAgICAgICAgdGhpcy5fY3JlYXRlQ2xpZW50SWZyYW1lKHNpZGViYXIu
Ym9keUVsZW1lbnQsIG1lc3NhZ2UudXJsLCBtZXNzYWdlLnJlcXVlc3RJZCwgcG9ydCk7CisgICAg
fSwKKworICAgIF9jcmVhdGVDbGllbnRJZnJhbWU6IGZ1bmN0aW9uKHBhcmVudCwgdXJsLCByZXF1
ZXN0SWQsIHBvcnQpCisgICAgeworICAgICAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgiaWZyYW1lIik7CisgICAgICAgIGlmcmFtZS5zcmMgPSB1cmw7CisgICAgICAgIGlm
cmFtZS5zdHlsZS53aWR0aCA9ICIxMDAlIjsKKyAgICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVu
ZXIoImxvYWQiLCB0aGlzLl9kaXNwYXRjaENhbGxiYWNrLmJpbmQodGhpcywgcmVxdWVzdElkLCBw
b3J0LCB0aGlzLl9zdGF0dXMoIk9LIikpKTsKKyAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGlm
cmFtZSk7CisgICAgfSwKKworICAgIF9vblNldFNpZGViYXJIZWlnaHQ6IGZ1bmN0aW9uKG1lc3Nh
Z2UpCisgICAgeworICAgICAgICB2YXIgc2lkZWJhciA9IHRoaXMuX2NsaWVudE9iamVjdHNbbWVz
c2FnZS5pZF07CisgICAgICAgIGlmICghc2lkZWJhcikKKyAgICAgICAgICAgIHJldHVybiB0aGlz
Ll9zdGF0dXMoIkVfTk9URk9VTkQiLCBtZXNzYWdlLmlkKTsKKyAgICAgICAgc2lkZWJhci5ib2R5
RWxlbWVudC5maXJzdENoaWxkLnN0eWxlLmhlaWdodCA9IG1lc3NhZ2UuaGVpZ2h0OworICAgIH0s
CisKKyAgICBfb25TZXRTaWRlYmFyRXhwYW5zaW9uOiBmdW5jdGlvbihtZXNzYWdlKQorICAgIHsK
KyAgICAgICAgdmFyIHNpZGViYXIgPSB0aGlzLl9jbGllbnRPYmplY3RzW21lc3NhZ2UuaWRdOwor
ICAgICAgICBpZiAoIXNpZGViYXIpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzKCJF
X05PVEZPVU5EIiwgbWVzc2FnZS5pZCk7CisgICAgICAgIGlmIChtZXNzYWdlLmV4cGFuZGVkKQor
ICAgICAgICAgICAgc2lkZWJhci5leHBhbmQoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
c2lkZWJhci5jb2xsYXBzZSgpOworICAgIH0sCisKKyAgICBfb25Mb2c6IGZ1bmN0aW9uKG1lc3Nh
Z2UpCisgICAgeworICAgICAgICBXZWJJbnNwZWN0b3IubG9nKG1lc3NhZ2UubWVzc2FnZSk7Cisg
ICAgfSwKKworICAgIF9vbkV2YWx1YXRlT25JbnNwZWN0ZWRQYWdlOiBmdW5jdGlvbihtZXNzYWdl
LCBwb3J0KQorICAgIHsKKyAgICAgICAgSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuZ2V0RGVmYXVsdCgp
LmV2YWx1YXRlV2l0aFN0cmluZ1Jlc3VsdChtZXNzYWdlLmV4cHJlc3Npb24sIHRoaXMuX2Rpc3Bh
dGNoQ2FsbGJhY2suYmluZCh0aGlzLCBtZXNzYWdlLnJlcXVlc3RJZCwgcG9ydCkpOworICAgIH0s
CisKKyAgICBfb25SZXZlYWxBbmRTZWxlY3Q6IGZ1bmN0aW9uKG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBpZiAobWVzc2FnZS5wYW5lbElkID09PSAicmVzb3VyY2VzIiAmJiB0eXBlID09PSAicmVz
b3VyY2UiKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uUmV2ZWFsQW5kU2VsZWN0UmVzb3Vy
Y2UobWVzc2FnZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0
dXMoIkVfTk9UU1VQUE9SVEVEIiwgbWVzc2FnZS5wYW5lbElkLCBtZXNzYWdlLnR5cGUpOworICAg
IH0sCisKKyAgICBfb25SZXZlYWxBbmRTZWxlY3RSZXNvdXJjZTogZnVuY3Rpb24obWVzc2FnZSkK
KyAgICB7CisgICAgICAgIHZhciBpZCA9IG1lc3NhZ2UuaWQ7CisgICAgICAgIHZhciByZXNvdXJj
ZSA9IG51bGw7CisKKyAgICAgICAgcmVzb3VyY2UgPSB0eXBlb2YgaWQgPT09ICJudW1iZXIiID8g
V2ViSW5zcGVjdG9yLnJlc291cmNlc1tpZF0gOiBXZWJJbnNwZWN0b3IucmVzb3VyY2VGb3JVUkwo
aWQpOworICAgICAgICBpZiAoIXJlc291cmNlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0
YXR1cygiRV9OT1RGT1VORCIsIHR5cGVvZiBpZCArICI6ICIgKyBpZCk7CisgICAgICAgIFdlYklu
c3BlY3Rvci5wYW5lbHMucmVzb3VyY2VzLnNob3dSZXNvdXJjZShyZXNvdXJjZSwgbWVzc2FnZS5s
aW5lKTsKKyAgICAgICAgV2ViSW5zcGVjdG9yLnNob3dSZXNvdXJjZXNQYW5lbCgpOworICAgIH0s
CisKKyAgICBfZGlzcGF0Y2hDYWxsYmFjazogZnVuY3Rpb24ocmVxdWVzdElkLCBwb3J0LCByZXN1
bHQpCisgICAgeworICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgY29tbWFuZDogImNhbGxiYWNr
IiwgcmVxdWVzdElkOiByZXF1ZXN0SWQsIHJlc3VsdDogcmVzdWx0IH0pOworICAgIH0sCisKKyAg
ICBfb25HZXRSZXNvdXJjZXM6IGZ1bmN0aW9uKHJlcXVlc3QpCisgICAgeworICAgICAgICBmdW5j
dGlvbiByZXNvdXJjZVdyYXBwZXIoaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBX
ZWJJbnNwZWN0b3IuZXh0ZW5zaW9uU2VydmVyLmNvbnZlcnRSZXNvdXJjZShXZWJJbnNwZWN0b3Iu
cmVzb3VyY2VzW2lkXSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmVzcG9uc2U7CisgICAg
ICAgIGlmIChyZXF1ZXN0LmlkKQorICAgICAgICAgICAgcmVzcG9uc2UgPSBXZWJJbnNwZWN0b3Iu
cmVzb3VyY2VzW3JlcXVlc3QuaWRdID8gcmVzb3VyY2VXcmFwcGVyKHJlcXVlc3QuaWQpIDogdGhp
cy5fc3RhdHVzKCJFX05PVEZPVU5EIiwgcmVxdWVzdC5pZCk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIHJlc3BvbnNlID0gT2JqZWN0LnByb3BlcnRpZXMoV2ViSW5zcGVjdG9yLnJlc291cmNl
cykubWFwKHJlc291cmNlV3JhcHBlcik7CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9
LAorCisgICAgaW5pdEV4dGVuc2lvbnM6IGZ1bmN0aW9uKGV4dGVuc2lvbnMpCisgICAgeworICAg
ICAgICBJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0RXh0ZW5zaW9uQVBJKCIoIiArIGV4dGVuc2lv
bkFQSSArICIpIik7CisgICAgICAgIEluc3BlY3RvckV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVu
c2lvbnMoKTsKKyAgICB9LAorCisgICAgYWRkRXh0ZW5zaW9uczogZnVuY3Rpb24oZXh0ZW5zaW9u
cykKKyAgICB7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7
ICsraSkKKyAgICAgICAgICAgIHRoaXMuX2FkZEV4dGVuc2lvbihleHRlbnNpb25zW2ldKTsKKyAg
ICB9LAorCisgICAgX2FkZEV4dGVuc2lvbjogZnVuY3Rpb24oZXh0ZW5zaW9uKQorICAgIHsKKyAg
ICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLnN0YXJ0UGFnZSkKKyAgICAg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCgiaWZyYW1lIik7CisgICAgICAgICAgICBpZnJhbWUuc3JjID0gZXh0ZW5zaW9u
LnN0YXJ0UGFnZTsKKyAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwor
ICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpOworICAgICAgICB9
IGNhdGNoIChlKSB7CisgICAgICAgICAgICBjb25zb2xlLmxvZygiRmFpbGVkIHRvIGluaXRpYWxp
emUgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uc3RhcnRQYWdlICsgIjoiICsgZSk7CisgICAgICAg
IH0KKyAgICB9LAorCisgICAgX29uV2luZG93TWVzc2FnZTogZnVuY3Rpb24oZXZlbnQpCisgICAg
eworICAgICAgICBpZiAoZXZlbnQuZGF0YSAhPT0gInJlZ2lzdGVyRXh0ZW5zaW9uIikKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgdmFyIHBvcnQgPSBldmVudC5wb3J0c1swXTsKKyAgICAg
ICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy5fb25tZXNzYWdlLmJpbmQo
dGhpcyksIGZhbHNlKTsKKyAgICAgICAgcG9ydC5zdGFydCgpOworICAgIH0sCisKKyAgICBfb25t
ZXNzYWdlOiBmdW5jdGlvbihldmVudCkKKyAgICB7CisgICAgICAgIHZhciByZXF1ZXN0ID0gZXZl
bnQuZGF0YTsKKyAgICAgICAgdmFyIHJlc3VsdDsKKworICAgICAgICBpZiAocmVxdWVzdC5jb21t
YW5kIGluIHRoaXMuX2hhbmRsZXJzKQorICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5faGFuZGxl
cnNbcmVxdWVzdC5jb21tYW5kXShyZXF1ZXN0LCBldmVudC50YXJnZXQpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9zdGF0dXMoIkVfTk9UU1VQUE9SVEVEIiwgcmVx
dWVzdC5jb21tYW5kKTsKKworICAgICAgICBpZiAocmVzdWx0ICYmIHJlcXVlc3QucmVxdWVzdElk
KQorICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hDYWxsYmFjayhyZXF1ZXN0LnJlcXVlc3RJZCwg
ZXZlbnQudGFyZ2V0LCByZXN1bHQpOworICAgIH0sCisKKyAgICBfcmVnaXN0ZXJIYW5kbGVyOiBm
dW5jdGlvbihjb21tYW5kLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHRoaXMuX2hhbmRsZXJz
W2NvbW1hbmRdID0gY2FsbGJhY2s7CisgICAgfSwKKworICAgIF9zdGF0dXM6IGZ1bmN0aW9uKGNv
ZGUpCisgICAgeworICAgICAgICB2YXIgZGVzY3JpcHRpb24gPSBXZWJJbnNwZWN0b3IuRXh0ZW5z
aW9uU2VydmVyLl9lcnJvcnNbY29kZV0gfHwgY29kZTsKKyAgICAgICAgdmFyIGRldGFpbHMgPSBB
cnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAKKyAgICAgICAgdmFyIHN0
YXR1cyA9IG5ldyBXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU3RhdHVzKGNvZGUsIGRlc2NyaXB0aW9u
LCBkZXRhaWxzKTsKKyAgICAgICAgaWYgKGNvZGUgIT09ICJPSyIpIHsKKyAgICAgICAgICAgIHN0
YXR1cy5pc0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKCJFeHRlbnNpb24g
c2VydmVyIGVycm9yOiAiICsgU3RyaW5nLnZzcHJpbnRmKGRlc2NyaXB0aW9uLCBkZXRhaWxzKSk7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9OworCitXZWJJbnNw
ZWN0b3IuRXh0ZW5zaW9uU2VydmVyLl9lcnJvcnMgPSAKK3sKKyAgICBPSzogIiIsCisgICAgRV9O
T1RGT1VORDogIk9iamVjdCBub3QgZm91bmQgKCVzKSIsCisgICAgRV9OT1RTVVBQT1JURUQ6ICJP
YmplY3QgZG9lcyBub3Qgc3VwcG9ydCByZXF1ZXN0ZWQgb3BlcmF0aW9uICglcykiLAorfQorCitX
ZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU3RhdHVzID0gZnVuY3Rpb24oY29kZSwgZGVzY3JpcHRpb24s
IGRldGFpbHMpCit7CisgICAgdGhpcy5jb2RlID0gY29kZTsKKyAgICB0aGlzLmRlc2NyaXB0aW9u
ID0gZGVzY3JpcHRpb247CisgICAgdGhpcy5kZXRhaWxzID0gZGV0YWlsczsKK30KSW5kZXg6IFdl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdC5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvSW5qZWN0ZWRTY3JpcHQuanMJKHJldmlzaW9u
IDY0MDM0KQorKysgV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVkU2NyaXB0Lmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0yMzgsNiArMjM4LDIxIEBAIEluamVjdGVkU2NyaXB0LmdldENv
bXBsZXRpb25zID0gZnVuY3Rpb24KICAgICByZXR1cm4gcHJvcHM7CiB9CiAKK0luamVjdGVkU2Ny
aXB0LmV2YWx1YXRlV2l0aFN0cmluZ1Jlc3VsdCA9IGZ1bmN0aW9uKGV4cHJlc3Npb24pCit7Cisg
ICAgdmFyIHJlc3VsdCA9IHt9OworICAgIHRyeSB7CisgICAgICAgIHZhciB2YWx1ZSA9IEluamVj
dGVkU2NyaXB0Ll9ldmFsdWF0ZU9uKGluc3BlY3RlZFdpbmRvdy5ldmFsLCBpbnNwZWN0ZWRXaW5k
b3csIGV4cHJlc3Npb24sIGZhbHNlKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdHlw
ZW9mIHZhbHVlICE9PSAic3RyaW5nIikKKyAgICAgICAgICAgIHRocm93ICJFdmFsdWF0aW9uIHJl
c3VsdCBpcyBub3QgYSBzdHJpbmciOworICAgICAgICByZXN1bHQudmFsdWUgPSB2YWx1ZTsKKyAg
ICB9IGNhdGNoIChlKSB7CisgICAgICAgIHJlc3VsdC52YWx1ZSA9IGUudG9TdHJpbmcoKTsKKyAg
ICAgICAgcmVzdWx0LmlzRXhjZXB0aW9uID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKwogSW5qZWN0ZWRTY3JpcHQuZXZhbHVhdGUgPSBmdW5jdGlvbihleHByZXNzaW9uLCBv
YmplY3RHcm91cCkKIHsKICAgICByZXR1cm4gSW5qZWN0ZWRTY3JpcHQuX2V2YWx1YXRlQW5kV3Jh
cChpbnNwZWN0ZWRXaW5kb3cuZXZhbCwgaW5zcGVjdGVkV2luZG93LCBleHByZXNzaW9uLCBvYmpl
Y3RHcm91cCk7CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvSW5qZWN0ZWRTY3Jp
cHRBY2Nlc3MuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0lu
amVjdGVkU2NyaXB0QWNjZXNzLmpzCShyZXZpc2lvbiA2NDAzNCkKKysrIFdlYkNvcmUvaW5zcGVj
dG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdEFjY2Vzcy5qcwkod29ya2luZyBjb3B5KQpAQCAt
NzYsMTMgKzc2LDE0IEBAIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlciA9IGYK
IC8vIFdlIGtlZXAgdGhlc2Ugc29ydGVkLgogSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxI
YW5kbGVyKCJldmFsdWF0ZSIpOwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVy
KCJldmFsdWF0ZUluQ2FsbEZyYW1lIik7CitJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhh
bmRsZXIoImV2YWx1YXRlT25TZWxmIik7CitJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhh
bmRsZXIoImV2YWx1YXRlV2l0aFN0cmluZ1Jlc3VsdCIpOwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3Mu
X2luc3RhbGxIYW5kbGVyKCJnZXRDb21wbGV0aW9ucyIpOwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3Mu
X2luc3RhbGxIYW5kbGVyKCJnZXRQcm9wZXJ0aWVzIik7CiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5f
aW5zdGFsbEhhbmRsZXIoImdldFByb3RvdHlwZXMiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9p
bnN0YWxsSGFuZGxlcigib3BlbkluSW5zcGVjdGVkV2luZG93Iik7CiBJbmplY3RlZFNjcmlwdEFj
Y2Vzcy5faW5zdGFsbEhhbmRsZXIoInB1c2hOb2RlVG9Gcm9udGVuZCIpOwogSW5qZWN0ZWRTY3Jp
cHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJzZXRQcm9wZXJ0eVZhbHVlIik7Ci1JbmplY3RlZFNj
cmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRlT25TZWxmIik7CiAKIC8vIFNvbWUg
bWV0aG9kcyBjYW4ndCBydW4gc3luY2hyb25vdXNseSBldmVuIG9uIHRoZSBpbmplY3RlZCBzY3Jp
cHQgc2lkZSAoc3VjaCBhcyBEQiB0cmFuc2FjdGlvbnMpLgogLy8gTWFyayB0aGVtIGFzIGFzeW5j
aHJvbm91cyBoZXJlLgpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luc3BlY3Rv
ckZyb250ZW5kSG9zdFN0dWIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvZnJv
bnQtZW5kL0luc3BlY3RvckZyb250ZW5kSG9zdFN0dWIuanMJKHJldmlzaW9uIDY0MDM0KQorKysg
V2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luc3BlY3RvckZyb250ZW5kSG9zdFN0dWIuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTg0LDYgKzg0LDEwIEBAIFdlYkluc3BlY3Rvci5JbnNwZWN0b3JG
cm9udGVuZEhvc3RTdHViLnAKICAgICB7CiAgICAgfSwKIAorICAgIHNldEV4dGVuc2lvbkFQSTog
ZnVuY3Rpb24oc2NyaXB0KQorICAgIHsKKyAgICB9LAorCiAgICAgbG9hZGVkOiBmdW5jdGlvbigp
CiAgICAgewogICAgIH0sCkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVj
dG9yLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3Bl
Y3Rvci5odG1sCShyZXZpc2lvbiA2NDAzNCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC9pbnNwZWN0b3IuaHRtbAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksNyBAQCBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPCiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0
L2phdmFzY3JpcHQiIHNyYz0iaW5zcGVjdG9yLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5
cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJJbnNwZWN0b3JCYWNrZW5kU3R1Yi5qcyI+PC9zY3Jp
cHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iSW5zcGVjdG9yRnJv
bnRlbmRIb3N0U3R1Yi5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFz
Y3JpcHQiIHNyYz0iRXh0ZW5zaW9uUmVnaXN0cnlTdHViLmpzIj48L3NjcmlwdD4KICAgICA8c2Ny
aXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJPYmplY3QuanMiPjwvc2NyaXB0PgogICAg
IDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IlNldHRpbmdzLmpzIj48L3Njcmlw
dD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJDU1NTdHlsZU1vZGVs
LmpzIj48L3NjcmlwdD4KQEAgLTk2LDYgKzk3LDkgQEAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQTwogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9
IlN0b3JhZ2VQYW5lbC5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFz
Y3JpcHQiIHNyYz0iUHJvZmlsZXNQYW5lbC5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBl
PSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iQ29uc29sZVBhbmVsLmpzIj48L3NjcmlwdD4KKyAgICA8
c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJFeHRlbnNpb25BUEkuanMiPjwvc2Ny
aXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkV4dGVuc2lvblNl
cnZlci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNy
Yz0iRXh0ZW5zaW9uUGFuZWwuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9q
YXZhc2NyaXB0IiBzcmM9IkF1ZGl0c1BhbmVsLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5
cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJBdWRpdFJlc3VsdFZpZXcuanMiPjwvc2NyaXB0Pgog
ICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkF1ZGl0TGF1bmNoZXJWaWV3
LmpzIj48L3NjcmlwdD4KSW5kZXg6IFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rv
ci5qcwkocmV2aXNpb24gNjQwMzQpCisrKyBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5z
cGVjdG9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC01MjYsNiArNTI2LDkgQEAgV2ViSW5zcGVjdG9y
LmxvYWRlZCA9IGZ1bmN0aW9uKCkKICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2xvc2Ut
YnV0dG9uLWxlZnQiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuY2xvc2UsIHRydWUp
OwogICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjbG9zZS1idXR0b24tcmlnaHQiKS5hZGRF
dmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuY2xvc2UsIHRydWUpOwogCisgICAgdGhpcy5leHRl
bnNpb25TZXJ2ZXIgPSBuZXcgV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlcigpOworICAgIHRo
aXMuZXh0ZW5zaW9uU2VydmVyLmluaXRFeHRlbnNpb25zKCk7CisKICAgICBJbnNwZWN0b3JGcm9u
dGVuZEhvc3QubG9hZGVkKCk7CiB9CiAKQEAgLTEyMDIsNiArMTIwNSw3IEBAIFdlYkluc3BlY3Rv
ci51cGRhdGVSZXNvdXJjZSA9IGZ1bmN0aW9uKGkKICAgICAgICAgcmVzb3VyY2UuZmluaXNoZWQg
PSBwYXlsb2FkLmZpbmlzaGVkOwogICAgICAgICBpZiAodGhpcy5wYW5lbHMuYXVkaXRzKQogICAg
ICAgICAgICAgdGhpcy5wYW5lbHMuYXVkaXRzLnJlc291cmNlRmluaXNoZWQocmVzb3VyY2UpOwor
ICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZlci5ub3RpZnlPYmplY3RDcmVhdGVkKCJyZXNvdXJj
ZSIsIFdlYkluc3BlY3Rvci5leHRlbnNpb25TZXJ2ZXIuY29udmVydFJlc291cmNlKHJlc291cmNl
KSk7CiAgICAgfQogCiAgICAgaWYgKHBheWxvYWQuZGlkVGltaW5nQ2hhbmdlKSB7CkBAIC0xMzcy
LDYgKzEzNzYsNyBAQCBXZWJJbnNwZWN0b3IucHJvZmlsZXJXYXNEaXNhYmxlZCA9IGZ1bmN0CiBX
ZWJJbnNwZWN0b3IucGFyc2VkU2NyaXB0U291cmNlID0gZnVuY3Rpb24oc291cmNlSUQsIHNvdXJj
ZVVSTCwgc291cmNlLCBzdGFydGluZ0xpbmUsIHNjcmlwdFdvcmxkVHlwZSkKIHsKICAgICB0aGlz
LnBhbmVscy5zY3JpcHRzLmFkZFNjcmlwdChzb3VyY2VJRCwgc291cmNlVVJMLCBzb3VyY2UsIHN0
YXJ0aW5nTGluZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHNjcmlwdFdvcmxkVHlwZSk7CisgICAg
dGhpcy5leHRlbnNpb25TZXJ2ZXIubm90aWZ5T2JqZWN0Q3JlYXRlZCgic2NyaXB0IiwgeyBpZDog
c291cmNlSUQsIG5hbWU6IHNvdXJjZVVSTCwgc291cmNlOiBzb3VyY2UsIGxpbmU6IHN0YXJ0aW5n
TGluZSB9KTsKIH0KIAogV2ViSW5zcGVjdG9yLnJlc3RvcmVkQnJlYWtwb2ludCA9IGZ1bmN0aW9u
KHNvdXJjZUlELCBzb3VyY2VVUkwsIGxpbmUsIGVuYWJsZWQsIGNvbmRpdGlvbikKQEAgLTE0MjYs
NiArMTQzMSw3IEBAIFdlYkluc3BlY3Rvci5yZXNldCA9IGZ1bmN0aW9uKCkKICAgICBkZWxldGUg
dGhpcy5tYWluUmVzb3VyY2U7CiAKICAgICB0aGlzLmNvbnNvbGUuY2xlYXJNZXNzYWdlcygpOwor
ICAgIHRoaXMuZXh0ZW5zaW9uU2VydmVyLnBvc3RFdmVudCgicmVzZXQiKTsKIH0KIAogV2ViSW5z
cGVjdG9yLnJlc2V0UHJvZmlsZXNQYW5lbCA9IGZ1bmN0aW9uKCkKQEAgLTE0NDIsNiArMTQ0OCw3
IEBAIFdlYkluc3BlY3Rvci5icmluZ1RvRnJvbnQgPSBmdW5jdGlvbigpCiBXZWJJbnNwZWN0b3Iu
aW5zcGVjdGVkVVJMQ2hhbmdlZCA9IGZ1bmN0aW9uKHVybCkKIHsKICAgICBJbnNwZWN0b3JGcm9u
dGVuZEhvc3QuaW5zcGVjdGVkVVJMQ2hhbmdlZCh1cmwpOworICAgIHRoaXMuZXh0ZW5zaW9uU2Vy
dmVyLnBvc3RFdmVudCgiaW5zcGVjdGVkVVJMQ2hhbmdlZCIpOwogfQogCiBXZWJJbnNwZWN0b3Iu
cmVzb3VyY2VVUkxDaGFuZ2VkID0gZnVuY3Rpb24ocmVzb3VyY2UsIG9sZFVSTCkKQEAgLTE0NTQs
NiArMTQ2MSw3IEBAIFdlYkluc3BlY3Rvci5kaWRDb21taXRMb2FkID0gZnVuY3Rpb24oKQogewog
ICAgIC8vIENsZWFudXAgZWxlbWVudHMgcGFuZWwgZWFybHkgb24gaW5zcGVjdGVkIHBhZ2UgcmVm
cmVzaC4KICAgICBXZWJJbnNwZWN0b3Iuc2V0RG9jdW1lbnQobnVsbCk7CisgICAgdGhpcy5leHRl
bnNpb25TZXJ2ZXIucG9zdEV2ZW50KCJpbnNwZWN0ZWRQYWdlTG9hZGVkIik7CiB9CiAKIFdlYklu
c3BlY3Rvci51cGRhdGVDb25zb2xlTWVzc2FnZUV4cGlyZWRDb3VudCA9IGZ1bmN0aW9uKGNvdW50
KQpAQCAtMTU5NSw2ICsxNjAzLDExIEBAIFdlYkluc3BlY3Rvci5zZXRSZWNvcmRpbmdQcm9maWxl
ID0gZnVuY3QKICAgICB0aGlzLnBhbmVscy5wcm9maWxlcy51cGRhdGVQcm9maWxlVHlwZUJ1dHRv
bnMoKTsKIH0KIAorV2ViSW5zcGVjdG9yLmFkZEV4dGVuc2lvbnMgPSBmdW5jdGlvbihleHRlbnNp
b25zKQoreworICAgIFdlYkluc3BlY3Rvci5leHRlbnNpb25TZXJ2ZXIuYWRkRXh0ZW5zaW9ucyhl
eHRlbnNpb25zKTsKK30KKwogV2ViSW5zcGVjdG9yLmRyYXdMb2FkaW5nUGllQ2hhcnQgPSBmdW5j
dGlvbihjYW52YXMsIHBlcmNlbnQpIHsKICAgICB2YXIgZyA9IGNhbnZhcy5nZXRDb250ZXh0KCIy
ZCIpOwogICAgIHZhciBkYXJrQ29sb3IgPSAicmdiKDEyMiwgMTY4LCAyMTgpIjsKSW5kZXg6IExh
eW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJ
KHJldmlzaW9uIDY0MDQzKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMgKzEsMzggQEAKKzIwMTAtMDctMjYgIEFuZHJleSBLb3N5YWtvdiAgPGNhc2VxQGNo
cm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBleHRlbnNpb24gQVBJIHRlc3RzLgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDA0MjUKKworICAgICAgICAqIGluc3Bl
Y3Rvci9leHRlbnNpb25zLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogaW5zcGVjdG9y
L2V4dGVuc2lvbnMuaHRtbDogQWRkZWQuCisgICAgICAgICogaW5zcGVjdG9yL3Jlc291cmNlcy9l
eHRlbnNpb24tbWFpbi5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBpbnNwZWN0b3IvcmVzb3VyY2Vz
L2V4dGVuc2lvbi1tYWluLmpzOiBBZGRlZC4KKyAgICAgICAgKHRlc3RfZXZhbFN0cmluZyk6Cisg
ICAgICAgICh0ZXN0X2V2YWxOb25TdHJpbmcpOgorICAgICAgICAodGVzdF9nZXRBbGxSZXNvdXJj
ZXMuY29tcGFyZVJlc291cmNlcyk6CisgICAgICAgICh0ZXN0X2dldEFsbFJlc291cmNlcy5vblJl
c291cmNlKToKKyAgICAgICAgKHRlc3RfZ2V0QWxsUmVzb3VyY2VzKToKKyAgICAgICAgKHRlc3Rf
Z2V0SW52YWxpZFJlc291cmNlLm9uUmVzb3VyY2UpOgorICAgICAgICAodGVzdF9nZXRJbnZhbGlk
UmVzb3VyY2UpOgorICAgICAgICAoZ2V0IHRlc3RfY3JlYXRlUGFuZWwub25QYW5lbENyZWF0ZWQp
OgorICAgICAgICAoZ2V0IHRlc3RfY3JlYXRlUGFuZWwpOgorICAgICAgICAodGVzdF9jcmVhdGVT
aWRlYmFyLm9uU2lkZWJhckNyZWF0ZWQpOgorICAgICAgICAodGVzdF9jcmVhdGVTaWRlYmFyTm90
U3VwcG9ydGVkLm9uU2lkZWJhckNyZWF0ZWQpOgorICAgICAgICAodGVzdF9jcmVhdGVTaWRlYmFy
Tm90U3VwcG9ydGVkKToKKyAgICAgICAgKHRlc3RfcmVzb3VyY2VOb3RpZmljYXRpb24ub25SZXNv
dXJjZUNyZWF0ZWQpOgorICAgICAgICAodGVzdF9yZXNvdXJjZU5vdGlmaWNhdGlvbik6CisgICAg
ICAgIChvbkV2YWx1YXRlKToKKyAgICAgICAgKG9uVGVzdHNEb25lKToKKyAgICAgICAgKHJ1blRl
c3RzKToKKyAgICAgICAgKHJ1blRlc3QpOgorICAgICAgICAoY2FsbGJhY2tBbmROZXh0VGVzdC5j
YWxsYmFja1dyYXBwZXIpOgorICAgICAgICAoY2FsbGJhY2tBbmROZXh0VGVzdCk6CisgICAgICAg
ICogaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tcGFuZWwuaHRtbDogQWRkZWQuCisgICAg
ICAgICogaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tc2lkZWJhci5odG1sOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9jaHJvbWl1bS90ZXN0X2V4cGVjdGF0aW9ucy50eHQ6CisKIDIw
MTAtMDctMjYgIE1hcmN1cyBCdWxhY2ggIDxidWxhY2hAY2hyb21pdW0ub3JnPgogCiAgICAgICAg
IFVucmV2aWV3ZWQuICBBZGQgY2hyb21pdW0gZXhwZWN0YXRpb25zIGZvciBmYWlsaW5nIHRlc3Rz
LgpJbmRleDogTGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMtZXhwZWN0ZWQudHh0Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2luc3BlY3Rvci9leHRlbnNpb25zLWV4cGVjdGVkLnR4
dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2luc3BlY3Rvci9leHRlbnNpb25zLWV4cGVj
dGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNCBAQAorVGVzdHMgV2ViSW5zcGVjdG9y
IGV4dGVuc2lvbiBBUEkKKworU3RhcnRlZCBleHRlbnNpb24uCitSdW5uaW5nIHRlc3RzLi4uCis+
Pj4gdGVzdF9jcmVhdGVQYW5lbAorZG9uZSBjcmVhdGVQYW5lbAorUGFuZWwgY3JlYXRlZAorPj4+
IHRlc3RfY3JlYXRlU2lkZWJhcgorU2lkZWJhciBjcmVhdGVkCis+Pj4gdGVzdF9jcmVhdGVTaWRl
YmFyTm90U3VwcG9ydGVkCitTaWRlYmFyIGNyZWF0aW9uIHJlc3VsdDogeyJjb2RlIjoiRV9OT1RT
VVBQT1JURUQiLCJkZXNjcmlwdGlvbiI6Ik9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IHJlcXVlc3Rl
ZCBvcGVyYXRpb24gKCVzKSIsImRldGFpbHMiOltdLCJpc0Vycm9yIjp0cnVlfQorPj4+IHRlc3Rf
ZXZhbE5vblN0cmluZworRXZhbHVhdGU6IEV2YWx1YXRpb24gcmVzdWx0IGlzIG5vdCBhIHN0cmlu
ZyhleGNlcHRpb246IHRydWUpCis+Pj4gdGVzdF9ldmFsU3RyaW5nCitFdmFsdWF0ZTogZm9vKGV4
Y2VwdGlvbjogdW5kZWZpbmVkKQorPj4+IHRlc3RfZ2V0QWxsUmVzb3VyY2VzCityZXNvdXJjZTog
Li4uL3Rlc3RzL2luc3BlY3Rvci9pbnNwZWN0b3ItdGVzdC5qcworcmVzb3VyY2U6IC4uLi9MYXlv
dXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1sCis+Pj4gdGVzdF9nZXRJbnZhbGlkUmVz
b3VyY2UKK0F0dGVtcHRlZCB0byByZXRyaWV2ZSBpbnZhbGlkIHJlc291cmNlOiB7ImNvZGUiOiJF
X05PVEZPVU5EIiwiZGVzY3JpcHRpb24iOiJPYmplY3Qgbm90IGZvdW5kICglcykiLCJkZXRhaWxz
IjpbMjEyODUwNl0sImlzRXJyb3IiOnRydWV9Cis+Pj4gdGVzdF9yZXNvdXJjZU5vdGlmaWNhdGlv
bgorUmVzb3VyY2UgY3JlYXRlZDogLi4uL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLW1h
aW4uaHRtbAorQWxsIHRlc3RzIGRvbmUuCisKSW5kZXg6IExheW91dFRlc3RzL2luc3BlY3Rvci9l
eHRlbnNpb25zLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVu
c2lvbnMuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2luc3BlY3Rvci9leHRlbnNp
b25zLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzMgQEAKKzxodG1sPgorPGhlYWQ+Cis8
c2NyaXB0IHNyYz0iLi4vaHR0cC90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9yLXRlc3QuanMiPjwv
c2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCitmdW5jdGlvbiBsb2co
bWVzc2FnZSkKK3sKKyAgICBvdXRwdXQobWVzc2FnZSk7Cit9CisKK3dpbmRvdy5pbnNwZWN0ZWRT
dHJpbmdWYWx1ZSA9ICJmb28iOword2luZG93Lmluc3BlY3RlZEludFZhbHVlID0gNDI7CisKK2Z1
bmN0aW9uIGZyb250ZW5kX2luaXRpYWxpemVFeHRlbnNpb24odXJsKQoreworICAgIGlmIChXZWJJ
bnNwZWN0b3IucGFuZWxzLnJlc291cmNlcy5yZXNvdXJjZVRyYWNraW5nRW5hYmxlZCkKKyAgICAg
ICAgV2ViSW5zcGVjdG9yLmFkZEV4dGVuc2lvbnMoW3sgc3RhcnRQYWdlOiB1cmwgfV0pOworICAg
IGVsc2UKKyAgICAgICAgSW5zcGVjdG9yQmFja2VuZC5lbmFibGVSZXNvdXJjZVRyYWNraW5nKGZh
bHNlKTsKK30KKworZnVuY3Rpb24gZG9pdCgpCit7CisgICAgdmFyIGV4dGVuc2lvblVSTCA9IGxv
Y2F0aW9uLmhyZWYucmVwbGFjZSgvXC9bXi9dKiQvLCAiL3Jlc291cmNlcy9leHRlbnNpb24tbWFp
bi5odG1sIik7CisgICAgZXZhbHVhdGVJbldlYkluc3BlY3RvcigiZnJvbnRlbmRfaW5pdGlhbGl6
ZUV4dGVuc2lvbignIiArIGV4dGVuc2lvblVSTCArICInKSIpOworfQorCis8L3NjcmlwdD4KKzwv
aGVhZD4KKzxib2R5IG9ubG9hZD0ib25sb2FkKCkiPgorPHA+VGVzdHMgV2ViSW5zcGVjdG9yIGV4
dGVuc2lvbiBBUEk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9pbnNw
ZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1tYWluLmh0bWwKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0
VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5odG1sCShyZXZpc2lvbiAw
KQorKysgTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5odG1s
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0IEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCB0
eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgd2Vi
aW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgibG9nKHVuZXNjYXBlKCciICsgZXNj
YXBlKG1lc3NhZ2UpICsgIicpKTsiKTsKK30KKworbG9nKCJTdGFydGVkIGV4dGVuc2lvbi4iKTsK
Kzwvc2NyaXB0PgorCis8c2NyaXB0IHNyYz0iZXh0ZW5zaW9uLW1haW4uanMiPjwvc2NyaXB0Pgor
PC9oZWFkPgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9l
eHRlbnNpb24tbWFpbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVz
b3VyY2VzL2V4dGVuc2lvbi1tYWluLmpzCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvaW5z
cGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5qcwkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSwxMjggQEAKK2Z1bmN0aW9uIHRlc3RfZXZhbFN0cmluZyhuZXh0VGVzdCkKK3sKKyAgICB3ZWJp
bnNwZWN0b3IuaW5zcGVjdGVkV2luZG93LmV2YWx1YXRlKCJpbnNwZWN0ZWRTdHJpbmdWYWx1ZSIs
IGNhbGxiYWNrQW5kTmV4dFRlc3Qob25FdmFsdWF0ZSwgbmV4dFRlc3QpKTsKK30KKworZnVuY3Rp
b24gdGVzdF9ldmFsTm9uU3RyaW5nKG5leHRUZXN0KQoreworICAgIHdlYmluc3BlY3Rvci5pbnNw
ZWN0ZWRXaW5kb3cuZXZhbHVhdGUoImluc3BlY3RlZEludFZhbHVlIiwgY2FsbGJhY2tBbmROZXh0
VGVzdChvbkV2YWx1YXRlLCBuZXh0VGVzdCkpOworfQorCitmdW5jdGlvbiB0ZXN0X2dldEFsbFJl
c291cmNlcyhuZXh0VGVzdCkKK3sKKyAgICBmdW5jdGlvbiBjb21wYXJlUmVzb3VyY2VzKGEsIGIp
CisgICAgeworICAgICAgICByZXR1cm4gYS5oYXIucmVxdWVzdC51cmwubG9jYWxlQ29tcGFyZShi
Lmhhci5yZXF1ZXN0LnVybCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gb25SZXNvdXJjZShyZXN1
bHQpCisgICAgeworICAgICAgICB2YXIgcmVzb3VyY2VzID0gcmVzdWx0LnNvcnQoY29tcGFyZVJl
c291cmNlcyk7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3Ro
OyArK2kpCisgICAgICAgICAgICBsb2coInJlc291cmNlOiAiICsgcmVzb3VyY2VzW2ldLmhhci5y
ZXF1ZXN0LnVybC5yZXBsYWNlKC8uKigoXC9bXi9dKil7M30kKS8sIi4uLiQxIikpOworICAgIH0K
KyAgICB3ZWJpbnNwZWN0b3IucmVzb3VyY2VzLmdldEFsbChjYWxsYmFja0FuZE5leHRUZXN0KG9u
UmVzb3VyY2UsIG5leHRUZXN0KSk7Cit9CisKK2Z1bmN0aW9uIHRlc3RfZ2V0SW52YWxpZFJlc291
cmNlKG5leHRUZXN0KQoreworICAgIGZ1bmN0aW9uIG9uUmVzb3VyY2UocmVzdWx0KQorICAgIHsK
KyAgICAgICAgbG9nKCJBdHRlbXB0ZWQgdG8gcmV0cmlldmUgaW52YWxpZCByZXNvdXJjZTogIiAr
IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpOworICAgIH0KKyAgICB3ZWJpbnNwZWN0b3IucmVzb3Vy
Y2VzLmdldCgyMTI4NTA2LCBjYWxsYmFja0FuZE5leHRUZXN0KG9uUmVzb3VyY2UsIG5leHRUZXN0
KSk7Cit9CisKK2Z1bmN0aW9uIHRlc3RfY3JlYXRlUGFuZWwobmV4dFRlc3QpCit7CisgICAgZnVu
Y3Rpb24gb25QYW5lbENyZWF0ZWQoKQorICAgIHsKKyAgICAgICAgbG9nKCJQYW5lbCBjcmVhdGVk
Iik7CisgICAgfQorICAgIHdlYmluc3BlY3Rvci5wYW5lbHMuY3JlYXRlKCJUZXN0IFBhbmVsIiwg
ImV4dGVuc2lvbi1wYW5lbC5odG1sIiwgImV4dGVuc2lvbi1wYW5lbC5wbmciLCBjYWxsYmFja0Fu
ZE5leHRUZXN0KG9uUGFuZWxDcmVhdGVkLCBuZXh0VGVzdCkpOworICAgIGxvZygiZG9uZSBjcmVh
dGVQYW5lbCIpOworfQorCitmdW5jdGlvbiB0ZXN0X2NyZWF0ZVNpZGViYXIobmV4dFRlc3QpCit7
CisgICAgZnVuY3Rpb24gb25TaWRlYmFyQ3JlYXRlZCgpCisgICAgeworICAgICAgICBsb2coIlNp
ZGViYXIgY3JlYXRlZCIpOworICAgIH0KKyAgICB3ZWJpbnNwZWN0b3IucGFuZWxzLmdldCgiZWxl
bWVudHMiKS5jcmVhdGVTaWRlYmFyUGFuZSgiVGVzdCBTaWRlYmFyIiwgImV4dGVuc2lvbi1zaWRl
YmFyLmh0bWwiLCBjYWxsYmFja0FuZE5leHRUZXN0KG9uU2lkZWJhckNyZWF0ZWQsIG5leHRUZXN0
KSk7Cit9CisKK2Z1bmN0aW9uIHRlc3RfY3JlYXRlU2lkZWJhck5vdFN1cHBvcnRlZChuZXh0VGVz
dCkKK3sKKyAgICBmdW5jdGlvbiBvblNpZGViYXJDcmVhdGVkKHJlc3VsdCkKKyAgICB7CisgICAg
ICAgIGxvZygiU2lkZWJhciBjcmVhdGlvbiByZXN1bHQ6ICIgKyBKU09OLnN0cmluZ2lmeShyZXN1
bHQpKTsKKyAgICB9CisgICAgd2ViaW5zcGVjdG9yLnBhbmVscy5jb25zb2xlLmNyZWF0ZVNpZGVi
YXJQYW5lKCJUZXN0IFNpZGViYXIiLCAiZXh0ZW5zaW9uLXNpZGViYXIuaHRtbCIsIGNhbGxiYWNr
QW5kTmV4dFRlc3Qob25TaWRlYmFyQ3JlYXRlZCwgbmV4dFRlc3QpKTsKK30KKworZnVuY3Rpb24g
dGVzdF9yZXNvdXJjZU5vdGlmaWNhdGlvbihuZXh0VGVzdCkKK3sKKyAgICBmdW5jdGlvbiBvblJl
c291cmNlQ3JlYXRlZChyZXNvdXJjZSkKKyAgICB7CisgICAgICAgIGxvZygiUmVzb3VyY2UgY3Jl
YXRlZDogIiArIHJlc291cmNlLmhhci5yZXF1ZXN0LnVybC5yZXBsYWNlKC8uKigoXC9bXi9dKil7
M30kKS8sIi4uLiQxIikpOworICAgIH0KKworICAgIHdlYmluc3BlY3Rvci5yZXNvdXJjZXMub25D
cmVhdGVkLmFkZExpc3RlbmVyKGNhbGxiYWNrQW5kTmV4dFRlc3Qob25SZXNvdXJjZUNyZWF0ZWQs
IG5leHRUZXN0KSk7CisgICAgd2ViaW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgi
dmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB4aHIub3BlbignR0VUJywgJyIgKyBsb2Nh
dGlvbi5ocmVmICsgIicsIGZhbHNlKTsgeGhyLnNlbmQobnVsbCk7JyciKTsKK30KKworZnVuY3Rp
b24gb25FdmFsdWF0ZShyZXN1bHQpCit7CisgICAgbG9nKCJFdmFsdWF0ZTogIiArIHJlc3VsdC52
YWx1ZSArICIoZXhjZXB0aW9uOiAiICsgcmVzdWx0LmlzRXhjZXB0aW9uICsgIikiKTsKK30KKwor
ZnVuY3Rpb24gb25UZXN0c0RvbmUoKQoreworICAgIGxvZygiQWxsIHRlc3RzIGRvbmUuIik7Cisg
ICAgd2ViaW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgibm90aWZ5RG9uZSgpOyIp
OworfQorCitmdW5jdGlvbiBydW5UZXN0cygpCit7CisgICAgbG9nKCJSdW5uaW5nIHRlc3RzLi4u
Iik7CisgICAgdmFyIHRlc3RzID0gW107CisgICAgZm9yICh2YXIgc3ltYm9sIGluIHRoaXMpIHsK
KyAgICAgICAgaWYgKC9edGVzdF8vLmV4ZWMoc3ltYm9sKSAmJiB0eXBlb2YgdGhpc1tzeW1ib2xd
ID09PSAiZnVuY3Rpb24iKQorICAgICAgICAgICAgdGVzdHMucHVzaChzeW1ib2wpOworICAgIH0K
KyAgICB0ZXN0cyA9IHRlc3RzLnNvcnQoKTsKKyAgICB2YXIgdGVzdENoYWluID0gb25UZXN0c0Rv
bmU7CisgICAgZm9yICh2YXIgdGVzdCA9IHRlc3RzLnBvcCgpOyB0ZXN0OyB0ZXN0ID0gdGVzdHMu
cG9wKCkpCisgICAgICAgIHRlc3RDaGFpbiA9IGJpbmQocnVuVGVzdCwgdGhpcywgYmluZCh0aGlz
W3Rlc3RdLCB0aGlzLCB0ZXN0Q2hhaW4pLCB0ZXN0KTsKKyAgICB0ZXN0Q2hhaW4oKTsKK30KKwor
ZnVuY3Rpb24gcnVuVGVzdCh0ZXN0LCBuYW1lKQoreworICAgIGxvZygiPj4+ICIgKyBuYW1lKTsK
KyAgICB0cnkgeworICAgICAgICB0ZXN0KCk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBs
b2cobmFtZSArICI6ICIgKyBlKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIGNhbGxiYWNrQW5kTmV4
dFRlc3QoY2FsbGJhY2ssIG5leHRUZXN0KQoreworICAgIGZ1bmN0aW9uIGNhbGxiYWNrV3JhcHBl
cigpIAorICAgIHsKKyAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAg
ICAgICAgbmV4dFRlc3QuY2FsbCh0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuIGNhbGxiYWNrV3Jh
cHBlcjsKK30KKworZnVuY3Rpb24gYmluZChmdW5jLCB0aGlzT2JqZWN0KQoreworICAgIHZhciBh
cmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKKyAgICByZXR1
cm4gZnVuY3Rpb24oKSB7IHJldHVybiBmdW5jLmFwcGx5KHRoaXNPYmplY3QsIGFyZ3MuY29uY2F0
KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCkpKTsgfTsKK30KKworcnVu
VGVzdHMoKTsKSW5kZXg6IExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9u
LXBhbmVsLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNl
cy9leHRlbnNpb24tcGFuZWwuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2luc3Bl
Y3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXBhbmVsLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMiBAQAorPGh0bWw+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVz
b3VyY2VzL2V4dGVuc2lvbi1zaWRlYmFyLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
aW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tc2lkZWJhci5odG1sCShyZXZpc2lvbiAwKQor
KysgTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tc2lkZWJhci5odG1s
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIgQEAKKzxodG1sPgorPC9odG1sPgpJbmRleDogTGF5
b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0vdGVzdF9leHBlY3RhdGlvbnMudHh0Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtL3Rlc3RfZXhwZWN0YXRpb25zLnR4
dAkocmV2aXNpb24gNjQwMzQpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS90ZXN0
X2V4cGVjdGF0aW9ucy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTE5OCw2ICsxOTgsNyBAQCBXT05U
RklYIFNLSVAgOiBmYXN0L2V2ZW50cy9tZXNzYWdlLXBvcnQtCiBXT05URklYIFNLSVAgOiBmYXN0
L2V2ZW50cy9tZXNzYWdlLXBvcnQuaHRtbCA9IEZBSUwKIFdPTlRGSVggU0tJUCA6IGZhc3QvZXZl
bnRzL21lc3NhZ2UtcG9ydC1tdWx0aS5odG1sID0gRkFJTAogV09OVEZJWCBTS0lQIDogaHR0cC90
ZXN0cy9zZWN1cml0eS9NZXNzYWdlUG9ydC9ldmVudC1saXN0ZW5lci1jb250ZXh0Lmh0bWwgPSBG
QUlMCitXT05URklYIFNLSVAgOiBpbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1sID0gRkFJTAogCiAv
LyBJbXBsZW1lbnQgamF2YSB0ZXN0aW5nIGhhcm5lc3MuCiBCVUczNjY4MSBERUZFUiBTS0lQIDog
amF2YSA9IFRFWFQK
</data>
<flag name="review"
          id="50792"
          type_id="1"
          status="+"
          setter="pfeldman"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>62578</attachid>
            <date>2010-07-26 08:36:23 -0700</date>
            <delta_ts>2010-07-26 08:37:22 -0700</delta_ts>
            <desc>updated API draft</desc>
            <filename>inspector-extension-api.html</filename>
            <type>text/html</type>
            <size>52831</size>
            <attacher name="Andrey Kosyakov">caseq</attacher>
            
              <data encoding="base64">PGh0bWw+DQo8aGVhZD4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KdmFyIGlu
c3BlY3RvckFQSSA9IFsNCiAgew0KICAgICJuYW1lc3BhY2UiOiAid2ViaW5zcGVjdG9yIiwNCiAg
ICAidHlwZXMiOiBbDQogICAgICB7DQogICAgICAgICJpZCI6ICJJbnNwZWN0b3JTdGF0dXMiLA0K
ICAgICAgICAidHlwZSI6ICJvYmplY3QiLA0KICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVzY3Jp
YmVzIGEgc3RhdHVzIG9mIGV4dGVuc2lvbiBBUEkgY2FsbC4iLA0KICAgICAgICAicHJvcGVydGll
cyI6IHsNCiAgICAgICAgICAiY29kZSI6IHsNCiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIs
DQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsb2NhbGUtbmV1dHJhbCBzdHJpbmcgaWRl
bnRpZnlpbmcgdGhlIHN0YXR1cyAoJ09LJyBmb3Igbm8gZXJyb3IpLiINCiAgICAgICAgICB9LA0K
ICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsNCiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIs
DQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSB1c2VyLXJlYWRhYmxlIGRlc2NyaXB0aW9u
IG9mIHRoZSBlcnJvciAobWF5IGNvbnRhaW4gcmVwbGFjZW1lbnQgbWFya3MgZm9yIGFyZ3VtZW50
cykuIg0KICAgICAgICAgIH0sDQogICAgICAgICAgImFyZ3VtZW50cyI6IHsNCiAgICAgICAgICAg
ICJ0eXBlIjogImFycmF5IiwNCiAgICAgICAgICAgICJpdGVtcyI6IHsgInR5cGUiOiAiT2JqZWN0
IiB9LA0KICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVyb3JyLXNwZWNpZmljIGRldGFpbHMi
LA0KICAgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0K
ICAgICAgfQ0KICAgIF0sDQogICAgImZ1bmN0aW9ucyI6IFsNCiAgICAgIHsNCiAgICAgICAgIm5h
bWUiOiAibG9nIiwNCiAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLA0KICAgICAgICAiZGVzY3Jp
cHRpb24iOiAiTG9ncyBhIGxpbmUgdG8gaW5zcGVjdG9yJ3MgY29uc29sZS4iLA0KICAgICAgICAi
cGFyYW1ldGVycyI6IFsNCiAgICAgICAgICB7DQogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmci
LA0KICAgICAgICAgICAgIm5hbWUiOiAibWVzc2FnZSIsDQogICAgICAgICAgICAiZGVzY3JpcHRp
b24iOiAiQSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gY29uc29sZS4iDQogICAgICAgICAgfQ0KICAg
ICAgICBdDQogICAgICB9DQogICAgXQ0KICB9LA0KICB7DQogICAgIm5hbWVzcGFjZSI6ICJ3ZWJp
bnNwZWN0b3IuaW5zcGVjdGVkUGFnZSIsDQogICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGFj
Y2VzcyB0byB0aGUgcGFnZSBiZWluZyBpbnNwZWN0ZWQuIiwNCiAgICAidHlwZXMiOiBbDQogICAg
ICB7IA0KICAgICAgICAiaWQiOiAiRXZhbHVhdGlvblJlc3VsdCIsDQogICAgICAgICJ0eXBlIjog
Im9iamVjdCIsDQogICAgICAgICJwcm9wZXJ0aWVzIjogew0KICAgICAgICAgICJpc0V4Y2VwdGlv
biI6IHsNCiAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLA0KICAgICAgICAgICAgImRlc2Ny
aXB0aW9uIjogIlNldCBpZiBleGNlcHRpb24gaGFzIG9jY3VyZWQgd2hpbGUgZXZhbHVhdGluZyB0
aGUgZXhwcmVzc2lvbi4iLA0KICAgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQ0KICAgICAgICAg
IH0sDQogICAgICAgICAgInZhbHVlIjogew0KICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwN
CiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZXN1bHQgb2YgZXZhbHVhdGlvbiAob3IgZXhj
ZXB0aW9uIGRlc2NyaXB0aW9uIGlmIGlzRXhjZXB0aW9uIGlzIHNldCkuIg0KICAgICAgICAgIH0N
CiAgICAgICAgfQ0KICAgICAgfQ0KICAgIF0sDQogICAgImZ1bmN0aW9ucyI6IFsNCiAgICAgIHsN
CiAgICAgICAgIm5hbWUiOiAiZXZhbHVhdGUiLA0KICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIs
DQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Np
b24gaW4gdGhlIGNvbnRleHQgb2YgaW5zcGVjdGVkIHBhZ2UgKE5PVEU6IHRoZSBleHByZXNzaW9u
IG11c3QgZXZhbHVhdGUgdG8gc3RyaW5nLiBVc2UgSlNPTi5zdHJpbmdpZnkoKSB0byBwYXNzIG9i
amVjdHMpIiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgew0KICAgICAgICAg
ICAgIm5hbWUiOiAiZXhwcmVzc2lvbiIsDQogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLA0K
ICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUiDQog
ICAgICAgICAgfSwNCiAgICAgICAgICB7DQogICAgICAgICAgICAibmFtZSI6ICJjYWxsYmFjayIs
DQogICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICAgICAiZGVzY3JpcHRp
b24iOiAiQSBmdW5jdGlvbiBjYWxsZWQgd2hlbiBldmFsdWF0aW9uIGNvbXBsZXRlcy4iLA0KICAg
ICAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAg
ICAibmFtZSI6ICJyZXN1bHQiLA0KICAgICAgICAgICAgICAgICIkcmVmIjogIkV2YWx1YXRpb25S
ZXN1bHQiDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF0NCiAgICAgICAgICB9DQogICAg
ICAgIF0NCiAgICAgIH0sDQogICAgICB7IA0KICAgICAgICAibmFtZSI6ICJyZWxvYWQiLA0KICAg
ICAgICAidHlwZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWxvYWRz
IHRoZSBwYWdlIGJlaW5nIGluc3BlY3RlZC4iDQogICAgICB9DQogICAgXSwNCiAgICAiZXZlbnRz
IjogWw0KICAgICAgew0KICAgICAgICAibmFtZSI6ICJvbkxvYWRlZCIsDQogICAgICAgICJ0eXBl
IjogImZ1bmN0aW9uIiwNCiAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpcmVkIGFmdGVyIERPTSBs
b2FkIGV2ZW50IG9uIGluc3BlY3RlZCBwYWdlIGlzIGZpcmVkLiINCiAgICAgIH0sDQogICAgICB7
DQogICAgICAgICJuYW1lIjogIm9uTmF2aWdhdGVkIiwNCiAgICAgICAgInR5cGUiOiAiZnVuY3Rp
b24iLA0KICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmlyZWQgd2hlbiBuYXZpZ2F0aW9uIG9jY3Vy
cyBpbiB0aGUgd2luZG93IGJlaW5nIGluc3BlY3RlZC4iDQogICAgICB9DQogICAgXQ0KICB9LA0K
ICB7DQogICAgIm5hbWVzcGFjZSI6ICJ3ZWJpbnNwZWN0b3IucGFuZWxzIiwNCiAgICAidHlwZXMi
OiBbDQogICAgICB7DQogICAgICAgICJpZCI6ICJQYW5lbCIsDQogICAgICAgICJ0eXBlIjogIm9i
amVjdCIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHRvcC1sZXZlbCBwYW5lbCB3aXRoaW4g
V2ViIEluc3BlY3RvciBVSS4iLA0KICAgICAgICAicHJvcGVydGllcyI6IHsNCiAgICAgICAgICAi
aWQiOiB7DQogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLA0KICAgICAgICAgICAgImRlc2Ny
aXB0aW9uIjogIkEgcGFuZWwgaWRlbnRpZmllci4iDQogICAgICAgICAgfSwNCiAgICAgICAgfSwN
CiAgICAgICAgImZ1bmN0aW9ucyI6IFsNCiAgICAgICAgICB7DQogICAgICAgICAgICAibmFtZSI6
ICJhZGRTaWRlYmFyUGFuZSIsDQogICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsDQogICAg
ICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ3JlYXRlcyBhIHBhbmUgd2l0aGluIHBhbmVsJ3Mgc2lk
ZWJhci4iLA0KICAgICAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgICAgIHsNCiAg
ICAgICAgICAgICAgICAibmFtZSI6ICJ0aXRsZSIsDQogICAgICAgICAgICAgICAgInR5cGUiOiAi
c3RyaW5nIiwNCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSB0ZXh0IHRoYXQgaXMg
ZGlzcGxheWVkIGluIHNpZGViYXIgY2FwdGlvbi4iDQogICAgICAgICAgICAgIH0sDQogICAgICAg
ICAgICAgIHsNCiAgICAgICAgICAgICAgICAibmFtZSI6ICJ1cmwiLA0KICAgICAgICAgICAgICAg
ICJ0eXBlIjogInN0cmluZyIsDQogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIFVS
TCBvZiB0aGUgcGFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHNpZGViYXIuIg0KICAgICAgICAgICAg
ICB9LA0KICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIm5hbWUiOiAiY2FsbGJhY2si
LA0KICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIiwNCiAgICAgICAgICAgICAgICAi
ZGVzY3JpcHRpb24iOiAiQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gc2lkZWJhciBpcyBjcmVhdGVk
IiwNCiAgICAgICAgICAgICAgICAicGFyYW1ldGVycyI6IFsNCiAgICAgICAgICAgICAgICAgIHsN
CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAicmVzdWx0IiwNCiAgICAgICAgICAgICAgICAg
ICAgImRlc2NyaXB0aW9uIjogIkFuIEV4dGVuc2lvblNpZGViYXJQYW5lIG9iamVjdCBmb3IgY3Jl
YXRlZCBzaWRlYmFyIHBhbmUsIG9yIEV4dGVuc2lvblN0YXR1cyBkZXNjcmliaW5nIGFuIGVycm9y
LCBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZCIsDQogICAgICAgICAgICAgICAgICAgICJjaG9pY2Vz
IjogWw0KICAgICAgICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiRXh0ZW5zaW9uU3RhdHVzIiB9
LA0KICAgICAgICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiRXh0ZW5zaW9uU2lkZWJhclBhbmUi
IH0NCiAgICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAg
ICAgICAgIF0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICJy
ZXR1cm5zIjogew0KICAgICAgICAgICAgICAiJHJlZiI6ICJFeHRlbnNpb25TaWRlYmFyUGFuZSIs
DQogICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgc2lkZWJhciBwYW5lIGNyZWF0ZWQu
Ig0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgew0KICAgICAgICAgICAg
Im5hbWUiOiAicmV2ZWFsQW5kU2VsZWN0IiwNCiAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9u
IiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDYXVzZXMgcGFuZWwgdG8gZGlzcGxheSBh
biBvYmplY3QuIiwNCiAgICAgICAgICAgICJwYXJhbWV0ZXJzIjogWw0KICAgICAgICAgICAgICB7
DQogICAgICAgICAgICAgICAgIm5hbWUiOiAidHlwZSIsDQogICAgICAgICAgICAgICAgInR5cGUi
OiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSB0eXBlIG9mIG9i
amVjdCB0byBkaXNwbGF5LCBlLmcuICdyZXNvdXJjZScgb3IgJ3NjcmlwdCcuIg0KICAgICAgICAg
ICAgICB9LA0KICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIm5hbWUiOiAiaWQiLA0K
ICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIsDQogICAgICAgICAgICAgICAgImRlc2NyaXB0
aW9uIjogIkEgdHlwZS1zcGVjaWZpYyBpZGVudGlmaWVyIG9mIHRoZSBvYmplY3QuIg0KICAgICAg
ICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAg
ICAiZXZlbnRzIjogWw0KICAgICAgICAgIHsNCiAgICAgICAgICAgICJuYW1lIjogIm9uU2hvd24i
LA0KICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpcmVkIHdoZW4gdXNlciBzd2l0Y2hlcyB0
byB0aGUgcGFuZWwuIg0KICAgICAgICAgIH0sDQogICAgICAgICAgew0KICAgICAgICAgICAgIm5h
bWUiOiAib25TZWxlY3Rpb25DaGFuZ2VkIiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJG
aXJlZCB3aGVuIGFuIG9iamVjdHMgKHNjcmlwdCwgcmVzb3VyY2UsIERPTSBlbGVtZW50IGV0Yykg
aXMgc2VsZWN0ZWQgaW4gdGhlIHBhbmVsLiIsDQogICAgICAgICAgICAicGFyYW1ldGVycyI6IFsN
CiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICJuYW1lIjogInR5cGUiLA0KICAgICAg
ICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsDQogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9u
IjogIk9iamVjdCB0eXBlIg0KICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICB7DQogICAg
ICAgICAgICAgICAgIm5hbWUiOiAiaWQiLA0KICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIs
DQogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9iamVjdCBpZCAoaWYgYXZhaWxhYmxl
KSINCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgXQ0KICAgICAgICAgIH0sDQogICAgICAg
ICAgew0KICAgICAgICAgICAgIm5hbWUiOiAib25TZWFyY2giLA0KICAgICAgICAgICAgImRlc2Ny
aXB0aW9uIjogIkZpcmVkIHVwb24gYSBzZWFyY2ggYWN0aW9uIChzdGFydCBvZiBhIG5ldyBzZWFy
Y2gsIHNlYXJjaCByZXN1bHQgbmF2aWdhdGlvbiBvciBzZWFyY2ggYmVpbmcgY2FuY2VsZWQpLiIs
DQogICAgICAgICAgICAicGFyYW1ldGVycyI6IFsNCiAgICAgICAgICAgICAgew0KICAgICAgICAg
ICAgICAgICJuYW1lIjogImFjdGlvbiIsDQogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5n
IiwNCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVHlwZSBvZiBzZWFyY2ggYWN0aW9u
IGJlaW5nIHBlcmZvcm1lZC4iDQogICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgIHsNCiAg
ICAgICAgICAgICAgICAibmFtZSI6ICJxdWVyeVN0cmluZyIsDQogICAgICAgICAgICAgICAgInR5
cGUiOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlLA0KICAgICAg
ICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJRdWVyeSBzdHJpbmcgKG9ubHkgZm9yICdwZXJmb3Jt
U2VhcmNoJykiDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF0NCiAgICAgICAgICB9DQoN
CiAgICAgICAJXQ0KICAgICAgfSwNCiAgICAgIHsNCiAgICAgICAgImlkIjogIkV4dGVuc2lvblNp
ZGViYXJQYW5lIiwNCiAgICAgICAgInR5cGUiOiAib2JqZWN0IiwNCiAgICAgICAgImRlc2NyaXB0
aW9uIjogIkEgc2lkZWJhciBjcmVhdGVkIGJ5IHRoZSBleHRlbnNpb24uIiwNCiAgICAgICAgImZ1
bmN0aW9ucyI6IFsNCiAgICAgICAgICB7DQogICAgICAgICAgICAibmFtZSI6ICJzZXRIZWlnaHQi
LA0KICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLA0KICAgICAgICAgICAgImRlc2NyaXB0
aW9uIjogIlNldHMgdGhlIGhlaWdodCBvZiB0aGUgc2lkZWJhci4iLA0KICAgICAgICAgICAgInBh
cmFtZXRlcnMiOiBbDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAibmFtZSI6ICJo
ZWlnaHQiLA0KICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsDQogICAgICAgICAgICAg
ICAgImRlc2NyaXB0aW9uIjogIkEgQ1NTLWxpa2Ugc2l6ZSBzcGVjaWZpY2F0aW9uLCBlLmcuICcx
MHB4JyBvciAnMTJwdCciDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF0NCiAgICAgICAg
ICB9LA0KICAgICAgICAgIHsNCiAgICAgICAgICAgICJuYW1lIjogInNldEV4cGFuZGVkIiwNCiAg
ICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6
ICJDb250cm9scyB3aGV0aGVyIHRoZSBzaWRlYmFyIGlzIGV4cGFuZGVkIG9yIGNvbGxhcHNlZC4i
LA0KICAgICAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgICAgIHsNCiAgICAgICAg
ICAgICAgICAibmFtZSI6ICJleHBhbmRlZFN0YXRlIiwNCiAgICAgICAgICAgICAgICAidHlwZSI6
ICJib29sZWFuIiwNCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAidHJ1ZSB0byBleHBh
bmQgdGhlIHNpZGViYXIsIGZhbHNlIHRvIGNvbGxhcHNlIg0KICAgICAgICAgICAgICB9DQogICAg
ICAgICAgICBdDQogICAgICAgICAgfQ0KICAgICAgICBdDQogICAgICB9DQogICAgXSwNCiAgICAi
ZnVuY3Rpb25zIjogWw0KICAgICAgew0KICAgICAgICAibmFtZSI6ICJnZXQiLA0KICAgICAgICAi
dHlwZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZXR1cm5zIGEgUGFu
ZWwgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlkLiIsDQogICAgICAgICJwYXJhbWV0ZXJz
IjogWw0KICAgICAgICAgIHsNCiAgICAgICAgICAgICJuYW1lIjogImlkIiwNCiAgICAgICAgICAg
ICJ0eXBlIjogInN0cmluZyIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gaWRlbnRp
ZmllciBvZiB0aGUgcGFuZWwuIg0KICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInJl
dHVybnMiIDogew0KICAgICAgICAgICIkcmVmIjogIlBhbmVsIiwNCiAgICAgICAgICAiZGVzY3Jp
cHRpb24iOiAiQSBQYW5lbCBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgaWQuIg0KICAgICAg
ICB9DQogICAgICB9LA0KICAgICAgew0KICAgICAgICAibmFtZSI6ICJjcmVhdGUiLA0KICAgICAg
ICAidHlwZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJDcmVhdGVzIGFu
IGV4dGVuc2lvbiBwYW5lbC4iLA0KICAgICAgICAicGFyYW1ldGVycyI6IFsNCiAgICAgICAgICB7
DQogICAgICAgICAgICAibmFtZSI6ICJsYWJlbCIsDQogICAgICAgICAgICAidHlwZSI6ICJzdHJp
bmciLA0KICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxhYmVsIHRoYXQgaXMgZGlzcGxheWVk
IHVuZGVyIHRoZSBleHRlbnNpb24gaWNvbiBpbiB0aGUgdG9vbGJhciwiDQogICAgICAgICAgfSwN
CiAgICAgICAgICB7DQogICAgICAgICAgICAibmFtZSI6ICJwYWdlVVJMIiwNCiAgICAgICAgICAg
ICJ0eXBlIjogInN0cmluZyIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gVVJMIG9m
IHRoZSBwYWdlIHRoYXQgcmVwcmVzZW50cyB0aGlzIHBhbmVsLiINCiAgICAgICAgICB9LA0KICAg
ICAgICAgIHsNCiAgICAgICAgICAgICJuYW1lIjogImljb25VUkwiLA0KICAgICAgICAgICAgInR5
cGUiOiAic3RyaW5nIiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBVUkwgb2YgdGhl
IHRvb2xiYXIgaWNvbi4iDQogICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicmV0dXJu
cyIgOiB7DQogICAgICAgICAgIiRyZWYiOiAiUGFuZWwiLA0KICAgICAgICAgICJkZXNjcmlwdGlv
biI6ICJBIHBhbmVsIHRoYXQgd2FzIGNyZWF0ZWQuIg0KICAgICAgICB9DQogICAgICB9DQogICAg
XQ0KICB9LA0KICB7DQogICAgIm5hbWVzcGFjZSI6ICJ3ZWJpbnNwZWN0b3IucmVzb3VyY2VzIiwN
CiAgICAidHlwZXMiOiBbDQogICAgICB7DQogICAgICAgICJpZCI6ICJJbnNwZWN0b3JSZXNvdXJj
ZSIsDQogICAgICAgICJ0eXBlIjogIk9iamVjdCIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJS
ZXByZXNlbnRzIGEgcmVzb3VyY2UgKGRvY3VtZW50LCBzY3JpcHQsIGltYWdlIGV0YykiLA0KICAg
ICAgICAicHJvcGVydGllcyI6IHsNCiAgICAgICAgICAiaWQiOiB7DQogICAgICAgICAgICAidHlw
ZSI6ICJudW1iZXIiLA0KICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJlc291cmNlIGlkZW50
aWZpZXIiDQogICAgICAgICAgfSwNCiAgICAgICAgICAidHlwZSI6IHsNCiAgICAgICAgICAgICJ0
eXBlIjogInN0cmluZyIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVHlwZSBvZiB0aGUg
cmVzb3VyY2UgKCdkb2N1bWVudCcsICdpbWFnZScsICdjc3MnIGV0Yy4pIg0KICAgICAgICAgIH0s
DQogICAgICAgICAgImhhciI6IHsNCiAgICAgICAgICAgICJ0eXBlIjogIk9iamVjdCIsDQogICAg
ICAgICAgICAiZGVzY3JpcHRpb24iOiAiUmVzb3VyY2UgcHJvcGVydGllcyBpbiBIQVIgZm9ybWF0
IChzZWUgaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2h0dHAtYXJjaGl2ZS1zcGVjaWZp
Y2F0aW9uL3dlYi9oYXItMS0yLXNwZWMpIg0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAg
fQ0KICAgIF0sDQogICAgImZ1bmN0aW9ucyI6IFsNCiAgICAgIHsNCiAgICAgICAgIm5hbWUiOiAi
Z2V0IiwNCiAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLA0KICAgICAgICAiZGVzY3JpcHRpb24i
OiAiUmV0dXJucyBhIHJlc291cmNlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpZC4iLA0K
ICAgICAgICAicGFyYW1ldGVycyI6IFsNCiAgICAgICAgICB7DQogICAgICAgICAgICAibmFtZSI6
ICJpZCIsDQogICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLA0KICAgICAgICAgICAgImRlc2Ny
aXB0aW9uIjogIkEgbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSByZXNvdXJjZS4iDQogICAgICAgICAg
fSwNCiAgICAgICAgICB7DQogICAgICAgICAgICAibmFtZSI6ICJjYWxsYmFjayIsDQogICAgICAg
ICAgICAidHlwZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBm
dW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB1cG9uIHJlcXVlc3QgY29tcGxldGlvbi4iLA0KICAgICAg
ICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAi
bmFtZSI6ICJyZXN1bHQiLA0KICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBJbnNw
ZWN0b3JSZXNvdXJjZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgcmVzb3VyY2UsIG9yIEV4dGVuc2lv
blN0YXR1cyBvYmplY3QgZGVzY3JpYmluZyBhbiBlcnJvciwgaWYgdGhlIG9wZXJhdGlvbiBmYWls
ZWQuIiwNCiAgICAgICAgICAgICAgICAiY2hvaWNlcyI6IFsgDQogICAgICAgICAgICAgICAgICB7
ICIkcmVmIjogIkluc3BlY3RvclJlc291cmNlIiB9LA0KICAgICAgICAgICAgICAgICAgeyAiJHJl
ZiI6ICJFeHRlbnNpb25TdGF0dXMiIH0NCiAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICAg
IH0NCiAgICAgICAgICAgIF0NCiAgICAgICAgICB9DQogICAgICAgIF0NCiAgICAgIH0sDQogICAg
ICB7DQogICAgICAgICJuYW1lIjogImdldEFsbCIsDQogICAgICAgICJ0eXBlIjogImZ1bmN0aW9u
IiwNCiAgICAgICAgImRlc2NyaXB0aW9uIjogIlJldHVybnMgYWxsIGtub3duIHJlc291cmNlIG9i
amVjdHMuIiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgew0KICAgICAgICAg
ICAgIm5hbWUiOiAiY2FsbGJhY2siLA0KICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLA0K
ICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdXBv
biByZXF1ZXN0IGNvbXBsZXRpb24uIiwNCiAgICAgICAgICAgICJwYXJhbWV0ZXJzIjogWw0KICAg
ICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIm5hbWUiOiAicmVzdWx0IiwNCiAgICAgICAg
ICAgICAgICAidHlwZSI6ICJhcnJheSIsDQogICAgICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJl
ZiI6ICJJbnNwZWN0b3JSZXNvdXJjZSIgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICBd
DQogICAgICAgICAgfQ0KICAgICAgICBdDQogICAgICB9DQogICAgXSwNCiAgICAiZXZlbnRzIjog
Ww0KICAgICAgew0KICAgICAgICAibmFtZSI6ICJvbkNyZWF0ZWQiLA0KICAgICAgICAidHlwZSI6
ICJmdW5jdGlvbiIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaXJlZCB3aGVuIGEgbmV3IHJl
c291cmNlIGlzIGNyZWF0ZWQuIiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAg
eyAibmFtZSI6ICJpZCIsICJ0eXBlIjogIm51bWJlciIsICJkZXNjcmlwdGlvbiI6ICJyZXNvdXJj
ZSBpZCIgfSwNCiAgICAgICAgICB7ICJuYW1lIjogInZhbHVlIiwgIiRyZWYiOiAiSW5zcGVjdG9y
UmVzb3VyY2UiLCAiZGVzY3JpcHRpb24iOiAiUmVzb3VyY2UgZGVzY3JpcHRpb24uIiB9DQogICAg
ICAgIF0NCiAgICAgIH0NCiAgICBdDQogIH0sDQogIHsNCiAgICAibmFtZXNwYWNlIjogIndlYmlu
c3BlY3Rvci5jb25zb2xlTWVzc2FnZXMiLA0KICAgICJmdW5jdGlvbnMiOiBbDQogICAgICB7DQog
ICAgICAgICJuYW1lIjogImFkZCIsDQogICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIiwNCiAgICAg
ICAgImRlc2NyaXB0aW9uIjogIkFkZHMgYSBjb25zb2xlIG1lc3NhZ2UuIiwNCiAgICAgICAgInBh
cmFtZXRlcnMiOiBbDQogICAgICAgICAgeyAibmFtZSI6ICJtZXNzYWdlIiwgIiRyZWYiOiAiQ29u
c29sZU1lc3NhZ2UiLCAiZGVzY3JpcHRpb24iOiAiQ29uc29sZSBtZXNzYWdlIiB9DQogICAgICAg
IF0NCiAgICAgIH0NCiAgICBdLA0KICAgICJldmVudHMiOiBbDQogICAgICB7DQogICAgICAgICJu
YW1lIjogIm9uQWRkZWQiLA0KICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICJk
ZXNjcmlwdGlvbiI6ICJGaXJlZCB3aGVuIGEgbWVzc2FnZSBpcyBhZGRlZCB0byB0aGUgY29uc29s
ZS4iLA0KICAgICAgICAicGFyYW1ldGVycyI6IFsNCiAgICAgICAgICB7ICJuYW1lIjogImlkIiwg
InR5cGUiOiAibnVtYmVyIiwgImRlc2NyaXB0aW9uIjogIk1lc3NhZ2UgaWQuIiB9LA0KICAgICAg
ICAgIHsgIm5hbWUiOiAidmFsdWUiLCAiJHJlZiI6ICJDb25zb2xlTWVzc2FnZSIsICJkZXNjcmlw
dGlvbiI6ICJDb25zb2xlIG1lc3NhZ2UiIH0NCiAgICAgICAgXQ0KICAgICAgfQ0KICAgIF0NCiAg
fSwNCiAgew0KICAgICJuYW1lc3BhY2UiOiAid2ViaW5zcGVjdG9yLmF1ZGl0cyIsDQogICAgImZ1
bmN0aW9ucyI6IFsNCiAgICAgIHsNCiAgICAgICAgIm5hbWUiOiAiYWRkQ2F0ZWdvcnkiLA0KICAg
ICAgICAidHlwZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJBZGRzIGFu
IGF1ZGl0IGNhdGVnb3J5LiIsDQogICAgICAgICJwYXJhbWV0ZXJzIjogWw0KICAgICAgICAgIHsg
Im5hbWUiOiAiZGlzcGxheU5hbWUiLCAidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24iOiAi
QSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBjYXRlZ29yeSIgfSwNCiAgICAgICAgICB7ICJuYW1lIjog
InJ1bGVDb3VudCIsICJ0eXBlIjogIm51bWJlciIsICJkZXNjcmlwdGlvbiI6ICJUaGUgbnVtYmVy
IG9mIGF1ZGl0IHJ1bGVzIGluIHRoZSBjYXRlZ29yeS4iIH0sDQogICAgICAgIF0sDQogICAgICAg
ICJyZXR1cm5zIjogew0KICAgICAgICAgICIkcmVmIjogIkF1ZGl0Q2F0ZWdvcnkiDQogICAgICAg
IH0NCiAgICAgIH0NCiAgICBdLA0KICAgICJ0eXBlcyI6IFsNCiAgICAgIHsNCiAgICAgICAgImlk
IjogIkF1ZGl0Q2F0ZWdvcnkiLA0KICAgICAgICAidHlwZSI6ICJvYmplY3QiLA0KICAgICAgICAi
ZGVzY3JpcHRpb24iOiAiQSBzZXQgb2YgYXVkaXQgcnVsZXMiLA0KICAgICAgICAiZXZlbnRzIjog
Ww0KICAgICAgICAgIHsNCiAgICAgICAgICAgICJuYW1lIjogIm9uQXVkaXRTdGFydGVkIiwNCiAg
ICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6
ICJGaXJlZCB3aGVuIHRoZSBhdWRpdCBpcyBzdGFydGVkLCBpZiB0aGUgY2F0ZWdvcnkgaXMgZW5h
YmxlZCAtLSB0aGUgZXh0ZW5zaW9uIGlzIGV4cGVjdGVkIHRvIGJlZ2luIGV4ZWN1dGluZyBhdWRp
dCBydWxlcy4iDQogICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiZnVuY3Rpb25zIjog
Ww0KICAgICAgICAgIHsNCiAgICAgICAgICAgICJuYW1lIjogImFkZFJlc3VsdCIsDQogICAgICAg
ICAgICAidHlwZSI6ICJmdW5jdGlvbiIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWRk
cyBhbiBhdWRpdCBjYXRlZ29yeS4iLA0KICAgICAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAg
ICAgICAgICAgIHsgIm5hbWUiOiAic2V2ZXJpdHkiLCAidHlwZSI6ICJzdHJpbmciLCAiZGVzY3Jp
cHRpb24iOiAiU2V2ZXJpdHkgb2YgdGhpcyBydWxlICgnaW5mbycsICd3YXJuaW5nJyBvciAnc2V2
ZXJlJykiIH0sDQogICAgICAgICAgICAgIHsgIm5hbWUiOiAidmlvbGF0aW9uQ291bnQiLCAidHlw
ZSI6ICJudW1iZXIiLCAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIHZpb2xhdGlvbnMgb2YgdGhp
cyBydWxlIGZvdW5kIGluIHRoZSBwYWdlLiIgfSwNCiAgICAgICAgICAgICAgeyAibmFtZSI6ICJk
ZXRhaWxzIiwgInR5cGUiOiAiYXJyYXkiLCJpdGVtcyI6IHsgIiRyZWYiOiAiQXVkaXRSZXN1bHRO
b2RlIiB9LCAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgcmVzdWx0cyBvZiBydWxlIGV4ZWN1dGlv
biIgfQ0KICAgICAgICAgICAgXQ0KICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgICAgfSwNCiAg
ICAgIHsNCiAgICAgICAgImlkIjogIkF1ZGl0UmVzdWx0Tm9kZSIsDQogICAgICAgICJ0eXBlIjog
Im9iamVjdCIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIG5vZGUgd2l0aGluIGF1ZGl0IHJl
c3VsdCB0cmVlIC0tIGEgdGV4dCBkZXNjcmlwdGlvbiwgVVJMLCBjb2RlIHNuaXBwZXQgZXRjIiwN
CiAgICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICAgInR5cGUiOiB7DQogICAgICAgICAg
ICAidHlwZSI6ICJzdHJpbmciLA0KICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdHlwZSBv
ZiB0aGUgbm9kZSAtLSAndXJsJywgJ2Rlc2NyaXB0aW9uJywgJ3NuaXBwZXQnIGV0Yy4iDQogICAg
ICAgICAgfSwNCiAgICAgICAgICAidGV4dCI6IHsNCiAgICAgICAgICAgICJ0eXBlIjogInN0cmlu
ZyIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGNvbnRlbnRzIG9mIHRoZSBub2Rl
LiINCiAgICAgICAgICB9LA0KICAgICAgICAgICJjaGlsZHJlbiI6IHsNCiAgICAgICAgICAgICJv
cHRpb25hbCI6IHRydWUsDQogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsDQogICAgICAgICAg
ICAiaXRlbXMiOiB7ICIkcmVmIjogIkF1ZGl0UmVzdWx0Tm9kZSIgfSwNCiAgICAgICAgICAgICJk
ZXNjcmlwdGlvbiI6ICJDaGlsZHJlbiBvZiB0aGlzIG5vZGUuIg0KICAgICAgICAgIH0sDQogICAg
ICAgICAgImV4cGFuZGVkIjogew0KICAgICAgICAgICAgIm9wdGlvbmFsIjogInRydWUiLA0KICAg
ICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi
V2hldGhlciB0aGUgbm9kZSBpcyBleHBhbmRlZCBieSBkZWZhdWx0LiINCiAgICAgICAgICB9DQog
ICAgICAgIH0NCiAgICAgIH0NCiAgICBdDQogIH0sDQogIHsNCiAgICAibmFtZXNwYWNlIjogIndl
Ymluc3BlY3Rvci5kZWJ1Z2dlciIsDQogICAgImZ1bmN0aW9ucyI6IFsNCiAgICAgIHsNCiAgICAg
ICAgIm5hbWUiOiAic2V0RXhjZXB0aW9uSGFuZGxpbmciLA0KICAgICAgICAiZGVzY3JpcHRpb24i
OiAiQ29uZmlndXJlcyBkZWJ1Z2dlciBiZWhhdmlvdXIgdXBvbiBleGNlcHRpb24gaW4gZGVidWdn
ZWQgc2NyaXB0LiIsDQogICAgICAgICJwYXJhbWV0ZXJzIjogWw0KICAgICAgICAgIHsNCiAgICAg
ICAgICAgICJuYW1lIjogIm1vZGUiLA0KICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwNCiAg
ICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPbmUgb2YgJ3BhdXNlQWx3YXlzJywgJ3BhdXNlTmV2
ZXInLCAncGF1c2VPblVuaGFuZGxlZCciDQogICAgICAgICAgfQ0KICAgICAgICBdDQogICAgICB9
LA0KICAgICAgew0KICAgICAgICAibmFtZSI6ICJjb250aW51ZUV4ZWN1dGlvbiIsDQogICAgICAg
ICJkZXNjcmlwdGlvbiI6ICJDb250aW51ZSBkZWJ1Z2dlZCBzY3JpcHQgZXhlY3V0aW9uIGFmdGVy
IGEgcGF1c2UgKGUuZy4gb24gYnJlYWtwb2ludCBvciBleGNlcHRpb24pLiINCiAgICAgIH0NCiAg
ICBdLA0KICAgICJldmVudHMiOiBbDQogICAgICB7DQogICAgICAgICJuYW1lIjogIm9uRXhjZXB0
aW9uIiwNCiAgICAgICAgImRlc2NyaXB0aW9uIjogIkNhbGxlZCB1cG9uIHBhdXNlZCBleGNlcHRp
b24gaW4gZGVidWdnZWQgc2NyaXB0IChvbmx5IGlmIHBhdXNlZCBvbiB0aGlzIGV4Y2VwdGlvbiku
IiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgew0KICAgICAgICAgICAgIm5h
bWUiOiAiZGVzY3JpcHRpb24iLA0KICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwNCiAgICAg
ICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHRleHQgZGVzY3JpYmluZyBleGNlcHRpb24uIg0KICAg
ICAgICAgIH0sDQogICAgICAgICAgew0KICAgICAgICAgICAgIm5hbWUiOiAic3RhY2tUcmFjZSIs
DQogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsDQogICAgICAgICAgICAiaXRlbXMiOiB7ICIk
cmVmIjogIlN0YWNrRnJhbWUiIH0NCiAgICAgICAgICB9DQogICAgICAgIF0NCiAgICAgIH0sDQog
ICAgICB7DQogICAgICAgICJuYW1lIjogIm9uQnJlYWtwb2ludCIsDQogICAgICAgICJkZXNjcmlw
dGlvbiI6ICJDYWxsZWQgdXBvbiBkZWJ1Z2dlZCBzY3JpcHQgaXMgcGF1c2VkIG9uIGJyZWFrcG9p
bnQuIiwNCiAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgew0KICAgICAgICAgICAg
Im5hbWUiOiAiYnJlYWtvaW50SWQiLA0KICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwNCiAg
ICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZCBvZiB0aGUgYnJlYWtwb2ludCB0aGF0IGNhdXNl
ZCB0aGUgYnJlYWsiDQogICAgICAgICAgfSwNCiAgICAgICAgICB7DQogICAgICAgICAgICAibmFt
ZSI6ICJzdGFja1RyYWNlIiwNCiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwNCiAgICAgICAg
ICAgICJpdGVtcyI6IHsgIiRyZWYiOiAiU3RhY2tGcmFtZSIgfQ0KICAgICAgICAgIH0NCiAgICAg
ICAgXQ0KICAgICAgfQ0KICAgIF0sDQogICAgInR5cGVzIjogWw0KICAgICAgew0KICAgICAgICAi
aWQiOiAiU3RhY2tGcmFtZSIsDQogICAgICAgICJ0eXBlIjogIm9iamVjdCIsDQogICAgICAgICJk
ZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGluIGEgY2FsbCBzdGFjay4i
LA0KICAgICAgICAicHJvcGVydGllcyI6IHsNCiAgICAgICAgICAidXJsIjogew0KICAgICAgICAg
ICAgInR5cGUiOiAic3RyaW5nIiwNCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIFVSTCBv
ZiB0aGUgc2NyaXB0L3Jlc291cmNlIHdoZXJlIHRoZSBmdW5jdGlvbiBjYWxsIHRoYXQgcHJvZHVj
ZWQgdGhpcyBmcmFtZSByZXNpZGVzLiIsDQogICAgICAgICAgfSwNCiAgICAgICAgICAibGluZU5v
Ijogew0KICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwNCiAgICAgICAgICAgICJkZXNjcmlw
dGlvbiI6ICJBIGxpbmUgd2l0aGluIHNjcmlwdC9yZXNvdXJjZSB3aGVyZSB0aGUgZnVuY3Rpb24g
Y2FsbCB0aGF0IHByb2R1Y2VkIHRoaXMgZnJhbWUgcmVzaWRlcy4iLA0KICAgICAgICAgIH0sDQog
ICAgICAgICAgInNjcmlwdElkIjogew0KICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwNCiAg
ICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBpZCBvZiB0aGUgc2NyaXB0IHdoZXJlIHRoZSBm
dW5jdGlvbiBjYWxsIHRoYXQgcHJvZHVjZWQgdGhpcyBmcmFtZSByZXNpZGVzLiIsDQogICAgICAg
ICAgfSwNCiAgICAgICAgfSwNCiAgICAgICAgImZ1bmN0aW9ucyI6IFsNCiAgICAgICAgICB7DQog
ICAgICAgICAgICAibmFtZSI6ICJldmFsdWF0ZSIsDQogICAgICAgICAgICAidHlwZSI6ICJmdW5j
dGlvbiIsDQogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXZhbHVhdGVzIGEgSmF2YVNjcmlw
dCBleHByZXNzaW9uIGluIHRoaXMgY2FsbCBmcmFtZSAoTk9URTogdGhlIGV4cHJlc3Npb24gbXVz
dCBldmFsdWF0ZSB0byBzdHJpbmcuIFVzZSBKU09OLnN0cmluZ2lmeSgpIHRvIHBhc3Mgb2JqZWN0
cykiLA0KICAgICAgICAgICAgInBhcmFtZXRlcnMiOiBbDQogICAgICAgICAgICAgIHsNCiAgICAg
ICAgICAgICAgICAibmFtZSI6ICJleHByZXNzaW9uIiwNCiAgICAgICAgICAgICAgICAidHlwZSI6
ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBleHByZXNzaW9u
IHRvIGV2YWx1YXRlIg0KICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICB7DQogICAgICAg
ICAgICAgICAgIm5hbWUiOiAiY2FsbGJhY2siLA0KICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1
bmN0aW9uIiwNCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBmdW5jdGlvbiBjYWxs
ZWQgd2hlbiBldmFsdWF0aW9uIGNvbXBsZXRlcy4iLA0KICAgICAgICAgICAgICAgICJwYXJhbWV0
ZXJzIjogWw0KICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAibmFtZSI6
ICJyZXN1bHQiLA0KICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICJFdmFsdWF0aW9uUmVzdWx0
Ig0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAg
fQ0KICAgICAgICAgICAgXQ0KICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgICAgfQ0KICAgIF0N
CiAgfQ0KXTsNCjwvc2NyaXB0Pg0KDQo8c3R5bGU+DQoudG9kbywgLmNvbW1lbnQgeyAvKiB3aGls
ZSB3ZSdyZSB3b3JraW5nIG9uIGRvYywgY29tbWVudCBvdXQgZGlzcGxheSAqLw0KICBjb2xvcjog
cmdiKDI1NSwgMCwgMCk7DQogIGRpc3BsYXk6IG5vbmU7DQp9DQoNCi50YmQgeyAvKiBzdHlsZSBm
b3IgY29tbWVudHMgdGhhdCBzaG91bGQgYmUgdmlzaWJsZSB0byBhbGwgZGV2cyAqLw0KICBjb2xv
cjogcmdiKDEyNSwgMTI1LCAxMjUpOw0KfQ0KDQovKiBUaGlzIGlzIHRoZSBzdGFydCBvZiB0aGUg
c3R5bGVzIGltcG9ydGVkIGZyb20gQ29kZXNpdGUuICovDQoNCi5nLXNlY3Rpb246YWZ0ZXIgew0K
ICBjb250ZW50OiIuIjsNCiAgZGlzcGxheTpibG9jazsNCiAgaGVpZ2h0OjA7DQogIGNsZWFyOmJv
dGg7DQogIHZpc2liaWxpdHk6aGlkZGVuDQp9DQoNCi5nLXNlY3Rpb24sLmctdW5pdCB7DQogIHpv
b206MQ0KfQ0KDQpib2R5IHsNCiAgZm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2Vy
aWY7DQogIGZvbnQtc2l6ZTpzbWFsbDsNCiAgY29sb3I6IzAwMDsNCiAgYmFja2dyb3VuZC1jb2xv
cjojZmZmOw0KICBtYXJnaW46M3B4IDhweA0KfQ0KDQphLGE6bGluayB7DQogIGNvbG9yOiMwMGMN
Cn0NCg0KYTphY3RpdmUgew0KICBjb2xvcjpyZWQNCn0NCg0KYTp2aXNpdGVkIHsNCiAgY29sb3I6
IzU1MWE4Yg0KfQ0KDQpwIHsNCiAgLyogcGFkZGluZzoxZW0gMCAwIDA7ICovDQogIG1hcmdpbjox
ZW0gMCAwIDA7DQogIGxpbmUtaGVpZ2h0OjEyNSUNCn0NCg0KaW1nIHsNCiAgYm9yZGVyOm5vbmU7
DQogIHBhZGRpbmc6MDsNCiAgbWFyZ2luOjFlbSAwIDAgMDsNCn0NCg0KYSBpbWcgew0KICBib3Jk
ZXI6MXB4IHNvbGlkOw0KICBwYWRkaW5nOjFweA0KfQ0KDQpwcmUgYiB7DQogIGJhY2tncm91bmQ6
eWVsbG93DQp9DQoNCmNvZGUscHJlIHsNCiAgZm9udC1mYW1pbHk6bW9ub3NwYWNlOw0KICBjb2xv
cjojMDA3MDAwDQp9DQoNCmNvZGUgew0KICBmb250LXNpemU6MTBwdA0KfQ0KDQpwcmUgew0KICBm
b250LXNpemU6OXB0Ow0KICBiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7DQogIGJvcmRlcjoxcHgg
c29saWQgI2JiYjsNCiAgbWFyZ2luOjFlbSAwIDAgMDsNCiAgcGFkZGluZzouOTllbTsNCiAgb3Zl
cmZsb3c6YXV0bzsNCiAgd29yZC13cmFwOmJyZWFrLXdvcmQNCn0NCg0KYmxvY2txdW90ZSB7DQog
IHRleHQtYWxpZ246anVzdGlmeTsNCiAgbWFyZ2luOjFlbSA5MHB4IDAgNzBweDsNCiAgcGFkZGlu
ZzowIDIwcHgNCn0NCg0KaHIgew0KICBib3JkZXI6MXB4IHNvbGlkOw0KICBib3JkZXItY29sb3I6
IzM2QzsNCiAgbWFyZ2luOjFlbSAwDQp9DQoNCmgxIHsNCiAgbGluZS1oZWlnaHQ6IDEzMCU7DQog
IGZvbnQtc2l6ZTogMTcwJTsNCiAgbWFyZ2luOiAwOw0KICBwYWRkaW5nOiAuOGVtIDAgMDsNCiAg
Ym9yZGVyOiBub25lOw0KICBiYWNrZ3JvdW5kOiBub25lOw0KfQ0KDQpoMiB7DQogIGZvbnQtc2l6
ZTogMTMwJTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIG1hcmdpbjogMmVtIDAgMCAtMTBweDsN
CiAgcGFkZGluZzogMXB4IDEwcHg7DQogIC8qIHBvc2l0aW9uOiByZWxhdGl2ZTsgKi8NCiAgYm9y
ZGVyLXRvcDogMXB4IHNvbGlkICMzMzY2Q0M7DQogIGJhY2tncm91bmQtY29sb3I6ICNlNWVjZjk7
DQp9DQoNCmgyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2RjZjZkYjsNCiAgYm9yZGVyLXRvcDog
MXB4IHNvbGlkICMwMDk5MDA7DQp9DQoNCmgzIHsNCiAgZm9udC1zaXplOiAxMzAlOw0KICBmb250
LXdlaWdodDogYm9sZDsNCiAgbWFyZ2luOiAxLjVlbSAwIDAgMDsNCiAgdG9wOiAwZW07DQp9DQoN
Cmg0IHsNCiAgZm9udC1zaXplOiAxMTAlOw0KICBtYXJnaW46IC43ZW0gMCAwIDA7DQogIHBvc2l0
aW9uOiByZWxhdGl2ZTsNCiAgdG9wOiAuNGVtOw0KfQ0KDQpoNSB7DQogIGZvbnQtc2l6ZTogMTAw
JTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIG1hcmdpbjogLjZlbSAwIDAgMDsNCiAgcG9zaXRp
b246IHJlbGF0aXZlOw0KICB0b3A6IC40ZW07DQogIHotaW5kZXg6IDU7DQp9DQoNCmg2IHsNCiAg
Zm9udC1zaXplOiAxMDAlOw0KICBmb250LXdlaWdodDogbm9ybWFsOw0KICBmb250LXN0eWxlOiBp
dGFsaWM7DQogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KICBtYXJnaW46IC40ZW0gMCAw
IDA7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgdG9wOiAuNGVtOw0KICB6LWluZGV4OiA1Ow0K
fQ0KDQpoMS5wYWdlX3RpdGxlLCBoMi5wYWdlX3RpdGxlIHsNCiAgbGluZS1oZWlnaHQ6MTMwJTsN
CiAgZm9udC1zaXplOjE3MCU7DQogIG1hcmdpbjowIDAgMCAtMTBweDsNCiAgcGFkZGluZzouOGVt
IDAgMDsNCiAgYm9yZGVyOm5vbmU7DQogIGJhY2tncm91bmQ6bm9uZQ0KfQ0KDQpvbCx1bCB7DQog
IHBhZGRpbmc6MDsNCiAgbWFyZ2luOi41ZW0gMCAwIDE1cHg7DQogIGxpbmUtaGVpZ2h0OjEyNSUN
Cn0NCg0KbGkgb2wsbGkgdWwgew0KICBwYWRkaW5nOjA7DQogIG1hcmdpbjowIDAgMCAxMHB4DQp9
DQoNCmxpIHsNCiAgbWFyZ2luOi4zZW0gMCAwIDEuNWVtOw0KICBwYWRkaW5nOjANCn0NCg0KZGwg
ew0KICBtYXJnaW46MDsNCiAgcGFkZGluZzowOw0KICBsaW5lLWhlaWdodDoxMjUlDQp9DQoNCmR0
IHsNCiAgZm9udC13ZWlnaHQ6Ym9sZDsNCiAgbWFyZ2luOi43NWVtIDAgMCAwOw0KICBwYWRkaW5n
OjANCn0NCg0KZGQgew0KICBtYXJnaW46LjRlbSAwIDAgMmVtOw0KICBwYWRkaW5nOjA7DQogIGZv
bnQtd2VpZ2h0Om5vcm1hbA0KfQ0KDQpsaSBwcmUgew0KICBtYXJnaW46LjVlbSAwIC42ZW0gMA0K
fQ0KDQpsaSBwLGRkIHAgew0KICBwYWRkaW5nOi41ZW0gMCAuNmVtIDA7DQogIG1hcmdpbjowDQp9
DQoNCm9sLmFscGhhIHsNCiAgbGlzdC1zdHlsZTpsb3dlci1hbHBoYQ0KfQ0KDQpvbC5hbHBoYWNh
cCB7DQogIGxpc3Qtc3R5bGU6dXBwZXItYWxwaGENCn0NCg0Kb2wucm9tYW4gew0KICBsaXN0LXN0
eWxlOmxvd2VyLXJvbWFuDQp9DQoNCm9sLnJvbWFuY2FwIHsNCiAgbGlzdC1zdHlsZTp1cHBlci1y
b21hbg0KfQ0KDQpvbC50ZXJtc2xpc3Qgew0KICBsaXN0LXN0eWxlLXR5cGU6ZGVjaW1hbA0KfQ0K
DQpvbC50ZXJtc2xpc3Q+bGk+b2wgew0KICBsaXN0LXN0eWxlLXR5cGU6bG93ZXItYWxwaGENCn0N
Cg0Kb2wudGVybXNsaXN0PmxpPm9sPmxpPm9sIHsNCiAgbGlzdC1zdHlsZS10eXBlOmxvd2VyLXJv
bWFuDQp9DQoNCi5saXN0aGVhZCBsaSB7DQogIGZvbnQtd2VpZ2h0OmJvbGQNCn0NCg0KLmxpc3Ro
ZWFkIGxpICosLmxpc3RoZWFkIGxpIGxpIHsNCiAgZm9udC13ZWlnaHQ6bm9ybWFsDQp9DQoNCi5j
b2RlIGxpIHsNCiAgZm9udC1mYW1pbHk6bW9ub3NwYWNlOw0KICBmb250LXNpemU6MTBwdA0KfQ0K
DQouY29kZSBsaSBwLC5jb2RlIGxpIGxpIHsNCiAgZm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNh
LHNhbnMtc2VyaWYNCn0NCg0KbGkgcC5ub3RlLGxpIHAud2FybmluZyxsaSBwLmxhYnN3YXJuaW5n
LGxpIHAuY2F1dGlvbiB7DQogIG1hcmdpbjouOGVtIDAgMCAwOw0KICBwYWRkaW5nOi4yZW0gLjVl
bSAuMmVtIC45ZW0NCn0NCg0KZGl2I3RvYyB7DQogIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzIs
IDIzNywgMjM1KTsNCiAgYm9yZGVyOiAxcHggc29saWQgIzA5MDsNCiAgZGlzcGxheTogaW5saW5l
Ow0KICBmbG9hdDogcmlnaHQ7DQogIG1hcmdpbjogNXB4IDBweCA1cHggMjBweDsNCiAgcGFkZGlu
ZzogNXB4Ow0KICB3aWR0aDogMjUwcHg7DQp9DQoNCiN0b2MgcCB7DQogIGZvbnQtd2VpZ2h0OiBi
b2xkOw0KICBtYXJnaW46IDBweDsNCn0NCg0KI3RvYyBvbCB7DQogIG1hcmdpbjoxZW0gMCAwIDA7
DQogIHBhZGRpbmc6MDsNCiAgbGlzdC1zdHlsZTpub25lDQp9DQoNCiN0b2Mgb2wgbGkgew0KICBt
YXJnaW46LjRlbSAwIDAgMWVtOw0KICBwYWRkaW5nOjANCn0NCg0KI3RvYyBvbCBsaSBvbCB7DQog
IG1hcmdpbjowOw0KICBwYWRkaW5nOjANCn0NCg0KI3RvYyBvbCBsaSBvbCBsaSB7DQogIHBhZGRp
bmc6MDsNCiAgbWFyZ2luOi4xZW0gMCAwIDFlbTsNCiAgZm9udC13ZWlnaHQ6bm9ybWFsOw0KICBs
aXN0LXN0eWxlOm5vbmUNCn0NCg0KdGFibGUgew0KICBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7
DQogIGxpbmUtaGVpZ2h0OjEyNSUNCn0NCg0KdGgsdGQgew0KICB0ZXh0LWFsaWduOmxlZnQ7DQog
IHZlcnRpY2FsLWFsaWduOnRvcA0KfQ0KDQp0YWJsZSB7DQogIG1hcmdpbjowIDAgMCAxcHg7DQog
IC8qIGJvcmRlcjoxcHggc29saWQ7ICovDQogIGJvcmRlci1jb2xvcjojMzZDOw0KICBib3JkZXIt
c3BhY2luZzowOw0KICBjbGVhcjpyaWdodA0KfQ0KDQp0YWJsZSB7DQogIGJvcmRlci1jb2xvcjoj
MDkwDQp9DQoNCnRoIHsNCiAgZm9udC13ZWlnaHQ6Ym9sZDsNCiAgdGV4dC1hbGlnbjpsZWZ0Ow0K
ICBwYWRkaW5nOjZweCAxMnB4Ow0KDQogIC8qIElFIGlnbm9yZXMgbGFicyAqLw0KICAvKiBib3Jk
ZXI6MXB4IHNvbGlkICMzNkM7ICovDQogIC8qIGJhY2tncm91bmQtY29sb3I6I2U1ZWNmOSAqLw0K
fQ0KDQp0aCB7DQogIGJvcmRlci1jb2xvcjojMDkwIGltcG9ydGFudCE7DQogIGJhY2tncm91bmQt
Y29sb3I6I2RjZjZkYiBpbXBvcnRhbnQhDQp9DQoNCnRkIHsNCiAgcGFkZGluZzo2cHggMTJweDsN
CiAgYm9yZGVyOjFweCBzb2xpZCAjMzZDOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7DQogIHRl
eHQtYWxpZ246bGVmdDsNCiAgdmVydGljYWwtYWxpZ246dG9wDQp9DQoNCnRkIHsNCiAgYm9yZGVy
LWNvbG9yOiMwOTANCn0NCg0KdGQgaDEsdGQgaDIsdGQgaDMsdGQgaDQsdGQgaDUgew0KICBtYXJn
aW4tbGVmdDowDQp9DQoNCnRkIHVsLHRkIG9sIHsNCiAgbWFyZ2luOjAgMCAxZW0gMTVweDsNCiAg
cGFkZGluZzowDQp9DQoNCnRkIHAsdGQgZGwgew0KICBtYXJnaW46MCAwIDFlbSAwOw0KICBwYWRk
aW5nOjANCn0NCg0KdGQgKitwIHsNCiAgbWFyZ2luOjFlbSAwIDAgMDsNCiAgcGFkZGluZzowDQp9
DQoNCnRhYmxlLmNvbHVtbnMgew0KICBib3JkZXI6bm9uZTsNCiAgbWFyZ2luOjFlbSAwIDA7DQog
IC8qIG1hcmdpbi1yaWdodCBvbWl0dGVkIHRvIGF2b2lkIElFNiBidWcgKi8NCn0NCg0KdGFibGUu
Y29sdW1ucyB0aCB7DQogIGJvcmRlcjpub25lOw0KICBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOw0K
ICBwYWRkaW5nOjFlbSAxZW0gMCAwDQogIG1hcmdpbjoxZW0gMCAwOw0KfQ0KDQp0YWJsZS5jb2x1
bW5zIHRoIHsNCiAgYm9yZGVyOm5vbmU7DQogIGJhY2tncm91bmQtY29sb3I6d2hpdGU7DQp9DQoN
CnRhYmxlLmNvbHVtbnMgdGQgew0KICBib3JkZXI6bm9uZTsNCiAgcGFkZGluZzowIDFlbSAwIDAN
Cn0NCg0KdGFibGUuY29sdW1ucyB0ZCBwIHsNCiAgbWFyZ2luOjFlbSAwIDAgMDsNCiAgcGFkZGlu
ZzowDQp9DQoNCi5kZXByZWNhdGVkLC5kZXByZWNhdGVkICosLmRlcHJlY2F0ZWQgYTpsaW5rLC5k
ZXByZWNhdGVkIGE6aG92ZXIsLmRlcHJlY2F0ZWQgYTp2aXNpdGVkIHsNCiAgY29sb3I6IzliOWI5
Yg0KfQ0KDQouZ3JleSB7DQogIGNvbG9yOiM2NjYNCn0NCg0KLmJsdWUgew0KICBjb2xvcjojMzZl
DQp9DQoNCi50b3BtYXJnaW4gew0KICBtYXJnaW4tdG9wOjFlbSAhaW1wb3J0YW50DQp9DQoNCi5u
b21hcmdpbiB7DQogIG1hcmdpbjowICFpbXBvcnRhbnQNCn0NCg0KLm5vcGFkZGluZyB7DQogIHBh
ZGRpbmc6MCAhaW1wb3J0YW50DQp9DQoNCi5ub2JvcmRlciB7DQogIGJvcmRlcjpub25lICFpbXBv
cnRhbnQNCn0NCg0KLmJvcmRlciB7DQogIGJvcmRlcjoxcHggc29saWQgZ3JheTsNCiAgcGFkZGlu
ZzoxcHgNCn0NCg0KLm5vcm1hbHNpemUgew0KICBmb250LXNpemU6MTAwJSAhaW1wb3J0YW50DQp9
DQoNCi5ub2xpc3QgbGkgew0KICBtYXJnaW4tbGVmdDowOw0KICBsaXN0LXN0eWxlOm5vbmUNCn0N
Cg0KLm5vaW5kZW50IHsNCiAgbWFyZ2luLWxlZnQ6MA0KfQ0KDQouZG91Ymxlc3BhY2UsLmRvdWJs
ZXNwYWNlIGxpIHsNCiAgbWFyZ2luLXRvcDoxZW0NCn0NCg0KdWwuZG91Ymxlc3BhY2Usb2wuZG91
Ymxlc3BhY2Ugew0KICBtYXJnaW4tdG9wOjA7DQogIHBhZGRpbmctdG9wOjANCn0NCg0KZGl2LnJv
dyB7DQogIGZsb2F0OmxlZnQ7DQogIGNsZWFyOmxlZnQ7DQogIHBvc2l0aW9uOnJlbGF0aXZlOw0K
ICBtYXJnaW46MWVtIDAgMDsNCiAgcGFkZGluZzowDQp9DQoNCi5sZWZ0IHsNCiAgZmxvYXQ6bGVm
dDsNCiAgbWFyZ2luOjAgMWVtIDAgMDsNCiAgcGFkZGluZzowDQp9DQoNCmRpdi5zcGVjaWFsIHsN
CiAgYm9yZGVyOjFweCBzb2xpZDsNCiAgcGFkZGluZzowIC45ZW0gLjllbTsNCiAgbWFyZ2luOjFl
bSAwIDAgMDsNCiAgYmFja2dyb3VuZC1jb2xvcjojZTVlY2Y5Ow0KICBib3JkZXItY29sb3I6IzM2
Qw0KfQ0KDQpkaXYuc3BlY2lhbCB7DQogIGJhY2tncm91bmQtY29sb3I6I2RjZjZkYjsNCiAgYm9y
ZGVyOjFweCBzb2xpZCAjMDkwDQp9DQoNCnAubm90ZSxwLmNhdXRpb24scC53YXJuaW5nIHsNCiAg
bWFyZ2luOjFlbSAwIDAgMDsNCiAgcGFkZGluZzouMmVtIC41ZW0gLjJlbSAuOWVtOw0KICBiYWNr
Z3JvdW5kLWNvbG9yOiNlZmVmZWY7DQogIGJvcmRlci10b3A6MXB4IHNvbGlkOw0KICBib3JkZXIt
Ym90dG9tOjFweCBzb2xpZA0KfQ0KDQpwLmxhYnN3YXJuaW5nIHsNCiAgbWFyZ2luOjFlbSAwIDAg
MDsNCiAgcGFkZGluZzouMmVtIC41ZW0gLjJlbSAyMHB4Ow0KICBiYWNrZ3JvdW5kOnVybCgvaW1h
Z2VzL2xhYnMtMTEucG5nKSB0b3AgbGVmdCBuby1yZXBlYXQ7DQogIGJhY2tncm91bmQtcG9zaXRp
b246NHB4IDZweDsNCiAgYmFja2dyb3VuZC1jb2xvcjojZGNmNmRiOw0KICBib3JkZXItdG9wOjFw
eCBzb2xpZDsNCiAgYm9yZGVyLWJvdHRvbToxcHggc29saWQ7DQogIGJvcmRlci1jb2xvcjojMDkw
DQp9DQoNCnAubm90ZSB7DQogIGJvcmRlci1jb2xvcjojMzZDDQp9DQoNCnAuY2F1dGlvbiB7DQog
IGJvcmRlci1jb2xvcjojZmMzDQp9DQoNCnAud2FybmluZyB7DQogIGJvcmRlci1jb2xvcjojYTAz
DQp9DQoNCnAud2FybmluZyBiLHAud2FybmluZyBlbSxwLndhcm5pbmcgc3Ryb25nIHsNCiAgY29s
b3I6I2EwMzsNCiAgZm9udC13ZWlnaHQ6Ym9sZA0KfQ0KDQpwLmNhcHRpb24gew0KICBwYWRkaW5n
OjFweCAwIDA7DQogIG1hcmdpbjowDQp9DQoNCnAjZGF0ZSxwLmRhdGUgew0KICB0ZXh0LWFsaWdu
OmxlZnQ7DQogIG1hcmdpbjowOw0KICBwYWRkaW5nOjFlbTsNCiAgZm9udC1zdHlsZTppdGFsaWM7
DQogIGZvbnQtc2l6ZTp4LXNtYWxsDQp9DQoNCnAuYmFja3RvdG9wIHsNCiAgZmxvYXQ6cmlnaHQ7
DQogIG1hcmdpbjouNWVtIDAgMCA0ZW07DQogIHBvc2l0aW9uOnJlbGF0aXZlOw0KICBwYWRkaW5n
OjA7DQogIGZvbnQtc2l6ZTp4LXNtYWxsOw0KICB6LWluZGV4Ojk5DQp9DQoNCi5oaWRkZW4sLmhp
ZGRlbiAqLCNza2lwdG8sI3NraXB0byAqLCNza2lwdG8gYSwjc2tpcHRvIGE6aG92ZXIsI3NraXB0
byBhOnZpc2l0ZWQgew0KICBwb3NpdGlvbjpyZWxhdGl2ZTsNCiAgdG9wOi05OTk5cHg7DQogIGxl
ZnQ6LTk5OTlweDsNCiAgaGVpZ2h0OjA7DQogIHdpZHRoOjA7DQogIG92ZXJmbG93OmhpZGRlbjsN
CiAgei1pbmRleDo0NDQ0DQp9DQoNCiNza2lwdG8sI3NraXB0byAqLCNza2lwdG8gYSwjc2tpcHRv
IGE6aG92ZXIsI3NraXB0byBhOnZpc2l0ZWQgew0KICBfcG9zaXRpb246cmVsYXRpdmUNCn0NCg0K
I3NraXB0byBhOmZvY3VzIHsNCiAgcG9zaXRpb246Zml4ZWQ7DQogIHRvcDo1cHg7DQogIGxlZnQ6
NXB4Ow0KICBoZWlnaHQ6YXV0bzsNCiAgd2lkdGg6YXV0bzsNCiAgYmFja2dyb3VuZC1jb2xvcjoj
ZmZmOw0KICBib3JkZXI6MnB4IHNvbGlkICMwMEM7DQogIGZvbnQtd2VpZ2h0OmJvbGQ7DQogIHBh
ZGRpbmc6NXB4DQp9DQoNCiNnYy1jb250YWluZXIgew0KICBtYXJnaW46MDsNCiAgcGFkZGluZzow
Ow0KICBtYXgtd2lkdGg6MTE2MHB4Ow0KICBwb3NpdGlvbjpyZWxhdGl2ZTsNCiAgbWluLWhlaWdo
dDoxMDAlOw0KICBoZWlnaHQ6YXV0byAhaW1wb3J0YW50Ow0KICBfaGVpZ2h0OjEwMCUNCn0NCg0K
Lm1vcmVyaWdodCB7DQogIG1hcmdpbjoycHggMCAycHggMDsNCiAgdGV4dC1hbGlnbjpyaWdodA0K
fQ0KDQojZ2MtdG9jIHsNCiAgY2xlYXI6bGVmdDsNCiAgcGFkZGluZzouNWVtIDAgMTQwcHggMCAh
aW1wb3J0YW50Ow0KICBkaXNwbGF5OmJsb2NrOw0KICBtYXJnaW46MDsNCiAgd2lkdGg6MTcxcHg7
DQogIGZsb2F0OmxlZnQNCn0NCg0KI2djLXRvYyAqIHsNCiAgem9vbToxDQp9DQoNCiNnYy10b2Mg
dWwsI2djLXRvYyBvbCB7DQogIHBhZGRpbmc6LjZlbSAwIDA7DQogIG1hcmdpbjowOw0KICBsaW5l
LWhlaWdodDoxMjAlDQp9DQoNCiNnYy10b2MgdWwgdWwsI2djLXRvYyBvbCBvbCB7DQogIHBhZGRp
bmc6MDsNCiAgbWFyZ2luOjANCn0NCg0KI2djLXRvYyB1bCAqLCNnYy10b2Mgb2wgKiwudHJlZWxp
c3QgKiB7DQogIHZlcnRpY2FsLWFsaWduOm1pZGRsZQ0KfQ0KDQojZ2MtdG9jIGxpIGEgew0KICBw
YWRkaW5nLXJpZ2h0OjRweDsNCiAgX3BhZGRpbmctcmlnaHQ6MA0KfQ0KDQojZ2MtdG9jIHVsIGxp
LCNnYy10b2Mgb2wgbGksI2djLXRvYyAudHJlZWxpc3QgbGkgew0KICBsaXN0LXN0eWxlOm5vbmU7
DQogIHBhZGRpbmc6LjJlbSAwIC4yZW0gMnB4Ow0KICBtYXJnaW46MA0KfQ0KDQojZ2MtdG9jIHVs
IGxpIGxpLCNnYy10b2Mgb2wgbGkgbGksI2djLXRvYyAudHJlZWxpc3QgbGkgbGkgew0KICBwYWRk
aW5nOi4yZW0gMCAuMmVtIDE1cHgNCn0NCg0KI2djLXRvYyB1bCBoMSwjZ2MtdG9jIG9sIGgxLCNn
Yy10b2MgdWwgaDIsI2djLXRvYyBvbCBoMiB7DQogIGZvbnQtd2VpZ2h0OmJvbGQ7DQogIGZvbnQt
c2l6ZToxMDAlOw0KICBtYXJnaW46MDsNCiAgcGFkZGluZzouMmVtIDA7DQogIGJvcmRlcjpub25l
Ow0KICBiYWNrZ3JvdW5kOiNmZmYNCn0NCg0KI3RvYyBoMiB7DQogIGZvbnQtd2VpZ2h0OmJvbGQ7
DQogIGZvbnQtc2l6ZToxMDAlOw0KICBtYXJnaW46MDsNCiAgYm9yZGVyOm5vbmUgIWltcG9ydGFu
dDsNCiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzMiwgMjM3LCAyMzUpICFpbXBvcnRhbnQ7DQog
IHBhZGRpbmc6MA0KfQ0KDQojZ2MtdG9jIHVsIC5sZWZ0TmF2U2VsZWN0ZWQsI2djLXRvYyBvbCAu
bGVmdE5hdlNlbGVjdGVkLC50cmVlbGlzdCAubGVmdE5hdlNlbGVjdGVkIHsNCiAgYmFja2dyb3Vu
ZC1jb2xvcjojZTVlY2Y5Ow0KICBjb2xvcjojMDAwOw0KICB0ZXh0LWRlY29yYXRpb246bm9uZTsN
CiAgei1pbmRleDoyOw0KICBwb3NpdGlvbjpyZWxhdGl2ZQ0KfQ0KDQojZ2MtdG9jIHVsIC5sZWZ0
TmF2U2VsZWN0ZWQsI2djLXRvYyBvbCAubGVmdE5hdlNlbGVjdGVkLC50cmVlbGlzdCAubGVmdE5h
dlNlbGVjdGVkIHsNCiAgYmFja2dyb3VuZC1jb2xvcjojZGNmNmRiDQp9DQoNCi5kZXByICNnYy10
b2MgdWwgLmxlZnROYXZTZWxlY3RlZCwuZGVwciAjZ2MtdG9jIG9sIC5sZWZ0TmF2U2VsZWN0ZWQs
LmRlcHIgLnRyZWVsaXN0IC5sZWZ0TmF2U2VsZWN0ZWQgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiNk
ZGQNCn0NCg0KI2djLXRvYyB1bCBkaXYudGx3LXRpdGxlLCNnYy10b2Mgb2wgZGl2LnRsdy10aXRs
ZSwjZ2MtdG9jIC50cmVlbGlzdCBkaXYudGx3LXRpdGxlIHsNCiAgcG9zaXRpb246cmVsYXRpdmU7
DQogIG1hcmdpbjowIDAgMCAtMTVweDsNCiAgcGFkZGluZzouMmVtIDAgLjJlbSAxNXB4DQp9DQoN
CiNnYy10b2MgdWwgZGl2LnRsdy10aXRsZSBpbWcudGx3LWNvbnRyb2wsI2djLXRvYyBvbCBkaXYu
dGx3LXRpdGxlIGltZy50bHctY29udHJvbCwudHJlZWxpc3QgZGl2LnRsdy10aXRsZSBpbWcudGx3
LWNvbnRyb2wgew0KICBwb3NpdGlvbjpyZWxhdGl2ZTsNCiAgaGVpZ2h0OmluaGVyaXQ7DQogIHdp
ZHRoOjlweDsNCiAgbWFyZ2luOjAgIWltcG9ydGFudDsNCiAgcGFkZGluZzowOw0KICBib3JkZXI6
bm9uZQ0KfQ0KDQojZ2MtdG9jIHVsIC50bHctcGx1cywjZ2MtdG9jIG9sIC50bHctcGx1cywudHJl
ZWxpc3QgLnRsdy1wbHVzIHsNCiAgYmFja2dyb3VuZC1pbWFnZTp1cmwoL2ltYWdlcy9zcHJpdGVz
MDgxMzIwMDgucG5nKTsNCiAgYmFja2dyb3VuZC1wb3NpdGlvbjotMjhweCAtMTQ2cHg7DQogIHdp
ZHRoOjlweDsNCiAgaGVpZ2h0OjlweA0KfQ0KDQojZ2MtdG9jIHVsIC50bHctbWludXMsI2djLXRv
YyBvbCAudGx3LW1pbnVzLC50cmVlbGlzdCAudGx3LW1pbnVzIHsNCiAgYmFja2dyb3VuZC1pbWFn
ZTp1cmwoL2ltYWdlcy9zcHJpdGVzMDgxMzIwMDgucG5nKTsNCiAgYmFja2dyb3VuZC1wb3NpdGlv
bjotMjhweCAtMjEwcHg7DQogIHdpZHRoOjlweDsNCiAgaGVpZ2h0OjlweA0KfQ0KDQojZ2MtdG9j
IHVsIC50bHctcGx1czpob3ZlciwjZ2MtdG9jIG9sIC50bHctcGx1czpob3ZlciwudHJlZWxpc3Qg
LnRsdy1wbHVzOmhvdmVyIHsNCiAgYmFja2dyb3VuZC1pbWFnZTp1cmwoL2ltYWdlcy9zcHJpdGVz
MDgxMzIwMDgucG5nKTsNCiAgYmFja2dyb3VuZC1wb3NpdGlvbjotMjhweCAtMzQ0cHg7DQogIHdp
ZHRoOjlweDsNCiAgaGVpZ2h0OjlweA0KfQ0KDQojZ2MtdG9jIHVsIC50bHctbWludXM6aG92ZXIs
I2djLXRvYyBvbCAudGx3LW1pbnVzOmhvdmVyLC50cmVlbGlzdCAudGx3LW1pbnVzOmhvdmVyIHsN
CiAgYmFja2dyb3VuZC1pbWFnZTp1cmwoL2ltYWdlcy9zcHJpdGVzMDgxMzIwMDgucG5nKTsNCiAg
YmFja2dyb3VuZC1wb3NpdGlvbjotMjhweCAtNDA4cHg7DQogIHdpZHRoOjlweDsNCiAgaGVpZ2h0
OjlweA0KfQ0KDQojZ2MtdG9jIGgxLCNnYy10b2MgaDIgew0KICBmb250LXdlaWdodDpib2xkOw0K
ICBmb250LXNpemU6MTAwJTsNCiAgbWFyZ2luOjA7DQogIHBhZGRpbmc6MDsNCiAgYm9yZGVyOm5v
bmU7DQogIGJhY2tncm91bmQ6I2ZmZg0KfQ0KDQojZ2MtdG9jIGRpdi5saW5lIHsNCiAgYm9yZGVy
LXRvcDp0aGluIGRvdHRlZCAjYmJiOw0KICBoZWlnaHQ6MXB4Ow0KICBtYXJnaW46MS4zZW0gMWVt
IDAgMDsNCiAgcGFkZGluZzowDQp9DQoNCiNnYy10b2MuaGlkZGVuIHsNCiAgZGlzcGxheTpub25l
DQp9DQoNCiNnYy10b2MudmlzaWJsZSAqIHsNCiAgem9vbToxDQp9DQoNCiNnYy1wYWdlY29udGVu
dC5leHBhbmRlZCB7DQogIG1hcmdpbi1sZWZ0OjA7DQogIHdpZHRoOmF1dG8NCn0NCg0KI2djLWNv
bGxhcHNpYmxlIHsNCiAgcG9zaXRpb246YWJzb2x1dGU7DQogIGxlZnQ6LTVweDsNCiAgdG9wOjA7
DQogIHdpZHRoOjNweDsNCiAgb3ZlcmZsb3c6aGlkZGVuOw0KICBib3JkZXI6MnB4IHNvbGlkICNm
ZmY7DQogIGJvcmRlci10b3A6bm9uZTsNCiAgYm9yZGVyLWJvdHRvbTpub25lOw0KICBiYWNrZ3Jv
dW5kOiNlNWVjZjk7DQogIGN1cnNvcjpwb2ludGVyDQp9DQoNCiNnYy1jb2xsYXBzaWJsZSB7DQog
IGJhY2tncm91bmQtY29sb3I6I2RjZjZkYg0KfQ0KDQouZGVwciAjZ2MtY29sbGFwc2libGUgew0K
ICBiYWNrZ3JvdW5kLWNvbG9yOiNkZGQNCn0NCg0KI2djLWNvbGxhcHNpYmxlLmhvdmVyIHsNCiAg
Ym9yZGVyLWNvbG9yOiNkM2Q5ZTU7DQogIGJvcmRlci13aWR0aDoxcHg7DQogIHdpZHRoOjVweA0K
fQ0KDQojZ2MtY29sbGFwc2libGUuaG92ZXIgew0KICBib3JkZXItY29sb3I6IzA5MA0KfQ0KDQou
ZGVwciAjZ2MtY29sbGFwc2libGUuaG92ZXIgew0KICBib3JkZXItY29sb3I6IzMzMw0KfQ0KDQoj
Z2MtY29sbGFwc2libGUtYXJyb3cgew0KICB3aWR0aDo0cHg7DQogIGhlaWdodDoxMnB4Ow0KICBi
YWNrZ3JvdW5kOnVybCgvaW1hZ2VzL2hpZGUtYXJyb3cuZ2lmKSB0b3AgbGVmdCBuby1yZXBlYXQ7
DQogIHBvc2l0aW9uOmFic29sdXRlOw0KICBtYXJnaW4tbGVmdDotMTVweDsNCiAgZGlzcGxheTpu
b25lOw0KICB6LWluZGV4OjUNCn0NCg0KI2djLWNvbGxhcHNpYmxlLWFycm93LmNvbGxhcHNlZCB7
DQogIGJhY2tncm91bmQ6dXJsKC9pbWFnZXMvc2hvdy1hcnJvdy5naWYpIHRvcCBsZWZ0IG5vLXJl
cGVhdDsNCiAgbWFyZ2luLWxlZnQ6MTdweA0KfQ0KDQojZ2MtZm9vdGVyIHsNCiAgY2xlYXI6Ym90
aDsNCiAgbWFyZ2luOjA7DQogIGNvbG9yOiM2NjYNCn0NCg0KI2djLWZvb3RlciAudGV4dCB7DQog
IHRleHQtYWxpZ246Y2VudGVyOw0KICBwYWRkaW5nOjMwcHggMDsNCiAgbWFyZ2luOjAgMCAwIDAN
Cn0NCg0KI2djLWZvb3RlciAubm90aWNlIHsNCiAgcGFkZGluZzowIDAgOHB4IDANCn0NCg0KI3Nl
YXJjaCB7DQogIG1hcmdpbjoxMnB4IDAgMCAxNzBweA0KfQ0KDQojc2VhcmNoIHRhYmxlLCNzZWFy
Y2ggdGFibGUgdGQgew0KICBib3JkZXI6bm9uZTsNCiAgcGFkZGluZzowOw0KICBtYXJnaW46MDsN
CiAgY2xlYXI6bm9uZQ0KfQ0KDQojc2VhcmNoIGZvcm0gew0KICBtYXJnaW46MA0KfQ0KDQouZ3Jl
eXRleHQgew0KICBjb2xvcjojYWFhOw0KICBmb250LXNpemU6c21hbGw7DQogIGhlaWdodDoxNHB4
DQp9DQoNCmRpdi5zZWFyY2gtY29udHJvbCB7DQogIGRpc3BsYXk6bm9uZTsNCiAgbWFyZ2luLXRv
cDozcHg7DQogIHBhZGRpbmc6M3B4DQp9DQoNCmRpdi5zZWFyY2gtY29udHJvbCAuZ3NjLWNvbnRy
b2wgew0KICB3aWR0aDoxMDAlDQp9DQoNCmRpdi5zZWFyY2gtY29udHJvbCAuZ3NjLWFkLWJveCB7
DQogIGRpc3BsYXk6bm9uZQ0KfQ0KDQouZ3NjLWNvbnRyb2wgZm9ybS5nc2Mtc2VhcmNoLWJveCB7
DQogIGRpc3BsYXk6bm9uZQ0KfQ0KDQp0ZC5nc2MtY2xlYXItYnV0dG9uIHsNCiAgZGlzcGxheTpu
b25lDQp9DQoNCi5nc2Mtc2VhcmNoLWJ1dHRvbiB7DQogIG1hcmdpbi1sZWZ0OjFweA0KfQ0KDQou
Z3NjLWJyYW5kaW5nIHsNCiAgZGlzcGxheTpub25lDQp9DQoNCi5nc2MtdGFic0FyZWEgew0KICBi
b3JkZXItdG9wOjFweCBzb2xpZCAjMzZDOw0KICBiYWNrZ3JvdW5kOiNlNWVjZjkgbm9uZSByZXBl
YXQgc2Nyb2xsIDA7DQogIHBhZGRpbmc6NXB4IDFweCA0cHg7DQogIHdpZHRoOjEwMCUNCn0NCg0K
LmdzYy10YWJzQXJlYSAuZ3Mtc3BhY2VyIHsNCiAgZm9udC1zaXplOjA7DQogIG1hcmdpbi1yaWdo
dDowOw0KICBvdmVyZmxvdzpoaWRkZW4NCn0NCg0KLmdzYy10YWJzQXJlYSAuZ3Mtc3BhY2VyLW9w
ZXJhIHsNCiAgbWFyZ2luLXJpZ2h0OjANCn0NCg0KLmdzYy10YWJzQXJlYUludmlzaWJsZSB7DQog
IGRpc3BsYXk6bm9uZQ0KfQ0KDQouZ3NjLXRhYkhlYWRlciB7DQogIGRpc3BsYXk6aW5saW5lOw0K
ICBjdXJzb3I6cG9pbnRlcjsNCiAgcGFkZGluZy1sZWZ0OjA7DQogIHBhZGRpbmctcmlnaHQ6MDsN
CiAgbWFyZ2luLXJpZ2h0OjA7DQogIGZvbnQtd2VpZ2h0OmJvbGQNCn0NCg0KLmdzYy10YWJIZWFk
ZXIuZ3NjLXRhYmhBY3RpdmUgew0KICBwb3NpdGlvbjpyZWxhdGl2ZTsNCiAgcGFkZGluZzowIDEw
cHggMCA1cHg7DQogIGZvbnQtd2VpZ2h0OmJvbGQ7DQogIGNvbG9yOiMwMDA7DQogIGN1cnNvcjph
dXRvDQp9DQoNCi5nc2MtdGFiSGVhZGVyLmdzYy10YWJoSW5hY3RpdmUgew0KICBwYWRkaW5nOjAg
MTBweCAwIDVweDsNCiAgZm9udC13ZWlnaHQ6bm9ybWFsOw0KICB0ZXh0LWRlY29yYXRpb246dW5k
ZXJsaW5lOw0KICBjb2xvcjojMDBDDQp9DQoNCi5nc2MtdGFiRGF0YS5nc2MtdGFiZEFjdGl2ZSB7
DQogIGRpc3BsYXk6YmxvY2sNCn0NCg0KLmdzYy10YWJEYXRhLmdzYy10YWJkSW5hY3RpdmUgew0K
ICBkaXNwbGF5Om5vbmUNCn0NCg0KLmdzYy1yZXN1bHRzYm94LXZpc2libGUgew0KICB3aWR0aDo0
MmVtDQp9DQoNCi5nc2MtcmVzdWx0cyB7DQogIGNsZWFyOmJvdGg7DQogIHBhZGRpbmctYm90dG9t
OjJweDsNCiAgcGFkZGluZy10b3A6MTVweA0KfQ0KDQouZ3NjLXJlc3VsdHMgdGFibGUsLmdzYy1y
ZXN1bHRzIHRkIHsNCiAgYm9yZGVyOjANCn0NCg0KI3NlYXJjaENvbnRyb2wgLmdzLXB1Ymxpc2hl
ciB7DQogIGRpc3BsYXk6bm9uZQ0KfQ0KDQouZ3NjLXJlc3VsdCB7DQogIG1hcmdpbi1ib3R0b206
MS4yZW0NCn0NCg0KLmdzYy1yZXN1bHQgLmdzLXRpdGxlIHsNCiAgaGVpZ2h0OjEuNGVtOw0KICBv
dmVyZmxvdzpoaWRkZW47DQogIGZvbnQtc2l6ZToxMTAlDQp9DQoNCi5nc2MtcmVzdWx0IGRpdi5n
cy13YXRlcm1hcmsgew0KICBkaXNwbGF5Om5vbmUNCn0NCg0KLmdzYy1yZXN1bHRzSGVhZGVyIHsN
CiAgZGlzcGxheTpub25lDQp9DQoNCi5nc2MtcmVzdWx0cyAuZ3NjLXRyYWlsaW5nLW1vcmUtcmVz
dWx0cyB7DQogIG1hcmdpbi1ib3R0b206MTBweA0KfQ0KDQouZ3NjLXJlc3VsdHMgLmdzYy10cmFp
bGluZy1tb3JlLXJlc3VsdHMsLmdzYy1yZXN1bHRzIC5nc2MtdHJhaWxpbmctbW9yZS1yZXN1bHRz
ICogew0KICBjb2xvcjojMDBjOw0KICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lDQp9DQoNCi5n
c2MtcmVzdWx0cyAuZ3NjLWN1cnNvci1ib3ggLmdzYy10cmFpbGluZy1tb3JlLXJlc3VsdHMgew0K
ICBtYXJnaW4tYm90dG9tOjA7DQogIGRpc3BsYXk6aW5saW5lDQp9DQoNCi5nc2MtcmVzdWx0cyAu
Z3NjLWN1cnNvciB7DQogIGRpc3BsYXk6aW5saW5lDQp9DQoNCi5nc2MtcmVzdWx0cyAuZ3NjLWN1
cnNvci1ib3ggew0KICBtYXJnaW4tYm90dG9tOjEwcHgNCn0NCg0KLmdzYy1yZXN1bHRzIC5nc2Mt
Y3Vyc29yLWJveCAuZ3NjLWN1cnNvci1wYWdlIHsNCiAgY3Vyc29yOnBvaW50ZXI7DQogIGNvbG9y
OiMwMDA7DQogIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7DQogIG1hcmdpbi1yaWdodDo4cHg7
DQogIGRpc3BsYXk6aW5saW5lDQp9DQoNCi5nc2MtcmVzdWx0cyAuZ3NjLWN1cnNvci1ib3ggLmdz
Yy1jdXJzb3ItY3VycmVudC1wYWdlIHsNCiAgY29sb3I6I2E5MGEwODsNCiAgZm9udC13ZWlnaHQ6
Ym9sZDsNCiAgdGV4dC1kZWNvcmF0aW9uOm5vbmUNCn0NCg0KLmdzLXJlc3VsdCAuZ3MtdGl0bGUs
LmdzLXJlc3VsdCAuZ3MtdGl0bGUgKiB7DQogIGNvbG9yOiMwMGM7DQogIHRleHQtZGVjb3JhdGlv
bjp1bmRlcmxpbmUNCn0NCg0KLmdzLWRpdmlkZXIgew0KICBwYWRkaW5nLWJvdHRvbTo4cHg7DQog
IHRleHQtYWxpZ246Y2VudGVyOw0KICBjb2xvcjojNjc2NzY3DQp9DQoNCi5ncy1yZXN1bHQgYS5n
cy12aXNpYmxlVXJsLC5ncy1yZXN1bHQgLmdzLXZpc2libGVVcmwgew0KICBjb2xvcjpncmVlbjsN
CiAgdGV4dC1kZWNvcmF0aW9uOm5vbmUNCn0NCg0KLmdzYy13ZWJSZXN1bHQgZGl2LmdzLXZpc2li
bGVVcmwtc2hvcnQgew0KICBkaXNwbGF5Om5vbmUNCn0NCg0KLmdzLXdlYlJlc3VsdCBkaXYuZ3Mt
dmlzaWJsZVVybC1sb25nIHsNCiAgd2lkdGg6MTAwJTsNCiAgb3ZlcmZsb3c6aGlkZGVuOw0KICBk
aXNwbGF5OmJsb2NrOw0KICB3aGl0ZS1zcGFjZTpub3dyYXANCn0NCg0KLmctdHBsLTE3MCAuZy11
bml0LC5nLXVuaXQgLmctdHBsLTE3MCAuZy11bml0LC5nLXVuaXQgLmctdW5pdCAuZy10cGwtMTcw
IC5nLXVuaXQgew0KICBkaXNwbGF5OmJsb2NrOw0KICBtYXJnaW46MCAwIDAgMTcxcHg7DQogIHdp
ZHRoOmF1dG87DQogIGZsb2F0Om5vbmUNCn0NCg0KLmctdW5pdCAuZy11bml0IC5nLXRwbC0xNzAg
LmctZmlyc3QsLmctdW5pdCAuZy10cGwtMTcwIC5nLWZpcnN0LC5nLXRwbC0xNzAgLmctZmlyc3Qg
ew0KICBkaXNwbGF5OmJsb2NrOw0KICBtYXJnaW46MDsNCiAgd2lkdGg6MTcxcHg7DQogIGZsb2F0
OmxlZnQNCn0NCg0KI2NzLXNlYXJjaGFyZWEgYS51bnNlbGVjdGFibGUgew0KICAtbW96LXVzZXIt
c2VsZWN0Om5vbmU7DQogIC11c2VyLXNlbGVjdDpub25lDQp9DQoNCiNjcy1yZWNvbW1lbmRlZCB7
DQogIHRleHQtYWxpZ246bGVmdDsNCiAgYmFja2dyb3VuZC1jb2xvcjojZTNlZmZlOw0KICBmb250
LXN0eWxlOml0YWxpYw0KfQ0KDQojY3Mtc2VhcmNocmVzdWx0cyB7DQogIHBvc2l0aW9uOmFic29s
dXRlOw0KICBtYXJnaW4tbGVmdDotLjNlbTsNCiAgYmFja2dyb3VuZDojZmZmOw0KICBsaW5lLWhl
aWdodDoxNDAlOw0KICBib3JkZXI6MXB4ICNjOWM5Yzkgc29saWQ7DQogIGN1cnNvcjpwb2ludGVy
Ow0KICBwb3NpdGlvbjphYnNvbHV0ZTsNCiAgei1pbmRleDoyMDEwOw0KICBkaXNwbGF5Om5vbmUN
Cn0NCg0KI2NzLXNlYXJjaHJlc3VsdHMgYSB7DQogIHRleHQtZGVjb3JhdGlvbjpub25lOw0KICBj
b2xvcjojMDAwDQp9DQoNCi5jcy1zZWFyY2hyZXN1bHQgew0KICBwYWRkaW5nOjA7DQogIGRpc3Bs
YXk6YmxvY2sNCn0NCg0KaW1nLmNvbGxhcHNpYmxlLWNvbnRyb2wgew0KICB3aWR0aDo5cHg7DQog
IGhlaWdodDo5cHg7DQogIGN1cnNvcjpwb2ludGVyOw0KICBtYXJnaW46MXB4Ow0KICB2ZXJ0aWNh
bC1hbGlnbjptaWRkbGUNCn0NCg0KaW1nLmNvbGxhcHNpYmxlLWNvbnRyb2wuY29sbGFwc2libGUt
cGx1cyB7DQogIGJhY2tncm91bmQtaW1hZ2U6dXJsKC9pbWFnZXMvcGx1cy5naWYpDQp9DQoNCmlt
Zy5jb2xsYXBzaWJsZS1jb250cm9sLmNvbGxhcHNpYmxlLXBsdXMuY29sbGFwc2libGUtaG92ZXIg
ew0KICBiYWNrZ3JvdW5kLWltYWdlOnVybCgvaW1hZ2VzL3BsdXNfaG92ZXIuZ2lmKQ0KfQ0KDQpp
bWcuY29sbGFwc2libGUtY29udHJvbC5jb2xsYXBzaWJsZS1taW51cyB7DQogIGJhY2tncm91bmQt
aW1hZ2U6dXJsKC9pbWFnZXMvbWludXMuZ2lmKQ0KfQ0KDQppbWcuY29sbGFwc2libGUtY29udHJv
bC5jb2xsYXBzaWJsZS1taW51cy5jb2xsYXBzaWJsZS1ob3ZlciB7DQogIGJhY2tncm91bmQtaW1h
Z2U6dXJsKC9pbWFnZXMvbWludXNfaG92ZXIuZ2lmKQ0KfQ0KDQojbWFpbkNvbHVtbiB7DQogIGRp
c3BsYXk6YmxvY2s7DQogIG1hcmdpbjowIDAgMCAxNzFweDsNCiAgd2lkdGg6YXV0bzsNCiAgZmxv
YXQ6bm9uZQ0KfQ0KDQpkaXYuc3VtbWFyeSAuc3ViZHVlZCB7DQogIGNvbG9yOiByZ2IoMTQ3LCAx
ODAsIDIxNyk7DQp9DQoNCi5vcHRpb25hbCB7DQogIGNvbG9yOiByZ2IoMTI1LCAxMjUsIDEyNSk7
DQp9DQoNCi5hcGlHcm91cCBkaXYuZGVzY3JpcHRpb24gew0KICBtYXJnaW4tbGVmdDogMmVtOw0K
fQ0KDQouYXBpR3JvdXAgZGl2LnN1bW1hcnkgew0KICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTQ3
LCAxODAsIDIxNyk7DQogIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBjb3VyaWVyLCBtb25v
c3BhY2U7DQogIHBhZGRpbmc6IDAuNWVtOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjAyLCAy
MjIsIDI0NCk7DQogIG1hcmdpbi10b3A6IDFlbTsNCn0NCg0KZGl2LnN1bW1hcnkgZGl2IHsNCiAg
bWFyZ2luLWJvdHRvbTogMC41ZW07DQp9DQoNCmRpdiNicmVhZGNydW1icyB7DQogIGRpc3BsYXk6
IGlubGluZTsNCiAgZm9udC1zaXplOiA4MCU7DQp9DQoNCi5leGFtcGxlTGluayB7DQogIGZvbnQt
c2l6ZTogODAlOw0KfQ0KDQpkZCB7DQogIG1hcmdpbi1ib3R0b206IDAuNzVlbTsNCn0NCg0Kb2wg
bGkgew0KICBtYXJnaW4tdG9wOiAxZW07DQp9DQoNCi5leGFtcGxlIHsNCn0NCg0KcCNjbGFzc1N1
bW1hcnkgew0KfQ0KDQouYXBpSXRlbSB7DQp9DQoNCmRpdi5ub3RlIHsNCiAgYmFja2dyb3VuZC1j
b2xvcjogcmdiKDIwMiwgMjIyLCAyNDQpOw0KICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTQ3LCAx
ODAsIDIxNyk7DQogIHBhZGRpbmc6IDAuNWVtOw0KICBtYXJnaW46IDFlbSAwcHg7DQp9DQoNCi5o
aWRkZW4gew0KICBkaXNwbGF5OiBub25lOw0KfQ0KDQojZ2MtcGFnZWNvbnRlbnQgew0KfQ0KDQoj
bWFpbkNvbHVtbiB0YWJsZS5pbWFnZWxheW91dCB7DQogIGJvcmRlcjpub25lOw0KfQ0KDQojbWFp
bkNvbHVtbiB0YWJsZS5pbWFnZWxheW91dCB0ZCB7DQogIGJvcmRlcjpub25lOw0KICBwYWRkaW5n
OjBweCA2cHggNnB4Ow0KICB0ZXh0LWFsaWduOmNlbnRlcjsNCn0NCg0KI21haW5Db2x1bW4gdGFi
bGUuaW1hZ2VsYXlvdXQgdHIuaW1hZ2VzIHRkIHsNCiAgdmVydGljYWwtYWxpZ246Ym90dG9tOw0K
fQ0KDQp0YWJsZS5ub2JvcmRlcnMgew0KICBwYWRkaW5nOjBweDsNCn0NCg0KdGFibGUubm9ib3Jk
ZXJzIHRoIHsNCiAgYm9yZGVyOm5vbmU7DQogIHBhZGRpbmc6MTJweCAxMnB4IDZweCAwcHgNCn0N
CnRhYmxlLm5vYm9yZGVycyB0ZCB7DQogIGJvcmRlcjpub25lOw0KICBwYWRkaW5nOjZweCAxMnB4
IDZweCAwcHgNCn0NCg0KI2NvZGVzaXRlQ29udGVudC5oaWRlU2lkZU5hdiAjZ2MtcGFnZWNvbnRl
bnQgew0KICBwYWRkaW5nLWxlZnQ6MjRweDsNCiAgYm9yZGVyLWxlZnQ6MHB4Ow0KfQ0KDQojY29k
ZXNpdGVDb250ZW50LmhpZGVTaWRlTmF2IC5nLXRwbC0xNzAgLmctdW5pdCB7DQogIGRpc3BsYXk6
YmxvY2s7DQogIG1hcmdpbjowIDAgMCAwcHg7DQogIHdpZHRoOmF1dG87DQogIGZsb2F0Om5vbmUN
Cn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCihmdW5jdGlv
bigpe2Z1bmN0aW9uIGooYSxiKXtmb3IodmFyIGMgaW4gYilhW2NdPWJbY119ZnVuY3Rpb24gbCgp
e3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbC5hcHBseShBcnJheS5wcm90b3R5cGUuc2xp
Y2UsYXJndW1lbnRzKX1mdW5jdGlvbiBtKGEsYil7dmFyIGM9bChhcmd1bWVudHMsMik7cmV0dXJu
IGZ1bmN0aW9uKCl7cmV0dXJuIGIuYXBwbHkoYSxjKX19dmFyIG49OTtmdW5jdGlvbiBvKGEsYil7
Yj1uZXcgcChiKTtmb3IoYi5mPVthXTtiLmYubGVuZ3RoOyl7YT1iLmYuc2hpZnQoKTtiLmcoYSk7
Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PTEmJmIuZi5w
dXNoKGEpfX1mdW5jdGlvbiBwKGEpe3RoaXMuZz1hfWZ1bmN0aW9uIHEoYSxiLGMpe2Euc2V0QXR0
cmlidXRlKGIsYyl9ZnVuY3Rpb24gcihhLGIpe2EucmVtb3ZlQXR0cmlidXRlKGIpfWZ1bmN0aW9u
IHMoYSl7YS5zdHlsZS5kaXNwbGF5PSIifQ0KZnVuY3Rpb24gdChhKXthLnN0eWxlLmRpc3BsYXk9
Im5vbmUifTt2YXIgdT0iOiIsdj0vXHMqO1xzKi87ZnVuY3Rpb24gdygpe3RoaXMuaS5hcHBseSh0
aGlzLGFyZ3VtZW50cyl9dy5wcm90b3R5cGUuaT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYo
IWMuYSljLmE9e307Yj9qKGMuYSxiLmEpOmooYy5hLHgpO2MuYS4kdGhpcz1hO2MuYS4kY29udGV4
dD1jO2MuZD10eXBlb2YgYSE9InVuZGVmaW5lZCImJmEhPW51bGw/YToiIjtpZighYiljLmEuJHRv
cD1jLmR9O3ZhciB4PXt9OyhmdW5jdGlvbihhLGIpe3hbYV09Yn0pKCIkZGVmYXVsdCIsbnVsbCk7
dmFyIHk9W107ZnVuY3Rpb24geihhKXtmb3IodmFyIGIgaW4gYS5hKWRlbGV0ZSBhLmFbYl07YS5k
PW51bGw7eS5wdXNoKGEpfWZ1bmN0aW9uIEEoYSxiLGMpe3RyeXtyZXR1cm4gYi5jYWxsKGMsYS5h
LGEuZCl9Y2F0Y2goZSl7cmV0dXJuIHguJGRlZmF1bHR9fQ0KZnVuY3Rpb24gQihhLGIsYyxlKXtp
Zih5Lmxlbmd0aD4wKXt2YXIgZD15LnBvcCgpO3cuY2FsbChkLGIsYSk7YT1kfWVsc2UgYT1uZXcg
dyhiLGEpO2EuYS4kaW5kZXg9YzthLmEuJGNvdW50PWU7cmV0dXJuIGF9dmFyIEM9ImFfIixFPSJi
XyIsRj0id2l0aCAoYV8pIHdpdGggKGJfKSByZXR1cm4gIixHPXt9O2Z1bmN0aW9uIEgoYSl7aWYo
IUdbYV0pdHJ5e0dbYV09bmV3IEZ1bmN0aW9uKEMsRSxGK2EpfWNhdGNoKGIpe31yZXR1cm4gR1th
XX1mdW5jdGlvbiBJKGEpe3JldHVybiBhfWZ1bmN0aW9uIEooYSl7dmFyIGI9W107YT1hLnNwbGl0
KHYpO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlOysrYyl7dmFyIGQ9YVtjXS5pbmRleE9mKHUp
O2lmKCEoZDwwKSl7dmFyIGY7Zj1hW2NdLnN1YnN0cigwLGQpLnJlcGxhY2UoL15ccysvLCIiKS5y
ZXBsYWNlKC9ccyskLywiIik7ZD1IKGFbY10uc3Vic3RyKGQrMSkpO2IucHVzaChmLGQpfX1yZXR1
cm4gYn0NCmZ1bmN0aW9uIEsoYSl7dmFyIGI9W107YT1hLnNwbGl0KHYpO2Zvcih2YXIgYz0wLGU9
YS5sZW5ndGg7YzxlOysrYylpZihhW2NdKXt2YXIgZD1IKGFbY10pO2IucHVzaChkKX1yZXR1cm4g
Yn07dmFyIEw9ImpzaW5zdGFuY2UiLGFhPSJqc3RzIixNPSIqIixOPSJkaXYiLGJhPSJpZCI7ZnVu
Y3Rpb24gY2EoYSxiKXt2YXIgYz1uZXcgTztQKGIpO2Muaj1iP2Iubm9kZVR5cGU9PW4/YjpiLm93
bmVyRG9jdW1lbnR8fGRvY3VtZW50OmRvY3VtZW50O3ZhciBlPW0oYyxjLmUsYSxiKTthPWMuaD1b
XTtiPWMuaz1bXTtjLmM9W107ZSgpO2Zvcih2YXIgZCxmLGc7YS5sZW5ndGg7KXtkPWFbYS5sZW5n
dGgtMV07ZT1iW2IubGVuZ3RoLTFdO2lmKGU+PWQubGVuZ3RoKXtlPWEucG9wKCk7ZS5sZW5ndGg9
MDtjLmMucHVzaChlKTtiLnBvcCgpfWVsc2V7Zj1kW2UrK107Zz1kW2UrK107ZD1kW2UrK107Ylti
Lmxlbmd0aC0xXT1lO2YuY2FsbChjLGcsZCl9fX1mdW5jdGlvbiBPKCl7fXZhciBkYT0wLFE9e307
UVswXT17fTt2YXIgUj17fSxTPXt9LFQ9W107ZnVuY3Rpb24gUChhKXthLl9fanN0Y2FjaGV8fG8o
YSxmdW5jdGlvbihiKXtVKGIpfSl9DQp2YXIgVj1bWyJqc3NlbGVjdCIsSF0sWyJqc2Rpc3BsYXki
LEhdLFsianN2YWx1ZXMiLEpdLFsianN2YXJzIixKXSxbImpzZXZhbCIsS10sWyJ0cmFuc2NsdWRl
IixJXSxbImpzY29udGVudCIsSF0sWyJqc3NraXAiLEhdXTsNCmZ1bmN0aW9uIFUoYSl7aWYoYS5f
X2pzdGNhY2hlKXJldHVybiBhLl9fanN0Y2FjaGU7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoImpzdGNh
Y2hlIik7aWYoYiE9bnVsbClyZXR1cm4gYS5fX2pzdGNhY2hlPVFbYl07Yj1ULmxlbmd0aD0wO2Zv
cih2YXIgYz1WLmxlbmd0aDtiPGM7KytiKXt2YXIgZT1WW2JdWzBdLGQ9YS5nZXRBdHRyaWJ1dGUo
ZSk7U1tlXT1kO2QhPW51bGwmJlQucHVzaChlKyI9IitkKX1pZihULmxlbmd0aD09MCl7YS5zZXRB
dHRyaWJ1dGUoImpzdGNhY2hlIiwiMCIpO3JldHVybiBhLl9fanN0Y2FjaGU9UVswXX12YXIgZj1U
LmpvaW4oIiYiKTtpZihiPVJbZl0pe2Euc2V0QXR0cmlidXRlKCJqc3RjYWNoZSIsYik7cmV0dXJu
IGEuX19qc3RjYWNoZT1RW2JdfXZhciBnPXt9O2I9MDtmb3IoYz1WLmxlbmd0aDtiPGM7KytiKXtk
PVZbYl07ZT1kWzBdO3ZhciBpPWRbMV07ZD1TW2VdO2lmKGQhPW51bGwpZ1tlXT1pKGQpfWI9IiIr
ICsrZGE7YS5zZXRBdHRyaWJ1dGUoImpzdGNhY2hlIiwNCmIpO1FbYl09ZztSW2ZdPWI7cmV0dXJu
IGEuX19qc3RjYWNoZT1nfWZ1bmN0aW9uIFcoYSxiKXthLmgucHVzaChiKTthLmsucHVzaCgwKX1m
dW5jdGlvbiBYKGEpe3JldHVybiBhLmMubGVuZ3RoP2EuYy5wb3AoKTpbXX1PLnByb3RvdHlwZS5l
PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxlPVkoYyxiKSxkPWUudHJhbnNjbHVkZTtpZihkKWlm
KGU9WihkKSl7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpO2I9WChjKTtiLnB1c2goYy5l
LGEsZSk7VyhjLGIpfWVsc2UgYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2Vsc2UoZT1lLmpz
c2VsZWN0KT9lYShjLGEsYixlKTpjLmIoYSxiKX07DQpPLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEs
Yil7dmFyIGM9dGhpcyxlPVkoYyxiKSxkPWUuanNkaXNwbGF5O2lmKGQpe2lmKCFBKGEsZCxiKSl7
dChiKTtyZXR1cm59cyhiKX0oZD1lLmpzdmFycykmJmZhKGMsYSxiLGQpOyhkPWUuanN2YWx1ZXMp
JiZnYShjLGEsYixkKTtpZihkPWUuanNldmFsKWZvcih2YXIgZj0wLGc9ZC5sZW5ndGg7ZjxnOysr
ZilBKGEsZFtmXSxiKTtpZihkPWUuanNza2lwKWlmKEEoYSxkLGIpKXJldHVybjtpZihlPWUuanNj
b250ZW50KXthPSIiK0EoYSxlLGIpO2lmKGIuaW5uZXJIVE1MIT1hKXtmb3IoO2IuZmlyc3RDaGls
ZDspYi5maXJzdENoaWxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtjPWMu
ai5jcmVhdGVUZXh0Tm9kZShhKTtiLmFwcGVuZENoaWxkKGMpfX1lbHNle2U9WChjKTtmb3IoYj1i
LmZpcnN0Q2hpbGQ7YjtiPWIubmV4dFNpYmxpbmcpYi5ub2RlVHlwZT09MSYmZS5wdXNoKGMuZSxh
LGIpO2UubGVuZ3RoJiZXKGMsZSl9fTsNCmZ1bmN0aW9uIGVhKGEsYixjLGUpe2U9QShiLGUsYyk7
dmFyIGQ9Yy5nZXRBdHRyaWJ1dGUoTCksZj1mYWxzZTtpZihkKWlmKGQuY2hhckF0KDApPT1NKXt2
YXIgZz1kLnN1YnN0cigxKTtkPXBhcnNlSW50KGcsMTApO2Y9dHJ1ZX1lbHNlIGQ9cGFyc2VJbnQo
ZCwxMCk7dmFyIGk9ZSE9bnVsbCYmdHlwZW9mIGU9PSJvYmplY3QiJiZ0eXBlb2YgZS5sZW5ndGg9
PSJudW1iZXIiO2c9aT9lLmxlbmd0aDoxO3ZhciBoPWkmJmc9PTA7aWYoaSlpZihoKWlmKGQpYy5w
YXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO2Vsc2V7Yy5zZXRBdHRyaWJ1dGUoTCwiKjAiKTt0KGMp
fWVsc2V7cyhjKTtpZihkPT09bnVsbHx8ZD09PSIifHxmJiZkPGctMSl7Zj1YKGEpO2Q9ZHx8MDtm
b3IoaT1nLTE7ZDxpOysrZCl7dmFyIGs9Yy5jbG9uZU5vZGUodHJ1ZSk7Yy5wYXJlbnROb2RlLmlu
c2VydEJlZm9yZShrLGMpOyQoayxlLGQpO2g9QihiLGVbZF0sZCxnKTtmLnB1c2goYS5iLGgsayx6
LGgsbnVsbCl9JChjLA0KZSxkKTtoPUIoYixlW2RdLGQsZyk7Zi5wdXNoKGEuYixoLGMseixoLG51
bGwpO1coYSxmKX1lbHNlIGlmKGQ8Zyl7Zj1lW2RdOyQoYyxlLGQpO2g9QihiLGYsZCxnKTtmPVgo
YSk7Zi5wdXNoKGEuYixoLGMseixoLG51bGwpO1coYSxmKX1lbHNlIGMucGFyZW50Tm9kZS5yZW1v
dmVDaGlsZChjKX1lbHNlIGlmKGU9PW51bGwpdChjKTtlbHNle3MoYyk7aD1CKGIsZSwwLDEpO2Y9
WChhKTtmLnB1c2goYS5iLGgsYyx6LGgsbnVsbCk7VyhhLGYpfX1mdW5jdGlvbiBmYShhLGIsYyxl
KXthPTA7Zm9yKHZhciBkPWUubGVuZ3RoO2E8ZDthKz0yKXt2YXIgZj1lW2FdLGc9QShiLGVbYSsx
XSxjKTtiLmFbZl09Z319DQpmdW5jdGlvbiBnYShhLGIsYyxlKXthPTA7Zm9yKHZhciBkPWUubGVu
Z3RoO2E8ZDthKz0yKXt2YXIgZj1lW2FdLGc9QShiLGVbYSsxXSxjKTtpZihmLmNoYXJBdCgwKT09
IiQiKWIuYVtmXT1nO2Vsc2UgaWYoZi5jaGFyQXQoMCk9PSIuIil7Zj1mLnN1YnN0cigxKS5zcGxp
dCgiLiIpO2Zvcih2YXIgaT1jLGg9Zi5sZW5ndGgsaz0wLGhhPWgtMTtrPGhhOysrayl7dmFyIEQ9
ZltrXTtpW0RdfHwoaVtEXT17fSk7aT1pW0RdfWlbZltoLTFdXT1nfWVsc2UgaWYoZilpZih0eXBl
b2YgZz09ImJvb2xlYW4iKWc/cShjLGYsZik6cihjLGYpO2Vsc2UgYy5zZXRBdHRyaWJ1dGUoZiwi
IitnKX19ZnVuY3Rpb24gWShhLGIpe2lmKGIuX19qc3RjYWNoZSlyZXR1cm4gYi5fX2pzdGNhY2hl
O2lmKGE9Yi5nZXRBdHRyaWJ1dGUoImpzdGNhY2hlIikpcmV0dXJuIGIuX19qc3RjYWNoZT1RW2Fd
O3JldHVybiBVKGIpfQ0KZnVuY3Rpb24gWihhLGIpe3ZhciBjPWRvY3VtZW50O2lmKGE9Yj9pYShj
LGEsYik6Yy5nZXRFbGVtZW50QnlJZChhKSl7UChhKTthPWEuY2xvbmVOb2RlKHRydWUpO2EucmVt
b3ZlQXR0cmlidXRlKGJhKTtyZXR1cm4gYX1lbHNlIHJldHVybiBudWxsfWZ1bmN0aW9uIGlhKGEs
YixjLGUpe3ZhciBkPWEuZ2V0RWxlbWVudEJ5SWQoYik7aWYoZClyZXR1cm4gZDtjPWMoKTtlPWV8
fGFhO2lmKGQ9YS5nZXRFbGVtZW50QnlJZChlKSlkPWQ7ZWxzZXtkPWEuY3JlYXRlRWxlbWVudChO
KTtkLmlkPWU7dChkKTtkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7YS5ib2R5LmFwcGVuZENo
aWxkKGQpfWU9YS5jcmVhdGVFbGVtZW50KE4pO2QuYXBwZW5kQ2hpbGQoZSk7ZS5pbm5lckhUTUw9
YztyZXR1cm4gZD1hLmdldEVsZW1lbnRCeUlkKGIpfWZ1bmN0aW9uICQoYSxiLGMpe2M9PWIubGVu
Z3RoLTE/cShhLEwsTStjKTpxKGEsTCwiIitjKX07d2luZG93LmpzdEdldFRlbXBsYXRlPVo7d2lu
ZG93LkpzRXZhbENvbnRleHQ9dzt3aW5kb3cuanN0UHJvY2Vzcz1jYTsNCn0pKCkNCjwvc2NyaXB0
Pg0KDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpBcnJheS5wcm90b3R5cGUuZWFj
aCA9IGZ1bmN0aW9uKGYpIHsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsr
KSB7DQogICAgZih0aGlzW2ldLCBpKTsNCiAgfQ0KfQ0KDQovLyBWaXNpdHMgZWFjaCBpdGVtIGlu
IHRoZSBsaXN0IGluLW9yZGVyLiBTdG9wcyB3aGVuIGYgcmV0dXJucyBhbnkgdHJ1dGh5DQovLyB2
YWx1ZSBhbmQgcmV0dXJucyB0aGF0IG5vZGUuDQpBcnJheS5wcm90b3R5cGUuc2VsZWN0ID0gZnVu
Y3Rpb24oZikgew0KICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsNCiAg
ICBpZiAoZih0aGlzW2ldLCBpKSkNCiAgICAgIHJldHVybiB0aGlzW2ldOw0KICB9DQp9DQoNCkFy
cmF5LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmKSB7DQogIHZhciByZXR2YWwgPSBbXTsNCiAg
Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7DQogICAgcmV0dmFsLnB1c2go
Zih0aGlzW2ldLCBpKSk7DQogIH0NCiAgcmV0dXJuIHJldHZhbDsNCn0NCg0KLy8gQXNzaWducyBh
bGwga2V5cyAmIHZhbHVlcyBvZiB8b2JqMnwgdG8gfG9iajF8Lg0KZnVuY3Rpb24gZXh0ZW5kKG9i
aiwgb2JqMikgew0KICBmb3IgKHZhciBrIGluIG9iajIpIHsNCiAgICBvYmpba10gPSBvYmoyW2td
Ow0KICB9DQp9DQoNCmZ1bmN0aW9uIGdldEZ1bGx5UXVhbGlmaWVkRnVuY3Rpb25OYW1lKG5hbWVz
cGFjZSwgZnVuYykgew0KICByZXR1cm4gbmFtZXNwYWNlICsgIi4iICsgZnVuYy5uYW1lOw0KfQ0K
DQpmdW5jdGlvbiBoYXNDYWxsYmFjayhwYXJhbWV0ZXJzKSB7DQogIHJldHVybiAocGFyYW1ldGVy
cy5sZW5ndGggPiAwICYmDQogICAgICAgICAgcGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aCAt
IDFdLnR5cGUgPT0gImZ1bmN0aW9uIik7DQp9DQoNCmZ1bmN0aW9uIGdldENhbGxiYWNrUGFyYW1l
dGVycyhwYXJhbWV0ZXJzKSB7DQogIHJldHVybiBwYXJhbWV0ZXJzW3BhcmFtZXRlcnMubGVuZ3Ro
IC0gMV07DQp9DQoNCmZ1bmN0aW9uIHNob3VsZEV4cGFuZE9iamVjdChvYmplY3QpIHsNCiAgcmV0
dXJuIChvYmplY3QudHlwZSA9PSAib2JqZWN0IiAmJiBvYmplY3QucHJvcGVydGllcykNCn0NCg0K
ZnVuY3Rpb24gaXNBcnJheSh0eXBlKSB7DQogIHJldHVybiB0eXBlLnR5cGUgPT0gJ2FycmF5JzsN
Cn0NCg0KZnVuY3Rpb24gZ2V0VHlwZVJlZih0eXBlKSB7DQogIHJldHVybiB0eXBlWyIkcmVmIl07
DQp9DQoNCmZ1bmN0aW9uIGdldFByb3BlcnR5TGlzdEZyb21PYmplY3Qob2JqZWN0KSB7DQogIHZh
ciBwcm9wZXJ0eUxpc3QgPSBbXTsNCiAgZm9yICh2YXIgcCBpbiBvYmplY3QucHJvcGVydGllcykg
ew0KICAgIHZhciBwcm9wID0gb2JqZWN0LnByb3BlcnRpZXNbcF07DQogICAgcHJvcC5uYW1lID0g
cDsNCiAgICBwcm9wZXJ0eUxpc3QucHVzaChwcm9wKTsNCiAgfQ0KICByZXR1cm4gcHJvcGVydHlM
aXN0Ow0KfQ0KDQpmdW5jdGlvbiBnZXRUeXBlTmFtZShzY2hlbWEpIHsNCiAgaWYgKHNjaGVtYS4k
cmVmKQ0KICAgIHJldHVybiBzY2hlbWEuJHJlZjsNCg0KICBpZiAoc2NoZW1hLmNob2ljZXMpIHsN
CiAgICB2YXIgdHlwZU5hbWVzID0gW107DQogICAgc2NoZW1hLmNob2ljZXMuZWFjaChmdW5jdGlv
bihjKSB7DQogICAgICB0eXBlTmFtZXMucHVzaChnZXRUeXBlTmFtZShjKSk7DQogICAgfSk7DQoN
CiAgICByZXR1cm4gdHlwZU5hbWVzLmpvaW4oIiBvciAiKTsNCiAgfQ0KDQogIGlmIChzY2hlbWEu
dHlwZSA9PSAiYXJyYXkiKQ0KICAgIHJldHVybiAiYXJyYXkgb2YgIiArIGdldFR5cGVOYW1lKHNj
aGVtYS5pdGVtcyk7DQoNCiAgaWYgKHNjaGVtYS5pc0luc3RhbmNlT2YpDQogICAgcmV0dXJuIHNj
aGVtYS5pc0luc3RhbmNlT2Y7DQoNCiAgcmV0dXJuIHNjaGVtYS50eXBlOw0KfQ0KDQpmdW5jdGlv
biBnZXRUeXBlTmFtZShzY2hlbWEpIHsNCiAgaWYgKHNjaGVtYS4kcmVmKQ0KICAgIHJldHVybiBz
Y2hlbWEuJHJlZjsNCg0KICBpZiAoc2NoZW1hLmNob2ljZXMpIHsNCiAgICB2YXIgdHlwZU5hbWVz
ID0gW107DQogICAgc2NoZW1hLmNob2ljZXMuZWFjaChmdW5jdGlvbihjKSB7DQogICAgICB0eXBl
TmFtZXMucHVzaChnZXRUeXBlTmFtZShjKSk7DQogICAgfSk7DQoNCiAgICByZXR1cm4gdHlwZU5h
bWVzLmpvaW4oIiBvciAiKTsNCiAgfQ0KDQogIGlmIChzY2hlbWEudHlwZSA9PSAiYXJyYXkiKQ0K
ICAgIHJldHVybiAiYXJyYXkgb2YgIiArIGdldFR5cGVOYW1lKHNjaGVtYS5pdGVtcyk7DQoNCiAg
aWYgKHNjaGVtYS5pc0luc3RhbmNlT2YpDQogICAgcmV0dXJuIHNjaGVtYS5pc0luc3RhbmNlT2Y7
DQoNCiAgcmV0dXJuIHNjaGVtYS50eXBlOw0KfQ0KDQpmdW5jdGlvbiBnZXRTaWduYXR1cmVTdHJp
bmcocGFyYW1ldGVycykgew0KICBpZiAoIXBhcmFtZXRlcnMpDQogICAgcmV0dXJuICIiOw0KICB2
YXIgcmV0dmFsID0gW107DQogIHBhcmFtZXRlcnMuZWFjaChmdW5jdGlvbihwYXJhbSwgaSkgew0K
ICAgIHJldHZhbC5wdXNoKGdldFR5cGVOYW1lKHBhcmFtKSArICIgIiArIHBhcmFtLm5hbWUpOw0K
ICB9KTsNCg0KICByZXR1cm4gcmV0dmFsLmpvaW4oIiwgIik7DQp9DQoNCmZ1bmN0aW9uIHNvcnRC
eU5hbWUoYSwgYikgew0KICBpZiAoYS5uYW1lIDwgYi5uYW1lKSB7DQogICAgcmV0dXJuIC0xOw0K
ICB9DQogIGlmIChhLm5hbWUgPiBiLm5hbWUpIHsNCiAgICByZXR1cm4gMTsNCiAgfQ0KICByZXR1
cm4gMDsNCn0NCg0KZnVuY3Rpb24gcmVuZGVyUGFnZSgpDQp7DQogICAgdmFyIGlucHV0ID0gbmV3
IEpzRXZhbENvbnRleHQoaW5zcGVjdG9yQVBJKTsNCiAgICB2YXIgb3V0cHV0ID0gZG9jdW1lbnQu
Ym9keTsNCiAgICBqc3RQcm9jZXNzKGlucHV0LCBvdXRwdXQpOw0KDQp9DQo8L3NjcmlwdD4NCjwv
aGVhZD4NCg0KPGJvZHkgb25sb2FkPSJyZW5kZXJQYWdlKCkiPg0KDQo8IS0tIGNvbW1vbiB0ZW1w
bGF0ZXMgLS0+DQoNCjxkaXYganNza2lwPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTpub25lIj4NCg0K
ICA8IS0tIFZBTFVFIC0tPg0KICA8ZGl2IGlkPSJ2YWx1ZVRlbXBsYXRlIj4NCiAgICA8ZHQ+DQog
ICAgICA8dmFyIGpzZGlzcGxheT0iJHRoaXMubmFtZSIganNjb250ZW50PSIkdGhpcy5uYW1lIj5w
YXJhbU5hbWU8L3Zhcj4NCiAgICAgICAgPGVtPg0KDQogICAgICAgICAgPCEtLSBUWVBFIC0tPg0K
ICAgICAgICAgIDxzcGFuIGpzZGlzcGxheT0iJHRoaXMudHlwZSAhPT0gJ2Z1bmN0aW9uJyI+DQog
ICAgICAgICAgICAoDQogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJvcHRpb25hbCIganNkaXNw
bGF5PSJvcHRpb25hbCI+b3B0aW9uYWw8L3NwYW4+DQogICAgICAgICAgICAgIDxzcGFuIGlkPSJ0
eXBlVGVtcGxhdGUiPg0KICAgICAgICAgICAgICAgIDxzcGFuIGpzZGlzcGxheT0iZ2V0VHlwZVJl
ZigkdGhpcykiPg0KICAgICAgICAgICAgICAgICAgPGEganN2YWx1ZXM9Ii5ocmVmOiAnI3R5cGUt
JyArIGdldFR5cGVSZWYoJHRoaXMpIiBqc2NvbnRlbnQ9ImdldFR5cGVSZWYoJHRoaXMpIj4gVHlw
ZTwvYT4NCiAgICAgICAgICAgICAgICA8L3NwYW4+DQogICAgICAgICAgICAgICAgPHNwYW4ganNk
aXNwbGF5PSIhZ2V0VHlwZVJlZigkdGhpcykiPg0KICAgICAgICAgICAgICAgICAgPHNwYW4ganNk
aXNwbGF5PSJpc0FycmF5KCR0aGlzKSI+DQogICAgICAgICAgICAgICAgICAgIGFycmF5IG9mIDxz
cGFuIGpzc2VsZWN0PSJpdGVtcyI+PHNwYW4gdHJhbnNjbHVkZT0idHlwZVRlbXBsYXRlIj48L3Nw
YW4+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgPC9zcGFuPg0KICAgICAgICAgICAgICAgICAg
PHNwYW4ganNkaXNwbGF5PSIhaXNBcnJheSgkdGhpcykiIGpzY29udGVudD0iZ2V0VHlwZU5hbWUo
JHRoaXMpIj5wYXJhbVR5cGU8L3NwYW4+DQogICAgICAgICAgICAgICAgPC9zcGFuPg0KICAgICAg
ICAgICAgICA8L3NwYW4+DQogICAgICAgICAgICApDQogICAgICAgICAgPC9zcGFuPg0KICAgICAg
ICAgIDxzcGFuIGpzZGlzcGxheT0iJHRoaXMudHlwZSA9PT0gJ2Z1bmN0aW9uJyIganNjb250ZW50
PSInOiBmdW5jdGlvbignICsgZ2V0U2lnbmF0dXJlU3RyaW5nKCR0aGlzLnBhcmFtZXRlcnMpICsg
JyknIj4NCiAgICAgICAgICA8L3NwYW4+DQogICAgICAgIDwvZW0+DQogICAgPC9kdD4NCiAgICA8
ZGQgY2xhc3M9InRvZG8iIGpzZGlzcGxheT0iISR0aGlzLmRlc2NyaXB0aW9uIj4NCiAgICAgIFVu
ZG9jdW1lbnRlZC4NCiAgICA8L2RkPg0KICAgIDxkZCBqc2Rpc3BsYXk9IiR0aGlzLmRlc2NyaXB0
aW9uIg0KICAgICAgICBqc3ZhbHVlcz0iLmlubmVySFRNTDokdGhpcy5kZXNjcmlwdGlvbiI+DQog
ICAgICBEZXNjcmlwdGlvbiBvZiB0aGlzIHBhcmFtZXRlciBmcm9tIHRoZSBqc29uIHNjaGVtYS4N
CiAgICA8L2RkPg0KDQogICAgPCEtLSBPQkpFQ1QgUFJPUEVSVElFUyAtLT4NCiAgICA8ZGQganNk
aXNwbGF5PSJzaG91bGRFeHBhbmRPYmplY3QoJHRoaXMpIj4NCiAgICAgIDxoMz5Qcm9wZXJ0aWVz
PC9oMz4NCiAgICAgIDxkbD4NCiAgICAgICAgPGRpdiBqc3NlbGVjdD0iZ2V0UHJvcGVydHlMaXN0
RnJvbU9iamVjdCgkdGhpcykiPg0KICAgICAgICAgIDxkaXYgdHJhbnNjbHVkZT0idmFsdWVUZW1w
bGF0ZSI+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgICAgPC9kbD4NCiAg
ICA8L2RkPg0KICAgIDxkZCBqc2Rpc3BsYXk9IiR0aGlzLnR5cGUgPT09ICdvYmplY3QnICYmICR0
aGlzLmZ1bmN0aW9ucyI+DQogICAgICAgIDxkaXYgdHJhbnNjbHVkZT0ibWV0aG9kc1RlbXBsYXRl
IiBqc2Rpc3BsYXk9IiR0aGlzLmZ1bmN0aW9ucyAmJiAkdGhpcy5mdW5jdGlvbnMubGVuZ3RoID4g
MCIgY2xhc3M9ImFwaUdyb3VwIj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kZD4NCiAgICA8ZGQg
anNkaXNwbGF5PSIkdGhpcy50eXBlID09PSAnb2JqZWN0JyAmJiAkdGhpcy5ldmVudHMiPg0KICAg
ICAgPGgzPkV2ZW50czwvaDM+DQogICAgICA8ZGw+DQogICAgICA8IS0tIGl0ZXJhdGVzIG92ZXIg
YWxsIGV2ZW50cyAtLT4NCiAgICAgIDxkaXYganNzZWxlY3Q9IiR0aGlzLmV2ZW50cy5zb3J0KHNv
cnRCeU5hbWUpIiBjbGFzcz0iYXBpSXRlbSINCiAgICAgICAgICAganNkaXNwbGF5PSIhKCR0aGlz
Lm5vZG9jKSI+DQogICAgICAgIDxkaXYgdHJhbnNjbHVkZT0iZXZlbnRUZW1wbGF0ZSI+PC9kaXY+
DQogICAgICA8L2Rpdj4NCiAgICAgIDwvZGw+DQogICAgPC9kZD4NCiAgPC9kaXY+IDwhLS0gL1ZB
TFVFIC0tPg0KDQogIDxkaXYgaWQ9ImV2ZW50VGVtcGxhdGUiPg0KICAgIDxhIGpzdmFsdWVzPSIu
bmFtZTonZXZlbnQtJyArICRtb2RuYW1lICsgJy0nICsgbmFtZSI+PC9hPg0KICAgIDxoNCBqc2Nv
bnRlbnQ9Im5hbWUiPmV2ZW50IG5hbWU8L2g0Pg0KDQogICAgPGRpdiBjbGFzcz0ic3VtbWFyeSI+
DQogICAgICA8IS0tIE5vdGU6IGludGVudGlvbmFsbHkgbG9uZ2VyIDgwIGNvbHVtbnMgLS0+DQog
ICAgICA8c3BhbiBqc2NvbnRlbnQ9IiRtb2RuYW1lICsgJy4nIiBjbGFzcz0ic3ViZHVlZCI+PC9z
cGFuPjxzcGFuIGpzY29udGVudD0ibmFtZSI+PC9zcGFuPjxzcGFuIGNsYXNzPSJzdWJkdWVkIj4u
YWRkTGlzdGVuZXI8L3NwYW4+KGZ1bmN0aW9uKDxzcGFuIGpzY29udGVudD0iZ2V0U2lnbmF0dXJl
U3RyaW5nKCR0aGlzLnBhcmFtZXRlcnMpIj5UeXBlIHBhcmFtMSwgVHlwZSBwYXJhbTI8L3NwYW4+
KSA8c3BhbiBjbGFzcz0ic3ViZHVlZCI+ey4uLn08L3NwYW4+KTsNCiAgICA8L2Rpdj4NCg0KICAg
IDxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uIj4NCiAgICAgIDxwIGNsYXNzPSJ0b2RvIiBqc2Rpc3Bs
YXk9IiFkZXNjcmlwdGlvbiI+VW5kb2N1bWVudGVkLjwvcD4NCiAgICAgIDxwIGpzZGlzcGxheT0i
ZGVzY3JpcHRpb24iIGpzdmFsdWVzPSIuaW5uZXJIVE1MOmRlc2NyaXB0aW9uIj4NCiAgICAgICAg
QSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBqc29uIHNjaGVtYSBkZWYgb2YgdGhlIGV2ZW50IGdvZXMg
aGVyZS4NCiAgICAgIDwvcD4NCg0KICAgICAgPCEtLSBQQVJBTUVURVJTIC0tPg0KICAgICAgPGg0
IGpzZGlzcGxheT0icGFyYW1ldGVycyI+UGFyYW1ldGVyczwvaDQ+DQogICAgICA8ZGw+DQogICAg
ICAgIDxkaXYganNzZWxlY3Q9InBhcmFtZXRlcnMiPg0KICAgICAgICAgIDxkaXYgdHJhbnNjbHVk
ZT0idmFsdWVUZW1wbGF0ZSI+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAg
ICAgPC9kbD4NCg0KICAgIDwvZGl2PiA8IS0tIC9kZWNyaXB0aW9uIC0tPg0KICA8L2Rpdj4gPCEt
LSAvRVZFTlQgLS0+DQoNCiAgPCEtLSBNRVRIT0RTIC0tPg0KICA8ZGl2IGlkPSJtZXRob2RzVGVt
cGxhdGUiIGNsYXNzPSJhcGlHcm91cCI+DQogICAgPGEganN2YWx1ZXM9Ii5uYW1lOidtb2RuYW1l
LScgKyAkbW9kbmFtZSI+PC9hPg0KICAgIDxoMz5NZXRob2RzPC9oMz4NCg0KICAgIDwhLS0gaXRl
cmF0ZXMgb3ZlciBhbGwgZnVuY3Rpb25zIC0tPg0KICAgIDxkaXYgY2xhc3M9ImFwaUl0ZW0iIGpz
c2VsZWN0PSJmdW5jdGlvbnMuc29ydChzb3J0QnlOYW1lKSINCiAgICAgICAgIGpzZGlzcGxheT0i
ISgkdGhpcy5ub2RvYykiPg0KICAgICAgPGEganN2YWx1ZXM9Ii5uYW1lOidtZXRob2QtJyArICRt
b2RuYW1lICsgJy0nICsgbmFtZSI+PC9hPiA8IS0tIG1ldGhvZC1hbmNob3IgLS0+DQogICAgICA8
aDQganNjb250ZW50PSJuYW1lIj5tZXRob2QgbmFtZTwvaDQ+DQoNCiAgICAgIDxkaXYgY2xhc3M9
InN1bW1hcnkiPjxzcGFuIGpzZGlzcGxheT0icmV0dXJucyIganNjb250ZW50PSJnZXRUeXBlTmFt
ZShyZXR1cm5zKSI+dm9pZDwvc3Bhbj4NCiAgICAgICAgICA8IS0tIE5vdGU6IGludGVudGlvbmFs
bHkgbG9uZ2VyIDgwIGNvbHVtbnMgLS0+DQogICAgICAgICAgPHNwYW4ganNjb250ZW50PSJnZXRG
dWxseVF1YWxpZmllZEZ1bmN0aW9uTmFtZSgkbW9kbmFtZSwgJHRoaXMpIj48L3NwYW4+KDxzcGFu
IGpzc2VsZWN0PSJwYXJhbWV0ZXJzIiBqc3ZhbHVlcz0iY2xhc3M6b3B0aW9uYWwgPyAnb3B0aW9u
YWwnIDogJyciPjxzcGFuIGpzZGlzcGxheT0iJGluZGV4Ij4sIDwvc3Bhbj48c3BhbiBqc2NvbnRl
bnQ9ImdldFR5cGVOYW1lKCR0aGlzKSI+PC9zcGFuPg0KICAgICAgICAgICAgICA8dmFyPjxzcGFu
IGpzY29udGVudD0iJHRoaXMubmFtZSI+PC9zcGFuPjwvdmFyPjwvc3Bhbj4pPC9kaXY+DQoNCiAg
ICAgIDxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uIj4NCiAgICAgICAgPHAgY2xhc3M9InRvZG8iIGpz
ZGlzcGxheT0iIWRlc2NyaXB0aW9uIj5VbmRvY3VtZW50ZWQuPC9wPg0KICAgICAgICA8cCBqc2Rp
c3BsYXk9ImRlc2NyaXB0aW9uIiBqc3ZhbHVlcz0iLmlubmVySFRNTDpkZXNjcmlwdGlvbiI+DQog
ICAgICAgICAgQSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBqc29uIHNjaGVtYSBkZWYgb2YgdGhlIGZ1
bmN0aW9uIGdvZXMgaGVyZS4NCiAgICAgICAgPC9wPg0KDQogICAgICAgIDwhLS0gUEFSQU1FVEVS
UyAtLT4NCiAgICAgICAgPGg0IGpzZGlzcGxheT0iJHRoaXMucGFyYW1ldGVycyAmJiAkdGhpcy5w
YXJhbWV0ZXJzLmxlbmd0aCA+IDAiPlBhcmFtZXRlcnM8L2g0Pg0KICAgICAgICA8ZGw+DQogICAg
ICAgICAgPGRpdiBqc3NlbGVjdD0iJHRoaXMucGFyYW1ldGVycyI+DQogICAgICAgICAgICA8ZGl2
IHRyYW5zY2x1ZGU9InZhbHVlVGVtcGxhdGUiPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAg
ICAgPC9kaXY+DQogICAgICAgIDwvZGw+DQoNCiAgICAgICAgPCEtLSBSRVRVUk5TIC0tPg0KICAg
ICAgICA8aDQganNkaXNwbGF5PSJyZXR1cm5zIj5SZXR1cm5zPC9oND4NCiAgICAgICAgPGRsPg0K
ICAgICAgICAgIDxkaXYganNzZWxlY3Q9InJldHVybnMiPg0KICAgICAgICAgICAgPGRpdiB0cmFu
c2NsdWRlPSJ2YWx1ZVRlbXBsYXRlIj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIDwv
ZGl2Pg0KICAgICAgICA8L2RsPg0KDQogICAgICAgIDwhLS0gQ0FMTEJBQ0sgLS0+DQogICAgICAg
IDxkaXYganNkaXNwbGF5PSJoYXNDYWxsYmFjayhwYXJhbWV0ZXJzKSI+DQogICAgICAgICAgPGRp
diBqc3NlbGVjdD0iZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpIj4NCiAgICAgICAg
ICA8aDQ+Q2FsbGJhY2sgZnVuY3Rpb248L2g0Pg0KICAgICAgICAgIDxwIGpzZGlzcGxheT0iISR0
aGlzLm9wdGlvbmFsIj4NCiAgICAgICAgICAgIFRoZSBjYWxsYmFjayA8ZW0+cGFyYW1ldGVyPC9l
bT4gc2hvdWxkIHNwZWNpZnkgYSBmdW5jdGlvbg0KICAgICAgICAgICAgdGhhdCBsb29rcyBsaWtl
IHRoaXM6DQogICAgICAgICAgPC9wPg0KICAgICAgICAgIDxwIGpzZGlzcGxheT0iJHRoaXMub3B0
aW9uYWwiPg0KICAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgdGhlIDxlbT5jYWxsYmFjazwvZW0+
IHBhcmFtZXRlciwgaXQgc2hvdWxkDQogICAgICAgICAgICBzcGVjaWZ5IGEgZnVuY3Rpb24gdGhh
dCBsb29rcyBsaWtlIHRoaXM6DQogICAgICAgICAgPC9wPg0KDQogICAgICAgICAgPCEtLSBOb3Rl
OiBpbnRlbnRpb25hbGx5IGxvbmdlciA4MCBjb2x1bW5zIC0tPg0KICAgICAgICAgIDxwcmU+ZnVu
Y3Rpb24oPHNwYW4ganNjb250ZW50PSJnZXRTaWduYXR1cmVTdHJpbmcocGFyYW1ldGVycykiPlR5
cGUgcGFyYW0xLCBUeXBlIHBhcmFtMjwvc3Bhbj4pIDxzcGFuIGNsYXNzPSJzdWJkdWVkIj57Li4u
fTwvc3Bhbj4pOzwvcHJlPg0KICAgICAgICAgIDxkbD4NCiAgICAgICAgICAgIDxkaXYganNzZWxl
Y3Q9InBhcmFtZXRlcnMiPg0KICAgICAgICAgICAgICA8ZGl2IHRyYW5zY2x1ZGU9InZhbHVlVGVt
cGxhdGUiPg0KICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAg
ICAgIDwvZGw+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KDQogICAgICA8L2Rp
dj4gPCEtLSAvZGVzY3JpcHRpb24gLS0+DQoNCiAgICA8L2Rpdj4gIDwhLS0gL2FwaUl0ZW0gLS0+
DQoNCiAgPC9kaXY+ICA8IS0tIC9hcGlHcm91cCAtLT4NCg0KPC9kaXY+IDwhLS0gL1NVQlRFTVBM
QVRFUyAtLT4NCg0KPGgxPldlYkluc3BlY3RvciBFeHRlbnNpb24gQVBJPC9oMT4NCg0KICAgICAg
PCEtLSBBUEkgUEFHRSAtLT4NCiAgICAgIDxkaXYgY2xhc3M9ImFwaVBhZ2UiIGpzc2VsZWN0PSIk
dGhpcyIganN2YWx1ZXM9IiRtb2R1bGU6JHRoaXM7JG1vZG5hbWU6JHRoaXMubmFtZXNwYWNlIj4N
CiAgICAgIDxhIGpzdmFsdWVzPSIubmFtZTonYXBpUmVmZXJlbmNlLScgKyAkbW9kbmFtZSI+PC9h
Pg0KICAgICAgPGgyIGpzY29udGVudD0iJ01vZHVsZTogJyArICRtb2RuYW1lIj48L2gyPg0KDQog
ICAgICAgIDwhLS0gUFJPUEVSVElFUyAtLT4NCiAgICAgICAgPGRpdiBqc2Rpc3BsYXk9IiR0aGlz
LnByb3BlcnRpZXMiIGNsYXNzPSJhcGlHcm91cCI+DQogICAgICAgICAgPGEganN2YWx1ZXM9Ii5u
YW1lOidwcm9wZXJ0aWVzLScgKyAkbW9kbmFtZSI+PC9hPg0KICAgICAgICAgIDxoMyBpZD0icHJv
cGVydGllcyI+UHJvcGVydGllczwvaDM+DQoNCiAgICAgICAgICA8ZGl2IGpzc2VsZWN0PSJnZXRQ
cm9wZXJ0eUxpc3RGcm9tT2JqZWN0KCR0aGlzKSI+DQogICAgICAgICAgICA8YSBqc3ZhbHVlcz0i
Lm5hbWU6J3Byb3BlcnR5LScgKyBuYW1lIj48L2E+DQogICAgICAgICAgICA8aDQganNjb250ZW50
PSJuYW1lIj5nZXRMYXN0RXJyb3I8L2g0Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VtbWFy
eSI+DQogICAgICAgICAgICAgIDwhLS0gTm90ZTogaW50ZW50aW9uYWxseSBsb25nZXIgODAgY29s
dW1ucyAtLT4NCiAgICAgICAgICAgICAgPHNwYW4ganNjb250ZW50PSIkbW9kbmFtZSArICcuJyI+
PC9zcGFuPjxzcGFuIGpzY29udGVudD0iJHRoaXMubmFtZSI+PC9zcGFuPg0KICAgICAgICAgICAg
PC9kaXY+DQogICAgICAgICAgICA8ZGl2IHRyYW5zY2x1ZGU9InZhbHVlVGVtcGxhdGUiPg0KICAg
ICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgPC9kaXY+IDwhLS0g
L2FwaUdyb3VwIC0tPg0KDQogICAgICAgIDxkaXYgdHJhbnNjbHVkZT0ibWV0aG9kc1RlbXBsYXRl
IiBqc2Rpc3BsYXk9ImZ1bmN0aW9ucyAmJiBmdW5jdGlvbnMubGVuZ3RoID4gMCIgY2xhc3M9ImFw
aUdyb3VwIj4NCiAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgPCEtLSBFVkVOVFMgLS0+DQogICAg
ICAgIDxkaXYganNkaXNwbGF5PSIkbW9kdWxlLmV2ZW50cyAmJiAkbW9kdWxlLmV2ZW50cy5sZW5n
dGggPiAwIiBjbGFzcz0iYXBpR3JvdXAiPg0KICAgICAgICAgIDxhIGpzdmFsdWVzPSIubmFtZTon
ZXZlbnRzLScgKyAkbW9kbmFtZSI+PC9hPg0KICAgICAgICAgIDxoMyBpZD0iZXZlbnRzIj5FdmVu
dHM8L2gzPg0KDQogICAgICAgICAgPCEtLSBpdGVyYXRlcyBvdmVyIGFsbCBldmVudHMgLS0+DQog
ICAgICAgICAgPGRpdiBqc3NlbGVjdD0iJG1vZHVsZS5ldmVudHMuc29ydChzb3J0QnlOYW1lKSIg
Y2xhc3M9ImFwaUl0ZW0iDQogICAgICAgICAgICAgICBqc2Rpc3BsYXk9IiEoJHRoaXMubm9kb2Mp
Ij4NCiAgICAgICAgICAgIDxkaXYgdHJhbnNjbHVkZT0iZXZlbnRUZW1wbGF0ZSI+PC9kaXY+DQog
ICAgICAgICAgPC9kaXY+IDwhLS0gL2FwaUl0ZW0gLS0+DQoNCiAgICAgICAgPC9kaXY+IDwhLS0g
L2FwaUdyb3VwIC0tPg0KDQogICAgICAgIDwhLS0gVFlQRVMgLS0+DQogICAgICAgIDxkaXYganNk
aXNwbGF5PSIkbW9kdWxlLnR5cGVzICYmICRtb2R1bGUudHlwZXMubGVuZ3RoID4gMCIgY2xhc3M9
ImFwaUdyb3VwIj4NCiAgICAgICAgICA8YSBqc3ZhbHVlcz0iLm5hbWU6J3R5cGVzLScgKyAkbW9k
bmFtZSI+PC9hPg0KICAgICAgICAgIDxoMyBpZD0idHlwZXMiPlR5cGVzPC9oMz4NCg0KICAgICAg
ICAgIDwhLS0gaXRlcmF0ZXMgb3ZlciBhbGwgdHlwZXMgLS0+DQogICAgICAgICAgPGRpdiBqc3Nl
bGVjdD0iJG1vZHVsZS50eXBlcyIgY2xhc3M9ImFwaUl0ZW0iPg0KICAgICAgICAgICAgPGEganN2
YWx1ZXM9Ii5uYW1lOid0eXBlLScgKyBpZCI+PC9hPg0KICAgICAgICAgICAgPGg0IGpzY29udGVu
dD0iaWQiPnR5cGUgbmFtZTwvaDQ+DQogICAgICAgICAgICA8ZGl2IHRyYW5zY2x1ZGU9InZhbHVl
VGVtcGxhdGUiPg0KICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICA8L2Rpdj4gPCEtLSAv
YXBpSXRlbSAtLT4NCg0KICAgICAgICA8L2Rpdj4gPCEtLSAvYXBpR3JvdXAgLS0+DQoNCiAgICAg
IDwvZGl2PiA8IS0tIC9hcGlQYWdlIC0tPg0KDQo8L2JvZHk+DQoNCjwvaHRtbD4NCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62843</attachid>
            <date>2010-07-28 10:14:03 -0700</date>
            <delta_ts>2010-07-30 08:23:12 -0700</delta_ts>
            <desc>patch</desc>
            <filename>extensions.patch</filename>
            <type>text/plain</type>
            <size>59458</size>
            <attacher name="Andrey Kosyakov">caseq</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDIwNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTEzIEBACisyMDEwLTA3LTI4ICBBbmRyZXkgS29zeWFrb3YgIDxjYXNlcUBjaHJv
bWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgV2ViIEluc3BlY3RvcjogYWRkaW5nIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBXZWJJbnNw
ZWN0b3IgZXh0ZW5zaW9ucyBBUEkuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00MDQyNQorICAgICAgICBUZXN0OiBpbnNwZWN0b3IvZXh0ZW5zaW9ucy5o
dG1sCisKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogV2ViQ29yZS52Y3Byb2ov
V2ViQ29yZS52Y3Byb2o6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6SW5zcGVjdG9yQ29udHJvbGxlcjo6aW5zcGVjdGVkV2lu
ZG93U2NyaXB0T2JqZWN0Q2xlYXJlZCk6CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JDb250
cm9sbGVyOjpkaWRDb21taXRMb2FkKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yRnJv
bnRlbmRIb3N0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckZyb250ZW5kSG9zdDo6
c2V0RXh0ZW5zaW9uQVBJKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRI
b3N0Lmg6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9zdC5pZGw6Cisg
ICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLkVsZW1lbnRzUGFuZWwudGhpcy50cmVlT3V0bGluZS5mb2N1c2VkTm9kZUNo
YW5nZWQpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkVsZW1lbnRzUGFuZWwpOgorICAgICAgICAq
IGluc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uQVBJLmpzOiBBZGRlZC4gQW4gQVBJIGltcGxl
bWVudGF0aW9uIHRoYXQgZ2V0cyBpbmplY3RlZCBpbnRvIHRoZSBleHRlbnNpb24gY29udGV4dC4K
KyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5z
aW9uQVBJLkV2ZW50U2lua0ltcGwucHJvdG90eXBlLmFkZExpc3RlbmVyKToKKyAgICAgICAgKGlu
amVjdGVkRXh0ZW5zaW9uQVBJLkV2ZW50U2lua0ltcGwucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVy
KToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkV2ZW50U2lua0ltcGwucHJvdG90eXBl
Ll9maXJlKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkV2ZW50U2luayk6CisgICAg
ICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5JbnNwZWN0b3JFeHRlbnNpb25BUEkpOgorICAgICAg
ICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuSW5zcGVjdG9yRXh0ZW5zaW9uQVBJLnByb3RvdHlwZS5s
b2cpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuUmVzb3VyY2VzLnByb3RvdHlwZS5n
ZXRBbGwpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuUmVzb3VyY2VzLnByb3RvdHlw
ZS5nZXQgcmV0dXJuKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLlJlc291cmNlcy5w
cm90b3R5cGUpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuUGFuZWxzKToKKyAgICAg
ICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLlBhbmVscy5wcm90b3R5cGUuY3JlYXRlLmNhbGxiYWNr
V3JhcHBlcik6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5QYW5lbHMucHJvdG90eXBl
LmNyZWF0ZSk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5QYW5lbEltcGwpOgorICAg
ICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuUGFuZWxJbXBsLnByb3RvdHlwZS5jcmVhdGVTaWRl
YmFyUGFuZS5jYWxsYmFja1dyYXBwZXIpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEku
UGFuZWxJbXBsLnByb3RvdHlwZS5jcmVhdGVTaWRlYmFyUGFuZSk6CisgICAgICAgIChpbmplY3Rl
ZEV4dGVuc2lvbkFQSS5FeHRlbnNpb25QYW5lbCk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lv
bkFQSS5FeHRlbnNpb25TaWRlYmFyUGFuZUltcGwpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNp
b25BUEkuRXh0ZW5zaW9uU2lkZWJhclBhbmVJbXBsLnByb3RvdHlwZS5zZXRIZWlnaHQpOgorICAg
ICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuRXh0ZW5zaW9uU2lkZWJhclBhbmVJbXBsLnByb3Rv
dHlwZS5zZXRFeHBhbmRlZCk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5JbnNwZWN0
ZWRXaW5kb3cpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuSW5zcGVjdGVkV2luZG93
LnByb3RvdHlwZS5yZWxvYWQpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuSW5zcGVj
dGVkV2luZG93LnByb3RvdHlwZS5ldmFsdWF0ZSk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lv
bkFQSS5FeHRlbnNpb25TZXJ2ZXJDbGllbnQucHJvdG90eXBlLnNlbmRSZXF1ZXN0KToKKyAgICAg
ICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkV4dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5cGUu
cmVnaXN0ZXJIYW5kbGVyKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkV4dGVuc2lv
blNlcnZlckNsaWVudC5wcm90b3R5cGUubmV4dE9iamVjdElkKToKKyAgICAgICAgKGluamVjdGVk
RXh0ZW5zaW9uQVBJLkV4dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5cGUuX3JlZ2lzdGVyQ2Fs
bGJhY2spOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVyQ2xp
ZW50LnByb3RvdHlwZS5fb25DYWxsYmFjayk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQ
SS5FeHRlbnNpb25TZXJ2ZXJDbGllbnQucHJvdG90eXBlLl9vbk1lc3NhZ2UpOgorICAgICAgICAo
aW5qZWN0ZWRFeHRlbnNpb25BUEkuZXhwYW5kVVJMKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5z
aW9uQVBJLik6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25QYW5lbC5q
czogQWRkZWQuIEEgY2xhc3MgdGhhdCBwcm92aWRlcyBXZWJJbnNwZWN0b3IncyBQYW5lbCBpbnRl
cmZhY2UgdG8gdGhlIGluc3BlY3RvciwgaG9zdHMgZXh0ZW5zaW9uIHBhbmVsIHdpdGhpbiBhbiBJ
RnJhbWUgYW5kIHByb3hpZXMgUGFuZWwgY2FsbGJhY2tzIHRvIHRoZSBleHRlbnNpb24uCisgICAg
ICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwpOgorICAgICAgICAoV2ViSW5zcGVjdG9y
LkV4dGVuc2lvblBhbmVsLnByb3RvdHlwZS5nZXQgZGVmYXVsdEZvY3VzZWRFbGVtZW50KToKKyAg
ICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5wcm90b3R5cGUudXBkYXRlTWFpblZp
ZXdXaWR0aCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBl
LnNlYXJjaENhbmNlbGVkKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5w
cm90b3R5cGUucGVyZm9ybVNlYXJjaCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9u
UGFuZWwucHJvdG90eXBlLmp1bXBUb05leHRTZWFyY2hSZXN1bHQpOgorICAgICAgICAoV2ViSW5z
cGVjdG9yLkV4dGVuc2lvblBhbmVsLnByb3RvdHlwZS5qdW1wVG9QcmV2aW91c1NlYXJjaFJlc3Vs
dCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlLl9hZGRT
dHlsZVJ1bGUpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0
cnlTdHViLmpzOiBBZGRlZC4gQSBzdHViIGZvciBFeHRlbnNpb25SZWdpc3RyeSBjbGFzcyB0aGF0
IGlzIG1lYW50IHRvIHByb3ZpZGUgYSBsaXN0IG9mIGV4dGVuc2lvbnMuIEFjdHVhbCBpbXBsZW1l
bnRhdGlvbnMgbWF5IGJlIGJyb3dzZXItc3BlY2ZpYy4KKyAgICAgICAgKC5XZWJJbnNwZWN0b3Iu
SW5zcGVjdG9yRXh0ZW5zaW9uUmVnaXN0cnlTdHViKToKKyAgICAgICAgKC5XZWJJbnNwZWN0b3Iu
SW5zcGVjdG9yRXh0ZW5zaW9uUmVnaXN0cnlTdHViLnByb3RvdHlwZS5nZXRFeHRlbnNpb25zQXN5
bmMpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uU2VydmVyLmpzOiBB
ZGRlZC4gQ29tbXVuaWNhdGVzIHdpdGggRXh0ZW5zaW9uQVBJIHZpYSBET00gbWVzc2FnaW5nIGFu
ZCBwcm94aWVzIHJlcXVlc3RzIHRvIFdlYkluc3BlY3RvciBjbGFzc2VzLgorICAgICAgICAoV2Vi
SW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlcik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5z
aW9uU2VydmVyLnByb3RvdHlwZS5ub3RpZnlQYW5lbFNob3duKToKKyAgICAgICAgKFdlYkluc3Bl
Y3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLm5vdGlmeU9iamVjdFNlbGVjdGVkKToKKyAg
ICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLm5vdGlmeVJlc291
cmNlQ3JlYXRlZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3Rv
dHlwZS5fbm90aWZ5T2JqZWN0Q3JlYXRlZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5z
aW9uU2VydmVyLnByb3RvdHlwZS5ub3RpZnlTZWFyY2hBY3Rpb24pOgorICAgICAgICAoV2ViSW5z
cGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUubm90aWZ5SW5zcGVjdGVkUGFnZUxvYWRl
ZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5ub3Rp
ZnlJbnNwZWN0ZWRVUkxDaGFuZ2VkKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25T
ZXJ2ZXIucHJvdG90eXBlLm5vdGlmeUluc3BlY3RvclJlc2V0KToKKyAgICAgICAgKFdlYkluc3Bl
Y3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9jb252ZXJ0UmVzb3VyY2UpOgorICAgICAg
ICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX3Bvc3ROb3RpZmljYXRp
b24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29u
U3Vic2NyaWJlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90
eXBlLl9vblVuc3Vic2NyaWJlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2
ZXIucHJvdG90eXBlLl9vbkNyZWF0ZVBhbmVsKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRl
bnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vbkNyZWF0ZVNpZGViYXIpOgorICAgICAgICAoV2ViSW5z
cGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX2NyZWF0ZUNsaWVudElmcmFtZSk6Cisg
ICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25TZXRTaWRl
YmFySGVpZ2h0KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90
eXBlLl9vblNldFNpZGViYXJFeHBhbnNpb24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVu
c2lvblNlcnZlci5wcm90b3R5cGUuX29uTG9nKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRl
bnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vbkV2YWx1YXRlT25JbnNwZWN0ZWRQYWdlKToKKyAgICAg
ICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vblJldmVhbEFuZFNl
bGVjdCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5f
b25SZXZlYWxBbmRTZWxlY3RSZXNvdXJjZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5z
aW9uU2VydmVyLnByb3RvdHlwZS5fZGlzcGF0Y2hDYWxsYmFjayk6CisgICAgICAgIChXZWJJbnNw
ZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25HZXRSZXNvdXJjZXMpOgorICAgICAg
ICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuaW5pdEV4dGVuc2lvbnMp
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX2FkZEV4
dGVuc2lvbnMpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5
cGUuX29uV2luZG93TWVzc2FnZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2Vy
dmVyLnByb3RvdHlwZS5fb25tZXNzYWdlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNp
b25TZXJ2ZXIucHJvdG90eXBlLl9yZWdpc3RlckhhbmRsZXIpOgorICAgICAgICAoV2ViSW5zcGVj
dG9yLkV4dGVuc2lvblN0YXR1cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuYWRkRXh0ZW5zaW9u
cyk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdC5qczoKKyAg
ICAgICAgKGluamVjdGVkU2NyaXB0Q29uc3RydWN0b3IpOgorICAgICAgICAqIGluc3BlY3Rvci9m
cm9udC1lbmQvSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuanM6CisgICAgICAgICogaW5zcGVjdG9yL2Zy
b250LWVuZC9JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzOgorICAgICAgICAoLldlYkluc3Bl
Y3Rvci5JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLnByb3RvdHlwZS5zZXRFeHRlbnNpb25BUEkp
OgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvV2ViS2l0LnFyYzoKKyAgICAgICAgKiBp
bnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sOgorICAgICAgICAqIGluc3BlY3Rvci9m
cm9udC1lbmQvaW5zcGVjdG9yLmpzOgorICAgICAgICAoV2ViSW5zcGVjdG9yLmxvYWRlZCk6Cisg
ICAgICAgIChXZWJJbnNwZWN0b3IudXBkYXRlUmVzb3VyY2UpOgorICAgICAgICAoV2ViSW5zcGVj
dG9yLnJlc2V0KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5pbnNwZWN0ZWRVUkxDaGFuZ2VkKToK
KyAgICAgICAgKFdlYkluc3BlY3Rvci5kaWRDb21taXRMb2FkKToKKwogMjAxMC0wNy0yOCAgTHVj
YXMgRGUgTWFyY2hpICA8bHVjYXMuZGVtYXJjaGlAcHJvZnVzaW9uLm1vYmk+CiAKICAgICAgICAg
VW5yZXZpZXdlZCBidWlsZCBmaXguCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNjQyMDYpCisrKyBXZWJDb3Jl
L1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtNDAyOSw2ICs0MDI5LDEwIEBACiAgICAg
ICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzJywKICAgICAgICAg
ICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0VsZW1lbnRzVHJlZU91dGxpbmUuanMnLAogICAgICAg
ICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQvRXZlbnRMaXN0ZW5lcnNTaWRlYmFyUGFuZS5qcycs
CisgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25BUEkuanMnLAorICAg
ICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUGFuZWwuanMnLAorICAgICAg
ICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0cnlTdHViLmpzJywKKyAg
ICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblNlcnZlci5qcycsCiAgICAg
ICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9Gb250Vmlldy5qcycsCiAgICAgICAgICAgICAn
aW5zcGVjdG9yL2Zyb250LWVuZC9IQVJFbnRyeS5qcycsCiAgICAgICAgICAgICAnaW5zcGVjdG9y
L2Zyb250LWVuZC9IZWxwU2NyZWVuLmpzJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ov
V2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJD
b3JlLnZjcHJvagkocmV2aXNpb24gNjQyMDYpCisrKyBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dl
YkNvcmUudmNwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC01MDg4MCw2ICs1MDg4MCwyMiBAQAogCQkJ
CQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5z
cGVjdG9yXGZyb250LWVuZFxFeHRlbnNpb25BUEkuanMiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4N
CisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVuZFxF
eHRlbnNpb25QYW5lbC5qcyINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KKwkJ
CQkJUmVsYXRpdmVQYXRoPSIuLlxpbnNwZWN0b3JcZnJvbnQtZW5kXEV4dGVuc2lvblJlZ2lzdHJ5
U3R1Yi5qcyINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KKwkJCQkJUmVsYXRp
dmVQYXRoPSIuLlxpbnNwZWN0b3JcZnJvbnQtZW5kXEV4dGVuc2lvblNlcnZlci5qcyINCisJCQkJ
CT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxpbnNw
ZWN0b3JcZnJvbnQtZW5kXEZvbnRWaWV3LmpzIg0KIAkJCQkJPg0KIAkJCQk8L0ZpbGU+DQpJbmRl
eDogV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5jcHAJKHJldmlzaW9uIDY0
MjA2KQorKysgV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQ1OCw3ICs0NTgsMTggQEAgdm9pZCBJbnNwZWN0b3JDb250cm9sbGVyOjpp
bnNwZWN0ZWRXaW5kbwogICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2xpZW50ICYmIGZyYW1l
ID09IG1faW5zcGVjdGVkUGFnZS0+bWFpbkZyYW1lKCkpCiAgICAgICAgIG1faW5zcGVjdG9yRnJv
bnRlbmRDbGllbnQtPndpbmRvd09iamVjdENsZWFyZWQoKTsKIAotICAgIGlmICghZW5hYmxlZCgp
IHx8ICFtX2Zyb250ZW5kIHx8IGZyYW1lICE9IG1faW5zcGVjdGVkUGFnZS0+bWFpbkZyYW1lKCkp
CisgICAgaWYgKCFlbmFibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX3Njcmlw
dHNUb0V2YWx1YXRlT25Mb2FkLnNpemUoKSkgeworICAgICAgICBTY3JpcHRTdGF0ZSogc2NyaXB0
U3RhdGUgPSBtYWluV29ybGRTY3JpcHRTdGF0ZShmcmFtZSk7CisgICAgICAgIGZvciAoVmVjdG9y
PFN0cmluZz46Oml0ZXJhdG9yIGl0ID0gbV9zY3JpcHRzVG9FdmFsdWF0ZU9uTG9hZC5iZWdpbigp
OworICAgICAgICAgICAgIGl0ICE9IG1fc2NyaXB0c1RvRXZhbHVhdGVPbkxvYWQuZW5kKCk7ICsr
aXQpIHsKKyAgICAgICAgICAgIG1faW5qZWN0ZWRTY3JpcHRIb3N0LT5pbmplY3RTY3JpcHQoKml0
LCBzY3JpcHRTdGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1fZnJvbnRlbmQg
fHwgZnJhbWUgIT0gbV9pbnNwZWN0ZWRQYWdlLT5tYWluRnJhbWUoKSkKICAgICAgICAgcmV0dXJu
OwogICAgIG1faW5qZWN0ZWRTY3JpcHRIb3N0LT5kaXNjYXJkSW5qZWN0ZWRTY3JpcHRzKCk7CiB9
CkBAIC04MDIsMTQgKzgxMyw2IEBAIHZvaWQgSW5zcGVjdG9yQ29udHJvbGxlcjo6ZGlkQ29tbWl0
TG9hZCgKICAgICBmb3IgKEZyYW1lKiBmcmFtZSA9IGxvYWRlci0+ZnJhbWUoKTsgZnJhbWU7IGZy
YW1lID0gZnJhbWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KGxvYWRlci0+ZnJhbWUoKSkpCiAgICAg
ICAgIGlmIChSZXNvdXJjZXNNYXAqIHJlc291cmNlTWFwID0gbV9mcmFtZVJlc291cmNlcy5nZXQo
ZnJhbWUpKQogICAgICAgICAgICAgcHJ1bmVSZXNvdXJjZXMocmVzb3VyY2VNYXAsIGxvYWRlcik7
Ci0KLSAgICBpZiAobV9zY3JpcHRzVG9FdmFsdWF0ZU9uTG9hZC5zaXplKCkpIHsKLSAgICAgICAg
U2NyaXB0U3RhdGUqIHNjcmlwdFN0YXRlID0gbWFpbldvcmxkU2NyaXB0U3RhdGUobG9hZGVyLT5m
cmFtZSgpKTsKLSAgICAgICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBtX3Nj
cmlwdHNUb0V2YWx1YXRlT25Mb2FkLmJlZ2luKCk7Ci0gICAgICAgICAgICAgaXQgIT0gbV9zY3Jp
cHRzVG9FdmFsdWF0ZU9uTG9hZC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgbV9pbmplY3Rl
ZFNjcmlwdEhvc3QtPmluamVjdFNjcmlwdCgqaXQsIHNjcmlwdFN0YXRlKTsKLSAgICAgICAgfQot
ICAgIH0KIH0KIAogdm9pZCBJbnNwZWN0b3JDb250cm9sbGVyOjpmcmFtZURldGFjaGVkRnJvbVBh
cmVudChGcmFtZSogZnJhbWUpCkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9u
dGVuZEhvc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZy
b250ZW5kSG9zdC5jcHAJKHJldmlzaW9uIDY0MjA2KQorKysgV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yRnJvbnRlbmRIb3N0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTkyLDYgKzE5MiwxNCBA
QCB2b2lkIEluc3BlY3RvckZyb250ZW5kSG9zdDo6bW92ZVdpbmRvd0J5CiAgICAgICAgIG1fY2xp
ZW50LT5tb3ZlV2luZG93QnkoeCwgeSk7CiB9CiAKK3ZvaWQgSW5zcGVjdG9yRnJvbnRlbmRIb3N0
OjpzZXRFeHRlbnNpb25BUEkoY29uc3QgU3RyaW5nJiBzY3JpcHQpCit7CisgICAgSW5zcGVjdG9y
Q29udHJvbGxlciogaW5zcGVjdG9yID0gbV9mcm9udGVuZFBhZ2UtPmluc3BlY3RvckNvbnRyb2xs
ZXIoKTsKKworICAgIGluc3BlY3Rvci0+cmVtb3ZlQWxsU2NyaXB0c1RvRXZhbHVhdGVPbkxvYWQo
KTsKKyAgICBpbnNwZWN0b3ItPmFkZFNjcmlwdFRvRXZhbHVhdGVPbkxvYWQoc2NyaXB0KTsKK30K
KwogU3RyaW5nIEluc3BlY3RvckZyb250ZW5kSG9zdDo6bG9jYWxpemVkU3RyaW5nc1VSTCgpCiB7
CiAgICAgcmV0dXJuIG1fY2xpZW50LT5sb2NhbGl6ZWRTdHJpbmdzVVJMKCk7CkluZGV4OiBXZWJD
b3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAkocmV2aXNpb24gNjQyMDYpCisr
KyBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAkod29ya2luZyBjb3B5
KQpAQCAtNjcsNiArNjcsNyBAQCBwdWJsaWM6CiAKICAgICB2b2lkIHNldEF0dGFjaGVkV2luZG93
SGVpZ2h0KHVuc2lnbmVkIGhlaWdodCk7CiAgICAgdm9pZCBtb3ZlV2luZG93QnkoZmxvYXQgeCwg
ZmxvYXQgeSkgY29uc3Q7CisgICAgdm9pZCBzZXRFeHRlbnNpb25BUEkoY29uc3QgU3RyaW5nJiBz
Y3JpcHQpOwogCiAgICAgU3RyaW5nIGxvY2FsaXplZFN0cmluZ3NVUkwoKTsKICAgICBTdHJpbmcg
aGlkZGVuUGFuZWxzKCk7CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVu
ZEhvc3QuaWRsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250
ZW5kSG9zdC5pZGwJKHJldmlzaW9uIDY0MjA2KQorKysgV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVj
dG9yRnJvbnRlbmRIb3N0LmlkbAkod29ya2luZyBjb3B5KQpAQCAtNDEsNiArNDEsNyBAQCBtb2R1
bGUgY29yZSB7CiAgICAgICAgIHZvaWQgcmVxdWVzdERldGFjaFdpbmRvdygpOwogICAgICAgICB2
b2lkIHNldEF0dGFjaGVkV2luZG93SGVpZ2h0KGluIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KTsKICAg
ICAgICAgdm9pZCBtb3ZlV2luZG93QnkoaW4gZmxvYXQgeCwgaW4gZmxvYXQgeSk7CisgICAgICAg
IHZvaWQgc2V0RXh0ZW5zaW9uQVBJKGluIERPTVN0cmluZyBzY3JpcHQpOwogCiAgICAgICAgIERP
TVN0cmluZyBsb2NhbGl6ZWRTdHJpbmdzVVJMKCk7CiAgICAgICAgIERPTVN0cmluZyBoaWRkZW5Q
YW5lbHMoKTsKSW5kZXg6IFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVs
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1Bh
bmVsLmpzCShyZXZpc2lvbiA2NDIwNikKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9F
bGVtZW50c1BhbmVsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC01Niw4ICs1NiwxMCBAQCBXZWJJbnNw
ZWN0b3IuRWxlbWVudHNQYW5lbCA9IGZ1bmN0aW9uKCkKICAgICAgICAgdGhpcy5wYW5lbC51cGRh
dGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHRoaXMucGFuZWwudXBkYXRlRXZlbnRMaXN0ZW5lcnMo
KTsKIAotICAgICAgICBpZiAodGhpcy5fZm9jdXNlZERPTU5vZGUpCisgICAgICAgIGlmICh0aGlz
Ll9mb2N1c2VkRE9NTm9kZSkgewogICAgICAgICAgICAgSW5zcGVjdG9yQmFja2VuZC5hZGRJbnNw
ZWN0ZWROb2RlKHRoaXMuX2ZvY3VzZWRET01Ob2RlLmlkKTsKKyAgICAgICAgICAgIFdlYkluc3Bl
Y3Rvci5leHRlbnNpb25TZXJ2ZXIubm90aWZ5T2JqZWN0U2VsZWN0ZWQodGhpcy5uYW1lLCAiRE9N
Tm9kZSIpOworICAgICAgICB9CiAgICAgfTsKIAogICAgIHRoaXMuY29udGVudEVsZW1lbnQuYXBw
ZW5kQ2hpbGQodGhpcy50cmVlT3V0bGluZS5lbGVtZW50KTsKSW5kZXg6IFdlYkNvcmUvaW5zcGVj
dG9yL2Zyb250LWVuZC9FeHRlbnNpb25BUEkuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNw
ZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvbkFQSS5qcwkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUv
aW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25BUEkuanMJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMzI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKwordmFyIGluamVjdGVkRXh0ZW5zaW9uQVBJID0gZnVuY3Rpb24oSW5qZWN0ZWRTY3Jp
cHRIb3N0LCBpbnNwZWN0ZWRXaW5kb3csIGluamVjdGVkU2NyaXB0SWQpCit7CisKKy8vIEhlcmUg
YW5kIGJlbG93LCBhbGwgY29uc3RydWN0b3JzIGFyZSBwcml2YXRlIHRvIEFQSSBpbXBsZW1lbnRh
dGlvbi4KKy8vIEZvciBhIHB1YmxpYyB0eXBlIEZvbywgaWYgaW50ZXJuYWwgZmllbGRzIGFyZSBw
cmVzZW50LCB0aGVzZSBhcmUgb24KKy8vIGEgcHJpdmF0ZSBGb29JbXBsIHR5cGUsIGFuIGluc3Rh
bmNlIG9mIEZvb0ltcGwgaXMgdXNlZCBpbiBhIGNsb3N1cmUKKy8vIGJ5IEZvbyBjb25zdXRyY3Rv
ciB0byByZS1iaW5kIHB1YmxpY2x5IGV4cG9ydGVkIG1lbWJlcnMgdG8gYW4gaW5zdGFuY2UKKy8v
IG9mIEZvby4KKworZnVuY3Rpb24gRXZlbnRTaW5rSW1wbCh0eXBlKQoreworICAgIHRoaXMuX3R5
cGUgPSB0eXBlOworICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdOworfQorCitFdmVudFNpbmtJbXBs
LnByb3RvdHlwZSA9IHsKKyAgICBhZGRMaXN0ZW5lcjogZnVuY3Rpb24oY2FsbGJhY2spCisgICAg
eworICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkKKyAgICAgICAgICAg
IGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJzdWJzY3JpYmUiLCB0eXBl
OiB0aGlzLl90eXBlIH0pOworICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChjYWxsYmFjayk7
CisgICAgICAgIGV4dGVuc2lvblNlcnZlci5yZWdpc3RlckhhbmRsZXIoIm5vdGlmeS0iICsgdGhp
cy5fdHlwZSwgYmluZCh0aGlzLl9maXJlLCB0aGlzKSk7CisgICAgfSwKKworICAgIHJlbW92ZUxp
c3RlbmVyOiBmdW5jdGlvbihjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHZhciBsaXN0ZW5lcnMg
PSB0aGlzLl9saXN0ZW5lcnM7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5l
cnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGNhbGxi
YWNrKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodGhp
cy5fbGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkKKyAgICAgICAgICAgIGV4dGVuc2lvblNlcnZlci5z
ZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJ1bnN1YnNjcmliZSIsIHR5cGU6IHRoaXMuX3R5cGUgfSk7
CisgICAgfSwKKworICAgIF9maXJlOiBmdW5jdGlvbihyZXF1ZXN0KQorICAgIHsKKyAgICAgICAg
dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5zbGljZSgpOworICAgICAgICBmb3IgKHZh
ciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIGxpc3RlbmVy
c1tpXS5hcHBseShudWxsLCByZXF1ZXN0LmFyZ3VtZW50cyk7CisgICAgfQorfQorCitmdW5jdGlv
biBFdmVudFNpbmsodHlwZSkKK3sKKyAgICB2YXIgaW1wbCA9IG5ldyBFdmVudFNpbmtJbXBsKHR5
cGUpOworICAgIHRoaXMuYWRkTGlzdGVuZXIgPSBiaW5kKGltcGwuYWRkTGlzdGVuZXIsIGltcGwp
OworICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIgPSBiaW5kKGltcGwucmVtb3ZlTGlzdGVuZXIsIGlt
cGwpOworfQorCitmdW5jdGlvbiBJbnNwZWN0b3JFeHRlbnNpb25BUEkoKQoreworICAgIHRoaXMu
aW5zcGVjdGVkV2luZG93ID0gbmV3IEluc3BlY3RlZFdpbmRvdygpOworICAgIHRoaXMucGFuZWxz
ID0gbmV3IFBhbmVscygpOworICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IFJlc291cmNlcygpOwor
ICAgIHRoaXMub25SZXNldCA9IG5ldyBFdmVudFNpbmsoInJlc2V0Iik7Cit9CisKK0luc3BlY3Rv
ckV4dGVuc2lvbkFQSS5wcm90b3R5cGUgPSB7CisgICAgbG9nOiBmdW5jdGlvbihtZXNzYWdlKQor
ICAgIHsKKyAgICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogImxv
ZyIsIG1lc3NhZ2U6IG1lc3NhZ2UgfSk7CisgICAgfQorfQorCitmdW5jdGlvbiBSZXNvdXJjZXMo
KQoreworICAgIHRoaXMub25DcmVhdGVkID0gbmV3IEV2ZW50U2luaygiY3JlYXRlZC1yZXNvdXJj
ZSIpOworfQorCitSZXNvdXJjZXMucHJvdG90eXBlID0geworICAgIGdldEFsbDogZnVuY3Rpb24o
Y2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1
ZXN0KHsgY29tbWFuZDogImdldFJlc291cmNlcyIgfSwgY2FsbGJhY2spOworICAgIH0sCisKKyAg
ICBnZXQ6IGZ1bmN0aW9uKGlkLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBleHRl
bnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21tYW5kOiAiZ2V0UmVzb3VyY2VzIiwgaWQ6IGlk
IH0sIGNhbGxiYWNrKTsKKyAgICB9Cit9CisKK3ZhciB3ZWxsS25vd25QYW5lbE5hbWVzID0gWwor
ICAgICJlbGVtZW50cyIsCisgICAgInJlc291cmNlcyIsCisgICAgInNjcmlwdHMiLAorICAgICJ0
aW1lbGluZSIsCisgICAgInByb2ZpbGVzIiwKKyAgICAic3RvcmFnZSIsCisgICAgImF1ZGl0cyIs
CisgICAgImNvbnNvbGUiCitdOworCitmdW5jdGlvbiBQYW5lbHMoKQoreworICAgIHZhciBwYW5l
bHMgPSBbXTsKKyAgICBmdW5jdGlvbiBwYW5lbEdldHRlcihuYW1lKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHBhbmVsc1tuYW1lXTsKKyAgICB9CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3ZWxs
S25vd25QYW5lbE5hbWVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgIHZhciBuYW1lID0gd2VsbEtu
b3duUGFuZWxOYW1lc1tpXTsKKyAgICAgICAgcGFuZWxzW25hbWVdID0gbmV3IFBhbmVsKG5hbWUp
OworICAgICAgICB0aGlzLl9fZGVmaW5lR2V0dGVyX18obmFtZSwgYmluZChwYW5lbEdldHRlciwg
bnVsbCwgbmFtZSkpOworICAgIH0KK30KKworUGFuZWxzLnByb3RvdHlwZSA9IHsKKyAgICBjcmVh
dGU6IGZ1bmN0aW9uKGxhYmVsLCBwYWdlVVJMLCBpY29uVVJMLCBjYWxsYmFjaykKKyAgICB7Cisg
ICAgICAgIHZhciBpZCA9ICJleHRlbnNpb24tcGFuZWwtIiArIGV4dGVuc2lvblNlcnZlci5uZXh0
T2JqZWN0SWQoKTsKKyAgICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc3VsdCkKKyAg
ICAgICAgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0Vycm9yKQorICAgICAgICAgICAgICAg
IGNhbGxiYWNrKHJlc3VsdCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBw
YW5lbCA9IG5ldyBFeHRlbnNpb25QYW5lbChpZCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2so
cGFuZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZhciByZXF1ZXN0ID0g
eworICAgICAgICAgICAgY29tbWFuZDogImNyZWF0ZVBhbmVsIiwKKyAgICAgICAgICAgIGlkOiBp
ZCwKKyAgICAgICAgICAgIGxhYmVsOiBsYWJlbCwKKyAgICAgICAgICAgIHVybDogZXhwYW5kVVJM
KHBhZ2VVUkwpLAorICAgICAgICAgICAgaWNvbjogZXhwYW5kVVJMKGljb25VUkwpIAorICAgICAg
ICB9OworICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QocmVxdWVzdCwgY2FsbGJh
Y2sgJiYgYmluZChjYWxsYmFja1dyYXBwZXIsIHRoaXMpKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9u
IFBhbmVsSW1wbChpZCkKK3sKKyAgICB0aGlzLl9pZCA9IGlkOworICAgIHRoaXMub25TZWxlY3Rp
b25DaGFuZ2VkID0gbmV3IEV2ZW50U2luaygicGFuZWwtb2JqZWN0U2VsZWN0ZWQtIiArIGlkKTsK
K30KKworUGFuZWxJbXBsLnByb3RvdHlwZSA9IHsKKyAgICBjcmVhdGVTaWRlYmFyUGFuZTogZnVu
Y3Rpb24odGl0bGUsIHVybCwgY2FsbGJhY2spCisgICAgeworICAgICAgICB2YXIgaWQgPSAiZXh0
ZW5zaW9uLXNpZGViYXItIiArIGV4dGVuc2lvblNlcnZlci5uZXh0T2JqZWN0SWQoKTsKKyAgICAg
ICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAg
ICAgaWYgKHJlc3VsdC5pc0Vycm9yKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEV4dGVuc2lv
blNpZGViYXJQYW5lKGlkKSk7CisgICAgICAgIH0KKyAgICAgICAgZXh0ZW5zaW9uU2VydmVyLnNl
bmRSZXF1ZXN0KHsgY29tbWFuZDogImNyZWF0ZVNpZGViYXJQYW5lIiwgcGFuZWw6IHRoaXMuX2lk
LCBpZDogaWQsIHRpdGxlOiB0aXRsZSwgdXJsOiBleHBhbmRVUkwodXJsKSB9LCBjYWxsYmFjayAm
JiBjYWxsYmFja1dyYXBwZXIpOworICAgIH0KK30KKworZnVuY3Rpb24gUGFuZWwoaWQpCit7Cisg
ICAgdmFyIGltcGwgPSBuZXcgUGFuZWxJbXBsKGlkKTsKKyAgICB0aGlzLmNyZWF0ZVNpZGViYXJQ
YW5lID0gYmluZChpbXBsLmNyZWF0ZVNpZGViYXJQYW5lLCBpbXBsKTsKK30KKworZnVuY3Rpb24g
RXh0ZW5zaW9uUGFuZWwoaWQpCit7CisgICAgUGFuZWwuY2FsbCh0aGlzLCBpZCk7CisgICAgdGhp
cy5vblNlYXJjaCA9IG5ldyBFdmVudFNpbmsoInBhbmVsLXNlYXJjaC0iICsgaWQpOworfQorCitF
eHRlbnNpb25QYW5lbC5wcm90b3R5cGUgPSB7Cit9CisKK0V4dGVuc2lvblBhbmVsLnByb3RvdHlw
ZS5fX3Byb3RvX18gPSBQYW5lbC5wcm90b3R5cGU7CisKK2Z1bmN0aW9uIEV4dGVuc2lvblNpZGVi
YXJQYW5lSW1wbChpZCkKK3sKKyAgICB0aGlzLl9pZCA9IGlkOworfQorCitFeHRlbnNpb25TaWRl
YmFyUGFuZUltcGwucHJvdG90eXBlID0geworICAgIHNldEhlaWdodDogZnVuY3Rpb24oaGVpZ2h0
KQorICAgIHsKKyAgICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDog
InNldFNpZGViYXJIZWlnaHQiLCBpZDogdGhpcy5faWQsIGhlaWdodDogaGVpZ2h0IH0pOworICAg
IH0sCisKKyAgICBzZXRFeHBhbmRlZDogZnVuY3Rpb24oZXhwYW5kZWQpCisgICAgeworICAgICAg
ICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21tYW5kOiAic2V0U2lkZWJhckV4cGFu
ZGVkIiwgaWQ6IHRoaXMuX2lkLCBleHBhbmRlZDogZXhwYW5kZWQgfSk7CisgICAgfQorfQorCitm
dW5jdGlvbiBFeHRlbnNpb25TaWRlYmFyUGFuZShpZCkKK3sKKyAgICB2YXIgaW1wbCA9IG5ldyBF
eHRlbnNpb25TaWRlYmFyUGFuZUltcGwoaWQpOworICAgIHRoaXMuc2V0SGVpZ2h0ID0gYmluZChp
bXBsLnNldEhlaWdodCwgaW1wbCk7CisgICAgdGhpcy5zZXRFeHBhbmRlZCA9IGJpbmQoaW1wbC5z
ZXRFeHBhbmRlZCwgaW1wbCk7Cit9CisKK2Z1bmN0aW9uIEluc3BlY3RlZFdpbmRvdygpCit7Cisg
ICAgdGhpcy5vbkxvYWRlZCA9IG5ldyBFdmVudFNpbmsoImluc3BlY3RlZFBhZ2VMb2FkZWQiKTsK
KyAgICB0aGlzLm9uTmF2aWdhdGVkID0gbmV3IEV2ZW50U2luaygiaW5zcGVjdGVkVVJMQ2hhbmdl
ZCIpOworICAgIHRoaXMub25ET01Db250ZW50TG9hZGVkID0gbmV3IEV2ZW50U2luaygiRE9NQ29u
dGVudExvYWRlZCIpOworfQorCitJbnNwZWN0ZWRXaW5kb3cucHJvdG90eXBlID0geworICAgIHJl
bG9hZDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvblNlcnZlci5z
ZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJyZWxvYWQiIH0pOworICAgIH0sCisKKyAgICBldmFsdWF0
ZTogZnVuY3Rpb24oZXhwcmVzc2lvbiwgY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4g
ZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogImV2YWx1YXRlT25JbnNwZWN0
ZWRQYWdlIiwgZXhwcmVzc2lvbjogZXhwcmVzc2lvbiB9LCBjYWxsYmFjayk7CisgICAgfQorfQor
CitmdW5jdGlvbiBFeHRlbnNpb25TZXJ2ZXJDbGllbnQoKQoreworICAgIHRoaXMuX2NhbGxiYWNr
cyA9IHt9OworICAgIHRoaXMuX2hhbmRsZXJzID0ge307CisgICAgdGhpcy5fbGFzdFJlcXVlc3RJ
ZCA9IDA7CisgICAgdGhpcy5fbGFzdE9iamVjdElkID0gMDsKKworICAgIHRoaXMucmVnaXN0ZXJI
YW5kbGVyKCJjYWxsYmFjayIsIGJpbmQodGhpcy5fb25DYWxsYmFjaywgdGhpcykpOworCisgICAg
dmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTsKKyAgICB0aGlzLl9wb3J0ID0gY2hh
bm5lbC5wb3J0MTsKKyAgICB0aGlzLl9wb3J0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBi
aW5kKHRoaXMuX29uTWVzc2FnZSwgdGhpcyksIGZhbHNlKTsKKyAgICB0aGlzLl9wb3J0LnN0YXJ0
KCk7CisKKyAgICB0b3AucG9zdE1lc3NhZ2UoInJlZ2lzdGVyRXh0ZW5zaW9uIiwgWyBjaGFubmVs
LnBvcnQyIF0sICIqIik7Cit9CisKK0V4dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5cGUgPSB7
CisgICAgc2VuZFJlcXVlc3Q6IGZ1bmN0aW9uKG1lc3NhZ2UsIGNhbGxiYWNrKQorICAgIHsKKyAg
ICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gImZ1bmN0aW9uIikKKyAgICAgICAgICAgIG1l
c3NhZ2UucmVxdWVzdElkID0gdGhpcy5fcmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFjayk7CisgICAg
ICAgIHJldHVybiB0aGlzLl9wb3J0LnBvc3RNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0sCisKKyAg
ICByZWdpc3RlckhhbmRsZXI6IGZ1bmN0aW9uKGNvbW1hbmQsIGhhbmRsZXIpCisgICAgeworICAg
ICAgICB0aGlzLl9oYW5kbGVyc1tjb21tYW5kXSA9IGhhbmRsZXI7CisgICAgfSwKKworICAgIG5l
eHRPYmplY3RJZDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluamVjdGVkU2Ny
aXB0SWQgKyAiXyIgKyArK3RoaXMuX2xhc3RPYmplY3RJZDsKKyAgICB9LAorCisgICAgX3JlZ2lz
dGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgdmFyIGlkID0g
Kyt0aGlzLl9sYXN0UmVxdWVzdElkOworICAgICAgICB0aGlzLl9jYWxsYmFja3NbaWRdID0gY2Fs
bGJhY2s7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9LAorCisgICAgX29uQ2FsbGJhY2s6IGZ1
bmN0aW9uKHJlcXVlc3QpCisgICAgeworICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0SWQgaW4g
dGhpcy5fY2FsbGJhY2tzKSB7CisgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3NbcmVxdWVzdC5y
ZXF1ZXN0SWRdKHJlcXVlc3QucmVzdWx0KTsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxs
YmFja3NbcmVxdWVzdC5yZXF1ZXN0SWRdOworICAgICAgICB9CisgICAgfSwKKworICAgIF9vbk1l
c3NhZ2U6IGZ1bmN0aW9uKGV2ZW50KQorICAgIHsKKyAgICAgICAgdmFyIHJlcXVlc3QgPSBldmVu
dC5kYXRhOworICAgICAgICB2YXIgaGFuZGxlciA9IHRoaXMuX2hhbmRsZXJzW3JlcXVlc3QuY29t
bWFuZF07CisgICAgICAgIGlmIChoYW5kbGVyKQorICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRo
aXMsIHJlcXVlc3QpOworICAgIH0KK30KKworZnVuY3Rpb24gZXhwYW5kVVJMKHVybCkKK3sKKyAg
ICBpZiAoIXVybCkKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICBpZiAoL15bXi9dKzovLmV4ZWMo
dXJsKSkgLy8gU2VlIGlmIHVybCBoYXMgc2NoZW1hLgorICAgICAgICByZXR1cm4gdXJsOworICAg
IHZhciBiYXNlVVJMID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdG5h
bWUgKyBsb2NhdGlvbi5wb3J0OworICAgIGlmICgvXlwvLy5leGVjKHVybCkpCisgICAgICAgIHJl
dHVybiBiYXNlVVJMICsgdXJsOworICAgIHJldHVybiBiYXNlVVJMICsgbG9jYXRpb24ucGF0aG5h
bWUucmVwbGFjZSgvXC9bXi9dKiQvLCIvIikgKyB1cmw7Cit9CisKK2Z1bmN0aW9uIGJpbmQoZnVu
YywgdGhpc09iamVjdCkKK3sKKyAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5j
YWxsKGFyZ3VtZW50cywgMik7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gZnVuYy5h
cHBseSh0aGlzT2JqZWN0LCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChh
cmd1bWVudHMsIDApKSk7IH07Cit9CisKK3ZhciBleHRlbnNpb25TZXJ2ZXIgPSBuZXcgRXh0ZW5z
aW9uU2VydmVyQ2xpZW50KCk7CisKK3dlYkluc3BlY3RvciA9IG5ldyBJbnNwZWN0b3JFeHRlbnNp
b25BUEkoKTsKKworfQpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lv
blBhbmVsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRl
bnNpb25QYW5lbC5qcwkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC9FeHRlbnNpb25QYW5lbC5qcwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0
cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK1dlYkluc3Bl
Y3Rvci5FeHRlbnNpb25QYW5lbCA9IGZ1bmN0aW9uKGlkLCBsYWJlbCwgaWNvblVSTCwgb3B0aW9u
cykKK3sKKyAgICB0aGlzLnRvb2xiYXJJdGVtTGFiZWwgPSBsYWJlbDsKKyAgICB0aGlzLl9hZGRT
dHlsZVJ1bGUoIi50b29sYmFyLWl0ZW0uIiArIGlkICsgIiAudG9vbGJhci1pY29uIiwgImJhY2tn
cm91bmQtaW1hZ2U6IHVybCgiICsgaWNvblVSTCArICIpOyIpOworICAgIFdlYkluc3BlY3Rvci5Q
YW5lbC5jYWxsKHRoaXMsIGlkKTsKK30KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsLnBy
b3RvdHlwZSA9IHsKKyAgICBnZXQgZGVmYXVsdEZvY3VzZWRFbGVtZW50KCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLnNpZGViYXJUcmVlRWxlbWVudCB8fCB0aGlzLmVsZW1lbnQ7CisgICAg
fSwKKworICAgIHVwZGF0ZU1haW5WaWV3V2lkdGg6IGZ1bmN0aW9uKHdpZHRoKQorICAgIHsKKyAg
ICAgICAgdGhpcy5ib2R5RWxlbWVudC5zdHlsZS5sZWZ0ID0gd2lkdGggKyAicHgiOworICAgICAg
ICB0aGlzLnJlc2l6ZSgpOworICAgIH0sCisKKyAgICBzZWFyY2hDYW5jZWxlZDogZnVuY3Rpb24o
c3RhcnRpbmdOZXdTZWFyY2gpCisgICAgeworICAgICAgICBXZWJJbnNwZWN0b3IuZXh0ZW5zaW9u
U2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCwgImNhbmNlbFNlYXJjaCIpOworICAg
ICAgICBXZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlLnNlYXJjaENhbmNlbGVkLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKworICAgIHBlcmZvcm1TZWFyY2g6IGZ1bmN0aW9uKHF1
ZXJ5KQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmV4dGVuc2lvblNlcnZlci5ub3RpZnlT
ZWFyY2hBY3Rpb24odGhpcy5faWQsICJwZXJmb3JtU2VhcmNoIiwgcXVlcnkpOworICAgICAgICBX
ZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlLnBlcmZvcm1TZWFyY2guYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKKyAgICB9LAorCisgICAganVtcFRvTmV4dFNlYXJjaFJlc3VsdDogZnVuY3Rpb24o
KQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmV4dGVuc2lvblNlcnZlci5ub3RpZnlTZWFy
Y2hBY3Rpb24odGhpcy5faWQsICJuZXh0U2VhcmNoUmVzdWx0Iik7CisgICAgICAgIFdlYkluc3Bl
Y3Rvci5QYW5lbC5wcm90b3R5cGUuanVtcFRvTmV4dFNlYXJjaFJlc3VsdC5jYWxsKHRoaXMpOwor
ICAgIH0sCisKKyAgICBqdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdDogZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmV4dGVuc2lvblNlcnZlci5ub3RpZnlTZWFyY2hBY3Rp
b24odGhpcy5faWQsICJwcmV2aW91c1NlYXJjaFJlc3VsdCIpOworICAgICAgICBXZWJJbnNwZWN0
b3IuUGFuZWwucHJvdG90eXBlLmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVzdWx0LmNhbGwodGhpcyk7
CisgICAgfSwKKworICAgIF9hZGRTdHlsZVJ1bGU6IGZ1bmN0aW9uKHNlbGVjdG9yLCBib2R5KQor
ICAgIHsKKyAgICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUi
KTsKKyAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBzZWxlY3RvciArICIgeyAiICsgYm9keSAr
ICIgfSI7CisgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOworICAgIH0K
K30KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsLnByb3RvdHlwZS5fX3Byb3RvX18gPSBX
ZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlOwpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvZnJv
bnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2lu
c3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0cnlTdHViLmpzCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5qcwko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2lmICghd2luZG93Lkluc3BlY3RvckV4dGVuc2lv
blJlZ2lzdHJ5KSB7CisKK1dlYkluc3BlY3Rvci5JbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeVN0
dWIgPSBmdW5jdGlvbigpCit7Cit9CisKK1dlYkluc3BlY3Rvci5JbnNwZWN0b3JFeHRlbnNpb25S
ZWdpc3RyeVN0dWIucHJvdG90eXBlID0geworICAgIGdldEV4dGVuc2lvbnNBc3luYzogZnVuY3Rp
b24oKQorICAgIHsKKyAgICB9Cit9OworCitJbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeSA9IG5l
dyBXZWJJbnNwZWN0b3IuSW5zcGVjdG9yRXh0ZW5zaW9uUmVnaXN0cnlTdHViKCk7CisKK30KSW5k
ZXg6IFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25TZXJ2ZXIuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblNlcnZlci5qcwko
cmV2aXNpb24gMCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25TZXJ2
ZXIuanMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAq
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lv
blNlcnZlciA9IGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLl9jbGllbnRPYmplY3RzID0ge307Cisg
ICAgdGhpcy5faGFuZGxlcnMgPSB7fTsKKyAgICB0aGlzLl9zdWJzY3JpYmVycyA9IHt9OworICAg
IHRoaXMuX3N0YXR1cyA9IG5ldyBXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU3RhdHVzKCk7CisKKyAg
ICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoInN1YnNjcmliZSIsIHRoaXMuX29uU3Vic2NyaWJlLmJp
bmQodGhpcykpOworICAgIHRoaXMuX3JlZ2lzdGVySGFuZGxlcigidW5zdWJzY3JpYmUiLCB0aGlz
Ll9vblVuc3Vic2NyaWJlLmJpbmQodGhpcykpOworICAgIHRoaXMuX3JlZ2lzdGVySGFuZGxlcigi
Z2V0UmVzb3VyY2VzIiwgdGhpcy5fb25HZXRSZXNvdXJjZXMuYmluZCh0aGlzKSk7CisgICAgdGhp
cy5fcmVnaXN0ZXJIYW5kbGVyKCJjcmVhdGVQYW5lbCIsIHRoaXMuX29uQ3JlYXRlUGFuZWwuYmlu
ZCh0aGlzKSk7CisgICAgdGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJjcmVhdGVTaWRlYmFyUGFuZSIs
IHRoaXMuX29uQ3JlYXRlU2lkZWJhci5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9yZWdpc3Rlckhh
bmRsZXIoImxvZyIsIHRoaXMuX29uTG9nLmJpbmQodGhpcykpOyAKKyAgICB0aGlzLl9yZWdpc3Rl
ckhhbmRsZXIoImV2YWx1YXRlT25JbnNwZWN0ZWRQYWdlIiwgdGhpcy5fb25FdmFsdWF0ZU9uSW5z
cGVjdGVkUGFnZS5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoInNldFNp
ZGViYXJIZWlnaHQiLCB0aGlzLl9vblNldFNpZGViYXJIZWlnaHQuYmluZCh0aGlzKSk7CisgICAg
dGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJzZXRTaWRlYmFyRXhwYW5kZWQiLCB0aGlzLl9vblNldFNp
ZGViYXJFeHBhbnNpb24uYmluZCh0aGlzKSk7CisKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5l
cigibWVzc2FnZSIsIHRoaXMuX29uV2luZG93TWVzc2FnZS5iaW5kKHRoaXMpLCBmYWxzZSk7Cit9
CisKK1dlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlID0geworICAgIG5vdGlm
eVBhbmVsU2hvd246IGZ1bmN0aW9uKHBhbmVsTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Bv
c3ROb3RpZmljYXRpb24oInBhbmVsLXNob3duLSIgKyBwYW5lbE5hbWUpOworICAgIH0sCisKKyAg
ICBub3RpZnlPYmplY3RTZWxlY3RlZDogZnVuY3Rpb24ocGFuZWxJZCwgb2JqZWN0VHlwZSwgb2Jq
ZWN0SWQpCisgICAgeworICAgICAgICB0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKCJwYW5lbC1vYmpl
Y3RTZWxlY3RlZC0iICsgcGFuZWxJZCwgb2JqZWN0VHlwZSwgb2JqZWN0SWQpOworICAgIH0sCisK
KyAgICBub3RpZnlSZXNvdXJjZUNyZWF0ZWQ6IGZ1bmN0aW9uKHJlc291cmNlKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fbm90aWZ5T2JqZWN0Q3JlYXRlZCgicmVzb3VyY2UiLCB0aGlzLl9jb252ZXJ0
UmVzb3VyY2UocmVzb3VyY2UpKTsKKyAgICB9LAorCisgICAgX25vdGlmeU9iamVjdENyZWF0ZWQ6
IGZ1bmN0aW9uKG9iamVjdFR5cGUsIG9iaikKKyAgICB7CisgICAgICAgIHRoaXMuX3Bvc3ROb3Rp
ZmljYXRpb24oImNyZWF0ZWQtIiArIG9iamVjdFR5cGUsIG9iaik7CisgICAgfSwKKworICAgIG5v
dGlmeVNlYXJjaEFjdGlvbjogZnVuY3Rpb24ocGFuZWxJZCwgYWN0aW9uLCBzZWFyY2hTdHJpbmcp
CisgICAgeworICAgICAgICB0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKCJwYW5lbC1zZWFyY2gtIiAr
IHBhbmVsSWQsIGFjdGlvbiwgc2VhcmNoU3RyaW5nKTsKKyAgICB9LAorCisgICAgbm90aWZ5SW5z
cGVjdGVkUGFnZUxvYWRlZDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fcG9zdE5v
dGlmaWNhdGlvbigiaW5zcGVjdGVkUGFnZUxvYWRlZCIpOworICAgIH0sCisKKyAgICBub3RpZnlJ
bnNwZWN0ZWRVUkxDaGFuZ2VkOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9wb3N0
Tm90aWZpY2F0aW9uKCJpbnNwZWN0ZWRVUkxDaGFuZ2VkIik7CisgICAgfSwKKworICAgIG5vdGlm
eUluc3BlY3RvclJlc2V0OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9wb3N0Tm90
aWZpY2F0aW9uKCJyZXNldCIpOworICAgIH0sCisKKyAgICBfY29udmVydFJlc291cmNlOiBmdW5j
dGlvbihyZXNvdXJjZSkKKyAgICB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBpZDog
cmVzb3VyY2UuaWRlbnRpZmllciwKKyAgICAgICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsCisg
ICAgICAgICAgICBoYXI6IChuZXcgV2ViSW5zcGVjdG9yLkhBUkVudHJ5KHJlc291cmNlKSkuYnVp
bGQoKSwKKyAgICAgICAgfTsKKyAgICB9LAorCisgICAgX3Bvc3ROb3RpZmljYXRpb246IGZ1bmN0
aW9uKHR5cGUsIGRldGFpbHMpCisgICAgeworICAgICAgICB2YXIgc3Vic2NyaWJlcnMgPSB0aGlz
Ll9zdWJzY3JpYmVyc1t0eXBlXTsKKyAgICAgICAgaWYgKCFzdWJzY3JpYmVycykKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgdmFyIG1lc3NhZ2UgPSB7CisgICAgICAgICAgICBjb21tYW5k
OiAibm90aWZ5LSIgKyB0eXBlLAorICAgICAgICAgICAgYXJndW1lbnRzOiBBcnJheS5wcm90b3R5
cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpIAorICAgICAgICB9OworICAgICAgICBmb3IgKHZh
ciBpID0gMDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgc3Vic2Ny
aWJlcnNbaV0ucG9zdE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfSwKKworICAgIF9vblN1YnNjcmli
ZTogZnVuY3Rpb24obWVzc2FnZSwgcG9ydCkKKyAgICB7CisgICAgICAgIHZhciBzdWJzY3JpYmVy
cyA9IHRoaXMuX3N1YnNjcmliZXJzW21lc3NhZ2UudHlwZV07CisgICAgICAgIGlmIChzdWJzY3Jp
YmVycykKKyAgICAgICAgICAgIHN1YnNjcmliZXJzLnB1c2gocG9ydCk7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZXJzW21lc3NhZ2UudHlwZV0gPSBbIHBvcnQgXTsK
KyAgICB9LAorCisgICAgX29uVW5zdWJzY3JpYmU6IGZ1bmN0aW9uKG1lc3NhZ2UsIHBvcnQpCisg
ICAgeworICAgICAgICB2YXIgc3Vic2NyaWJlcnMgPSB0aGlzLl9zdWJzY3JpYmVyc1ttZXNzYWdl
LnR5cGVdOworICAgICAgICBpZiAoIXN1YnNjcmliZXJzKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBzdWJzY3JpYmVycy5yZW1vdmUocG9ydCk7CisgICAgICAgIGlmICghc3Vic2NyaWJl
cnMubGVuZ3RoKQorICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3N1YnNjcmliZXJzW21lc3NhZ2Uu
dHlwZV07CisgICAgfSwKKworICAgIF9vbkNyZWF0ZVBhbmVsOiBmdW5jdGlvbihtZXNzYWdlLCBw
b3J0KQorICAgIHsKKyAgICAgICAgdmFyIGlkID0gbWVzc2FnZS5pZDsKKyAgICAgICAgLy8gVGhl
IGlkcyBhcmUgZ2VuZXJhdGVkIG9uIHRoZSBjbGllbnQgQVBJIHNpZGUgYW5kIG11c3QgYmUgdW5p
cXVlLCBzbyB0aGUgY2hlY2sgYmVsb3cKKyAgICAgICAgLy8gc2hvdWxkbid0IGJlIGhpdCB1bmxl
c3Mgc29tZW9uZSBpcyBieXBhc3NpbmcgdGhlIEFQSS4KKyAgICAgICAgaWYgKGlkIGluIHRoaXMu
X2NsaWVudE9iamVjdHMgfHwgaWQgaW4gV2ViSW5zcGVjdG9yLnBhbmVscykKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLl9zdGF0dXMuRV9FWElTVFMoaWQpOworICAgICAgICB2YXIgcGFuZWwgPSBu
ZXcgV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsKGlkLCBtZXNzYWdlLmxhYmVsLCBtZXNzYWdl
Lmljb24pOworICAgICAgICB0aGlzLl9jbGllbnRPYmplY3RzW2lkXSA9IHBhbmVsOworCisgICAg
ICAgIHZhciB0b29sYmFyRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFy
Iik7CisgICAgICAgIHZhciBsYXN0VG9vbGJhckl0ZW0gPSBXZWJJbnNwZWN0b3IucGFuZWxPcmRl
cltXZWJJbnNwZWN0b3IucGFuZWxPcmRlci5sZW5ndGggLSAxXS50b29sYmFySXRlbTsKKyAgICAg
ICAgV2ViSW5zcGVjdG9yLmFkZFBhbmVsVG9vbGJhckljb24odG9vbGJhckVsZW1lbnQsIHBhbmVs
LCBsYXN0VG9vbGJhckl0ZW0pOworICAgICAgICBXZWJJbnNwZWN0b3IucGFuZWxzW2lkXSA9IHBh
bmVsOworICAgICAgICB0aGlzLl9jcmVhdGVDbGllbnRJZnJhbWUocGFuZWwuZWxlbWVudCwgbWVz
c2FnZS51cmwpOworICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzLk9LKCk7CisgICAgfSwKKwor
ICAgIF9vbkNyZWF0ZVNpZGViYXI6IGZ1bmN0aW9uKG1lc3NhZ2UsIHBvcnQpCisgICAgeworICAg
ICAgICB2YXIgcGFuZWwgPSBXZWJJbnNwZWN0b3IucGFuZWxzW21lc3NhZ2UucGFuZWxdOworICAg
ICAgICBpZiAoIXBhbmVsKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZP
VU5EKG1lc3NhZ2UucGFuZWwpOworICAgICAgICBpZiAoIXBhbmVsLnNpZGViYXJFbGVtZW50IHx8
ICFwYW5lbC5zaWRlYmFyUGFuZXMpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzLkVf
Tk9UU1VQUE9SVEVEKCk7CisgICAgICAgIHZhciBpZCA9IG1lc3NhZ2UuaWQ7CisgICAgICAgIHZh
ciBzaWRlYmFyID0gbmV3IFdlYkluc3BlY3Rvci5TaWRlYmFyUGFuZShtZXNzYWdlLnRpdGxlKTsK
KyAgICAgICAgdGhpcy5fY2xpZW50T2JqZWN0c1tpZF0gPSBzaWRlYmFyOworICAgICAgICBwYW5l
bC5zaWRlYmFyUGFuZXNbaWRdID0gc2lkZWJhcjsKKyAgICAgICAgcGFuZWwuc2lkZWJhckVsZW1l
bnQuYXBwZW5kQ2hpbGQoc2lkZWJhci5lbGVtZW50KTsKKyAgICAgICAgdGhpcy5fY3JlYXRlQ2xp
ZW50SWZyYW1lKHNpZGViYXIuYm9keUVsZW1lbnQsIG1lc3NhZ2UudXJsKTsKKyAgICAgICAgcmV0
dXJuIHRoaXMuX3N0YXR1cy5PSygpOworICAgIH0sCisKKyAgICBfY3JlYXRlQ2xpZW50SWZyYW1l
OiBmdW5jdGlvbihwYXJlbnQsIHVybCwgcmVxdWVzdElkLCBwb3J0KQorICAgIHsKKyAgICAgICAg
dmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOworICAgICAgICBp
ZnJhbWUuc3JjID0gdXJsOworICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSAiMTAwJSI7Cisg
ICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChpZnJhbWUpOworICAgIH0sCisKKyAgICBfb25TZXRT
aWRlYmFySGVpZ2h0OiBmdW5jdGlvbihtZXNzYWdlKQorICAgIHsKKyAgICAgICAgdmFyIHNpZGVi
YXIgPSB0aGlzLl9jbGllbnRPYmplY3RzW21lc3NhZ2UuaWRdOworICAgICAgICBpZiAoIXNpZGVi
YXIpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQobWVzc2FnZS5p
ZCk7CisgICAgICAgIHNpZGViYXIuYm9keUVsZW1lbnQuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQg
PSBtZXNzYWdlLmhlaWdodDsKKyAgICB9LAorCisgICAgX29uU2V0U2lkZWJhckV4cGFuc2lvbjog
ZnVuY3Rpb24obWVzc2FnZSkKKyAgICB7CisgICAgICAgIHZhciBzaWRlYmFyID0gdGhpcy5fY2xp
ZW50T2JqZWN0c1ttZXNzYWdlLmlkXTsKKyAgICAgICAgaWYgKCFzaWRlYmFyKQorICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKG1lc3NhZ2UuaWQpOworICAgICAgICBp
ZiAobWVzc2FnZS5leHBhbmRlZCkKKyAgICAgICAgICAgIHNpZGViYXIuZXhwYW5kKCk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHNpZGViYXIuY29sbGFwc2UoKTsKKyAgICB9LAorCisgICAg
X29uTG9nOiBmdW5jdGlvbihtZXNzYWdlKQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmxv
ZyhtZXNzYWdlLm1lc3NhZ2UpOworICAgIH0sCisKKyAgICBfb25FdmFsdWF0ZU9uSW5zcGVjdGVk
UGFnZTogZnVuY3Rpb24obWVzc2FnZSwgcG9ydCkKKyAgICB7CisgICAgICAgIEluamVjdGVkU2Ny
aXB0QWNjZXNzLmdldERlZmF1bHQoKS5ldmFsdWF0ZUFuZFN0cmluZ2lmeShtZXNzYWdlLmV4cHJl
c3Npb24sIHRoaXMuX2Rpc3BhdGNoQ2FsbGJhY2suYmluZCh0aGlzLCBtZXNzYWdlLnJlcXVlc3RJ
ZCwgcG9ydCkpOworICAgIH0sCisKKyAgICBfb25SZXZlYWxBbmRTZWxlY3Q6IGZ1bmN0aW9uKG1l
c3NhZ2UpCisgICAgeworICAgICAgICBpZiAobWVzc2FnZS5wYW5lbElkID09PSAicmVzb3VyY2Vz
IiAmJiB0eXBlID09PSAicmVzb3VyY2UiKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uUmV2
ZWFsQW5kU2VsZWN0UmVzb3VyY2UobWVzc2FnZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLl9zdGF0dXMuRV9OT1RTVVBQT1JURUQobWVzc2FnZS5wYW5lbElkLCBtZXNz
YWdlLnR5cGUpOworICAgIH0sCisKKyAgICBfb25SZXZlYWxBbmRTZWxlY3RSZXNvdXJjZTogZnVu
Y3Rpb24obWVzc2FnZSkKKyAgICB7CisgICAgICAgIHZhciBpZCA9IG1lc3NhZ2UuaWQ7CisgICAg
ICAgIHZhciByZXNvdXJjZSA9IG51bGw7CisKKyAgICAgICAgcmVzb3VyY2UgPSB0eXBlb2YgaWQg
PT09ICJudW1iZXIiID8gV2ViSW5zcGVjdG9yLnJlc291cmNlc1tpZF0gOiBXZWJJbnNwZWN0b3Iu
cmVzb3VyY2VGb3JVUkwoaWQpOworICAgICAgICBpZiAoIXJlc291cmNlKQorICAgICAgICAgICAg
cmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKHR5cGVvZiBpZCArICI6ICIgKyBpZCk7Cisg
ICAgICAgIFdlYkluc3BlY3Rvci5wYW5lbHMucmVzb3VyY2VzLnNob3dSZXNvdXJjZShyZXNvdXJj
ZSwgbWVzc2FnZS5saW5lKTsKKyAgICAgICAgV2ViSW5zcGVjdG9yLnNob3dSZXNvdXJjZXNQYW5l
bCgpOworICAgIH0sCisKKyAgICBfZGlzcGF0Y2hDYWxsYmFjazogZnVuY3Rpb24ocmVxdWVzdElk
LCBwb3J0LCByZXN1bHQpCisgICAgeworICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgY29tbWFu
ZDogImNhbGxiYWNrIiwgcmVxdWVzdElkOiByZXF1ZXN0SWQsIHJlc3VsdDogcmVzdWx0IH0pOwor
ICAgIH0sCisKKyAgICBfb25HZXRSZXNvdXJjZXM6IGZ1bmN0aW9uKHJlcXVlc3QpCisgICAgewor
ICAgICAgICBmdW5jdGlvbiByZXNvdXJjZVdyYXBwZXIoaWQpCisgICAgICAgIHsKKyAgICAgICAg
ICAgIHJldHVybiBXZWJJbnNwZWN0b3IuZXh0ZW5zaW9uU2VydmVyLl9jb252ZXJ0UmVzb3VyY2Uo
V2ViSW5zcGVjdG9yLnJlc291cmNlc1tpZF0pOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJl
c3BvbnNlOworICAgICAgICBpZiAocmVxdWVzdC5pZCkKKyAgICAgICAgICAgIHJlc3BvbnNlID0g
V2ViSW5zcGVjdG9yLnJlc291cmNlc1tyZXF1ZXN0LmlkXSA/IHJlc291cmNlV3JhcHBlcihyZXF1
ZXN0LmlkKSA6IHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKHJlcXVlc3QuaWQpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICByZXNwb25zZSA9IE9iamVjdC5wcm9wZXJ0aWVzKFdlYkluc3BlY3Rv
ci5yZXNvdXJjZXMpLm1hcChyZXNvdXJjZVdyYXBwZXIpOworICAgICAgICByZXR1cm4gcmVzcG9u
c2U7CisgICAgfSwKKworICAgIGluaXRFeHRlbnNpb25zOiBmdW5jdGlvbigpCisgICAgeworICAg
ICAgICBJbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25zQXN5bmMoKTsKKyAg
ICB9LAorCisgICAgX2FkZEV4dGVuc2lvbnM6IGZ1bmN0aW9uKGV4dGVuc2lvbnMpCisgICAgewor
ICAgICAgICBJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0RXh0ZW5zaW9uQVBJKCIoIiArIGluamVj
dGVkRXh0ZW5zaW9uQVBJLnRvU3RyaW5nKCkgKyAiKSIpOyAvLyBTZWUgRXh0ZW5zaW9uQVBJLmpz
IGZvciBkZXRhaWxzLgorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVu
Z3RoOyArK2kpIHsKKyAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwor
ICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5zdGFydFBh
Z2UpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB2YXIgaWZy
YW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CisgICAgICAgICAgICAgICAg
aWZyYW1lLnNyYyA9IGV4dGVuc2lvbi5zdGFydFBhZ2U7CisgICAgICAgICAgICAgICAgaWZyYW1l
LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5h
cHBlbmRDaGlsZChpZnJhbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAg
ICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIGV4dGVuc2lvbiAiICsg
ZXh0ZW5zaW9uLnN0YXJ0UGFnZSArICI6IiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfSwKKworICAgIF9vbldpbmRvd01lc3NhZ2U6IGZ1bmN0aW9uKGV2ZW50KQorICAgIHsK
KyAgICAgICAgaWYgKGV2ZW50LmRhdGEgIT09ICJyZWdpc3RlckV4dGVuc2lvbiIpCisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIHZhciBwb3J0ID0gZXZlbnQucG9ydHNbMF07CisgICAgICAg
IHBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29ubWVzc2FnZS5iaW5kKHRo
aXMpLCBmYWxzZSk7CisgICAgICAgIHBvcnQuc3RhcnQoKTsKKyAgICB9LAorCisgICAgX29ubWVz
c2FnZTogZnVuY3Rpb24oZXZlbnQpCisgICAgeworICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50
LmRhdGE7CisgICAgICAgIHZhciByZXN1bHQ7CisKKyAgICAgICAgaWYgKHJlcXVlc3QuY29tbWFu
ZCBpbiB0aGlzLl9oYW5kbGVycykKKyAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2hhbmRsZXJz
W3JlcXVlc3QuY29tbWFuZF0ocmVxdWVzdCwgZXZlbnQudGFyZ2V0KTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fc3RhdHVzLkVfTk9UU1VQUE9SVEVEKHJlcXVlc3Qu
Y29tbWFuZCk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAmJiByZXF1ZXN0LnJlcXVlc3RJZCkKKyAg
ICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoQ2FsbGJhY2socmVxdWVzdC5yZXF1ZXN0SWQsIGV2ZW50
LnRhcmdldCwgcmVzdWx0KTsKKyAgICB9LAorCisgICAgX3JlZ2lzdGVySGFuZGxlcjogZnVuY3Rp
b24oY29tbWFuZCwgY2FsbGJhY2spCisgICAgeworICAgICAgICB0aGlzLl9oYW5kbGVyc1tjb21t
YW5kXSA9IGNhbGxiYWNrOworICAgIH0KK30KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZl
ci5fc3RhdHVzZXMgPSAKK3sKKyAgICBPSzogIiIsCisgICAgRV9OT1RGT1VORDogIk9iamVjdCBu
b3QgZm91bmQgKCVzKSIsCisgICAgRV9OT1RTVVBQT1JURUQ6ICJPYmplY3QgZG9lcyBub3Qgc3Vw
cG9ydCByZXF1ZXN0ZWQgb3BlcmF0aW9uICglcykiLAorICAgIEVfRVhJU1RTOiAiT2JqZWN0IGFs
cmVhZHkgZXhpc3RzICglcykiCit9CisKK1dlYkluc3BlY3Rvci5FeHRlbnNpb25TdGF0dXMgPSBm
dW5jdGlvbigpCit7CisgICAgZnVuY3Rpb24gbWFrZVN0YXR1cyhjb2RlKQorICAgIHsKKyAgICAg
ICAgdmFyIGRlc2NyaXB0aW9uID0gV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5fc3RhdHVz
ZXNbY29kZV0gfHwgY29kZTsKKyAgICAgICAgdmFyIGRldGFpbHMgPSBBcnJheS5wcm90b3R5cGUu
c2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgICAgICB2YXIgc3RhdHVzID0geyBjb2RlOiBj
b2RlLCBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sIGRldGFpbHM6IGRldGFpbHMgfTsKKyAgICAg
ICAgaWYgKGNvZGUgIT09ICJPSyIpIHsKKyAgICAgICAgICAgIHN0YXR1cy5pc0Vycm9yID0gdHJ1
ZTsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKCJFeHRlbnNpb24gc2VydmVyIGVycm9yOiAiICsg
U3RyaW5nLnZzcHJpbnRmKGRlc2NyaXB0aW9uLCBkZXRhaWxzKSk7CisgICAgICAgIH0KKyAgICAg
ICAgcmV0dXJuIHN0YXR1czsgCisgICAgfQorICAgIGZvciAoc3RhdHVzIGluIFdlYkluc3BlY3Rv
ci5FeHRlbnNpb25TZXJ2ZXIuX3N0YXR1c2VzKQorICAgICAgICB0aGlzW3N0YXR1c10gPSBtYWtl
U3RhdHVzLmJpbmQobnVsbCwgc3RhdHVzKTsKK30KKworV2ViSW5zcGVjdG9yLmFkZEV4dGVuc2lv
bnMgPSBmdW5jdGlvbihleHRlbnNpb25zKQoreworICAgIFdlYkluc3BlY3Rvci5leHRlbnNpb25T
ZXJ2ZXIuX2FkZEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Cit9CisKSW5kZXg6IFdlYkNvcmUvaW5z
cGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdC5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2luc3BlY3Rvci9mcm9udC1lbmQvSW5qZWN0ZWRTY3JpcHQuanMJKHJldmlzaW9uIDY0MjA2KQor
KysgV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVkU2NyaXB0LmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0yMzgsNiArMjM4LDE5IEBAIEluamVjdGVkU2NyaXB0LmdldENvbXBsZXRpb25z
ID0gZnVuY3Rpb24KICAgICByZXR1cm4gcHJvcHM7CiB9CiAKK0luamVjdGVkU2NyaXB0LmV2YWx1
YXRlQW5kU3RyaW5naWZ5ID0gZnVuY3Rpb24oZXhwcmVzc2lvbikKK3sKKyAgICB2YXIgcmVzdWx0
ID0ge307CisgICAgdHJ5IHsKKyAgICAgICAgdmFyIHZhbHVlID0gSW5qZWN0ZWRTY3JpcHQuX2V2
YWx1YXRlT24oaW5zcGVjdGVkV2luZG93LmV2YWwsIGluc3BlY3RlZFdpbmRvdywgZXhwcmVzc2lv
biwgZmFsc2UpOworICAgICAgICByZXN1bHQudmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7
CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgICByZXN1bHQudmFsdWUgPSBlLnRvU3RyaW5nKCk7
CisgICAgICAgIHJlc3VsdC5pc0V4Y2VwdGlvbiA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKIEluamVjdGVkU2NyaXB0LmV2YWx1YXRlID0gZnVuY3Rpb24oZXhwcmVzc2lv
biwgb2JqZWN0R3JvdXApCiB7CiAgICAgcmV0dXJuIEluamVjdGVkU2NyaXB0Ll9ldmFsdWF0ZUFu
ZFdyYXAoaW5zcGVjdGVkV2luZG93LmV2YWwsIGluc3BlY3RlZFdpbmRvdywgZXhwcmVzc2lvbiwg
b2JqZWN0R3JvdXApOwpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVk
U2NyaXB0QWNjZXNzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC9JbmplY3RlZFNjcmlwdEFjY2Vzcy5qcwkocmV2aXNpb24gNjQyMDYpCisrKyBXZWJDb3JlL2lu
c3BlY3Rvci9mcm9udC1lbmQvSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuanMJKHdvcmtpbmcgY29weSkK
QEAgLTc1LDE0ICs3NSwxNSBAQCBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIg
PSBmCiAvLyAtIE1ha2Ugc3VyZSBsYXN0IHBhcmFtZXRlciBvZiBhbGwgdGhlIEluamVjdGVkU3Jp
cHRBY2Nlc3MuKiBjYWxscyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLgogLy8gV2Uga2VlcCB0aGVz
ZSBzb3J0ZWQuCiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRl
Iik7CitJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRlQW5kU3Ry
aW5naWZ5Iik7CiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRl
SW5DYWxsRnJhbWUiKTsKK0luamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZXZh
bHVhdGVPblNlbGYiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZ2V0
Q29tcGxldGlvbnMiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZ2V0
UHJvcGVydGllcyIpOwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJnZXRQ
cm90b3R5cGVzIik7CiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoIm9wZW5J
bkluc3BlY3RlZFdpbmRvdyIpOwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVy
KCJwdXNoTm9kZVRvRnJvbnRlbmQiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFu
ZGxlcigic2V0UHJvcGVydHlWYWx1ZSIpOwotSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxI
YW5kbGVyKCJldmFsdWF0ZU9uU2VsZiIpOwogCiAvLyBTb21lIG1ldGhvZHMgY2FuJ3QgcnVuIHN5
bmNocm9ub3VzbHkgZXZlbiBvbiB0aGUgaW5qZWN0ZWQgc2NyaXB0IHNpZGUgKHN1Y2ggYXMgREIg
dHJhbnNhY3Rpb25zKS4KIC8vIE1hcmsgdGhlbSBhcyBhc3luY2hyb25vdXMgaGVyZS4KSW5kZXg6
IFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbnNwZWN0b3JGcm9u
dGVuZEhvc3RTdHViLmpzCShyZXZpc2lvbiA2NDIwNikKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zy
b250LWVuZC9JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzCSh3b3JraW5nIGNvcHkpCkBAIC04
NCw2ICs4NCwxMCBAQCBXZWJJbnNwZWN0b3IuSW5zcGVjdG9yRnJvbnRlbmRIb3N0U3R1Yi5wCiAg
ICAgewogICAgIH0sCiAKKyAgICBzZXRFeHRlbnNpb25BUEk6IGZ1bmN0aW9uKHNjcmlwdCkKKyAg
ICB7CisgICAgfSwKKwogICAgIGxvYWRlZDogZnVuY3Rpb24oKQogICAgIHsKICAgICB9LApJbmRl
eDogV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMJKHJldmlzaW9uIDY0MjA2KQor
KysgV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMJKHdvcmtpbmcgY29weSkK
QEAgLTM0LDYgKzM0LDEwIEBACiAgICAgPGZpbGU+RWxlbWVudHNQYW5lbC5qczwvZmlsZT4KICAg
ICA8ZmlsZT5FbGVtZW50c1RyZWVPdXRsaW5lLmpzPC9maWxlPgogICAgIDxmaWxlPkV2ZW50TGlz
dGVuZXJzU2lkZWJhclBhbmUuanM8L2ZpbGU+CisgICAgPGZpbGU+RXh0ZW5zaW9uQVBJLmpzPC9m
aWxlPgorICAgIDxmaWxlPkV4dGVuc2lvblBhbmVsLmpzPC9maWxlPgorICAgIDxmaWxlPkV4dGVu
c2lvblJlZ2lzdHJ5U3R1Yi5qczwvZmlsZT4KKyAgICA8ZmlsZT5FeHRlbnNpb25TZXJ2ZXIuanM8
L2ZpbGU+CiAgICAgPGZpbGU+Rm9udFZpZXcuanM8L2ZpbGU+CiAgICAgPGZpbGU+SEFSRW50cnku
anM8L2ZpbGU+CiAgICAgPGZpbGU+SGVscFNjcmVlbi5qczwvZmlsZT4KSW5kZXg6IFdlYkNvcmUv
aW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwJKHJldmlzaW9uIDY0MjA2KQorKysg
V2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sCSh3b3JraW5nIGNvcHkp
CkBAIC0zOSw2ICszOSw3IEBAIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE8KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJpbnNwZWN0b3IuanMi
Pjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ikluc3Bl
Y3RvckJhY2tlbmRTdHViLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2
YXNjcmlwdCIgc3JjPSJJbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzIj48L3NjcmlwdD4KKyAg
ICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJFeHRlbnNpb25SZWdpc3RyeVN0
dWIuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9
Ik9iamVjdC5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQi
IHNyYz0iU2V0dGluZ3MuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZh
c2NyaXB0IiBzcmM9IkNTU1N0eWxlTW9kZWwuanMiPjwvc2NyaXB0PgpAQCAtOTYsNiArOTcsOSBA
QCBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPCiAgICAgPHNjcmlwdCB0
eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iU3RvcmFnZVBhbmVsLmpzIj48L3NjcmlwdD4KICAg
ICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJQcm9maWxlc1BhbmVsLmpzIj48
L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJDb25zb2xl
UGFuZWwuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBz
cmM9IkV4dGVuc2lvbkFQSS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2ph
dmFzY3JpcHQiIHNyYz0iRXh0ZW5zaW9uU2VydmVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJFeHRlbnNpb25QYW5lbC5qcyI+PC9zY3JpcHQ+
CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iQXVkaXRzUGFuZWwuanMi
Pjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkF1ZGl0
UmVzdWx0Vmlldy5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiIHNyYz0iQXVkaXRMYXVuY2hlclZpZXcuanMiPjwvc2NyaXB0PgpJbmRleDogV2ViQ29yZS9p
bnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2lu
c3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzCShyZXZpc2lvbiA2NDIwNikKKysrIFdlYkNv
cmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTUy
Niw2ICs1MjYsOSBAQCBXZWJJbnNwZWN0b3IubG9hZGVkID0gZnVuY3Rpb24oKQogICAgIGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCJjbG9zZS1idXR0b24tbGVmdCIpLmFkZEV2ZW50TGlzdGVuZXIo
ImNsaWNrIiwgdGhpcy5jbG9zZSwgdHJ1ZSk7CiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo
ImNsb3NlLWJ1dHRvbi1yaWdodCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5jbG9z
ZSwgdHJ1ZSk7CiAKKyAgICB0aGlzLmV4dGVuc2lvblNlcnZlciA9IG5ldyBXZWJJbnNwZWN0b3Iu
RXh0ZW5zaW9uU2VydmVyKCk7CisgICAgdGhpcy5leHRlbnNpb25TZXJ2ZXIuaW5pdEV4dGVuc2lv
bnMoKTsKKwogICAgIEluc3BlY3RvckZyb250ZW5kSG9zdC5sb2FkZWQoKTsKIH0KIApAQCAtMTIw
Miw2ICsxMjA1LDcgQEAgV2ViSW5zcGVjdG9yLnVwZGF0ZVJlc291cmNlID0gZnVuY3Rpb24oaQog
ICAgICAgICByZXNvdXJjZS5maW5pc2hlZCA9IHBheWxvYWQuZmluaXNoZWQ7CiAgICAgICAgIGlm
ICh0aGlzLnBhbmVscy5hdWRpdHMpCiAgICAgICAgICAgICB0aGlzLnBhbmVscy5hdWRpdHMucmVz
b3VyY2VGaW5pc2hlZChyZXNvdXJjZSk7CisgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmVyLm5v
dGlmeVJlc291cmNlQ3JlYXRlZChyZXNvdXJjZSk7CiAgICAgfQogCiAgICAgaWYgKHBheWxvYWQu
ZGlkVGltaW5nQ2hhbmdlKSB7CkBAIC0xNDI2LDYgKzE0MzAsNyBAQCBXZWJJbnNwZWN0b3IucmVz
ZXQgPSBmdW5jdGlvbigpCiAgICAgZGVsZXRlIHRoaXMubWFpblJlc291cmNlOwogCiAgICAgdGhp
cy5jb25zb2xlLmNsZWFyTWVzc2FnZXMoKTsKKyAgICB0aGlzLmV4dGVuc2lvblNlcnZlci5ub3Rp
ZnlJbnNwZWN0b3JSZXNldCgpOwogfQogCiBXZWJJbnNwZWN0b3IucmVzZXRQcm9maWxlc1BhbmVs
ID0gZnVuY3Rpb24oKQpAQCAtMTQ0Miw2ICsxNDQ3LDcgQEAgV2ViSW5zcGVjdG9yLmJyaW5nVG9G
cm9udCA9IGZ1bmN0aW9uKCkKIFdlYkluc3BlY3Rvci5pbnNwZWN0ZWRVUkxDaGFuZ2VkID0gZnVu
Y3Rpb24odXJsKQogewogICAgIEluc3BlY3RvckZyb250ZW5kSG9zdC5pbnNwZWN0ZWRVUkxDaGFu
Z2VkKHVybCk7CisgICAgdGhpcy5leHRlbnNpb25TZXJ2ZXIubm90aWZ5SW5zcGVjdGVkVVJMQ2hh
bmdlZCgpOwogfQogCiBXZWJJbnNwZWN0b3IucmVzb3VyY2VVUkxDaGFuZ2VkID0gZnVuY3Rpb24o
cmVzb3VyY2UsIG9sZFVSTCkKQEAgLTE0NTQsNiArMTQ2MCw3IEBAIFdlYkluc3BlY3Rvci5kaWRD
b21taXRMb2FkID0gZnVuY3Rpb24oKQogewogICAgIC8vIENsZWFudXAgZWxlbWVudHMgcGFuZWwg
ZWFybHkgb24gaW5zcGVjdGVkIHBhZ2UgcmVmcmVzaC4KICAgICBXZWJJbnNwZWN0b3Iuc2V0RG9j
dW1lbnQobnVsbCk7CisgICAgdGhpcy5leHRlbnNpb25TZXJ2ZXIubm90aWZ5SW5zcGVjdGVkUGFn
ZUxvYWRlZCgpOwogfQogCiBXZWJJbnNwZWN0b3IudXBkYXRlQ29uc29sZU1lc3NhZ2VFeHBpcmVk
Q291bnQgPSBmdW5jdGlvbihjb3VudCkKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDY0MjA2KQorKysgTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDQgQEAKKzIwMTAt
MDctMjggIEFuZHJleSBLb3N5YWtvdiAgPGNhc2VxQGNocm9taXVtLm9yZz4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXZWIgSW5zcGVjdG9yOiBhZGRl
ZCB0ZXN0cyBmb3IgaW5zcGVjdG9yIGV4dGVuc2lvbnMgQVBJLgorSS4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQwNDI1CisKKyAgICAgICAgKiBodHRw
L3Rlc3RzL2luc3BlY3Rvci9pbnNwZWN0b3ItdGVzdC5qczoKKyAgICAgICAgKGR1bXBPYmplY3Qp
OgorICAgICAgICAqIGluc3BlY3Rvci9leHRlbnNpb25zLWV4cGVjdGVkLnR4dDogQWRkZWQuCisg
ICAgICAgICogaW5zcGVjdG9yL2V4dGVuc2lvbnMuaHRtbDogQWRkZWQuCisgICAgICAgICogaW5z
cGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBp
bnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1tYWluLmpzOiBBZGRlZC4KKyAgICAgICAgKHRl
c3RfZXZhbE9rKToKKyAgICAgICAgKHRlc3RfZXZhbEZhaWxlZCk6CisgICAgICAgICh0ZXN0X2dl
dEFsbFJlc291cmNlcy5jb21wYXJlUmVzb3VyY2VzKToKKyAgICAgICAgKHRlc3RfZ2V0QWxsUmVz
b3VyY2VzLm9uUmVzb3VyY2UpOgorICAgICAgICAodGVzdF9nZXRBbGxSZXNvdXJjZXMpOgorICAg
ICAgICAodGVzdF9nZXRJbnZhbGlkUmVzb3VyY2Uub25SZXNvdXJjZSk6CisgICAgICAgICh0ZXN0
X2dldEludmFsaWRSZXNvdXJjZSk6CisgICAgICAgIChnZXQgdGVzdF9jcmVhdGVQYW5lbC5vblBh
bmVsQ3JlYXRlZCk6CisgICAgICAgIChnZXQgdGVzdF9jcmVhdGVQYW5lbCk6CisgICAgICAgICh0
ZXN0X2NyZWF0ZVNpZGViYXIub25TaWRlYmFyQ3JlYXRlZCk6CisgICAgICAgICh0ZXN0X2NyZWF0
ZVNpZGViYXIpOgorICAgICAgICAodGVzdF9jcmVhdGVTaWRlYmFyTm90U3VwcG9ydGVkLm9uU2lk
ZWJhckNyZWF0ZWQpOgorICAgICAgICAodGVzdF9jcmVhdGVTaWRlYmFyTm90U3VwcG9ydGVkKToK
KyAgICAgICAgKHRlc3RfcmVzb3VyY2VOb3RpZmljYXRpb24ub25SZXNvdXJjZUNyZWF0ZWQpOgor
ICAgICAgICAodGVzdF9yZXNvdXJjZU5vdGlmaWNhdGlvbik6CisgICAgICAgICh0ZXN0X2V4dGVu
c2lvbkFQSSk6CisgICAgICAgIChvbkV2YWx1YXRlKToKKyAgICAgICAgKG9uVGVzdHNEb25lKToK
KyAgICAgICAgKHJ1blRlc3RzKToKKyAgICAgICAgKHJ1blRlc3QpOgorICAgICAgICAoY2FsbGJh
Y2tBbmROZXh0VGVzdC5jYWxsYmFja1dyYXBwZXIpOgorICAgICAgICAoY2FsbGJhY2tBbmROZXh0
VGVzdCk6CisgICAgICAgIChvdXRwdXQpOgorICAgICAgICAqIGluc3BlY3Rvci9yZXNvdXJjZXMv
ZXh0ZW5zaW9uLXBhbmVsLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGluc3BlY3Rvci9yZXNvdXJj
ZXMvZXh0ZW5zaW9uLXNpZGViYXIuaHRtbDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vY2hy
b21pdW0vdGVzdF9leHBlY3RhdGlvbnMudHh0OgorCiAyMDEwLTA3LTI4ICBOaWtvbGFzIFppbW1l
cm1hbm4gIDxuemltbWVybWFubkByaW0uY29tPgogCiAgICAgICAgIE5vdCByZXZpZXdlZC4gRml4
IHR3byBsYXlvdXQgdGVzdCBmYWlsdXJlIG9uIHRoZSB3aW5kb3dzIHNsYXZlLiBSZW1vdmUgd2lu
LXhwIHNwZWNpZmljIHJlc3VsdHMgYWZ0ZXIgdGhlIHI2NDE4NiBjaGFuZ2UuCkluZGV4OiBMYXlv
dXRUZXN0cy9odHRwL3Rlc3RzL2luc3BlY3Rvci9pbnNwZWN0b3ItdGVzdC5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2luc3BlY3Rvci9pbnNwZWN0b3ItdGVzdC5qcwko
cmV2aXNpb24gNjQyMDYpCisrKyBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2luc3BlY3Rvci9pbnNw
ZWN0b3ItdGVzdC5qcwkod29ya2luZyBjb3B5KQpAQCAtNTQsNiArNTQsOCBAQCBmdW5jdGlvbiBk
dW1wT2JqZWN0KG9iamVjdCwgbm9uZGV0ZXJtaW5pCiAgICAgICAgICAgICBkdW1wT2JqZWN0KHBy
b3BWYWx1ZSwgbm9uZGV0ZXJtaW5pc3RpY1Byb3BzLCBwcmVmaXggKyAiICAgICIsIHByZWZpeFdp
dGhOYW1lKTsKICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gInN0cmluZyIp
CiAgICAgICAgICAgICBvdXRwdXQocHJlZml4V2l0aE5hbWUgKyAiXCIiICsgcHJvcFZhbHVlICsg
IlwiIik7CisgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICJmdW5jdGlvbiIp
CisgICAgICAgICAgICBvdXRwdXQocHJlZml4V2l0aE5hbWUgKyAiPGZ1bmN0aW9uPiIpOwogICAg
ICAgICBlbHNlCiAgICAgICAgICAgICBvdXRwdXQocHJlZml4V2l0aE5hbWUgKyBwcm9wVmFsdWUp
OwogICAgIH0KSW5kZXg6IExheW91dFRlc3RzL2luc3BlY3Rvci9leHRlbnNpb25zLWV4cGVjdGVk
LnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy1leHBl
Y3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9u
cy1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTQgQEAKK1Rlc3RzIFdlYklu
c3BlY3RvciBleHRlbnNpb24gQVBJCisKK1N0YXJ0ZWQgZXh0ZW5zaW9uLgorUnVubmluZyB0ZXN0
cy4uLgorPj4+IHRlc3RfY3JlYXRlUGFuZWwKK2RvbmUgY3JlYXRlUGFuZWwKK1BhbmVsIGNyZWF0
ZWQKK3sKKyAgICBjcmVhdGVTaWRlYmFyUGFuZSA6IDxmdW5jdGlvbj4KKyAgICBvblNlYXJjaCA6
IHsKKyAgICAgICAgYWRkTGlzdGVuZXIgOiA8ZnVuY3Rpb24+CisgICAgICAgIHJlbW92ZUxpc3Rl
bmVyIDogPGZ1bmN0aW9uPgorICAgIH0KK30KKz4+PiB0ZXN0X2NyZWF0ZVNpZGViYXIKK1NpZGVi
YXIgY3JlYXRlZAoreworICAgIHNldEhlaWdodCA6IDxmdW5jdGlvbj4KKyAgICBzZXRFeHBhbmRl
ZCA6IDxmdW5jdGlvbj4KK30KKz4+PiB0ZXN0X2NyZWF0ZVNpZGViYXJOb3RTdXBwb3J0ZWQKK1Np
ZGViYXIgY3JlYXRpb24gcmVzdWx0OiB7ImNvZGUiOiJFX05PVFNVUFBPUlRFRCIsImRlc2NyaXB0
aW9uIjoiT2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgcmVxdWVzdGVkIG9wZXJhdGlvbiAoJXMpIiwi
ZGV0YWlscyI6W10sImlzRXJyb3IiOnRydWV9Cis+Pj4gdGVzdF9ldmFsRmFpbGVkCitFdmFsdWF0
ZTogVHlwZUVycm9yOiBKU09OLnN0cmluZ2lmeSBjYW5ub3Qgc2VyaWFsaXplIGN5Y2xpYyBzdHJ1
Y3R1cmVzLihleGNlcHRpb246IHRydWUpCis+Pj4gdGVzdF9ldmFsT2sKK0V2YWx1YXRlOiB7InN0
ciI6ImZvbyIsIm51bSI6NDJ9KGV4Y2VwdGlvbjogdW5kZWZpbmVkKQorPj4+IHRlc3RfZXh0ZW5z
aW9uQVBJCit7CisgICAgaW5zcGVjdGVkV2luZG93IDogeworICAgICAgICBvbkxvYWRlZCA6IHsK
KyAgICAgICAgICAgIGFkZExpc3RlbmVyIDogPGZ1bmN0aW9uPgorICAgICAgICAgICAgcmVtb3Zl
TGlzdGVuZXIgOiA8ZnVuY3Rpb24+CisgICAgICAgIH0KKyAgICAgICAgb25OYXZpZ2F0ZWQgOiB7
CisgICAgICAgICAgICBhZGRMaXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAgICAgICAgICAgIHJlbW92
ZUxpc3RlbmVyIDogPGZ1bmN0aW9uPgorICAgICAgICB9CisgICAgICAgIG9uRE9NQ29udGVudExv
YWRlZCA6IHsKKyAgICAgICAgICAgIGFkZExpc3RlbmVyIDogPGZ1bmN0aW9uPgorICAgICAgICAg
ICAgcmVtb3ZlTGlzdGVuZXIgOiA8ZnVuY3Rpb24+CisgICAgICAgIH0KKyAgICAgICAgcmVsb2Fk
IDogPGZ1bmN0aW9uPgorICAgICAgICBldmFsdWF0ZSA6IDxmdW5jdGlvbj4KKyAgICB9CisgICAg
cGFuZWxzIDogeworICAgICAgICBlbGVtZW50cyA6IHsKKyAgICAgICAgICAgIGNyZWF0ZVNpZGVi
YXJQYW5lIDogPGZ1bmN0aW9uPgorICAgICAgICB9CisgICAgICAgIHJlc291cmNlcyA6IHsKKyAg
ICAgICAgICAgIGNyZWF0ZVNpZGViYXJQYW5lIDogPGZ1bmN0aW9uPgorICAgICAgICB9CisgICAg
ICAgIHNjcmlwdHMgOiB7CisgICAgICAgICAgICBjcmVhdGVTaWRlYmFyUGFuZSA6IDxmdW5jdGlv
bj4KKyAgICAgICAgfQorICAgICAgICB0aW1lbGluZSA6IHsKKyAgICAgICAgICAgIGNyZWF0ZVNp
ZGViYXJQYW5lIDogPGZ1bmN0aW9uPgorICAgICAgICB9CisgICAgICAgIHByb2ZpbGVzIDogewor
ICAgICAgICAgICAgY3JlYXRlU2lkZWJhclBhbmUgOiA8ZnVuY3Rpb24+CisgICAgICAgIH0KKyAg
ICAgICAgc3RvcmFnZSA6IHsKKyAgICAgICAgICAgIGNyZWF0ZVNpZGViYXJQYW5lIDogPGZ1bmN0
aW9uPgorICAgICAgICB9CisgICAgICAgIGF1ZGl0cyA6IHsKKyAgICAgICAgICAgIGNyZWF0ZVNp
ZGViYXJQYW5lIDogPGZ1bmN0aW9uPgorICAgICAgICB9CisgICAgICAgIGNvbnNvbGUgOiB7Cisg
ICAgICAgICAgICBjcmVhdGVTaWRlYmFyUGFuZSA6IDxmdW5jdGlvbj4KKyAgICAgICAgfQorICAg
ICAgICBjcmVhdGUgOiA8ZnVuY3Rpb24+CisgICAgfQorICAgIHJlc291cmNlcyA6IHsKKyAgICAg
ICAgb25DcmVhdGVkIDogeworICAgICAgICAgICAgYWRkTGlzdGVuZXIgOiA8ZnVuY3Rpb24+Cisg
ICAgICAgICAgICByZW1vdmVMaXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAgICAgICAgfQorICAgICAg
ICBnZXRBbGwgOiA8ZnVuY3Rpb24+CisgICAgICAgIGdldCA6IDxmdW5jdGlvbj4KKyAgICB9Cisg
ICAgb25SZXNldCA6IHsKKyAgICAgICAgYWRkTGlzdGVuZXIgOiA8ZnVuY3Rpb24+CisgICAgICAg
IHJlbW92ZUxpc3RlbmVyIDogPGZ1bmN0aW9uPgorICAgIH0KKyAgICBsb2cgOiA8ZnVuY3Rpb24+
Cit9Cis+Pj4gdGVzdF9nZXRBbGxSZXNvdXJjZXMKK3Jlc291cmNlOiAuLi4vdGVzdHMvaW5zcGVj
dG9yL2luc3BlY3Rvci10ZXN0LmpzCityZXNvdXJjZTogLi4uL0xheW91dFRlc3RzL2luc3BlY3Rv
ci9leHRlbnNpb25zLmh0bWwKKz4+PiB0ZXN0X2dldEludmFsaWRSZXNvdXJjZQorQXR0ZW1wdGVk
IHRvIHJldHJpZXZlIGludmFsaWQgcmVzb3VyY2U6IHsiY29kZSI6IkVfTk9URk9VTkQiLCJkZXNj
cmlwdGlvbiI6Ik9iamVjdCBub3QgZm91bmQgKCVzKSIsImRldGFpbHMiOlsyMTI4NTA2XSwiaXNF
cnJvciI6dHJ1ZX0KKz4+PiB0ZXN0X3Jlc291cmNlTm90aWZpY2F0aW9uCitSZXNvdXJjZSBjcmVh
dGVkOiAuLi4vaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5odG1sCitBbGwgdGVz
dHMgZG9uZS4KKwpJbmRleDogTGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMuaHRtbAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1sCShyZXZp
c2lvbiAwKQorKysgTGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMuaHRtbAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwzMiBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi9o
dHRwL3Rlc3RzL2luc3BlY3Rvci9pbnNwZWN0b3ItdGVzdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0
IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAg
IG91dHB1dChtZXNzYWdlKTsKK30KKword2luZG93Lmluc3BlY3RlZFZhbHVlID0geyBzdHI6ICJm
b28iLCBudW06IDQyIH07CisKK2Z1bmN0aW9uIGZyb250ZW5kX2luaXRpYWxpemVFeHRlbnNpb24o
dXJsKQoreworICAgIGlmIChXZWJJbnNwZWN0b3IucGFuZWxzLnJlc291cmNlcy5yZXNvdXJjZVRy
YWNraW5nRW5hYmxlZCkKKyAgICAgICAgV2ViSW5zcGVjdG9yLmFkZEV4dGVuc2lvbnMoW3sgc3Rh
cnRQYWdlOiB1cmwgfV0pOworICAgIGVsc2UKKyAgICAgICAgSW5zcGVjdG9yQmFja2VuZC5lbmFi
bGVSZXNvdXJjZVRyYWNraW5nKGZhbHNlKTsKK30KKworZnVuY3Rpb24gZG9pdCgpCit7CisgICAg
dmFyIGV4dGVuc2lvblVSTCA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvXC9bXi9dKiQvLCAiL3Jl
c291cmNlcy9leHRlbnNpb24tbWFpbi5odG1sIik7CisgICAgZXZhbHVhdGVJbldlYkluc3BlY3Rv
cigiZnJvbnRlbmRfaW5pdGlhbGl6ZUV4dGVuc2lvbignIiArIGV4dGVuc2lvblVSTCArICInKSIp
OworfQorCis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5IG9ubG9hZD0ib25sb2FkKCkiPgorPHA+
VGVzdHMgV2ViSW5zcGVjdG9yIGV4dGVuc2lvbiBBUEk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+Cklu
ZGV4OiBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1tYWluLmh0bWwK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24t
bWFpbi5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNl
cy9leHRlbnNpb24tbWFpbi5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE1IEBACis8aHRt
bD4KKzxoZWFkPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorZnVuY3Rpb24gbG9n
KG1lc3NhZ2UpCit7CisgICAgd2ViSW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgi
bG9nKHVuZXNjYXBlKCciICsgZXNjYXBlKG1lc3NhZ2UpICsgIicpKTsiKTsKK30KKworbG9nKCJT
dGFydGVkIGV4dGVuc2lvbi4iKTsKKzwvc2NyaXB0PgorCis8c2NyaXB0IHNyYz0iLi4vLi4vaHR0
cC90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9yLXRlc3QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBz
cmM9ImV4dGVuc2lvbi1tYWluLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzwvaHRtbD4KSW5kZXg6
IExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLW1haW4uanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5q
cwkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5z
aW9uLW1haW4uanMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTQzIEBACitmdW5jdGlvbiB0ZXN0
X2V2YWxPayhuZXh0VGVzdCkKK3sKKyAgICB3ZWJJbnNwZWN0b3IuaW5zcGVjdGVkV2luZG93LmV2
YWx1YXRlKCJpbnNwZWN0ZWRWYWx1ZSIsIGNhbGxiYWNrQW5kTmV4dFRlc3Qob25FdmFsdWF0ZSwg
bmV4dFRlc3QpKTsKK30KKworZnVuY3Rpb24gdGVzdF9ldmFsRmFpbGVkKG5leHRUZXN0KQorewor
ICAgIHdlYkluc3BlY3Rvci5pbnNwZWN0ZWRXaW5kb3cuZXZhbHVhdGUoImRvY3VtZW50LmJvZHki
LCBjYWxsYmFja0FuZE5leHRUZXN0KG9uRXZhbHVhdGUsIG5leHRUZXN0KSk7Cit9CisKK2Z1bmN0
aW9uIHRlc3RfZ2V0QWxsUmVzb3VyY2VzKG5leHRUZXN0KQoreworICAgIGZ1bmN0aW9uIGNvbXBh
cmVSZXNvdXJjZXMoYSwgYikKKyAgICB7CisgICAgICAgIHJldHVybiBhLmhhci5yZXF1ZXN0LnVy
bC5sb2NhbGVDb21wYXJlKGIuaGFyLnJlcXVlc3QudXJsKTsKKyAgICB9CisKKyAgICBmdW5jdGlv
biBvblJlc291cmNlKHJlc3VsdCkKKyAgICB7CisgICAgICAgIHZhciByZXNvdXJjZXMgPSByZXN1
bHQuc29ydChjb21wYXJlUmVzb3VyY2VzKTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IHJlc291cmNlcy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIGxvZygicmVzb3VyY2U6ICIgKyBy
ZXNvdXJjZXNbaV0uaGFyLnJlcXVlc3QudXJsLnJlcGxhY2UoLy4qKChcL1teL10qKXszfSQpLywi
Li4uJDEiKSk7CisgICAgfQorICAgIHdlYkluc3BlY3Rvci5yZXNvdXJjZXMuZ2V0QWxsKGNhbGxi
YWNrQW5kTmV4dFRlc3Qob25SZXNvdXJjZSwgbmV4dFRlc3QpKTsKK30KKworZnVuY3Rpb24gdGVz
dF9nZXRJbnZhbGlkUmVzb3VyY2UobmV4dFRlc3QpCit7CisgICAgZnVuY3Rpb24gb25SZXNvdXJj
ZShyZXN1bHQpCisgICAgeworICAgICAgICBsb2coIkF0dGVtcHRlZCB0byByZXRyaWV2ZSBpbnZh
bGlkIHJlc291cmNlOiAiICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7CisgICAgfQorICAgIHdl
Ykluc3BlY3Rvci5yZXNvdXJjZXMuZ2V0KDIxMjg1MDYsIGNhbGxiYWNrQW5kTmV4dFRlc3Qob25S
ZXNvdXJjZSwgbmV4dFRlc3QpKTsKK30KKworZnVuY3Rpb24gdGVzdF9jcmVhdGVQYW5lbChuZXh0
VGVzdCkKK3sKKyAgICBmdW5jdGlvbiBvblBhbmVsQ3JlYXRlZChwYW5lbCkKKyAgICB7CisgICAg
ICAgIGxvZygiUGFuZWwgY3JlYXRlZCIpOworICAgICAgICBkdW1wT2JqZWN0KHBhbmVsKTsKKyAg
ICB9CisgICAgd2ViSW5zcGVjdG9yLnBhbmVscy5jcmVhdGUoIlRlc3QgUGFuZWwiLCAiZXh0ZW5z
aW9uLXBhbmVsLmh0bWwiLCAiZXh0ZW5zaW9uLXBhbmVsLnBuZyIsIGNhbGxiYWNrQW5kTmV4dFRl
c3Qob25QYW5lbENyZWF0ZWQsIG5leHRUZXN0KSk7CisgICAgbG9nKCJkb25lIGNyZWF0ZVBhbmVs
Iik7Cit9CisKK2Z1bmN0aW9uIHRlc3RfY3JlYXRlU2lkZWJhcihuZXh0VGVzdCkKK3sKKyAgICBm
dW5jdGlvbiBvblNpZGViYXJDcmVhdGVkKHNpZGViYXIpCisgICAgeworICAgICAgICBsb2coIlNp
ZGViYXIgY3JlYXRlZCIpOworICAgICAgICBkdW1wT2JqZWN0KHNpZGViYXIpOworICAgIH0KKyAg
ICB3ZWJJbnNwZWN0b3IucGFuZWxzLnNjcmlwdHMuY3JlYXRlU2lkZWJhclBhbmUoIlRlc3QgU2lk
ZWJhciIsICJleHRlbnNpb24tc2lkZWJhci5odG1sIiwgY2FsbGJhY2tBbmROZXh0VGVzdChvblNp
ZGViYXJDcmVhdGVkLCBuZXh0VGVzdCkpOworfQorCitmdW5jdGlvbiB0ZXN0X2NyZWF0ZVNpZGVi
YXJOb3RTdXBwb3J0ZWQobmV4dFRlc3QpCit7CisgICAgZnVuY3Rpb24gb25TaWRlYmFyQ3JlYXRl
ZChyZXN1bHQpCisgICAgeworICAgICAgICBsb2coIlNpZGViYXIgY3JlYXRpb24gcmVzdWx0OiAi
ICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7CisgICAgfQorICAgIHdlYkluc3BlY3Rvci5wYW5l
bHMuY29uc29sZS5jcmVhdGVTaWRlYmFyUGFuZSgiVGVzdCBTaWRlYmFyIiwgImV4dGVuc2lvbi1z
aWRlYmFyLmh0bWwiLCBjYWxsYmFja0FuZE5leHRUZXN0KG9uU2lkZWJhckNyZWF0ZWQsIG5leHRU
ZXN0KSk7Cit9CisKK2Z1bmN0aW9uIHRlc3RfcmVzb3VyY2VOb3RpZmljYXRpb24obmV4dFRlc3Qp
Cit7CisgICAgZnVuY3Rpb24gb25SZXNvdXJjZUNyZWF0ZWQocmVzb3VyY2UpCisgICAgeworICAg
ICAgICBsb2coIlJlc291cmNlIGNyZWF0ZWQ6ICIgKyByZXNvdXJjZS5oYXIucmVxdWVzdC51cmwu
cmVwbGFjZSgvLiooKFwvW14vXSopezN9JCkvLCIuLi4kMSIpKTsKKyAgICB9CisKKyAgICB3ZWJJ
bnNwZWN0b3IucmVzb3VyY2VzLm9uQ3JlYXRlZC5hZGRMaXN0ZW5lcihjYWxsYmFja0FuZE5leHRU
ZXN0KG9uUmVzb3VyY2VDcmVhdGVkLCBuZXh0VGVzdCkpOworICAgIHdlYkluc3BlY3Rvci5pbnNw
ZWN0ZWRXaW5kb3cuZXZhbHVhdGUoInZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgeGhy
Lm9wZW4oJ0dFVCcsICciICsgbG9jYXRpb24uaHJlZiArICInLCBmYWxzZSk7IHhoci5zZW5kKG51
bGwpOycnIik7Cit9CisKK2Z1bmN0aW9uIHRlc3RfZXh0ZW5zaW9uQVBJKG5leHRUZXN0KQorewor
ICAgIGR1bXBPYmplY3Qod2ViSW5zcGVjdG9yKTsKKyAgICBuZXh0VGVzdCgpOworfQorCitmdW5j
dGlvbiBvbkV2YWx1YXRlKHJlc3VsdCkKK3sKKyAgICBsb2coIkV2YWx1YXRlOiAiICsgcmVzdWx0
LnZhbHVlICsgIihleGNlcHRpb246ICIgKyByZXN1bHQuaXNFeGNlcHRpb24gKyAiKSIpOworfQor
CitmdW5jdGlvbiBvblRlc3RzRG9uZSgpCit7CisgICAgbG9nKCJBbGwgdGVzdHMgZG9uZS4iKTsK
KyAgICB3ZWJJbnNwZWN0b3IuaW5zcGVjdGVkV2luZG93LmV2YWx1YXRlKCJub3RpZnlEb25lKCk7
Iik7Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3RzKCkKK3sKKyAgICBsb2coIlJ1bm5pbmcgdGVzdHMu
Li4iKTsKKyAgICB2YXIgdGVzdHMgPSBbXTsKKyAgICBmb3IgKHZhciBzeW1ib2wgaW4gdGhpcykg
eworICAgICAgICBpZiAoL150ZXN0Xy8uZXhlYyhzeW1ib2wpICYmIHR5cGVvZiB0aGlzW3N5bWJv
bF0gPT09ICJmdW5jdGlvbiIpCisgICAgICAgICAgICB0ZXN0cy5wdXNoKHN5bWJvbCk7CisgICAg
fQorICAgIHRlc3RzID0gdGVzdHMuc29ydCgpOworICAgIHZhciB0ZXN0Q2hhaW4gPSBvblRlc3Rz
RG9uZTsKKyAgICBmb3IgKHZhciB0ZXN0ID0gdGVzdHMucG9wKCk7IHRlc3Q7IHRlc3QgPSB0ZXN0
cy5wb3AoKSkKKyAgICAgICAgdGVzdENoYWluID0gYmluZChydW5UZXN0LCB0aGlzLCBiaW5kKHRo
aXNbdGVzdF0sIHRoaXMsIHRlc3RDaGFpbiksIHRlc3QpOworICAgIHRlc3RDaGFpbigpOworfQor
CitmdW5jdGlvbiBydW5UZXN0KHRlc3QsIG5hbWUpCit7CisgICAgbG9nKCI+Pj4gIiArIG5hbWUp
OworICAgIHRyeSB7CisgICAgICAgIHRlc3QoKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICAg
IGxvZyhuYW1lICsgIjogIiArIGUpOworICAgIH0KK30KKworZnVuY3Rpb24gY2FsbGJhY2tBbmRO
ZXh0VGVzdChjYWxsYmFjaywgbmV4dFRlc3QpCit7CisgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFw
cGVyKCkgCisgICAgeworICAgICAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwor
ICAgICAgICBuZXh0VGVzdC5jYWxsKHRoaXMpOworICAgIH0KKyAgICByZXR1cm4gY2FsbGJhY2tX
cmFwcGVyOworfQorCitmdW5jdGlvbiBiaW5kKGZ1bmMsIHRoaXNPYmplY3QpCit7CisgICAgdmFy
IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOworICAgIHJl
dHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc09iamVjdCwgYXJncy5jb25j
YXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSkpOyB9OworfQorCisv
LyBkdW1wT2JqZWN0KCkgbmVlZHMgb3V0cHV0KCksIHNvIGltcGxlbWVudCBpdCB2aWEgbG9nKCku
CisKK2Z1bmN0aW9uIG91dHB1dChtc2cpCit7CisgICAgbG9nKG1zZyk7Cit9CisKK3J1blRlc3Rz
KCk7CkluZGV4OiBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1wYW5l
bC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0
ZW5zaW9uLXBhbmVsLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9pbnNwZWN0b3Iv
cmVzb3VyY2VzL2V4dGVuc2lvbi1wYW5lbC5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIg
QEAKKzxodG1sPgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNl
cy9leHRlbnNpb24tc2lkZWJhci5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2luc3Bl
Y3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXNpZGViYXIuaHRtbAkocmV2aXNpb24gMCkKKysrIExh
eW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXNpZGViYXIuaHRtbAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSwyIEBACis8aHRtbD4KKzwvaHRtbD4KSW5kZXg6IExheW91dFRl
c3RzL3BsYXRmb3JtL2Nocm9taXVtL3Rlc3RfZXhwZWN0YXRpb25zLnR4dAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS90ZXN0X2V4cGVjdGF0aW9ucy50eHQJKHJl
dmlzaW9uIDY0MjA2KQorKysgTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0vdGVzdF9leHBl
Y3RhdGlvbnMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xOTcsNiArMTk3LDcgQEAgV09OVEZJWCBT
S0lQIDogZmFzdC9ldmVudHMvbWVzc2FnZS1wb3J0LQogV09OVEZJWCBTS0lQIDogZmFzdC9ldmVu
dHMvbWVzc2FnZS1wb3J0Lmh0bWwgPSBGQUlMCiBXT05URklYIFNLSVAgOiBmYXN0L2V2ZW50cy9t
ZXNzYWdlLXBvcnQtbXVsdGkuaHRtbCA9IEZBSUwKIFdPTlRGSVggU0tJUCA6IGh0dHAvdGVzdHMv
c2VjdXJpdHkvTWVzc2FnZVBvcnQvZXZlbnQtbGlzdGVuZXItY29udGV4dC5odG1sID0gRkFJTAor
V09OVEZJWCBTS0lQIDogaW5zcGVjdG9yL2V4dGVuc2lvbnMuaHRtbCA9IEZBSUwKIAogLy8gSW1w
bGVtZW50IGphdmEgdGVzdGluZyBoYXJuZXNzLgogQlVHMzY2ODEgREVGRVIgU0tJUCA6IGphdmEg
PSBURVhUCg==
</data>
<flag name="review"
          id="51094"
          type_id="1"
          status="-"
          setter="pfeldman"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63061</attachid>
            <date>2010-07-30 08:23:12 -0700</date>
            <delta_ts>2010-08-02 05:38:42 -0700</delta_ts>
            <desc>patch</desc>
            <filename>extensions.patch</filename>
            <type>text/plain</type>
            <size>60003</size>
            <attacher name="Andrey Kosyakov">caseq</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDM1NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTE0IEBACisyMDEwLTA3LTMwICBBbmRyZXkgS29zeWFrb3YgIDxjYXNlcUBjaHJv
bWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgV2ViIEluc3BlY3RvcjogYWRkaW5nIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBXZWJJbnNw
ZWN0b3IgZXh0ZW5zaW9ucyBBUEkuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00MDQyNQorCisgICAgICAgIFRlc3RzOiBpbnNwZWN0b3IvZXh0ZW5zaW9u
cy1hcGkuaHRtbAorICAgICAgICAgICAgICAgaW5zcGVjdG9yL2V4dGVuc2lvbnMuaHRtbAorCisg
ICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qOgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JDb250cm9sbGVyLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckNvbnRyb2xsZXI6Omluc3BlY3RlZFdpbmRvd1Njcmlw
dE9iamVjdENsZWFyZWQpOgorICAgICAgICAoV2ViQ29yZTo6SW5zcGVjdG9yQ29udHJvbGxlcjo6
ZGlkQ29tbWl0TG9hZCk6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9z
dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JGcm9udGVuZEhvc3Q6OnNldEV4dGVu
c2lvbkFQSSk6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9zdC5oOgor
ICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaWRsOgorICAgICAgICAq
IGluc3BlY3Rvci9mcm9udC1lbmQvRWxlbWVudHNQYW5lbC5qczoKKyAgICAgICAgKFdlYkluc3Bl
Y3Rvci5FbGVtZW50c1BhbmVsLnRoaXMudHJlZU91dGxpbmUuZm9jdXNlZE5vZGVDaGFuZ2VkKToK
KyAgICAgICAgKFdlYkluc3BlY3Rvci5FbGVtZW50c1BhbmVsKToKKyAgICAgICAgKiBpbnNwZWN0
b3IvZnJvbnQtZW5kL0V4dGVuc2lvbkFQSS5qczogQWRkZWQuICBBbiBBUEkgaW1wbGVtZW50YXRp
b24gdGhhdCBnZXRzIGluamVjdGVkIGludG8gdGhlIGV4dGVuc2lvbiBjb250ZXh0LgorICAgICAg
ICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEku
RXZlbnRTaW5rSW1wbC5wcm90b3R5cGUuYWRkTGlzdGVuZXIpOgorICAgICAgICAoaW5qZWN0ZWRF
eHRlbnNpb25BUEkuRXZlbnRTaW5rSW1wbC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIpOgorICAg
ICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuRXZlbnRTaW5rSW1wbC5wcm90b3R5cGUuX2ZpcmUp
OgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuRXZlbnRTaW5rKToKKyAgICAgICAgKGlu
amVjdGVkRXh0ZW5zaW9uQVBJLkluc3BlY3RvckV4dGVuc2lvbkFQSSk6CisgICAgICAgIChpbmpl
Y3RlZEV4dGVuc2lvbkFQSS5JbnNwZWN0b3JFeHRlbnNpb25BUEkucHJvdG90eXBlLmxvZyk6Cisg
ICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5SZXNvdXJjZXMucHJvdG90eXBlLmdldEFsbCk6
CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5SZXNvdXJjZXMucHJvdG90eXBlLmdldCBy
ZXR1cm4pOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuUmVzb3VyY2VzLnByb3RvdHlw
ZSk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5QYW5lbHMpOgorICAgICAgICAoaW5q
ZWN0ZWRFeHRlbnNpb25BUEkuUGFuZWxzLnByb3RvdHlwZS5jcmVhdGUuY2FsbGJhY2tXcmFwcGVy
KToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLlBhbmVscy5wcm90b3R5cGUuY3JlYXRl
KToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLlBhbmVsSW1wbCk6CisgICAgICAgIChp
bmplY3RlZEV4dGVuc2lvbkFQSS5QYW5lbEltcGwucHJvdG90eXBlLmNyZWF0ZVNpZGViYXJQYW5l
LmNhbGxiYWNrV3JhcHBlcik6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5QYW5lbElt
cGwucHJvdG90eXBlLmNyZWF0ZVNpZGViYXJQYW5lKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5z
aW9uQVBJLkV4dGVuc2lvblBhbmVsKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkV4
dGVuc2lvblNpZGViYXJQYW5lSW1wbCk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5F
eHRlbnNpb25TaWRlYmFyUGFuZUltcGwucHJvdG90eXBlLnNldEhlaWdodCk6CisgICAgICAgIChp
bmplY3RlZEV4dGVuc2lvbkFQSS5FeHRlbnNpb25TaWRlYmFyUGFuZUltcGwucHJvdG90eXBlLnNl
dEV4cGFuZGVkKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkluc3BlY3RlZFdpbmRv
dyk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5JbnNwZWN0ZWRXaW5kb3cucHJvdG90
eXBlLnJlbG9hZCk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5JbnNwZWN0ZWRXaW5k
b3cucHJvdG90eXBlLmV2YWx1YXRlKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkV4
dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5cGUuc2VuZFJlcXVlc3QpOgorICAgICAgICAoaW5q
ZWN0ZWRFeHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZS5yZWdpc3Rl
ckhhbmRsZXIpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVy
Q2xpZW50LnByb3RvdHlwZS5uZXh0T2JqZWN0SWQpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNp
b25BUEkuRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZS5fcmVnaXN0ZXJDYWxsYmFjayk6
CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5FeHRlbnNpb25TZXJ2ZXJDbGllbnQucHJv
dG90eXBlLl9vbkNhbGxiYWNrKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkV4dGVu
c2lvblNlcnZlckNsaWVudC5wcm90b3R5cGUuX29uTWVzc2FnZSk6CisgICAgICAgIChpbmplY3Rl
ZEV4dGVuc2lvbkFQSS5leHBhbmRVUkwpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEku
KToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblBhbmVsLmpzOiBBZGRl
ZC4gQSBjbGFzcyB0aGF0IHByb3ZpZGVzIFdlYkluc3BlY3RvcidzIFBhbmVsIGludGVyZmFjZSB0
byB0aGUgaW5zcGVjdG9yLCBob3N0cyBleHRlbnNpb24gcGFuZWwgd2l0aGluIGFuIElGcmFtZSBh
bmQgcHJveGllcyBQYW5lbCBjYWxsYmFja3MgdG8gdGhlIGV4dGVuc2lvbi4KKyAgICAgICAgKFdl
Ykluc3BlY3Rvci5FeHRlbnNpb25QYW5lbCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5z
aW9uUGFuZWwucHJvdG90eXBlLmdldCBkZWZhdWx0Rm9jdXNlZEVsZW1lbnQpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsLnByb3RvdHlwZS51cGRhdGVNYWluVmlld1dpZHRo
KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5wcm90b3R5cGUuc2VhcmNo
Q2FuY2VsZWQpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsLnByb3RvdHlw
ZS5wZXJmb3JtU2VhcmNoKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5w
cm90b3R5cGUuanVtcFRvTmV4dFNlYXJjaFJlc3VsdCk6CisgICAgICAgIChXZWJJbnNwZWN0b3Iu
RXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlLmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVzdWx0KToKKyAg
ICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5wcm90b3R5cGUuX2FkZFN0eWxlUnVs
ZSk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25SZWdpc3RyeVN0dWIu
anM6IEFkZGVkLiBBIHN0dWIgZm9yIEV4dGVuc2lvblJlZ2lzdHJ5IGNsYXNzIHRoYXQgaXMgbWVh
bnQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgZXh0ZW5zaW9ucy4gQWN0dWFsIGltcGxlbWVudGF0aW9u
cyBtYXkgYmUgYnJvd3Nlci1zcGVjZmljLiAKKyAgICAgICAgKC5XZWJJbnNwZWN0b3IuSW5zcGVj
dG9yRXh0ZW5zaW9uUmVnaXN0cnlTdHViKToKKyAgICAgICAgKC5XZWJJbnNwZWN0b3IuSW5zcGVj
dG9yRXh0ZW5zaW9uUmVnaXN0cnlTdHViLnByb3RvdHlwZS5nZXRFeHRlbnNpb25zQXN5bmMpOgor
ICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uU2VydmVyLmpzOiBBZGRlZC4g
Q29tbXVuaWNhdGVzIHdpdGggRXh0ZW5zaW9uQVBJIHZpYSBET00gbWVzc2FnaW5nIGFuZCBwcm94
aWVzIHJlcXVlc3RzIHRvIFdlYkluc3BlY3RvciBjbGFzc2VzLgorICAgICAgICAoV2ViSW5zcGVj
dG9yLkV4dGVuc2lvblNlcnZlcik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2Vy
dmVyLnByb3RvdHlwZS5ub3RpZnlQYW5lbFNob3duKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5F
eHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLm5vdGlmeU9iamVjdFNlbGVjdGVkKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLm5vdGlmeVJlc291cmNlRmlu
aXNoZWQpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUu
bm90aWZ5U2VhcmNoQWN0aW9uKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2
ZXIucHJvdG90eXBlLm5vdGlmeUluc3BlY3RlZFBhZ2VMb2FkZWQpOgorICAgICAgICAoV2ViSW5z
cGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUubm90aWZ5SW5zcGVjdGVkVVJMQ2hhbmdl
ZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5ub3Rp
ZnlJbnNwZWN0b3JSZXNldCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVy
LnByb3RvdHlwZS5fY29udmVydFJlc291cmNlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRl
bnNpb25TZXJ2ZXIucHJvdG90eXBlLl9wb3N0Tm90aWZpY2F0aW9uKToKKyAgICAgICAgKFdlYklu
c3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vblN1YnNjcmliZSk6CisgICAgICAg
IChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25VbnN1YnNjcmliZSk6
CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25DcmVh
dGVQYW5lbCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlw
ZS5fb25DcmVhdGVTaWRlYmFyKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2
ZXIucHJvdG90eXBlLl9jcmVhdGVDbGllbnRJZnJhbWUpOgorICAgICAgICAoV2ViSW5zcGVjdG9y
LkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uU2V0U2lkZWJhckhlaWdodCk6CisgICAgICAg
IChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25TZXRTaWRlYmFyRXhw
YW5zaW9uKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBl
Ll9vbkxvZyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlw
ZS5fb25FdmFsdWF0ZU9uSW5zcGVjdGVkUGFnZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0
ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25SZXZlYWxBbmRTZWxlY3QpOgorICAgICAgICAoV2Vi
SW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uUmV2ZWFsQW5kU2VsZWN0UmVz
b3VyY2UpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUu
X2Rpc3BhdGNoQ2FsbGJhY2spOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZl
ci5wcm90b3R5cGUuX29uR2V0UmVzb3VyY2VzKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRl
bnNpb25TZXJ2ZXIucHJvdG90eXBlLmluaXRFeHRlbnNpb25zKToKKyAgICAgICAgKFdlYkluc3Bl
Y3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9hZGRFeHRlbnNpb25zKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vbldpbmRvd01lc3NhZ2Up
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29ubWVz
c2FnZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5f
cmVnaXN0ZXJIYW5kbGVyKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TdGF0dXMp
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLmFkZEV4dGVuc2lvbnMpOgorICAgICAgICAqIGluc3Bl
Y3Rvci9mcm9udC1lbmQvSW5qZWN0ZWRTY3JpcHQuanM6CisgICAgICAgIChpbmplY3RlZFNjcmlw
dENvbnN0cnVjdG9yKToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVkU2Ny
aXB0QWNjZXNzLmpzOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvSW5zcGVjdG9yRnJv
bnRlbmRIb3N0U3R1Yi5qczoKKyAgICAgICAgKC5XZWJJbnNwZWN0b3IuSW5zcGVjdG9yRnJvbnRl
bmRIb3N0U3R1Yi5wcm90b3R5cGUuc2V0RXh0ZW5zaW9uQVBJKToKKyAgICAgICAgKiBpbnNwZWN0
b3IvZnJvbnQtZW5kL1dlYktpdC5xcmM6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9p
bnNwZWN0b3IuaHRtbDoKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5q
czoKKyAgICAgICAgKFdlYkluc3BlY3Rvci5sb2FkZWQpOgorICAgICAgICAoV2ViSW5zcGVjdG9y
LnVwZGF0ZVJlc291cmNlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5yZXNldCk6CisgICAgICAg
IChXZWJJbnNwZWN0b3IuaW5zcGVjdGVkVVJMQ2hhbmdlZCk6CisgICAgICAgIChXZWJJbnNwZWN0
b3IuZGlkQ29tbWl0TG9hZCk6CisKIDIwMTAtMDctMzAgIFJhZmFlbCBBbnRvZ25vbGxpICA8YW50
b2dub2xsaUBwcm9mdXNpb24ubW9iaT4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbnRvbmlvIEdv
bWVzLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9X
ZWJDb3JlLmd5cGkJKHJldmlzaW9uIDY0MzQwKQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdv
cmtpbmcgY29weSkKQEAgLTQwMjksNiArNDAyOSwxMCBAQAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9mcm9udC1lbmQvRWxlbWVudHNQYW5lbC5qcycsCiAgICAgICAgICAgICAnaW5zcGVjdG9yL2Zy
b250LWVuZC9FbGVtZW50c1RyZWVPdXRsaW5lLmpzJywKICAgICAgICAgICAgICdpbnNwZWN0b3Iv
ZnJvbnQtZW5kL0V2ZW50TGlzdGVuZXJzU2lkZWJhclBhbmUuanMnLAorICAgICAgICAgICAgJ2lu
c3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uQVBJLmpzJywKKyAgICAgICAgICAgICdpbnNwZWN0
b3IvZnJvbnQtZW5kL0V4dGVuc2lvblBhbmVsLmpzJywKKyAgICAgICAgICAgICdpbnNwZWN0b3Iv
ZnJvbnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5qcycsCisgICAgICAgICAgICAnaW5zcGVj
dG9yL2Zyb250LWVuZC9FeHRlbnNpb25TZXJ2ZXIuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9mcm9udC1lbmQvRm9udFZpZXcuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1l
bmQvSEFSRW50cnkuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQvSGVscFNj
cmVlbi5qcycsCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlz
aW9uIDY0MzQwKQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29y
a2luZyBjb3B5KQpAQCAtNTA4ODAsNiArNTA4ODAsMjIgQEAKIAkJCQkJPg0KIAkJCQk8L0ZpbGU+
DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRc
RXh0ZW5zaW9uQVBJLmpzIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQorCQkJ
CQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRcRXh0ZW5zaW9uUGFuZWwuanMi
DQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0i
Li5caW5zcGVjdG9yXGZyb250LWVuZFxFeHRlbnNpb25SZWdpc3RyeVN0dWIuanMiDQorCQkJCQk+
DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVj
dG9yXGZyb250LWVuZFxFeHRlbnNpb25TZXJ2ZXIuanMiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4N
CisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVuZFxG
b250Vmlldy5qcyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KSW5kZXg6IFdlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiA2NDM0MCkKKysrIFdlYkNvcmUv
aW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NTgs
NyArNDU4LDE4IEBAIHZvaWQgSW5zcGVjdG9yQ29udHJvbGxlcjo6aW5zcGVjdGVkV2luZG8KICAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENsaWVudCAmJiBmcmFtZSA9PSBtX2luc3BlY3RlZFBh
Z2UtPm1haW5GcmFtZSgpKQogICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2xpZW50LT53aW5k
b3dPYmplY3RDbGVhcmVkKCk7CiAKLSAgICBpZiAoIWVuYWJsZWQoKSB8fCAhbV9mcm9udGVuZCB8
fCBmcmFtZSAhPSBtX2luc3BlY3RlZFBhZ2UtPm1haW5GcmFtZSgpKQorICAgIGlmICghZW5hYmxl
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9zY3JpcHRzVG9FdmFsdWF0ZU9uTG9h
ZC5zaXplKCkpIHsKKyAgICAgICAgU2NyaXB0U3RhdGUqIHNjcmlwdFN0YXRlID0gbWFpbldvcmxk
U2NyaXB0U3RhdGUoZnJhbWUpOworICAgICAgICBmb3IgKFZlY3RvcjxTdHJpbmc+OjppdGVyYXRv
ciBpdCA9IG1fc2NyaXB0c1RvRXZhbHVhdGVPbkxvYWQuYmVnaW4oKTsKKyAgICAgICAgICAgICBp
dCAhPSBtX3NjcmlwdHNUb0V2YWx1YXRlT25Mb2FkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAg
ICBtX2luamVjdGVkU2NyaXB0SG9zdC0+aW5qZWN0U2NyaXB0KCppdCwgc2NyaXB0U3RhdGUpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtX2Zyb250ZW5kIHx8IGZyYW1lICE9IG1faW5z
cGVjdGVkUGFnZS0+bWFpbkZyYW1lKCkpCiAgICAgICAgIHJldHVybjsKICAgICBtX2luamVjdGVk
U2NyaXB0SG9zdC0+ZGlzY2FyZEluamVjdGVkU2NyaXB0cygpOwogfQpAQCAtODAyLDE0ICs4MTMs
NiBAQCB2b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6OmRpZENvbW1pdExvYWQoCiAgICAgZm9yIChG
cmFtZSogZnJhbWUgPSBsb2FkZXItPmZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVl
KCktPnRyYXZlcnNlTmV4dChsb2FkZXItPmZyYW1lKCkpKQogICAgICAgICBpZiAoUmVzb3VyY2Vz
TWFwKiByZXNvdXJjZU1hcCA9IG1fZnJhbWVSZXNvdXJjZXMuZ2V0KGZyYW1lKSkKICAgICAgICAg
ICAgIHBydW5lUmVzb3VyY2VzKHJlc291cmNlTWFwLCBsb2FkZXIpOwotCi0gICAgaWYgKG1fc2Ny
aXB0c1RvRXZhbHVhdGVPbkxvYWQuc2l6ZSgpKSB7Ci0gICAgICAgIFNjcmlwdFN0YXRlKiBzY3Jp
cHRTdGF0ZSA9IG1haW5Xb3JsZFNjcmlwdFN0YXRlKGxvYWRlci0+ZnJhbWUoKSk7Ci0gICAgICAg
IGZvciAoVmVjdG9yPFN0cmluZz46Oml0ZXJhdG9yIGl0ID0gbV9zY3JpcHRzVG9FdmFsdWF0ZU9u
TG9hZC5iZWdpbigpOwotICAgICAgICAgICAgIGl0ICE9IG1fc2NyaXB0c1RvRXZhbHVhdGVPbkxv
YWQuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIG1faW5qZWN0ZWRTY3JpcHRIb3N0LT5pbmpl
Y3RTY3JpcHQoKml0LCBzY3JpcHRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9CiB9CiAKIHZvaWQg
SW5zcGVjdG9yQ29udHJvbGxlcjo6ZnJhbWVEZXRhY2hlZEZyb21QYXJlbnQoRnJhbWUqIGZyYW1l
KQpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuY3BwCShy
ZXZpc2lvbiA2NDM0MCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9z
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE5Miw2ICsxOTIsMTQgQEAgdm9pZCBJbnNwZWN0b3JG
cm9udGVuZEhvc3Q6Om1vdmVXaW5kb3dCeQogICAgICAgICBtX2NsaWVudC0+bW92ZVdpbmRvd0J5
KHgsIHkpOwogfQogCit2b2lkIEluc3BlY3RvckZyb250ZW5kSG9zdDo6c2V0RXh0ZW5zaW9uQVBJ
KGNvbnN0IFN0cmluZyYgc2NyaXB0KQoreworICAgIEluc3BlY3RvckNvbnRyb2xsZXIqIGluc3Bl
Y3RvciA9IG1fZnJvbnRlbmRQYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCk7CisKKyAgICBpbnNw
ZWN0b3ItPnJlbW92ZUFsbFNjcmlwdHNUb0V2YWx1YXRlT25Mb2FkKCk7CisgICAgaW5zcGVjdG9y
LT5hZGRTY3JpcHRUb0V2YWx1YXRlT25Mb2FkKHNjcmlwdCk7Cit9CisKIFN0cmluZyBJbnNwZWN0
b3JGcm9udGVuZEhvc3Q6OmxvY2FsaXplZFN0cmluZ3NVUkwoKQogewogICAgIHJldHVybiBtX2Ns
aWVudC0+bG9jYWxpemVkU3RyaW5nc1VSTCgpOwpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yRnJvbnRlbmRIb3N0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yRnJvbnRlbmRIb3N0LmgJKHJldmlzaW9uIDY0MzQwKQorKysgV2ViQ29yZS9pbnNwZWN0
b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmgJKHdvcmtpbmcgY29weSkKQEAgLTY3LDYgKzY3LDcg
QEAgcHVibGljOgogCiAgICAgdm9pZCBzZXRBdHRhY2hlZFdpbmRvd0hlaWdodCh1bnNpZ25lZCBo
ZWlnaHQpOwogICAgIHZvaWQgbW92ZVdpbmRvd0J5KGZsb2F0IHgsIGZsb2F0IHkpIGNvbnN0Owor
ICAgIHZvaWQgc2V0RXh0ZW5zaW9uQVBJKGNvbnN0IFN0cmluZyYgc2NyaXB0KTsKIAogICAgIFN0
cmluZyBsb2NhbGl6ZWRTdHJpbmdzVVJMKCk7CiAgICAgU3RyaW5nIGhpZGRlblBhbmVscygpOwpJ
bmRleDogV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmlkbAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaWRsCShyZXZp
c2lvbiA2NDM0MCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9zdC5p
ZGwJKHdvcmtpbmcgY29weSkKQEAgLTQxLDYgKzQxLDcgQEAgbW9kdWxlIGNvcmUgewogICAgICAg
ICB2b2lkIHJlcXVlc3REZXRhY2hXaW5kb3coKTsKICAgICAgICAgdm9pZCBzZXRBdHRhY2hlZFdp
bmRvd0hlaWdodChpbiB1bnNpZ25lZCBsb25nIGhlaWdodCk7CiAgICAgICAgIHZvaWQgbW92ZVdp
bmRvd0J5KGluIGZsb2F0IHgsIGluIGZsb2F0IHkpOworICAgICAgICB2b2lkIHNldEV4dGVuc2lv
bkFQSShpbiBET01TdHJpbmcgc2NyaXB0KTsKIAogICAgICAgICBET01TdHJpbmcgbG9jYWxpemVk
U3RyaW5nc1VSTCgpOwogICAgICAgICBET01TdHJpbmcgaGlkZGVuUGFuZWxzKCk7CkluZGV4OiBX
ZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRWxlbWVudHNQYW5lbC5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRWxlbWVudHNQYW5lbC5qcwkocmV2aXNpb24g
NjQzNDApCisrKyBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRWxlbWVudHNQYW5lbC5qcwko
d29ya2luZyBjb3B5KQpAQCAtNTYsOCArNTYsMTAgQEAgV2ViSW5zcGVjdG9yLkVsZW1lbnRzUGFu
ZWwgPSBmdW5jdGlvbigpCiAgICAgICAgIHRoaXMucGFuZWwudXBkYXRlUHJvcGVydGllcygpOwog
ICAgICAgICB0aGlzLnBhbmVsLnVwZGF0ZUV2ZW50TGlzdGVuZXJzKCk7CiAKLSAgICAgICAgaWYg
KHRoaXMuX2ZvY3VzZWRET01Ob2RlKQorICAgICAgICBpZiAodGhpcy5fZm9jdXNlZERPTU5vZGUp
IHsKICAgICAgICAgICAgIEluc3BlY3RvckJhY2tlbmQuYWRkSW5zcGVjdGVkTm9kZSh0aGlzLl9m
b2N1c2VkRE9NTm9kZS5pZCk7CisgICAgICAgICAgICBXZWJJbnNwZWN0b3IuZXh0ZW5zaW9uU2Vy
dmVyLm5vdGlmeU9iamVjdFNlbGVjdGVkKHRoaXMubmFtZSwgIkRPTU5vZGUiKTsKKyAgICAgICAg
fQogICAgIH07CiAKICAgICB0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudHJl
ZU91dGxpbmUuZWxlbWVudCk7CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRXh0
ZW5zaW9uQVBJLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9F
eHRlbnNpb25BUEkuanMJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2luc3BlY3Rvci9mcm9udC1l
bmQvRXh0ZW5zaW9uQVBJLmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0
cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3ZhciBpbmpl
Y3RlZEV4dGVuc2lvbkFQSSA9IGZ1bmN0aW9uKEluamVjdGVkU2NyaXB0SG9zdCwgaW5zcGVjdGVk
V2luZG93LCBpbmplY3RlZFNjcmlwdElkKQoreworCisvLyBIZXJlIGFuZCBiZWxvdywgYWxsIGNv
bnN0cnVjdG9ycyBhcmUgcHJpdmF0ZSB0byBBUEkgaW1wbGVtZW50YXRpb24uCisvLyBGb3IgYSBw
dWJsaWMgdHlwZSBGb28sIGlmIGludGVybmFsIGZpZWxkcyBhcmUgcHJlc2VudCwgdGhlc2UgYXJl
IG9uCisvLyBhIHByaXZhdGUgRm9vSW1wbCB0eXBlLCBhbiBpbnN0YW5jZSBvZiBGb29JbXBsIGlz
IHVzZWQgaW4gYSBjbG9zdXJlCisvLyBieSBGb28gY29uc3V0cmN0b3IgdG8gcmUtYmluZCBwdWJs
aWNseSBleHBvcnRlZCBtZW1iZXJzIHRvIGFuIGluc3RhbmNlCisvLyBvZiBGb28uCisKK2Z1bmN0
aW9uIEV2ZW50U2lua0ltcGwodHlwZSkKK3sKKyAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB0
aGlzLl9saXN0ZW5lcnMgPSBbXTsKK30KKworRXZlbnRTaW5rSW1wbC5wcm90b3R5cGUgPSB7Cisg
ICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgaWYgKHRo
aXMuX2xpc3RlbmVycy5sZW5ndGggPT09IDApCisgICAgICAgICAgICBleHRlbnNpb25TZXJ2ZXIu
c2VuZFJlcXVlc3QoeyBjb21tYW5kOiAic3Vic2NyaWJlIiwgdHlwZTogdGhpcy5fdHlwZSB9KTsK
KyAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOworICAgICAgICBleHRlbnNp
b25TZXJ2ZXIucmVnaXN0ZXJIYW5kbGVyKCJub3RpZnktIiArIHRoaXMuX3R5cGUsIGJpbmQodGhp
cy5fZmlyZSwgdGhpcykpOworICAgIH0sCisKKyAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24o
Y2FsbGJhY2spCisgICAgeworICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJz
OworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7
CisgICAgICAgICAgICBpZiAobGlzdGVuZXJzW2ldID09PSBjYWxsYmFjaykgeworICAgICAgICAg
ICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVycy5sZW5n
dGggPT09IDApCisgICAgICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21t
YW5kOiAidW5zdWJzY3JpYmUiLCB0eXBlOiB0aGlzLl90eXBlIH0pOworICAgIH0sCisKKyAgICBf
ZmlyZTogZnVuY3Rpb24ocmVxdWVzdCkKKyAgICB7CisgICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0
aGlzLl9saXN0ZW5lcnMuc2xpY2UoKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0
ZW5lcnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkobnVsbCwg
cmVxdWVzdC5hcmd1bWVudHMpOworICAgIH0KK30KKworZnVuY3Rpb24gRXZlbnRTaW5rKHR5cGUp
Cit7CisgICAgdmFyIGltcGwgPSBuZXcgRXZlbnRTaW5rSW1wbCh0eXBlKTsKKyAgICB0aGlzLmFk
ZExpc3RlbmVyID0gYmluZChpbXBsLmFkZExpc3RlbmVyLCBpbXBsKTsKKyAgICB0aGlzLnJlbW92
ZUxpc3RlbmVyID0gYmluZChpbXBsLnJlbW92ZUxpc3RlbmVyLCBpbXBsKTsKK30KKworZnVuY3Rp
b24gSW5zcGVjdG9yRXh0ZW5zaW9uQVBJKCkKK3sKKyAgICB0aGlzLmluc3BlY3RlZFdpbmRvdyA9
IG5ldyBJbnNwZWN0ZWRXaW5kb3coKTsKKyAgICB0aGlzLnBhbmVscyA9IG5ldyBQYW5lbHMoKTsK
KyAgICB0aGlzLnJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMoKTsKKyAgICB0aGlzLm9uUmVzZXQg
PSBuZXcgRXZlbnRTaW5rKCJyZXNldCIpOworfQorCitJbnNwZWN0b3JFeHRlbnNpb25BUEkucHJv
dG90eXBlID0geworICAgIGxvZzogZnVuY3Rpb24obWVzc2FnZSkKKyAgICB7CisgICAgICAgIGV4
dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJsb2ciLCBtZXNzYWdlOiBtZXNz
YWdlIH0pOworICAgIH0KK30KKworZnVuY3Rpb24gUmVzb3VyY2VzKCkKK3sKKyAgICB0aGlzLm9u
RmluaXNoZWQgPSBuZXcgRXZlbnRTaW5rKCJyZXNvdXJjZS1maW5pc2hlZCIpOworfQorCitSZXNv
dXJjZXMucHJvdG90eXBlID0geworICAgIGdldEFsbDogZnVuY3Rpb24oY2FsbGJhY2spCisgICAg
eworICAgICAgICByZXR1cm4gZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDog
ImdldFJlc291cmNlcyIgfSwgY2FsbGJhY2spOworICAgIH0sCisKKyAgICBnZXQ6IGZ1bmN0aW9u
KGlkLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBleHRlbnNpb25TZXJ2ZXIuc2Vu
ZFJlcXVlc3QoeyBjb21tYW5kOiAiZ2V0UmVzb3VyY2VzIiwgaWQ6IGlkIH0sIGNhbGxiYWNrKTsK
KyAgICB9Cit9CisKK3ZhciB3ZWxsS25vd25QYW5lbE5hbWVzID0gWworICAgICJlbGVtZW50cyIs
CisgICAgInNjcmlwdHMiCitdOworCitmdW5jdGlvbiBQYW5lbHMoKQoreworICAgIHZhciBwYW5l
bHMgPSBbXTsKKyAgICBmdW5jdGlvbiBwYW5lbEdldHRlcihuYW1lKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHBhbmVsc1tuYW1lXTsKKyAgICB9CisgICAgCisgICAgZm9yICh2YXIgaSA9IDA7IGkg
PCB3ZWxsS25vd25QYW5lbE5hbWVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgIHZhciBuYW1lID0g
d2VsbEtub3duUGFuZWxOYW1lc1tpXTsKKyAgICAgICAgcGFuZWxzW25hbWVdID0gbmV3IFBhbmVs
KG5hbWUpOworICAgICAgICB0aGlzLl9fZGVmaW5lR2V0dGVyX18obmFtZSwgYmluZChwYW5lbEdl
dHRlciwgbnVsbCwgbmFtZSkpOworICAgIH0KK30KKworUGFuZWxzLnByb3RvdHlwZSA9IHsKKyAg
ICBjcmVhdGU6IGZ1bmN0aW9uKGxhYmVsLCBwYWdlVVJMLCBpY29uVVJMLCBjYWxsYmFjaykKKyAg
ICB7CisgICAgICAgIHZhciBpZCA9ICJleHRlbnNpb24tcGFuZWwtIiArIGV4dGVuc2lvblNlcnZl
ci5uZXh0T2JqZWN0SWQoKTsKKyAgICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc3Vs
dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0Vycm9yKQorICAgICAgICAg
ICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBwYW5lbCA9IG5ldyBFeHRlbnNpb25QYW5lbChpZCk7CisgICAgICAgICAgICAgICAgY2Fs
bGJhY2socGFuZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZhciByZXF1
ZXN0ID0geworICAgICAgICAgICAgY29tbWFuZDogImNyZWF0ZVBhbmVsIiwKKyAgICAgICAgICAg
IGlkOiBpZCwKKyAgICAgICAgICAgIGxhYmVsOiBsYWJlbCwKKyAgICAgICAgICAgIHVybDogZXhw
YW5kVVJMKHBhZ2VVUkwpLAorICAgICAgICAgICAgaWNvbjogZXhwYW5kVVJMKGljb25VUkwpIAor
ICAgICAgICB9OworICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QocmVxdWVzdCwg
Y2FsbGJhY2sgJiYgYmluZChjYWxsYmFja1dyYXBwZXIsIHRoaXMpKTsKKyAgICB9Cit9CisKK2Z1
bmN0aW9uIFBhbmVsSW1wbChpZCkKK3sKKyAgICB0aGlzLl9pZCA9IGlkOworICAgIHRoaXMub25T
ZWxlY3Rpb25DaGFuZ2VkID0gbmV3IEV2ZW50U2luaygicGFuZWwtb2JqZWN0U2VsZWN0ZWQtIiAr
IGlkKTsKK30KKworUGFuZWxJbXBsLnByb3RvdHlwZSA9IHsKKyAgICBjcmVhdGVTaWRlYmFyUGFu
ZTogZnVuY3Rpb24odGl0bGUsIHVybCwgY2FsbGJhY2spCisgICAgeworICAgICAgICB2YXIgaWQg
PSAiZXh0ZW5zaW9uLXNpZGViYXItIiArIGV4dGVuc2lvblNlcnZlci5uZXh0T2JqZWN0SWQoKTsK
KyAgICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc3VsdCkKKyAgICAgICAgeworICAg
ICAgICAgICAgaWYgKHJlc3VsdC5pc0Vycm9yKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJl
c3VsdCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEV4
dGVuc2lvblNpZGViYXJQYW5lKGlkKSk7CisgICAgICAgIH0KKyAgICAgICAgZXh0ZW5zaW9uU2Vy
dmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogImNyZWF0ZVNpZGViYXJQYW5lIiwgcGFuZWw6IHRo
aXMuX2lkLCBpZDogaWQsIHRpdGxlOiB0aXRsZSwgdXJsOiBleHBhbmRVUkwodXJsKSB9LCBjYWxs
YmFjayAmJiBjYWxsYmFja1dyYXBwZXIpOworICAgIH0KK30KKworZnVuY3Rpb24gUGFuZWwoaWQp
Cit7CisgICAgdmFyIGltcGwgPSBuZXcgUGFuZWxJbXBsKGlkKTsKKyAgICB0aGlzLmNyZWF0ZVNp
ZGViYXJQYW5lID0gYmluZChpbXBsLmNyZWF0ZVNpZGViYXJQYW5lLCBpbXBsKTsKK30KKworZnVu
Y3Rpb24gRXh0ZW5zaW9uUGFuZWwoaWQpCit7CisgICAgUGFuZWwuY2FsbCh0aGlzLCBpZCk7Cisg
ICAgdGhpcy5vblNlYXJjaCA9IG5ldyBFdmVudFNpbmsoInBhbmVsLXNlYXJjaC0iICsgaWQpOwor
fQorCitFeHRlbnNpb25QYW5lbC5wcm90b3R5cGUgPSB7Cit9CisKK0V4dGVuc2lvblBhbmVsLnBy
b3RvdHlwZS5fX3Byb3RvX18gPSBQYW5lbC5wcm90b3R5cGU7CisKK2Z1bmN0aW9uIEV4dGVuc2lv
blNpZGViYXJQYW5lSW1wbChpZCkKK3sKKyAgICB0aGlzLl9pZCA9IGlkOworfQorCitFeHRlbnNp
b25TaWRlYmFyUGFuZUltcGwucHJvdG90eXBlID0geworICAgIHNldEhlaWdodDogZnVuY3Rpb24o
aGVpZ2h0KQorICAgIHsKKyAgICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29t
bWFuZDogInNldFNpZGViYXJIZWlnaHQiLCBpZDogdGhpcy5faWQsIGhlaWdodDogaGVpZ2h0IH0p
OworICAgIH0sCisKKyAgICBzZXRFeHBhbmRlZDogZnVuY3Rpb24oZXhwYW5kZWQpCisgICAgewor
ICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21tYW5kOiAic2V0U2lkZWJh
ckV4cGFuZGVkIiwgaWQ6IHRoaXMuX2lkLCBleHBhbmRlZDogZXhwYW5kZWQgfSk7CisgICAgfQor
fQorCitmdW5jdGlvbiBFeHRlbnNpb25TaWRlYmFyUGFuZShpZCkKK3sKKyAgICB2YXIgaW1wbCA9
IG5ldyBFeHRlbnNpb25TaWRlYmFyUGFuZUltcGwoaWQpOworICAgIHRoaXMuc2V0SGVpZ2h0ID0g
YmluZChpbXBsLnNldEhlaWdodCwgaW1wbCk7CisgICAgdGhpcy5zZXRFeHBhbmRlZCA9IGJpbmQo
aW1wbC5zZXRFeHBhbmRlZCwgaW1wbCk7Cit9CisKK2Z1bmN0aW9uIEluc3BlY3RlZFdpbmRvdygp
Cit7CisgICAgdGhpcy5vbkxvYWRlZCA9IG5ldyBFdmVudFNpbmsoImluc3BlY3RlZFBhZ2VMb2Fk
ZWQiKTsKKyAgICB0aGlzLm9uTmF2aWdhdGVkID0gbmV3IEV2ZW50U2luaygiaW5zcGVjdGVkVVJM
Q2hhbmdlZCIpOworICAgIHRoaXMub25ET01Db250ZW50TG9hZGVkID0gbmV3IEV2ZW50U2luaygi
RE9NQ29udGVudExvYWRlZCIpOworfQorCitJbnNwZWN0ZWRXaW5kb3cucHJvdG90eXBlID0gewor
ICAgIHJlbG9hZDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvblNl
cnZlci5zZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJyZWxvYWQiIH0pOworICAgIH0sCisKKyAgICBl
dmFsdWF0ZTogZnVuY3Rpb24oZXhwcmVzc2lvbiwgY2FsbGJhY2spCisgICAgeworICAgICAgICBy
ZXR1cm4gZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogImV2YWx1YXRlT25J
bnNwZWN0ZWRQYWdlIiwgZXhwcmVzc2lvbjogZXhwcmVzc2lvbiB9LCBjYWxsYmFjayk7CisgICAg
fQorfQorCitmdW5jdGlvbiBFeHRlbnNpb25TZXJ2ZXJDbGllbnQoKQoreworICAgIHRoaXMuX2Nh
bGxiYWNrcyA9IHt9OworICAgIHRoaXMuX2hhbmRsZXJzID0ge307CisgICAgdGhpcy5fbGFzdFJl
cXVlc3RJZCA9IDA7CisgICAgdGhpcy5fbGFzdE9iamVjdElkID0gMDsKKworICAgIHRoaXMucmVn
aXN0ZXJIYW5kbGVyKCJjYWxsYmFjayIsIGJpbmQodGhpcy5fb25DYWxsYmFjaywgdGhpcykpOwor
CisgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTsKKyAgICB0aGlzLl9wb3J0
ID0gY2hhbm5lbC5wb3J0MTsKKyAgICB0aGlzLl9wb3J0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3Nh
Z2UiLCBiaW5kKHRoaXMuX29uTWVzc2FnZSwgdGhpcyksIGZhbHNlKTsKKyAgICB0aGlzLl9wb3J0
LnN0YXJ0KCk7CisKKyAgICB0b3AucG9zdE1lc3NhZ2UoInJlZ2lzdGVyRXh0ZW5zaW9uIiwgWyBj
aGFubmVsLnBvcnQyIF0sICIqIik7Cit9CisKK0V4dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5
cGUgPSB7CisgICAgc2VuZFJlcXVlc3Q6IGZ1bmN0aW9uKG1lc3NhZ2UsIGNhbGxiYWNrKQorICAg
IHsKKyAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gImZ1bmN0aW9uIikKKyAgICAgICAg
ICAgIG1lc3NhZ2UucmVxdWVzdElkID0gdGhpcy5fcmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFjayk7
CisgICAgICAgIHJldHVybiB0aGlzLl9wb3J0LnBvc3RNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0s
CisKKyAgICByZWdpc3RlckhhbmRsZXI6IGZ1bmN0aW9uKGNvbW1hbmQsIGhhbmRsZXIpCisgICAg
eworICAgICAgICB0aGlzLl9oYW5kbGVyc1tjb21tYW5kXSA9IGhhbmRsZXI7CisgICAgfSwKKwor
ICAgIG5leHRPYmplY3RJZDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluamVj
dGVkU2NyaXB0SWQgKyAiXyIgKyArK3RoaXMuX2xhc3RPYmplY3RJZDsKKyAgICB9LAorCisgICAg
X3JlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgdmFy
IGlkID0gKyt0aGlzLl9sYXN0UmVxdWVzdElkOworICAgICAgICB0aGlzLl9jYWxsYmFja3NbaWRd
ID0gY2FsbGJhY2s7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9LAorCisgICAgX29uQ2FsbGJh
Y2s6IGZ1bmN0aW9uKHJlcXVlc3QpCisgICAgeworICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0
SWQgaW4gdGhpcy5fY2FsbGJhY2tzKSB7CisgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3NbcmVx
dWVzdC5yZXF1ZXN0SWRdKHJlcXVlc3QucmVzdWx0KTsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlz
Ll9jYWxsYmFja3NbcmVxdWVzdC5yZXF1ZXN0SWRdOworICAgICAgICB9CisgICAgfSwKKworICAg
IF9vbk1lc3NhZ2U6IGZ1bmN0aW9uKGV2ZW50KQorICAgIHsKKyAgICAgICAgdmFyIHJlcXVlc3Qg
PSBldmVudC5kYXRhOworICAgICAgICB2YXIgaGFuZGxlciA9IHRoaXMuX2hhbmRsZXJzW3JlcXVl
c3QuY29tbWFuZF07CisgICAgICAgIGlmIChoYW5kbGVyKQorICAgICAgICAgICAgaGFuZGxlci5j
YWxsKHRoaXMsIHJlcXVlc3QpOworICAgIH0KK30KKworZnVuY3Rpb24gZXhwYW5kVVJMKHVybCkK
K3sKKyAgICBpZiAoIXVybCkKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICBpZiAoL15bXi9dKzov
LmV4ZWModXJsKSkgLy8gU2VlIGlmIHVybCBoYXMgc2NoZW1hLgorICAgICAgICByZXR1cm4gdXJs
OworICAgIHZhciBiYXNlVVJMID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24u
aG9zdG5hbWUgKyBsb2NhdGlvbi5wb3J0OworICAgIGlmICgvXlwvLy5leGVjKHVybCkpCisgICAg
ICAgIHJldHVybiBiYXNlVVJMICsgdXJsOworICAgIHJldHVybiBiYXNlVVJMICsgbG9jYXRpb24u
cGF0aG5hbWUucmVwbGFjZSgvXC9bXi9dKiQvLCIvIikgKyB1cmw7Cit9CisKK2Z1bmN0aW9uIGJp
bmQoZnVuYywgdGhpc09iamVjdCkKK3sKKyAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5z
bGljZS5jYWxsKGFyZ3VtZW50cywgMik7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4g
ZnVuYy5hcHBseSh0aGlzT2JqZWN0LCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2Uu
Y2FsbChhcmd1bWVudHMsIDApKSk7IH07Cit9CisKK3ZhciBleHRlbnNpb25TZXJ2ZXIgPSBuZXcg
RXh0ZW5zaW9uU2VydmVyQ2xpZW50KCk7CisKK3dlYkluc3BlY3RvciA9IG5ldyBJbnNwZWN0b3JF
eHRlbnNpb25BUEkoKTsKKworfQpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4
dGVuc2lvblBhbmVsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC9FeHRlbnNpb25QYW5lbC5qcwkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zy
b250LWVuZC9FeHRlbnNpb25QYW5lbC5qcwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4MiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK1dl
Ykluc3BlY3Rvci5FeHRlbnNpb25QYW5lbCA9IGZ1bmN0aW9uKGlkLCBsYWJlbCwgaWNvblVSTCwg
b3B0aW9ucykKK3sKKyAgICB0aGlzLnRvb2xiYXJJdGVtTGFiZWwgPSBsYWJlbDsKKyAgICB0aGlz
Ll9hZGRTdHlsZVJ1bGUoIi50b29sYmFyLWl0ZW0uIiArIGlkICsgIiAudG9vbGJhci1pY29uIiwg
ImJhY2tncm91bmQtaW1hZ2U6IHVybCgiICsgaWNvblVSTCArICIpOyIpOworICAgIFdlYkluc3Bl
Y3Rvci5QYW5lbC5jYWxsKHRoaXMsIGlkKTsKK30KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBh
bmVsLnByb3RvdHlwZSA9IHsKKyAgICBnZXQgZGVmYXVsdEZvY3VzZWRFbGVtZW50KCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnNpZGViYXJUcmVlRWxlbWVudCB8fCB0aGlzLmVsZW1lbnQ7
CisgICAgfSwKKworICAgIHVwZGF0ZU1haW5WaWV3V2lkdGg6IGZ1bmN0aW9uKHdpZHRoKQorICAg
IHsKKyAgICAgICAgdGhpcy5ib2R5RWxlbWVudC5zdHlsZS5sZWZ0ID0gd2lkdGggKyAicHgiOwor
ICAgICAgICB0aGlzLnJlc2l6ZSgpOworICAgIH0sCisKKyAgICBzZWFyY2hDYW5jZWxlZDogZnVu
Y3Rpb24oc3RhcnRpbmdOZXdTZWFyY2gpCisgICAgeworICAgICAgICBXZWJJbnNwZWN0b3IuZXh0
ZW5zaW9uU2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCwgImNhbmNlbFNlYXJjaCIp
OworICAgICAgICBXZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlLnNlYXJjaENhbmNlbGVkLmFw
cGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKworICAgIHBlcmZvcm1TZWFyY2g6IGZ1bmN0
aW9uKHF1ZXJ5KQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmV4dGVuc2lvblNlcnZlci5u
b3RpZnlTZWFyY2hBY3Rpb24odGhpcy5faWQsICJwZXJmb3JtU2VhcmNoIiwgcXVlcnkpOworICAg
ICAgICBXZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlLnBlcmZvcm1TZWFyY2guYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKKyAgICB9LAorCisgICAganVtcFRvTmV4dFNlYXJjaFJlc3VsdDogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmV4dGVuc2lvblNlcnZlci5ub3Rp
ZnlTZWFyY2hBY3Rpb24odGhpcy5faWQsICJuZXh0U2VhcmNoUmVzdWx0Iik7CisgICAgICAgIFdl
Ykluc3BlY3Rvci5QYW5lbC5wcm90b3R5cGUuanVtcFRvTmV4dFNlYXJjaFJlc3VsdC5jYWxsKHRo
aXMpOworICAgIH0sCisKKyAgICBqdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdDogZnVuY3Rpb24o
KQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmV4dGVuc2lvblNlcnZlci5ub3RpZnlTZWFy
Y2hBY3Rpb24odGhpcy5faWQsICJwcmV2aW91c1NlYXJjaFJlc3VsdCIpOworICAgICAgICBXZWJJ
bnNwZWN0b3IuUGFuZWwucHJvdG90eXBlLmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVzdWx0LmNhbGwo
dGhpcyk7CisgICAgfSwKKworICAgIF9hZGRTdHlsZVJ1bGU6IGZ1bmN0aW9uKHNlbGVjdG9yLCBi
b2R5KQorICAgIHsKKyAgICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgi
c3R5bGUiKTsKKyAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBzZWxlY3RvciArICIgeyAiICsg
Ym9keSArICIgfSI7CisgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOwor
ICAgIH0KK30KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsLnByb3RvdHlwZS5fX3Byb3Rv
X18gPSBXZWJJbnNwZWN0b3IuUGFuZWwucHJvdG90eXBlOwpJbmRleDogV2ViQ29yZS9pbnNwZWN0
b3IvZnJvbnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0cnlTdHViLmpzCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1
Yi5qcwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAg
ICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRz
CisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2lmICghd2luZG93Lkluc3BlY3RvckV4
dGVuc2lvblJlZ2lzdHJ5KSB7CisKK1dlYkluc3BlY3Rvci5JbnNwZWN0b3JFeHRlbnNpb25SZWdp
c3RyeVN0dWIgPSBmdW5jdGlvbigpCit7Cit9CisKK1dlYkluc3BlY3Rvci5JbnNwZWN0b3JFeHRl
bnNpb25SZWdpc3RyeVN0dWIucHJvdG90eXBlID0geworICAgIGdldEV4dGVuc2lvbnNBc3luYzog
ZnVuY3Rpb24oKQorICAgIHsKKyAgICB9Cit9OworCitJbnNwZWN0b3JFeHRlbnNpb25SZWdpc3Ry
eSA9IG5ldyBXZWJJbnNwZWN0b3IuSW5zcGVjdG9yRXh0ZW5zaW9uUmVnaXN0cnlTdHViKCk7CisK
K30KSW5kZXg6IFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25TZXJ2ZXIuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblNlcnZl
ci5qcwkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNp
b25TZXJ2ZXIuanMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlv
bi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworV2ViSW5zcGVjdG9yLkV4
dGVuc2lvblNlcnZlciA9IGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLl9jbGllbnRPYmplY3RzID0g
e307CisgICAgdGhpcy5faGFuZGxlcnMgPSB7fTsKKyAgICB0aGlzLl9zdWJzY3JpYmVycyA9IHt9
OworICAgIHRoaXMuX3N0YXR1cyA9IG5ldyBXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU3RhdHVzKCk7
CisKKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoInN1YnNjcmliZSIsIHRoaXMuX29uU3Vic2Ny
aWJlLmJpbmQodGhpcykpOworICAgIHRoaXMuX3JlZ2lzdGVySGFuZGxlcigidW5zdWJzY3JpYmUi
LCB0aGlzLl9vblVuc3Vic2NyaWJlLmJpbmQodGhpcykpOworICAgIHRoaXMuX3JlZ2lzdGVySGFu
ZGxlcigiZ2V0UmVzb3VyY2VzIiwgdGhpcy5fb25HZXRSZXNvdXJjZXMuYmluZCh0aGlzKSk7Cisg
ICAgdGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJjcmVhdGVQYW5lbCIsIHRoaXMuX29uQ3JlYXRlUGFu
ZWwuYmluZCh0aGlzKSk7CisgICAgdGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJjcmVhdGVTaWRlYmFy
UGFuZSIsIHRoaXMuX29uQ3JlYXRlU2lkZWJhci5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9yZWdp
c3RlckhhbmRsZXIoImxvZyIsIHRoaXMuX29uTG9nLmJpbmQodGhpcykpOyAKKyAgICB0aGlzLl9y
ZWdpc3RlckhhbmRsZXIoImV2YWx1YXRlT25JbnNwZWN0ZWRQYWdlIiwgdGhpcy5fb25FdmFsdWF0
ZU9uSW5zcGVjdGVkUGFnZS5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIo
InNldFNpZGViYXJIZWlnaHQiLCB0aGlzLl9vblNldFNpZGViYXJIZWlnaHQuYmluZCh0aGlzKSk7
CisgICAgdGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJzZXRTaWRlYmFyRXhwYW5kZWQiLCB0aGlzLl9v
blNldFNpZGViYXJFeHBhbnNpb24uYmluZCh0aGlzKSk7CisKKyAgICB3aW5kb3cuYWRkRXZlbnRM
aXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uV2luZG93TWVzc2FnZS5iaW5kKHRoaXMpLCBmYWxz
ZSk7Cit9CisKK1dlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlID0geworICAg
IG5vdGlmeVBhbmVsU2hvd246IGZ1bmN0aW9uKHBhbmVsTmFtZSkKKyAgICB7CisgICAgICAgIHRo
aXMuX3Bvc3ROb3RpZmljYXRpb24oInBhbmVsLXNob3duLSIgKyBwYW5lbE5hbWUpOworICAgIH0s
CisKKyAgICBub3RpZnlPYmplY3RTZWxlY3RlZDogZnVuY3Rpb24ocGFuZWxJZCwgb2JqZWN0VHlw
ZSwgb2JqZWN0SWQpCisgICAgeworICAgICAgICB0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKCJwYW5l
bC1vYmplY3RTZWxlY3RlZC0iICsgcGFuZWxJZCwgb2JqZWN0VHlwZSwgb2JqZWN0SWQpOworICAg
IH0sCisKKyAgICBub3RpZnlSZXNvdXJjZUZpbmlzaGVkOiBmdW5jdGlvbihyZXNvdXJjZSkKKyAg
ICB7CisgICAgICAgIHRoaXMuX3Bvc3ROb3RpZmljYXRpb24oInJlc291cmNlLWZpbmlzaGVkIiwg
dGhpcy5fY29udmVydFJlc291cmNlKHJlc291cmNlKSk7CisgICAgfSwKKworICAgIG5vdGlmeVNl
YXJjaEFjdGlvbjogZnVuY3Rpb24ocGFuZWxJZCwgYWN0aW9uLCBzZWFyY2hTdHJpbmcpCisgICAg
eworICAgICAgICB0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKCJwYW5lbC1zZWFyY2gtIiArIHBhbmVs
SWQsIGFjdGlvbiwgc2VhcmNoU3RyaW5nKTsKKyAgICB9LAorCisgICAgbm90aWZ5SW5zcGVjdGVk
UGFnZUxvYWRlZDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fcG9zdE5vdGlmaWNh
dGlvbigiaW5zcGVjdGVkUGFnZUxvYWRlZCIpOworICAgIH0sCisKKyAgICBub3RpZnlJbnNwZWN0
ZWRVUkxDaGFuZ2VkOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9wb3N0Tm90aWZp
Y2F0aW9uKCJpbnNwZWN0ZWRVUkxDaGFuZ2VkIik7CisgICAgfSwKKworICAgIG5vdGlmeUluc3Bl
Y3RvclJlc2V0OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9wb3N0Tm90aWZpY2F0
aW9uKCJyZXNldCIpOworICAgIH0sCisKKyAgICBfY29udmVydFJlc291cmNlOiBmdW5jdGlvbihy
ZXNvdXJjZSkKKyAgICB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBpZDogcmVzb3Vy
Y2UuaWRlbnRpZmllciwKKyAgICAgICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsCisgICAgICAg
ICAgICBoYXI6IChuZXcgV2ViSW5zcGVjdG9yLkhBUkVudHJ5KHJlc291cmNlKSkuYnVpbGQoKSwK
KyAgICAgICAgfTsKKyAgICB9LAorCisgICAgX3Bvc3ROb3RpZmljYXRpb246IGZ1bmN0aW9uKHR5
cGUsIGRldGFpbHMpCisgICAgeworICAgICAgICB2YXIgc3Vic2NyaWJlcnMgPSB0aGlzLl9zdWJz
Y3JpYmVyc1t0eXBlXTsKKyAgICAgICAgaWYgKCFzdWJzY3JpYmVycykKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgdmFyIG1lc3NhZ2UgPSB7CisgICAgICAgICAgICBjb21tYW5kOiAibm90
aWZ5LSIgKyB0eXBlLAorICAgICAgICAgICAgYXJndW1lbnRzOiBBcnJheS5wcm90b3R5cGUuc2xp
Y2UuY2FsbChhcmd1bWVudHMsIDEpIAorICAgICAgICB9OworICAgICAgICBmb3IgKHZhciBpID0g
MDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgc3Vic2NyaWJlcnNb
aV0ucG9zdE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfSwKKworICAgIF9vblN1YnNjcmliZTogZnVu
Y3Rpb24obWVzc2FnZSwgcG9ydCkKKyAgICB7CisgICAgICAgIHZhciBzdWJzY3JpYmVycyA9IHRo
aXMuX3N1YnNjcmliZXJzW21lc3NhZ2UudHlwZV07CisgICAgICAgIGlmIChzdWJzY3JpYmVycykK
KyAgICAgICAgICAgIHN1YnNjcmliZXJzLnB1c2gocG9ydCk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIHRoaXMuX3N1YnNjcmliZXJzW21lc3NhZ2UudHlwZV0gPSBbIHBvcnQgXTsKKyAgICB9
LAorCisgICAgX29uVW5zdWJzY3JpYmU6IGZ1bmN0aW9uKG1lc3NhZ2UsIHBvcnQpCisgICAgewor
ICAgICAgICB2YXIgc3Vic2NyaWJlcnMgPSB0aGlzLl9zdWJzY3JpYmVyc1ttZXNzYWdlLnR5cGVd
OworICAgICAgICBpZiAoIXN1YnNjcmliZXJzKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICBzdWJzY3JpYmVycy5yZW1vdmUocG9ydCk7CisgICAgICAgIGlmICghc3Vic2NyaWJlcnMubGVu
Z3RoKQorICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3N1YnNjcmliZXJzW21lc3NhZ2UudHlwZV07
CisgICAgfSwKKworICAgIF9vbkNyZWF0ZVBhbmVsOiBmdW5jdGlvbihtZXNzYWdlLCBwb3J0KQor
ICAgIHsKKyAgICAgICAgdmFyIGlkID0gbWVzc2FnZS5pZDsKKyAgICAgICAgLy8gVGhlIGlkcyBh
cmUgZ2VuZXJhdGVkIG9uIHRoZSBjbGllbnQgQVBJIHNpZGUgYW5kIG11c3QgYmUgdW5pcXVlLCBz
byB0aGUgY2hlY2sgYmVsb3cKKyAgICAgICAgLy8gc2hvdWxkbid0IGJlIGhpdCB1bmxlc3Mgc29t
ZW9uZSBpcyBieXBhc3NpbmcgdGhlIEFQSS4KKyAgICAgICAgaWYgKGlkIGluIHRoaXMuX2NsaWVu
dE9iamVjdHMgfHwgaWQgaW4gV2ViSW5zcGVjdG9yLnBhbmVscykKKyAgICAgICAgICAgIHJldHVy
biB0aGlzLl9zdGF0dXMuRV9FWElTVFMoaWQpOworICAgICAgICB2YXIgcGFuZWwgPSBuZXcgV2Vi
SW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsKGlkLCBtZXNzYWdlLmxhYmVsLCBtZXNzYWdlLmljb24p
OworICAgICAgICB0aGlzLl9jbGllbnRPYmplY3RzW2lkXSA9IHBhbmVsOworCisgICAgICAgIHZh
ciB0b29sYmFyRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyIik7Cisg
ICAgICAgIHZhciBsYXN0VG9vbGJhckl0ZW0gPSBXZWJJbnNwZWN0b3IucGFuZWxPcmRlcltXZWJJ
bnNwZWN0b3IucGFuZWxPcmRlci5sZW5ndGggLSAxXS50b29sYmFySXRlbTsKKyAgICAgICAgV2Vi
SW5zcGVjdG9yLmFkZFBhbmVsVG9vbGJhckljb24odG9vbGJhckVsZW1lbnQsIHBhbmVsLCBsYXN0
VG9vbGJhckl0ZW0pOworICAgICAgICBXZWJJbnNwZWN0b3IucGFuZWxzW2lkXSA9IHBhbmVsOwor
ICAgICAgICB0aGlzLl9jcmVhdGVDbGllbnRJZnJhbWUocGFuZWwuZWxlbWVudCwgbWVzc2FnZS51
cmwpOworICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzLk9LKCk7CisgICAgfSwKKworICAgIF9v
bkNyZWF0ZVNpZGViYXI6IGZ1bmN0aW9uKG1lc3NhZ2UsIHBvcnQpCisgICAgeworICAgICAgICB2
YXIgcGFuZWwgPSBXZWJJbnNwZWN0b3IucGFuZWxzW21lc3NhZ2UucGFuZWxdOworICAgICAgICBp
ZiAoIXBhbmVsKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKG1l
c3NhZ2UucGFuZWwpOworICAgICAgICBpZiAoIXBhbmVsLnNpZGViYXJFbGVtZW50IHx8ICFwYW5l
bC5zaWRlYmFyUGFuZXMpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9UU1VQ
UE9SVEVEKCk7CisgICAgICAgIHZhciBpZCA9IG1lc3NhZ2UuaWQ7CisgICAgICAgIHZhciBzaWRl
YmFyID0gbmV3IFdlYkluc3BlY3Rvci5TaWRlYmFyUGFuZShtZXNzYWdlLnRpdGxlKTsKKyAgICAg
ICAgdGhpcy5fY2xpZW50T2JqZWN0c1tpZF0gPSBzaWRlYmFyOworICAgICAgICBwYW5lbC5zaWRl
YmFyUGFuZXNbaWRdID0gc2lkZWJhcjsKKyAgICAgICAgcGFuZWwuc2lkZWJhckVsZW1lbnQuYXBw
ZW5kQ2hpbGQoc2lkZWJhci5lbGVtZW50KTsKKyAgICAgICAgdGhpcy5fY3JlYXRlQ2xpZW50SWZy
YW1lKHNpZGViYXIuYm9keUVsZW1lbnQsIG1lc3NhZ2UudXJsKTsKKyAgICAgICAgcmV0dXJuIHRo
aXMuX3N0YXR1cy5PSygpOworICAgIH0sCisKKyAgICBfY3JlYXRlQ2xpZW50SWZyYW1lOiBmdW5j
dGlvbihwYXJlbnQsIHVybCwgcmVxdWVzdElkLCBwb3J0KQorICAgIHsKKyAgICAgICAgdmFyIGlm
cmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOworICAgICAgICBpZnJhbWUu
c3JjID0gdXJsOworICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSAiMTAwJSI7CisgICAgICAg
IHBhcmVudC5hcHBlbmRDaGlsZChpZnJhbWUpOworICAgIH0sCisKKyAgICBfb25TZXRTaWRlYmFy
SGVpZ2h0OiBmdW5jdGlvbihtZXNzYWdlKQorICAgIHsKKyAgICAgICAgdmFyIHNpZGViYXIgPSB0
aGlzLl9jbGllbnRPYmplY3RzW21lc3NhZ2UuaWRdOworICAgICAgICBpZiAoIXNpZGViYXIpCisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQobWVzc2FnZS5pZCk7Cisg
ICAgICAgIHNpZGViYXIuYm9keUVsZW1lbnQuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQgPSBtZXNz
YWdlLmhlaWdodDsKKyAgICB9LAorCisgICAgX29uU2V0U2lkZWJhckV4cGFuc2lvbjogZnVuY3Rp
b24obWVzc2FnZSkKKyAgICB7CisgICAgICAgIHZhciBzaWRlYmFyID0gdGhpcy5fY2xpZW50T2Jq
ZWN0c1ttZXNzYWdlLmlkXTsKKyAgICAgICAgaWYgKCFzaWRlYmFyKQorICAgICAgICAgICAgcmV0
dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKG1lc3NhZ2UuaWQpOworICAgICAgICBpZiAobWVz
c2FnZS5leHBhbmRlZCkKKyAgICAgICAgICAgIHNpZGViYXIuZXhwYW5kKCk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIHNpZGViYXIuY29sbGFwc2UoKTsKKyAgICB9LAorCisgICAgX29uTG9n
OiBmdW5jdGlvbihtZXNzYWdlKQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLmxvZyhtZXNz
YWdlLm1lc3NhZ2UpOworICAgIH0sCisKKyAgICBfb25FdmFsdWF0ZU9uSW5zcGVjdGVkUGFnZTog
ZnVuY3Rpb24obWVzc2FnZSwgcG9ydCkKKyAgICB7CisgICAgICAgIEluamVjdGVkU2NyaXB0QWNj
ZXNzLmdldERlZmF1bHQoKS5ldmFsdWF0ZUFuZFN0cmluZ2lmeShtZXNzYWdlLmV4cHJlc3Npb24s
IHRoaXMuX2Rpc3BhdGNoQ2FsbGJhY2suYmluZCh0aGlzLCBtZXNzYWdlLnJlcXVlc3RJZCwgcG9y
dCkpOworICAgIH0sCisKKyAgICBfb25SZXZlYWxBbmRTZWxlY3Q6IGZ1bmN0aW9uKG1lc3NhZ2Up
CisgICAgeworICAgICAgICBpZiAobWVzc2FnZS5wYW5lbElkID09PSAicmVzb3VyY2VzIiAmJiB0
eXBlID09PSAicmVzb3VyY2UiKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uUmV2ZWFsQW5k
U2VsZWN0UmVzb3VyY2UobWVzc2FnZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVy
biB0aGlzLl9zdGF0dXMuRV9OT1RTVVBQT1JURUQobWVzc2FnZS5wYW5lbElkLCBtZXNzYWdlLnR5
cGUpOworICAgIH0sCisKKyAgICBfb25SZXZlYWxBbmRTZWxlY3RSZXNvdXJjZTogZnVuY3Rpb24o
bWVzc2FnZSkKKyAgICB7CisgICAgICAgIHZhciBpZCA9IG1lc3NhZ2UuaWQ7CisgICAgICAgIHZh
ciByZXNvdXJjZSA9IG51bGw7CisKKyAgICAgICAgcmVzb3VyY2UgPSB0eXBlb2YgaWQgPT09ICJu
dW1iZXIiID8gV2ViSW5zcGVjdG9yLnJlc291cmNlc1tpZF0gOiBXZWJJbnNwZWN0b3IucmVzb3Vy
Y2VGb3JVUkwoaWQpOworICAgICAgICBpZiAoIXJlc291cmNlKQorICAgICAgICAgICAgcmV0dXJu
IHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKHR5cGVvZiBpZCArICI6ICIgKyBpZCk7CisgICAgICAg
IFdlYkluc3BlY3Rvci5wYW5lbHMucmVzb3VyY2VzLnNob3dSZXNvdXJjZShyZXNvdXJjZSwgbWVz
c2FnZS5saW5lKTsKKyAgICAgICAgV2ViSW5zcGVjdG9yLnNob3dSZXNvdXJjZXNQYW5lbCgpOwor
ICAgIH0sCisKKyAgICBfZGlzcGF0Y2hDYWxsYmFjazogZnVuY3Rpb24ocmVxdWVzdElkLCBwb3J0
LCByZXN1bHQpCisgICAgeworICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgY29tbWFuZDogImNh
bGxiYWNrIiwgcmVxdWVzdElkOiByZXF1ZXN0SWQsIHJlc3VsdDogcmVzdWx0IH0pOworICAgIH0s
CisKKyAgICBfb25HZXRSZXNvdXJjZXM6IGZ1bmN0aW9uKHJlcXVlc3QpCisgICAgeworICAgICAg
ICBmdW5jdGlvbiByZXNvdXJjZVdyYXBwZXIoaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBXZWJJbnNwZWN0b3IuZXh0ZW5zaW9uU2VydmVyLl9jb252ZXJ0UmVzb3VyY2UoV2ViSW5z
cGVjdG9yLnJlc291cmNlc1tpZF0pOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJlc3BvbnNl
OworICAgICAgICBpZiAocmVxdWVzdC5pZCkKKyAgICAgICAgICAgIHJlc3BvbnNlID0gV2ViSW5z
cGVjdG9yLnJlc291cmNlc1tyZXF1ZXN0LmlkXSA/IHJlc291cmNlV3JhcHBlcihyZXF1ZXN0Lmlk
KSA6IHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKHJlcXVlc3QuaWQpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICByZXNwb25zZSA9IE9iamVjdC5wcm9wZXJ0aWVzKFdlYkluc3BlY3Rvci5yZXNv
dXJjZXMpLm1hcChyZXNvdXJjZVdyYXBwZXIpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7Cisg
ICAgfSwKKworICAgIGluaXRFeHRlbnNpb25zOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBJ
bnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25zQXN5bmMoKTsKKyAgICB9LAor
CisgICAgX2FkZEV4dGVuc2lvbnM6IGZ1bmN0aW9uKGV4dGVuc2lvbnMpCisgICAgeworICAgICAg
ICBJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0RXh0ZW5zaW9uQVBJKCIoIiArIGluamVjdGVkRXh0
ZW5zaW9uQVBJLnRvU3RyaW5nKCkgKyAiKSIpOyAvLyBTZWUgRXh0ZW5zaW9uQVBJLmpzIGZvciBk
ZXRhaWxzLgorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyAr
K2kpIHsKKyAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOworICAgICAg
ICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5zdGFydFBhZ2UpCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB2YXIgaWZyYW1lID0g
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CisgICAgICAgICAgICAgICAgaWZyYW1l
LnNyYyA9IGV4dGVuc2lvbi5zdGFydFBhZ2U7CisgICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxl
LmRpc3BsYXkgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRD
aGlsZChpZnJhbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgICAg
IGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIGV4dGVuc2lvbiAiICsgZXh0ZW5z
aW9uLnN0YXJ0UGFnZSArICI6IiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fSwKKworICAgIF9vbldpbmRvd01lc3NhZ2U6IGZ1bmN0aW9uKGV2ZW50KQorICAgIHsKKyAgICAg
ICAgaWYgKGV2ZW50LmRhdGEgIT09ICJyZWdpc3RlckV4dGVuc2lvbiIpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIHZhciBwb3J0ID0gZXZlbnQucG9ydHNbMF07CisgICAgICAgIHBvcnQu
YWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29ubWVzc2FnZS5iaW5kKHRoaXMpLCBm
YWxzZSk7CisgICAgICAgIHBvcnQuc3RhcnQoKTsKKyAgICB9LAorCisgICAgX29ubWVzc2FnZTog
ZnVuY3Rpb24oZXZlbnQpCisgICAgeworICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LmRhdGE7
CisgICAgICAgIHZhciByZXN1bHQ7CisKKyAgICAgICAgaWYgKHJlcXVlc3QuY29tbWFuZCBpbiB0
aGlzLl9oYW5kbGVycykKKyAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2hhbmRsZXJzW3JlcXVl
c3QuY29tbWFuZF0ocmVxdWVzdCwgZXZlbnQudGFyZ2V0KTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgcmVzdWx0ID0gdGhpcy5fc3RhdHVzLkVfTk9UU1VQUE9SVEVEKHJlcXVlc3QuY29tbWFu
ZCk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAmJiByZXF1ZXN0LnJlcXVlc3RJZCkKKyAgICAgICAg
ICAgIHRoaXMuX2Rpc3BhdGNoQ2FsbGJhY2socmVxdWVzdC5yZXF1ZXN0SWQsIGV2ZW50LnRhcmdl
dCwgcmVzdWx0KTsKKyAgICB9LAorCisgICAgX3JlZ2lzdGVySGFuZGxlcjogZnVuY3Rpb24oY29t
bWFuZCwgY2FsbGJhY2spCisgICAgeworICAgICAgICB0aGlzLl9oYW5kbGVyc1tjb21tYW5kXSA9
IGNhbGxiYWNrOworICAgIH0KK30KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5fc3Rh
dHVzZXMgPSAKK3sKKyAgICBPSzogIiIsCisgICAgRV9OT1RGT1VORDogIk9iamVjdCBub3QgZm91
bmQgKCVzKSIsCisgICAgRV9OT1RTVVBQT1JURUQ6ICJPYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBy
ZXF1ZXN0ZWQgb3BlcmF0aW9uICglcykiLAorICAgIEVfRVhJU1RTOiAiT2JqZWN0IGFscmVhZHkg
ZXhpc3RzICglcykiCit9CisKK1dlYkluc3BlY3Rvci5FeHRlbnNpb25TdGF0dXMgPSBmdW5jdGlv
bigpCit7CisgICAgZnVuY3Rpb24gbWFrZVN0YXR1cyhjb2RlKQorICAgIHsKKyAgICAgICAgdmFy
IGRlc2NyaXB0aW9uID0gV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5fc3RhdHVzZXNbY29k
ZV0gfHwgY29kZTsKKyAgICAgICAgdmFyIGRldGFpbHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2Uu
Y2FsbChhcmd1bWVudHMsIDEpOworICAgICAgICB2YXIgc3RhdHVzID0geyBjb2RlOiBjb2RlLCBk
ZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sIGRldGFpbHM6IGRldGFpbHMgfTsKKyAgICAgICAgaWYg
KGNvZGUgIT09ICJPSyIpIHsKKyAgICAgICAgICAgIHN0YXR1cy5pc0Vycm9yID0gdHJ1ZTsKKyAg
ICAgICAgICAgIGNvbnNvbGUubG9nKCJFeHRlbnNpb24gc2VydmVyIGVycm9yOiAiICsgU3RyaW5n
LnZzcHJpbnRmKGRlc2NyaXB0aW9uLCBkZXRhaWxzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIHN0YXR1czsgCisgICAgfQorICAgIGZvciAoc3RhdHVzIGluIFdlYkluc3BlY3Rvci5FeHRl
bnNpb25TZXJ2ZXIuX3N0YXR1c2VzKQorICAgICAgICB0aGlzW3N0YXR1c10gPSBtYWtlU3RhdHVz
LmJpbmQobnVsbCwgc3RhdHVzKTsKK30KKworV2ViSW5zcGVjdG9yLmFkZEV4dGVuc2lvbnMgPSBm
dW5jdGlvbihleHRlbnNpb25zKQoreworICAgIFdlYkluc3BlY3Rvci5leHRlbnNpb25TZXJ2ZXIu
X2FkZEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Cit9CisKSW5kZXg6IFdlYkNvcmUvaW5zcGVjdG9y
L2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2luc3Bl
Y3Rvci9mcm9udC1lbmQvSW5qZWN0ZWRTY3JpcHQuanMJKHJldmlzaW9uIDY0MzQwKQorKysgV2Vi
Q29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVkU2NyaXB0LmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0yMzgsNiArMjM4LDE5IEBAIEluamVjdGVkU2NyaXB0LmdldENvbXBsZXRpb25zID0gZnVu
Y3Rpb24KICAgICByZXR1cm4gcHJvcHM7CiB9CiAKK0luamVjdGVkU2NyaXB0LmV2YWx1YXRlQW5k
U3RyaW5naWZ5ID0gZnVuY3Rpb24oZXhwcmVzc2lvbikKK3sKKyAgICB2YXIgcmVzdWx0ID0ge307
CisgICAgdHJ5IHsKKyAgICAgICAgdmFyIHZhbHVlID0gSW5qZWN0ZWRTY3JpcHQuX2V2YWx1YXRl
T24oaW5zcGVjdGVkV2luZG93LmV2YWwsIGluc3BlY3RlZFdpbmRvdywgZXhwcmVzc2lvbiwgZmFs
c2UpOworICAgICAgICByZXN1bHQudmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7CisgICAg
fSBjYXRjaCAoZSkgeworICAgICAgICByZXN1bHQudmFsdWUgPSBlLnRvU3RyaW5nKCk7CisgICAg
ICAgIHJlc3VsdC5pc0V4Y2VwdGlvbiA9IHRydWU7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7
Cit9CisKIEluamVjdGVkU2NyaXB0LmV2YWx1YXRlID0gZnVuY3Rpb24oZXhwcmVzc2lvbiwgb2Jq
ZWN0R3JvdXApCiB7CiAgICAgcmV0dXJuIEluamVjdGVkU2NyaXB0Ll9ldmFsdWF0ZUFuZFdyYXAo
aW5zcGVjdGVkV2luZG93LmV2YWwsIGluc3BlY3RlZFdpbmRvdywgZXhwcmVzc2lvbiwgb2JqZWN0
R3JvdXApOwpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVkU2NyaXB0
QWNjZXNzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9Jbmpl
Y3RlZFNjcmlwdEFjY2Vzcy5qcwkocmV2aXNpb24gNjQzNDApCisrKyBXZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuanMJKHdvcmtpbmcgY29weSkKQEAgLTc1
LDE0ICs3NSwxNSBAQCBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIgPSBmCiAv
LyAtIE1ha2Ugc3VyZSBsYXN0IHBhcmFtZXRlciBvZiBhbGwgdGhlIEluamVjdGVkU3JpcHRBY2Nl
c3MuKiBjYWxscyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLgogLy8gV2Uga2VlcCB0aGVzZSBzb3J0
ZWQuCiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRlIik7CitJ
bmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRlQW5kU3RyaW5naWZ5
Iik7CiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRlSW5DYWxs
RnJhbWUiKTsKK0luamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZXZhbHVhdGVP
blNlbGYiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZ2V0Q29tcGxl
dGlvbnMiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZ2V0UHJvcGVy
dGllcyIpOwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJnZXRQcm90b3R5
cGVzIik7CiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoIm9wZW5Jbkluc3Bl
Y3RlZFdpbmRvdyIpOwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJwdXNo
Tm9kZVRvRnJvbnRlbmQiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigi
c2V0UHJvcGVydHlWYWx1ZSIpOwotSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVy
KCJldmFsdWF0ZU9uU2VsZiIpOwogCiAvLyBTb21lIG1ldGhvZHMgY2FuJ3QgcnVuIHN5bmNocm9u
b3VzbHkgZXZlbiBvbiB0aGUgaW5qZWN0ZWQgc2NyaXB0IHNpZGUgKHN1Y2ggYXMgREIgdHJhbnNh
Y3Rpb25zKS4KIC8vIE1hcmsgdGhlbSBhcyBhc3luY2hyb25vdXMgaGVyZS4KSW5kZXg6IFdlYkNv
cmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbnNwZWN0b3JGcm9udGVuZEhv
c3RTdHViLmpzCShyZXZpc2lvbiA2NDM0MCkKKysrIFdlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC9JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzCSh3b3JraW5nIGNvcHkpCkBAIC04NCw2ICs4
NCwxMCBAQCBXZWJJbnNwZWN0b3IuSW5zcGVjdG9yRnJvbnRlbmRIb3N0U3R1Yi5wCiAgICAgewog
ICAgIH0sCiAKKyAgICBzZXRFeHRlbnNpb25BUEk6IGZ1bmN0aW9uKHNjcmlwdCkKKyAgICB7Cisg
ICAgfSwKKwogICAgIGxvYWRlZDogZnVuY3Rpb24oKQogICAgIHsKICAgICB9LApJbmRleDogV2Vi
Q29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMJKHJldmlzaW9uIDY0MzQwKQorKysgV2Vi
Q29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMJKHdvcmtpbmcgY29weSkKQEAgLTM0
LDYgKzM0LDEwIEBACiAgICAgPGZpbGU+RWxlbWVudHNQYW5lbC5qczwvZmlsZT4KICAgICA8Zmls
ZT5FbGVtZW50c1RyZWVPdXRsaW5lLmpzPC9maWxlPgogICAgIDxmaWxlPkV2ZW50TGlzdGVuZXJz
U2lkZWJhclBhbmUuanM8L2ZpbGU+CisgICAgPGZpbGU+RXh0ZW5zaW9uQVBJLmpzPC9maWxlPgor
ICAgIDxmaWxlPkV4dGVuc2lvblBhbmVsLmpzPC9maWxlPgorICAgIDxmaWxlPkV4dGVuc2lvblJl
Z2lzdHJ5U3R1Yi5qczwvZmlsZT4KKyAgICA8ZmlsZT5FeHRlbnNpb25TZXJ2ZXIuanM8L2ZpbGU+
CiAgICAgPGZpbGU+Rm9udFZpZXcuanM8L2ZpbGU+CiAgICAgPGZpbGU+SEFSRW50cnkuanM8L2Zp
bGU+CiAgICAgPGZpbGU+SGVscFNjcmVlbi5qczwvZmlsZT4KSW5kZXg6IFdlYkNvcmUvaW5zcGVj
dG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2luc3Bl
Y3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwJKHJldmlzaW9uIDY0MzQwKQorKysgV2ViQ29y
ZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0z
OSw2ICszOSw3IEBAIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE8KICAg
ICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJpbnNwZWN0b3IuanMiPjwvc2Ny
aXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ikluc3BlY3RvckJh
Y2tlbmRTdHViLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlw
dCIgc3JjPSJJbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzIj48L3NjcmlwdD4KKyAgICA8c2Ny
aXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJFeHRlbnNpb25SZWdpc3RyeVN0dWIuanMi
Pjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ik9iamVj
dC5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0i
U2V0dGluZ3MuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0
IiBzcmM9IkNTU1N0eWxlTW9kZWwuanMiPjwvc2NyaXB0PgpAQCAtOTYsNiArOTcsOSBAQCBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPCiAgICAgPHNjcmlwdCB0eXBlPSJ0
ZXh0L2phdmFzY3JpcHQiIHNyYz0iU3RvcmFnZVBhbmVsLmpzIj48L3NjcmlwdD4KICAgICA8c2Ny
aXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJQcm9maWxlc1BhbmVsLmpzIj48L3Njcmlw
dD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJDb25zb2xlUGFuZWwu
anMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkV4
dGVuc2lvbkFQSS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiIHNyYz0iRXh0ZW5zaW9uU2VydmVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9
InRleHQvamF2YXNjcmlwdCIgc3JjPSJFeHRlbnNpb25QYW5lbC5qcyI+PC9zY3JpcHQ+CiAgICAg
PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iQXVkaXRzUGFuZWwuanMiPjwvc2Ny
aXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkF1ZGl0UmVzdWx0
Vmlldy5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNy
Yz0iQXVkaXRMYXVuY2hlclZpZXcuanMiPjwvc2NyaXB0PgpJbmRleDogV2ViQ29yZS9pbnNwZWN0
b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzCShyZXZpc2lvbiA2NDM0MCkKKysrIFdlYkNvcmUvaW5z
cGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTUyNiw2ICs1
MjYsOSBAQCBXZWJJbnNwZWN0b3IubG9hZGVkID0gZnVuY3Rpb24oKQogICAgIGRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCJjbG9zZS1idXR0b24tbGVmdCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNr
IiwgdGhpcy5jbG9zZSwgdHJ1ZSk7CiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNsb3Nl
LWJ1dHRvbi1yaWdodCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5jbG9zZSwgdHJ1
ZSk7CiAKKyAgICB0aGlzLmV4dGVuc2lvblNlcnZlciA9IG5ldyBXZWJJbnNwZWN0b3IuRXh0ZW5z
aW9uU2VydmVyKCk7CisgICAgdGhpcy5leHRlbnNpb25TZXJ2ZXIuaW5pdEV4dGVuc2lvbnMoKTsK
KwogICAgIEluc3BlY3RvckZyb250ZW5kSG9zdC5sb2FkZWQoKTsKIH0KIApAQCAtMTIwMiw2ICsx
MjA1LDcgQEAgV2ViSW5zcGVjdG9yLnVwZGF0ZVJlc291cmNlID0gZnVuY3Rpb24oaQogICAgICAg
ICByZXNvdXJjZS5maW5pc2hlZCA9IHBheWxvYWQuZmluaXNoZWQ7CiAgICAgICAgIGlmICh0aGlz
LnBhbmVscy5hdWRpdHMpCiAgICAgICAgICAgICB0aGlzLnBhbmVscy5hdWRpdHMucmVzb3VyY2VG
aW5pc2hlZChyZXNvdXJjZSk7CisgICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmVyLm5vdGlmeVJl
c291cmNlRmluaXNoZWQocmVzb3VyY2UpOwogICAgIH0KIAogICAgIGlmIChwYXlsb2FkLmRpZFRp
bWluZ0NoYW5nZSkgewpAQCAtMTQyNiw2ICsxNDMwLDcgQEAgV2ViSW5zcGVjdG9yLnJlc2V0ID0g
ZnVuY3Rpb24oKQogICAgIGRlbGV0ZSB0aGlzLm1haW5SZXNvdXJjZTsKIAogICAgIHRoaXMuY29u
c29sZS5jbGVhck1lc3NhZ2VzKCk7CisgICAgdGhpcy5leHRlbnNpb25TZXJ2ZXIubm90aWZ5SW5z
cGVjdG9yUmVzZXQoKTsKIH0KIAogV2ViSW5zcGVjdG9yLnJlc2V0UHJvZmlsZXNQYW5lbCA9IGZ1
bmN0aW9uKCkKQEAgLTE0NDIsNiArMTQ0Nyw3IEBAIFdlYkluc3BlY3Rvci5icmluZ1RvRnJvbnQg
PSBmdW5jdGlvbigpCiBXZWJJbnNwZWN0b3IuaW5zcGVjdGVkVVJMQ2hhbmdlZCA9IGZ1bmN0aW9u
KHVybCkKIHsKICAgICBJbnNwZWN0b3JGcm9udGVuZEhvc3QuaW5zcGVjdGVkVVJMQ2hhbmdlZCh1
cmwpOworICAgIHRoaXMuZXh0ZW5zaW9uU2VydmVyLm5vdGlmeUluc3BlY3RlZFVSTENoYW5nZWQo
KTsKIH0KIAogV2ViSW5zcGVjdG9yLnJlc291cmNlVVJMQ2hhbmdlZCA9IGZ1bmN0aW9uKHJlc291
cmNlLCBvbGRVUkwpCkBAIC0xNDU0LDYgKzE0NjAsNyBAQCBXZWJJbnNwZWN0b3IuZGlkQ29tbWl0
TG9hZCA9IGZ1bmN0aW9uKCkKIHsKICAgICAvLyBDbGVhbnVwIGVsZW1lbnRzIHBhbmVsIGVhcmx5
IG9uIGluc3BlY3RlZCBwYWdlIHJlZnJlc2guCiAgICAgV2ViSW5zcGVjdG9yLnNldERvY3VtZW50
KG51bGwpOworICAgIHRoaXMuZXh0ZW5zaW9uU2VydmVyLm5vdGlmeUluc3BlY3RlZFBhZ2VMb2Fk
ZWQoKTsKIH0KIAogV2ViSW5zcGVjdG9yLnVwZGF0ZUNvbnNvbGVNZXNzYWdlRXhwaXJlZENvdW50
ID0gZnVuY3Rpb24oY291bnQpCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA2NDM1NykKKysrIExheW91dFRl
c3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM1IEBACisyMDEwLTA3LTMw
ICBBbmRyZXkgS29zeWFrb3YgIDxjYXNlcUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViIEluc3BlY3RvcjogYWRkZWQgdGVz
dHMgZm9yIGluc3BlY3RvciBleHRlbnNpb25zIEFQSS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQwNDI1CisKKyAgICAgICAgKiBodHRwL3Rlc3RzL2lu
c3BlY3Rvci9pbnNwZWN0b3ItdGVzdC5qczoKKyAgICAgICAgKGR1bXBPYmplY3QpOgorICAgICAg
ICAqIGluc3BlY3Rvci9leHRlbnNpb25zLWFwaS1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAg
ICAqIGluc3BlY3Rvci9leHRlbnNpb25zLWFwaS5odG1sOiBBZGRlZC4gRHVtcCBvZiBwdWJsaWNs
eSB2aXNpYmxlIGV4dGVuc2lvbnMgQVBJLgorICAgICAgICAqIGluc3BlY3Rvci9leHRlbnNpb25z
LWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogaW5zcGVjdG9yL2V4dGVuc2lvbnMtdGVz
dC5qczogQWRkZWQuIEdlbmVyaWMgc3VwcG9ydCBmb3IgZXh0ZW5zaW9uIHRlc3RzLgorICAgICAg
ICAobG9nKToKKyAgICAgICAgKGZyb250ZW5kX2luaXRpYWxpemVFeHRlbnNpb24pOgorICAgICAg
ICAoZG9pdCk6CisgICAgICAgIChleHRlbnNpb25GdW5jdGlvbnMpOgorICAgICAgICAqIGluc3Bl
Y3Rvci9leHRlbnNpb25zLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGluc3BlY3Rvci9yZXNvdXJj
ZXMvZXh0ZW5zaW9uLW1haW4uaHRtbDogQWRkZWQuCisgICAgICAgICogaW5zcGVjdG9yL3Jlc291
cmNlcy9leHRlbnNpb24tbWFpbi5qczogQWRkZWQuCisgICAgICAgIChmZXRjaFRlc3RzLmNhbGxi
YWNrKToKKyAgICAgICAgKGZldGNoVGVzdHMpOgorICAgICAgICAocnVuVGVzdHMpOgorICAgICAg
ICAob25UZXN0c0RvbmUpOgorICAgICAgICAocnVuVGVzdCk6CisgICAgICAgIChjYWxsYmFja0Fu
ZE5leHRUZXN0LmNhbGxiYWNrV3JhcHBlcik6CisgICAgICAgIChjYWxsYmFja0FuZE5leHRUZXN0
KToKKyAgICAgICAgKG91dHB1dCk6CisgICAgICAgICogaW5zcGVjdG9yL3Jlc291cmNlcy9leHRl
bnNpb24tcGFuZWwuaHRtbDogQWRkZWQuCisgICAgICAgICogaW5zcGVjdG9yL3Jlc291cmNlcy9l
eHRlbnNpb24tc2lkZWJhci5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9jaHJvbWl1
bS90ZXN0X2V4cGVjdGF0aW9ucy50eHQ6CisKIDIwMTAtMDctMzAgIFN0ZXZlIEJsb2NrICA8c3Rl
dmVibG9ja0Bnb29nbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFN0ZXZlIEJsb2NrLgpJ
bmRleDogTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9yLXRlc3QuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9y
LXRlc3QuanMJKHJldmlzaW9uIDY0MzQwKQorKysgTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9pbnNw
ZWN0b3IvaW5zcGVjdG9yLXRlc3QuanMJKHdvcmtpbmcgY29weSkKQEAgLTU0LDYgKzU0LDggQEAg
ZnVuY3Rpb24gZHVtcE9iamVjdChvYmplY3QsIG5vbmRldGVybWluaQogICAgICAgICAgICAgZHVt
cE9iamVjdChwcm9wVmFsdWUsIG5vbmRldGVybWluaXN0aWNQcm9wcywgcHJlZml4ICsgIiAgICAi
LCBwcmVmaXhXaXRoTmFtZSk7CiAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09
ICJzdHJpbmciKQogICAgICAgICAgICAgb3V0cHV0KHByZWZpeFdpdGhOYW1lICsgIlwiIiArIHBy
b3BWYWx1ZSArICJcIiIpOworICAgICAgICBlbHNlIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAi
ZnVuY3Rpb24iKQorICAgICAgICAgICAgb3V0cHV0KHByZWZpeFdpdGhOYW1lICsgIjxmdW5jdGlv
bj4iKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgb3V0cHV0KHByZWZpeFdpdGhOYW1lICsg
cHJvcFZhbHVlKTsKICAgICB9CkluZGV4OiBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9u
cy1hcGktZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2luc3BlY3Rvci9l
eHRlbnNpb25zLWFwaS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9p
bnNwZWN0b3IvZXh0ZW5zaW9ucy1hcGktZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDQ3IEBACitUZXN0cyBwdWJsaWMgaW50ZXJmYWNlIG9mIFdlYkluc3BlY3RvciBFeHRlbnNp
b25zIEFQSQorCitTdGFydGVkIGV4dGVuc2lvbi4KK1J1bm5pbmcgdGVzdHMuLi4KK1JVTk5JTkcg
VEVTVDogZXh0ZW5zaW9uX3Rlc3RBUEkKK3sKKyAgICBpbnNwZWN0ZWRXaW5kb3cgOiB7CisgICAg
ICAgIG9uTG9hZGVkIDogeworICAgICAgICAgICAgYWRkTGlzdGVuZXIgOiA8ZnVuY3Rpb24+Cisg
ICAgICAgICAgICByZW1vdmVMaXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAgICAgICAgfQorICAgICAg
ICBvbk5hdmlnYXRlZCA6IHsKKyAgICAgICAgICAgIGFkZExpc3RlbmVyIDogPGZ1bmN0aW9uPgor
ICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIgOiA8ZnVuY3Rpb24+CisgICAgICAgIH0KKyAgICAg
ICAgb25ET01Db250ZW50TG9hZGVkIDogeworICAgICAgICAgICAgYWRkTGlzdGVuZXIgOiA8ZnVu
Y3Rpb24+CisgICAgICAgICAgICByZW1vdmVMaXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAgICAgICAg
fQorICAgICAgICByZWxvYWQgOiA8ZnVuY3Rpb24+CisgICAgICAgIGV2YWx1YXRlIDogPGZ1bmN0
aW9uPgorICAgIH0KKyAgICBwYW5lbHMgOiB7CisgICAgICAgIGVsZW1lbnRzIDogeworICAgICAg
ICAgICAgY3JlYXRlU2lkZWJhclBhbmUgOiA8ZnVuY3Rpb24+CisgICAgICAgIH0KKyAgICAgICAg
c2NyaXB0cyA6IHsKKyAgICAgICAgICAgIGNyZWF0ZVNpZGViYXJQYW5lIDogPGZ1bmN0aW9uPgor
ICAgICAgICB9CisgICAgICAgIGNyZWF0ZSA6IDxmdW5jdGlvbj4KKyAgICB9CisgICAgcmVzb3Vy
Y2VzIDogeworICAgICAgICBvbkZpbmlzaGVkIDogeworICAgICAgICAgICAgYWRkTGlzdGVuZXIg
OiA8ZnVuY3Rpb24+CisgICAgICAgICAgICByZW1vdmVMaXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAg
ICAgICAgfQorICAgICAgICBnZXRBbGwgOiA8ZnVuY3Rpb24+CisgICAgICAgIGdldCA6IDxmdW5j
dGlvbj4KKyAgICB9CisgICAgb25SZXNldCA6IHsKKyAgICAgICAgYWRkTGlzdGVuZXIgOiA8ZnVu
Y3Rpb24+CisgICAgICAgIHJlbW92ZUxpc3RlbmVyIDogPGZ1bmN0aW9uPgorICAgIH0KKyAgICBs
b2cgOiA8ZnVuY3Rpb24+Cit9CitBbGwgdGVzdHMgZG9uZS4KKwpJbmRleDogTGF5b3V0VGVzdHMv
aW5zcGVjdG9yL2V4dGVuc2lvbnMtYXBpLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
aW5zcGVjdG9yL2V4dGVuc2lvbnMtYXBpLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy1hcGkuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwx
OCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi9odHRwL3Rlc3RzL2luc3BlY3Rv
ci9pbnNwZWN0b3ItdGVzdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iZXh0ZW5zaW9ucy10
ZXN0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKworZnVu
Y3Rpb24gZXh0ZW5zaW9uX3Rlc3RBUEkobmV4dFRlc3QpCit7CisgICAgZHVtcE9iamVjdCh3ZWJJ
bnNwZWN0b3IpOyAKKyAgICBuZXh0VGVzdCgpOworfQorCis8L3NjcmlwdD4KKzwvaGVhZD4KKzxi
b2R5IG9ubG9hZD0ib25sb2FkKCkiPgorPHA+VGVzdHMgcHVibGljIGludGVyZmFjZSBvZiBXZWJJ
bnNwZWN0b3IgRXh0ZW5zaW9ucyBBUEk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlv
dXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
TGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAw
KQorKysgTGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMtZXhwZWN0ZWQudHh0CShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDM0IEBACitGQUlMOiBUaW1lZCBvdXQgd2FpdGluZyBmb3Igbm90
aWZ5RG9uZSB0byBiZSBjYWxsZWQKK1Rlc3RzIFdlYkluc3BlY3RvciBleHRlbnNpb24gQVBJCisK
K1N0YXJ0ZWQgZXh0ZW5zaW9uLgorUnVubmluZyB0ZXN0cy4uLgorUlVOTklORyBURVNUOiBleHRl
bnNpb25fdGVzdENyZWF0ZVBhbmVsCitkb25lIGNyZWF0ZVBhbmVsCitQYW5lbCBjcmVhdGVkCit7
CisgICAgY3JlYXRlU2lkZWJhclBhbmUgOiA8ZnVuY3Rpb24+CisgICAgb25TZWFyY2ggOiB7Cisg
ICAgICAgIGFkZExpc3RlbmVyIDogPGZ1bmN0aW9uPgorICAgICAgICByZW1vdmVMaXN0ZW5lciA6
IDxmdW5jdGlvbj4KKyAgICB9Cit9CitSVU5OSU5HIFRFU1Q6IGV4dGVuc2lvbl90ZXN0Q3JlYXRl
U2lkZWJhcgorU2lkZWJhciBjcmVhdGVkCit7CisgICAgc2V0SGVpZ2h0IDogPGZ1bmN0aW9uPgor
ICAgIHNldEV4cGFuZGVkIDogPGZ1bmN0aW9uPgorfQorUlVOTklORyBURVNUOiBleHRlbnNpb25f
dGVzdEV2YWxGYWlsZWQKK0V2YWx1YXRlOiBUeXBlRXJyb3I6IEpTT04uc3RyaW5naWZ5IGNhbm5v
dCBzZXJpYWxpemUgY3ljbGljIHN0cnVjdHVyZXMuKGV4Y2VwdGlvbjogdHJ1ZSkKK1JVTk5JTkcg
VEVTVDogZXh0ZW5zaW9uX3Rlc3RFdmFsT2sKK0V2YWx1YXRlOiB7InN0ciI6ImZvbyIsIm51bSI6
NDJ9KGV4Y2VwdGlvbjogdW5kZWZpbmVkKQorUlVOTklORyBURVNUOiBleHRlbnNpb25fdGVzdEdl
dEFsbFJlc291cmNlcworcmVzb3VyY2U6IC4uLi90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9yLXRl
c3QuanMKK3Jlc291cmNlOiAuLi4vTGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMtdGVz
dC5qcworcmVzb3VyY2U6IC4uLi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1s
CitSVU5OSU5HIFRFU1Q6IGV4dGVuc2lvbl90ZXN0R2V0SW52YWxpZFJlc291cmNlCitBdHRlbXB0
ZWQgdG8gcmV0cmlldmUgaW52YWxpZCByZXNvdXJjZTogeyJjb2RlIjoiRV9OT1RGT1VORCIsImRl
c2NyaXB0aW9uIjoiT2JqZWN0IG5vdCBmb3VuZCAoJXMpIiwiZGV0YWlscyI6WzIxMjg1MDZdLCJp
c0Vycm9yIjp0cnVlfQorUlVOTklORyBURVNUOiBleHRlbnNpb25fdGVzdFJlc291cmNlTm90aWZp
Y2F0aW9uCitleHRlbnNpb25fdGVzdFJlc291cmNlTm90aWZpY2F0aW9uOiBSZWZlcmVuY2VFcnJv
cjogQ2FuJ3QgZmluZCB2YXJpYWJsZTogb25SZXNvdXJjZUNyZWF0ZWQKKwpJbmRleDogTGF5b3V0
VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMtdGVzdC5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRU
ZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy10ZXN0LmpzCShyZXZpc2lvbiAwKQorKysgTGF5b3V0
VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMtdGVzdC5qcwkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSwzMCBAQAorZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgb3V0cHV0KG1lc3NhZ2UpOwor
fQorCitmdW5jdGlvbiBmcm9udGVuZF9pbml0aWFsaXplRXh0ZW5zaW9uKHVybCkKK3sKKyAgICBp
ZiAoV2ViSW5zcGVjdG9yLnBhbmVscy5yZXNvdXJjZXMucmVzb3VyY2VUcmFja2luZ0VuYWJsZWQp
CisgICAgICAgIFdlYkluc3BlY3Rvci5hZGRFeHRlbnNpb25zKFt7IHN0YXJ0UGFnZTogdXJsIH1d
KTsKKyAgICBlbHNlCisgICAgICAgIEluc3BlY3RvckJhY2tlbmQuZW5hYmxlUmVzb3VyY2VUcmFj
a2luZyhmYWxzZSk7Cit9CisKK2Z1bmN0aW9uIGRvaXQoKQoreworICAgIHZhciBleHRlbnNpb25V
UkwgPSBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1wvW14vXSokLywgIi9yZXNvdXJjZXMvZXh0ZW5z
aW9uLW1haW4uaHRtbCIpOworICAgIGV2YWx1YXRlSW5XZWJJbnNwZWN0b3IoImZyb250ZW5kX2lu
aXRpYWxpemVFeHRlbnNpb24oJyIgKyBleHRlbnNpb25VUkwgKyAiJykiKTsKK30KKworZnVuY3Rp
b24gZXh0ZW5zaW9uRnVuY3Rpb25zKCkKK3sKKyAgICB2YXIgZnVuY3Rpb25zID0gIiI7CisKKyAg
ICBmb3IgKHN5bWJvbCBpbiB3aW5kb3cpIHsKKyAgICAgICAgaWYgKC9eZXh0ZW5zaW9uXy8uZXhl
YyhzeW1ib2wpICYmIHR5cGVvZiB3aW5kb3dbc3ltYm9sXSA9PT0gImZ1bmN0aW9uIikKKyAgICAg
ICAgICAgIGZ1bmN0aW9ucyArPSB3aW5kb3dbc3ltYm9sXS50b1N0cmluZygpOworICAgIH0KKyAg
ICByZXR1cm4gZnVuY3Rpb25zOworfQorCkluZGV4OiBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0
ZW5zaW9ucy5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2luc3BlY3Rvci9leHRlbnNp
b25zLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9u
cy5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDg3IEBACis8aHRtbD4KKzxoZWFkPgorPHNj
cmlwdCBzcmM9Ii4uL2h0dHAvdGVzdHMvaW5zcGVjdG9yL2luc3BlY3Rvci10ZXN0LmpzIj48L3Nj
cmlwdD4KKzxzY3JpcHQgc3JjPSJleHRlbnNpb25zLXRlc3QuanMiPjwvc2NyaXB0PgorPHNjcmlw
dCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCit3aW5kb3cuaW5zcGVjdGVkVmFsdWUgPSB7IHN0
cjogImZvbyIsIG51bTogNDIgfTsKKworZnVuY3Rpb24gZXh0ZW5zaW9uX3Rlc3RFdmFsT2sobmV4
dFRlc3QpCit7CisgICAgd2ViSW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgiaW5z
cGVjdGVkVmFsdWUiLCBjYWxsYmFja0FuZE5leHRUZXN0KGV4dGVuc2lvbl9vbkV2YWx1YXRlLCBu
ZXh0VGVzdCkpOworfQorCitmdW5jdGlvbiBleHRlbnNpb25fdGVzdEV2YWxGYWlsZWQobmV4dFRl
c3QpCit7CisgICAgd2ViSW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgiZG9jdW1l
bnQuYm9keSIsIGNhbGxiYWNrQW5kTmV4dFRlc3QoZXh0ZW5zaW9uX29uRXZhbHVhdGUsIG5leHRU
ZXN0KSk7Cit9CisKK2Z1bmN0aW9uIGV4dGVuc2lvbl90ZXN0R2V0QWxsUmVzb3VyY2VzKG5leHRU
ZXN0KQoreworICAgIGZ1bmN0aW9uIGNvbXBhcmVSZXNvdXJjZXMoYSwgYikKKyAgICB7CisgICAg
ICAgIHJldHVybiBhLmhhci5yZXF1ZXN0LnVybC5sb2NhbGVDb21wYXJlKGIuaGFyLnJlcXVlc3Qu
dXJsKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBvblJlc291cmNlKHJlc3VsdCkKKyAgICB7Cisg
ICAgICAgIHZhciByZXNvdXJjZXMgPSByZXN1bHQuc29ydChjb21wYXJlUmVzb3VyY2VzKTsKKwor
ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7ICsraSkKKyAgICAg
ICAgICAgIGxvZygicmVzb3VyY2U6ICIgKyByZXNvdXJjZXNbaV0uaGFyLnJlcXVlc3QudXJsLnJl
cGxhY2UoLy4qKChcL1teL10qKXszfSQpLywiLi4uJDEiKSk7CisgICAgfQorICAgIHdlYkluc3Bl
Y3Rvci5yZXNvdXJjZXMuZ2V0QWxsKGNhbGxiYWNrQW5kTmV4dFRlc3Qob25SZXNvdXJjZSwgbmV4
dFRlc3QpKTsKK30KKworZnVuY3Rpb24gZXh0ZW5zaW9uX3Rlc3RHZXRJbnZhbGlkUmVzb3VyY2Uo
bmV4dFRlc3QpCit7CisgICAgZnVuY3Rpb24gb25SZXNvdXJjZShyZXN1bHQpCisgICAgeworICAg
ICAgICBsb2coIkF0dGVtcHRlZCB0byByZXRyaWV2ZSBpbnZhbGlkIHJlc291cmNlOiAiICsgSlNP
Ti5zdHJpbmdpZnkocmVzdWx0KSk7CisgICAgfQorICAgIHdlYkluc3BlY3Rvci5yZXNvdXJjZXMu
Z2V0KDIxMjg1MDYsIGNhbGxiYWNrQW5kTmV4dFRlc3Qob25SZXNvdXJjZSwgbmV4dFRlc3QpKTsK
K30KKworZnVuY3Rpb24gZXh0ZW5zaW9uX3Rlc3RDcmVhdGVQYW5lbChuZXh0VGVzdCkKK3sKKyAg
ICBmdW5jdGlvbiBvblBhbmVsQ3JlYXRlZChwYW5lbCkKKyAgICB7CisgICAgICAgIGxvZygiUGFu
ZWwgY3JlYXRlZCIpOworICAgICAgICBkdW1wT2JqZWN0KHBhbmVsKTsKKyAgICB9CisgICAgd2Vi
SW5zcGVjdG9yLnBhbmVscy5jcmVhdGUoIlRlc3QgUGFuZWwiLCAiZXh0ZW5zaW9uLXBhbmVsLmh0
bWwiLCAiZXh0ZW5zaW9uLXBhbmVsLnBuZyIsIGNhbGxiYWNrQW5kTmV4dFRlc3Qob25QYW5lbENy
ZWF0ZWQsIG5leHRUZXN0KSk7CisgICAgbG9nKCJkb25lIGNyZWF0ZVBhbmVsIik7Cit9CisKK2Z1
bmN0aW9uIGV4dGVuc2lvbl90ZXN0Q3JlYXRlU2lkZWJhcihuZXh0VGVzdCkKK3sKKyAgICBmdW5j
dGlvbiBvblNpZGViYXJDcmVhdGVkKHNpZGViYXIpCisgICAgeworICAgICAgICBsb2coIlNpZGVi
YXIgY3JlYXRlZCIpOworICAgICAgICBkdW1wT2JqZWN0KHNpZGViYXIpOworICAgIH0KKyAgICB3
ZWJJbnNwZWN0b3IucGFuZWxzLnNjcmlwdHMuY3JlYXRlU2lkZWJhclBhbmUoIlRlc3QgU2lkZWJh
ciIsICJleHRlbnNpb24tc2lkZWJhci5odG1sIiwgY2FsbGJhY2tBbmROZXh0VGVzdChvblNpZGVi
YXJDcmVhdGVkLCBuZXh0VGVzdCkpOworfQorCitmdW5jdGlvbiBleHRlbnNpb25fdGVzdFJlc291
cmNlTm90aWZpY2F0aW9uKG5leHRUZXN0KQoreworICAgIGZ1bmN0aW9uIG9uUmVzb3VyY2VGaW5p
c2hlZChyZXNvdXJjZSkKKyAgICB7CisgICAgICAgIGxvZygiUmVzb3VyY2UgZmluaXNoZWQ6ICIg
KyByZXNvdXJjZS5oYXIucmVxdWVzdC51cmwucmVwbGFjZSgvLiooKFwvW14vXSopezN9JCkvLCIu
Li4kMSIpKTsKKyAgICB9CisKKyAgICB3ZWJJbnNwZWN0b3IucmVzb3VyY2VzLm9uRmluaXNoZWQu
YWRkTGlzdGVuZXIoY2FsbGJhY2tBbmROZXh0VGVzdChvblJlc291cmNlQ3JlYXRlZCwgbmV4dFRl
c3QpKTsKKyAgICB3ZWJJbnNwZWN0b3IuaW5zcGVjdGVkV2luZG93LmV2YWx1YXRlKCJ2YXIgeGhy
ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7IHhoci5vcGVuKCdHRVQnLCAnIiArIGxvY2F0aW9uLmhy
ZWYgKyAiJywgZmFsc2UpOyB4aHIuc2VuZChudWxsKTsiKTsKK30KKworZnVuY3Rpb24gZXh0ZW5z
aW9uX29uRXZhbHVhdGUocmVzdWx0KQoreworICAgIGxvZygiRXZhbHVhdGU6ICIgKyByZXN1bHQu
dmFsdWUgKyAiKGV4Y2VwdGlvbjogIiArIHJlc3VsdC5pc0V4Y2VwdGlvbiArICIpIik7Cit9CisK
Kzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHkgb25sb2FkPSJvbmxvYWQoKSI+Cis8cD5UZXN0cyBX
ZWJJbnNwZWN0b3IgZXh0ZW5zaW9uIEFQSTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IExh
eW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLW1haW4uaHRtbAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1tYWluLmh0
bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVu
c2lvbi1tYWluLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTUgQEAKKzxodG1sPgorPGhl
YWQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CitmdW5jdGlvbiBsb2cobWVzc2Fn
ZSkKK3sKKyAgICB3ZWJJbnNwZWN0b3IuaW5zcGVjdGVkV2luZG93LmV2YWx1YXRlKCJsb2codW5l
c2NhcGUoJyIgKyBlc2NhcGUobWVzc2FnZSkgKyAiJykpOyIpOworfQorCitsb2coIlN0YXJ0ZWQg
ZXh0ZW5zaW9uLiIpOworPC9zY3JpcHQ+CisKKzxzY3JpcHQgc3JjPSIuLi8uLi9odHRwL3Rlc3Rz
L2luc3BlY3Rvci9pbnNwZWN0b3ItdGVzdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iZXh0
ZW5zaW9uLW1haW4uanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPC9odG1sPgpJbmRleDogTGF5b3V0
VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFpbi5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1tYWluLmpzCShyZXZp
c2lvbiAwKQorKysgTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tbWFp
bi5qcwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2NiBAQAorZnVuY3Rpb24gZmV0Y2hUZXN0cygp
Cit7CisgICAgZnVuY3Rpb24gY2FsbGJhY2socmVzdWx0KQorICAgIHsKKyAgICAgICAgIHZhciBm
dW5jdGlvbnMgPSBKU09OLnBhcnNlKHJlc3VsdC52YWx1ZSk7CisgICAgICAgICB3aW5kb3cuZXZh
bChmdW5jdGlvbnMpOworICAgICAgICAgcnVuVGVzdHMoKTsKKyAgICB9CisgICAgd2ViSW5zcGVj
dG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgiZXh0ZW5zaW9uRnVuY3Rpb25zKCkiLCBjYWxs
YmFjayk7Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3RzKCkKK3sKKyAgICBsb2coIlJ1bm5pbmcgdGVz
dHMuLi4iKTsKKyAgICB2YXIgdGVzdHMgPSBbXTsKKyAgICBmb3IgKHZhciBzeW1ib2wgaW4gdGhp
cykgeworICAgICAgICBpZiAoL15leHRlbnNpb25fdGVzdC8uZXhlYyhzeW1ib2wpICYmIHR5cGVv
ZiB0aGlzW3N5bWJvbF0gPT09ICJmdW5jdGlvbiIpCisgICAgICAgICAgICB0ZXN0cy5wdXNoKHN5
bWJvbCk7CisgICAgfQorICAgIHRlc3RzID0gdGVzdHMuc29ydCgpOworICAgIHZhciB0ZXN0Q2hh
aW4gPSBvblRlc3RzRG9uZTsKKyAgICBmb3IgKHZhciB0ZXN0ID0gdGVzdHMucG9wKCk7IHRlc3Q7
IHRlc3QgPSB0ZXN0cy5wb3AoKSkKKyAgICAgICAgdGVzdENoYWluID0gYmluZChydW5UZXN0LCB0
aGlzLCBiaW5kKHRoaXNbdGVzdF0sIHRoaXMsIHRlc3RDaGFpbiksIHRlc3QpOworICAgIHRlc3RD
aGFpbigpOworfQorCitmdW5jdGlvbiBvblRlc3RzRG9uZSgpCit7CisgICAgbG9nKCJBbGwgdGVz
dHMgZG9uZS4iKTsKKyAgICB3ZWJJbnNwZWN0b3IuaW5zcGVjdGVkV2luZG93LmV2YWx1YXRlKCJu
b3RpZnlEb25lKCk7Iik7Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3QodGVzdCwgbmFtZSkKK3sKKyAg
ICBsb2coIlJVTk5JTkcgVEVTVDogIiArIG5hbWUpOworICAgIHRyeSB7CisgICAgICAgIHRlc3Qo
KTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIGxvZyhuYW1lICsgIjogIiArIGUpOworICAg
IH0KK30KKworZnVuY3Rpb24gY2FsbGJhY2tBbmROZXh0VGVzdChjYWxsYmFjaywgbmV4dFRlc3Qp
Cit7CisgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKCkgCisgICAgeworICAgICAgICBjYWxs
YmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgICBuZXh0VGVzdC5jYWxsKHRoaXMp
OworICAgIH0KKyAgICByZXR1cm4gY2FsbGJhY2tXcmFwcGVyOworfQorCitmdW5jdGlvbiBiaW5k
KGZ1bmMsIHRoaXNPYmplY3QpCit7CisgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xp
Y2UuY2FsbChhcmd1bWVudHMsIDIpOworICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGZ1
bmMuYXBwbHkodGhpc09iamVjdCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNh
bGwoYXJndW1lbnRzLCAwKSkpOyB9OworfQorCisvLyBkdW1wT2JqZWN0KCkgbmVlZHMgb3V0cHV0
KCksIHNvIGltcGxlbWVudCBpdCB2aWEgbG9nKCkuCisKK2Z1bmN0aW9uIG91dHB1dChtc2cpCit7
CisgICAgbG9nKG1zZyk7Cit9CisKK2ZldGNoVGVzdHMoKTsKSW5kZXg6IExheW91dFRlc3RzL2lu
c3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXBhbmVsLmh0bWwKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tcGFuZWwuaHRtbAkocmV2aXNp
b24gMCkKKysrIExheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXBhbmVs
Lmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMiBAQAorPGh0bWw+Cis8L2h0bWw+CkluZGV4
OiBMYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1zaWRlYmFyLmh0bWwK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24t
c2lkZWJhci5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jlc291
cmNlcy9leHRlbnNpb24tc2lkZWJhci5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIgQEAK
KzxodG1sPgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0vdGVz
dF9leHBlY3RhdGlvbnMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL2No
cm9taXVtL3Rlc3RfZXhwZWN0YXRpb25zLnR4dAkocmV2aXNpb24gNjQzNDApCisrKyBMYXlvdXRU
ZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS90ZXN0X2V4cGVjdGF0aW9ucy50eHQJKHdvcmtpbmcgY29w
eSkKQEAgLTE5OCw2ICsxOTgsNyBAQCBXT05URklYIFNLSVAgOiBmYXN0L2V2ZW50cy9tZXNzYWdl
LXBvcnQtCiBXT05URklYIFNLSVAgOiBmYXN0L2V2ZW50cy9tZXNzYWdlLXBvcnQuaHRtbCA9IEZB
SUwKIFdPTlRGSVggU0tJUCA6IGZhc3QvZXZlbnRzL21lc3NhZ2UtcG9ydC1tdWx0aS5odG1sID0g
RkFJTAogV09OVEZJWCBTS0lQIDogaHR0cC90ZXN0cy9zZWN1cml0eS9NZXNzYWdlUG9ydC9ldmVu
dC1saXN0ZW5lci1jb250ZXh0Lmh0bWwgPSBGQUlMCitXT05URklYIFNLSVAgOiBpbnNwZWN0b3Iv
ZXh0ZW5zaW9ucy5odG1sID0gRkFJTAogCiAvLyBJbXBsZW1lbnQgamF2YSB0ZXN0aW5nIGhhcm5l
c3MuCiBCVUczNjY4MSBERUZFUiBTS0lQIDogamF2YSA9IFRFWFQK
</data>
<flag name="review"
          id="51353"
          type_id="1"
          status="+"
          setter="pfeldman"
    />
    <flag name="commit-queue"
          id="51354"
          type_id="3"
          status="-"
          setter="pfeldman"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63199</attachid>
            <date>2010-08-02 05:38:42 -0700</date>
            <delta_ts>2010-08-02 05:38:42 -0700</delta_ts>
            <desc>patch to land</desc>
            <filename>extensions.patch</filename>
            <type>text/plain</type>
            <size>59841</size>
            <attacher name="Andrey Kosyakov">caseq</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBmNzc4NDkzLi41MDEwNTAyIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzcgQEAKKzIwMTAtMDgt
MDIgIEFuZHJleSBLb3N5YWtvdiAgPGNhc2VxQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXZWIgSW5zcGVjdG9yOiBhZGRpbmcg
dGVzdHMgZm9yIFdlYkluc3BlY3RvciBleHRlbnNpb25zIEFQSS4KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQwNDI1CisKKyAgICAgICAgKiBodHRwL3Rl
c3RzL2luc3BlY3Rvci9pbnNwZWN0b3ItdGVzdC5qczoKKyAgICAgICAgKGR1bXBPYmplY3QpOgor
ICAgICAgICAqIGluc3BlY3Rvci9leHRlbnNpb25zLWFwaS1leHBlY3RlZC50eHQ6IEFkZGVkLgor
ICAgICAgICAqIGluc3BlY3Rvci9leHRlbnNpb25zLWFwaS5odG1sOiBBZGRlZC4KKyAgICAgICAg
KiBpbnNwZWN0b3IvZXh0ZW5zaW9ucy1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGlu
c3BlY3Rvci9leHRlbnNpb25zLXRlc3QuanM6IEFkZGVkLgorICAgICAgICAobG9nKToKKyAgICAg
ICAgKGZyb250ZW5kX2luaXRpYWxpemVFeHRlbnNpb24pOgorICAgICAgICAoZG9pdCk6CisgICAg
ICAgIChkb25lLmNhbGxiYWNrKToKKyAgICAgICAgKGRvbmUpOgorICAgICAgICAoZXh0ZW5zaW9u
RnVuY3Rpb25zKToKKyAgICAgICAgKiBpbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1sOiBBZGRlZC4K
KyAgICAgICAgKiBpbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1tYWluLmh0bWw6IEFkZGVk
LgorICAgICAgICAqIGluc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLW1haW4uanM6IEFkZGVk
LgorICAgICAgICAoZmV0Y2hUZXN0cy5jYWxsYmFjayk6CisgICAgICAgIChmZXRjaFRlc3RzKToK
KyAgICAgICAgKHJ1blRlc3RzKToKKyAgICAgICAgKG9uVGVzdHNEb25lKToKKyAgICAgICAgKHJ1
blRlc3QpOgorICAgICAgICAoY2FsbGJhY2tBbmROZXh0VGVzdC5jYWxsYmFja1dyYXBwZXIpOgor
ICAgICAgICAoY2FsbGJhY2tBbmROZXh0VGVzdCk6CisgICAgICAgIChvdXRwdXQpOgorICAgICAg
ICAqIGluc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXBhbmVsLmh0bWw6IEFkZGVkLgorICAg
ICAgICAqIGluc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLXNpZGViYXIuaHRtbDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0vdGVzdF9leHBlY3RhdGlvbnMudHh0OgorCiAy
MDEwLTA4LTAyICBDc2FiYSBPc3p0cm9nb27DoWMgIDxvc3N5QHdlYmtpdC5vcmc+CiAKICAgICAg
ICAgVW5yZXZpZXdlZC4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2h0dHAvdGVzdHMvaW5zcGVj
dG9yL2luc3BlY3Rvci10ZXN0LmpzIGIvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9pbnNwZWN0b3Iv
aW5zcGVjdG9yLXRlc3QuanMKaW5kZXggZjQxMjUwOS4uNDBhY2UzMSAxMDA3NTUKLS0tIGEvTGF5
b3V0VGVzdHMvaHR0cC90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9yLXRlc3QuanMKKysrIGIvTGF5
b3V0VGVzdHMvaHR0cC90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9yLXRlc3QuanMKQEAgLTU0LDYg
KzU0LDggQEAgZnVuY3Rpb24gZHVtcE9iamVjdChvYmplY3QsIG5vbmRldGVybWluaXN0aWNQcm9w
cywgcHJlZml4LCBmaXJzdExpbmVQcmVmaXgpCiAgICAgICAgICAgICBkdW1wT2JqZWN0KHByb3BW
YWx1ZSwgbm9uZGV0ZXJtaW5pc3RpY1Byb3BzLCBwcmVmaXggKyAiICAgICIsIHByZWZpeFdpdGhO
YW1lKTsKICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gInN0cmluZyIpCiAg
ICAgICAgICAgICBvdXRwdXQocHJlZml4V2l0aE5hbWUgKyAiXCIiICsgcHJvcFZhbHVlICsgIlwi
Iik7CisgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICJmdW5jdGlvbiIpCisg
ICAgICAgICAgICBvdXRwdXQocHJlZml4V2l0aE5hbWUgKyAiPGZ1bmN0aW9uPiIpOwogICAgICAg
ICBlbHNlCiAgICAgICAgICAgICBvdXRwdXQocHJlZml4V2l0aE5hbWUgKyBwcm9wVmFsdWUpOwog
ICAgIH0KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2luc3BlY3Rvci9leHRlbnNpb25zLWFwaS1l
eHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy1hcGktZXhwZWN0
ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMWEzMmQKLS0tIC9k
ZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy1hcGktZXhwZWN0
ZWQudHh0CkBAIC0wLDAgKzEsNDcgQEAKK1Rlc3RzIHB1YmxpYyBpbnRlcmZhY2Ugb2YgV2ViSW5z
cGVjdG9yIEV4dGVuc2lvbnMgQVBJCisKK1N0YXJ0ZWQgZXh0ZW5zaW9uLgorUnVubmluZyB0ZXN0
cy4uLgorUlVOTklORyBURVNUOiBleHRlbnNpb25fdGVzdEFQSQoreworICAgIGluc3BlY3RlZFdp
bmRvdyA6IHsKKyAgICAgICAgb25Mb2FkZWQgOiB7CisgICAgICAgICAgICBhZGRMaXN0ZW5lciA6
IDxmdW5jdGlvbj4KKyAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyIDogPGZ1bmN0aW9uPgorICAg
ICAgICB9CisgICAgICAgIG9uTmF2aWdhdGVkIDogeworICAgICAgICAgICAgYWRkTGlzdGVuZXIg
OiA8ZnVuY3Rpb24+CisgICAgICAgICAgICByZW1vdmVMaXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAg
ICAgICAgfQorICAgICAgICBvbkRPTUNvbnRlbnRMb2FkZWQgOiB7CisgICAgICAgICAgICBhZGRM
aXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyIDogPGZ1bmN0
aW9uPgorICAgICAgICB9CisgICAgICAgIHJlbG9hZCA6IDxmdW5jdGlvbj4KKyAgICAgICAgZXZh
bHVhdGUgOiA8ZnVuY3Rpb24+CisgICAgfQorICAgIHBhbmVscyA6IHsKKyAgICAgICAgZWxlbWVu
dHMgOiB7CisgICAgICAgICAgICBjcmVhdGVTaWRlYmFyUGFuZSA6IDxmdW5jdGlvbj4KKyAgICAg
ICAgfQorICAgICAgICBzY3JpcHRzIDogeworICAgICAgICAgICAgY3JlYXRlU2lkZWJhclBhbmUg
OiA8ZnVuY3Rpb24+CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRlIDogPGZ1bmN0aW9uPgorICAg
IH0KKyAgICByZXNvdXJjZXMgOiB7CisgICAgICAgIG9uRmluaXNoZWQgOiB7CisgICAgICAgICAg
ICBhZGRMaXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyIDog
PGZ1bmN0aW9uPgorICAgICAgICB9CisgICAgICAgIGdldEFsbCA6IDxmdW5jdGlvbj4KKyAgICAg
ICAgZ2V0IDogPGZ1bmN0aW9uPgorICAgIH0KKyAgICBvblJlc2V0IDogeworICAgICAgICBhZGRM
aXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAgICAgICAgcmVtb3ZlTGlzdGVuZXIgOiA8ZnVuY3Rpb24+
CisgICAgfQorICAgIGxvZyA6IDxmdW5jdGlvbj4KK30KK0FsbCB0ZXN0cyBkb25lLgorCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy1hcGkuaHRtbCBiL0xheW91
dFRlc3RzL2luc3BlY3Rvci9leHRlbnNpb25zLWFwaS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmYxMmViZGIKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9p
bnNwZWN0b3IvZXh0ZW5zaW9ucy1hcGkuaHRtbApAQCAtMCwwICsxLDE4IEBACis8aHRtbD4KKzxo
ZWFkPgorPHNjcmlwdCBzcmM9Ii4uL2h0dHAvdGVzdHMvaW5zcGVjdG9yL2luc3BlY3Rvci10ZXN0
LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJleHRlbnNpb25zLXRlc3QuanMiPjwvc2NyaXB0
PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCitmdW5jdGlvbiBleHRlbnNpb25f
dGVzdEFQSShuZXh0VGVzdCkKK3sKKyAgICBkdW1wT2JqZWN0KHdlYkluc3BlY3Rvcik7IAorICAg
IG5leHRUZXN0KCk7Cit9CisKKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHkgb25sb2FkPSJvbmxv
YWQoKSI+Cis8cD5UZXN0cyBwdWJsaWMgaW50ZXJmYWNlIG9mIFdlYkluc3BlY3RvciBFeHRlbnNp
b25zIEFQSTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2lu
c3BlY3Rvci9leHRlbnNpb25zLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL2luc3BlY3Rvci9l
eHRlbnNpb25zLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li42ODhjNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVu
c2lvbnMtZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMzQgQEAKK1Rlc3RzIFdlYkluc3BlY3RvciBl
eHRlbnNpb24gQVBJCisKK1N0YXJ0ZWQgZXh0ZW5zaW9uLgorUnVubmluZyB0ZXN0cy4uLgorUlVO
TklORyBURVNUOiBleHRlbnNpb25fdGVzdENyZWF0ZVBhbmVsCitkb25lIGNyZWF0ZVBhbmVsCitQ
YW5lbCBjcmVhdGVkCit7CisgICAgY3JlYXRlU2lkZWJhclBhbmUgOiA8ZnVuY3Rpb24+CisgICAg
b25TZWFyY2ggOiB7CisgICAgICAgIGFkZExpc3RlbmVyIDogPGZ1bmN0aW9uPgorICAgICAgICBy
ZW1vdmVMaXN0ZW5lciA6IDxmdW5jdGlvbj4KKyAgICB9Cit9CitSVU5OSU5HIFRFU1Q6IGV4dGVu
c2lvbl90ZXN0Q3JlYXRlU2lkZWJhcgorU2lkZWJhciBjcmVhdGVkCit7CisgICAgc2V0SGVpZ2h0
IDogPGZ1bmN0aW9uPgorICAgIHNldEV4cGFuZGVkIDogPGZ1bmN0aW9uPgorfQorUlVOTklORyBU
RVNUOiBleHRlbnNpb25fdGVzdEV2YWxGYWlsZWQKK0V2YWx1YXRlOiBUeXBlRXJyb3I6IEpTT04u
c3RyaW5naWZ5IGNhbm5vdCBzZXJpYWxpemUgY3ljbGljIHN0cnVjdHVyZXMuKGV4Y2VwdGlvbjog
dHJ1ZSkKK1JVTk5JTkcgVEVTVDogZXh0ZW5zaW9uX3Rlc3RFdmFsT2sKK0V2YWx1YXRlOiB7InN0
ciI6ImZvbyIsIm51bSI6NDJ9KGV4Y2VwdGlvbjogdW5kZWZpbmVkKQorUlVOTklORyBURVNUOiBl
eHRlbnNpb25fdGVzdEdldEFsbFJlc291cmNlcworcmVzb3VyY2U6IC4uLi90ZXN0cy9pbnNwZWN0
b3IvaW5zcGVjdG9yLXRlc3QuanMKK3Jlc291cmNlOiAuLi4vTGF5b3V0VGVzdHMvaW5zcGVjdG9y
L2V4dGVuc2lvbnMtdGVzdC5qcworcmVzb3VyY2U6IC4uLi9MYXlvdXRUZXN0cy9pbnNwZWN0b3Iv
ZXh0ZW5zaW9ucy5odG1sCitSVU5OSU5HIFRFU1Q6IGV4dGVuc2lvbl90ZXN0R2V0SW52YWxpZFJl
c291cmNlCitBdHRlbXB0ZWQgdG8gcmV0cmlldmUgaW52YWxpZCByZXNvdXJjZTogeyJjb2RlIjoi
RV9OT1RGT1VORCIsImRlc2NyaXB0aW9uIjoiT2JqZWN0IG5vdCBmb3VuZCAoJXMpIiwiZGV0YWls
cyI6WzIxMjg1MDZdLCJpc0Vycm9yIjp0cnVlfQorUlVOTklORyBURVNUOiBleHRlbnNpb25fdGVz
dFJlc291cmNlTm90aWZpY2F0aW9uCitSZXNvdXJjZSBmaW5pc2hlZDogLi4uL2luc3BlY3Rvci9y
ZXNvdXJjZXMvZXh0ZW5zaW9uLW1haW4uaHRtbAorQWxsIHRlc3RzIGRvbmUuCisKZGlmZiAtLWdp
dCBhL0xheW91dFRlc3RzL2luc3BlY3Rvci9leHRlbnNpb25zLXRlc3QuanMgYi9MYXlvdXRUZXN0
cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy10ZXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjAwZDhlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9pbnNwZWN0
b3IvZXh0ZW5zaW9ucy10ZXN0LmpzCkBAIC0wLDAgKzEsMzggQEAKK2Z1bmN0aW9uIGxvZyhtZXNz
YWdlKQoreworICAgIG91dHB1dChtZXNzYWdlKTsKK30KKworZnVuY3Rpb24gZnJvbnRlbmRfaW5p
dGlhbGl6ZUV4dGVuc2lvbih1cmwpCit7CisgICAgaWYgKFdlYkluc3BlY3Rvci5wYW5lbHMucmVz
b3VyY2VzLnJlc291cmNlVHJhY2tpbmdFbmFibGVkKQorICAgICAgICBXZWJJbnNwZWN0b3IuYWRk
RXh0ZW5zaW9ucyhbeyBzdGFydFBhZ2U6IHVybCB9XSk7CisgICAgZWxzZQorICAgICAgICBJbnNw
ZWN0b3JCYWNrZW5kLmVuYWJsZVJlc291cmNlVHJhY2tpbmcoZmFsc2UpOworfQorCitmdW5jdGlv
biBkb2l0KCkKK3sKKyAgICB2YXIgZXh0ZW5zaW9uVVJMID0gbG9jYXRpb24uaHJlZi5yZXBsYWNl
KC9cL1teL10qJC8sICIvcmVzb3VyY2VzL2V4dGVuc2lvbi1tYWluLmh0bWwiKTsKKyAgICBldmFs
dWF0ZUluV2ViSW5zcGVjdG9yKCJmcm9udGVuZF9pbml0aWFsaXplRXh0ZW5zaW9uKCciICsgZXh0
ZW5zaW9uVVJMICsgIicpIik7Cit9CisKK2Z1bmN0aW9uIGRvbmUoKQoreworICAgIGZ1bmN0aW9u
IGNhbGxiYWNrKCkKKyAgICB7CisgICAgICAgIG5vdGlmeURvbmUoKTsKKyAgICB9CisgICAgZXZh
bHVhdGVJbldlYkluc3BlY3RvcigiSW5zcGVjdG9yQmFja2VuZC5kaXNhYmxlUmVzb3VyY2VUcmFj
a2luZyhmYWxzZSk7IiwgY2FsbGJhY2spOworfQorCitmdW5jdGlvbiBleHRlbnNpb25GdW5jdGlv
bnMoKQoreworICAgIHZhciBmdW5jdGlvbnMgPSAiIjsKKworICAgIGZvciAoc3ltYm9sIGluIHdp
bmRvdykgeworICAgICAgICBpZiAoL15leHRlbnNpb25fLy5leGVjKHN5bWJvbCkgJiYgdHlwZW9m
IHdpbmRvd1tzeW1ib2xdID09PSAiZnVuY3Rpb24iKQorICAgICAgICAgICAgZnVuY3Rpb25zICs9
IHdpbmRvd1tzeW1ib2xdLnRvU3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBmdW5jdGlvbnM7
Cit9CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvZXh0ZW5zaW9ucy5odG1sIGIv
TGF5b3V0VGVzdHMvaW5zcGVjdG9yL2V4dGVuc2lvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi42M2M2ODJiCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMv
aW5zcGVjdG9yL2V4dGVuc2lvbnMuaHRtbApAQCAtMCwwICsxLDg3IEBACis8aHRtbD4KKzxoZWFk
PgorPHNjcmlwdCBzcmM9Ii4uL2h0dHAvdGVzdHMvaW5zcGVjdG9yL2luc3BlY3Rvci10ZXN0Lmpz
Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJleHRlbnNpb25zLXRlc3QuanMiPjwvc2NyaXB0Pgor
PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCit3aW5kb3cuaW5zcGVjdGVkVmFsdWUg
PSB7IHN0cjogImZvbyIsIG51bTogNDIgfTsKKworZnVuY3Rpb24gZXh0ZW5zaW9uX3Rlc3RFdmFs
T2sobmV4dFRlc3QpCit7CisgICAgd2ViSW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0
ZSgiaW5zcGVjdGVkVmFsdWUiLCBjYWxsYmFja0FuZE5leHRUZXN0KGV4dGVuc2lvbl9vbkV2YWx1
YXRlLCBuZXh0VGVzdCkpOworfQorCitmdW5jdGlvbiBleHRlbnNpb25fdGVzdEV2YWxGYWlsZWQo
bmV4dFRlc3QpCit7CisgICAgd2ViSW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgi
ZG9jdW1lbnQuYm9keSIsIGNhbGxiYWNrQW5kTmV4dFRlc3QoZXh0ZW5zaW9uX29uRXZhbHVhdGUs
IG5leHRUZXN0KSk7Cit9CisKK2Z1bmN0aW9uIGV4dGVuc2lvbl90ZXN0R2V0QWxsUmVzb3VyY2Vz
KG5leHRUZXN0KQoreworICAgIGZ1bmN0aW9uIGNvbXBhcmVSZXNvdXJjZXMoYSwgYikKKyAgICB7
CisgICAgICAgIHJldHVybiBhLmhhci5yZXF1ZXN0LnVybC5sb2NhbGVDb21wYXJlKGIuaGFyLnJl
cXVlc3QudXJsKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBvblJlc291cmNlKHJlc3VsdCkKKyAg
ICB7CisgICAgICAgIHZhciByZXNvdXJjZXMgPSByZXN1bHQuc29ydChjb21wYXJlUmVzb3VyY2Vz
KTsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7ICsraSkK
KyAgICAgICAgICAgIGxvZygicmVzb3VyY2U6ICIgKyByZXNvdXJjZXNbaV0uaGFyLnJlcXVlc3Qu
dXJsLnJlcGxhY2UoLy4qKChcL1teL10qKXszfSQpLywiLi4uJDEiKSk7CisgICAgfQorICAgIHdl
Ykluc3BlY3Rvci5yZXNvdXJjZXMuZ2V0QWxsKGNhbGxiYWNrQW5kTmV4dFRlc3Qob25SZXNvdXJj
ZSwgbmV4dFRlc3QpKTsKK30KKworZnVuY3Rpb24gZXh0ZW5zaW9uX3Rlc3RHZXRJbnZhbGlkUmVz
b3VyY2UobmV4dFRlc3QpCit7CisgICAgZnVuY3Rpb24gb25SZXNvdXJjZShyZXN1bHQpCisgICAg
eworICAgICAgICBsb2coIkF0dGVtcHRlZCB0byByZXRyaWV2ZSBpbnZhbGlkIHJlc291cmNlOiAi
ICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7CisgICAgfQorICAgIHdlYkluc3BlY3Rvci5yZXNv
dXJjZXMuZ2V0KDIxMjg1MDYsIGNhbGxiYWNrQW5kTmV4dFRlc3Qob25SZXNvdXJjZSwgbmV4dFRl
c3QpKTsKK30KKworZnVuY3Rpb24gZXh0ZW5zaW9uX3Rlc3RDcmVhdGVQYW5lbChuZXh0VGVzdCkK
K3sKKyAgICBmdW5jdGlvbiBvblBhbmVsQ3JlYXRlZChwYW5lbCkKKyAgICB7CisgICAgICAgIGxv
ZygiUGFuZWwgY3JlYXRlZCIpOworICAgICAgICBkdW1wT2JqZWN0KHBhbmVsKTsKKyAgICB9Cisg
ICAgd2ViSW5zcGVjdG9yLnBhbmVscy5jcmVhdGUoIlRlc3QgUGFuZWwiLCAiZXh0ZW5zaW9uLXBh
bmVsLmh0bWwiLCAiZXh0ZW5zaW9uLXBhbmVsLnBuZyIsIGNhbGxiYWNrQW5kTmV4dFRlc3Qob25Q
YW5lbENyZWF0ZWQsIG5leHRUZXN0KSk7CisgICAgbG9nKCJkb25lIGNyZWF0ZVBhbmVsIik7Cit9
CisKK2Z1bmN0aW9uIGV4dGVuc2lvbl90ZXN0Q3JlYXRlU2lkZWJhcihuZXh0VGVzdCkKK3sKKyAg
ICBmdW5jdGlvbiBvblNpZGViYXJDcmVhdGVkKHNpZGViYXIpCisgICAgeworICAgICAgICBsb2co
IlNpZGViYXIgY3JlYXRlZCIpOworICAgICAgICBkdW1wT2JqZWN0KHNpZGViYXIpOworICAgIH0K
KyAgICB3ZWJJbnNwZWN0b3IucGFuZWxzLnNjcmlwdHMuY3JlYXRlU2lkZWJhclBhbmUoIlRlc3Qg
U2lkZWJhciIsICJleHRlbnNpb24tc2lkZWJhci5odG1sIiwgY2FsbGJhY2tBbmROZXh0VGVzdChv
blNpZGViYXJDcmVhdGVkLCBuZXh0VGVzdCkpOworfQorCitmdW5jdGlvbiBleHRlbnNpb25fdGVz
dFJlc291cmNlTm90aWZpY2F0aW9uKG5leHRUZXN0KQoreworICAgIGZ1bmN0aW9uIG9uUmVzb3Vy
Y2VGaW5pc2hlZChyZXNvdXJjZSkKKyAgICB7CisgICAgICAgIGxvZygiUmVzb3VyY2UgZmluaXNo
ZWQ6ICIgKyByZXNvdXJjZS5oYXIucmVxdWVzdC51cmwucmVwbGFjZSgvLiooKFwvW14vXSopezN9
JCkvLCIuLi4kMSIpKTsKKyAgICB9CisKKyAgICB3ZWJJbnNwZWN0b3IucmVzb3VyY2VzLm9uRmlu
aXNoZWQuYWRkTGlzdGVuZXIoY2FsbGJhY2tBbmROZXh0VGVzdChvblJlc291cmNlRmluaXNoZWQs
IG5leHRUZXN0KSk7CisgICAgd2ViSW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgi
dmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB4aHIub3BlbignR0VUJywgJyIgKyBsb2Nh
dGlvbi5ocmVmICsgIicsIGZhbHNlKTsgeGhyLnNlbmQobnVsbCk7Iik7Cit9CisKK2Z1bmN0aW9u
IGV4dGVuc2lvbl9vbkV2YWx1YXRlKHJlc3VsdCkKK3sKKyAgICBsb2coIkV2YWx1YXRlOiAiICsg
cmVzdWx0LnZhbHVlICsgIihleGNlcHRpb246ICIgKyByZXN1bHQuaXNFeGNlcHRpb24gKyAiKSIp
OworfQorCis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5IG9ubG9hZD0ib25sb2FkKCkiPgorPHA+
VGVzdHMgV2ViSW5zcGVjdG9yIGV4dGVuc2lvbiBBUEk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRp
ZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1tYWlu
Lmh0bWwgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1tYWluLmh0
bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2OGU4ZgotLS0gL2Rldi9u
dWxsCisrKyBiL0xheW91dFRlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvZXh0ZW5zaW9uLW1haW4u
aHRtbApAQCAtMCwwICsxLDE1IEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCB0eXBlPSJ0ZXh0
L2phdmFzY3JpcHQiPgorZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgd2ViSW5zcGVjdG9y
Lmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0ZSgibG9nKHVuZXNjYXBlKCciICsgZXNjYXBlKG1lc3Nh
Z2UpICsgIicpKTsiKTsKK30KKworbG9nKCJTdGFydGVkIGV4dGVuc2lvbi4iKTsKKzwvc2NyaXB0
PgorCis8c2NyaXB0IHNyYz0iLi4vLi4vaHR0cC90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9yLXRl
c3QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImV4dGVuc2lvbi1tYWluLmpzIj48L3Njcmlw
dD4KKzwvaGVhZD4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2luc3BlY3Rvci9y
ZXNvdXJjZXMvZXh0ZW5zaW9uLW1haW4uanMgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3Vy
Y2VzL2V4dGVuc2lvbi1tYWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjQ1NjQ2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVzb3Vy
Y2VzL2V4dGVuc2lvbi1tYWluLmpzCkBAIC0wLDAgKzEsNjYgQEAKK2Z1bmN0aW9uIGZldGNoVGVz
dHMoKQoreworICAgIGZ1bmN0aW9uIGNhbGxiYWNrKHJlc3VsdCkKKyAgICB7CisgICAgICAgICB2
YXIgZnVuY3Rpb25zID0gSlNPTi5wYXJzZShyZXN1bHQudmFsdWUpOworICAgICAgICAgd2luZG93
LmV2YWwoZnVuY3Rpb25zKTsKKyAgICAgICAgIHJ1blRlc3RzKCk7CisgICAgfQorICAgIHdlYklu
c3BlY3Rvci5pbnNwZWN0ZWRXaW5kb3cuZXZhbHVhdGUoImV4dGVuc2lvbkZ1bmN0aW9ucygpIiwg
Y2FsbGJhY2spOworfQorCitmdW5jdGlvbiBydW5UZXN0cygpCit7CisgICAgbG9nKCJSdW5uaW5n
IHRlc3RzLi4uIik7CisgICAgdmFyIHRlc3RzID0gW107CisgICAgZm9yICh2YXIgc3ltYm9sIGlu
IHRoaXMpIHsKKyAgICAgICAgaWYgKC9eZXh0ZW5zaW9uX3Rlc3QvLmV4ZWMoc3ltYm9sKSAmJiB0
eXBlb2YgdGhpc1tzeW1ib2xdID09PSAiZnVuY3Rpb24iKQorICAgICAgICAgICAgdGVzdHMucHVz
aChzeW1ib2wpOworICAgIH0KKyAgICB0ZXN0cyA9IHRlc3RzLnNvcnQoKTsKKyAgICB2YXIgdGVz
dENoYWluID0gb25UZXN0c0RvbmU7CisgICAgZm9yICh2YXIgdGVzdCA9IHRlc3RzLnBvcCgpOyB0
ZXN0OyB0ZXN0ID0gdGVzdHMucG9wKCkpCisgICAgICAgIHRlc3RDaGFpbiA9IGJpbmQocnVuVGVz
dCwgdGhpcywgYmluZCh0aGlzW3Rlc3RdLCB0aGlzLCB0ZXN0Q2hhaW4pLCB0ZXN0KTsKKyAgICB0
ZXN0Q2hhaW4oKTsKK30KKworZnVuY3Rpb24gb25UZXN0c0RvbmUoKQoreworICAgIGxvZygiQWxs
IHRlc3RzIGRvbmUuIik7CisgICAgd2ViSW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy5ldmFsdWF0
ZSgiZG9uZSgpOyIpOworfQorCitmdW5jdGlvbiBydW5UZXN0KHRlc3QsIG5hbWUpCit7CisgICAg
bG9nKCJSVU5OSU5HIFRFU1Q6ICIgKyBuYW1lKTsKKyAgICB0cnkgeworICAgICAgICB0ZXN0KCk7
CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBsb2cobmFtZSArICI6ICIgKyBlKTsKKyAgICB9
Cit9CisKK2Z1bmN0aW9uIGNhbGxiYWNrQW5kTmV4dFRlc3QoY2FsbGJhY2ssIG5leHRUZXN0KQor
eworICAgIGZ1bmN0aW9uIGNhbGxiYWNrV3JhcHBlcigpIAorICAgIHsKKyAgICAgICAgY2FsbGJh
Y2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAgbmV4dFRlc3QuY2FsbCh0aGlzKTsK
KyAgICB9CisgICAgcmV0dXJuIGNhbGxiYWNrV3JhcHBlcjsKK30KKworZnVuY3Rpb24gYmluZChm
dW5jLCB0aGlzT2JqZWN0KQoreworICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNl
LmNhbGwoYXJndW1lbnRzLCAyKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBmdW5j
LmFwcGx5KHRoaXNPYmplY3QsIGFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxs
KGFyZ3VtZW50cywgMCkpKTsgfTsKK30KKworLy8gZHVtcE9iamVjdCgpIG5lZWRzIG91dHB1dCgp
LCBzbyBpbXBsZW1lbnQgaXQgdmlhIGxvZygpLgorCitmdW5jdGlvbiBvdXRwdXQobXNnKQorewor
ICAgIGxvZyhtc2cpOworfQorCitmZXRjaFRlc3RzKCk7CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0
cy9pbnNwZWN0b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1wYW5lbC5odG1sIGIvTGF5b3V0VGVzdHMv
aW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tcGFuZWwuaHRtbApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi45MDUzMWE0Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVz
dHMvaW5zcGVjdG9yL3Jlc291cmNlcy9leHRlbnNpb24tcGFuZWwuaHRtbApAQCAtMCwwICsxLDIg
QEAKKzxodG1sPgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jl
c291cmNlcy9leHRlbnNpb24tc2lkZWJhci5odG1sIGIvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Jl
c291cmNlcy9leHRlbnNpb24tc2lkZWJhci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjkwNTMxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9pbnNwZWN0
b3IvcmVzb3VyY2VzL2V4dGVuc2lvbi1zaWRlYmFyLmh0bWwKQEAgLTAsMCArMSwyIEBACis8aHRt
bD4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtL3Rl
c3RfZXhwZWN0YXRpb25zLnR4dCBiL0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtL3Rlc3Rf
ZXhwZWN0YXRpb25zLnR4dAppbmRleCBlOTkxYmJjLi4yYzkwZTZiIDEwMDY0NAotLS0gYS9MYXlv
dXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS90ZXN0X2V4cGVjdGF0aW9ucy50eHQKKysrIGIvTGF5
b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0vdGVzdF9leHBlY3RhdGlvbnMudHh0CkBAIC0xOTgs
NiArMTk4LDcgQEAgV09OVEZJWCBTS0lQIDogZmFzdC9ldmVudHMvbWVzc2FnZS1wb3J0LW5vLXdy
YXBwZXIuaHRtbCA9IEZBSUwKIFdPTlRGSVggU0tJUCA6IGZhc3QvZXZlbnRzL21lc3NhZ2UtcG9y
dC5odG1sID0gRkFJTAogV09OVEZJWCBTS0lQIDogZmFzdC9ldmVudHMvbWVzc2FnZS1wb3J0LW11
bHRpLmh0bWwgPSBGQUlMCiBXT05URklYIFNLSVAgOiBodHRwL3Rlc3RzL3NlY3VyaXR5L01lc3Nh
Z2VQb3J0L2V2ZW50LWxpc3RlbmVyLWNvbnRleHQuaHRtbCA9IEZBSUwKK1dPTlRGSVggU0tJUCA6
IGluc3BlY3Rvci9leHRlbnNpb25zLmh0bWwgPSBGQUlMCiAKIC8vIEltcGxlbWVudCBqYXZhIHRl
c3RpbmcgaGFybmVzcy4KIEJVRzM2NjgxIERFRkVSIFNLSVAgOiBqYXZhID0gVEVYVApkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA1MzZiNDIy
Li45YTNlMTE1IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0No
YW5nZUxvZwpAQCAtMSwzICsxLDExNSBAQAorMjAxMC0wOC0wMiAgQW5kcmV5IEtvc3lha292ICA8
Y2FzZXFAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFdlYiBJbnNwZWN0b3I6IGFkZGluZyBleHBlcmltZW50YWwgc3VwcG9ydCBm
b3IgV2ViSW5zcGVjdG9yIGV4dGVuc2lvbnMgQVBJLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDA0MjUKKworICAgICAgICBUZXN0czogaW5zcGVjdG9y
L2V4dGVuc2lvbnMtYXBpLmh0bWwKKyAgICAgICAgICAgICAgIGluc3BlY3Rvci9leHRlbnNpb25z
Lmh0bWwKKworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxl
ci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JDb250cm9sbGVyOjppbnNwZWN0ZWRX
aW5kb3dTY3JpcHRPYmplY3RDbGVhcmVkKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckNv
bnRyb2xsZXI6OmRpZENvbW1pdExvYWQpOgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JG
cm9udGVuZEhvc3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SW5zcGVjdG9yRnJvbnRlbmRIb3N0
OjpzZXRFeHRlbnNpb25BUEkpOgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVu
ZEhvc3QuaDoKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmlkbDoK
KyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL0VsZW1lbnRzUGFuZWwuanM6CisgICAgICAg
IChXZWJJbnNwZWN0b3IuRWxlbWVudHNQYW5lbC50aGlzLnRyZWVPdXRsaW5lLmZvY3VzZWROb2Rl
Q2hhbmdlZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRWxlbWVudHNQYW5lbCk6CisgICAgICAg
ICogaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25BUEkuanM6IEFkZGVkLiBBbiBBUEkgaW1w
bGVtZW50YXRpb24gdGhhdCBnZXRzIGluamVjdGVkIGludG8gdGhlIGV4dGVuc2lvbiBjb250ZXh0
LgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkpOgorICAgICAgICAoaW5qZWN0ZWRFeHRl
bnNpb25BUEkuRXZlbnRTaW5rSW1wbC5wcm90b3R5cGUuYWRkTGlzdGVuZXIpOgorICAgICAgICAo
aW5qZWN0ZWRFeHRlbnNpb25BUEkuRXZlbnRTaW5rSW1wbC5wcm90b3R5cGUucmVtb3ZlTGlzdGVu
ZXIpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuRXZlbnRTaW5rSW1wbC5wcm90b3R5
cGUuX2ZpcmUpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuRXZlbnRTaW5rKToKKyAg
ICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkluc3BlY3RvckV4dGVuc2lvbkFQSSk6CisgICAg
ICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5JbnNwZWN0b3JFeHRlbnNpb25BUEkucHJvdG90eXBl
LmxvZyk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5SZXNvdXJjZXMucHJvdG90eXBl
LmdldEFsbCk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5SZXNvdXJjZXMucHJvdG90
eXBlLmdldCByZXR1cm4pOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuUmVzb3VyY2Vz
LnByb3RvdHlwZSk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5QYW5lbHMpOgorICAg
ICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuUGFuZWxzLnByb3RvdHlwZS5jcmVhdGUuY2FsbGJh
Y2tXcmFwcGVyKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLlBhbmVscy5wcm90b3R5
cGUuY3JlYXRlKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLlBhbmVsSW1wbCk6Cisg
ICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5QYW5lbEltcGwucHJvdG90eXBlLmNyZWF0ZVNp
ZGViYXJQYW5lLmNhbGxiYWNrV3JhcHBlcik6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQ
SS5QYW5lbEltcGwucHJvdG90eXBlLmNyZWF0ZVNpZGViYXJQYW5lKToKKyAgICAgICAgKGluamVj
dGVkRXh0ZW5zaW9uQVBJLkV4dGVuc2lvblBhbmVsKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5z
aW9uQVBJLkV4dGVuc2lvblNpZGViYXJQYW5lSW1wbCk6CisgICAgICAgIChpbmplY3RlZEV4dGVu
c2lvbkFQSS5FeHRlbnNpb25TaWRlYmFyUGFuZUltcGwucHJvdG90eXBlLnNldEhlaWdodCk6Cisg
ICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5FeHRlbnNpb25TaWRlYmFyUGFuZUltcGwucHJv
dG90eXBlLnNldEV4cGFuZGVkKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9uQVBJLkluc3Bl
Y3RlZFdpbmRvdyk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5JbnNwZWN0ZWRXaW5k
b3cucHJvdG90eXBlLnJlbG9hZCk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5JbnNw
ZWN0ZWRXaW5kb3cucHJvdG90eXBlLmV2YWx1YXRlKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5z
aW9uQVBJLkV4dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5cGUuc2VuZFJlcXVlc3QpOgorICAg
ICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlw
ZS5yZWdpc3RlckhhbmRsZXIpOgorICAgICAgICAoaW5qZWN0ZWRFeHRlbnNpb25BUEkuRXh0ZW5z
aW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZS5uZXh0T2JqZWN0SWQpOgorICAgICAgICAoaW5qZWN0
ZWRFeHRlbnNpb25BUEkuRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZS5fcmVnaXN0ZXJD
YWxsYmFjayk6CisgICAgICAgIChpbmplY3RlZEV4dGVuc2lvbkFQSS5FeHRlbnNpb25TZXJ2ZXJD
bGllbnQucHJvdG90eXBlLl9vbkNhbGxiYWNrKToKKyAgICAgICAgKGluamVjdGVkRXh0ZW5zaW9u
QVBJLkV4dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5cGUuX29uTWVzc2FnZSk6CisgICAgICAg
IChpbmplY3RlZEV4dGVuc2lvbkFQSS5leHBhbmRVUkwpOgorICAgICAgICAoaW5qZWN0ZWRFeHRl
bnNpb25BUEkuKToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblBhbmVs
LmpzOiBBZGRlZC4gQSBjbGFzcyB0aGF0IHByb3ZpZGVzIFdlYkluc3BlY3RvcidzIFBhbmVsIGlu
dGVyZmFjZSB0byB0aGUgaW5zcGVjdG9yLCBob3N0cyBleHRlbnNpb24gcGFuZWwgd2l0aGluIGFu
IElGcmFtZSBhbmQgcHJveGllcyBQYW5lbCBjYWxsYmFja3MgdG8gdGhlIGV4dGVuc2lvbi4KKyAg
ICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbCk6CisgICAgICAgIChXZWJJbnNwZWN0
b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlLmdldCBkZWZhdWx0Rm9jdXNlZEVsZW1lbnQpOgor
ICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsLnByb3RvdHlwZS51cGRhdGVNYWlu
Vmlld1dpZHRoKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5wcm90b3R5
cGUuc2VhcmNoQ2FuY2VsZWQpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVs
LnByb3RvdHlwZS5wZXJmb3JtU2VhcmNoKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNp
b25QYW5lbC5wcm90b3R5cGUuanVtcFRvTmV4dFNlYXJjaFJlc3VsdCk6CisgICAgICAgIChXZWJJ
bnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlLmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVz
dWx0KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25QYW5lbC5wcm90b3R5cGUuX2Fk
ZFN0eWxlUnVsZSk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25SZWdp
c3RyeVN0dWIuanM6IEFkZGVkLiBBIHN0dWIgZm9yIEV4dGVuc2lvblJlZ2lzdHJ5IGNsYXNzIHRo
YXQgaXMgbWVhbnQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgZXh0ZW5zaW9ucy4gQWN0dWFsIGltcGxl
bWVudGF0aW9ucyBtYXkgYmUgYnJvd3Nlci1zcGVjZmljLgorICAgICAgICAoLldlYkluc3BlY3Rv
ci5JbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeVN0dWIpOgorICAgICAgICAoLldlYkluc3BlY3Rv
ci5JbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeVN0dWIucHJvdG90eXBlLmdldEV4dGVuc2lvbnNB
c3luYyk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25TZXJ2ZXIuanM6
IEFkZGVkLiBDb21tdW5pY2F0ZXMgd2l0aCBFeHRlbnNpb25BUEkgdmlhIERPTSBtZXNzYWdpbmcg
YW5kIHByb3hpZXMgcmVxdWVzdHMgdG8gV2ViSW5zcGVjdG9yIGNsYXNzZXMuCisgICAgICAgIChX
ZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRl
bnNpb25TZXJ2ZXIucHJvdG90eXBlLm5vdGlmeVBhbmVsU2hvd24pOgorICAgICAgICAoV2ViSW5z
cGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUubm90aWZ5T2JqZWN0U2VsZWN0ZWQpOgor
ICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUubm90aWZ5UmVz
b3VyY2VGaW5pc2hlZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnBy
b3RvdHlwZS5ub3RpZnlTZWFyY2hBY3Rpb24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVu
c2lvblNlcnZlci5wcm90b3R5cGUubm90aWZ5SW5zcGVjdGVkUGFnZUxvYWRlZCk6CisgICAgICAg
IChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5ub3RpZnlJbnNwZWN0ZWRV
UkxDaGFuZ2VkKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90
eXBlLm5vdGlmeUluc3BlY3RvclJlc2V0KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNp
b25TZXJ2ZXIucHJvdG90eXBlLl9jb252ZXJ0UmVzb3VyY2UpOgorICAgICAgICAoV2ViSW5zcGVj
dG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX3Bvc3ROb3RpZmljYXRpb24pOgorICAgICAg
ICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uU3Vic2NyaWJlKToK
KyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vblVuc3Vi
c2NyaWJlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBl
Ll9vbkNyZWF0ZVBhbmVsKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIu
cHJvdG90eXBlLl9vbkNyZWF0ZVNpZGViYXIpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVu
c2lvblNlcnZlci5wcm90b3R5cGUuX2NyZWF0ZUNsaWVudElmcmFtZSk6CisgICAgICAgIChXZWJJ
bnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25TZXRTaWRlYmFySGVpZ2h0KToK
KyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vblNldFNp
ZGViYXJFeHBhbnNpb24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5w
cm90b3R5cGUuX29uTG9nKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIu
cHJvdG90eXBlLl9vbkV2YWx1YXRlT25JbnNwZWN0ZWRQYWdlKToKKyAgICAgICAgKFdlYkluc3Bl
Y3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJvdG90eXBlLl9vblJldmVhbEFuZFNlbGVjdCk6CisgICAg
ICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlwZS5fb25SZXZlYWxBbmRT
ZWxlY3RSZXNvdXJjZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnBy
b3RvdHlwZS5fZGlzcGF0Y2hDYWxsYmFjayk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5z
aW9uU2VydmVyLnByb3RvdHlwZS5fb25HZXRSZXNvdXJjZXMpOgorICAgICAgICAoV2ViSW5zcGVj
dG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuaW5pdEV4dGVuc2lvbnMpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX2FkZEV4dGVuc2lvbnMpOgor
ICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5cGUuX29uV2luZG93
TWVzc2FnZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLnByb3RvdHlw
ZS5fb25tZXNzYWdlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5FeHRlbnNpb25TZXJ2ZXIucHJv
dG90eXBlLl9yZWdpc3RlckhhbmRsZXIpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkV4dGVuc2lv
blN0YXR1cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuYWRkRXh0ZW5zaW9ucyk6CisgICAgICAg
ICogaW5zcGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdC5qczoKKyAgICAgICAgKGluamVj
dGVkU2NyaXB0Q29uc3RydWN0b3IpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvSW5q
ZWN0ZWRTY3JpcHRBY2Nlc3MuanM6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9JbnNw
ZWN0b3JGcm9udGVuZEhvc3RTdHViLmpzOgorICAgICAgICAoLldlYkluc3BlY3Rvci5JbnNwZWN0
b3JGcm9udGVuZEhvc3RTdHViLnByb3RvdHlwZS5zZXRFeHRlbnNpb25BUEkpOgorICAgICAgICAo
LldlYkluc3BlY3Rvci5JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLnByb3RvdHlwZS5jYW5BdHRh
Y2hXaW5kb3cpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvV2ViS2l0LnFyYzoKKyAg
ICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sOgorICAgICAgICAqIGlu
c3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzOgorICAgICAgICAoV2ViSW5zcGVjdG9yLmxv
YWRlZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IudXBkYXRlUmVzb3VyY2UpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLnJlc2V0KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5pbnNwZWN0ZWRVUkxD
aGFuZ2VkKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5kaWRDb21taXRMb2FkKToKKwogMjAxMC0w
OC0wMSAgTmlrb2xhcyBaaW1tZXJtYW5uICA8bnppbW1lcm1hbm5AcmltLmNvbT4KIAogICAgICAg
ICBSZXZpZXdlZCBieSBEaXJrIFNjaHVsemUuCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNvcmUu
Z3lwaSBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDdiYmZmZTIuLjIwNDgyYmIgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBA
IC00MDU1LDYgKzQwNTUsMTAgQEAKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0Vs
ZW1lbnRzUGFuZWwuanMnLAogICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQvRWxlbWVu
dHNUcmVlT3V0bGluZS5qcycsCiAgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9FdmVu
dExpc3RlbmVyc1NpZGViYXJQYW5lLmpzJywKKyAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQt
ZW5kL0V4dGVuc2lvbkFQSS5qcycsCisgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9F
eHRlbnNpb25QYW5lbC5qcycsCisgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRl
bnNpb25SZWdpc3RyeVN0dWIuanMnLAorICAgICAgICAgICAgJ2luc3BlY3Rvci9mcm9udC1lbmQv
RXh0ZW5zaW9uU2VydmVyLmpzJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0Zv
bnRWaWV3LmpzJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0hBUkVudHJ5Lmpz
JywKICAgICAgICAgICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0hlbHBTY3JlZW4uanMnLApkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvaiBiL1dlYkNvcmUv
V2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKaW5kZXggODE3NzQ2Zi4uMzIyMjBhMCAxMDA2
NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagorKysgYi9XZWJD
b3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCkBAIC01MDkxMiw2ICs1MDkxMiwyMiBA
QAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0i
Li5caW5zcGVjdG9yXGZyb250LWVuZFxFeHRlbnNpb25BUEkuanMiDQorCQkJCQk+DQorCQkJCTwv
RmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250
LWVuZFxFeHRlbnNpb25QYW5lbC5qcyINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8Rmls
ZQ0KKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxpbnNwZWN0b3JcZnJvbnQtZW5kXEV4dGVuc2lvblJl
Z2lzdHJ5U3R1Yi5qcyINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KKwkJCQkJ
UmVsYXRpdmVQYXRoPSIuLlxpbnNwZWN0b3JcZnJvbnQtZW5kXEV4dGVuc2lvblNlcnZlci5qcyIN
CisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIu
LlxpbnNwZWN0b3JcZnJvbnQtZW5kXEZvbnRWaWV3LmpzIg0KIAkJCQkJPg0KIAkJCQk8L0ZpbGU+
DQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5jcHAg
Yi9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDb250cm9sbGVyLmNwcAppbmRleCBlMjljN2Fl
Li4zNjliNDBiIDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDb250cm9s
bGVyLmNwcAorKysgYi9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDb250cm9sbGVyLmNwcApA
QCAtNDU4LDkgKzQ1OCwxOCBAQCB2b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6Omluc3BlY3RlZFdp
bmRvd1NjcmlwdE9iamVjdENsZWFyZWQoRnJhbWUqIGZyYW1lKQogICAgIGlmIChtX2luc3BlY3Rv
ckZyb250ZW5kQ2xpZW50ICYmIGZyYW1lID09IG1faW5zcGVjdGVkUGFnZS0+bWFpbkZyYW1lKCkp
CiAgICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDbGllbnQtPndpbmRvd09iamVjdENsZWFyZWQo
KTsKIAotICAgIGlmICghZW5hYmxlZCgpIHx8ICFtX2Zyb250ZW5kIHx8IGZyYW1lICE9IG1faW5z
cGVjdGVkUGFnZS0+bWFpbkZyYW1lKCkpCisgICAgaWYgKCFlbmFibGVkKCkpCiAgICAgICAgIHJl
dHVybjsKLSAgICBtX2luamVjdGVkU2NyaXB0SG9zdC0+ZGlzY2FyZEluamVjdGVkU2NyaXB0cygp
OworCisgICAgaWYgKG1fZnJvbnRlbmQgJiYgZnJhbWUgIT0gbV9pbnNwZWN0ZWRQYWdlLT5tYWlu
RnJhbWUoKSkKKyAgICAgICAgbV9pbmplY3RlZFNjcmlwdEhvc3QtPmRpc2NhcmRJbmplY3RlZFNj
cmlwdHMoKTsKKyAgICBpZiAobV9zY3JpcHRzVG9FdmFsdWF0ZU9uTG9hZC5zaXplKCkpIHsKKyAg
ICAgICAgU2NyaXB0U3RhdGUqIHNjcmlwdFN0YXRlID0gbWFpbldvcmxkU2NyaXB0U3RhdGUoZnJh
bWUpOworICAgICAgICBmb3IgKFZlY3RvcjxTdHJpbmc+OjppdGVyYXRvciBpdCA9IG1fc2NyaXB0
c1RvRXZhbHVhdGVPbkxvYWQuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBtX3NjcmlwdHNU
b0V2YWx1YXRlT25Mb2FkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBtX2luamVjdGVkU2Ny
aXB0SG9zdC0+aW5qZWN0U2NyaXB0KCppdCwgc2NyaXB0U3RhdGUpOworICAgICAgICB9CisgICAg
fQogfQogCiB2b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6OnNldFNlYXJjaGluZ0Zvck5vZGUoYm9v
bCBlbmFibGVkKQpAQCAtODAyLDE0ICs4MTEsNiBAQCB2b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6
OmRpZENvbW1pdExvYWQoRG9jdW1lbnRMb2FkZXIqIGxvYWRlcikKICAgICBmb3IgKEZyYW1lKiBm
cmFtZSA9IGxvYWRlci0+ZnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+dHJh
dmVyc2VOZXh0KGxvYWRlci0+ZnJhbWUoKSkpCiAgICAgICAgIGlmIChSZXNvdXJjZXNNYXAqIHJl
c291cmNlTWFwID0gbV9mcmFtZVJlc291cmNlcy5nZXQoZnJhbWUpKQogICAgICAgICAgICAgcHJ1
bmVSZXNvdXJjZXMocmVzb3VyY2VNYXAsIGxvYWRlcik7Ci0KLSAgICBpZiAobV9zY3JpcHRzVG9F
dmFsdWF0ZU9uTG9hZC5zaXplKCkpIHsKLSAgICAgICAgU2NyaXB0U3RhdGUqIHNjcmlwdFN0YXRl
ID0gbWFpbldvcmxkU2NyaXB0U3RhdGUobG9hZGVyLT5mcmFtZSgpKTsKLSAgICAgICAgZm9yIChW
ZWN0b3I8U3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBtX3NjcmlwdHNUb0V2YWx1YXRlT25Mb2FkLmJl
Z2luKCk7Ci0gICAgICAgICAgICAgaXQgIT0gbV9zY3JpcHRzVG9FdmFsdWF0ZU9uTG9hZC5lbmQo
KTsgKytpdCkgewotICAgICAgICAgICAgbV9pbmplY3RlZFNjcmlwdEhvc3QtPmluamVjdFNjcmlw
dCgqaXQsIHNjcmlwdFN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KIH0KIAogdm9pZCBJbnNwZWN0
b3JDb250cm9sbGVyOjpmcmFtZURldGFjaGVkRnJvbVBhcmVudChGcmFtZSogZnJhbWUpCmRpZmYg
LS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuY3BwIGIvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNwcAppbmRleCA2OTU3ZGQxLi4w
ZGFjZGU2IDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhv
c3QuY3BwCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9zdC5jcHAK
QEAgLTE5Miw2ICsxOTIsMTQgQEAgdm9pZCBJbnNwZWN0b3JGcm9udGVuZEhvc3Q6Om1vdmVXaW5k
b3dCeShmbG9hdCB4LCBmbG9hdCB5KSBjb25zdAogICAgICAgICBtX2NsaWVudC0+bW92ZVdpbmRv
d0J5KHgsIHkpOwogfQogCit2b2lkIEluc3BlY3RvckZyb250ZW5kSG9zdDo6c2V0RXh0ZW5zaW9u
QVBJKGNvbnN0IFN0cmluZyYgc2NyaXB0KQoreworICAgIEluc3BlY3RvckNvbnRyb2xsZXIqIGlu
c3BlY3RvciA9IG1fZnJvbnRlbmRQYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCk7CisKKyAgICBp
bnNwZWN0b3ItPnJlbW92ZUFsbFNjcmlwdHNUb0V2YWx1YXRlT25Mb2FkKCk7CisgICAgaW5zcGVj
dG9yLT5hZGRTY3JpcHRUb0V2YWx1YXRlT25Mb2FkKHNjcmlwdCk7Cit9CisKIFN0cmluZyBJbnNw
ZWN0b3JGcm9udGVuZEhvc3Q6OmxvY2FsaXplZFN0cmluZ3NVUkwoKQogewogICAgIHJldHVybiBt
X2NsaWVudC0+bG9jYWxpemVkU3RyaW5nc1VSTCgpOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNw
ZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmggYi9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0
b3JGcm9udGVuZEhvc3QuaAppbmRleCA3ZmI0YTFlLi40YjM0M2ZkIDEwMDY0NAotLS0gYS9XZWJD
b3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaAorKysgYi9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaApAQCAtNjcsNiArNjcsNyBAQCBwdWJsaWM6CiAK
ICAgICB2b2lkIHNldEF0dGFjaGVkV2luZG93SGVpZ2h0KHVuc2lnbmVkIGhlaWdodCk7CiAgICAg
dm9pZCBtb3ZlV2luZG93QnkoZmxvYXQgeCwgZmxvYXQgeSkgY29uc3Q7CisgICAgdm9pZCBzZXRF
eHRlbnNpb25BUEkoY29uc3QgU3RyaW5nJiBzY3JpcHQpOwogCiAgICAgU3RyaW5nIGxvY2FsaXpl
ZFN0cmluZ3NVUkwoKTsKICAgICBTdHJpbmcgaGlkZGVuUGFuZWxzKCk7CmRpZmYgLS1naXQgYS9X
ZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaWRsIGIvV2ViQ29yZS9pbnNw
ZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmlkbAppbmRleCBkMWIzNjA0Li4wYzdjZjhiIDEw
MDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZEhvc3QuaWRsCisr
KyBiL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kSG9zdC5pZGwKQEAgLTQxLDYg
KzQxLDcgQEAgbW9kdWxlIGNvcmUgewogICAgICAgICB2b2lkIHJlcXVlc3REZXRhY2hXaW5kb3co
KTsKICAgICAgICAgdm9pZCBzZXRBdHRhY2hlZFdpbmRvd0hlaWdodChpbiB1bnNpZ25lZCBsb25n
IGhlaWdodCk7CiAgICAgICAgIHZvaWQgbW92ZVdpbmRvd0J5KGluIGZsb2F0IHgsIGluIGZsb2F0
IHkpOworICAgICAgICB2b2lkIHNldEV4dGVuc2lvbkFQSShpbiBET01TdHJpbmcgc2NyaXB0KTsK
IAogICAgICAgICBET01TdHJpbmcgbG9jYWxpemVkU3RyaW5nc1VSTCgpOwogICAgICAgICBET01T
dHJpbmcgaGlkZGVuUGFuZWxzKCk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9u
dC1lbmQvRWxlbWVudHNQYW5lbC5qcyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FbGVt
ZW50c1BhbmVsLmpzCmluZGV4IDU1N2E4YmQuLjA5YTg0ZjcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUv
aW5zcGVjdG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzCisrKyBiL1dlYkNvcmUvaW5zcGVj
dG9yL2Zyb250LWVuZC9FbGVtZW50c1BhbmVsLmpzCkBAIC01Niw4ICs1NiwxMCBAQCBXZWJJbnNw
ZWN0b3IuRWxlbWVudHNQYW5lbCA9IGZ1bmN0aW9uKCkKICAgICAgICAgdGhpcy5wYW5lbC51cGRh
dGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHRoaXMucGFuZWwudXBkYXRlRXZlbnRMaXN0ZW5lcnMo
KTsKIAotICAgICAgICBpZiAodGhpcy5fZm9jdXNlZERPTU5vZGUpCisgICAgICAgIGlmICh0aGlz
Ll9mb2N1c2VkRE9NTm9kZSkgewogICAgICAgICAgICAgSW5zcGVjdG9yQmFja2VuZC5hZGRJbnNw
ZWN0ZWROb2RlKHRoaXMuX2ZvY3VzZWRET01Ob2RlLmlkKTsKKyAgICAgICAgICAgIFdlYkluc3Bl
Y3Rvci5leHRlbnNpb25TZXJ2ZXIubm90aWZ5T2JqZWN0U2VsZWN0ZWQodGhpcy5uYW1lLCAiRE9N
Tm9kZSIpOworICAgICAgICB9CiAgICAgfTsKIAogICAgIHRoaXMuY29udGVudEVsZW1lbnQuYXBw
ZW5kQ2hpbGQodGhpcy50cmVlT3V0bGluZS5lbGVtZW50KTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
aW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25BUEkuanMgYi9XZWJDb3JlL2luc3BlY3Rvci9m
cm9udC1lbmQvRXh0ZW5zaW9uQVBJLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLjQ3NmE0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1l
bmQvRXh0ZW5zaW9uQVBJLmpzCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAq
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwordmFyIGluamVjdGVkRXh0ZW5zaW9u
QVBJID0gZnVuY3Rpb24oSW5qZWN0ZWRTY3JpcHRIb3N0LCBpbnNwZWN0ZWRXaW5kb3csIGluamVj
dGVkU2NyaXB0SWQpCit7CisKKy8vIEhlcmUgYW5kIGJlbG93LCBhbGwgY29uc3RydWN0b3JzIGFy
ZSBwcml2YXRlIHRvIEFQSSBpbXBsZW1lbnRhdGlvbi4KKy8vIEZvciBhIHB1YmxpYyB0eXBlIEZv
bywgaWYgaW50ZXJuYWwgZmllbGRzIGFyZSBwcmVzZW50LCB0aGVzZSBhcmUgb24KKy8vIGEgcHJp
dmF0ZSBGb29JbXBsIHR5cGUsIGFuIGluc3RhbmNlIG9mIEZvb0ltcGwgaXMgdXNlZCBpbiBhIGNs
b3N1cmUKKy8vIGJ5IEZvbyBjb25zdXRyY3RvciB0byByZS1iaW5kIHB1YmxpY2x5IGV4cG9ydGVk
IG1lbWJlcnMgdG8gYW4gaW5zdGFuY2UKKy8vIG9mIEZvby4KKworZnVuY3Rpb24gRXZlbnRTaW5r
SW1wbCh0eXBlKQoreworICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIHRoaXMuX2xpc3RlbmVy
cyA9IFtdOworfQorCitFdmVudFNpbmtJbXBsLnByb3RvdHlwZSA9IHsKKyAgICBhZGRMaXN0ZW5l
cjogZnVuY3Rpb24oY2FsbGJhY2spCisgICAgeworICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJz
Lmxlbmd0aCA9PT0gMCkKKyAgICAgICAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7
IGNvbW1hbmQ6ICJzdWJzY3JpYmUiLCB0eXBlOiB0aGlzLl90eXBlIH0pOworICAgICAgICB0aGlz
Ll9saXN0ZW5lcnMucHVzaChjYWxsYmFjayk7CisgICAgICAgIGV4dGVuc2lvblNlcnZlci5yZWdp
c3RlckhhbmRsZXIoIm5vdGlmeS0iICsgdGhpcy5fdHlwZSwgYmluZCh0aGlzLl9maXJlLCB0aGlz
KSk7CisgICAgfSwKKworICAgIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbihjYWxsYmFjaykKKyAg
ICB7CisgICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CisKKyAgICAgICAg
Zm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAg
IGlmIChsaXN0ZW5lcnNbaV0gPT09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgbGlzdGVu
ZXJzLnNwbGljZShpLCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkKKyAg
ICAgICAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJ1bnN1YnNj
cmliZSIsIHR5cGU6IHRoaXMuX3R5cGUgfSk7CisgICAgfSwKKworICAgIF9maXJlOiBmdW5jdGlv
bihyZXF1ZXN0KQorICAgIHsKKyAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVy
cy5zbGljZSgpOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7
ICsraSkKKyAgICAgICAgICAgIGxpc3RlbmVyc1tpXS5hcHBseShudWxsLCByZXF1ZXN0LmFyZ3Vt
ZW50cyk7CisgICAgfQorfQorCitmdW5jdGlvbiBFdmVudFNpbmsodHlwZSkKK3sKKyAgICB2YXIg
aW1wbCA9IG5ldyBFdmVudFNpbmtJbXBsKHR5cGUpOworICAgIHRoaXMuYWRkTGlzdGVuZXIgPSBi
aW5kKGltcGwuYWRkTGlzdGVuZXIsIGltcGwpOworICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIgPSBi
aW5kKGltcGwucmVtb3ZlTGlzdGVuZXIsIGltcGwpOworfQorCitmdW5jdGlvbiBJbnNwZWN0b3JF
eHRlbnNpb25BUEkoKQoreworICAgIHRoaXMuaW5zcGVjdGVkV2luZG93ID0gbmV3IEluc3BlY3Rl
ZFdpbmRvdygpOworICAgIHRoaXMucGFuZWxzID0gbmV3IFBhbmVscygpOworICAgIHRoaXMucmVz
b3VyY2VzID0gbmV3IFJlc291cmNlcygpOworICAgIHRoaXMub25SZXNldCA9IG5ldyBFdmVudFNp
bmsoInJlc2V0Iik7Cit9CisKK0luc3BlY3RvckV4dGVuc2lvbkFQSS5wcm90b3R5cGUgPSB7Cisg
ICAgbG9nOiBmdW5jdGlvbihtZXNzYWdlKQorICAgIHsKKyAgICAgICAgZXh0ZW5zaW9uU2VydmVy
LnNlbmRSZXF1ZXN0KHsgY29tbWFuZDogImxvZyIsIG1lc3NhZ2U6IG1lc3NhZ2UgfSk7CisgICAg
fQorfQorCitmdW5jdGlvbiBSZXNvdXJjZXMoKQoreworICAgIHRoaXMub25GaW5pc2hlZCA9IG5l
dyBFdmVudFNpbmsoInJlc291cmNlLWZpbmlzaGVkIik7Cit9CisKK1Jlc291cmNlcy5wcm90b3R5
cGUgPSB7CisgICAgZ2V0QWxsOiBmdW5jdGlvbihjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJl
dHVybiBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21tYW5kOiAiZ2V0UmVzb3VyY2Vz
IiB9LCBjYWxsYmFjayk7CisgICAgfSwKKworICAgIGdldDogZnVuY3Rpb24oaWQsIGNhbGxiYWNr
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7IGNv
bW1hbmQ6ICJnZXRSZXNvdXJjZXMiLCBpZDogaWQgfSwgY2FsbGJhY2spOworICAgIH0KK30KKwor
dmFyIHdlbGxLbm93blBhbmVsTmFtZXMgPSBbCisgICAgImVsZW1lbnRzIiwKKyAgICAic2NyaXB0
cyIKK107CisKK2Z1bmN0aW9uIFBhbmVscygpCit7CisgICAgdmFyIHBhbmVscyA9IFtdOworICAg
IGZ1bmN0aW9uIHBhbmVsR2V0dGVyKG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gcGFuZWxz
W25hbWVdOworICAgIH0KKyAgICAKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdlbGxLbm93blBh
bmVsTmFtZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgdmFyIG5hbWUgPSB3ZWxsS25vd25QYW5l
bE5hbWVzW2ldOworICAgICAgICBwYW5lbHNbbmFtZV0gPSBuZXcgUGFuZWwobmFtZSk7CisgICAg
ICAgIHRoaXMuX19kZWZpbmVHZXR0ZXJfXyhuYW1lLCBiaW5kKHBhbmVsR2V0dGVyLCBudWxsLCBu
YW1lKSk7CisgICAgfQorfQorCitQYW5lbHMucHJvdG90eXBlID0geworICAgIGNyZWF0ZTogZnVu
Y3Rpb24obGFiZWwsIHBhZ2VVUkwsIGljb25VUkwsIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAg
dmFyIGlkID0gImV4dGVuc2lvbi1wYW5lbC0iICsgZXh0ZW5zaW9uU2VydmVyLm5leHRPYmplY3RJ
ZCgpOworICAgICAgICBmdW5jdGlvbiBjYWxsYmFja1dyYXBwZXIocmVzdWx0KQorICAgICAgICB7
CisgICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyb3IpCisgICAgICAgICAgICAgICAgY2FsbGJh
Y2socmVzdWx0KTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHBhbmVsID0g
bmV3IEV4dGVuc2lvblBhbmVsKGlkKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhwYW5lbCk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmFyIHJlcXVlc3QgPSB7CisgICAg
ICAgICAgICBjb21tYW5kOiAiY3JlYXRlUGFuZWwiLAorICAgICAgICAgICAgaWQ6IGlkLAorICAg
ICAgICAgICAgbGFiZWw6IGxhYmVsLAorICAgICAgICAgICAgdXJsOiBleHBhbmRVUkwocGFnZVVS
TCksCisgICAgICAgICAgICBpY29uOiBleHBhbmRVUkwoaWNvblVSTCkgCisgICAgICAgIH07Cisg
ICAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdChyZXF1ZXN0LCBjYWxsYmFjayAmJiBi
aW5kKGNhbGxiYWNrV3JhcHBlciwgdGhpcykpOworICAgIH0KK30KKworZnVuY3Rpb24gUGFuZWxJ
bXBsKGlkKQoreworICAgIHRoaXMuX2lkID0gaWQ7CisgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5n
ZWQgPSBuZXcgRXZlbnRTaW5rKCJwYW5lbC1vYmplY3RTZWxlY3RlZC0iICsgaWQpOworfQorCitQ
YW5lbEltcGwucHJvdG90eXBlID0geworICAgIGNyZWF0ZVNpZGViYXJQYW5lOiBmdW5jdGlvbih0
aXRsZSwgdXJsLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHZhciBpZCA9ICJleHRlbnNpb24t
c2lkZWJhci0iICsgZXh0ZW5zaW9uU2VydmVyLm5leHRPYmplY3RJZCgpOworICAgICAgICBmdW5j
dGlvbiBjYWxsYmFja1dyYXBwZXIocmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAo
cmVzdWx0LmlzRXJyb3IpCisgICAgICAgICAgICAgICAgY2FsbGJhY2socmVzdWx0KTsKKyAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXh0ZW5zaW9uU2lkZWJh
clBhbmUoaWQpKTsKKyAgICAgICAgfQorICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVl
c3QoeyBjb21tYW5kOiAiY3JlYXRlU2lkZWJhclBhbmUiLCBwYW5lbDogdGhpcy5faWQsIGlkOiBp
ZCwgdGl0bGU6IHRpdGxlLCB1cmw6IGV4cGFuZFVSTCh1cmwpIH0sIGNhbGxiYWNrICYmIGNhbGxi
YWNrV3JhcHBlcik7CisgICAgfQorfQorCitmdW5jdGlvbiBQYW5lbChpZCkKK3sKKyAgICB2YXIg
aW1wbCA9IG5ldyBQYW5lbEltcGwoaWQpOworICAgIHRoaXMuY3JlYXRlU2lkZWJhclBhbmUgPSBi
aW5kKGltcGwuY3JlYXRlU2lkZWJhclBhbmUsIGltcGwpOworfQorCitmdW5jdGlvbiBFeHRlbnNp
b25QYW5lbChpZCkKK3sKKyAgICBQYW5lbC5jYWxsKHRoaXMsIGlkKTsKKyAgICB0aGlzLm9uU2Vh
cmNoID0gbmV3IEV2ZW50U2luaygicGFuZWwtc2VhcmNoLSIgKyBpZCk7Cit9CisKK0V4dGVuc2lv
blBhbmVsLnByb3RvdHlwZSA9IHsKK30KKworRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlLl9fcHJv
dG9fXyA9IFBhbmVsLnByb3RvdHlwZTsKKworZnVuY3Rpb24gRXh0ZW5zaW9uU2lkZWJhclBhbmVJ
bXBsKGlkKQoreworICAgIHRoaXMuX2lkID0gaWQ7Cit9CisKK0V4dGVuc2lvblNpZGViYXJQYW5l
SW1wbC5wcm90b3R5cGUgPSB7CisgICAgc2V0SGVpZ2h0OiBmdW5jdGlvbihoZWlnaHQpCisgICAg
eworICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21tYW5kOiAic2V0U2lk
ZWJhckhlaWdodCIsIGlkOiB0aGlzLl9pZCwgaGVpZ2h0OiBoZWlnaHQgfSk7CisgICAgfSwKKwor
ICAgIHNldEV4cGFuZGVkOiBmdW5jdGlvbihleHBhbmRlZCkKKyAgICB7CisgICAgICAgIGV4dGVu
c2lvblNlcnZlci5zZW5kUmVxdWVzdCh7IGNvbW1hbmQ6ICJzZXRTaWRlYmFyRXhwYW5kZWQiLCBp
ZDogdGhpcy5faWQsIGV4cGFuZGVkOiBleHBhbmRlZCB9KTsKKyAgICB9Cit9CisKK2Z1bmN0aW9u
IEV4dGVuc2lvblNpZGViYXJQYW5lKGlkKQoreworICAgIHZhciBpbXBsID0gbmV3IEV4dGVuc2lv
blNpZGViYXJQYW5lSW1wbChpZCk7CisgICAgdGhpcy5zZXRIZWlnaHQgPSBiaW5kKGltcGwuc2V0
SGVpZ2h0LCBpbXBsKTsKKyAgICB0aGlzLnNldEV4cGFuZGVkID0gYmluZChpbXBsLnNldEV4cGFu
ZGVkLCBpbXBsKTsKK30KKworZnVuY3Rpb24gSW5zcGVjdGVkV2luZG93KCkKK3sKKyAgICB0aGlz
Lm9uTG9hZGVkID0gbmV3IEV2ZW50U2luaygiaW5zcGVjdGVkUGFnZUxvYWRlZCIpOworICAgIHRo
aXMub25OYXZpZ2F0ZWQgPSBuZXcgRXZlbnRTaW5rKCJpbnNwZWN0ZWRVUkxDaGFuZ2VkIik7Cisg
ICAgdGhpcy5vbkRPTUNvbnRlbnRMb2FkZWQgPSBuZXcgRXZlbnRTaW5rKCJET01Db250ZW50TG9h
ZGVkIik7Cit9CisKK0luc3BlY3RlZFdpbmRvdy5wcm90b3R5cGUgPSB7CisgICAgcmVsb2FkOiBm
dW5jdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1
ZXN0KHsgY29tbWFuZDogInJlbG9hZCIgfSk7CisgICAgfSwKKworICAgIGV2YWx1YXRlOiBmdW5j
dGlvbihleHByZXNzaW9uLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBleHRlbnNp
b25TZXJ2ZXIuc2VuZFJlcXVlc3QoeyBjb21tYW5kOiAiZXZhbHVhdGVPbkluc3BlY3RlZFBhZ2Ui
LCBleHByZXNzaW9uOiBleHByZXNzaW9uIH0sIGNhbGxiYWNrKTsKKyAgICB9Cit9CisKK2Z1bmN0
aW9uIEV4dGVuc2lvblNlcnZlckNsaWVudCgpCit7CisgICAgdGhpcy5fY2FsbGJhY2tzID0ge307
CisgICAgdGhpcy5faGFuZGxlcnMgPSB7fTsKKyAgICB0aGlzLl9sYXN0UmVxdWVzdElkID0gMDsK
KyAgICB0aGlzLl9sYXN0T2JqZWN0SWQgPSAwOworCisgICAgdGhpcy5yZWdpc3RlckhhbmRsZXIo
ImNhbGxiYWNrIiwgYmluZCh0aGlzLl9vbkNhbGxiYWNrLCB0aGlzKSk7CisKKyAgICB2YXIgY2hh
bm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOworICAgIHRoaXMuX3BvcnQgPSBjaGFubmVsLnBv
cnQxOworICAgIHRoaXMuX3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIGJpbmQodGhp
cy5fb25NZXNzYWdlLCB0aGlzKSwgZmFsc2UpOworICAgIHRoaXMuX3BvcnQuc3RhcnQoKTsKKwor
ICAgIHRvcC5wb3N0TWVzc2FnZSgicmVnaXN0ZXJFeHRlbnNpb24iLCBbIGNoYW5uZWwucG9ydDIg
XSwgIioiKTsKK30KKworRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZSA9IHsKKyAgICBz
ZW5kUmVxdWVzdDogZnVuY3Rpb24obWVzc2FnZSwgY2FsbGJhY2spCisgICAgeworICAgICAgICBp
ZiAodHlwZW9mIGNhbGxiYWNrID09PSAiZnVuY3Rpb24iKQorICAgICAgICAgICAgbWVzc2FnZS5y
ZXF1ZXN0SWQgPSB0aGlzLl9yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICAgICAgcmV0
dXJuIHRoaXMuX3BvcnQucG9zdE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfSwKKworICAgIHJlZ2lz
dGVySGFuZGxlcjogZnVuY3Rpb24oY29tbWFuZCwgaGFuZGxlcikKKyAgICB7CisgICAgICAgIHRo
aXMuX2hhbmRsZXJzW2NvbW1hbmRdID0gaGFuZGxlcjsKKyAgICB9LAorCisgICAgbmV4dE9iamVj
dElkOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gaW5qZWN0ZWRTY3JpcHRJZCAr
ICJfIiArICsrdGhpcy5fbGFzdE9iamVjdElkOworICAgIH0sCisKKyAgICBfcmVnaXN0ZXJDYWxs
YmFjazogZnVuY3Rpb24oY2FsbGJhY2spCisgICAgeworICAgICAgICB2YXIgaWQgPSArK3RoaXMu
X2xhc3RSZXF1ZXN0SWQ7CisgICAgICAgIHRoaXMuX2NhbGxiYWNrc1tpZF0gPSBjYWxsYmFjazsK
KyAgICAgICAgcmV0dXJuIGlkOworICAgIH0sCisKKyAgICBfb25DYWxsYmFjazogZnVuY3Rpb24o
cmVxdWVzdCkKKyAgICB7CisgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3RJZCBpbiB0aGlzLl9j
YWxsYmFja3MpIHsKKyAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrc1tyZXF1ZXN0LnJlcXVlc3RJ
ZF0ocmVxdWVzdC5yZXN1bHQpOworICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1ty
ZXF1ZXN0LnJlcXVlc3RJZF07CisgICAgICAgIH0KKyAgICB9LAorCisgICAgX29uTWVzc2FnZTog
ZnVuY3Rpb24oZXZlbnQpCisgICAgeworICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LmRhdGE7
CisgICAgICAgIHZhciBoYW5kbGVyID0gdGhpcy5faGFuZGxlcnNbcmVxdWVzdC5jb21tYW5kXTsK
KyAgICAgICAgaWYgKGhhbmRsZXIpCisgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgcmVx
dWVzdCk7CisgICAgfQorfQorCitmdW5jdGlvbiBleHBhbmRVUkwodXJsKQoreworICAgIGlmICgh
dXJsKQorICAgICAgICByZXR1cm4gdXJsOworICAgIGlmICgvXlteL10rOi8uZXhlYyh1cmwpKSAv
LyBTZWUgaWYgdXJsIGhhcyBzY2hlbWEuCisgICAgICAgIHJldHVybiB1cmw7CisgICAgdmFyIGJh
c2VVUkwgPSBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyBsb2NhdGlvbi5ob3N0bmFtZSArIGxv
Y2F0aW9uLnBvcnQ7CisgICAgaWYgKC9eXC8vLmV4ZWModXJsKSkKKyAgICAgICAgcmV0dXJuIGJh
c2VVUkwgKyB1cmw7CisgICAgcmV0dXJuIGJhc2VVUkwgKyBsb2NhdGlvbi5wYXRobmFtZS5yZXBs
YWNlKC9cL1teL10qJC8sIi8iKSArIHVybDsKK30KKworZnVuY3Rpb24gYmluZChmdW5jLCB0aGlz
T2JqZWN0KQoreworICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJn
dW1lbnRzLCAyKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBmdW5jLmFwcGx5KHRo
aXNPYmplY3QsIGFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50
cywgMCkpKTsgfTsKK30KKwordmFyIGV4dGVuc2lvblNlcnZlciA9IG5ldyBFeHRlbnNpb25TZXJ2
ZXJDbGllbnQoKTsKKword2ViSW5zcGVjdG9yID0gbmV3IEluc3BlY3RvckV4dGVuc2lvbkFQSSgp
OworCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9u
UGFuZWwuanMgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUGFuZWwuanMK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1ZmE4ZQotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25QYW5lbC5qcwpAQCAt
MCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBt
ZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICog
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblBhbmVsID0gZnVuY3Rpb24oaWQsIGxh
YmVsLCBpY29uVVJMLCBvcHRpb25zKQoreworICAgIHRoaXMudG9vbGJhckl0ZW1MYWJlbCA9IGxh
YmVsOworICAgIHRoaXMuX2FkZFN0eWxlUnVsZSgiLnRvb2xiYXItaXRlbS4iICsgaWQgKyAiIC50
b29sYmFyLWljb24iLCAiYmFja2dyb3VuZC1pbWFnZTogdXJsKCIgKyBpY29uVVJMICsgIik7Iik7
CisgICAgV2ViSW5zcGVjdG9yLlBhbmVsLmNhbGwodGhpcywgaWQpOworfQorCitXZWJJbnNwZWN0
b3IuRXh0ZW5zaW9uUGFuZWwucHJvdG90eXBlID0geworICAgIGdldCBkZWZhdWx0Rm9jdXNlZEVs
ZW1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhclRyZWVFbGVtZW50IHx8
IHRoaXMuZWxlbWVudDsKKyAgICB9LAorCisgICAgdXBkYXRlTWFpblZpZXdXaWR0aDogZnVuY3Rp
b24od2lkdGgpCisgICAgeworICAgICAgICB0aGlzLmJvZHlFbGVtZW50LnN0eWxlLmxlZnQgPSB3
aWR0aCArICJweCI7CisgICAgICAgIHRoaXMucmVzaXplKCk7CisgICAgfSwKKworICAgIHNlYXJj
aENhbmNlbGVkOiBmdW5jdGlvbihzdGFydGluZ05ld1NlYXJjaCkKKyAgICB7CisgICAgICAgIFdl
Ykluc3BlY3Rvci5leHRlbnNpb25TZXJ2ZXIubm90aWZ5U2VhcmNoQWN0aW9uKHRoaXMuX2lkLCAi
Y2FuY2VsU2VhcmNoIik7CisgICAgICAgIFdlYkluc3BlY3Rvci5QYW5lbC5wcm90b3R5cGUuc2Vh
cmNoQ2FuY2VsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9LAorCisgICAgcGVyZm9y
bVNlYXJjaDogZnVuY3Rpb24ocXVlcnkpCisgICAgeworICAgICAgICBXZWJJbnNwZWN0b3IuZXh0
ZW5zaW9uU2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCwgInBlcmZvcm1TZWFyY2gi
LCBxdWVyeSk7CisgICAgICAgIFdlYkluc3BlY3Rvci5QYW5lbC5wcm90b3R5cGUucGVyZm9ybVNl
YXJjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICBqdW1wVG9OZXh0U2Vh
cmNoUmVzdWx0OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBXZWJJbnNwZWN0b3IuZXh0ZW5z
aW9uU2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCwgIm5leHRTZWFyY2hSZXN1bHQi
KTsKKyAgICAgICAgV2ViSW5zcGVjdG9yLlBhbmVsLnByb3RvdHlwZS5qdW1wVG9OZXh0U2VhcmNo
UmVzdWx0LmNhbGwodGhpcyk7CisgICAgfSwKKworICAgIGp1bXBUb1ByZXZpb3VzU2VhcmNoUmVz
dWx0OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBXZWJJbnNwZWN0b3IuZXh0ZW5zaW9uU2Vy
dmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCwgInByZXZpb3VzU2VhcmNoUmVzdWx0Iik7
CisgICAgICAgIFdlYkluc3BlY3Rvci5QYW5lbC5wcm90b3R5cGUuanVtcFRvUHJldmlvdXNTZWFy
Y2hSZXN1bHQuY2FsbCh0aGlzKTsKKyAgICB9LAorCisgICAgX2FkZFN0eWxlUnVsZTogZnVuY3Rp
b24oc2VsZWN0b3IsIGJvZHkpCisgICAgeworICAgICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCJzdHlsZSIpOworICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHNlbGVj
dG9yICsgIiB7ICIgKyBib2R5ICsgIiB9IjsKKyAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRD
aGlsZChzdHlsZSk7CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwucHJv
dG90eXBlLl9fcHJvdG9fXyA9IFdlYkluc3BlY3Rvci5QYW5lbC5wcm90b3R5cGU7CmRpZmYgLS1n
aXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRXh0ZW5zaW9uUmVnaXN0cnlTdHViLmpz
IGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5qcwpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWM5NmVmCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5q
cwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworaWYgKCF3aW5kb3cuSW5zcGVjdG9yRXh0ZW5zaW9uUmVnaXN0cnkp
IHsKKworV2ViSW5zcGVjdG9yLkluc3BlY3RvckV4dGVuc2lvblJlZ2lzdHJ5U3R1YiA9IGZ1bmN0
aW9uKCkKK3sKK30KKworV2ViSW5zcGVjdG9yLkluc3BlY3RvckV4dGVuc2lvblJlZ2lzdHJ5U3R1
Yi5wcm90b3R5cGUgPSB7CisgICAgZ2V0RXh0ZW5zaW9uc0FzeW5jOiBmdW5jdGlvbigpCisgICAg
eworICAgIH0KK307CisKK0luc3BlY3RvckV4dGVuc2lvblJlZ2lzdHJ5ID0gbmV3IFdlYkluc3Bl
Y3Rvci5JbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeVN0dWIoKTsKKworfQpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0V4dGVuc2lvblNlcnZlci5qcyBiL1dlYkNvcmUv
aW5zcGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25TZXJ2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uMmQyZWFiMQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvaW5z
cGVjdG9yL2Zyb250LWVuZC9FeHRlbnNpb25TZXJ2ZXIuanMKQEAgLTAsMCArMSwzMTkgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICog
ZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVS
IE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAq
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitXZWJJ
bnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyID0gZnVuY3Rpb24oKQoreworICAgIHRoaXMuX2NsaWVu
dE9iamVjdHMgPSB7fTsKKyAgICB0aGlzLl9oYW5kbGVycyA9IHt9OworICAgIHRoaXMuX3N1YnNj
cmliZXJzID0ge307CisgICAgdGhpcy5fc3RhdHVzID0gbmV3IFdlYkluc3BlY3Rvci5FeHRlbnNp
b25TdGF0dXMoKTsKKworICAgIHRoaXMuX3JlZ2lzdGVySGFuZGxlcigic3Vic2NyaWJlIiwgdGhp
cy5fb25TdWJzY3JpYmUuYmluZCh0aGlzKSk7CisgICAgdGhpcy5fcmVnaXN0ZXJIYW5kbGVyKCJ1
bnN1YnNjcmliZSIsIHRoaXMuX29uVW5zdWJzY3JpYmUuYmluZCh0aGlzKSk7CisgICAgdGhpcy5f
cmVnaXN0ZXJIYW5kbGVyKCJnZXRSZXNvdXJjZXMiLCB0aGlzLl9vbkdldFJlc291cmNlcy5iaW5k
KHRoaXMpKTsKKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoImNyZWF0ZVBhbmVsIiwgdGhpcy5f
b25DcmVhdGVQYW5lbC5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoImNy
ZWF0ZVNpZGViYXJQYW5lIiwgdGhpcy5fb25DcmVhdGVTaWRlYmFyLmJpbmQodGhpcykpOworICAg
IHRoaXMuX3JlZ2lzdGVySGFuZGxlcigibG9nIiwgdGhpcy5fb25Mb2cuYmluZCh0aGlzKSk7IAor
ICAgIHRoaXMuX3JlZ2lzdGVySGFuZGxlcigiZXZhbHVhdGVPbkluc3BlY3RlZFBhZ2UiLCB0aGlz
Ll9vbkV2YWx1YXRlT25JbnNwZWN0ZWRQYWdlLmJpbmQodGhpcykpOworICAgIHRoaXMuX3JlZ2lz
dGVySGFuZGxlcigic2V0U2lkZWJhckhlaWdodCIsIHRoaXMuX29uU2V0U2lkZWJhckhlaWdodC5i
aW5kKHRoaXMpKTsKKyAgICB0aGlzLl9yZWdpc3RlckhhbmRsZXIoInNldFNpZGViYXJFeHBhbmRl
ZCIsIHRoaXMuX29uU2V0U2lkZWJhckV4cGFuc2lvbi5iaW5kKHRoaXMpKTsKKworICAgIHdpbmRv
dy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy5fb25XaW5kb3dNZXNzYWdlLmJpbmQo
dGhpcyksIGZhbHNlKTsKK30KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblNlcnZlci5wcm90b3R5
cGUgPSB7CisgICAgbm90aWZ5UGFuZWxTaG93bjogZnVuY3Rpb24ocGFuZWxOYW1lKQorICAgIHsK
KyAgICAgICAgdGhpcy5fcG9zdE5vdGlmaWNhdGlvbigicGFuZWwtc2hvd24tIiArIHBhbmVsTmFt
ZSk7CisgICAgfSwKKworICAgIG5vdGlmeU9iamVjdFNlbGVjdGVkOiBmdW5jdGlvbihwYW5lbElk
LCBvYmplY3RUeXBlLCBvYmplY3RJZCkKKyAgICB7CisgICAgICAgIHRoaXMuX3Bvc3ROb3RpZmlj
YXRpb24oInBhbmVsLW9iamVjdFNlbGVjdGVkLSIgKyBwYW5lbElkLCBvYmplY3RUeXBlLCBvYmpl
Y3RJZCk7CisgICAgfSwKKworICAgIG5vdGlmeVJlc291cmNlRmluaXNoZWQ6IGZ1bmN0aW9uKHJl
c291cmNlKQorICAgIHsKKyAgICAgICAgdGhpcy5fcG9zdE5vdGlmaWNhdGlvbigicmVzb3VyY2Ut
ZmluaXNoZWQiLCB0aGlzLl9jb252ZXJ0UmVzb3VyY2UocmVzb3VyY2UpKTsKKyAgICB9LAorCisg
ICAgbm90aWZ5U2VhcmNoQWN0aW9uOiBmdW5jdGlvbihwYW5lbElkLCBhY3Rpb24sIHNlYXJjaFN0
cmluZykKKyAgICB7CisgICAgICAgIHRoaXMuX3Bvc3ROb3RpZmljYXRpb24oInBhbmVsLXNlYXJj
aC0iICsgcGFuZWxJZCwgYWN0aW9uLCBzZWFyY2hTdHJpbmcpOworICAgIH0sCisKKyAgICBub3Rp
ZnlJbnNwZWN0ZWRQYWdlTG9hZGVkOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9w
b3N0Tm90aWZpY2F0aW9uKCJpbnNwZWN0ZWRQYWdlTG9hZGVkIik7CisgICAgfSwKKworICAgIG5v
dGlmeUluc3BlY3RlZFVSTENoYW5nZWQ6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMu
X3Bvc3ROb3RpZmljYXRpb24oImluc3BlY3RlZFVSTENoYW5nZWQiKTsKKyAgICB9LAorCisgICAg
bm90aWZ5SW5zcGVjdG9yUmVzZXQ6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMuX3Bv
c3ROb3RpZmljYXRpb24oInJlc2V0Iik7CisgICAgfSwKKworICAgIF9jb252ZXJ0UmVzb3VyY2U6
IGZ1bmN0aW9uKHJlc291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAg
IGlkOiByZXNvdXJjZS5pZGVudGlmaWVyLAorICAgICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlw
ZSwKKyAgICAgICAgICAgIGhhcjogKG5ldyBXZWJJbnNwZWN0b3IuSEFSRW50cnkocmVzb3VyY2Up
KS5idWlsZCgpLAorICAgICAgICB9OworICAgIH0sCisKKyAgICBfcG9zdE5vdGlmaWNhdGlvbjog
ZnVuY3Rpb24odHlwZSwgZGV0YWlscykKKyAgICB7CisgICAgICAgIHZhciBzdWJzY3JpYmVycyA9
IHRoaXMuX3N1YnNjcmliZXJzW3R5cGVdOworICAgICAgICBpZiAoIXN1YnNjcmliZXJzKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB2YXIgbWVzc2FnZSA9IHsKKyAgICAgICAgICAgIGNv
bW1hbmQ6ICJub3RpZnktIiArIHR5cGUsCisgICAgICAgICAgICBhcmd1bWVudHM6IEFycmF5LnBy
b3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgCisgICAgICAgIH07CisgICAgICAgIGZv
ciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBz
dWJzY3JpYmVyc1tpXS5wb3N0TWVzc2FnZShtZXNzYWdlKTsKKyAgICB9LAorCisgICAgX29uU3Vi
c2NyaWJlOiBmdW5jdGlvbihtZXNzYWdlLCBwb3J0KQorICAgIHsKKyAgICAgICAgdmFyIHN1YnNj
cmliZXJzID0gdGhpcy5fc3Vic2NyaWJlcnNbbWVzc2FnZS50eXBlXTsKKyAgICAgICAgaWYgKHN1
YnNjcmliZXJzKQorICAgICAgICAgICAgc3Vic2NyaWJlcnMucHVzaChwb3J0KTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlcnNbbWVzc2FnZS50eXBlXSA9IFsgcG9y
dCBdOworICAgIH0sCisKKyAgICBfb25VbnN1YnNjcmliZTogZnVuY3Rpb24obWVzc2FnZSwgcG9y
dCkKKyAgICB7CisgICAgICAgIHZhciBzdWJzY3JpYmVycyA9IHRoaXMuX3N1YnNjcmliZXJzW21l
c3NhZ2UudHlwZV07CisgICAgICAgIGlmICghc3Vic2NyaWJlcnMpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIHN1YnNjcmliZXJzLnJlbW92ZShwb3J0KTsKKyAgICAgICAgaWYgKCFzdWJz
Y3JpYmVycy5sZW5ndGgpCisgICAgICAgICAgICBkZWxldGUgdGhpcy5fc3Vic2NyaWJlcnNbbWVz
c2FnZS50eXBlXTsKKyAgICB9LAorCisgICAgX29uQ3JlYXRlUGFuZWw6IGZ1bmN0aW9uKG1lc3Nh
Z2UsIHBvcnQpCisgICAgeworICAgICAgICB2YXIgaWQgPSBtZXNzYWdlLmlkOworICAgICAgICAv
LyBUaGUgaWRzIGFyZSBnZW5lcmF0ZWQgb24gdGhlIGNsaWVudCBBUEkgc2lkZSBhbmQgbXVzdCBi
ZSB1bmlxdWUsIHNvIHRoZSBjaGVjayBiZWxvdworICAgICAgICAvLyBzaG91bGRuJ3QgYmUgaGl0
IHVubGVzcyBzb21lb25lIGlzIGJ5cGFzc2luZyB0aGUgQVBJLgorICAgICAgICBpZiAoaWQgaW4g
dGhpcy5fY2xpZW50T2JqZWN0cyB8fCBpZCBpbiBXZWJJbnNwZWN0b3IucGFuZWxzKQorICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cy5FX0VYSVNUUyhpZCk7CisgICAgICAgIHZhciBwYW5l
bCA9IG5ldyBXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uUGFuZWwoaWQsIG1lc3NhZ2UubGFiZWwsIG1l
c3NhZ2UuaWNvbik7CisgICAgICAgIHRoaXMuX2NsaWVudE9iamVjdHNbaWRdID0gcGFuZWw7CisK
KyAgICAgICAgdmFyIHRvb2xiYXJFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRv
b2xiYXIiKTsKKyAgICAgICAgdmFyIGxhc3RUb29sYmFySXRlbSA9IFdlYkluc3BlY3Rvci5wYW5l
bE9yZGVyW1dlYkluc3BlY3Rvci5wYW5lbE9yZGVyLmxlbmd0aCAtIDFdLnRvb2xiYXJJdGVtOwor
ICAgICAgICBXZWJJbnNwZWN0b3IuYWRkUGFuZWxUb29sYmFySWNvbih0b29sYmFyRWxlbWVudCwg
cGFuZWwsIGxhc3RUb29sYmFySXRlbSk7CisgICAgICAgIFdlYkluc3BlY3Rvci5wYW5lbHNbaWRd
ID0gcGFuZWw7CisgICAgICAgIHRoaXMuX2NyZWF0ZUNsaWVudElmcmFtZShwYW5lbC5lbGVtZW50
LCBtZXNzYWdlLnVybCk7CisgICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXMuT0soKTsKKyAgICB9
LAorCisgICAgX29uQ3JlYXRlU2lkZWJhcjogZnVuY3Rpb24obWVzc2FnZSwgcG9ydCkKKyAgICB7
CisgICAgICAgIHZhciBwYW5lbCA9IFdlYkluc3BlY3Rvci5wYW5lbHNbbWVzc2FnZS5wYW5lbF07
CisgICAgICAgIGlmICghcGFuZWwpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzLkVf
Tk9URk9VTkQobWVzc2FnZS5wYW5lbCk7CisgICAgICAgIGlmICghcGFuZWwuc2lkZWJhckVsZW1l
bnQgfHwgIXBhbmVsLnNpZGViYXJQYW5lcykKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0
dXMuRV9OT1RTVVBQT1JURUQoKTsKKyAgICAgICAgdmFyIGlkID0gbWVzc2FnZS5pZDsKKyAgICAg
ICAgdmFyIHNpZGViYXIgPSBuZXcgV2ViSW5zcGVjdG9yLlNpZGViYXJQYW5lKG1lc3NhZ2UudGl0
bGUpOworICAgICAgICB0aGlzLl9jbGllbnRPYmplY3RzW2lkXSA9IHNpZGViYXI7CisgICAgICAg
IHBhbmVsLnNpZGViYXJQYW5lc1tpZF0gPSBzaWRlYmFyOworICAgICAgICBwYW5lbC5zaWRlYmFy
RWxlbWVudC5hcHBlbmRDaGlsZChzaWRlYmFyLmVsZW1lbnQpOworICAgICAgICB0aGlzLl9jcmVh
dGVDbGllbnRJZnJhbWUoc2lkZWJhci5ib2R5RWxlbWVudCwgbWVzc2FnZS51cmwpOworICAgICAg
ICByZXR1cm4gdGhpcy5fc3RhdHVzLk9LKCk7CisgICAgfSwKKworICAgIF9jcmVhdGVDbGllbnRJ
ZnJhbWU6IGZ1bmN0aW9uKHBhcmVudCwgdXJsLCByZXF1ZXN0SWQsIHBvcnQpCisgICAgeworICAg
ICAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CisgICAg
ICAgIGlmcmFtZS5zcmMgPSB1cmw7CisgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9ICIxMDAl
IjsKKyAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGlmcmFtZSk7CisgICAgfSwKKworICAgIF9v
blNldFNpZGViYXJIZWlnaHQ6IGZ1bmN0aW9uKG1lc3NhZ2UpCisgICAgeworICAgICAgICB2YXIg
c2lkZWJhciA9IHRoaXMuX2NsaWVudE9iamVjdHNbbWVzc2FnZS5pZF07CisgICAgICAgIGlmICgh
c2lkZWJhcikKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXMuRV9OT1RGT1VORChtZXNz
YWdlLmlkKTsKKyAgICAgICAgc2lkZWJhci5ib2R5RWxlbWVudC5maXJzdENoaWxkLnN0eWxlLmhl
aWdodCA9IG1lc3NhZ2UuaGVpZ2h0OworICAgIH0sCisKKyAgICBfb25TZXRTaWRlYmFyRXhwYW5z
aW9uOiBmdW5jdGlvbihtZXNzYWdlKQorICAgIHsKKyAgICAgICAgdmFyIHNpZGViYXIgPSB0aGlz
Ll9jbGllbnRPYmplY3RzW21lc3NhZ2UuaWRdOworICAgICAgICBpZiAoIXNpZGViYXIpCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQobWVzc2FnZS5pZCk7CisgICAg
ICAgIGlmIChtZXNzYWdlLmV4cGFuZGVkKQorICAgICAgICAgICAgc2lkZWJhci5leHBhbmQoKTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2lkZWJhci5jb2xsYXBzZSgpOworICAgIH0sCisK
KyAgICBfb25Mb2c6IGZ1bmN0aW9uKG1lc3NhZ2UpCisgICAgeworICAgICAgICBXZWJJbnNwZWN0
b3IubG9nKG1lc3NhZ2UubWVzc2FnZSk7CisgICAgfSwKKworICAgIF9vbkV2YWx1YXRlT25JbnNw
ZWN0ZWRQYWdlOiBmdW5jdGlvbihtZXNzYWdlLCBwb3J0KQorICAgIHsKKyAgICAgICAgSW5qZWN0
ZWRTY3JpcHRBY2Nlc3MuZ2V0RGVmYXVsdCgpLmV2YWx1YXRlQW5kU3RyaW5naWZ5KG1lc3NhZ2Uu
ZXhwcmVzc2lvbiwgdGhpcy5fZGlzcGF0Y2hDYWxsYmFjay5iaW5kKHRoaXMsIG1lc3NhZ2UucmVx
dWVzdElkLCBwb3J0KSk7CisgICAgfSwKKworICAgIF9vblJldmVhbEFuZFNlbGVjdDogZnVuY3Rp
b24obWVzc2FnZSkKKyAgICB7CisgICAgICAgIGlmIChtZXNzYWdlLnBhbmVsSWQgPT09ICJyZXNv
dXJjZXMiICYmIHR5cGUgPT09ICJyZXNvdXJjZSIpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5f
b25SZXZlYWxBbmRTZWxlY3RSZXNvdXJjZShtZXNzYWdlKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVFNVUFBPUlRFRChtZXNzYWdlLnBhbmVsSWQs
IG1lc3NhZ2UudHlwZSk7CisgICAgfSwKKworICAgIF9vblJldmVhbEFuZFNlbGVjdFJlc291cmNl
OiBmdW5jdGlvbihtZXNzYWdlKQorICAgIHsKKyAgICAgICAgdmFyIGlkID0gbWVzc2FnZS5pZDsK
KyAgICAgICAgdmFyIHJlc291cmNlID0gbnVsbDsKKworICAgICAgICByZXNvdXJjZSA9IHR5cGVv
ZiBpZCA9PT0gIm51bWJlciIgPyBXZWJJbnNwZWN0b3IucmVzb3VyY2VzW2lkXSA6IFdlYkluc3Bl
Y3Rvci5yZXNvdXJjZUZvclVSTChpZCk7CisgICAgICAgIGlmICghcmVzb3VyY2UpCisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQodHlwZW9mIGlkICsgIjogIiArIGlk
KTsKKyAgICAgICAgV2ViSW5zcGVjdG9yLnBhbmVscy5yZXNvdXJjZXMuc2hvd1Jlc291cmNlKHJl
c291cmNlLCBtZXNzYWdlLmxpbmUpOworICAgICAgICBXZWJJbnNwZWN0b3Iuc2hvd1Jlc291cmNl
c1BhbmVsKCk7CisgICAgfSwKKworICAgIF9kaXNwYXRjaENhbGxiYWNrOiBmdW5jdGlvbihyZXF1
ZXN0SWQsIHBvcnQsIHJlc3VsdCkKKyAgICB7CisgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBj
b21tYW5kOiAiY2FsbGJhY2siLCByZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgcmVzdWx0OiByZXN1bHQg
fSk7CisgICAgfSwKKworICAgIF9vbkdldFJlc291cmNlczogZnVuY3Rpb24ocmVxdWVzdCkKKyAg
ICB7CisgICAgICAgIGZ1bmN0aW9uIHJlc291cmNlV3JhcHBlcihpZCkKKyAgICAgICAgeworICAg
ICAgICAgICAgcmV0dXJuIFdlYkluc3BlY3Rvci5leHRlbnNpb25TZXJ2ZXIuX2NvbnZlcnRSZXNv
dXJjZShXZWJJbnNwZWN0b3IucmVzb3VyY2VzW2lkXSk7CisgICAgICAgIH0KKworICAgICAgICB2
YXIgcmVzcG9uc2U7CisgICAgICAgIGlmIChyZXF1ZXN0LmlkKQorICAgICAgICAgICAgcmVzcG9u
c2UgPSBXZWJJbnNwZWN0b3IucmVzb3VyY2VzW3JlcXVlc3QuaWRdID8gcmVzb3VyY2VXcmFwcGVy
KHJlcXVlc3QuaWQpIDogdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQocmVxdWVzdC5pZCk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3BvbnNlID0gT2JqZWN0LnByb3BlcnRpZXMoV2ViSW5z
cGVjdG9yLnJlc291cmNlcykubWFwKHJlc291cmNlV3JhcHBlcik7CisgICAgICAgIHJldHVybiBy
ZXNwb25zZTsKKyAgICB9LAorCisgICAgaW5pdEV4dGVuc2lvbnM6IGZ1bmN0aW9uKCkKKyAgICB7
CisgICAgICAgIEluc3BlY3RvckV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvbnNBc3luYygp
OworICAgIH0sCisKKyAgICBfYWRkRXh0ZW5zaW9uczogZnVuY3Rpb24oZXh0ZW5zaW9ucykKKyAg
ICB7CisgICAgICAgIEluc3BlY3RvckZyb250ZW5kSG9zdC5zZXRFeHRlbnNpb25BUEkoIigiICsg
aW5qZWN0ZWRFeHRlbnNpb25BUEkudG9TdHJpbmcoKSArICIpIik7IC8vIFNlZSBFeHRlbnNpb25B
UEkuanMgZm9yIGRldGFpbHMuCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0ZW5zaW9u
cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNb
aV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLnN0
YXJ0UGFnZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHZh
ciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKKyAgICAgICAgICAg
ICAgICBpZnJhbWUuc3JjID0gZXh0ZW5zaW9uLnN0YXJ0UGFnZTsKKyAgICAgICAgICAgICAgICBp
ZnJhbWUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5i
b2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAg
ICAgICAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgZXh0ZW5zaW9u
ICIgKyBleHRlbnNpb24uc3RhcnRQYWdlICsgIjoiICsgZSk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9LAorCisgICAgX29uV2luZG93TWVzc2FnZTogZnVuY3Rpb24oZXZlbnQpCisg
ICAgeworICAgICAgICBpZiAoZXZlbnQuZGF0YSAhPT0gInJlZ2lzdGVyRXh0ZW5zaW9uIikKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdmFyIHBvcnQgPSBldmVudC5wb3J0c1swXTsKKyAg
ICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy5fb25tZXNzYWdlLmJp
bmQodGhpcyksIGZhbHNlKTsKKyAgICAgICAgcG9ydC5zdGFydCgpOworICAgIH0sCisKKyAgICBf
b25tZXNzYWdlOiBmdW5jdGlvbihldmVudCkKKyAgICB7CisgICAgICAgIHZhciByZXF1ZXN0ID0g
ZXZlbnQuZGF0YTsKKyAgICAgICAgdmFyIHJlc3VsdDsKKworICAgICAgICBpZiAocmVxdWVzdC5j
b21tYW5kIGluIHRoaXMuX2hhbmRsZXJzKQorICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5faGFu
ZGxlcnNbcmVxdWVzdC5jb21tYW5kXShyZXF1ZXN0LCBldmVudC50YXJnZXQpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9zdGF0dXMuRV9OT1RTVVBQT1JURUQocmVx
dWVzdC5jb21tYW5kKTsKKworICAgICAgICBpZiAocmVzdWx0ICYmIHJlcXVlc3QucmVxdWVzdElk
KQorICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hDYWxsYmFjayhyZXF1ZXN0LnJlcXVlc3RJZCwg
ZXZlbnQudGFyZ2V0LCByZXN1bHQpOworICAgIH0sCisKKyAgICBfcmVnaXN0ZXJIYW5kbGVyOiBm
dW5jdGlvbihjb21tYW5kLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHRoaXMuX2hhbmRsZXJz
W2NvbW1hbmRdID0gY2FsbGJhY2s7CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuRXh0ZW5zaW9u
U2VydmVyLl9zdGF0dXNlcyA9IAoreworICAgIE9LOiAiIiwKKyAgICBFX05PVEZPVU5EOiAiT2Jq
ZWN0IG5vdCBmb3VuZCAoJXMpIiwKKyAgICBFX05PVFNVUFBPUlRFRDogIk9iamVjdCBkb2VzIG5v
dCBzdXBwb3J0IHJlcXVlc3RlZCBvcGVyYXRpb24gKCVzKSIsCisgICAgRV9FWElTVFM6ICJPYmpl
Y3QgYWxyZWFkeSBleGlzdHMgKCVzKSIKK30KKworV2ViSW5zcGVjdG9yLkV4dGVuc2lvblN0YXR1
cyA9IGZ1bmN0aW9uKCkKK3sKKyAgICBmdW5jdGlvbiBtYWtlU3RhdHVzKGNvZGUpCisgICAgewor
ICAgICAgICB2YXIgZGVzY3JpcHRpb24gPSBXZWJJbnNwZWN0b3IuRXh0ZW5zaW9uU2VydmVyLl9z
dGF0dXNlc1tjb2RlXSB8fCBjb2RlOworICAgICAgICB2YXIgZGV0YWlscyA9IEFycmF5LnByb3Rv
dHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgICAgIHZhciBzdGF0dXMgPSB7IGNv
ZGU6IGNvZGUsIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiwgZGV0YWlsczogZGV0YWlscyB9Owor
ICAgICAgICBpZiAoY29kZSAhPT0gIk9LIikgeworICAgICAgICAgICAgc3RhdHVzLmlzRXJyb3Ig
PSB0cnVlOworICAgICAgICAgICAgY29uc29sZS5sb2coIkV4dGVuc2lvbiBzZXJ2ZXIgZXJyb3I6
ICIgKyBTdHJpbmcudnNwcmludGYoZGVzY3JpcHRpb24sIGRldGFpbHMpKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gc3RhdHVzOyAKKyAgICB9CisgICAgZm9yIChzdGF0dXMgaW4gV2ViSW5z
cGVjdG9yLkV4dGVuc2lvblNlcnZlci5fc3RhdHVzZXMpCisgICAgICAgIHRoaXNbc3RhdHVzXSA9
IG1ha2VTdGF0dXMuYmluZChudWxsLCBzdGF0dXMpOworfQorCitXZWJJbnNwZWN0b3IuYWRkRXh0
ZW5zaW9ucyA9IGZ1bmN0aW9uKGV4dGVuc2lvbnMpCit7CisgICAgV2ViSW5zcGVjdG9yLmV4dGVu
c2lvblNlcnZlci5fYWRkRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKK30KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdC5qcyBiL1dlYkNvcmUvaW5z
cGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdC5qcwppbmRleCBjZTE4N2QyLi4zYTExNGMw
IDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvSW5qZWN0ZWRTY3JpcHQu
anMKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luamVjdGVkU2NyaXB0LmpzCkBA
IC0yMzgsNiArMjM4LDE5IEBAIEluamVjdGVkU2NyaXB0LmdldENvbXBsZXRpb25zID0gZnVuY3Rp
b24oZXhwcmVzc2lvbiwgaW5jbHVkZUluc3BlY3RvckNvbW1hbmRMaW5lCiAgICAgcmV0dXJuIHBy
b3BzOwogfQogCitJbmplY3RlZFNjcmlwdC5ldmFsdWF0ZUFuZFN0cmluZ2lmeSA9IGZ1bmN0aW9u
KGV4cHJlc3Npb24pCit7CisgICAgdmFyIHJlc3VsdCA9IHt9OworICAgIHRyeSB7CisgICAgICAg
IHZhciB2YWx1ZSA9IEluamVjdGVkU2NyaXB0Ll9ldmFsdWF0ZU9uKGluc3BlY3RlZFdpbmRvdy5l
dmFsLCBpbnNwZWN0ZWRXaW5kb3csIGV4cHJlc3Npb24sIGZhbHNlKTsKKyAgICAgICAgcmVzdWx0
LnZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAg
ICAgcmVzdWx0LnZhbHVlID0gZS50b1N0cmluZygpOworICAgICAgICByZXN1bHQuaXNFeGNlcHRp
b24gPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBJbmplY3RlZFNjcmlw
dC5ldmFsdWF0ZSA9IGZ1bmN0aW9uKGV4cHJlc3Npb24sIG9iamVjdEdyb3VwKQogewogICAgIHJl
dHVybiBJbmplY3RlZFNjcmlwdC5fZXZhbHVhdGVBbmRXcmFwKGluc3BlY3RlZFdpbmRvdy5ldmFs
LCBpbnNwZWN0ZWRXaW5kb3csIGV4cHJlc3Npb24sIG9iamVjdEdyb3VwKTsKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdEFjY2Vzcy5qcyBiL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbmplY3RlZFNjcmlwdEFjY2Vzcy5qcwppbmRleCA1
OTUwNDIxLi41OWFhNzBjIDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQv
SW5qZWN0ZWRTY3JpcHRBY2Nlc3MuanMKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5k
L0luamVjdGVkU2NyaXB0QWNjZXNzLmpzCkBAIC03NSwxNCArNzUsMTUgQEAgSW5qZWN0ZWRTY3Jp
cHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyID0gZnVuY3Rpb24obWV0aG9kTmFtZSwgYXN5bmMpCiAv
LyAtIE1ha2Ugc3VyZSBsYXN0IHBhcmFtZXRlciBvZiBhbGwgdGhlIEluamVjdGVkU3JpcHRBY2Nl
c3MuKiBjYWxscyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLgogLy8gV2Uga2VlcCB0aGVzZSBzb3J0
ZWQuCiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRlIik7CitJ
bmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRlQW5kU3RyaW5naWZ5
Iik7CiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoImV2YWx1YXRlSW5DYWxs
RnJhbWUiKTsKK0luamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZXZhbHVhdGVP
blNlbGYiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZ2V0Q29tcGxl
dGlvbnMiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigiZ2V0UHJvcGVy
dGllcyIpOwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJnZXRQcm90b3R5
cGVzIik7CiBJbmplY3RlZFNjcmlwdEFjY2Vzcy5faW5zdGFsbEhhbmRsZXIoIm9wZW5Jbkluc3Bl
Y3RlZFdpbmRvdyIpOwogSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVyKCJwdXNo
Tm9kZVRvRnJvbnRlbmQiKTsKIEluamVjdGVkU2NyaXB0QWNjZXNzLl9pbnN0YWxsSGFuZGxlcigi
c2V0UHJvcGVydHlWYWx1ZSIpOwotSW5qZWN0ZWRTY3JpcHRBY2Nlc3MuX2luc3RhbGxIYW5kbGVy
KCJldmFsdWF0ZU9uU2VsZiIpOwogCiAvLyBTb21lIG1ldGhvZHMgY2FuJ3QgcnVuIHN5bmNocm9u
b3VzbHkgZXZlbiBvbiB0aGUgaW5qZWN0ZWQgc2NyaXB0IHNpZGUgKHN1Y2ggYXMgREIgdHJhbnNh
Y3Rpb25zKS4KIC8vIE1hcmsgdGhlbSBhcyBhc3luY2hyb25vdXMgaGVyZS4KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLmpz
IGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0luc3BlY3RvckZyb250ZW5kSG9zdFN0dWIu
anMKaW5kZXggMzliYmUwMi4uYWVmYWFkNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9pbnNwZWN0b3Iv
ZnJvbnQtZW5kL0luc3BlY3RvckZyb250ZW5kSG9zdFN0dWIuanMKKysrIGIvV2ViQ29yZS9pbnNw
ZWN0b3IvZnJvbnQtZW5kL0luc3BlY3RvckZyb250ZW5kSG9zdFN0dWIuanMKQEAgLTg0LDYgKzg0
LDEwIEBAIFdlYkluc3BlY3Rvci5JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViLnByb3RvdHlwZSA9
IHsKICAgICB7CiAgICAgfSwKIAorICAgIHNldEV4dGVuc2lvbkFQSTogZnVuY3Rpb24oc2NyaXB0
KQorICAgIHsKKyAgICB9LAorCiAgICAgbG9hZGVkOiBmdW5jdGlvbigpCiAgICAgewogICAgIH0s
CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvV2ViS2l0LnFyYyBiL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9XZWJLaXQucXJjCmluZGV4IDQyYWQ5MTUuLmE1NDkz
NmMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9XZWJLaXQucXJjCisr
KyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9XZWJLaXQucXJjCkBAIC0zNCw2ICszNCwx
MCBAQAogICAgIDxmaWxlPkVsZW1lbnRzUGFuZWwuanM8L2ZpbGU+CiAgICAgPGZpbGU+RWxlbWVu
dHNUcmVlT3V0bGluZS5qczwvZmlsZT4KICAgICA8ZmlsZT5FdmVudExpc3RlbmVyc1NpZGViYXJQ
YW5lLmpzPC9maWxlPgorICAgIDxmaWxlPkV4dGVuc2lvbkFQSS5qczwvZmlsZT4KKyAgICA8Zmls
ZT5FeHRlbnNpb25QYW5lbC5qczwvZmlsZT4KKyAgICA8ZmlsZT5FeHRlbnNpb25SZWdpc3RyeVN0
dWIuanM8L2ZpbGU+CisgICAgPGZpbGU+RXh0ZW5zaW9uU2VydmVyLmpzPC9maWxlPgogICAgIDxm
aWxlPkZvbnRWaWV3LmpzPC9maWxlPgogICAgIDxmaWxlPkhBUkVudHJ5LmpzPC9maWxlPgogICAg
IDxmaWxlPkhlbHBTY3JlZW4uanM8L2ZpbGU+CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQv
aW5zcGVjdG9yLmh0bWwKaW5kZXggYzgyOTE5NS4uNDhlOTViYiAxMDA2NDQKLS0tIGEvV2ViQ29y
ZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sCisrKyBiL1dlYkNvcmUvaW5zcGVj
dG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbApAQCAtMzksNiArMzksNyBAQCBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgog
ICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imluc3BlY3Rvci5qcyI+PC9z
Y3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iSW5zcGVjdG9y
QmFja2VuZFN0dWIuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2Ny
aXB0IiBzcmM9Ikluc3BlY3RvckZyb250ZW5kSG9zdFN0dWIuanMiPjwvc2NyaXB0PgorICAgIDxz
Y3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkV4dGVuc2lvblJlZ2lzdHJ5U3R1Yi5q
cyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iT2Jq
ZWN0LmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3Jj
PSJTZXR0aW5ncy5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiIHNyYz0iQ1NTU3R5bGVNb2RlbC5qcyI+PC9zY3JpcHQ+CkBAIC05Niw2ICs5Nyw5IEBAIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iU3RvcmFnZVBh
bmVsLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3Jj
PSJQcm9maWxlc1BhbmVsLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2
YXNjcmlwdCIgc3JjPSJDb25zb2xlUGFuZWwuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlw
ZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkV4dGVuc2lvbkFQSS5qcyI+PC9zY3JpcHQ+CisgICAg
PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iRXh0ZW5zaW9uU2VydmVyLmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJFeHRlbnNp
b25QYW5lbC5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQi
IHNyYz0iQXVkaXRzUGFuZWwuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9q
YXZhc2NyaXB0IiBzcmM9IkF1ZGl0UmVzdWx0Vmlldy5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlw
dCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iQXVkaXRMYXVuY2hlclZpZXcuanMiPjwvc2Ny
aXB0PgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5q
cyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanMKaW5kZXggMGFkZjA1
Ny4uNGJiMzBjNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3Bl
Y3Rvci5qcworKysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzCkBA
IC01MjYsNiArNTI2LDkgQEAgV2ViSW5zcGVjdG9yLmxvYWRlZCA9IGZ1bmN0aW9uKCkKICAgICBk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2xvc2UtYnV0dG9uLWxlZnQiKS5hZGRFdmVudExpc3Rl
bmVyKCJjbGljayIsIHRoaXMuY2xvc2UsIHRydWUpOwogICAgIGRvY3VtZW50LmdldEVsZW1lbnRC
eUlkKCJjbG9zZS1idXR0b24tcmlnaHQiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMu
Y2xvc2UsIHRydWUpOwogCisgICAgdGhpcy5leHRlbnNpb25TZXJ2ZXIgPSBuZXcgV2ViSW5zcGVj
dG9yLkV4dGVuc2lvblNlcnZlcigpOworICAgIHRoaXMuZXh0ZW5zaW9uU2VydmVyLmluaXRFeHRl
bnNpb25zKCk7CisKICAgICBJbnNwZWN0b3JGcm9udGVuZEhvc3QubG9hZGVkKCk7CiB9CiAKQEAg
LTEyMDIsNiArMTIwNSw3IEBAIFdlYkluc3BlY3Rvci51cGRhdGVSZXNvdXJjZSA9IGZ1bmN0aW9u
KGlkZW50aWZpZXIsIHBheWxvYWQpCiAgICAgICAgIHJlc291cmNlLmZpbmlzaGVkID0gcGF5bG9h
ZC5maW5pc2hlZDsKICAgICAgICAgaWYgKHRoaXMucGFuZWxzLmF1ZGl0cykKICAgICAgICAgICAg
IHRoaXMucGFuZWxzLmF1ZGl0cy5yZXNvdXJjZUZpbmlzaGVkKHJlc291cmNlKTsKKyAgICAgICAg
dGhpcy5leHRlbnNpb25TZXJ2ZXIubm90aWZ5UmVzb3VyY2VGaW5pc2hlZChyZXNvdXJjZSk7CiAg
ICAgfQogCiAgICAgaWYgKHBheWxvYWQuZGlkVGltaW5nQ2hhbmdlKSB7CkBAIC0xNDI2LDYgKzE0
MzAsNyBAQCBXZWJJbnNwZWN0b3IucmVzZXQgPSBmdW5jdGlvbigpCiAgICAgZGVsZXRlIHRoaXMu
bWFpblJlc291cmNlOwogCiAgICAgdGhpcy5jb25zb2xlLmNsZWFyTWVzc2FnZXMoKTsKKyAgICB0
aGlzLmV4dGVuc2lvblNlcnZlci5ub3RpZnlJbnNwZWN0b3JSZXNldCgpOwogfQogCiBXZWJJbnNw
ZWN0b3IucmVzZXRQcm9maWxlc1BhbmVsID0gZnVuY3Rpb24oKQpAQCAtMTQ0Miw2ICsxNDQ3LDcg
QEAgV2ViSW5zcGVjdG9yLmJyaW5nVG9Gcm9udCA9IGZ1bmN0aW9uKCkKIFdlYkluc3BlY3Rvci5p
bnNwZWN0ZWRVUkxDaGFuZ2VkID0gZnVuY3Rpb24odXJsKQogewogICAgIEluc3BlY3RvckZyb250
ZW5kSG9zdC5pbnNwZWN0ZWRVUkxDaGFuZ2VkKHVybCk7CisgICAgdGhpcy5leHRlbnNpb25TZXJ2
ZXIubm90aWZ5SW5zcGVjdGVkVVJMQ2hhbmdlZCgpOwogfQogCiBXZWJJbnNwZWN0b3IucmVzb3Vy
Y2VVUkxDaGFuZ2VkID0gZnVuY3Rpb24ocmVzb3VyY2UsIG9sZFVSTCkKQEAgLTE0NTQsNiArMTQ2
MCw3IEBAIFdlYkluc3BlY3Rvci5kaWRDb21taXRMb2FkID0gZnVuY3Rpb24oKQogewogICAgIC8v
IENsZWFudXAgZWxlbWVudHMgcGFuZWwgZWFybHkgb24gaW5zcGVjdGVkIHBhZ2UgcmVmcmVzaC4K
ICAgICBXZWJJbnNwZWN0b3Iuc2V0RG9jdW1lbnQobnVsbCk7CisgICAgdGhpcy5leHRlbnNpb25T
ZXJ2ZXIubm90aWZ5SW5zcGVjdGVkUGFnZUxvYWRlZCgpOwogfQogCiBXZWJJbnNwZWN0b3IudXBk
YXRlQ29uc29sZU1lc3NhZ2VFeHBpcmVkQ291bnQgPSBmdW5jdGlvbihjb3VudCkK
</data>

          </attachment>
      

    </bug>

</bugzilla>