<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://jogamp.org/bugzilla/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.2"
          urlbase="https://jogamp.org/bugzilla/"
          
          maintainer="sgothel@jausoft.com"
>

    <bug>
          <bug_id>565</bug_id>
          
          <creation_ts>2012-03-14 12:25:17 +0100</creation_ts>
          <short_desc>XWindow memory leak for GLCanvas (includes analysis)</short_desc>
          <delta_ts>2012-03-19 12:57:15 +0100</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>3</classification_id>
          <classification>JogAmp</classification>
          <product>Jogl</product>
          <component>x11</component>
          <version>2</version>
          <rep_platform>pc_all</rep_platform>
          <op_sys>linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>---</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Daniel Balog">danielbalog86</reporter>
          <assigned_to name="Sven Gothel">sgothel</assigned_to>
          <cc>danielbalog86</cc>
    
    <cc>gouessej</cc>
          
          <cf_type>---</cf_type>
          <cf_scm_refs>fcd0aa56a368adefbb516fcd710bec38560a2054</cf_scm_refs>
          <cf_workaround>---</cf_workaround>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1437</commentid>
    <comment_count>0</comment_count>
      <attachid>337</attachid>
    <who name="Daniel Balog">danielbalog86</who>
    <bug_when>2012-03-14 12:25:17 +0100</bug_when>
    <thetext>Created attachment 337
This is a potential fix for the GLCanvas Linux memory leak. Needs to be reviewed.

*Setup:

JOGL2.0 RC5, Ubuntu 11.10 (64-bit), GeForce 285GTX

*Problem:

XLib11 requires that each XWindow opened with XOpenWindow also be closed with XCloseWindow (See X11Util). This is not the case for GLCanvas, which seems to call XOpenWindow when it is attached to a frame, but it doesn&apos;t properly close the XWindow when you remove it from a frame.

In a 3D editing application, where windows are opened and closed a lot, this could be problematic. Especially since Ubuntu seems to have a limit of maximum 180 XWindows open before it refuses to open a new one.

*Steps to reproduce:

1) Create a GLCanvas
2) Add GLCanvas to frame
3) Remove GLCanvas from frame
4) Dispose the GLCanvas

(If you repeat this 200 times, you will get an exception telling you you can&apos;t open a new XOpenWindow)

See my attachment for a test case to reproduce. You can call X11Util.dumpOpenDisplayConnections() to see how many
XWindows are actually open. This number will grow over time, and it shouldn&apos;t.

*Expected result:

XWindow is closed

*Actual result: 

XWindow remains open -&gt; This indicates a memory leak.

*Analysis:

The problem is that when you remove the GLCanvas from the frame, the removeNotify is called, which disposes the GLCanvas. This in itself is fine, but it doesn&apos;t dispose the native surface, it only disposes the awt surface.

If you look at GLCanvas.DisposeAbstractGraphicsDeviceAction, you will see the following line:

(GLCanvas:884) boolean closed = awtConfig.getScreen().getDevice().close();

This line calls awtConfig.getScreen(), which refers to an AWTGraphicsScreen that is created at construction time. Calling close on the device of this screen will do nothing, because all implementations of AbstractGraphicsDevice close methods do nothing, apart from the X11GraphicsDevice, which closes the XWindow.

So the problem is either that the wrong screen is initialized at construction

*Possible Fix (1):

Calling 

awtConfig.getNativeGraphicsConfiguration().getScreen().getDevice().close();

right after line 884 in DisposeAbstractGraphicsDeviceAction fixes the issue, but I&apos;m not sure if this is correct. This will call the native X11 screen to close the device when destroyed, which plugs the memory leak.

*Possible Fix (2):

Initialize the screen in the GLCanvas.awtConfig field to be the X11GraphicsScreen instead of AWTGraphicScreen. This is done in the getGraphicsConfiguration() method of GLCanvas.

Again, I&apos;m not sure what the impact of this fix would be.

*Workaround:

The workaround I&apos;m using currently in my application is to override the destroy of my own GLCanvas, and call close the native device myself before the canvas is destroyed. The problem is that after the GLCanvas is destroyed, the reference to getNativeGraphicsConfiguration() will be null, so I have to do it before this happens.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1438</commentid>
    <comment_count>1</comment_count>
      <attachid>338</attachid>
    <who name="Daniel Balog">danielbalog86</who>
    <bug_when>2012-03-14 12:30:05 +0100</bug_when>
    <thetext>Created attachment 338
Test that triggers the XWindow memory leak

This test, when run in linux, will fail after about the 180th GLCanvas is created. There is a limit of a maximum of 180 XWindows per application in linux. the thing is that all GLCanvasses are disposed of, but incorrectly. The call for XCloseWindow is never performed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1439</commentid>
    <comment_count>2</comment_count>
      <attachid>337</attachid>
    <who name="Daniel Balog">danielbalog86</who>
    <bug_when>2012-03-14 12:30:59 +0100</bug_when>
    <thetext>Comment on attachment 337
This is a potential fix for the GLCanvas Linux memory leak. Needs to be reviewed.

Apologies for the import changes in the patch. Only the last few lines are relevant.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1441</commentid>
    <comment_count>3</comment_count>
      <attachid>337</attachid>
    <who name="Daniel Balog">danielbalog86</who>
    <bug_when>2012-03-15 15:51:20 +0100</bug_when>
    <thetext>Comment on attachment 337
This is a potential fix for the GLCanvas Linux memory leak. Needs to be reviewed.

I just noticed this does not fix the issue for PBuffers... (which also seem to create an XWindow)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1442</commentid>
    <comment_count>4</comment_count>
      <attachid>339</attachid>
    <who name="Daniel Balog">danielbalog86</who>
    <bug_when>2012-03-15 16:41:53 +0100</bug_when>
    <thetext>Created attachment 339
Test cases to trigger the memory leak

I added a new (easier) test case for pbuffers that fails on linux machines, due to the XWindow not being closed properly. I think this use case is easier to analyze and fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1452</commentid>
    <comment_count>5</comment_count>
    <who name="Julien Gouesse">gouessej</who>
    <bug_when>2012-03-15 22:56:08 +0100</bug_when>
    <thetext>Hi

It&apos;s a nice patch but please put only the relevant source code into it and call your trick only when the variable &quot;closed&quot; is set to true.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1453</commentid>
    <comment_count>6</comment_count>
    <who name="Daniel Balog">danielbalog86</who>
    <bug_when>2012-03-16 10:19:51 +0100</bug_when>
    <thetext>Are you referring to the closeDisplay field in X11GraphicsDevice? That is checked in the close() method itself, and doesn&apos;t need to be checked externally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1455</commentid>
    <comment_count>7</comment_count>
    <who name="Julien Gouesse">gouessej</who>
    <bug_when>2012-03-16 10:30:09 +0100</bug_when>
    <thetext>I thought about this:
boolean closed = awtConfig.getScreen().getDevice().close();

but if you really know what you&apos;re doing, that&apos;s ok for me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1456</commentid>
    <comment_count>8</comment_count>
    <who name="Daniel Balog">danielbalog86</who>
    <bug_when>2012-03-16 10:40:28 +0100</bug_when>
    <thetext>Ah I see. The thing is that close() doesn&apos;t doe anything for AWT besides check if it has already been closed(). I guess I would need a new local variable and throw a debug statement if the native closing did not work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1458</commentid>
    <comment_count>9</comment_count>
      <attachid>342</attachid>
    <who name="Daniel Balog">danielbalog86</who>
    <bug_when>2012-03-16 16:57:56 +0100</bug_when>
    <thetext>Created attachment 342
Modified potential fix

I updated the patch. 

Still working on fixing the offscreen view though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1466</commentid>
    <comment_count>10</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2012-03-18 16:06:04 +0100</bug_when>
    <thetext>Thank you Daniel, I will look at this one after fixing bug 564</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1476</commentid>
    <comment_count>11</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2012-03-19 10:48:20 +0100</bug_when>
    <thetext>Already fixed:

2011-12-22 Commit d225d0a8a16e362ddb14cb93c124eb06cf0ff05e,
fixed a OO &apos;typo&apos; (using the wrong device), which hindered actual closing of the device.
  &lt;http://jogamp.org/git/?p=jogl.git;a=commit;h=d225d0a8a16e362ddb14cb93c124eb06cf0ff05e&gt;

GLCanvas.dispose():
 1) PostDisposeAction destroys the JAWTWindow
 2) DisposeAbstractGraphicsDeviceAction closes the AbstractGraphicsDevice 
     which is additionally being owned.

GLPBufferImpl.destroy():
  - closes the AbstractGraphicsDevice 

X11Util.Display: Shutdown (close open / pending Displays: false, open (no close attempt): 0/0, pending (not closed, marked uncloseable): 2)
X11Util: Pending X11 Display Connections: 2
X11Util: Pending[0]: NamedX11Display[:0.0, 0x41a63430, refCount 0, unCloseable true]
X11Util: Pending[1]: NamedX11Display[:0.0, 0x414b5c60, refCount 0, unCloseable true]

&lt;http://jogamp.org/git/?p=jogl.git;a=commit;h=fcd0aa56a368adefbb516fcd710bec38560a2054&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1479</commentid>
    <comment_count>12</comment_count>
    <who name="Daniel Balog">danielbalog86</who>
    <bug_when>2012-03-19 12:57:15 +0100</bug_when>
    <thetext>Sounds great. Thanks a bunch!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>337</attachid>
            <date>2012-03-14 12:25:17 +0100</date>
            <delta_ts>2012-03-16 16:57:56 +0100</delta_ts>
            <desc>This is a potential fix for the GLCanvas Linux memory leak. Needs to be reviewed.</desc>
            <filename>GLCanvas_PotentialFix1.patch</filename>
            <type>text/plain</type>
            <size>47699</size>
            <attacher name="Daniel Balog">danielbalog86</attacher>
            
              <data encoding="base64">SW5kZXg6IC4uLy4uL0FwcGxpY2F0aW9ucy9KT0dMR0lUL2pvZ2wvc3JjL2pvZ2wvY2xhc3Nlcy9q
YXZheC9tZWRpYS9vcGVuZ2wvYXd0L0dMQ2FudmFzLmphdmEKSURFQSBhZGRpdGlvbmFsIGluZm86
ClN1YnN5c3RlbTogY29tLmludGVsbGlqLm9wZW5hcGkuZGlmZi5pbXBsLnBhdGNoLkNoYXJzZXRF
UAo8Kz5VVEYtOApTdWJzeXN0ZW06IGNvbS5pbnRlbGxpai5vcGVuYXBpLmRpZmYuaW1wbC5wYXRj
aC5CYXNlUmV2aXNpb25UZXh0UGF0Y2hFUAo8Kz4vKlxuICogQ29weXJpZ2h0IChjKSAyMDAzIFN1
biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIENvcHlyaWdodCAo
YykgMjAxMCBKb2dBbXAgQ29tbXVuaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogXG4gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqIFxuICogLSBSZWRpc3RyaWJ1
dGlvbiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci5cbiAqIFxuICogLSBSZWRpc3RyaWJ1dGlvbiBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi5cbiAqIFxuICogTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG9y
IHRoZSBuYW1lcyBvZlxuICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKiBcbiAqIFRoaXMgc29mdHdhcmUg
aXMgcHJvdmlkZWQgXCJBUyBJUyxcIiB3aXRob3V0IGEgd2FycmFudHkgb2YgYW55IGtpbmQuIEFM
TFxuICogRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQg
V0FSUkFOVElFUyxcbiAqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFO
VEFCSUxJVFksIEZJVE5FU1MgRk9SIEFcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5G
UklOR0VNRU5ULCBBUkUgSEVSRUJZIEVYQ0xVREVELiBTVU5cbiAqIE1JQ1JPU1lTVEVNUywgSU5D
LiAoXCJTVU5cIikgQU5EIElUUyBMSUNFTlNPUlMgU0hBTEwgTk9UIEJFIExJQUJMRSBGT1JcbiAq
IEFOWSBEQU1BR0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBN
T0RJRllJTkcgT1JcbiAqIERJU1RSSUJVVElORyBUSElTIFNPRlRXQVJFIE9SIElUUyBERVJJVkFU
SVZFUy4gSU4gTk8gRVZFTlQgV0lMTCBTVU4gT1JcbiAqIElUUyBMSUNFTlNPUlMgQkUgTElBQkxF
IEZPUiBBTlkgTE9TVCBSRVZFTlVFLCBQUk9GSVQgT1IgREFUQSwgT1IgRk9SXG4gKiBESVJFQ1Qs
IElORElSRUNULCBTUEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZF
XG4gKiBEQU1BR0VTLCBIT1dFVkVSIENBVVNFRCBBTkQgUkVHQVJETEVTUyBPRiBUSEUgVEhFT1JZ
IE9GIExJQUJJTElUWSxcbiAqIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgT1IgSU5BQklMSVRZ
IFRPIFVTRSBUSElTIFNPRlRXQVJFLCBFVkVOIElGXG4gKiBTVU4gSEFTIEJFRU4gQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLlxuICogXG4gKiBZb3UgYWNrbm93bGVk
Z2UgdGhhdCB0aGlzIHNvZnR3YXJlIGlzIG5vdCBkZXNpZ25lZCBvciBpbnRlbmRlZCBmb3IgdXNl
XG4gKiBpbiB0aGUgZGVzaWduLCBjb25zdHJ1Y3Rpb24sIG9wZXJhdGlvbiBvciBtYWludGVuYW5j
ZSBvZiBhbnkgbnVjbGVhclxuICogZmFjaWxpdHkuXG4gKiBcbiAqIFN1biBncmF0ZWZ1bGx5IGFj
a25vd2xlZGdlcyB0aGF0IHRoaXMgc29mdHdhcmUgd2FzIG9yaWdpbmFsbHkgYXV0aG9yZWRcbiAq
IGFuZCBkZXZlbG9wZWQgYnkgS2VubmV0aCBCcmFkbGV5IFJ1c3NlbGwgYW5kIENocmlzdG9waGVy
IEpvaG4gS2xpbmUuXG4gKi9cblxucGFja2FnZSBqYXZheC5tZWRpYS5vcGVuZ2wuYXd0O1xuXG5p
bXBvcnQgamF2YS5iZWFucy5CZWFucztcbmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7
XG5pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyO1xuaW1wb3J0IGphdmEuc2Vj
dXJpdHkuUHJpdmlsZWdlZEFjdGlvbjtcblxuaW1wb3J0IGphdmEuYXd0LkNhbnZhcztcbmltcG9y
dCBqYXZhLmF3dC5Db2xvcjtcbmltcG9ydCBqYXZhLmF3dC5Gb250TWV0cmljcztcbmltcG9ydCBq
YXZhLmF3dC5GcmFtZTtcbmltcG9ydCBqYXZhLmF3dC5HcmFwaGljcztcbmltcG9ydCBqYXZhLmF3
dC5HcmFwaGljc0NvbmZpZ3VyYXRpb247XG5pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2U7
XG5pbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDtcblxuaW1wb3J0IGphdmEuYXd0LkV2
ZW50UXVldWU7XG5pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2Vw
dGlvbjtcbmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuaW1wb3J0IGphdmEudXRpbC5MaXN0
O1xuXG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93Lk9mZnNjcmVlbkxheWVyT3B0aW9u
O1xuaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5XaW5kb3dDbG9zaW5nUHJvdG9jb2w7
XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LkFic3RyYWN0R3JhcGhpY3NEZXZpY2U7
XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LkFic3RyYWN0R3JhcGhpY3NTY3JlZW47
XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LkdyYXBoaWNzQ29uZmlndXJhdGlvbkZh
Y3Rvcnk7XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93Lk5hdGl2ZVN1cmZhY2U7XG5p
bXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93Lk5hdGl2ZVdpbmRvd0ZhY3Rvcnk7XG5pbXBv
cnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LmF3dC5BV1RHcmFwaGljc0NvbmZpZ3VyYXRpb247
XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LmF3dC5BV1RHcmFwaGljc0RldmljZTtc
bmltcG9ydCBqYXZheC5tZWRpYS5uYXRpdmV3aW5kb3cuYXd0LkFXVEdyYXBoaWNzU2NyZWVuO1xu
aW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5hd3QuQVdUV2luZG93Q2xvc2luZ1Byb3Rv
Y29sO1xuXG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMO1xuaW1wb3J0IGphdmF4Lm1lZGlh
Lm9wZW5nbC5HTEFuaW1hdG9yQ29udHJvbDtcbmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xB
dXRvRHJhd2FibGU7XG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzO1xu
aW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTENhcGFiaWxpdGllc0Nob29zZXI7XG5pbXBvcnQg
amF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlO1xuaW1wb3J0IGphdmF4
Lm1lZGlhLm9wZW5nbC5HTENvbnRleHQ7XG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMRHJh
d2FibGU7XG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMRHJhd2FibGVGYWN0b3J5O1xuaW1w
b3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXI7XG5pbXBvcnQgamF2YXgubWVk
aWEub3BlbmdsLkdMRXhjZXB0aW9uO1xuaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTFByb2Zp
bGU7XG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMUnVubmFibGU7XG5pbXBvcnQgamF2YXgu
bWVkaWEub3BlbmdsLlRocmVhZGluZztcblxuaW1wb3J0IGNvbS5qb2dhbXAuY29tbW9uLkdsdWVH
ZW5WZXJzaW9uO1xuaW1wb3J0IGNvbS5qb2dhbXAuY29tbW9uLnV0aWwuVmVyc2lvblV0aWw7XG5p
bXBvcnQgY29tLmpvZ2FtcC5vcGVuZ2wuSm9nbFZlcnNpb247XG5cbmltcG9ydCBjb20uam9nYW1w
LmNvbW1vbi51dGlsLmxvY2tzLkxvY2tGYWN0b3J5O1xuaW1wb3J0IGNvbS5qb2dhbXAuY29tbW9u
LnV0aWwubG9ja3MuUmVjdXJzaXZlTG9jaztcblxuaW1wb3J0IGpvZ2FtcC5uYXRpdmV3aW5kb3cu
amF3dC5KQVdUV2luZG93O1xuaW1wb3J0IGpvZ2FtcC5vcGVuZ2wuRGVidWc7XG5pbXBvcnQgam9n
YW1wLm9wZW5nbC5HTENvbnRleHRJbXBsO1xuaW1wb3J0IGpvZ2FtcC5vcGVuZ2wuR0xEcmF3YWJs
ZUhlbHBlcjtcbmltcG9ydCBqb2dhbXAub3BlbmdsLlRocmVhZGluZ0ltcGw7XG5cbi8vIEZJWE1F
OiBTdWJjbGFzc2VzIG5lZWQgdG8gY2FsbCByZXNldEdMRnVuY3Rpb25BdmFpbGFiaWxpdHkoKSBv
biB0aGVpclxuLy8gY29udGV4dCB3aGVuZXZlciB0aGUgZGlzcGxheUNoYW5nZWQoKSBmdW5jdGlv
biBpcyBjYWxsZWQgb24gb3VyXG4vLyBHTEV2ZW50TGlzdGVuZXJzXG5cbi8qKiBBIGhlYXZ5d2Vp
Z2h0IEFXVCBjb21wb25lbnQgd2hpY2ggcHJvdmlkZXMgT3BlbkdMIHJlbmRlcmluZ1xuICAgIHN1
cHBvcnQuIFRoaXMgaXMgdGhlIHByaW1hcnkgaW1wbGVtZW50YXRpb24gb2YgYW4gQVdUIHtAbGlu
ayBHTERyYXdhYmxlfTtcbiAgICB7QGxpbmsgR0xKUGFuZWx9IGlzIHByb3ZpZGVkIGZvciBjb21w
YXRpYmlsaXR5IHdpdGggU3dpbmcgdXNlclxuICAgIGludGVyZmFjZXMgd2hlbiBhZGRpbmcgYSBo
ZWF2eXdlaWdodCBkb2Vzbid0IHdvcmsgZWl0aGVyIGJlY2F1c2VcbiAgICBvZiBaLW9yZGVyaW5n
IG9yIExheW91dE1hbmFnZXIgcHJvYmxlbXMuXG4gKlxuICogPGg1PjxBIE5BTUU9XCJqYXZhMmRn
bFwiPkphdmEyRCBPcGVuR0wgUmVtYXJrczwvQT48L2g1PlxuICpcbiAqIFRvIGF2b2lkIGFueSBj
b25mbGljdHMgd2l0aCBhIHBvdGVudGlhbCBKYXZhMkQgT3BlbkdMIGNvbnRleHQsPGJyPlxuICog
eW91IHNoYWxsIGNvbnNpZGVyIHNldHRpbmcgdGhlIGZvbGxvd2luZyBKVk0gcHJvcGVydGllczo8
YnI+XG4gKiA8dWw+XG4gKiAgICA8bGk+PHByZT5zdW4uamF2YTJkLm9wZW5nbD1mYWxzZTwvcHJl
PjwvbGk+XG4gKiAgICA8bGk+PHByZT5zdW4uamF2YTJkLm5vZGRyYXc9dHJ1ZTwvcHJlPjwvbGk+
XG4gKiA8L3VsPlxuICogVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaW4gY2FzZSB5b3Ugd2FudCB0
byB1dGlsaXplIGEgR0xQcm9maWxlIG90aGVyIHRoYW5cbiAqIHtAbGluayBHTFByb2ZpbGUjR0wy
fSwgZWcuIHVzaW5nIHtAbGluayBHTFByb2ZpbGUjZ2V0TWF4Rml4ZWRGdW5jKCl9Ljxicj5cbiAq
IE9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3UgbGlrZSB0byBleHBlcmltZW50IHdpdGggR0xKUGFu
ZWwncyB1dGlsaXphdGlvblxuICogb2YgSmF2YTJEJ3MgT3BlbkdMIHBpcGVsaW5lLCB5b3UgaGF2
ZSB0byBzZXQgdGhlbSB0b1xuICogPHVsPlxuICogICAgPGxpPjxwcmU+c3VuLmphdmEyZC5vcGVu
Z2w9dHJ1ZTwvcHJlPjwvbGk+XG4gKiAgICA8bGk+PHByZT5zdW4uamF2YTJkLm5vZGRyYXc9dHJ1
ZTwvcHJlPjwvbGk+XG4gKiA8L3VsPlxuICpcbiAqIDxoNT48QSBOQU1FPVwiYmFja2dyb3VuZGVy
YXNlXCI+RGlzYWJsZSBCYWNrZ3JvdW5kIEVyYXNlPC9BPjwvaDU+XG4gKlxuICogR0xDYW52YXMg
dHJpZXMgdG8gZGlzYWJsZSBiYWNrZ3JvdW5kIGVyYXNlIGZvciB0aGUgQVdUIENhbnZhc1xuICog
YmVmb3JlIG5hdGl2ZSBwZWVyIGNyZWF0aW9uIChYMTEpIGFuZCBhZnRlciBpdCAoV2luZG93cyks
IDxicj5cbiAqIHV0aWxpemluZyB0aGUgb3B0aW9uYWwge0BsaW5rIGphdmEuYXd0LlRvb2xraXR9
IG1ldGhvZCA8Y29kZT5kaXNhYmxlQmVhY2tncm91bmRFcmFzZShqYXZhLmF3dC5DYW52YXMpPC9j
b2RlPi48YnI+XG4gKiBIb3dldmVyIGlmIHRoaXMgZG9lcyBub3QgZ2l2ZSB5b3UgdGhlIGRlc2ly
ZWQgcmVzdWx0cywgeW91IG1heSB3YW50IHRvIGRpc2FibGUgQVdUIGJhY2tncm91bmQgZXJhc2Ug
aW4gZ2VuZXJhbDpcbiAqIDx1bD5cbiAqICAgPGxpPjxwcmU+c3VuLmF3dC5ub2VyYXNlYmFja2dy
b3VuZD10cnVlPC9wcmU+PC9saT5cbiAqIDwvdWw+XG4gKi9cblxuQFN1cHByZXNzV2FybmluZ3Mo
XCJzZXJpYWxcIilcbnB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyBpbXBsZW1l
bnRzIEFXVEdMQXV0b0RyYXdhYmxlLCBXaW5kb3dDbG9zaW5nUHJvdG9jb2wsIE9mZnNjcmVlbkxh
eWVyT3B0aW9uIHtcblxuICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHO1xuXG4g
IHN0YXRpYyB7XG4gICAgICBERUJVRyA9IERlYnVnLmRlYnVnKFwiR0xDYW52YXNcIik7XG4gIH1c
blxuICBwcml2YXRlIEdMRHJhd2FibGVIZWxwZXIgZHJhd2FibGVIZWxwZXIgPSBuZXcgR0xEcmF3
YWJsZUhlbHBlcigpO1xuICBwcml2YXRlIEFXVEdyYXBoaWNzQ29uZmlndXJhdGlvbiBhd3RDb25m
aWc7XG4gIHByaXZhdGUgR0xEcmF3YWJsZSBkcmF3YWJsZTtcbiAgcHJpdmF0ZSBHTENvbnRleHRJ
bXBsIGNvbnRleHQ7XG4gIHByaXZhdGUgYm9vbGVhbiBzZW5kUmVzaGFwZSA9IGZhbHNlO1xuICBc
biAgLy8gY29weSBvZiB0aGUgY3N0ciBhcmdzLCBtYWlubHkgZm9yIHJlY3JlYXRpb25cbiAgcHJp
dmF0ZSBHTENhcGFiaWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxVXNlcjtcbiAgcHJpdmF0ZSBHTENh
cGFiaWxpdGllc0Nob29zZXIgY2hvb3NlcjtcbiAgcHJpdmF0ZSBHTENvbnRleHQgc2hhcmVXaXRo
O1xuICBwcml2YXRlIGludCBhZGRpdGlvbmFsQ3R4Q3JlYXRpb25GbGFncyA9IDA7ICBcbiAgcHJp
dmF0ZSBHcmFwaGljc0RldmljZSBkZXZpY2U7XG4gIHByaXZhdGUgYm9vbGVhbiBzaGFsbFVzZU9m
ZnNjcmVlbkxheWVyID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBBV1RXaW5kb3dDbG9zaW5nUHJvdG9j
b2wgYXd0V2luZG93Q2xvc2luZ1Byb3RvY29sID1cbiAgICAgICAgICBuZXcgQVdUV2luZG93Q2xv
c2luZ1Byb3RvY29sKHRoaXMsIG5ldyBSdW5uYWJsZSgpIHtcbiAgICAgICAgICAgICAgICBwdWJs
aWMgdm9pZCBydW4oKSB7XG4gICAgICAgICAgICAgICAgICAgIEdMQ2FudmFzLnRoaXMuZGVzdHJv
eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gIC8qKiBDcmVhdGVz
IGEgbmV3IEdMQ2FudmFzIGNvbXBvbmVudCB3aXRoIGEgZGVmYXVsdCBzZXQgb2YgT3BlbkdMXG4g
ICAgICBjYXBhYmlsaXRpZXMsIHVzaW5nIHRoZSBkZWZhdWx0IE9wZW5HTCBjYXBhYmlsaXRpZXMg
c2VsZWN0aW9uXG4gICAgICBtZWNoYW5pc20sIG9uIHRoZSBkZWZhdWx0IHNjcmVlbiBkZXZpY2Uu
IFxuICAgKiBAdGhyb3dzIEdMRXhjZXB0aW9uIGlmIG5vIGRlZmF1bHQgcHJvZmlsZSBpcyBhdmFp
bGFibGUgZm9yIHRoZSBkZWZhdWx0IGRlc2t0b3AgZGV2aWNlLlxuICAgKi9cbiAgcHVibGljIEdM
Q2FudmFzKCkgdGhyb3dzIEdMRXhjZXB0aW9uIHtcbiAgICB0aGlzKG51bGwpO1xuICB9XG5cbiAg
LyoqIENyZWF0ZXMgYSBuZXcgR0xDYW52YXMgY29tcG9uZW50IHdpdGggdGhlIHJlcXVlc3RlZCBz
ZXQgb2ZcbiAgICAgIE9wZW5HTCBjYXBhYmlsaXRpZXMsIHVzaW5nIHRoZSBkZWZhdWx0IE9wZW5H
TCBjYXBhYmlsaXRpZXNcbiAgICAgIHNlbGVjdGlvbiBtZWNoYW5pc20sIG9uIHRoZSBkZWZhdWx0
IHNjcmVlbiBkZXZpY2UuIFxuICAgKiBAdGhyb3dzIEdMRXhjZXB0aW9uIGlmIG5vIEdMQ2FwYWJp
bGl0aWVzIGFyZSBnaXZlbiBhbmQgbm8gZGVmYXVsdCBwcm9maWxlIGlzIGF2YWlsYWJsZSBmb3Ig
dGhlIGRlZmF1bHQgZGVza3RvcCBkZXZpY2UuXG4gICAqIEBzZWUgR0xDYW52YXMjR0xDYW52YXMo
amF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlLCBqYXZheC5tZWRpYS5v
cGVuZ2wuR0xDYXBhYmlsaXRpZXNDaG9vc2VyLCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xDb250ZXh0
LCBqYXZhLmF3dC5HcmFwaGljc0RldmljZSlcbiAgICovXG4gIHB1YmxpYyBHTENhbnZhcyhHTENh
cGFiaWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxVXNlcikgdGhyb3dzIEdMRXhjZXB0aW9uIHtcbiAg
ICB0aGlzKGNhcHNSZXFVc2VyLCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG4gIC8qKiBDcmVh
dGVzIGEgbmV3IEdMQ2FudmFzIGNvbXBvbmVudCB3aXRoIHRoZSByZXF1ZXN0ZWQgc2V0IG9mXG4g
ICAgICBPcGVuR0wgY2FwYWJpbGl0aWVzLCB1c2luZyB0aGUgZGVmYXVsdCBPcGVuR0wgY2FwYWJp
bGl0aWVzXG4gICAgICBzZWxlY3Rpb24gbWVjaGFuaXNtLCBvbiB0aGUgZGVmYXVsdCBzY3JlZW4g
ZGV2aWNlLlxuICAgKiAgVGhpcyBjb25zdHJ1Y3RvciB2YXJpYW50IGFsc28gc3VwcG9ydHMgdXNp
bmcgYSBzaGFyZWQgR0xDb250ZXh0LlxuICAgKlxuICAgKiBAdGhyb3dzIEdMRXhjZXB0aW9uIGlm
IG5vIEdMQ2FwYWJpbGl0aWVzIGFyZSBnaXZlbiBhbmQgbm8gZGVmYXVsdCBwcm9maWxlIGlzIGF2
YWlsYWJsZSBmb3IgdGhlIGRlZmF1bHQgZGVza3RvcCBkZXZpY2UuXG4gICAqIEBzZWUgR0xDYW52
YXMjR0xDYW52YXMoamF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlLCBq
YXZheC5tZWRpYS5vcGVuZ2wuR0xDYXBhYmlsaXRpZXNDaG9vc2VyLCBqYXZheC5tZWRpYS5vcGVu
Z2wuR0xDb250ZXh0LCBqYXZhLmF3dC5HcmFwaGljc0RldmljZSlcbiAgICovXG4gIHB1YmxpYyBH
TENhbnZhcyhHTENhcGFiaWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxVXNlciwgR0xDb250ZXh0IHNo
YXJlV2l0aCkgXG4gICAgICAgICAgdGhyb3dzIEdMRXhjZXB0aW9uIFxuICB7XG4gICAgdGhpcyhj
YXBzUmVxVXNlciwgbnVsbCwgc2hhcmVXaXRoLCBudWxsKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVz
IGEgbmV3IEdMQ2FudmFzIGNvbXBvbmVudC4gVGhlIHBhc3NlZCBHTENhcGFiaWxpdGllc1xuICAg
ICAgc3BlY2lmaWVzIHRoZSBPcGVuR0wgY2FwYWJpbGl0aWVzIGZvciB0aGUgY29tcG9uZW50OyBp
ZiBudWxsLCBhXG4gICAgICBkZWZhdWx0IHNldCBvZiBjYXBhYmlsaXRpZXMgaXMgdXNlZC4gVGhl
IEdMQ2FwYWJpbGl0aWVzQ2hvb3NlclxuICAgICAgc3BlY2lmaWVzIHRoZSBhbGdvcml0aG0gZm9y
IHNlbGVjdGluZyBvbmUgb2YgdGhlIGF2YWlsYWJsZVxuICAgICAgR0xDYXBhYmlsaXRpZXMgZm9y
IHRoZSBjb21wb25lbnQ7IGEgRGVmYXVsdEdMQ2FwYWJpbGl0ZXNDaG9vc2VyXG4gICAgICBpcyB1
c2VkIGlmIG51bGwgaXMgcGFzc2VkIGZvciB0aGlzIGFyZ3VtZW50LiBUaGUgcGFzc2VkXG4gICAg
ICBHTENvbnRleHQgc3BlY2lmaWVzIGFuIE9wZW5HTCBjb250ZXh0IHdpdGggd2hpY2ggdG8gc2hh
cmVcbiAgICAgIHRleHR1cmVzLCBkaXNwbGF5IGxpc3RzIGFuZCBvdGhlciBPcGVuR0wgc3RhdGUs
IGFuZCBtYXkgYmUgbnVsbFxuICAgICAgaWYgc2hhcmluZyBpcyBub3QgZGVzaXJlZC4gU2VlIHRo
ZSBub3RlIGluIHRoZSBvdmVydmlld1xuICAgICAgZG9jdW1lbnRhdGlvbiBvbiA8YVxuICAgICAg
aHJlZj1cIi4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCNTSEFSSU5HXCI+Y29udGV4dFxu
ICAgICAgc2hhcmluZzwvYT4uIFRoZSBwYXNzZWQgR3JhcGhpY3NEZXZpY2UgaW5kaWNhdGVzIHRo
ZSBzY3JlZW4gb25cbiAgICAgIHdoaWNoIHRvIGNyZWF0ZSB0aGUgR0xDYW52YXM7IHRoZSBHTERy
YXdhYmxlRmFjdG9yeSB1c2VzIHRoZVxuICAgICAgZGVmYXVsdCBzY3JlZW4gZGV2aWNlIG9mIHRo
ZSBsb2NhbCBHcmFwaGljc0Vudmlyb25tZW50IGlmIG51bGxcbiAgICAgIGlzIHBhc3NlZCBmb3Ig
dGhpcyBhcmd1bWVudC4gXG4gICAqIEB0aHJvd3MgR0xFeGNlcHRpb24gaWYgbm8gR0xDYXBhYmls
aXRpZXMgYXJlIGdpdmVuIGFuZCBubyBkZWZhdWx0IHByb2ZpbGUgaXMgYXZhaWxhYmxlIGZvciB0
aGUgZGVmYXVsdCBkZXNrdG9wIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyBHTENhbnZhcyhHTENh
cGFiaWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxVXNlcixcbiAgICAgICAgICAgICAgICAgIEdMQ2Fw
YWJpbGl0aWVzQ2hvb3NlciBjaG9vc2VyLFxuICAgICAgICAgICAgICAgICAgR0xDb250ZXh0IHNo
YXJlV2l0aCxcbiAgICAgICAgICAgICAgICAgIEdyYXBoaWNzRGV2aWNlIGRldmljZSkgXG4gICAg
ICB0aHJvd3MgR0xFeGNlcHRpb24gXG4gIHtcbiAgICAvKlxuICAgICAqIERldGVybWluYXRpb24g
b2YgdGhlIG5hdGl2ZSB3aW5kb3cgaXMgbWFkZSBpbiAnc3VwZXIuYWRkTm90aWZ5KCknLFxuICAg
ICAqIHdoaWNoIGNyZWF0ZXMgdGhlIG5hdGl2ZSBwZWVyIHVzaW5nIEFXVCdzIEdyYXBoaWNzQ29u
ZmlndXJhdGlvbi5cbiAgICAgKiBHcmFwaGljc0NvbmZpZ3VyYXRpb24gaXMgcmV0dXJuZWQgYnkg
dGhpcyBjbGFzcyBvdmVyd3JpdHRlblxuICAgICAqICdnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24o
KScsIHdoaWNoIHJldHVybnMgb3VyIE9wZW5HTCBjb21wYXRpYmxlXG4gICAgICogJ2Nob3Nlbicg
R3JhcGhpY3NDb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZihu
dWxsPT1jYXBzUmVxVXNlcikge1xuICAgICAgICBjYXBzUmVxVXNlciA9IG5ldyBHTENhcGFiaWxp
dGllcyhHTFByb2ZpbGUuZ2V0RGVmYXVsdChHTFByb2ZpbGUuZ2V0RGVmYXVsdERlc2t0b3BEZXZp
Y2UoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRvbid0IGFsbG93IHRoZSB1c2VyIHRv
IGNoYW5nZSBkYXRhXG4gICAgICAgIGNhcHNSZXFVc2VyID0gKEdMQ2FwYWJpbGl0aWVzSW1tdXRh
YmxlKSBjYXBzUmVxVXNlci5jbG9uZU11dGFibGUoKTtcbiAgICB9XG5cbiAgICBpZihudWxsPT1k
ZXZpY2UpIHtcbiAgICAgICAgR3JhcGhpY3NDb25maWd1cmF0aW9uIGdjID0gc3VwZXIuZ2V0R3Jh
cGhpY3NDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIGlmKG51bGwhPWdjKSB7XG4gICAgICAgICAg
ICBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlu
c3RhbnRpYXRpb24gd2lsbCBiZSBpc3N1ZWQgaW4gYWRkTm90aWZ5KClcbiAgICB0aGlzLmNhcHNS
ZXFVc2VyID0gY2Fwc1JlcVVzZXI7XG4gICAgdGhpcy5jaG9vc2VyID0gY2hvb3NlcjtcbiAgICB0
aGlzLnNoYXJlV2l0aCA9IHNoYXJlV2l0aDtcbiAgICB0aGlzLmRldmljZSA9IGRldmljZTtcbiAg
fVxuXG4gIHB1YmxpYyB2b2lkIHNldFNoYWxsVXNlT2Zmc2NyZWVuTGF5ZXIoYm9vbGVhbiB2KSB7
XG4gICAgICBzaGFsbFVzZU9mZnNjcmVlbkxheWVyID0gdjtcbiAgfVxuXG4gIHB1YmxpYyBmaW5h
bCBib29sZWFuIGdldFNoYWxsVXNlT2Zmc2NyZWVuTGF5ZXIoKSB7XG4gICAgICByZXR1cm4gc2hh
bGxVc2VPZmZzY3JlZW5MYXllcjsgICAgICAgIFxuICB9XG5cbiAgcHVibGljIGZpbmFsIGJvb2xl
YW4gaXNPZmZzY3JlZW5MYXllclN1cmZhY2VFbmFibGVkKCkge1xuICAgICAgaWYobnVsbCAhPSBk
cmF3YWJsZSkge1xuICAgICAgICAgIHJldHVybiAoKEpBV1RXaW5kb3cpZHJhd2FibGUuZ2V0TmF0
aXZlU3VyZmFjZSgpKS5pc09mZnNjcmVlbkxheWVyU3VyZmFjZUVuYWJsZWQoKTtcbiAgICAgIH1c
biAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIFxuICAvKipcbiAgICogT3ZlcnJpZGRlbiB0
byBjaG9vc2UgYSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb24gYSBwYXJlbnQgY29udGFpbmVyJ3Nc
biAgICogR3JhcGhpY3NEZXZpY2UgYmVjYXVzZSBib3RoIGRldmljZXNcbiAgICovXG4gICAgQE92
ZXJyaWRlXG4gIHB1YmxpYyBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2V0R3JhcGhpY3NDb25maWd1
cmF0aW9uKCkge1xuICAgIC8qXG4gICAgICogV29ya2Fyb3VuZCBmb3IgcHJvYmxlbXMgd2l0aCBY
aW5lcmFtYSBhbmQgamF2YS5hd3QuQ29tcG9uZW50LmNoZWNrR0RcbiAgICAgKiB3aGVuIGFkZGlu
ZyB0byBhIGNvbnRhaW5lciBvbiBhIGRpZmZlcmVudCBncmFwaGljcyBkZXZpY2UgdGhhbiB0aGVc
biAgICAgKiBvbmUgdGhhdCB0aGlzIENhbnZhcyBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgICog
XG4gICAgICogR0Mgd2lsbCBiZSBudWxsIHVubGVzczpcbiAgICAgKiAgIC0gQSBuYXRpdmUgcGVl
ciBoYXMgYXNzaWduZWQgaXQuIFRoaXMgbWVhbnMgd2UgaGF2ZSBhIG5hdGl2ZVxuICAgICAqICAg
ICBwZWVyLCBhbmQgYXJlIGFscmVhZHkgY29taXR0ZWQgdG8gYSBncmFwaGljcyBjb25maWd1cmF0
aW9uLlxuICAgICAqICAgLSBUaGlzIGNhbnZhcyBoYXMgYmVlbiBhZGRlZCB0byBhIGNvbXBvbmVu
dCBoaWVyYXJjaHkgYW5kIGhhc1xuICAgICAqICAgICBhbiBhbmNlc3RvciB3aXRoIGEgbm9uLW51
bGwgR0MsIGJ1dCB0aGUgbmF0aXZlIHBlZXIgaGFzIG5vdFxuICAgICAqICAgICB5ZXQgYmVlbiBj
cmVhdGVkLiBUaGlzIG1lYW5zIHdlIGNhbiBzdGlsbCBjaG9vc2UgdGhlIEdDIG9uXG4gICAgICog
ICAgIGFsbCBwbGF0Zm9ybXMgc2luY2UgdGhlIHBlZXIgaGFzbid0IGJlZW4gY3JlYXRlZC5cbiAg
ICAgKi9cbiAgICBmaW5hbCBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MgPSBzdXBlci5nZXRHcmFw
aGljc0NvbmZpZ3VyYXRpb24oKTtcbiAgICAvKlxuICAgICAqIGNob3NlbiBpcyBvbmx5IG5vbi1u
dWxsIG9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgR0xEcmF3YWJsZUZhY3RvcnlcbiAgICAgKiByZXR1
cm5zIGEgbm9uLW51bGwgR3JhcGhpY3NDb25maWd1cmF0aW9uIChpbiB0aGUgR0xDYW52YXNcbiAg
ICAgKiBjb25zdHJ1Y3RvcikuXG4gICAgICogXG4gICAgICogaWYgZ2MgaXMgZnJvbSB0aGlzIENh
bnZhcycgbmF0aXZlIHBlZXIgdGhlbiBpdCBzaG91bGQgZXF1YWwgY2hvc2VuLFxuICAgICAqIG90
aGVyd2lzZSBpdCBpcyBmcm9tIGFuIGFuY2VzdG9yIGNvbXBvbmVudCB0aGF0IHRoaXMgQ2FudmFz
IGlzIGJlaW5nXG4gICAgICogYWRkZWQgdG8sIGFuZCB3ZSBnbyBpbnRvIHRoaXMgYmxvY2suXG4g
ICAgICovXG4gICAgR3JhcGhpY3NDb25maWd1cmF0aW9uIGNob3NlbiA9ICBhd3RDb25maWcuZ2V0
QVdUR3JhcGhpY3NDb25maWd1cmF0aW9uKCk7XG5cbiAgICBpZiAoZ2MgIT0gbnVsbCAmJiBjaG9z
ZW4gIT0gbnVsbCAmJiAhY2hvc2VuLmVxdWFscyhnYykpIHtcbiAgICAgIC8qXG4gICAgICAgKiBD
aGVjayBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGdjLiBJZiB0aGV5IGRpZmZlciBieSBvbmx5IHRo
ZVxuICAgICAgICogZGV2aWNlIHRoZW4gcmV0dXJuIGEgbmV3IEdDY29uZmlnIHdpdGggdGhlIHN1
cGVyLWNsYXNzJyBHRGV2aWNlXG4gICAgICAgKiAoYW5kIHByZXN1bWFibHkgdGhlIHNhbWUgdmlz
dWFsIElEIGluIFhpbmVyYW1hKS5cbiAgICAgICAqIFxuICAgICAgICovXG4gICAgICBpZiAoIWNo
b3Nlbi5nZXREZXZpY2UoKS5nZXRJRHN0cmluZygpLmVxdWFscyhnYy5nZXREZXZpY2UoKS5nZXRJ
RHN0cmluZygpKSkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBIZXJlIHdlIHNlbGVjdCBhIEdy
YXBoaWNzQ29uZmlndXJhdGlvbiBvbiB0aGUgYWx0ZXJuYXRlXG4gICAgICAgICAqIGRldmljZSB0
aGF0IGlzIHByZXN1bWFibHkgaWRlbnRpY2FsIHRvIHRoZSBjaG9zZW5cbiAgICAgICAgICogY29u
ZmlndXJhdGlvbiwgYnV0IG9uIHRoZSBvdGhlciBkZXZpY2UuXG4gICAgICAgICAqIFxuICAgICAg
ICAgKiBTaG91bGQgcmVhbGx5IGNoZWNrIHRvIGVuc3VyZSB0aGF0IHdlIHNlbGVjdCBhIGNvbmZp
Z3VyYXRpb25cbiAgICAgICAgICogd2l0aCB0aGUgc2FtZSBYIHZpc3VhbCBJRCBmb3IgWGluZXJh
bWEgc2NyZWVucywgb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgKiBHTERyYXdhYmxlIG1heSBoYXZl
IHRoZSB3cm9uZyB2aXN1YWwgSUQgKEkgZG9uJ3QgdGhpbmsgdGhpc1xuICAgICAgICAgKiBldmVy
IGdldHMgdXBkYXRlZCkuIE1heSBuZWVkIHRvIGFkZCBhIG1ldGhvZCB0b1xuICAgICAgICAgKiBY
MTFHTERyYXdhYmxlRmFjdG9yeSB0byBkbyB0aGlzIGluIGEgcGxhdGZvcm0gc3BlY2lmaWNcbiAg
ICAgICAgICogbWFubmVyLlxuICAgICAgICAgKiBcbiAgICAgICAgICogSG93ZXZlciwgb24gcGxh
dGZvcm1zIHdoZXJlIHdlIGNhbiBhY3R1YWxseSBnZXQgaW50byB0aGlzXG4gICAgICAgICAqIGJs
b2NrLCBib3RoIGRldmljZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgdmlzdWFsIGxpc3QsIGFuZCB0
aGVcbiAgICAgICAgICogc2FtZSBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBzZWxlY3RlZCBoZXJl
LlxuICAgICAgICAgKi9cbiAgICAgICAgQVdUR3JhcGhpY3NDb25maWd1cmF0aW9uIGNvbmZpZyA9
IGNob29zZUdyYXBoaWNzQ29uZmlndXJhdGlvbiggKEdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlKWF3
dENvbmZpZy5nZXRDaG9zZW5DYXBhYmlsaXRpZXMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdMQ2FwYWJp
bGl0aWVzSW1tdXRhYmxlKWF3dENvbmZpZy5nZXRSZXF1ZXN0ZWRDYXBhYmlsaXRpZXMoKSxcbiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2hvb3NlciwgZ2MuZ2V0RGV2aWNlKCkpO1xuICAgICAgICBmaW5hbCBHcmFw
aGljc0NvbmZpZ3VyYXRpb24gY29tcGF0aWJsZSA9IChudWxsIT1jb25maWcpP2NvbmZpZy5nZXRB
V1RHcmFwaGljc0NvbmZpZ3VyYXRpb24oKTpudWxsO1xuICAgICAgICBib29sZWFuIGVxdWFsQ2Fw
cyA9IGNvbmZpZy5nZXRDaG9zZW5DYXBhYmlsaXRpZXMoKS5lcXVhbHMoYXd0Q29uZmlnLmdldENo
b3NlbkNhcGFiaWxpdGllcygpKTtcbiAgICAgICAgaWYoREVCVUcpIHtcbiAgICAgICAgICAgIEV4
Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbihcIkluZm86IENhbGwgU3RhY2s6IFwiK1RocmVhZC5j
dXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTtcbiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNl
KCk7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oXCIhISEgQ3JlYXRlZCBDb25maWcg
KG4pOiBIQVZFICAgIEdDIFwiK2Nob3Nlbik7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50
bG4oXCIhISEgQ3JlYXRlZCBDb25maWcgKG4pOiBUSElTICAgIEdDIFwiK2djKTtcbiAgICAgICAg
ICAgIFN5c3RlbS5lcnIucHJpbnRsbihcIiEhISBDcmVhdGVkIENvbmZpZyAobik6IENob29zZW4g
R0MgXCIrY29tcGF0aWJsZSk7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oXCIhISEg
Q3JlYXRlZCBDb25maWcgKG4pOiBIQVZFICAgIENGIFwiK2F3dENvbmZpZyk7XG4gICAgICAgICAg
ICBTeXN0ZW0uZXJyLnByaW50bG4oXCIhISEgQ3JlYXRlZCBDb25maWcgKG4pOiBDaG9vc2VuIENG
IFwiK2NvbmZpZyk7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oXCIhISEgQ3JlYXRl
ZCBDb25maWcgKG4pOiBFUVVBTFMgQ0FQUyBcIitlcXVhbENhcHMpO1xuICAgICAgICB9XG5cbiAg
ICAgICAgaWYgKGNvbXBhdGlibGUgIT0gbnVsbCkge1xuICAgICAgICAgIC8qXG4gICAgICAgICAg
ICogU2F2ZSB0aGUgbmV3IEdDIGZvciBlcXVhbHMgdGVzdCBhYm92ZSwgYW5kIHRvIHJldHVybiB0
b1xuICAgICAgICAgICAqIGFueSBvdXRzaWRlIGNhbGxlcnMgb2YgdGhpcyBtZXRob2QuXG4gICAg
ICAgICAgICovXG4gICAgICAgICAgY2hvc2VuID0gY29tcGF0aWJsZTtcblxuICAgICAgICAgIGF3
dENvbmZpZyA9IGNvbmZpZztcblxuICAgICAgICAgIGlmKCAhZXF1YWxDYXBzICYmIEdMQXV0b0Ry
YXdhYmxlLlNDUkVFTl9DSEFOR0VfQUNUSU9OX0VOQUJMRUQgKSB7XG4gICAgICAgICAgICAgIGRp
c3Bvc2UodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8q
XG4gICAgICAgKiBJZiBhIGNvbXBhdGlibGUgR0Mgd2FzIG5vdCBmb3VuZCBpbiB0aGUgYmxvY2sg
YWJvdmUsIHRoaXMgd2lsbFxuICAgICAgICogcmV0dXJuIHRoZSBHQyB0aGF0IHdhcyBzZWxlY3Rl
ZCBpbiB0aGUgY29uc3RydWN0b3IgKGFuZCBtaWdodFxuICAgICAgICogY2F1c2UgYW4gZXhjZXB0
aW9uIGluIENvbXBvbmVudC5jaGVja0dEIHdoZW4gYWRkaW5nIHRvIGFcbiAgICAgICAqIGNvbnRh
aW5lciwgYnV0IGluIHRoaXMgY2FzZSB0aGF0IHdvdWxkIGJlIHRoZSBkZXNpcmVkIGJlaGF2aW9y
KS5cbiAgICAgICAqIFxuICAgICAgICovXG4gICAgICByZXR1cm4gY2hvc2VuO1xuICAgIH0gZWxz
ZSBpZiAoZ2MgPT0gbnVsbCkge1xuICAgICAgLypcbiAgICAgICAqIFRoZSBHQyBpcyBudWxsLCB3
aGljaCBtZWFucyB3ZSBoYXZlIG5vIG5hdGl2ZSBwZWVyLCBhbmQgYXJlIG5vdFxuICAgICAgICog
cGFydCBvZiBhIChyZWFsaXplZCkgY29tcG9uZW50IGhpZXJhcmNoeS4gU28gd2UgcmV0dXJuIHRo
ZVxuICAgICAgICogZGVzaXJlZCB2aXN1YWwgdGhhdCB3YXMgc2VsZWN0ZWQgaW4gdGhlIGNvbnN0
cnVjdG9yIChwb3NzaWJseVxuICAgICAgICogbnVsbCkuXG4gICAgICAgKi9cbiAgICAgIHJldHVy
biBjaG9zZW47XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBPdGhlcndpc2Ugd2UgaGF2ZSBub3Qg
ZXhwbGljaXRseSBzZWxlY3RlZCBhIEdDIGluIHRoZSBjb25zdHJ1Y3Rvciwgc29cbiAgICAgKiBq
dXN0IHJldHVybiB3aGF0IENhbnZhcyB3b3VsZCBoYXZlLlxuICAgICAqL1xuICAgIHJldHVybiBn
YztcbiAgfVxuICBcbiAgcHVibGljIEdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEdMQ29udGV4dCBz
aGFyZVdpdGgpIHtcbiAgICAgIGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgICB0cnkge1xuICAg
ICAgICByZXR1cm4gKG51bGwgIT0gZHJhd2FibGUpID8gZHJhd2FibGUuY3JlYXRlQ29udGV4dChz
aGFyZVdpdGgpIDogbnVsbDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRyYXdhYmxlU3lu
Yy51bmxvY2soKTtcbiAgICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2b2lkIHNldFJlYWxpemVkKGJv
b2xlYW4gcmVhbGl6ZWQpIHtcbiAgfVxuXG4gIHB1YmxpYyBib29sZWFuIGlzUmVhbGl6ZWQoKSB7
XG4gICAgICBkcmF3YWJsZVN5bmMubG9jaygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJu
ICggbnVsbCAhPSBkcmF3YWJsZSApID8gZHJhd2FibGUuaXNSZWFsaXplZCgpIDogZmFsc2U7XG4g
ICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkcmF3YWJsZVN5bmMudW5sb2NrKCk7XG4gICAgICB9
XG4gIH1cblxuICBwdWJsaWMgaW50IGdldERlZmF1bHRDbG9zZU9wZXJhdGlvbigpIHtcbiAgICAg
IHJldHVybiBhd3RXaW5kb3dDbG9zaW5nUHJvdG9jb2wuZ2V0RGVmYXVsdENsb3NlT3BlcmF0aW9u
KCk7XG4gIH1cblxuICBwdWJsaWMgaW50IHNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihpbnQgb3Ap
IHtcbiAgICAgIHJldHVybiBhd3RXaW5kb3dDbG9zaW5nUHJvdG9jb2wuc2V0RGVmYXVsdENsb3Nl
T3BlcmF0aW9uKG9wKTtcbiAgfVxuXG4gIHB1YmxpYyB2b2lkIGRpc3BsYXkoKSB7XG4gICAgaWYo
ICF2YWxpZGF0ZUdMRHJhd2FibGUoKSApIHtcbiAgICAgICAgaWYoREVCVUcpIHtcbiAgICAgICAg
ICAgIFN5c3RlbS5lcnIucHJpbnRsbihcIkluZm86IEdMQ2FudmFzIGRpc3BsYXkgLSBza2lwcGVk
IEdMIHJlbmRlciwgZHJhd2FibGUgbm90IHZhbGlkIHlldFwiKTtcbiAgICAgICAgfVxuICAgICAg
ICByZXR1cm47IC8vIG5vdCB5ZXQgYXZhaWxhYmxlIC4uXG4gICAgfVxuICAgIG1heWJlRG9TaW5n
bGVUaHJlYWRlZFdvcmthcm91bmQoZGlzcGxheU9uRXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbixc
biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlBY3Rpb24pO1xuXG4g
ICAgYXd0V2luZG93Q2xvc2luZ1Byb3RvY29sLmFkZENsb3NpbmdMaXN0ZW5lck9uZVNob3QoKTtc
biAgfVxuXG4gIHByaXZhdGUgdm9pZCBkaXNwb3NlKGJvb2xlYW4gcmVnZW5lcmF0ZSkge1xuICAg
IGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgZmluYWwgR0xBbmltYXRv
ckNvbnRyb2wgYW5pbWF0b3IgPSAgZ2V0QW5pbWF0b3IoKTtcbiAgICAgICAgaWYoREVCVUcpIHtc
biAgICAgICAgICAgIEV4Y2VwdGlvbiBleDEgPSBuZXcgRXhjZXB0aW9uKFwiSW5mbzogZGlzcG9z
ZShcIityZWdlbmVyYXRlK1wiKSAtIFNUQVJULCBoYXNDb250ZXh0IFwiICtcbiAgICAgICAgICAg
ICAgICAgICAgKG51bGwhPWNvbnRleHQpICsgXCIsIGhhc0RyYXdhYmxlIFwiICsgKG51bGwhPWRy
YXdhYmxlKStcIiwgXCIrYW5pbWF0b3IpO1xuICAgICAgICAgICAgZXgxLnByaW50U3RhY2tUcmFj
ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobnVsbCE9Y29udGV4dCkge1xuICAgICAgICAg
ICAgYm9vbGVhbiBhbmltYXRvclBhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYobnVsbCE9
YW5pbWF0b3IpIHtcbiAgICAgICAgICAgICAgICAvLyBjYW4ndCByZW1vdmUgdXMgZnJvbSBhbmlt
YXRvciBmb3IgcmVjcmVhdGlvbmFsIGFkZE5vdGlmeSgpXG4gICAgICAgICAgICAgICAgYW5pbWF0
b3JQYXVzZWQgPSBhbmltYXRvci5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAg
ICBkaXNwb3NlUmVnZW5lcmF0ZT1yZWdlbmVyYXRlO1xuXG4gICAgICAgICAgICBpZiAoVGhyZWFk
aW5nLmlzU2luZ2xlVGhyZWFkZWQoKSAmJlxuICAgICAgICAgICAgICAgICFUaHJlYWRpbmcuaXNP
cGVuR0xUaHJlYWQoKSkge1xuICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciB0ZXJtaW5h
dGlvbiBpc3N1ZXMgd2l0aCBhcHBsZXRzIC0tXG4gICAgICAgICAgICAgIC8vIHN1bi5hcHBsZXQu
QXBwbGV0UGFuZWwgc2hvdWxkIHByb2JhYmx5IGJlIHBlcmZvcm1pbmcgdGhlXG4gICAgICAgICAg
ICAgIC8vIHJlbW92ZSgpIGNhbGwgb24gdGhlIEVEVCByYXRoZXIgdGhhbiBvbiBpdHMgb3duIHRo
cmVhZFxuICAgICAgICAgICAgICAvLyBIaW50OiBVc2VyIHNob3VsZCBydW4gcmVtb3ZlIGZyb20g
RURULlxuICAgICAgICAgICAgICBpZiAoVGhyZWFkaW5nSW1wbC5pc0FXVE1vZGUoKSAmJlxuICAg
ICAgICAgICAgICAgICAgVGhyZWFkLmhvbGRzTG9jayhnZXRUcmVlTG9jaygpKSkge1xuICAgICAg
ICAgICAgICAgIC8vIFRoZSB1c2VyIHJlYWxseSBzaG91bGQgbm90IGJlIGludm9raW5nIHJlbW92
ZSgpIGZyb20gdGhpc1xuICAgICAgICAgICAgICAgIC8vIHRocmVhZCAtLSBidXQgc2luY2UgaGUv
c2hlIGlzLCB3ZSBjYW4gbm90IGdvIG92ZXIgdG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gRURU
IGF0IHRoaXMgcG9pbnQuIFRyeSB0byBkZXN0cm95IHRoZSBjb250ZXh0IGZyb20gaGVyZS5cbiAg
ICAgICAgICAgICAgICBpZihjb250ZXh0LmlzQ3JlYXRlZCgpKSB7XG4gICAgICAgICAgICAgICAg
ICAgIGRyYXdhYmxlSGVscGVyLmludm9rZUdMKGRyYXdhYmxlLCBjb250ZXh0LCBkaXNwb3NlQWN0
aW9uLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZihj
b250ZXh0LmlzQ3JlYXRlZCgpKSB7XG4gICAgICAgICAgICAgICAgVGhyZWFkaW5nLmludm9rZU9u
T3BlbkdMVGhyZWFkKGRpc3Bvc2VPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rpb24pO1xuICAgICAg
ICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYoY29udGV4dC5pc0NyZWF0ZWQoKSkge1xu
ICAgICAgICAgICAgICBkcmF3YWJsZUhlbHBlci5pbnZva2VHTChkcmF3YWJsZSwgY29udGV4dCwg
ZGlzcG9zZUFjdGlvbiwgbnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGFu
aW1hdG9yUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0b3IucmVzdW1lKCk7XG4gICAg
ICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYoIXJlZ2VuZXJhdGUpIHtcbiAgICAgICAg
ICAgIGRpc3Bvc2VBYnN0cmFjdEdyYXBoaWNzRGV2aWNlKCk7XG4gICAgICAgIH1cblxuICAgICAg
ICBpZihERUJVRykge1xuICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFwiZGlzcG9zZShc
IityZWdlbmVyYXRlK1wiKSAtIEVORCwgXCIrYW5pbWF0b3IpO1xuICAgICAgICB9XG4gICAgfSBm
aW5hbGx5IHtcbiAgICAgICAgZHJhd2FibGVTeW5jLnVubG9jaygpO1xuICAgIH1cbiAgfVxuXG4g
IC8qKlxuICAgKiBKdXN0IGFuIGFsaWFzIGZvciByZW1vdmVOb3RpZnlcbiAgICovXG4gIHB1Ymxp
YyB2b2lkIGRlc3Ryb3koKSB7XG4gICAgcmVtb3ZlTm90aWZ5KCk7XG4gIH1cblxuICAvKiogT3Zl
cnJpZGRlbiB0byBjYXVzZSBPcGVuR0wgcmVuZGVyaW5nIHRvIGJlIHBlcmZvcm1lZCBkdXJpbmdc
biAgICAgIHJlcGFpbnQgY3ljbGVzLiBTdWJjbGFzc2VzIHdoaWNoIG92ZXJyaWRlIHRoaXMgbWV0
aG9kIG11c3QgY2FsbFxuICAgICAgc3VwZXIucGFpbnQoKSBpbiB0aGVpciBwYWludCgpIG1ldGhv
ZCBpbiBvcmRlciB0byBmdW5jdGlvblxuICAgICAgcHJvcGVybHkuIDxQPlxuXG4gICAgICA8Qj5P
dmVycmlkZXM6PC9CPlxuICAgICAgPERMPjxERD48Q09ERT5wYWludDwvQ09ERT4gaW4gY2xhc3Mg
PENPREU+amF2YS5hd3QuQ29tcG9uZW50PC9DT0RFPjwvREQ+PC9ETD4gKi9cbiAgICBAT3ZlcnJp
ZGVcbiAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykge1xuICAgIGlmIChCZWFucy5pc0Rl
c2lnblRpbWUoKSkge1xuICAgICAgLy8gTWFrZSBHTENhbnZhcyBiZWhhdmUgYmV0dGVyIGluIE5l
dEJlYW5zIEdVSSBidWlsZGVyXG4gICAgICBnLnNldENvbG9yKENvbG9yLkJMQUNLKTtcbiAgICAg
IGcuZmlsbFJlY3QoMCwgMCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpO1xuICAgICAgRm9udE1l
dHJpY3MgZm0gPSBnLmdldEZvbnRNZXRyaWNzKCk7XG4gICAgICBTdHJpbmcgbmFtZSA9IGdldE5h
bWUoKTtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgbmFtZSA9IGdldENsYXNz
KCkuZ2V0TmFtZSgpO1xuICAgICAgICBpbnQgaWR4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpO1xu
ICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmco
aWR4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFJlY3RhbmdsZTJEIGJvdW5kcyA9
IGZtLmdldFN0cmluZ0JvdW5kcyhuYW1lLCBnKTtcbiAgICAgIGcuc2V0Q29sb3IoQ29sb3IuV0hJ
VEUpO1xuICAgICAgZy5kcmF3U3RyaW5nKG5hbWUsXG4gICAgICAgICAgICAgICAgICAgKGludCkg
KChnZXRXaWR0aCgpICAtIGJvdW5kcy5nZXRXaWR0aCgpKSAgLyAyKSxcbiAgICAgICAgICAgICAg
ICAgICAoaW50KSAoKGdldEhlaWdodCgpICsgYm91bmRzLmdldEhlaWdodCgpKSAvIDIpKTtcbiAg
ICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoICEgdGhpcy5kcmF3YWJsZUhlbHBlci5pc0FuaW1h
dG9yQW5pbWF0aW5nKCkgKSB7XG4gICAgICAgIGRpc3BsYXkoKTtcbiAgICB9XG4gIH1cblxuICBS
ZWN1cnNpdmVMb2NrIGRyYXdhYmxlU3luYyA9IExvY2tGYWN0b3J5LmNyZWF0ZVJlY3Vyc2l2ZUxv
Y2soKTtcblxuICAvKiogT3ZlcnJpZGRlbiB0byB0cmFjayB3aGVuIHRoaXMgY29tcG9uZW50IGlz
IGFkZGVkIHRvIGEgY29udGFpbmVyLlxuICAgICAgU3ViY2xhc3NlcyB3aGljaCBvdmVycmlkZSB0
aGlzIG1ldGhvZCBtdXN0IGNhbGxcbiAgICAgIHN1cGVyLmFkZE5vdGlmeSgpIGluIHRoZWlyIGFk
ZE5vdGlmeSgpIG1ldGhvZCBpbiBvcmRlciB0b1xuICAgICAgZnVuY3Rpb24gcHJvcGVybHkuIDxQ
PlxuXG4gICAgICA8Qj5PdmVycmlkZXM6PC9CPlxuICAgICAgPERMPjxERD48Q09ERT5hZGROb3Rp
Znk8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEuYXd0LkNvbXBvbmVudDwvQ09ERT48L0REPjwv
REw+ICovXG4gICAgQFN1cHByZXNzV2FybmluZ3MoXCJkZXByZWNhdGlvblwiKVxuICAgIEBPdmVy
cmlkZVxuICBwdWJsaWMgdm9pZCBhZGROb3RpZnkoKSB7XG4gICAgaWYoREVCVUcpIHtcbiAgICAg
ICAgRXhjZXB0aW9uIGV4MSA9IG5ldyBFeGNlcHRpb24oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5n
ZXROYW1lKCkrXCIgLSBJbmZvOiBhZGROb3RpZnkgLSBzdGFydCwgYm91bmRzOiBcIit0aGlzLmdl
dEJvdW5kcygpKTtcbiAgICAgICAgZXgxLnByaW50U3RhY2tUcmFjZSgpO1xuICAgIH1cblxuICAg
IGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAq
ICdzdXBlci5hZGROb3RpZnkoKScgZGV0ZXJtaW5lcyB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9u
LFxuICAgICAgICAgKiB3aGlsZSBjYWxsaW5nIHRoaXMgY2xhc3MncyBvdmVycmlkZW4gJ2dldEdy
YXBoaWNzQ29uZmlndXJhdGlvbigpJyBtZXRob2RcbiAgICAgICAgICogYWZ0ZXIgd2hpY2ggaXQg
Y3JlYXRlcyB0aGUgbmF0aXZlIHBlZXIuXG4gICAgICAgICAqIEhlbmNlIHdlIGhhdmUgdG8gc2V0
IHRoZSAnYXd0Q29uZmlnJyBiZWZvcmUgc2luY2UgaXQncyBHcmFwaGljc0NvbmZpZ3VyYXRpb25c
biAgICAgICAgICogaXMgYmVpbmcgdXNlZCBpbiBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKS5c
biAgICAgICAgICogVGhpcyBjb2RlIG9yZGVyIGFsc28gYWxsb3dzIHJlY3JlYXRpb24sIGllIHJl
LWFkZGluZyB0aGUgR0xDYW52YXMuXG4gICAgICAgICAqL1xuICAgICAgICBhd3RDb25maWcgPSBj
aG9vc2VHcmFwaGljc0NvbmZpZ3VyYXRpb24oY2Fwc1JlcVVzZXIsIGNhcHNSZXFVc2VyLCBjaG9v
c2VyLCBkZXZpY2UpO1xuICAgICAgICBpZihudWxsPT1hd3RDb25maWcpIHtcbiAgICAgICAgICAg
IHRocm93IG5ldyBHTEV4Y2VwdGlvbihcIkVycm9yOiBOVUxMIEFXVEdyYXBoaWNzQ29uZmlndXJh
dGlvblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJlZm9yZSBuYXRpdmUgcGVlciBpcyB2
YWxpZDogWDExXG4gICAgICAgIGRpc2FibGVCYWNrZ3JvdW5kRXJhc2UoKTtcblxuICAgICAgICAv
LyBpc3N1ZXMgZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkgYW5kIGNyZWF0ZXMgdGhlIG5hdGl2
ZSBwZWVyXG4gICAgICAgIHN1cGVyLmFkZE5vdGlmeSgpO1xuXG4gICAgICAgIC8vIGFmdGVyIG5h
dGl2ZSBwZWVyIGlzIHZhbGlkOiBXaW5kb3dzXG4gICAgICAgIGRpc2FibGVCYWNrZ3JvdW5kRXJh
c2UoKTtcblxuICAgICAgICBpZiAoIUJlYW5zLmlzRGVzaWduVGltZSgpKSB7XG4gICAgICAgICAg
ICBjcmVhdGVEcmF3YWJsZUFuZENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlu
aXQgZHJhd2FibGUgYnkgcGFpbnQvZGlzcGxheSBtYWtlcyB0aGUgaW5pdCBzZXF1ZW5jZSBtb3Jl
IGVxdWFsXG4gICAgICAgIC8vIGZvciBhbGwgbGF1bmNoIGZsYXZvcnMgKGFwcGxldC9qYXZhd3Mv
Li4pXG4gICAgICAgIC8vIHZhbGlkYXRlR0xEcmF3YWJsZSgpO1xuXG4gICAgICAgIGlmKERFQlVH
KSB7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQo
KS5nZXROYW1lKCkrXCIgLSBJbmZvOiBhZGROb3RpZnkgLSBlbmQ6IHBlZXI6IFwiK2dldFBlZXIo
KSk7XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgIGRyYXdhYmxlU3luYy51bmxv
Y2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZvaWQgY3JlYXRlRHJhd2FibGVBbmRDb250
ZXh0KCkge1xuICAgIC8vIG5vIGxvY2sgcmVxdWlyZWQsIHNpbmNlIHRoaXMgcmVzb3VyY2UgYWlu
J3QgYXZhaWxhYmxlIHlldFxuICAgIGZpbmFsIEpBV1RXaW5kb3cgamF3dFdpbmRvdyA9IChKQVdU
V2luZG93KSBOYXRpdmVXaW5kb3dGYWN0b3J5LmdldE5hdGl2ZVdpbmRvdyh0aGlzLCBhd3RDb25m
aWcpO1xuICAgIGphd3RXaW5kb3cuc2V0U2hhbGxVc2VPZmZzY3JlZW5MYXllcihzaGFsbFVzZU9m
ZnNjcmVlbkxheWVyKTtcbiAgICBqYXd0V2luZG93LmxvY2tTdXJmYWNlKCk7XG4gICAgdHJ5IHtc
biAgICAgICAgZHJhd2FibGUgPSBHTERyYXdhYmxlRmFjdG9yeS5nZXRGYWN0b3J5KGNhcHNSZXFV
c2VyLmdldEdMUHJvZmlsZSgpKS5jcmVhdGVHTERyYXdhYmxlKGphd3RXaW5kb3cpO1xuICAgICAg
ICBjb250ZXh0ID0gKEdMQ29udGV4dEltcGwpIGRyYXdhYmxlLmNyZWF0ZUNvbnRleHQoc2hhcmVX
aXRoKTtcbiAgICAgICAgY29udGV4dC5zZXRTeW5jaHJvbml6ZWQodHJ1ZSk7XG4gICAgICAgIGNv
bnRleHQuc2V0Q29udGV4dENyZWF0aW9uRmxhZ3MoYWRkaXRpb25hbEN0eENyZWF0aW9uRmxhZ3Mp
O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGphd3RXaW5kb3cudW5sb2NrU3VyZmFjZSgpO1xu
ICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlR0xEcmF3YWJsZSgpIHtc
biAgICBib29sZWFuIHJlYWxpemVkID0gZmFsc2U7XG4gICAgaWYgKCFCZWFucy5pc0Rlc2lnblRp
bWUoKSkge1xuICAgICAgICBkcmF3YWJsZVN5bmMubG9jaygpO1xuICAgICAgICB0cnkge1xuICAg
ICAgICAgICAgaWYgKCBudWxsICE9IGRyYXdhYmxlICkge1xuICAgICAgICAgICAgICAgIHJlYWxp
emVkID0gZHJhd2FibGUuaXNSZWFsaXplZCgpO1xuICAgICAgICAgICAgICAgIGlmICggIXJlYWxp
emVkICYmIDAgPCBkcmF3YWJsZS5nZXRXaWR0aCgpICogZHJhd2FibGUuZ2V0SGVpZ2h0KCkgKSB7
XG4gICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlLnNldFJlYWxpemVkKHRydWUpO1xuICAgICAg
ICAgICAgICAgICAgICByZWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRS
ZXNoYXBlPXRydWU7IC8vIGVuc3VyZSBhIHJlc2hhcGUgaXMgYmVpbmcgc2VuZCAuLlxuICAgICAg
ICAgICAgICAgICAgICBpZihERUJVRykge1xuICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5n
IG1zZyA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpK1wiIC0gUmVhbGl6ZWQgRHJh
d2FibGU6IFwiK2RyYXdhYmxlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAv
LyBTeXN0ZW0uZXJyLnByaW50bG4obXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRocm93
YWJsZSB0ID0gbmV3IFRocm93YWJsZShtc2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdC5w
cmludFN0YWNrVHJhY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAg
IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgZHJhd2Fi
bGVTeW5jLnVubG9jaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWFsaXplZDtc
biAgfVxuXG4gIC8qKiA8cD5PdmVycmlkZGVuIHRvIHRyYWNrIHdoZW4gdGhpcyBjb21wb25lbnQg
aXMgcmVtb3ZlZCBmcm9tIGFcbiAgICAgIGNvbnRhaW5lci4gU3ViY2xhc3NlcyB3aGljaCBvdmVy
cmlkZSB0aGlzIG1ldGhvZCBtdXN0IGNhbGxcbiAgICAgIHN1cGVyLnJlbW92ZU5vdGlmeSgpIGlu
IHRoZWlyIHJlbW92ZU5vdGlmeSgpIG1ldGhvZCBpbiBvcmRlciB0b1xuICAgICAgZnVuY3Rpb24g
cHJvcGVybHkuIDwvcD5cbiAgICAgIDxwPlVzZXIgc2hhbGwgbm90IGNhbGwgdGhpcyBtZXRob2Qg
b3V0c2lkZSBvZiBFRFQsIHJlYWQgdGhlIEFXVC9Td2luZyBzcGVjc1xuICAgICAgYWJvdXQgdGhp
cy48L3A+XG4gICAgICA8Qj5PdmVycmlkZXM6PC9CPlxuICAgICAgPERMPjxERD48Q09ERT5yZW1v
dmVOb3RpZnk8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEuYXd0LkNvbXBvbmVudDwvQ09ERT48
L0REPjwvREw+ICovXG4gICAgQFN1cHByZXNzV2FybmluZ3MoXCJkZXByZWNhdGlvblwiKVxuICAg
IEBPdmVycmlkZVxuICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZnkoKSB7XG4gICAgaWYoREVCVUcp
IHtcbiAgICAgICAgRXhjZXB0aW9uIGV4MSA9IG5ldyBFeGNlcHRpb24oVGhyZWFkLmN1cnJlbnRU
aHJlYWQoKS5nZXROYW1lKCkrXCIgLSBJbmZvOiByZW1vdmVOb3RpZnkgLSBzdGFydFwiKTtcbiAg
ICAgICAgZXgxLnByaW50U3RhY2tUcmFjZSgpO1xuICAgIH1cblxuICAgIGF3dFdpbmRvd0Nsb3Np
bmdQcm90b2NvbC5yZW1vdmVDbG9zaW5nTGlzdGVuZXIoKTtcblxuICAgIGlmIChCZWFucy5pc0Rl
c2lnblRpbWUoKSkge1xuICAgICAgc3VwZXIucmVtb3ZlTm90aWZ5KCk7XG4gICAgfSBlbHNlIHtc
biAgICAgIGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgICB0cnkge1xuICAgICAgICBkaXNwb3Nl
KGZhbHNlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnRleHQ9bnVsbDtcbiAgICAg
ICAgZHJhd2FibGU9bnVsbDtcbiAgICAgICAgYXd0Q29uZmlnPW51bGw7XG4gICAgICAgIHN1cGVy
LnJlbW92ZU5vdGlmeSgpO1xuICAgICAgICBkcmF3YWJsZVN5bmMudW5sb2NrKCk7XG4gICAgICB9
XG4gICAgfVxuICAgIGlmKERFQlVHKSB7XG4gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihUaHJl
YWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKStcIiAtIEluZm86IHJlbW92ZU5vdGlmeSAtIGVu
ZCwgcGVlcjogXCIrZ2V0UGVlcigpKTtcbiAgICB9XG4gIH1cblxuICAvKiogT3ZlcnJpZGRlbiB0
byBjYXVzZSB7QGxpbmsgR0xEcmF3YWJsZUhlbHBlciNyZXNoYXBlfSB0byBiZVxuICAgICAgY2Fs
bGVkIG9uIGFsbCByZWdpc3RlcmVkIHtAbGluayBHTEV2ZW50TGlzdGVuZXJ9cy4gU3ViY2xhc3Nl
c1xuICAgICAgd2hpY2ggb3ZlcnJpZGUgdGhpcyBtZXRob2QgbXVzdCBjYWxsIHN1cGVyLnJlc2hh
cGUoKSBpblxuICAgICAgdGhlaXIgcmVzaGFwZSgpIG1ldGhvZCBpbiBvcmRlciB0byBmdW5jdGlv
biBwcm9wZXJseS4gPFA+XG5cbiAgICAgIDxCPk92ZXJyaWRlczo8L0I+XG4gICAgICA8REw+PERE
PjxDT0RFPnJlc2hhcGU8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEuYXd0LkNvbXBvbmVudDwv
Q09ERT48L0REPjwvREw+ICovXG4gICAgQFN1cHByZXNzV2FybmluZ3MoXCJkZXByZWNhdGlvblwi
KVxuICAgIEBPdmVycmlkZVxuICBwdWJsaWMgdm9pZCByZXNoYXBlKGludCB4LCBpbnQgeSwgaW50
IHdpZHRoLCBpbnQgaGVpZ2h0KSB7XG4gICAgc3VwZXIucmVzaGFwZSh4LCB5LCB3aWR0aCwgaGVp
Z2h0KTtcbiAgICBpZihudWxsICE9IGRyYXdhYmxlICYmIGRyYXdhYmxlLmlzUmVhbGl6ZWQoKSAm
JiAhZHJhd2FibGUuZ2V0Q2hvc2VuR0xDYXBhYmlsaXRpZXMoKS5pc09uc2NyZWVuKCkpIHtcbiAg
ICAgICAgZGlzcG9zZSh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzZW5kUmVzaGFwZSA9
IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqIDxCPk92ZXJyaWRlczo8L0I+XG4gICAgICA8REw+
PEREPjxDT0RFPnVwZGF0ZTwvQ09ERT4gaW4gY2xhc3MgPENPREU+amF2YS5hd3QuQ29tcG9uZW50
PC9DT0RFPjwvREQ+PC9ETD4gKi9cbiAgLyoqIFxuICAgKiBPdmVycmlkZGVuIGZyb20gQ2FudmFz
IHRvIHByZXZlbnQgdGhlIEFXVCdzIGNsZWFyaW5nIG9mIHRoZVxuICAgKiBjYW52YXMgZnJvbSBp
bnRlcmZlcmluZyB3aXRoIHRoZSBPcGVuR0wgcmVuZGVyaW5nLlxuICAgKi9cbiAgICBAT3ZlcnJp
ZGVcbiAgcHVibGljIHZvaWQgdXBkYXRlKEdyYXBoaWNzIGcpIHtcbiAgICBwYWludChnKTtcbiAg
fVxuICBcbiAgcHVibGljIHZvaWQgYWRkR0xFdmVudExpc3RlbmVyKEdMRXZlbnRMaXN0ZW5lciBs
aXN0ZW5lcikge1xuICAgIGRyYXdhYmxlSGVscGVyLmFkZEdMRXZlbnRMaXN0ZW5lcihsaXN0ZW5l
cik7XG4gIH1cblxuICBwdWJsaWMgdm9pZCBhZGRHTEV2ZW50TGlzdGVuZXIoaW50IGluZGV4LCBH
TEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHtcbiAgICBkcmF3YWJsZUhlbHBlci5hZGRHTEV2ZW50
TGlzdGVuZXIoaW5kZXgsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyB2b2lkIHJlbW92ZUdM
RXZlbnRMaXN0ZW5lcihHTEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHtcbiAgICBkcmF3YWJsZUhl
bHBlci5yZW1vdmVHTEV2ZW50TGlzdGVuZXIobGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHZv
aWQgc2V0QW5pbWF0b3IoR0xBbmltYXRvckNvbnRyb2wgYW5pbWF0b3JDb250cm9sKSB7XG4gICAg
ZHJhd2FibGVIZWxwZXIuc2V0QW5pbWF0b3IoYW5pbWF0b3JDb250cm9sKTtcbiAgfVxuXG4gIHB1
YmxpYyBHTEFuaW1hdG9yQ29udHJvbCBnZXRBbmltYXRvcigpIHtcbiAgICByZXR1cm4gZHJhd2Fi
bGVIZWxwZXIuZ2V0QW5pbWF0b3IoKTtcbiAgfVxuXG4gIHB1YmxpYyB2b2lkIGludm9rZShib29s
ZWFuIHdhaXQsIEdMUnVubmFibGUgZ2xSdW5uYWJsZSkge1xuICAgIGRyYXdhYmxlSGVscGVyLmlu
dm9rZSh0aGlzLCB3YWl0LCBnbFJ1bm5hYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyB2b2lkIHNldENv
bnRleHQoR0xDb250ZXh0IGN0eCkge1xuICAgIGNvbnRleHQ9KEdMQ29udGV4dEltcGwpY3R4O1xu
ICAgIGlmKG51bGwgIT0gY29udGV4dCkge1xuICAgICAgICBjb250ZXh0LnNldENvbnRleHRDcmVh
dGlvbkZsYWdzKGFkZGl0aW9uYWxDdHhDcmVhdGlvbkZsYWdzKTtcbiAgICB9XG4gIH1cblxuICBw
dWJsaWMgR0xDb250ZXh0IGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1c
blxuICBwdWJsaWMgR0wgZ2V0R0woKSB7XG4gICAgaWYgKEJlYW5zLmlzRGVzaWduVGltZSgpKSB7
XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgR0xDb250ZXh0IGN0eCA9IGdldENvbnRl
eHQoKTtcbiAgICByZXR1cm4gKGN0eCA9PSBudWxsKSA/IG51bGwgOiBjdHguZ2V0R0woKTtcbiAg
fVxuXG4gIHB1YmxpYyBHTCBzZXRHTChHTCBnbCkge1xuICAgIEdMQ29udGV4dCBjdHggPSBnZXRD
b250ZXh0KCk7XG4gICAgaWYgKGN0eCAhPSBudWxsKSB7XG4gICAgICBjdHguc2V0R0woZ2wpO1xu
ICAgICAgcmV0dXJuIGdsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG5cbiAgcHVi
bGljIHZvaWQgc2V0QXV0b1N3YXBCdWZmZXJNb2RlKGJvb2xlYW4gb25Pck9mZikge1xuICAgIGRy
YXdhYmxlSGVscGVyLnNldEF1dG9Td2FwQnVmZmVyTW9kZShvbk9yT2ZmKTtcbiAgfVxuXG4gIHB1
YmxpYyBib29sZWFuIGdldEF1dG9Td2FwQnVmZmVyTW9kZSgpIHtcbiAgICByZXR1cm4gZHJhd2Fi
bGVIZWxwZXIuZ2V0QXV0b1N3YXBCdWZmZXJNb2RlKCk7XG4gIH1cblxuICBwdWJsaWMgdm9pZCBz
d2FwQnVmZmVycygpIHtcbiAgICBtYXliZURvU2luZ2xlVGhyZWFkZWRXb3JrYXJvdW5kKHN3YXBC
dWZmZXJzT25FdmVudERpc3BhdGNoVGhyZWFkQWN0aW9uLCBzd2FwQnVmZmVyc0FjdGlvbik7XG4g
IH1cblxuICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0Q3JlYXRpb25GbGFncyhpbnQgZmxhZ3MpIHtc
biAgICBhZGRpdGlvbmFsQ3R4Q3JlYXRpb25GbGFncyA9IGZsYWdzO1xuICB9XG4gICAgICBcbiAg
cHVibGljIGludCBnZXRDb250ZXh0Q3JlYXRpb25GbGFncygpIHtcbiAgICByZXR1cm4gYWRkaXRp
b25hbEN0eENyZWF0aW9uRmxhZ3M7ICAgICAgICAgICAgICAgIFxuICB9XG4gICAgICAgICAgXG4g
IHB1YmxpYyBHTFByb2ZpbGUgZ2V0R0xQcm9maWxlKCkge1xuICAgIHJldHVybiBjYXBzUmVxVXNl
ci5nZXRHTFByb2ZpbGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBHTENhcGFiaWxpdGllc0ltbXV0YWJs
ZSBnZXRDaG9zZW5HTENhcGFiaWxpdGllcygpIHtcbiAgICBpZiAoYXd0Q29uZmlnID09IG51bGwp
IHtcbiAgICAgICAgdGhyb3cgbmV3IEdMRXhjZXB0aW9uKFwiTm8gQVdUR3JhcGhpY3NDb25maWd1
cmF0aW9uOiBcIit0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKEdMQ2FwYWJpbGl0aWVzSW1t
dXRhYmxlKWF3dENvbmZpZy5nZXRDaG9zZW5DYXBhYmlsaXRpZXMoKTtcbiAgfVxuXG4gIHB1Ymxp
YyBHTENhcGFiaWxpdGllc0ltbXV0YWJsZSBnZXRSZXF1ZXN0ZWRHTENhcGFiaWxpdGllcygpIHtc
biAgICBpZiAoYXd0Q29uZmlnID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGNhcHNSZXFVc2Vy
O1xuICAgIH1cblxuICAgIHJldHVybiAoR0xDYXBhYmlsaXRpZXNJbW11dGFibGUpYXd0Q29uZmln
LmdldFJlcXVlc3RlZENhcGFiaWxpdGllcygpO1xuICB9XG5cbiAgcHVibGljIE5hdGl2ZVN1cmZh
Y2UgZ2V0TmF0aXZlU3VyZmFjZSgpIHtcbiAgICAgIGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAg
ICB0cnkge1xuICAgICAgICByZXR1cm4gKG51bGwgIT0gZHJhd2FibGUpID8gZHJhd2FibGUuZ2V0
TmF0aXZlU3VyZmFjZSgpIDogbnVsbDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRyYXdh
YmxlU3luYy51bmxvY2soKTtcbiAgICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb25nIGdldEhhbmRs
ZSgpIHtcbiAgICAgIGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgICB0cnkge1xuICAgICAgICBy
ZXR1cm4gKG51bGwgIT0gZHJhd2FibGUpID8gZHJhd2FibGUuZ2V0SGFuZGxlKCkgOiAwO1xuICAg
ICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZHJhd2FibGVTeW5jLnVubG9jaygpO1xuICAgICAgfVxu
ICB9XG5cbiAgcHVibGljIEdMRHJhd2FibGVGYWN0b3J5IGdldEZhY3RvcnkoKSB7XG4gICAgICBk
cmF3YWJsZVN5bmMubG9jaygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChudWxsICE9
IGRyYXdhYmxlKSA/IGRyYXdhYmxlLmdldEZhY3RvcnkoKSA6IG51bGw7XG4gICAgICB9IGZpbmFs
bHkge1xuICAgICAgICBkcmF3YWJsZVN5bmMudW5sb2NrKCk7XG4gICAgICB9XG4gIH1cblxuICBA
T3ZlcnJpZGVcbiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiAgICBmaW5hbCBpbnQgZHcg
PSAobnVsbCE9ZHJhd2FibGUpID8gZHJhd2FibGUuZ2V0V2lkdGgoKSA6IC0xO1xuICAgIGZpbmFs
IGludCBkaCA9IChudWxsIT1kcmF3YWJsZSkgPyBkcmF3YWJsZS5nZXRIZWlnaHQoKSA6IC0xO1xu
ICAgIFxuICAgIHJldHVybiBcIkFXVC1HTENhbnZhc1tSZWFsaXplZCBcIitpc1JlYWxpemVkKCkr
XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiLFxcblxcdFwiKygobnVsbCE9ZHJhd2FibGUp
P2RyYXdhYmxlLmdldENsYXNzKCkuZ2V0TmFtZSgpOlwibnVsbC1kcmF3YWJsZVwiKSsgICAgICAg
ICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiLFxcblxcdFJl
YWxpemVkIFwiK2lzUmVhbGl6ZWQoKStcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCIsXFxu
XFx0RmFjdG9yeSAgIFwiK2dldEZhY3RvcnkoKStcbiAgICAgICAgICAgICAgICAgICAgICAgICAg
XCIsXFxuXFx0aGFuZGxlICAgIDB4XCIrTG9uZy50b0hleFN0cmluZyhnZXRIYW5kbGUoKSkrXG4g
ICAgICAgICAgICAgICAgICAgICAgICAgIFwiLFxcblxcdERyYXdhYmxlIHNpemUgXCIrZHcrXCJ4
XCIrZGgrXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiLFxcblxcdEFXVCBwb3MgXCIrZ2V0
WCgpK1wiL1wiK2dldFkoKStcIiwgc2l6ZSBcIitnZXRXaWR0aCgpK1wieFwiK2dldEhlaWdodCgp
K1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIixcXG5cXHR2aXNpYmxlIFwiK2lzVmlzaWJs
ZSgpK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIixcXG5cXHRcIithd3RDb25maWcrXCJd
XCI7XG4gIH1cbiAgXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBJbnRlcm5hbHMgb25seSBiZWxv
dyB0aGlzIHBvaW50XG4gIC8vXG5cbiAgcHJpdmF0ZSB2b2lkIG1heWJlRG9TaW5nbGVUaHJlYWRl
ZFdvcmthcm91bmQoUnVubmFibGUgZXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbixcbiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVubmFibGUgaW52b2tlR0xB
Y3Rpb24pIHtcbiAgICBpZiAoVGhyZWFkaW5nLmlzU2luZ2xlVGhyZWFkZWQoKSAmJlxuICAgICAg
ICAhVGhyZWFkaW5nLmlzT3BlbkdMVGhyZWFkKCkpIHtcbiAgICAgIFRocmVhZGluZy5pbnZva2VP
bk9wZW5HTFRocmVhZChldmVudERpc3BhdGNoVGhyZWFkQWN0aW9uKTtcbiAgICB9IGVsc2Uge1xu
ICAgICAgZHJhd2FibGVIZWxwZXIuaW52b2tlR0woZHJhd2FibGUsIGNvbnRleHQsIGludm9rZUdM
QWN0aW9uLCBpbml0QWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBEaXNwb3NlQWN0aW9u
IGltcGxlbWVudHMgUnVubmFibGUge1xuICAgIHB1YmxpYyB2b2lkIHJ1bigpIHtcbiAgICAgIGRy
YXdhYmxlSGVscGVyLmRpc3Bvc2UoR0xDYW52YXMudGhpcyk7XG5cbiAgICAgIGlmKG51bGwhPWNv
bnRleHQpIHtcbiAgICAgICAgY29udGV4dC5tYWtlQ3VycmVudCgpOyAvLyBpbXBsaWNpdCB3YWl0
IGZvciBsb2NrIC4uXG4gICAgICAgIGNvbnRleHQuZGVzdHJveSgpO1xuICAgICAgICBjb250ZXh0
PW51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmKG51bGwhPWRyYXdhYmxlKSB7XG4gICAgICAgICAg
ZmluYWwgSkFXVFdpbmRvdyBqYXd0V2luZG93ID0gKEpBV1RXaW5kb3cpZHJhd2FibGUuZ2V0TmF0
aXZlU3VyZmFjZSgpO1xuICAgICAgICAgIGRyYXdhYmxlLnNldFJlYWxpemVkKGZhbHNlKTtcbiAg
ICAgICAgICBkcmF3YWJsZT1udWxsO1xuICAgICAgICAgIGlmKG51bGwhPWphd3RXaW5kb3cpIHtc
biAgICAgICAgICAgIGphd3RXaW5kb3cuZGVzdHJveSgpO1xuICAgICAgICAgIH0gICAgICAgICAg
XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmKGRpc3Bvc2VSZWdlbmVyYXRlKSB7XG4gICAgICAg
ICAgLy8gU2ltaWxhciBwcm9jZXNzIGFzIGluIGFkZE5vdGlmeSgpIVxuICAgICAgICAgIFxuICAg
ICAgICAgIC8vIFJlY3JlYXRlIEdMRHJhd2FibGUvR0xDb250ZXh0IHRvIHJlZmxlY3QgaXQncyBu
ZXcgZ3JhcGhpY3MgY29uZmlndXJhdGlvblxuICAgICAgICAgIGNyZWF0ZURyYXdhYmxlQW5kQ29u
dGV4dCgpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmKERFQlVHKSB7XG4gICAgICAgICAgICBT
eXN0ZW0uZXJyLnByaW50bG4oXCJHTENhbnZhcy5kaXNwb3NlKHRydWUpOiBuZXcgZHJhd2FibGU6
IFwiK2RyYXdhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsaWRhdGVHTERyYXdhYmxl
KCk7IC8vIGltbWVkaWF0ZSBhdHRlbXB0IHRvIHJlY3JlYXRlIHRoZSBkcmF3YWJsZVxuICAgICAg
fVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGJvb2xlYW4gZGlzcG9zZVJlZ2VuZXJhdGU7XG4gIHBy
aXZhdGUgRGlzcG9zZUFjdGlvbiBkaXNwb3NlQWN0aW9uID0gbmV3IERpc3Bvc2VBY3Rpb24oKTtc
blxuICBwcml2YXRlIERpc3Bvc2VPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rpb24gZGlzcG9zZU9u
RXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbiA9XG4gICAgbmV3IERpc3Bvc2VPbkV2ZW50RGlzcGF0
Y2hUaHJlYWRBY3Rpb24oKTtcblxuICBjbGFzcyBEaXNwb3NlT25FdmVudERpc3BhdGNoVGhyZWFk
QWN0aW9uIGltcGxlbWVudHMgUnVubmFibGUge1xuICAgIHB1YmxpYyB2b2lkIHJ1bigpIHtcbiAg
ICAgIGRyYXdhYmxlSGVscGVyLmludm9rZUdMKGRyYXdhYmxlLCBjb250ZXh0LCBkaXNwb3NlQWN0
aW9uLCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBEaXNwb3NlQWJzdHJhY3RHcmFwaGlj
c0RldmljZUFjdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHtcbiAgICBwdWJsaWMgdm9pZCBydW4o
KSB7XG4gICAgICBpZihudWxsICE9IGF3dENvbmZpZykge1xuICAgICAgICAgIGZpbmFsIEFic3Ry
YWN0R3JhcGhpY3NEZXZpY2UgYWRldmljZSA9IGF3dENvbmZpZy5nZXRTY3JlZW4oKS5nZXREZXZp
Y2UoKTtcbiAgICAgICAgICBmaW5hbCBTdHJpbmcgYWRldmljZU1zZztcbiAgICAgICAgICBpZihE
RUJVRykge1xuICAgICAgICAgICAgYWRldmljZU1zZyA9IGFkZXZpY2UudG9TdHJpbmcoKTtcbiAg
ICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRldmljZU1zZyA9IG51bGw7ICBcbiAgICAg
ICAgICB9XG4gICAgICAgICAgYm9vbGVhbiBjbG9zZWQgPSBhd3RDb25maWcuZ2V0U2NyZWVuKCku
Z2V0RGV2aWNlKCkuY2xvc2UoKTtcbiAgICAgICAgICBpZihERUJVRykge1xuICAgICAgICAgICAg
U3lzdGVtLmVyci5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgXCIg
LSBHTENhbnZhcy5kaXNwb3NlKGZhbHNlKTogY2xvc2VkIEdyYXBoaWNzRGV2aWNlOiBcIithZGV2
aWNlTXNnK1wiLCByZXN1bHQ6IFwiK2Nsb3NlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3
dENvbmZpZz1udWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIERpc3Bvc2VBYnN0
cmFjdEdyYXBoaWNzRGV2aWNlQWN0aW9uIGRpc3Bvc2VBYnN0cmFjdEdyYXBoaWNzRGV2aWNlQWN0
aW9uID0gbmV3IERpc3Bvc2VBYnN0cmFjdEdyYXBoaWNzRGV2aWNlQWN0aW9uKCk7XG5cbiAgLyoq
XG4gICAqIERpc3Bvc2VzIHRoZSBBYnN0cmFjdEdyYXBoaWNzRGV2aWNlIHdpdGhpbiBFRFQsXG4g
ICAqIHNpbmNlIHJlc291cmNlcyBjcmVhdGVkIChYMTE6IERpc3BsYXkpLCBtdXN0IGJlIGRlc3Ry
b3llZCBpbiB0aGUgc2FtZSB0aHJlYWQsIHdoZXJlIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQuXG4g
ICAqXG4gICAqIEBzZWUgI2Nob29zZUdyYXBoaWNzQ29uZmlndXJhdGlvbihqYXZheC5tZWRpYS5v
cGVuZ2wuR0xDYXBhYmlsaXRpZXNJbW11dGFibGUsIGphdmF4Lm1lZGlhLm9wZW5nbC5HTENhcGFi
aWxpdGllc0ltbXV0YWJsZSwgamF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzQ2hvb3Nl
ciwgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2UpXG4gICAqL1xuICB2b2lkIGRpc3Bvc2VBYnN0cmFj
dEdyYXBoaWNzRGV2aWNlKCkgIHtcbiAgICBpZiggRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFk
KCkgfHwgVGhyZWFkLmhvbGRzTG9jayhnZXRUcmVlTG9jaygpKSApIHtcbiAgICAgICAgZGlzcG9z
ZUFic3RyYWN0R3JhcGhpY3NEZXZpY2VBY3Rpb24ucnVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAg
ICAgdHJ5IHtcbiAgICAgICAgICAgIEV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChkaXNwb3NlQWJz
dHJhY3RHcmFwaGljc0RldmljZUFjdGlvbik7XG4gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25U
YXJnZXRFeGNlcHRpb24gZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdMRXhjZXB0aW9uKGUu
Z2V0VGFyZ2V0RXhjZXB0aW9uKCkpO1xuICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2Vw
dGlvbiBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgR0xFeGNlcHRpb24oZSk7XG4gICAgICAg
IH1cbiAgICB9XG4gIH1cblxuICBjbGFzcyBJbml0QWN0aW9uIGltcGxlbWVudHMgUnVubmFibGUg
e1xuICAgIHB1YmxpYyB2b2lkIHJ1bigpIHtcbiAgICAgIGRyYXdhYmxlSGVscGVyLmluaXQoR0xD
YW52YXMudGhpcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgSW5pdEFjdGlvbiBpbml0QWN0aW9u
ID0gbmV3IEluaXRBY3Rpb24oKTtcbiAgXG4gIGNsYXNzIERpc3BsYXlBY3Rpb24gaW1wbGVtZW50
cyBSdW5uYWJsZSB7XG4gICAgcHVibGljIHZvaWQgcnVuKCkge1xuICAgICAgaWYgKHNlbmRSZXNo
YXBlKSB7XG4gICAgICAgIGlmKERFQlVHKSB7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50
bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkrXCIgLSByZXNoYXBlOiBcIitnZXRX
aWR0aCgpK1wieFwiK2dldEhlaWdodCgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiB3
ZSBpZ25vcmUgdGhlIGdpdmVuIHggYW5kIHkgd2l0aGluIHRoZSBwYXJlbnQgY29tcG9uZW50XG4g
ICAgICAgIC8vIHNpbmNlIHdlIGFyZSBkcmF3aW5nIGRpcmVjdGx5IGludG8gdGhpcyBoZWF2eXdl
aWdodCBjb21wb25lbnQuXG4gICAgICAgIGRyYXdhYmxlSGVscGVyLnJlc2hhcGUoR0xDYW52YXMu
dGhpcywgMCwgMCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpO1xuICAgICAgICBzZW5kUmVzaGFw
ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBkcmF3YWJsZUhlbHBlci5kaXNwbGF5KEdMQ2Fu
dmFzLnRoaXMpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIERpc3BsYXlBY3Rpb24gZGlzcGxheUFj
dGlvbiA9IG5ldyBEaXNwbGF5QWN0aW9uKCk7XG5cbiAgY2xhc3MgU3dhcEJ1ZmZlcnNBY3Rpb24g
aW1wbGVtZW50cyBSdW5uYWJsZSB7XG4gICAgcHVibGljIHZvaWQgcnVuKCkge1xuICAgICAgZHJh
d2FibGUuc3dhcEJ1ZmZlcnMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBTd2FwQnVmZmVyc0Fj
dGlvbiBzd2FwQnVmZmVyc0FjdGlvbiA9IG5ldyBTd2FwQnVmZmVyc0FjdGlvbigpO1xuXG4gIC8v
IFdvcmthcm91bmQgZm9yIEFUSSBkcml2ZXIgYnVncyByZWxhdGVkIHRvIG11bHRpdGhyZWFkaW5n
IGlzc3Vlc1xuICAvLyBsaWtlIHNpbXVsdGFuZW91cyByZW5kZXJpbmcgdmlhIEFuaW1hdG9ycyB0
byBjYW52YXNlcyB0aGF0IGFyZVxuICAvLyBiZWluZyByZXNpemVkIG9uIHRoZSBBV1QgZXZlbnQg
ZGlzcGF0Y2ggdGhyZWFkXG4gIGNsYXNzIERpc3BsYXlPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rp
b24gaW1wbGVtZW50cyBSdW5uYWJsZSB7XG4gICAgcHVibGljIHZvaWQgcnVuKCkge1xuICAgICAg
ZHJhd2FibGVIZWxwZXIuaW52b2tlR0woZHJhd2FibGUsIGNvbnRleHQsIGRpc3BsYXlBY3Rpb24s
IGluaXRBY3Rpb24pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIERpc3BsYXlPbkV2ZW50RGlzcGF0
Y2hUaHJlYWRBY3Rpb24gZGlzcGxheU9uRXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbiA9XG4gICAg
bmV3IERpc3BsYXlPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rpb24oKTtcbiAgY2xhc3MgU3dhcEJ1
ZmZlcnNPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rpb24gaW1wbGVtZW50cyBSdW5uYWJsZSB7XG4g
ICAgcHVibGljIHZvaWQgcnVuKCkge1xuICAgICAgZHJhd2FibGVIZWxwZXIuaW52b2tlR0woZHJh
d2FibGUsIGNvbnRleHQsIHN3YXBCdWZmZXJzQWN0aW9uLCBpbml0QWN0aW9uKTtcbiAgICB9XG4g
IH1cbiAgcHJpdmF0ZSBTd2FwQnVmZmVyc09uRXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbiBzd2Fw
QnVmZmVyc09uRXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbiA9XG4gICAgbmV3IFN3YXBCdWZmZXJz
T25FdmVudERpc3BhdGNoVGhyZWFkQWN0aW9uKCk7XG5cbiAgLy8gRGlzYWJsZXMgdGhlIEFXVCdz
IGVyYXNpbmcgb2YgdGhpcyBDYW52YXMncyBiYWNrZ3JvdW5kIG9uIFdpbmRvd3NcbiAgLy8gaW4g
SmF2YSBTRSA2LiBUaGlzIGludGVybmFsIEFQSSBpcyBub3QgYXZhaWxhYmxlIGluIHByZXZpb3Vz
XG4gIC8vIHJlbGVhc2VzLCBidXQgdGhlIHN5c3RlbSBwcm9wZXJ0eVxuICAvLyAtRHN1bi5hd3Qu
bm9lcmFzZWJhY2tncm91bmQ9dHJ1ZSBjYW4gYmUgc3BlY2lmaWVkIHRvIGdldCBzaW1pbGFyXG4g
IC8vIHJlc3VsdHMgZ2xvYmFsbHkgaW4gcHJldmlvdXMgcmVsZWFzZXMuXG4gIHByaXZhdGUgc3Rh
dGljIGJvb2xlYW4gZGlzYWJsZUJhY2tncm91bmRFcmFzZUluaXRpYWxpemVkO1xuICBwcml2YXRl
IHN0YXRpYyBNZXRob2QgIGRpc2FibGVCYWNrZ3JvdW5kRXJhc2VNZXRob2Q7XG4gIHByaXZhdGUg
dm9pZCBkaXNhYmxlQmFja2dyb3VuZEVyYXNlKCkge1xuICAgIGlmICghZGlzYWJsZUJhY2tncm91
bmRFcmFzZUluaXRpYWxpemVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBBY2Nlc3NDb250cm9s
bGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxPYmplY3Q+KCkge1xuICAgICAg
ICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAg
ICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBnZXRUb29sa2l0KCkuZ2V0Q2xhc3MoKTtcbiAgICAg
ICAgICAgICAgICB3aGlsZSAoY2xhenogIT0gbnVsbCAmJiBkaXNhYmxlQmFja2dyb3VuZEVyYXNl
TWV0aG9kID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAg
ICAgICAgIGRpc2FibGVCYWNrZ3JvdW5kRXJhc2VNZXRob2QgPVxuICAgICAgICAgICAgICAgICAg
ICAgIGNsYXp6LmdldERlY2xhcmVkTWV0aG9kKFwiZGlzYWJsZUJhY2tncm91bmRFcmFzZVwiLFxu
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1td
IHsgQ2FudmFzLmNsYXNzIH0pO1xuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQmFja2dyb3Vu
ZEVyYXNlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICB9IGNh
dGNoIChFeGNlcHRpb24gZSkge1xuICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IGNsYXp6Lmdl
dFN1cGVyY2xhc3MoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4g
ICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7XG4gICAgICAgICAgICAgIH1cbiAg
ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4g
ICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge1xuICAgICAgfVxuICAgICAgZGlzYWJsZUJhY2tn
cm91bmRFcmFzZUluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIGlmKERFQlVHKSB7XG4gICAgICAg
IFN5c3RlbS5lcnIucHJpbnRsbihcIkdMQ2FudmFzOiBUSyBkaXNhYmxlQmFja2dyb3VuZEVyYXNl
IG1ldGhvZCBmb3VuZDogXCIrXG4gICAgICAgICAgICAgICAgKG51bGwhPWRpc2FibGVCYWNrZ3Jv
dW5kRXJhc2VNZXRob2QpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRpc2FibGVCYWNrZ3Jv
dW5kRXJhc2VNZXRob2QgIT0gbnVsbCkge1xuICAgICAgVGhyb3dhYmxlIHQ9bnVsbDtcbiAgICAg
IHRyeSB7XG4gICAgICAgIGRpc2FibGVCYWNrZ3JvdW5kRXJhc2VNZXRob2QuaW52b2tlKGdldFRv
b2xraXQoKSwgbmV3IE9iamVjdFtdIHsgdGhpcyB9KTtcbiAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlv
biBlKSB7XG4gICAgICAgIHQgPSBlO1xuICAgICAgfVxuICAgICAgaWYoREVCVUcpIHtcbiAgICAg
ICAgU3lzdGVtLmVyci5wcmludGxuKFwiR0xDYW52YXM6IFRLIGRpc2FibGVCYWNrZ3JvdW5kRXJh
c2UgZXJyb3I6IFwiK3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1
ZXMgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbkZhY3RvcnkncyBjaG9vc2luZyBmYWNpbGl0eSB3
aXRoaW4gRURULFxuICAgKiBzaW5jZSByZXNvdXJjZXMgY3JlYXRlZCAoWDExOiBEaXNwbGF5KSwg
bXVzdCBiZSBkZXN0cm95ZWQgaW4gdGhlIHNhbWUgdGhyZWFkLCB3aGVyZSB0aGV5IGhhdmUgYmVl
biBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2Fwc0Nob3NlblxuICAgKiBAcGFyYW0gY2Fw
c1JlcXVlc3RlZFxuICAgKiBAcGFyYW0gY2hvb3NlclxuICAgKiBAcGFyYW0gZGV2aWNlXG4gICAq
IEByZXR1cm4gdGhlIGNob3NlbiBBV1RHcmFwaGljc0NvbmZpZ3VyYXRpb25cbiAgICpcbiAgICog
QHNlZSAjZGlzcG9zZUFic3RyYWN0R3JhcGhpY3NEZXZpY2UoKVxuICAgKi9cbiAgcHJpdmF0ZSBB
V1RHcmFwaGljc0NvbmZpZ3VyYXRpb24gY2hvb3NlR3JhcGhpY3NDb25maWd1cmF0aW9uKGZpbmFs
IEdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlIGNhcHNDaG9zZW4sXG4gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBHTENhcGFi
aWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxdWVzdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgR0xDYXBhYmlsaXRp
ZXNDaG9vc2VyIGNob29zZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBHcmFwaGljc0RldmljZSBkZXZpY2UpIHtc
biAgICAvLyBNYWtlIEdMQ2FudmFzIGJlaGF2ZSBiZXR0ZXIgaW4gTmV0QmVhbnMgR1VJIGJ1aWxk
ZXJcbiAgICBpZiAoQmVhbnMuaXNEZXNpZ25UaW1lKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xu
ICAgIH1cblxuICAgIGZpbmFsIEFic3RyYWN0R3JhcGhpY3NTY3JlZW4gYVNjcmVlbiA9IG51bGwg
IT0gZGV2aWNlID8gXG4gICAgICAgICAgICBBV1RHcmFwaGljc1NjcmVlbi5jcmVhdGVTY3JlZW5E
ZXZpY2UoZGV2aWNlLCBBYnN0cmFjdEdyYXBoaWNzRGV2aWNlLkRFRkFVTFRfVU5JVCk6XG4gICAg
ICAgICAgICBBV1RHcmFwaGljc1NjcmVlbi5jcmVhdGVEZWZhdWx0KCk7XG4gICAgQVdUR3JhcGhp
Y3NDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7XG5cbiAgICBpZiggRXZlbnRRdWV1ZS5pc0Rp
c3BhdGNoVGhyZWFkKCkgfHwgVGhyZWFkLmhvbGRzTG9jayhnZXRUcmVlTG9jaygpKSApIHtcbiAg
ICAgICAgY29uZmlnID0gKEFXVEdyYXBoaWNzQ29uZmlndXJhdGlvbilcbiAgICAgICAgICAgICAg
ICBHcmFwaGljc0NvbmZpZ3VyYXRpb25GYWN0b3J5LmdldEZhY3RvcnkoQVdUR3JhcGhpY3NEZXZp
Y2UuY2xhc3MpLmNob29zZUdyYXBoaWNzQ29uZmlndXJhdGlvbihjYXBzQ2hvc2VuLFxuICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHNSZXF1ZXN0
ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2hvb3NlciwgYVNjcmVlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAg
ICAgIGZpbmFsIEFycmF5TGlzdDxBV1RHcmFwaGljc0NvbmZpZ3VyYXRpb24+IGJ1Y2tldCA9IG5l
dyBBcnJheUxpc3Q8QVdUR3JhcGhpY3NDb25maWd1cmF0aW9uPigxKTtcbiAgICAgICAgICAgIEV2
ZW50UXVldWUuaW52b2tlQW5kV2FpdChuZXcgUnVubmFibGUoKSB7XG4gICAgICAgICAgICAgICAg
cHVibGljIHZvaWQgcnVuKCkge1xuICAgICAgICAgICAgICAgICAgICBBV1RHcmFwaGljc0NvbmZp
Z3VyYXRpb24gYyA9IChBV1RHcmFwaGljc0NvbmZpZ3VyYXRpb24pXG4gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgR3JhcGhpY3NDb25maWd1cmF0aW9uRmFjdG9yeS5nZXRGYWN0b3J5KEFXVEdy
YXBoaWNzRGV2aWNlLmNsYXNzKS5jaG9vc2VHcmFwaGljc0NvbmZpZ3VyYXRpb24oY2Fwc0Nob3Nl
bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjYXBzUmVxdWVzdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZXIsIGFTY3JlZW4pO1xuICAg
ICAgICAgICAgICAgICAgICBidWNrZXQuYWRkKGMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAg
ICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnID0gKCBidWNrZXQuc2l6ZSgpID4gMCApID8g
YnVja2V0LmdldCgwKSA6IG51bGwgO1xuICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0
RXhjZXB0aW9uIGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBHTEV4Y2VwdGlvbihlLmdldFRh
cmdldEV4Y2VwdGlvbigpKTtcbiAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24g
ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdMRXhjZXB0aW9uKGUpO1xuICAgICAgICB9XG4g
ICAgfVxuXG4gICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgR0xFeGNl
cHRpb24oXCJFcnJvcjogQ291bGRuJ3QgZmV0Y2ggQVdUR3JhcGhpY3NDb25maWd1cmF0aW9uXCIp
O1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBBIG1v
c3Qgc2ltcGxlIEpPR0wgQVdUIHRlc3QgZW50cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdm9p
ZCBtYWluKFN0cmluZyBhcmdzW10pIHtcbiAgICBTeXN0ZW0uZXJyLnByaW50bG4oVmVyc2lvblV0
aWwuZ2V0UGxhdGZvcm1JbmZvKCkpO1xuICAgIFN5c3RlbS5lcnIucHJpbnRsbihHbHVlR2VuVmVy
c2lvbi5nZXRJbnN0YW5jZSgpKTtcbiAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oTmF0aXZlV2lu
ZG93VmVyc2lvbi5nZXRJbnN0YW5jZSgpKTtcbiAgICBTeXN0ZW0uZXJyLnByaW50bG4oSm9nbFZl
cnNpb24uZ2V0SW5zdGFuY2UoKSk7XG5cbiAgICBHTERyYXdhYmxlRmFjdG9yeSBmYWN0b3J5ID0g
R0xEcmF3YWJsZUZhY3RvcnkuZ2V0RGVza3RvcEZhY3RvcnkoKTtcbiAgICBMaXN0PEdMQ2FwYWJp
bGl0aWVzSW1tdXRhYmxlPiBhdmFpbENhcHMgPSBmYWN0b3J5LmdldEF2YWlsYWJsZUNhcGFiaWxp
dGllcyhudWxsKTtcbiAgICBmb3IoaW50IGk9MDsgaTxhdmFpbENhcHMuc2l6ZSgpOyBpKyspIHtc
biAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGF2YWlsQ2Fwcy5nZXQoaSkpO1xuICAgIH1cblxu
ICAgIEdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlIGNhcHMgPSBuZXcgR0xDYXBhYmlsaXRpZXMoIEdM
UHJvZmlsZS5nZXREZWZhdWx0KEdMUHJvZmlsZS5nZXREZWZhdWx0RGVza3RvcERldmljZSgpKSAp
O1xuICAgIEZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKFwiSk9HTCBBV1QgVGVzdFwiKTtcblxuICAg
IEdMQ2FudmFzIGdsQ2FudmFzID0gbmV3IEdMQ2FudmFzKGNhcHMpO1xuICAgIGZyYW1lLmFkZChn
bENhbnZhcyk7XG4gICAgZnJhbWUuc2V0U2l6ZSgxMjgsIDEyOCk7XG5cbiAgICBnbENhbnZhcy5h
ZGRHTEV2ZW50TGlzdGVuZXIobmV3IEdMRXZlbnRMaXN0ZW5lcigpIHtcbiAgICAgICAgcHVibGlj
IHZvaWQgaW5pdChHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkge1xuICAgICAgICAgICAgR0wgZ2wg
PSBkcmF3YWJsZS5nZXRHTCgpO1xuICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKEpvZ2xW
ZXJzaW9uLmdldEdMSW5mbyhnbCwgbnVsbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGlj
IHZvaWQgcmVzaGFwZShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSwgaW50IHgsIGludCB5LCBpbnQg
d2lkdGgsIGludCBoZWlnaHQpIHtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyB2b2lkIGRp
c3BsYXkoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUpIHtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1
YmxpYyB2b2lkIGRpc3Bvc2UoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUpIHtcbiAgICAgICAgfVxu
ICAgIH0pO1xuXG4gICAgZmluYWwgRnJhbWUgX2ZyYW1lID0gZnJhbWU7XG4gICAgZmluYWwgR0xD
YW52YXMgX2dsQ2FudmFzID0gZ2xDYW52YXM7XG5cbiAgICB0cnkge1xuICAgICAgICBqYXZheC5z
d2luZy5Td2luZ1V0aWxpdGllcy5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHtcbiAgICAg
ICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHtcbiAgICAgICAgICAgICAgICBfZnJhbWUuc2V0Vmlz
aWJsZSh0cnVlKTtcbiAgICAgICAgICAgIH19KTtcbiAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkg
e1xuICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpO1xuICAgIH1cbiAgICBnbENhbnZhcy5kaXNw
bGF5KCk7XG4gICAgdHJ5IHtcbiAgICAgICAgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXMuaW52
b2tlQW5kV2FpdChuZXcgUnVubmFibGUoKSB7XG4gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4o
KSB7XG4gICAgICAgICAgICAgICAgX2ZyYW1lLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICAg
ICAgICAgIF9mcmFtZS5yZW1vdmUoX2dsQ2FudmFzKTtcbiAgICAgICAgICAgICAgICBfZnJhbWUu
ZGlzcG9zZSgpO1xuICAgICAgICAgICAgfX0pO1xuICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7
XG4gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7XG4gICAgfVxuICB9XG5cbn1cbgo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSAuLi8uLi9BcHBsaWNhdGlvbnMvSk9HTEdJVC9qb2dsL3NyYy9qb2dsL2NsYXNzZXMv
amF2YXgvbWVkaWEvb3BlbmdsL2F3dC9HTENhbnZhcy5qYXZhCShkYXRlIDEzMjQyNjI2MzYwMDAp
CisrKyAuLi8uLi9BcHBsaWNhdGlvbnMvSk9HTEdJVC9qb2dsL3NyYy9qb2dsL2NsYXNzZXMvamF2
YXgvbWVkaWEvb3BlbmdsL2F3dC9HTENhbnZhcy5qYXZhCShyZXZpc2lvbiApCkBAIC00MCwzNyAr
NDAsMjggQEAKIAogcGFja2FnZSBqYXZheC5tZWRpYS5vcGVuZ2wuYXd0OwogCi1pbXBvcnQgamF2
YS5iZWFucy5CZWFuczsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQg
amF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJp
dmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBjb20uam9nYW1wLmNvbW1vbi5HbHVlR2VuVmVyc2lvbjsK
K2ltcG9ydCBjb20uam9nYW1wLmNvbW1vbi51dGlsLlZlcnNpb25VdGlsOworaW1wb3J0IGNvbS5q
b2dhbXAuY29tbW9uLnV0aWwubG9ja3MuTG9ja0ZhY3Rvcnk7CitpbXBvcnQgY29tLmpvZ2FtcC5j
b21tb24udXRpbC5sb2Nrcy5SZWN1cnNpdmVMb2NrOworaW1wb3J0IGNvbS5qb2dhbXAub3Blbmds
LkpvZ2xWZXJzaW9uOworaW1wb3J0IGpvZ2FtcC5uYXRpdmV3aW5kb3cuamF3dC5KQVdUV2luZG93
OworaW1wb3J0IGpvZ2FtcC5vcGVuZ2wuRGVidWc7CitpbXBvcnQgam9nYW1wLm9wZW5nbC5HTENv
bnRleHRJbXBsOworaW1wb3J0IGpvZ2FtcC5vcGVuZ2wuR0xEcmF3YWJsZUhlbHBlcjsKK2ltcG9y
dCBqb2dhbXAub3BlbmdsLlRocmVhZGluZ0ltcGw7CiAKLWltcG9ydCBqYXZhLmF3dC5DYW52YXM7
Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuRm9udE1ldHJpY3M7Ci1p
bXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQg
amF2YS5hd3QuR3JhcGhpY3NDb25maWd1cmF0aW9uOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNz
RGV2aWNlOwotaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7Ci0KLWltcG9ydCBqYXZh
LmF3dC5FdmVudFF1ZXVlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJn
ZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0
aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5PZmZzY3JlZW5MYXll
ck9wdGlvbjsKLWltcG9ydCBqYXZheC5tZWRpYS5uYXRpdmV3aW5kb3cuV2luZG93Q2xvc2luZ1By
b3RvY29sOwogaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5BYnN0cmFjdEdyYXBoaWNz
RGV2aWNlOwogaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5BYnN0cmFjdEdyYXBoaWNz
U2NyZWVuOwogaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5HcmFwaGljc0NvbmZpZ3Vy
YXRpb25GYWN0b3J5OwogaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5OYXRpdmVTdXJm
YWNlOwogaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5OYXRpdmVXaW5kb3dGYWN0b3J5
OworaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5PZmZzY3JlZW5MYXllck9wdGlvbjsK
K2ltcG9ydCBqYXZheC5tZWRpYS5uYXRpdmV3aW5kb3cuV2luZG93Q2xvc2luZ1Byb3RvY29sOwog
aW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5hd3QuQVdUR3JhcGhpY3NDb25maWd1cmF0
aW9uOwogaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5hd3QuQVdUR3JhcGhpY3NEZXZp
Y2U7CiBpbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LmF3dC5BV1RHcmFwaGljc1NjcmVl
bjsKIGltcG9ydCBqYXZheC5tZWRpYS5uYXRpdmV3aW5kb3cuYXd0LkFXVFdpbmRvd0Nsb3NpbmdQ
cm90b2NvbDsKLQogaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTDsKIGltcG9ydCBqYXZheC5t
ZWRpYS5vcGVuZ2wuR0xBbmltYXRvckNvbnRyb2w7CiBpbXBvcnQgamF2YXgubWVkaWEub3Blbmds
LkdMQXV0b0RyYXdhYmxlOwpAQCAtODUsMjAgKzc2LDIzIEBACiBpbXBvcnQgamF2YXgubWVkaWEu
b3BlbmdsLkdMUHJvZmlsZTsKIGltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xSdW5uYWJsZTsK
IGltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuVGhyZWFkaW5nOworaW1wb3J0IGphdmEuYXd0LkNh
bnZhczsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVl
OworaW1wb3J0IGphdmEuYXd0LkZvbnRNZXRyaWNzOworaW1wb3J0IGphdmEuYXd0LkZyYW1lOwor
aW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzQ29uZmln
dXJhdGlvbjsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0RldmljZTsKK2ltcG9ydCBqYXZhLmF3
dC5nZW9tLlJlY3RhbmdsZTJEOworaW1wb3J0IGphdmEuYmVhbnMuQmVhbnM7CitpbXBvcnQgamF2
YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxh
bmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVy
OworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0
aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgY29tLmpvZ2Ft
cC5jb21tb24uR2x1ZUdlblZlcnNpb247Ci1pbXBvcnQgY29tLmpvZ2FtcC5jb21tb24udXRpbC5W
ZXJzaW9uVXRpbDsKLWltcG9ydCBjb20uam9nYW1wLm9wZW5nbC5Kb2dsVmVyc2lvbjsKLQotaW1w
b3J0IGNvbS5qb2dhbXAuY29tbW9uLnV0aWwubG9ja3MuTG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgY29t
LmpvZ2FtcC5jb21tb24udXRpbC5sb2Nrcy5SZWN1cnNpdmVMb2NrOwotCi1pbXBvcnQgam9nYW1w
Lm5hdGl2ZXdpbmRvdy5qYXd0LkpBV1RXaW5kb3c7Ci1pbXBvcnQgam9nYW1wLm9wZW5nbC5EZWJ1
ZzsKLWltcG9ydCBqb2dhbXAub3BlbmdsLkdMQ29udGV4dEltcGw7Ci1pbXBvcnQgam9nYW1wLm9w
ZW5nbC5HTERyYXdhYmxlSGVscGVyOwotaW1wb3J0IGpvZ2FtcC5vcGVuZ2wuVGhyZWFkaW5nSW1w
bDsKLQogLy8gRklYTUU6IFN1YmNsYXNzZXMgbmVlZCB0byBjYWxsIHJlc2V0R0xGdW5jdGlvbkF2
YWlsYWJpbGl0eSgpIG9uIHRoZWlyCiAvLyBjb250ZXh0IHdoZW5ldmVyIHRoZSBkaXNwbGF5Q2hh
bmdlZCgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBvdXIKIC8vIEdMRXZlbnRMaXN0ZW5lcnMKQEAg
LTg4OCw2ICs4ODIsOCBAQAogICAgICAgICAgICAgYWRldmljZU1zZyA9IG51bGw7ICAKICAgICAg
ICAgICB9CiAgICAgICAgICAgYm9vbGVhbiBjbG9zZWQgPSBhd3RDb25maWcuZ2V0U2NyZWVuKCku
Z2V0RGV2aWNlKCkuY2xvc2UoKTsKKyAgICAgICAgICAvL0Fsc28gY2xvc2UgbmF0aXZlIGdyYXBo
aWNzIGNvbmZpZ3VyYXRpb24sIHdoaWNoIHNlZW1zIHRvIGJlIGltcG9ydGFudCBmb3IgWDExCisg
ICAgICAgICAgYXd0Q29uZmlnLmdldE5hdGl2ZUdyYXBoaWNzQ29uZmlndXJhdGlvbigpLmdldFNj
cmVlbigpLmdldERldmljZSgpLmNsb3NlKCk7CiAgICAgICAgICAgaWYoREVCVUcpIHsKICAgICAg
ICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUo
KSArICIgLSBHTENhbnZhcy5kaXNwb3NlKGZhbHNlKTogY2xvc2VkIEdyYXBoaWNzRGV2aWNlOiAi
K2FkZXZpY2VNc2crIiwgcmVzdWx0OiAiK2Nsb3NlZCk7CiAgICAgICAgICAgfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>338</attachid>
            <date>2012-03-14 12:30:05 +0100</date>
            <delta_ts>2012-03-15 16:41:53 +0100</delta_ts>
            <desc>Test that triggers the XWindow memory leak</desc>
            <filename>GLCanvasTestJOGL.java</filename>
            <type>text/x-java</type>
            <size>2022</size>
            <attacher name="Daniel Balog">danielbalog86</attacher>
            
              <data encoding="base64">aW1wb3J0IGpvZ2FtcC5uYXRpdmV3aW5kb3cueDExLlgxMVV0aWw7CmltcG9ydCBvcmcuanVuaXQu
QXNzZXJ0OwppbXBvcnQgb3JnLmp1bml0LlRlc3Q7CgppbXBvcnQgamF2YXgubWVkaWEub3Blbmds
LkdMQ2FwYWJpbGl0aWVzOwppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVz
SW1tdXRhYmxlOwppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMUHJvZmlsZTsKaW1wb3J0IGph
dmF4Lm1lZGlhLm9wZW5nbC5hd3QuR0xDYW52YXM7CmltcG9ydCBqYXZhLmF3dC5GcmFtZTsKCi8q
KgogKiBUZXN0cyB0aGUgR0xDYW52YXMgaW4gSk9HTAogKi8KcHVibGljIGNsYXNzIEdMQ2FudmFz
VGVzdEpPR0wgewoKICBzdGF0aWMgewogICAgU3lzdGVtLnNldFByb3BlcnR5KCAiam9nYW1wLmds
dWVnZW4uVXNlVGVtcEphckNhY2hlIiwgImZhbHNlIiApOwogIH0KCiAgLy9UaGlzIHRlc3Qgd2ls
bCBmYWlsIG9uIEpPR0wgMi4wIFJDNSB3aGVuIHJ1bm5pbmcgaXQgaW4gbGludXggdXNpbmcgWDEx
IGFuZCBuYXRpdmV3aW5kb3cKICBAVGVzdAogIHB1YmxpYyB2b2lkIHRlc3RYMTFXaW5kb3dNZW1v
cnlMZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICB0cnkgewogICAgICBmb3IgKCBpbnQgaiA9
IDA7IGogPCA1MDA7IGorKyApIHsKICAgICAgICBHTENhcGFiaWxpdGllc0ltbXV0YWJsZSBjYXBz
ID0gbmV3IEdMQ2FwYWJpbGl0aWVzKCBHTFByb2ZpbGUuZ2V0RGVmYXVsdCggR0xQcm9maWxlLmdl
dERlZmF1bHREZXNrdG9wRGV2aWNlKCkgKSApOwogICAgICAgIEZyYW1lIGZyYW1lID0gbmV3IEZy
YW1lKCAiSk9HTCBBV1QgbWVtb3J5IGxlYWsgdGVzdCBmb3IgWDExIiApOwogIAogICAgICAgIEdM
Q2FudmFzIGdsQ2FudmFzID0gbmV3IEdMQ2FudmFzKCBjYXBzICk7CiAgICAgICAgZnJhbWUuYWRk
KCBnbENhbnZhcyApOwogICAgICAgIGZyYW1lLnNldFNpemUoIDEyOCwgMTI4ICk7CiAgCiAgICAg
ICAgZmluYWwgRnJhbWUgX2ZyYW1lID0gZnJhbWU7CiAgICAgICAgZmluYWwgR0xDYW52YXMgX2ds
Q2FudmFzID0gZ2xDYW52YXM7CiAgCiAgICAgICAgdHJ5IHsKICAgICAgICAgIGphdmF4LnN3aW5n
LlN3aW5nVXRpbGl0aWVzLmludm9rZUFuZFdhaXQoIG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAg
ICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgIF9mcmFtZS5zZXRWaXNpYmxlKCB0
cnVlICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gKTsKICAgICAgICB9CiAgICAgICAgY2F0
Y2ggKCBUaHJvd2FibGUgdCApIHsKICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CiAgICAg
ICAgICBBc3NlcnQuZmFpbCh0LmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQogICAgICAgIGdsQ2Fu
dmFzLmRpc3BsYXkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgamF2YXguc3dpbmcuU3dpbmdV
dGlsaXRpZXMuaW52b2tlQW5kV2FpdCggbmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICBwdWJs
aWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgX2ZyYW1lLnNldFZpc2libGUoIGZhbHNlICk7
CiAgICAgICAgICAgICAgX2ZyYW1lLnJlbW92ZSggX2dsQ2FudmFzICk7CiAgICAgICAgICAgICAg
X2ZyYW1lLmRpc3Bvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSApOwogICAgICAgIH0K
ICAgICAgICBjYXRjaCAoIFRocm93YWJsZSB0ICkgewogICAgICAgICAgdC5wcmludFN0YWNrVHJh
Y2UoKTsKICAgICAgICAgIEFzc2VydC5mYWlsKHQuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9Cgog
ICAgICAgIC8vTm90ZSB0aGF0IHRoaXMgaXMgbGFyZ2VseSB0byBpbmRpY2F0ZSB0aGUgcHJvYmxl
bSwgZmVlbCBmcmVlIHRvIGNvbW1lbnQgdGhpcyBsaW5lLgogICAgICAgIFgxMVV0aWwuZHVtcE9w
ZW5EaXNwbGF5Q29ubmVjdGlvbnMoKTsKICAgICAgfQogICAgfQogICAgY2F0Y2ggKCBFeGNlcHRp
b24gZSApIHsKICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgQXNzZXJ0LmZhaWwoZS5n
ZXRNZXNzYWdlKCkpOwogICAgfQogIH0KCn0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>339</attachid>
            <date>2012-03-15 16:41:53 +0100</date>
            <delta_ts>2012-03-15 16:41:53 +0100</delta_ts>
            <desc>Test cases to trigger the memory leak</desc>
            <filename>GLCanvasTestJOGL.java</filename>
            <type>text/x-java</type>
            <size>3089</size>
            <attacher name="Daniel Balog">danielbalog86</attacher>
            
              <data encoding="base64">aW1wb3J0IGpvZ2FtcC5uYXRpdmV3aW5kb3cueDExLlgxMVV0aWw7CmltcG9ydCBvcmcuanVuaXQu
QXNzZXJ0OwppbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwoK
aW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5EZWZhdWx0R0xDYXBhYmlsaXRpZXNDaG9vc2VyOwpp
bXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzOwppbXBvcnQgamF2YXgubWVk
aWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlOwppbXBvcnQgamF2YXgubWVkaWEub3Bl
bmdsLkdMRHJhd2FibGVGYWN0b3J5OwppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMUGJ1ZmZl
cjsKaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTFByb2ZpbGU7CmltcG9ydCBqYXZheC5tZWRp
YS5vcGVuZ2wuYXd0LkdMQ2FudmFzOwppbXBvcnQgamF2YS5hd3QuRnJhbWU7CgovKioKICogVGVz
dHMgdGhlIEdMQ2FudmFzIGluIEpPR0wKICovCnB1YmxpYyBjbGFzcyBHTENhbnZhc1Rlc3RKT0dM
IHsKCiAgc3RhdGljIHsKICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSggImpvZ2FtcC5nbHVlZ2VuLlVz
ZVRlbXBKYXJDYWNoZSIsICJmYWxzZSIgKTsKICB9CgogIC8vVGhpcyB0ZXN0IHdpbGwgZmFpbCBv
biBKT0dMIDIuMCBSQzUgd2hlbiBydW5uaW5nIGl0IGluIGxpbnV4IHVzaW5nIFgxMSBhbmQgbmF0
aXZld2luZG93CiAgQFRlc3QKICBwdWJsaWMgdm9pZCB0ZXN0WDExV2luZG93TWVtb3J5TGVhaygp
IHRocm93cyBFeGNlcHRpb24gewogICAgdHJ5IHsKICAgICAgZm9yICggaW50IGogPSAwOyBqIDwg
NTAwOyBqKysgKSB7CiAgICAgICAgR0xDYXBhYmlsaXRpZXNJbW11dGFibGUgY2FwcyA9IG5ldyBH
TENhcGFiaWxpdGllcyggR0xQcm9maWxlLmdldERlZmF1bHQoIEdMUHJvZmlsZS5nZXREZWZhdWx0
RGVza3RvcERldmljZSgpICkgKTsKICAgICAgICBGcmFtZSBmcmFtZSA9IG5ldyBGcmFtZSggIkpP
R0wgQVdUIG1lbW9yeSBsZWFrIHRlc3QgZm9yIFgxMSIgKTsKICAKICAgICAgICBHTENhbnZhcyBn
bENhbnZhcyA9IG5ldyBHTENhbnZhcyggY2FwcyApOwogICAgICAgIGZyYW1lLmFkZCggZ2xDYW52
YXMgKTsKICAgICAgICBmcmFtZS5zZXRTaXplKCAxMjgsIDEyOCApOwogIAogICAgICAgIGZpbmFs
IEZyYW1lIF9mcmFtZSA9IGZyYW1lOwogICAgICAgIGZpbmFsIEdMQ2FudmFzIF9nbENhbnZhcyA9
IGdsQ2FudmFzOwogIAogICAgICAgIHRyeSB7CiAgICAgICAgICBqYXZheC5zd2luZy5Td2luZ1V0
aWxpdGllcy5pbnZva2VBbmRXYWl0KCBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgIHB1Ymxp
YyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICBfZnJhbWUuc2V0VmlzaWJsZSggdHJ1ZSApOwog
ICAgICAgICAgICB9CiAgICAgICAgICB9ICk7CiAgICAgICAgfQogICAgICAgIGNhdGNoICggVGhy
b3dhYmxlIHQgKSB7CiAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgQXNz
ZXJ0LmZhaWwodC5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgICAgICBnbENhbnZhcy5kaXNw
bGF5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVz
Lmludm9rZUFuZFdhaXQoIG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgcHVibGljIHZvaWQg
cnVuKCkgewogICAgICAgICAgICAgIF9mcmFtZS5zZXRWaXNpYmxlKCBmYWxzZSApOwogICAgICAg
ICAgICAgIF9mcmFtZS5yZW1vdmUoIF9nbENhbnZhcyApOwogICAgICAgICAgICAgIF9mcmFtZS5k
aXNwb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gKTsKICAgICAgICB9CiAgICAgICAg
Y2F0Y2ggKCBUaHJvd2FibGUgdCApIHsKICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CiAg
ICAgICAgICBBc3NlcnQuZmFpbCh0LmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQoKICAgICAgICAv
L05vdGUgdGhhdCB0aGlzIGlzIGxhcmdlbHkgdG8gaW5kaWNhdGUgdGhlIHByb2JsZW0sIGZlZWwg
ZnJlZSB0byBjb21tZW50IHRoaXMgbGluZS4KLy8gICAgICAgIFgxMVV0aWwuZHVtcE9wZW5EaXNw
bGF5Q29ubmVjdGlvbnMoKTsKICAgICAgfQogICAgfQogICAgY2F0Y2ggKCBFeGNlcHRpb24gZSAp
IHsKICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNz
YWdlKCkpOwogICAgfQogIH0KCgogIC8vVGhpcyB0ZXN0IHdpbGwgZmFpbCBvbiBKT0dMIDIuMCBS
QzUgd2hlbiBydW5uaW5nIGl0IGluIGxpbnV4IHVzaW5nIFgxMSBhbmQgbmF0aXZld2luZG93CiAg
QFRlc3QKICBwdWJsaWMgdm9pZCB0ZXN0WDExV2luZG93TWVtb3J5TGVha09mZnNjcmVlbldpbmRv
dygpIHRocm93cyBFeGNlcHRpb24gewogICAgdHJ5IHsKICAgICAgZm9yICggaW50IGogPSAwOyBq
IDwgNTAwOyBqKysgKSB7CiAgICAgICAgR0xDYXBhYmlsaXRpZXNJbW11dGFibGUgY2FwcyA9IG5l
dyBHTENhcGFiaWxpdGllcyggR0xQcm9maWxlLmdldERlZmF1bHQoIEdMUHJvZmlsZS5nZXREZWZh
dWx0RGVza3RvcERldmljZSgpICkgKTsKCgogICAgICAgIEdMUGJ1ZmZlciBidWZmZXIgPSBHTERy
YXdhYmxlRmFjdG9yeS5nZXRGYWN0b3J5KCBHTFByb2ZpbGUuZ2V0KCAiR0wyIiApICkuY3JlYXRl
R0xQYnVmZmVyKAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBjYXBzLAogICAgICAgICAg
ICBuZXcgRGVmYXVsdEdMQ2FwYWJpbGl0aWVzQ2hvb3NlcigpLAogICAgICAgICAgICAyNTYsCiAg
ICAgICAgICAgIDI1NiwKICAgICAgICAgICAgbnVsbAogICAgICAgICk7CiAgICAgICAgYnVmZmVy
LmRpc3BsYXkoKTsKICAgICAgICBidWZmZXIuZGVzdHJveSgpOwoKICAgICAgICAvL05vdGUgdGhh
dCB0aGlzIGlzIGxhcmdlbHkgdG8gaW5kaWNhdGUgdGhlIHByb2JsZW0sIGZlZWwgZnJlZSB0byBj
b21tZW50IHRoaXMgbGluZS4KICAgICAgICBYMTFVdGlsLmR1bXBPcGVuRGlzcGxheUNvbm5lY3Rp
b25zKCk7CiAgICAgIH0KICAgIH0KICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKSB7CiAgICAgIGUu
cHJpbnRTdGFja1RyYWNlKCk7CiAgICAgIEFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKICAg
IH0KICB9Cgp9Cgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>342</attachid>
            <date>2012-03-16 16:57:56 +0100</date>
            <delta_ts>2012-03-16 16:57:56 +0100</delta_ts>
            <desc>Modified potential fix</desc>
            <filename>GLCanvas_PotentialFix1b.patch</filename>
            <type>text/plain</type>
            <size>45952</size>
            <attacher name="Daniel Balog">danielbalog86</attacher>
            
              <data encoding="base64">SW5kZXg6IC4uLy4uL0FwcGxpY2F0aW9ucy9KT0dMR0lUL2pvZ2wvc3JjL2pvZ2wvY2xhc3Nlcy9q
YXZheC9tZWRpYS9vcGVuZ2wvYXd0L0dMQ2FudmFzLmphdmEKSURFQSBhZGRpdGlvbmFsIGluZm86
ClN1YnN5c3RlbTogY29tLmludGVsbGlqLm9wZW5hcGkuZGlmZi5pbXBsLnBhdGNoLkNoYXJzZXRF
UAo8Kz5VVEYtOApTdWJzeXN0ZW06IGNvbS5pbnRlbGxpai5vcGVuYXBpLmRpZmYuaW1wbC5wYXRj
aC5CYXNlUmV2aXNpb25UZXh0UGF0Y2hFUAo8Kz4vKlxuICogQ29weXJpZ2h0IChjKSAyMDAzIFN1
biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIENvcHlyaWdodCAo
YykgMjAxMCBKb2dBbXAgQ29tbXVuaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogXG4gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqIFxuICogLSBSZWRpc3RyaWJ1
dGlvbiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci5cbiAqIFxuICogLSBSZWRpc3RyaWJ1dGlvbiBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi5cbiAqIFxuICogTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG9y
IHRoZSBuYW1lcyBvZlxuICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKiBcbiAqIFRoaXMgc29mdHdhcmUg
aXMgcHJvdmlkZWQgXCJBUyBJUyxcIiB3aXRob3V0IGEgd2FycmFudHkgb2YgYW55IGtpbmQuIEFM
TFxuICogRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQg
V0FSUkFOVElFUyxcbiAqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFO
VEFCSUxJVFksIEZJVE5FU1MgRk9SIEFcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5G
UklOR0VNRU5ULCBBUkUgSEVSRUJZIEVYQ0xVREVELiBTVU5cbiAqIE1JQ1JPU1lTVEVNUywgSU5D
LiAoXCJTVU5cIikgQU5EIElUUyBMSUNFTlNPUlMgU0hBTEwgTk9UIEJFIExJQUJMRSBGT1JcbiAq
IEFOWSBEQU1BR0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBN
T0RJRllJTkcgT1JcbiAqIERJU1RSSUJVVElORyBUSElTIFNPRlRXQVJFIE9SIElUUyBERVJJVkFU
SVZFUy4gSU4gTk8gRVZFTlQgV0lMTCBTVU4gT1JcbiAqIElUUyBMSUNFTlNPUlMgQkUgTElBQkxF
IEZPUiBBTlkgTE9TVCBSRVZFTlVFLCBQUk9GSVQgT1IgREFUQSwgT1IgRk9SXG4gKiBESVJFQ1Qs
IElORElSRUNULCBTUEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZF
XG4gKiBEQU1BR0VTLCBIT1dFVkVSIENBVVNFRCBBTkQgUkVHQVJETEVTUyBPRiBUSEUgVEhFT1JZ
IE9GIExJQUJJTElUWSxcbiAqIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgT1IgSU5BQklMSVRZ
IFRPIFVTRSBUSElTIFNPRlRXQVJFLCBFVkVOIElGXG4gKiBTVU4gSEFTIEJFRU4gQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLlxuICogXG4gKiBZb3UgYWNrbm93bGVk
Z2UgdGhhdCB0aGlzIHNvZnR3YXJlIGlzIG5vdCBkZXNpZ25lZCBvciBpbnRlbmRlZCBmb3IgdXNl
XG4gKiBpbiB0aGUgZGVzaWduLCBjb25zdHJ1Y3Rpb24sIG9wZXJhdGlvbiBvciBtYWludGVuYW5j
ZSBvZiBhbnkgbnVjbGVhclxuICogZmFjaWxpdHkuXG4gKiBcbiAqIFN1biBncmF0ZWZ1bGx5IGFj
a25vd2xlZGdlcyB0aGF0IHRoaXMgc29mdHdhcmUgd2FzIG9yaWdpbmFsbHkgYXV0aG9yZWRcbiAq
IGFuZCBkZXZlbG9wZWQgYnkgS2VubmV0aCBCcmFkbGV5IFJ1c3NlbGwgYW5kIENocmlzdG9waGVy
IEpvaG4gS2xpbmUuXG4gKi9cblxucGFja2FnZSBqYXZheC5tZWRpYS5vcGVuZ2wuYXd0O1xuXG5p
bXBvcnQgamF2YS5iZWFucy5CZWFucztcbmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7
XG5pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyO1xuaW1wb3J0IGphdmEuc2Vj
dXJpdHkuUHJpdmlsZWdlZEFjdGlvbjtcblxuaW1wb3J0IGphdmEuYXd0LkNhbnZhcztcbmltcG9y
dCBqYXZhLmF3dC5Db2xvcjtcbmltcG9ydCBqYXZhLmF3dC5Gb250TWV0cmljcztcbmltcG9ydCBq
YXZhLmF3dC5GcmFtZTtcbmltcG9ydCBqYXZhLmF3dC5HcmFwaGljcztcbmltcG9ydCBqYXZhLmF3
dC5HcmFwaGljc0NvbmZpZ3VyYXRpb247XG5pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2U7
XG5pbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDtcblxuaW1wb3J0IGphdmEuYXd0LkV2
ZW50UXVldWU7XG5pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2Vw
dGlvbjtcbmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuaW1wb3J0IGphdmEudXRpbC5MaXN0
O1xuXG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93Lk9mZnNjcmVlbkxheWVyT3B0aW9u
O1xuaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5XaW5kb3dDbG9zaW5nUHJvdG9jb2w7
XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LkFic3RyYWN0R3JhcGhpY3NEZXZpY2U7
XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LkFic3RyYWN0R3JhcGhpY3NTY3JlZW47
XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LkdyYXBoaWNzQ29uZmlndXJhdGlvbkZh
Y3Rvcnk7XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93Lk5hdGl2ZVN1cmZhY2U7XG5p
bXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93Lk5hdGl2ZVdpbmRvd0ZhY3Rvcnk7XG5pbXBv
cnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LmF3dC5BV1RHcmFwaGljc0NvbmZpZ3VyYXRpb247
XG5pbXBvcnQgamF2YXgubWVkaWEubmF0aXZld2luZG93LmF3dC5BV1RHcmFwaGljc0RldmljZTtc
bmltcG9ydCBqYXZheC5tZWRpYS5uYXRpdmV3aW5kb3cuYXd0LkFXVEdyYXBoaWNzU2NyZWVuO1xu
aW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5hd3QuQVdUV2luZG93Q2xvc2luZ1Byb3Rv
Y29sO1xuXG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMO1xuaW1wb3J0IGphdmF4Lm1lZGlh
Lm9wZW5nbC5HTEFuaW1hdG9yQ29udHJvbDtcbmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xB
dXRvRHJhd2FibGU7XG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzO1xu
aW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTENhcGFiaWxpdGllc0Nob29zZXI7XG5pbXBvcnQg
amF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlO1xuaW1wb3J0IGphdmF4
Lm1lZGlhLm9wZW5nbC5HTENvbnRleHQ7XG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMRHJh
d2FibGU7XG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMRHJhd2FibGVGYWN0b3J5O1xuaW1w
b3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXI7XG5pbXBvcnQgamF2YXgubWVk
aWEub3BlbmdsLkdMRXhjZXB0aW9uO1xuaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTFByb2Zp
bGU7XG5pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMUnVubmFibGU7XG5pbXBvcnQgamF2YXgu
bWVkaWEub3BlbmdsLlRocmVhZGluZztcblxuaW1wb3J0IGNvbS5qb2dhbXAuY29tbW9uLkdsdWVH
ZW5WZXJzaW9uO1xuaW1wb3J0IGNvbS5qb2dhbXAuY29tbW9uLnV0aWwuVmVyc2lvblV0aWw7XG5p
bXBvcnQgY29tLmpvZ2FtcC5vcGVuZ2wuSm9nbFZlcnNpb247XG5cbmltcG9ydCBjb20uam9nYW1w
LmNvbW1vbi51dGlsLmxvY2tzLkxvY2tGYWN0b3J5O1xuaW1wb3J0IGNvbS5qb2dhbXAuY29tbW9u
LnV0aWwubG9ja3MuUmVjdXJzaXZlTG9jaztcblxuaW1wb3J0IGpvZ2FtcC5uYXRpdmV3aW5kb3cu
amF3dC5KQVdUV2luZG93O1xuaW1wb3J0IGpvZ2FtcC5vcGVuZ2wuRGVidWc7XG5pbXBvcnQgam9n
YW1wLm9wZW5nbC5HTENvbnRleHRJbXBsO1xuaW1wb3J0IGpvZ2FtcC5vcGVuZ2wuR0xEcmF3YWJs
ZUhlbHBlcjtcbmltcG9ydCBqb2dhbXAub3BlbmdsLlRocmVhZGluZ0ltcGw7XG5cbi8vIEZJWE1F
OiBTdWJjbGFzc2VzIG5lZWQgdG8gY2FsbCByZXNldEdMRnVuY3Rpb25BdmFpbGFiaWxpdHkoKSBv
biB0aGVpclxuLy8gY29udGV4dCB3aGVuZXZlciB0aGUgZGlzcGxheUNoYW5nZWQoKSBmdW5jdGlv
biBpcyBjYWxsZWQgb24gb3VyXG4vLyBHTEV2ZW50TGlzdGVuZXJzXG5cbi8qKiBBIGhlYXZ5d2Vp
Z2h0IEFXVCBjb21wb25lbnQgd2hpY2ggcHJvdmlkZXMgT3BlbkdMIHJlbmRlcmluZ1xuICAgIHN1
cHBvcnQuIFRoaXMgaXMgdGhlIHByaW1hcnkgaW1wbGVtZW50YXRpb24gb2YgYW4gQVdUIHtAbGlu
ayBHTERyYXdhYmxlfTtcbiAgICB7QGxpbmsgR0xKUGFuZWx9IGlzIHByb3ZpZGVkIGZvciBjb21w
YXRpYmlsaXR5IHdpdGggU3dpbmcgdXNlclxuICAgIGludGVyZmFjZXMgd2hlbiBhZGRpbmcgYSBo
ZWF2eXdlaWdodCBkb2Vzbid0IHdvcmsgZWl0aGVyIGJlY2F1c2VcbiAgICBvZiBaLW9yZGVyaW5n
IG9yIExheW91dE1hbmFnZXIgcHJvYmxlbXMuXG4gKlxuICogPGg1PjxBIE5BTUU9XCJqYXZhMmRn
bFwiPkphdmEyRCBPcGVuR0wgUmVtYXJrczwvQT48L2g1PlxuICpcbiAqIFRvIGF2b2lkIGFueSBj
b25mbGljdHMgd2l0aCBhIHBvdGVudGlhbCBKYXZhMkQgT3BlbkdMIGNvbnRleHQsPGJyPlxuICog
eW91IHNoYWxsIGNvbnNpZGVyIHNldHRpbmcgdGhlIGZvbGxvd2luZyBKVk0gcHJvcGVydGllczo8
YnI+XG4gKiA8dWw+XG4gKiAgICA8bGk+PHByZT5zdW4uamF2YTJkLm9wZW5nbD1mYWxzZTwvcHJl
PjwvbGk+XG4gKiAgICA8bGk+PHByZT5zdW4uamF2YTJkLm5vZGRyYXc9dHJ1ZTwvcHJlPjwvbGk+
XG4gKiA8L3VsPlxuICogVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaW4gY2FzZSB5b3Ugd2FudCB0
byB1dGlsaXplIGEgR0xQcm9maWxlIG90aGVyIHRoYW5cbiAqIHtAbGluayBHTFByb2ZpbGUjR0wy
fSwgZWcuIHVzaW5nIHtAbGluayBHTFByb2ZpbGUjZ2V0TWF4Rml4ZWRGdW5jKCl9Ljxicj5cbiAq
IE9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3UgbGlrZSB0byBleHBlcmltZW50IHdpdGggR0xKUGFu
ZWwncyB1dGlsaXphdGlvblxuICogb2YgSmF2YTJEJ3MgT3BlbkdMIHBpcGVsaW5lLCB5b3UgaGF2
ZSB0byBzZXQgdGhlbSB0b1xuICogPHVsPlxuICogICAgPGxpPjxwcmU+c3VuLmphdmEyZC5vcGVu
Z2w9dHJ1ZTwvcHJlPjwvbGk+XG4gKiAgICA8bGk+PHByZT5zdW4uamF2YTJkLm5vZGRyYXc9dHJ1
ZTwvcHJlPjwvbGk+XG4gKiA8L3VsPlxuICpcbiAqIDxoNT48QSBOQU1FPVwiYmFja2dyb3VuZGVy
YXNlXCI+RGlzYWJsZSBCYWNrZ3JvdW5kIEVyYXNlPC9BPjwvaDU+XG4gKlxuICogR0xDYW52YXMg
dHJpZXMgdG8gZGlzYWJsZSBiYWNrZ3JvdW5kIGVyYXNlIGZvciB0aGUgQVdUIENhbnZhc1xuICog
YmVmb3JlIG5hdGl2ZSBwZWVyIGNyZWF0aW9uIChYMTEpIGFuZCBhZnRlciBpdCAoV2luZG93cyks
IDxicj5cbiAqIHV0aWxpemluZyB0aGUgb3B0aW9uYWwge0BsaW5rIGphdmEuYXd0LlRvb2xraXR9
IG1ldGhvZCA8Y29kZT5kaXNhYmxlQmVhY2tncm91bmRFcmFzZShqYXZhLmF3dC5DYW52YXMpPC9j
b2RlPi48YnI+XG4gKiBIb3dldmVyIGlmIHRoaXMgZG9lcyBub3QgZ2l2ZSB5b3UgdGhlIGRlc2ly
ZWQgcmVzdWx0cywgeW91IG1heSB3YW50IHRvIGRpc2FibGUgQVdUIGJhY2tncm91bmQgZXJhc2Ug
aW4gZ2VuZXJhbDpcbiAqIDx1bD5cbiAqICAgPGxpPjxwcmU+c3VuLmF3dC5ub2VyYXNlYmFja2dy
b3VuZD10cnVlPC9wcmU+PC9saT5cbiAqIDwvdWw+XG4gKi9cblxuQFN1cHByZXNzV2FybmluZ3Mo
XCJzZXJpYWxcIilcbnB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyBpbXBsZW1l
bnRzIEFXVEdMQXV0b0RyYXdhYmxlLCBXaW5kb3dDbG9zaW5nUHJvdG9jb2wsIE9mZnNjcmVlbkxh
eWVyT3B0aW9uIHtcblxuICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHO1xuXG4g
IHN0YXRpYyB7XG4gICAgICBERUJVRyA9IERlYnVnLmRlYnVnKFwiR0xDYW52YXNcIik7XG4gIH1c
blxuICBwcml2YXRlIEdMRHJhd2FibGVIZWxwZXIgZHJhd2FibGVIZWxwZXIgPSBuZXcgR0xEcmF3
YWJsZUhlbHBlcigpO1xuICBwcml2YXRlIEFXVEdyYXBoaWNzQ29uZmlndXJhdGlvbiBhd3RDb25m
aWc7XG4gIHByaXZhdGUgR0xEcmF3YWJsZSBkcmF3YWJsZTtcbiAgcHJpdmF0ZSBHTENvbnRleHRJ
bXBsIGNvbnRleHQ7XG4gIHByaXZhdGUgYm9vbGVhbiBzZW5kUmVzaGFwZSA9IGZhbHNlO1xuICBc
biAgLy8gY29weSBvZiB0aGUgY3N0ciBhcmdzLCBtYWlubHkgZm9yIHJlY3JlYXRpb25cbiAgcHJp
dmF0ZSBHTENhcGFiaWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxVXNlcjtcbiAgcHJpdmF0ZSBHTENh
cGFiaWxpdGllc0Nob29zZXIgY2hvb3NlcjtcbiAgcHJpdmF0ZSBHTENvbnRleHQgc2hhcmVXaXRo
O1xuICBwcml2YXRlIGludCBhZGRpdGlvbmFsQ3R4Q3JlYXRpb25GbGFncyA9IDA7ICBcbiAgcHJp
dmF0ZSBHcmFwaGljc0RldmljZSBkZXZpY2U7XG4gIHByaXZhdGUgYm9vbGVhbiBzaGFsbFVzZU9m
ZnNjcmVlbkxheWVyID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBBV1RXaW5kb3dDbG9zaW5nUHJvdG9j
b2wgYXd0V2luZG93Q2xvc2luZ1Byb3RvY29sID1cbiAgICAgICAgICBuZXcgQVdUV2luZG93Q2xv
c2luZ1Byb3RvY29sKHRoaXMsIG5ldyBSdW5uYWJsZSgpIHtcbiAgICAgICAgICAgICAgICBwdWJs
aWMgdm9pZCBydW4oKSB7XG4gICAgICAgICAgICAgICAgICAgIEdMQ2FudmFzLnRoaXMuZGVzdHJv
eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gIC8qKiBDcmVhdGVz
IGEgbmV3IEdMQ2FudmFzIGNvbXBvbmVudCB3aXRoIGEgZGVmYXVsdCBzZXQgb2YgT3BlbkdMXG4g
ICAgICBjYXBhYmlsaXRpZXMsIHVzaW5nIHRoZSBkZWZhdWx0IE9wZW5HTCBjYXBhYmlsaXRpZXMg
c2VsZWN0aW9uXG4gICAgICBtZWNoYW5pc20sIG9uIHRoZSBkZWZhdWx0IHNjcmVlbiBkZXZpY2Uu
IFxuICAgKiBAdGhyb3dzIEdMRXhjZXB0aW9uIGlmIG5vIGRlZmF1bHQgcHJvZmlsZSBpcyBhdmFp
bGFibGUgZm9yIHRoZSBkZWZhdWx0IGRlc2t0b3AgZGV2aWNlLlxuICAgKi9cbiAgcHVibGljIEdM
Q2FudmFzKCkgdGhyb3dzIEdMRXhjZXB0aW9uIHtcbiAgICB0aGlzKG51bGwpO1xuICB9XG5cbiAg
LyoqIENyZWF0ZXMgYSBuZXcgR0xDYW52YXMgY29tcG9uZW50IHdpdGggdGhlIHJlcXVlc3RlZCBz
ZXQgb2ZcbiAgICAgIE9wZW5HTCBjYXBhYmlsaXRpZXMsIHVzaW5nIHRoZSBkZWZhdWx0IE9wZW5H
TCBjYXBhYmlsaXRpZXNcbiAgICAgIHNlbGVjdGlvbiBtZWNoYW5pc20sIG9uIHRoZSBkZWZhdWx0
IHNjcmVlbiBkZXZpY2UuIFxuICAgKiBAdGhyb3dzIEdMRXhjZXB0aW9uIGlmIG5vIEdMQ2FwYWJp
bGl0aWVzIGFyZSBnaXZlbiBhbmQgbm8gZGVmYXVsdCBwcm9maWxlIGlzIGF2YWlsYWJsZSBmb3Ig
dGhlIGRlZmF1bHQgZGVza3RvcCBkZXZpY2UuXG4gICAqIEBzZWUgR0xDYW52YXMjR0xDYW52YXMo
amF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlLCBqYXZheC5tZWRpYS5v
cGVuZ2wuR0xDYXBhYmlsaXRpZXNDaG9vc2VyLCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xDb250ZXh0
LCBqYXZhLmF3dC5HcmFwaGljc0RldmljZSlcbiAgICovXG4gIHB1YmxpYyBHTENhbnZhcyhHTENh
cGFiaWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxVXNlcikgdGhyb3dzIEdMRXhjZXB0aW9uIHtcbiAg
ICB0aGlzKGNhcHNSZXFVc2VyLCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG4gIC8qKiBDcmVh
dGVzIGEgbmV3IEdMQ2FudmFzIGNvbXBvbmVudCB3aXRoIHRoZSByZXF1ZXN0ZWQgc2V0IG9mXG4g
ICAgICBPcGVuR0wgY2FwYWJpbGl0aWVzLCB1c2luZyB0aGUgZGVmYXVsdCBPcGVuR0wgY2FwYWJp
bGl0aWVzXG4gICAgICBzZWxlY3Rpb24gbWVjaGFuaXNtLCBvbiB0aGUgZGVmYXVsdCBzY3JlZW4g
ZGV2aWNlLlxuICAgKiAgVGhpcyBjb25zdHJ1Y3RvciB2YXJpYW50IGFsc28gc3VwcG9ydHMgdXNp
bmcgYSBzaGFyZWQgR0xDb250ZXh0LlxuICAgKlxuICAgKiBAdGhyb3dzIEdMRXhjZXB0aW9uIGlm
IG5vIEdMQ2FwYWJpbGl0aWVzIGFyZSBnaXZlbiBhbmQgbm8gZGVmYXVsdCBwcm9maWxlIGlzIGF2
YWlsYWJsZSBmb3IgdGhlIGRlZmF1bHQgZGVza3RvcCBkZXZpY2UuXG4gICAqIEBzZWUgR0xDYW52
YXMjR0xDYW52YXMoamF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlLCBq
YXZheC5tZWRpYS5vcGVuZ2wuR0xDYXBhYmlsaXRpZXNDaG9vc2VyLCBqYXZheC5tZWRpYS5vcGVu
Z2wuR0xDb250ZXh0LCBqYXZhLmF3dC5HcmFwaGljc0RldmljZSlcbiAgICovXG4gIHB1YmxpYyBH
TENhbnZhcyhHTENhcGFiaWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxVXNlciwgR0xDb250ZXh0IHNo
YXJlV2l0aCkgXG4gICAgICAgICAgdGhyb3dzIEdMRXhjZXB0aW9uIFxuICB7XG4gICAgdGhpcyhj
YXBzUmVxVXNlciwgbnVsbCwgc2hhcmVXaXRoLCBudWxsKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVz
IGEgbmV3IEdMQ2FudmFzIGNvbXBvbmVudC4gVGhlIHBhc3NlZCBHTENhcGFiaWxpdGllc1xuICAg
ICAgc3BlY2lmaWVzIHRoZSBPcGVuR0wgY2FwYWJpbGl0aWVzIGZvciB0aGUgY29tcG9uZW50OyBp
ZiBudWxsLCBhXG4gICAgICBkZWZhdWx0IHNldCBvZiBjYXBhYmlsaXRpZXMgaXMgdXNlZC4gVGhl
IEdMQ2FwYWJpbGl0aWVzQ2hvb3NlclxuICAgICAgc3BlY2lmaWVzIHRoZSBhbGdvcml0aG0gZm9y
IHNlbGVjdGluZyBvbmUgb2YgdGhlIGF2YWlsYWJsZVxuICAgICAgR0xDYXBhYmlsaXRpZXMgZm9y
IHRoZSBjb21wb25lbnQ7IGEgRGVmYXVsdEdMQ2FwYWJpbGl0ZXNDaG9vc2VyXG4gICAgICBpcyB1
c2VkIGlmIG51bGwgaXMgcGFzc2VkIGZvciB0aGlzIGFyZ3VtZW50LiBUaGUgcGFzc2VkXG4gICAg
ICBHTENvbnRleHQgc3BlY2lmaWVzIGFuIE9wZW5HTCBjb250ZXh0IHdpdGggd2hpY2ggdG8gc2hh
cmVcbiAgICAgIHRleHR1cmVzLCBkaXNwbGF5IGxpc3RzIGFuZCBvdGhlciBPcGVuR0wgc3RhdGUs
IGFuZCBtYXkgYmUgbnVsbFxuICAgICAgaWYgc2hhcmluZyBpcyBub3QgZGVzaXJlZC4gU2VlIHRo
ZSBub3RlIGluIHRoZSBvdmVydmlld1xuICAgICAgZG9jdW1lbnRhdGlvbiBvbiA8YVxuICAgICAg
aHJlZj1cIi4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCNTSEFSSU5HXCI+Y29udGV4dFxu
ICAgICAgc2hhcmluZzwvYT4uIFRoZSBwYXNzZWQgR3JhcGhpY3NEZXZpY2UgaW5kaWNhdGVzIHRo
ZSBzY3JlZW4gb25cbiAgICAgIHdoaWNoIHRvIGNyZWF0ZSB0aGUgR0xDYW52YXM7IHRoZSBHTERy
YXdhYmxlRmFjdG9yeSB1c2VzIHRoZVxuICAgICAgZGVmYXVsdCBzY3JlZW4gZGV2aWNlIG9mIHRo
ZSBsb2NhbCBHcmFwaGljc0Vudmlyb25tZW50IGlmIG51bGxcbiAgICAgIGlzIHBhc3NlZCBmb3Ig
dGhpcyBhcmd1bWVudC4gXG4gICAqIEB0aHJvd3MgR0xFeGNlcHRpb24gaWYgbm8gR0xDYXBhYmls
aXRpZXMgYXJlIGdpdmVuIGFuZCBubyBkZWZhdWx0IHByb2ZpbGUgaXMgYXZhaWxhYmxlIGZvciB0
aGUgZGVmYXVsdCBkZXNrdG9wIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyBHTENhbnZhcyhHTENh
cGFiaWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxVXNlcixcbiAgICAgICAgICAgICAgICAgIEdMQ2Fw
YWJpbGl0aWVzQ2hvb3NlciBjaG9vc2VyLFxuICAgICAgICAgICAgICAgICAgR0xDb250ZXh0IHNo
YXJlV2l0aCxcbiAgICAgICAgICAgICAgICAgIEdyYXBoaWNzRGV2aWNlIGRldmljZSkgXG4gICAg
ICB0aHJvd3MgR0xFeGNlcHRpb24gXG4gIHtcbiAgICAvKlxuICAgICAqIERldGVybWluYXRpb24g
b2YgdGhlIG5hdGl2ZSB3aW5kb3cgaXMgbWFkZSBpbiAnc3VwZXIuYWRkTm90aWZ5KCknLFxuICAg
ICAqIHdoaWNoIGNyZWF0ZXMgdGhlIG5hdGl2ZSBwZWVyIHVzaW5nIEFXVCdzIEdyYXBoaWNzQ29u
ZmlndXJhdGlvbi5cbiAgICAgKiBHcmFwaGljc0NvbmZpZ3VyYXRpb24gaXMgcmV0dXJuZWQgYnkg
dGhpcyBjbGFzcyBvdmVyd3JpdHRlblxuICAgICAqICdnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24o
KScsIHdoaWNoIHJldHVybnMgb3VyIE9wZW5HTCBjb21wYXRpYmxlXG4gICAgICogJ2Nob3Nlbicg
R3JhcGhpY3NDb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZihu
dWxsPT1jYXBzUmVxVXNlcikge1xuICAgICAgICBjYXBzUmVxVXNlciA9IG5ldyBHTENhcGFiaWxp
dGllcyhHTFByb2ZpbGUuZ2V0RGVmYXVsdChHTFByb2ZpbGUuZ2V0RGVmYXVsdERlc2t0b3BEZXZp
Y2UoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRvbid0IGFsbG93IHRoZSB1c2VyIHRv
IGNoYW5nZSBkYXRhXG4gICAgICAgIGNhcHNSZXFVc2VyID0gKEdMQ2FwYWJpbGl0aWVzSW1tdXRh
YmxlKSBjYXBzUmVxVXNlci5jbG9uZU11dGFibGUoKTtcbiAgICB9XG5cbiAgICBpZihudWxsPT1k
ZXZpY2UpIHtcbiAgICAgICAgR3JhcGhpY3NDb25maWd1cmF0aW9uIGdjID0gc3VwZXIuZ2V0R3Jh
cGhpY3NDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIGlmKG51bGwhPWdjKSB7XG4gICAgICAgICAg
ICBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlu
c3RhbnRpYXRpb24gd2lsbCBiZSBpc3N1ZWQgaW4gYWRkTm90aWZ5KClcbiAgICB0aGlzLmNhcHNS
ZXFVc2VyID0gY2Fwc1JlcVVzZXI7XG4gICAgdGhpcy5jaG9vc2VyID0gY2hvb3NlcjtcbiAgICB0
aGlzLnNoYXJlV2l0aCA9IHNoYXJlV2l0aDtcbiAgICB0aGlzLmRldmljZSA9IGRldmljZTtcbiAg
fVxuXG4gIHB1YmxpYyB2b2lkIHNldFNoYWxsVXNlT2Zmc2NyZWVuTGF5ZXIoYm9vbGVhbiB2KSB7
XG4gICAgICBzaGFsbFVzZU9mZnNjcmVlbkxheWVyID0gdjtcbiAgfVxuXG4gIHB1YmxpYyBmaW5h
bCBib29sZWFuIGdldFNoYWxsVXNlT2Zmc2NyZWVuTGF5ZXIoKSB7XG4gICAgICByZXR1cm4gc2hh
bGxVc2VPZmZzY3JlZW5MYXllcjsgICAgICAgIFxuICB9XG5cbiAgcHVibGljIGZpbmFsIGJvb2xl
YW4gaXNPZmZzY3JlZW5MYXllclN1cmZhY2VFbmFibGVkKCkge1xuICAgICAgaWYobnVsbCAhPSBk
cmF3YWJsZSkge1xuICAgICAgICAgIHJldHVybiAoKEpBV1RXaW5kb3cpZHJhd2FibGUuZ2V0TmF0
aXZlU3VyZmFjZSgpKS5pc09mZnNjcmVlbkxheWVyU3VyZmFjZUVuYWJsZWQoKTtcbiAgICAgIH1c
biAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIFxuICAvKipcbiAgICogT3ZlcnJpZGRlbiB0
byBjaG9vc2UgYSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb24gYSBwYXJlbnQgY29udGFpbmVyJ3Nc
biAgICogR3JhcGhpY3NEZXZpY2UgYmVjYXVzZSBib3RoIGRldmljZXNcbiAgICovXG4gICAgQE92
ZXJyaWRlXG4gIHB1YmxpYyBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2V0R3JhcGhpY3NDb25maWd1
cmF0aW9uKCkge1xuICAgIC8qXG4gICAgICogV29ya2Fyb3VuZCBmb3IgcHJvYmxlbXMgd2l0aCBY
aW5lcmFtYSBhbmQgamF2YS5hd3QuQ29tcG9uZW50LmNoZWNrR0RcbiAgICAgKiB3aGVuIGFkZGlu
ZyB0byBhIGNvbnRhaW5lciBvbiBhIGRpZmZlcmVudCBncmFwaGljcyBkZXZpY2UgdGhhbiB0aGVc
biAgICAgKiBvbmUgdGhhdCB0aGlzIENhbnZhcyBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgICog
XG4gICAgICogR0Mgd2lsbCBiZSBudWxsIHVubGVzczpcbiAgICAgKiAgIC0gQSBuYXRpdmUgcGVl
ciBoYXMgYXNzaWduZWQgaXQuIFRoaXMgbWVhbnMgd2UgaGF2ZSBhIG5hdGl2ZVxuICAgICAqICAg
ICBwZWVyLCBhbmQgYXJlIGFscmVhZHkgY29taXR0ZWQgdG8gYSBncmFwaGljcyBjb25maWd1cmF0
aW9uLlxuICAgICAqICAgLSBUaGlzIGNhbnZhcyBoYXMgYmVlbiBhZGRlZCB0byBhIGNvbXBvbmVu
dCBoaWVyYXJjaHkgYW5kIGhhc1xuICAgICAqICAgICBhbiBhbmNlc3RvciB3aXRoIGEgbm9uLW51
bGwgR0MsIGJ1dCB0aGUgbmF0aXZlIHBlZXIgaGFzIG5vdFxuICAgICAqICAgICB5ZXQgYmVlbiBj
cmVhdGVkLiBUaGlzIG1lYW5zIHdlIGNhbiBzdGlsbCBjaG9vc2UgdGhlIEdDIG9uXG4gICAgICog
ICAgIGFsbCBwbGF0Zm9ybXMgc2luY2UgdGhlIHBlZXIgaGFzbid0IGJlZW4gY3JlYXRlZC5cbiAg
ICAgKi9cbiAgICBmaW5hbCBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MgPSBzdXBlci5nZXRHcmFw
aGljc0NvbmZpZ3VyYXRpb24oKTtcbiAgICAvKlxuICAgICAqIGNob3NlbiBpcyBvbmx5IG5vbi1u
dWxsIG9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgR0xEcmF3YWJsZUZhY3RvcnlcbiAgICAgKiByZXR1
cm5zIGEgbm9uLW51bGwgR3JhcGhpY3NDb25maWd1cmF0aW9uIChpbiB0aGUgR0xDYW52YXNcbiAg
ICAgKiBjb25zdHJ1Y3RvcikuXG4gICAgICogXG4gICAgICogaWYgZ2MgaXMgZnJvbSB0aGlzIENh
bnZhcycgbmF0aXZlIHBlZXIgdGhlbiBpdCBzaG91bGQgZXF1YWwgY2hvc2VuLFxuICAgICAqIG90
aGVyd2lzZSBpdCBpcyBmcm9tIGFuIGFuY2VzdG9yIGNvbXBvbmVudCB0aGF0IHRoaXMgQ2FudmFz
IGlzIGJlaW5nXG4gICAgICogYWRkZWQgdG8sIGFuZCB3ZSBnbyBpbnRvIHRoaXMgYmxvY2suXG4g
ICAgICovXG4gICAgR3JhcGhpY3NDb25maWd1cmF0aW9uIGNob3NlbiA9ICBhd3RDb25maWcuZ2V0
QVdUR3JhcGhpY3NDb25maWd1cmF0aW9uKCk7XG5cbiAgICBpZiAoZ2MgIT0gbnVsbCAmJiBjaG9z
ZW4gIT0gbnVsbCAmJiAhY2hvc2VuLmVxdWFscyhnYykpIHtcbiAgICAgIC8qXG4gICAgICAgKiBD
aGVjayBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGdjLiBJZiB0aGV5IGRpZmZlciBieSBvbmx5IHRo
ZVxuICAgICAgICogZGV2aWNlIHRoZW4gcmV0dXJuIGEgbmV3IEdDY29uZmlnIHdpdGggdGhlIHN1
cGVyLWNsYXNzJyBHRGV2aWNlXG4gICAgICAgKiAoYW5kIHByZXN1bWFibHkgdGhlIHNhbWUgdmlz
dWFsIElEIGluIFhpbmVyYW1hKS5cbiAgICAgICAqIFxuICAgICAgICovXG4gICAgICBpZiAoIWNo
b3Nlbi5nZXREZXZpY2UoKS5nZXRJRHN0cmluZygpLmVxdWFscyhnYy5nZXREZXZpY2UoKS5nZXRJ
RHN0cmluZygpKSkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBIZXJlIHdlIHNlbGVjdCBhIEdy
YXBoaWNzQ29uZmlndXJhdGlvbiBvbiB0aGUgYWx0ZXJuYXRlXG4gICAgICAgICAqIGRldmljZSB0
aGF0IGlzIHByZXN1bWFibHkgaWRlbnRpY2FsIHRvIHRoZSBjaG9zZW5cbiAgICAgICAgICogY29u
ZmlndXJhdGlvbiwgYnV0IG9uIHRoZSBvdGhlciBkZXZpY2UuXG4gICAgICAgICAqIFxuICAgICAg
ICAgKiBTaG91bGQgcmVhbGx5IGNoZWNrIHRvIGVuc3VyZSB0aGF0IHdlIHNlbGVjdCBhIGNvbmZp
Z3VyYXRpb25cbiAgICAgICAgICogd2l0aCB0aGUgc2FtZSBYIHZpc3VhbCBJRCBmb3IgWGluZXJh
bWEgc2NyZWVucywgb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgKiBHTERyYXdhYmxlIG1heSBoYXZl
IHRoZSB3cm9uZyB2aXN1YWwgSUQgKEkgZG9uJ3QgdGhpbmsgdGhpc1xuICAgICAgICAgKiBldmVy
IGdldHMgdXBkYXRlZCkuIE1heSBuZWVkIHRvIGFkZCBhIG1ldGhvZCB0b1xuICAgICAgICAgKiBY
MTFHTERyYXdhYmxlRmFjdG9yeSB0byBkbyB0aGlzIGluIGEgcGxhdGZvcm0gc3BlY2lmaWNcbiAg
ICAgICAgICogbWFubmVyLlxuICAgICAgICAgKiBcbiAgICAgICAgICogSG93ZXZlciwgb24gcGxh
dGZvcm1zIHdoZXJlIHdlIGNhbiBhY3R1YWxseSBnZXQgaW50byB0aGlzXG4gICAgICAgICAqIGJs
b2NrLCBib3RoIGRldmljZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgdmlzdWFsIGxpc3QsIGFuZCB0
aGVcbiAgICAgICAgICogc2FtZSBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBzZWxlY3RlZCBoZXJl
LlxuICAgICAgICAgKi9cbiAgICAgICAgQVdUR3JhcGhpY3NDb25maWd1cmF0aW9uIGNvbmZpZyA9
IGNob29zZUdyYXBoaWNzQ29uZmlndXJhdGlvbiggKEdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlKWF3
dENvbmZpZy5nZXRDaG9zZW5DYXBhYmlsaXRpZXMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdMQ2FwYWJp
bGl0aWVzSW1tdXRhYmxlKWF3dENvbmZpZy5nZXRSZXF1ZXN0ZWRDYXBhYmlsaXRpZXMoKSxcbiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2hvb3NlciwgZ2MuZ2V0RGV2aWNlKCkpO1xuICAgICAgICBmaW5hbCBHcmFw
aGljc0NvbmZpZ3VyYXRpb24gY29tcGF0aWJsZSA9IChudWxsIT1jb25maWcpP2NvbmZpZy5nZXRB
V1RHcmFwaGljc0NvbmZpZ3VyYXRpb24oKTpudWxsO1xuICAgICAgICBib29sZWFuIGVxdWFsQ2Fw
cyA9IGNvbmZpZy5nZXRDaG9zZW5DYXBhYmlsaXRpZXMoKS5lcXVhbHMoYXd0Q29uZmlnLmdldENo
b3NlbkNhcGFiaWxpdGllcygpKTtcbiAgICAgICAgaWYoREVCVUcpIHtcbiAgICAgICAgICAgIEV4
Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbihcIkluZm86IENhbGwgU3RhY2s6IFwiK1RocmVhZC5j
dXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTtcbiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNl
KCk7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oXCIhISEgQ3JlYXRlZCBDb25maWcg
KG4pOiBIQVZFICAgIEdDIFwiK2Nob3Nlbik7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50
bG4oXCIhISEgQ3JlYXRlZCBDb25maWcgKG4pOiBUSElTICAgIEdDIFwiK2djKTtcbiAgICAgICAg
ICAgIFN5c3RlbS5lcnIucHJpbnRsbihcIiEhISBDcmVhdGVkIENvbmZpZyAobik6IENob29zZW4g
R0MgXCIrY29tcGF0aWJsZSk7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oXCIhISEg
Q3JlYXRlZCBDb25maWcgKG4pOiBIQVZFICAgIENGIFwiK2F3dENvbmZpZyk7XG4gICAgICAgICAg
ICBTeXN0ZW0uZXJyLnByaW50bG4oXCIhISEgQ3JlYXRlZCBDb25maWcgKG4pOiBDaG9vc2VuIENG
IFwiK2NvbmZpZyk7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oXCIhISEgQ3JlYXRl
ZCBDb25maWcgKG4pOiBFUVVBTFMgQ0FQUyBcIitlcXVhbENhcHMpO1xuICAgICAgICB9XG5cbiAg
ICAgICAgaWYgKGNvbXBhdGlibGUgIT0gbnVsbCkge1xuICAgICAgICAgIC8qXG4gICAgICAgICAg
ICogU2F2ZSB0aGUgbmV3IEdDIGZvciBlcXVhbHMgdGVzdCBhYm92ZSwgYW5kIHRvIHJldHVybiB0
b1xuICAgICAgICAgICAqIGFueSBvdXRzaWRlIGNhbGxlcnMgb2YgdGhpcyBtZXRob2QuXG4gICAg
ICAgICAgICovXG4gICAgICAgICAgY2hvc2VuID0gY29tcGF0aWJsZTtcblxuICAgICAgICAgIGF3
dENvbmZpZyA9IGNvbmZpZztcblxuICAgICAgICAgIGlmKCAhZXF1YWxDYXBzICYmIEdMQXV0b0Ry
YXdhYmxlLlNDUkVFTl9DSEFOR0VfQUNUSU9OX0VOQUJMRUQgKSB7XG4gICAgICAgICAgICAgIGRp
c3Bvc2UodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8q
XG4gICAgICAgKiBJZiBhIGNvbXBhdGlibGUgR0Mgd2FzIG5vdCBmb3VuZCBpbiB0aGUgYmxvY2sg
YWJvdmUsIHRoaXMgd2lsbFxuICAgICAgICogcmV0dXJuIHRoZSBHQyB0aGF0IHdhcyBzZWxlY3Rl
ZCBpbiB0aGUgY29uc3RydWN0b3IgKGFuZCBtaWdodFxuICAgICAgICogY2F1c2UgYW4gZXhjZXB0
aW9uIGluIENvbXBvbmVudC5jaGVja0dEIHdoZW4gYWRkaW5nIHRvIGFcbiAgICAgICAqIGNvbnRh
aW5lciwgYnV0IGluIHRoaXMgY2FzZSB0aGF0IHdvdWxkIGJlIHRoZSBkZXNpcmVkIGJlaGF2aW9y
KS5cbiAgICAgICAqIFxuICAgICAgICovXG4gICAgICByZXR1cm4gY2hvc2VuO1xuICAgIH0gZWxz
ZSBpZiAoZ2MgPT0gbnVsbCkge1xuICAgICAgLypcbiAgICAgICAqIFRoZSBHQyBpcyBudWxsLCB3
aGljaCBtZWFucyB3ZSBoYXZlIG5vIG5hdGl2ZSBwZWVyLCBhbmQgYXJlIG5vdFxuICAgICAgICog
cGFydCBvZiBhIChyZWFsaXplZCkgY29tcG9uZW50IGhpZXJhcmNoeS4gU28gd2UgcmV0dXJuIHRo
ZVxuICAgICAgICogZGVzaXJlZCB2aXN1YWwgdGhhdCB3YXMgc2VsZWN0ZWQgaW4gdGhlIGNvbnN0
cnVjdG9yIChwb3NzaWJseVxuICAgICAgICogbnVsbCkuXG4gICAgICAgKi9cbiAgICAgIHJldHVy
biBjaG9zZW47XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBPdGhlcndpc2Ugd2UgaGF2ZSBub3Qg
ZXhwbGljaXRseSBzZWxlY3RlZCBhIEdDIGluIHRoZSBjb25zdHJ1Y3Rvciwgc29cbiAgICAgKiBq
dXN0IHJldHVybiB3aGF0IENhbnZhcyB3b3VsZCBoYXZlLlxuICAgICAqL1xuICAgIHJldHVybiBn
YztcbiAgfVxuICBcbiAgcHVibGljIEdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEdMQ29udGV4dCBz
aGFyZVdpdGgpIHtcbiAgICAgIGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgICB0cnkge1xuICAg
ICAgICByZXR1cm4gKG51bGwgIT0gZHJhd2FibGUpID8gZHJhd2FibGUuY3JlYXRlQ29udGV4dChz
aGFyZVdpdGgpIDogbnVsbDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRyYXdhYmxlU3lu
Yy51bmxvY2soKTtcbiAgICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2b2lkIHNldFJlYWxpemVkKGJv
b2xlYW4gcmVhbGl6ZWQpIHtcbiAgfVxuXG4gIHB1YmxpYyBib29sZWFuIGlzUmVhbGl6ZWQoKSB7
XG4gICAgICBkcmF3YWJsZVN5bmMubG9jaygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJu
ICggbnVsbCAhPSBkcmF3YWJsZSApID8gZHJhd2FibGUuaXNSZWFsaXplZCgpIDogZmFsc2U7XG4g
ICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkcmF3YWJsZVN5bmMudW5sb2NrKCk7XG4gICAgICB9
XG4gIH1cblxuICBwdWJsaWMgaW50IGdldERlZmF1bHRDbG9zZU9wZXJhdGlvbigpIHtcbiAgICAg
IHJldHVybiBhd3RXaW5kb3dDbG9zaW5nUHJvdG9jb2wuZ2V0RGVmYXVsdENsb3NlT3BlcmF0aW9u
KCk7XG4gIH1cblxuICBwdWJsaWMgaW50IHNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihpbnQgb3Ap
IHtcbiAgICAgIHJldHVybiBhd3RXaW5kb3dDbG9zaW5nUHJvdG9jb2wuc2V0RGVmYXVsdENsb3Nl
T3BlcmF0aW9uKG9wKTtcbiAgfVxuXG4gIHB1YmxpYyB2b2lkIGRpc3BsYXkoKSB7XG4gICAgaWYo
ICF2YWxpZGF0ZUdMRHJhd2FibGUoKSApIHtcbiAgICAgICAgaWYoREVCVUcpIHtcbiAgICAgICAg
ICAgIFN5c3RlbS5lcnIucHJpbnRsbihcIkluZm86IEdMQ2FudmFzIGRpc3BsYXkgLSBza2lwcGVk
IEdMIHJlbmRlciwgZHJhd2FibGUgbm90IHZhbGlkIHlldFwiKTtcbiAgICAgICAgfVxuICAgICAg
ICByZXR1cm47IC8vIG5vdCB5ZXQgYXZhaWxhYmxlIC4uXG4gICAgfVxuICAgIG1heWJlRG9TaW5n
bGVUaHJlYWRlZFdvcmthcm91bmQoZGlzcGxheU9uRXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbixc
biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlBY3Rpb24pO1xuXG4g
ICAgYXd0V2luZG93Q2xvc2luZ1Byb3RvY29sLmFkZENsb3NpbmdMaXN0ZW5lck9uZVNob3QoKTtc
biAgfVxuXG4gIHByaXZhdGUgdm9pZCBkaXNwb3NlKGJvb2xlYW4gcmVnZW5lcmF0ZSkge1xuICAg
IGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgZmluYWwgR0xBbmltYXRv
ckNvbnRyb2wgYW5pbWF0b3IgPSAgZ2V0QW5pbWF0b3IoKTtcbiAgICAgICAgaWYoREVCVUcpIHtc
biAgICAgICAgICAgIEV4Y2VwdGlvbiBleDEgPSBuZXcgRXhjZXB0aW9uKFwiSW5mbzogZGlzcG9z
ZShcIityZWdlbmVyYXRlK1wiKSAtIFNUQVJULCBoYXNDb250ZXh0IFwiICtcbiAgICAgICAgICAg
ICAgICAgICAgKG51bGwhPWNvbnRleHQpICsgXCIsIGhhc0RyYXdhYmxlIFwiICsgKG51bGwhPWRy
YXdhYmxlKStcIiwgXCIrYW5pbWF0b3IpO1xuICAgICAgICAgICAgZXgxLnByaW50U3RhY2tUcmFj
ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobnVsbCE9Y29udGV4dCkge1xuICAgICAgICAg
ICAgYm9vbGVhbiBhbmltYXRvclBhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYobnVsbCE9
YW5pbWF0b3IpIHtcbiAgICAgICAgICAgICAgICAvLyBjYW4ndCByZW1vdmUgdXMgZnJvbSBhbmlt
YXRvciBmb3IgcmVjcmVhdGlvbmFsIGFkZE5vdGlmeSgpXG4gICAgICAgICAgICAgICAgYW5pbWF0
b3JQYXVzZWQgPSBhbmltYXRvci5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAg
ICBkaXNwb3NlUmVnZW5lcmF0ZT1yZWdlbmVyYXRlO1xuXG4gICAgICAgICAgICBpZiAoVGhyZWFk
aW5nLmlzU2luZ2xlVGhyZWFkZWQoKSAmJlxuICAgICAgICAgICAgICAgICFUaHJlYWRpbmcuaXNP
cGVuR0xUaHJlYWQoKSkge1xuICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciB0ZXJtaW5h
dGlvbiBpc3N1ZXMgd2l0aCBhcHBsZXRzIC0tXG4gICAgICAgICAgICAgIC8vIHN1bi5hcHBsZXQu
QXBwbGV0UGFuZWwgc2hvdWxkIHByb2JhYmx5IGJlIHBlcmZvcm1pbmcgdGhlXG4gICAgICAgICAg
ICAgIC8vIHJlbW92ZSgpIGNhbGwgb24gdGhlIEVEVCByYXRoZXIgdGhhbiBvbiBpdHMgb3duIHRo
cmVhZFxuICAgICAgICAgICAgICAvLyBIaW50OiBVc2VyIHNob3VsZCBydW4gcmVtb3ZlIGZyb20g
RURULlxuICAgICAgICAgICAgICBpZiAoVGhyZWFkaW5nSW1wbC5pc0FXVE1vZGUoKSAmJlxuICAg
ICAgICAgICAgICAgICAgVGhyZWFkLmhvbGRzTG9jayhnZXRUcmVlTG9jaygpKSkge1xuICAgICAg
ICAgICAgICAgIC8vIFRoZSB1c2VyIHJlYWxseSBzaG91bGQgbm90IGJlIGludm9raW5nIHJlbW92
ZSgpIGZyb20gdGhpc1xuICAgICAgICAgICAgICAgIC8vIHRocmVhZCAtLSBidXQgc2luY2UgaGUv
c2hlIGlzLCB3ZSBjYW4gbm90IGdvIG92ZXIgdG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gRURU
IGF0IHRoaXMgcG9pbnQuIFRyeSB0byBkZXN0cm95IHRoZSBjb250ZXh0IGZyb20gaGVyZS5cbiAg
ICAgICAgICAgICAgICBpZihjb250ZXh0LmlzQ3JlYXRlZCgpKSB7XG4gICAgICAgICAgICAgICAg
ICAgIGRyYXdhYmxlSGVscGVyLmludm9rZUdMKGRyYXdhYmxlLCBjb250ZXh0LCBkaXNwb3NlQWN0
aW9uLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZihj
b250ZXh0LmlzQ3JlYXRlZCgpKSB7XG4gICAgICAgICAgICAgICAgVGhyZWFkaW5nLmludm9rZU9u
T3BlbkdMVGhyZWFkKGRpc3Bvc2VPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rpb24pO1xuICAgICAg
ICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYoY29udGV4dC5pc0NyZWF0ZWQoKSkge1xu
ICAgICAgICAgICAgICBkcmF3YWJsZUhlbHBlci5pbnZva2VHTChkcmF3YWJsZSwgY29udGV4dCwg
ZGlzcG9zZUFjdGlvbiwgbnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGFu
aW1hdG9yUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0b3IucmVzdW1lKCk7XG4gICAg
ICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYoIXJlZ2VuZXJhdGUpIHtcbiAgICAgICAg
ICAgIGRpc3Bvc2VBYnN0cmFjdEdyYXBoaWNzRGV2aWNlKCk7XG4gICAgICAgIH1cblxuICAgICAg
ICBpZihERUJVRykge1xuICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFwiZGlzcG9zZShc
IityZWdlbmVyYXRlK1wiKSAtIEVORCwgXCIrYW5pbWF0b3IpO1xuICAgICAgICB9XG4gICAgfSBm
aW5hbGx5IHtcbiAgICAgICAgZHJhd2FibGVTeW5jLnVubG9jaygpO1xuICAgIH1cbiAgfVxuXG4g
IC8qKlxuICAgKiBKdXN0IGFuIGFsaWFzIGZvciByZW1vdmVOb3RpZnlcbiAgICovXG4gIHB1Ymxp
YyB2b2lkIGRlc3Ryb3koKSB7XG4gICAgcmVtb3ZlTm90aWZ5KCk7XG4gIH1cblxuICAvKiogT3Zl
cnJpZGRlbiB0byBjYXVzZSBPcGVuR0wgcmVuZGVyaW5nIHRvIGJlIHBlcmZvcm1lZCBkdXJpbmdc
biAgICAgIHJlcGFpbnQgY3ljbGVzLiBTdWJjbGFzc2VzIHdoaWNoIG92ZXJyaWRlIHRoaXMgbWV0
aG9kIG11c3QgY2FsbFxuICAgICAgc3VwZXIucGFpbnQoKSBpbiB0aGVpciBwYWludCgpIG1ldGhv
ZCBpbiBvcmRlciB0byBmdW5jdGlvblxuICAgICAgcHJvcGVybHkuIDxQPlxuXG4gICAgICA8Qj5P
dmVycmlkZXM6PC9CPlxuICAgICAgPERMPjxERD48Q09ERT5wYWludDwvQ09ERT4gaW4gY2xhc3Mg
PENPREU+amF2YS5hd3QuQ29tcG9uZW50PC9DT0RFPjwvREQ+PC9ETD4gKi9cbiAgICBAT3ZlcnJp
ZGVcbiAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykge1xuICAgIGlmIChCZWFucy5pc0Rl
c2lnblRpbWUoKSkge1xuICAgICAgLy8gTWFrZSBHTENhbnZhcyBiZWhhdmUgYmV0dGVyIGluIE5l
dEJlYW5zIEdVSSBidWlsZGVyXG4gICAgICBnLnNldENvbG9yKENvbG9yLkJMQUNLKTtcbiAgICAg
IGcuZmlsbFJlY3QoMCwgMCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpO1xuICAgICAgRm9udE1l
dHJpY3MgZm0gPSBnLmdldEZvbnRNZXRyaWNzKCk7XG4gICAgICBTdHJpbmcgbmFtZSA9IGdldE5h
bWUoKTtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgbmFtZSA9IGdldENsYXNz
KCkuZ2V0TmFtZSgpO1xuICAgICAgICBpbnQgaWR4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpO1xu
ICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmco
aWR4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFJlY3RhbmdsZTJEIGJvdW5kcyA9
IGZtLmdldFN0cmluZ0JvdW5kcyhuYW1lLCBnKTtcbiAgICAgIGcuc2V0Q29sb3IoQ29sb3IuV0hJ
VEUpO1xuICAgICAgZy5kcmF3U3RyaW5nKG5hbWUsXG4gICAgICAgICAgICAgICAgICAgKGludCkg
KChnZXRXaWR0aCgpICAtIGJvdW5kcy5nZXRXaWR0aCgpKSAgLyAyKSxcbiAgICAgICAgICAgICAg
ICAgICAoaW50KSAoKGdldEhlaWdodCgpICsgYm91bmRzLmdldEhlaWdodCgpKSAvIDIpKTtcbiAg
ICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoICEgdGhpcy5kcmF3YWJsZUhlbHBlci5pc0FuaW1h
dG9yQW5pbWF0aW5nKCkgKSB7XG4gICAgICAgIGRpc3BsYXkoKTtcbiAgICB9XG4gIH1cblxuICBS
ZWN1cnNpdmVMb2NrIGRyYXdhYmxlU3luYyA9IExvY2tGYWN0b3J5LmNyZWF0ZVJlY3Vyc2l2ZUxv
Y2soKTtcblxuICAvKiogT3ZlcnJpZGRlbiB0byB0cmFjayB3aGVuIHRoaXMgY29tcG9uZW50IGlz
IGFkZGVkIHRvIGEgY29udGFpbmVyLlxuICAgICAgU3ViY2xhc3NlcyB3aGljaCBvdmVycmlkZSB0
aGlzIG1ldGhvZCBtdXN0IGNhbGxcbiAgICAgIHN1cGVyLmFkZE5vdGlmeSgpIGluIHRoZWlyIGFk
ZE5vdGlmeSgpIG1ldGhvZCBpbiBvcmRlciB0b1xuICAgICAgZnVuY3Rpb24gcHJvcGVybHkuIDxQ
PlxuXG4gICAgICA8Qj5PdmVycmlkZXM6PC9CPlxuICAgICAgPERMPjxERD48Q09ERT5hZGROb3Rp
Znk8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEuYXd0LkNvbXBvbmVudDwvQ09ERT48L0REPjwv
REw+ICovXG4gICAgQFN1cHByZXNzV2FybmluZ3MoXCJkZXByZWNhdGlvblwiKVxuICAgIEBPdmVy
cmlkZVxuICBwdWJsaWMgdm9pZCBhZGROb3RpZnkoKSB7XG4gICAgaWYoREVCVUcpIHtcbiAgICAg
ICAgRXhjZXB0aW9uIGV4MSA9IG5ldyBFeGNlcHRpb24oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5n
ZXROYW1lKCkrXCIgLSBJbmZvOiBhZGROb3RpZnkgLSBzdGFydCwgYm91bmRzOiBcIit0aGlzLmdl
dEJvdW5kcygpKTtcbiAgICAgICAgZXgxLnByaW50U3RhY2tUcmFjZSgpO1xuICAgIH1cblxuICAg
IGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAq
ICdzdXBlci5hZGROb3RpZnkoKScgZGV0ZXJtaW5lcyB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9u
LFxuICAgICAgICAgKiB3aGlsZSBjYWxsaW5nIHRoaXMgY2xhc3MncyBvdmVycmlkZW4gJ2dldEdy
YXBoaWNzQ29uZmlndXJhdGlvbigpJyBtZXRob2RcbiAgICAgICAgICogYWZ0ZXIgd2hpY2ggaXQg
Y3JlYXRlcyB0aGUgbmF0aXZlIHBlZXIuXG4gICAgICAgICAqIEhlbmNlIHdlIGhhdmUgdG8gc2V0
IHRoZSAnYXd0Q29uZmlnJyBiZWZvcmUgc2luY2UgaXQncyBHcmFwaGljc0NvbmZpZ3VyYXRpb25c
biAgICAgICAgICogaXMgYmVpbmcgdXNlZCBpbiBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKS5c
biAgICAgICAgICogVGhpcyBjb2RlIG9yZGVyIGFsc28gYWxsb3dzIHJlY3JlYXRpb24sIGllIHJl
LWFkZGluZyB0aGUgR0xDYW52YXMuXG4gICAgICAgICAqL1xuICAgICAgICBhd3RDb25maWcgPSBj
aG9vc2VHcmFwaGljc0NvbmZpZ3VyYXRpb24oY2Fwc1JlcVVzZXIsIGNhcHNSZXFVc2VyLCBjaG9v
c2VyLCBkZXZpY2UpO1xuICAgICAgICBpZihudWxsPT1hd3RDb25maWcpIHtcbiAgICAgICAgICAg
IHRocm93IG5ldyBHTEV4Y2VwdGlvbihcIkVycm9yOiBOVUxMIEFXVEdyYXBoaWNzQ29uZmlndXJh
dGlvblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJlZm9yZSBuYXRpdmUgcGVlciBpcyB2
YWxpZDogWDExXG4gICAgICAgIGRpc2FibGVCYWNrZ3JvdW5kRXJhc2UoKTtcblxuICAgICAgICAv
LyBpc3N1ZXMgZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkgYW5kIGNyZWF0ZXMgdGhlIG5hdGl2
ZSBwZWVyXG4gICAgICAgIHN1cGVyLmFkZE5vdGlmeSgpO1xuXG4gICAgICAgIC8vIGFmdGVyIG5h
dGl2ZSBwZWVyIGlzIHZhbGlkOiBXaW5kb3dzXG4gICAgICAgIGRpc2FibGVCYWNrZ3JvdW5kRXJh
c2UoKTtcblxuICAgICAgICBpZiAoIUJlYW5zLmlzRGVzaWduVGltZSgpKSB7XG4gICAgICAgICAg
ICBjcmVhdGVEcmF3YWJsZUFuZENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlu
aXQgZHJhd2FibGUgYnkgcGFpbnQvZGlzcGxheSBtYWtlcyB0aGUgaW5pdCBzZXF1ZW5jZSBtb3Jl
IGVxdWFsXG4gICAgICAgIC8vIGZvciBhbGwgbGF1bmNoIGZsYXZvcnMgKGFwcGxldC9qYXZhd3Mv
Li4pXG4gICAgICAgIC8vIHZhbGlkYXRlR0xEcmF3YWJsZSgpO1xuXG4gICAgICAgIGlmKERFQlVH
KSB7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQo
KS5nZXROYW1lKCkrXCIgLSBJbmZvOiBhZGROb3RpZnkgLSBlbmQ6IHBlZXI6IFwiK2dldFBlZXIo
KSk7XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgIGRyYXdhYmxlU3luYy51bmxv
Y2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZvaWQgY3JlYXRlRHJhd2FibGVBbmRDb250
ZXh0KCkge1xuICAgIC8vIG5vIGxvY2sgcmVxdWlyZWQsIHNpbmNlIHRoaXMgcmVzb3VyY2UgYWlu
J3QgYXZhaWxhYmxlIHlldFxuICAgIGZpbmFsIEpBV1RXaW5kb3cgamF3dFdpbmRvdyA9IChKQVdU
V2luZG93KSBOYXRpdmVXaW5kb3dGYWN0b3J5LmdldE5hdGl2ZVdpbmRvdyh0aGlzLCBhd3RDb25m
aWcpO1xuICAgIGphd3RXaW5kb3cuc2V0U2hhbGxVc2VPZmZzY3JlZW5MYXllcihzaGFsbFVzZU9m
ZnNjcmVlbkxheWVyKTtcbiAgICBqYXd0V2luZG93LmxvY2tTdXJmYWNlKCk7XG4gICAgdHJ5IHtc
biAgICAgICAgZHJhd2FibGUgPSBHTERyYXdhYmxlRmFjdG9yeS5nZXRGYWN0b3J5KGNhcHNSZXFV
c2VyLmdldEdMUHJvZmlsZSgpKS5jcmVhdGVHTERyYXdhYmxlKGphd3RXaW5kb3cpO1xuICAgICAg
ICBjb250ZXh0ID0gKEdMQ29udGV4dEltcGwpIGRyYXdhYmxlLmNyZWF0ZUNvbnRleHQoc2hhcmVX
aXRoKTtcbiAgICAgICAgY29udGV4dC5zZXRTeW5jaHJvbml6ZWQodHJ1ZSk7XG4gICAgICAgIGNv
bnRleHQuc2V0Q29udGV4dENyZWF0aW9uRmxhZ3MoYWRkaXRpb25hbEN0eENyZWF0aW9uRmxhZ3Mp
O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGphd3RXaW5kb3cudW5sb2NrU3VyZmFjZSgpO1xu
ICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlR0xEcmF3YWJsZSgpIHtc
biAgICBib29sZWFuIHJlYWxpemVkID0gZmFsc2U7XG4gICAgaWYgKCFCZWFucy5pc0Rlc2lnblRp
bWUoKSkge1xuICAgICAgICBkcmF3YWJsZVN5bmMubG9jaygpO1xuICAgICAgICB0cnkge1xuICAg
ICAgICAgICAgaWYgKCBudWxsICE9IGRyYXdhYmxlICkge1xuICAgICAgICAgICAgICAgIHJlYWxp
emVkID0gZHJhd2FibGUuaXNSZWFsaXplZCgpO1xuICAgICAgICAgICAgICAgIGlmICggIXJlYWxp
emVkICYmIDAgPCBkcmF3YWJsZS5nZXRXaWR0aCgpICogZHJhd2FibGUuZ2V0SGVpZ2h0KCkgKSB7
XG4gICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlLnNldFJlYWxpemVkKHRydWUpO1xuICAgICAg
ICAgICAgICAgICAgICByZWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRS
ZXNoYXBlPXRydWU7IC8vIGVuc3VyZSBhIHJlc2hhcGUgaXMgYmVpbmcgc2VuZCAuLlxuICAgICAg
ICAgICAgICAgICAgICBpZihERUJVRykge1xuICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5n
IG1zZyA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpK1wiIC0gUmVhbGl6ZWQgRHJh
d2FibGU6IFwiK2RyYXdhYmxlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAv
LyBTeXN0ZW0uZXJyLnByaW50bG4obXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRocm93
YWJsZSB0ID0gbmV3IFRocm93YWJsZShtc2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdC5w
cmludFN0YWNrVHJhY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAg
IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgZHJhd2Fi
bGVTeW5jLnVubG9jaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWFsaXplZDtc
biAgfVxuXG4gIC8qKiA8cD5PdmVycmlkZGVuIHRvIHRyYWNrIHdoZW4gdGhpcyBjb21wb25lbnQg
aXMgcmVtb3ZlZCBmcm9tIGFcbiAgICAgIGNvbnRhaW5lci4gU3ViY2xhc3NlcyB3aGljaCBvdmVy
cmlkZSB0aGlzIG1ldGhvZCBtdXN0IGNhbGxcbiAgICAgIHN1cGVyLnJlbW92ZU5vdGlmeSgpIGlu
IHRoZWlyIHJlbW92ZU5vdGlmeSgpIG1ldGhvZCBpbiBvcmRlciB0b1xuICAgICAgZnVuY3Rpb24g
cHJvcGVybHkuIDwvcD5cbiAgICAgIDxwPlVzZXIgc2hhbGwgbm90IGNhbGwgdGhpcyBtZXRob2Qg
b3V0c2lkZSBvZiBFRFQsIHJlYWQgdGhlIEFXVC9Td2luZyBzcGVjc1xuICAgICAgYWJvdXQgdGhp
cy48L3A+XG4gICAgICA8Qj5PdmVycmlkZXM6PC9CPlxuICAgICAgPERMPjxERD48Q09ERT5yZW1v
dmVOb3RpZnk8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEuYXd0LkNvbXBvbmVudDwvQ09ERT48
L0REPjwvREw+ICovXG4gICAgQFN1cHByZXNzV2FybmluZ3MoXCJkZXByZWNhdGlvblwiKVxuICAg
IEBPdmVycmlkZVxuICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZnkoKSB7XG4gICAgaWYoREVCVUcp
IHtcbiAgICAgICAgRXhjZXB0aW9uIGV4MSA9IG5ldyBFeGNlcHRpb24oVGhyZWFkLmN1cnJlbnRU
aHJlYWQoKS5nZXROYW1lKCkrXCIgLSBJbmZvOiByZW1vdmVOb3RpZnkgLSBzdGFydFwiKTtcbiAg
ICAgICAgZXgxLnByaW50U3RhY2tUcmFjZSgpO1xuICAgIH1cblxuICAgIGF3dFdpbmRvd0Nsb3Np
bmdQcm90b2NvbC5yZW1vdmVDbG9zaW5nTGlzdGVuZXIoKTtcblxuICAgIGlmIChCZWFucy5pc0Rl
c2lnblRpbWUoKSkge1xuICAgICAgc3VwZXIucmVtb3ZlTm90aWZ5KCk7XG4gICAgfSBlbHNlIHtc
biAgICAgIGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgICB0cnkge1xuICAgICAgICBkaXNwb3Nl
KGZhbHNlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnRleHQ9bnVsbDtcbiAgICAg
ICAgZHJhd2FibGU9bnVsbDtcbiAgICAgICAgYXd0Q29uZmlnPW51bGw7XG4gICAgICAgIHN1cGVy
LnJlbW92ZU5vdGlmeSgpO1xuICAgICAgICBkcmF3YWJsZVN5bmMudW5sb2NrKCk7XG4gICAgICB9
XG4gICAgfVxuICAgIGlmKERFQlVHKSB7XG4gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihUaHJl
YWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKStcIiAtIEluZm86IHJlbW92ZU5vdGlmeSAtIGVu
ZCwgcGVlcjogXCIrZ2V0UGVlcigpKTtcbiAgICB9XG4gIH1cblxuICAvKiogT3ZlcnJpZGRlbiB0
byBjYXVzZSB7QGxpbmsgR0xEcmF3YWJsZUhlbHBlciNyZXNoYXBlfSB0byBiZVxuICAgICAgY2Fs
bGVkIG9uIGFsbCByZWdpc3RlcmVkIHtAbGluayBHTEV2ZW50TGlzdGVuZXJ9cy4gU3ViY2xhc3Nl
c1xuICAgICAgd2hpY2ggb3ZlcnJpZGUgdGhpcyBtZXRob2QgbXVzdCBjYWxsIHN1cGVyLnJlc2hh
cGUoKSBpblxuICAgICAgdGhlaXIgcmVzaGFwZSgpIG1ldGhvZCBpbiBvcmRlciB0byBmdW5jdGlv
biBwcm9wZXJseS4gPFA+XG5cbiAgICAgIDxCPk92ZXJyaWRlczo8L0I+XG4gICAgICA8REw+PERE
PjxDT0RFPnJlc2hhcGU8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEuYXd0LkNvbXBvbmVudDwv
Q09ERT48L0REPjwvREw+ICovXG4gICAgQFN1cHByZXNzV2FybmluZ3MoXCJkZXByZWNhdGlvblwi
KVxuICAgIEBPdmVycmlkZVxuICBwdWJsaWMgdm9pZCByZXNoYXBlKGludCB4LCBpbnQgeSwgaW50
IHdpZHRoLCBpbnQgaGVpZ2h0KSB7XG4gICAgc3VwZXIucmVzaGFwZSh4LCB5LCB3aWR0aCwgaGVp
Z2h0KTtcbiAgICBpZihudWxsICE9IGRyYXdhYmxlICYmIGRyYXdhYmxlLmlzUmVhbGl6ZWQoKSAm
JiAhZHJhd2FibGUuZ2V0Q2hvc2VuR0xDYXBhYmlsaXRpZXMoKS5pc09uc2NyZWVuKCkpIHtcbiAg
ICAgICAgZGlzcG9zZSh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzZW5kUmVzaGFwZSA9
IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqIDxCPk92ZXJyaWRlczo8L0I+XG4gICAgICA8REw+
PEREPjxDT0RFPnVwZGF0ZTwvQ09ERT4gaW4gY2xhc3MgPENPREU+amF2YS5hd3QuQ29tcG9uZW50
PC9DT0RFPjwvREQ+PC9ETD4gKi9cbiAgLyoqIFxuICAgKiBPdmVycmlkZGVuIGZyb20gQ2FudmFz
IHRvIHByZXZlbnQgdGhlIEFXVCdzIGNsZWFyaW5nIG9mIHRoZVxuICAgKiBjYW52YXMgZnJvbSBp
bnRlcmZlcmluZyB3aXRoIHRoZSBPcGVuR0wgcmVuZGVyaW5nLlxuICAgKi9cbiAgICBAT3ZlcnJp
ZGVcbiAgcHVibGljIHZvaWQgdXBkYXRlKEdyYXBoaWNzIGcpIHtcbiAgICBwYWludChnKTtcbiAg
fVxuICBcbiAgcHVibGljIHZvaWQgYWRkR0xFdmVudExpc3RlbmVyKEdMRXZlbnRMaXN0ZW5lciBs
aXN0ZW5lcikge1xuICAgIGRyYXdhYmxlSGVscGVyLmFkZEdMRXZlbnRMaXN0ZW5lcihsaXN0ZW5l
cik7XG4gIH1cblxuICBwdWJsaWMgdm9pZCBhZGRHTEV2ZW50TGlzdGVuZXIoaW50IGluZGV4LCBH
TEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHtcbiAgICBkcmF3YWJsZUhlbHBlci5hZGRHTEV2ZW50
TGlzdGVuZXIoaW5kZXgsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyB2b2lkIHJlbW92ZUdM
RXZlbnRMaXN0ZW5lcihHTEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHtcbiAgICBkcmF3YWJsZUhl
bHBlci5yZW1vdmVHTEV2ZW50TGlzdGVuZXIobGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHZv
aWQgc2V0QW5pbWF0b3IoR0xBbmltYXRvckNvbnRyb2wgYW5pbWF0b3JDb250cm9sKSB7XG4gICAg
ZHJhd2FibGVIZWxwZXIuc2V0QW5pbWF0b3IoYW5pbWF0b3JDb250cm9sKTtcbiAgfVxuXG4gIHB1
YmxpYyBHTEFuaW1hdG9yQ29udHJvbCBnZXRBbmltYXRvcigpIHtcbiAgICByZXR1cm4gZHJhd2Fi
bGVIZWxwZXIuZ2V0QW5pbWF0b3IoKTtcbiAgfVxuXG4gIHB1YmxpYyB2b2lkIGludm9rZShib29s
ZWFuIHdhaXQsIEdMUnVubmFibGUgZ2xSdW5uYWJsZSkge1xuICAgIGRyYXdhYmxlSGVscGVyLmlu
dm9rZSh0aGlzLCB3YWl0LCBnbFJ1bm5hYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyB2b2lkIHNldENv
bnRleHQoR0xDb250ZXh0IGN0eCkge1xuICAgIGNvbnRleHQ9KEdMQ29udGV4dEltcGwpY3R4O1xu
ICAgIGlmKG51bGwgIT0gY29udGV4dCkge1xuICAgICAgICBjb250ZXh0LnNldENvbnRleHRDcmVh
dGlvbkZsYWdzKGFkZGl0aW9uYWxDdHhDcmVhdGlvbkZsYWdzKTtcbiAgICB9XG4gIH1cblxuICBw
dWJsaWMgR0xDb250ZXh0IGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1c
blxuICBwdWJsaWMgR0wgZ2V0R0woKSB7XG4gICAgaWYgKEJlYW5zLmlzRGVzaWduVGltZSgpKSB7
XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgR0xDb250ZXh0IGN0eCA9IGdldENvbnRl
eHQoKTtcbiAgICByZXR1cm4gKGN0eCA9PSBudWxsKSA/IG51bGwgOiBjdHguZ2V0R0woKTtcbiAg
fVxuXG4gIHB1YmxpYyBHTCBzZXRHTChHTCBnbCkge1xuICAgIEdMQ29udGV4dCBjdHggPSBnZXRD
b250ZXh0KCk7XG4gICAgaWYgKGN0eCAhPSBudWxsKSB7XG4gICAgICBjdHguc2V0R0woZ2wpO1xu
ICAgICAgcmV0dXJuIGdsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG5cbiAgcHVi
bGljIHZvaWQgc2V0QXV0b1N3YXBCdWZmZXJNb2RlKGJvb2xlYW4gb25Pck9mZikge1xuICAgIGRy
YXdhYmxlSGVscGVyLnNldEF1dG9Td2FwQnVmZmVyTW9kZShvbk9yT2ZmKTtcbiAgfVxuXG4gIHB1
YmxpYyBib29sZWFuIGdldEF1dG9Td2FwQnVmZmVyTW9kZSgpIHtcbiAgICByZXR1cm4gZHJhd2Fi
bGVIZWxwZXIuZ2V0QXV0b1N3YXBCdWZmZXJNb2RlKCk7XG4gIH1cblxuICBwdWJsaWMgdm9pZCBz
d2FwQnVmZmVycygpIHtcbiAgICBtYXliZURvU2luZ2xlVGhyZWFkZWRXb3JrYXJvdW5kKHN3YXBC
dWZmZXJzT25FdmVudERpc3BhdGNoVGhyZWFkQWN0aW9uLCBzd2FwQnVmZmVyc0FjdGlvbik7XG4g
IH1cblxuICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0Q3JlYXRpb25GbGFncyhpbnQgZmxhZ3MpIHtc
biAgICBhZGRpdGlvbmFsQ3R4Q3JlYXRpb25GbGFncyA9IGZsYWdzO1xuICB9XG4gICAgICBcbiAg
cHVibGljIGludCBnZXRDb250ZXh0Q3JlYXRpb25GbGFncygpIHtcbiAgICByZXR1cm4gYWRkaXRp
b25hbEN0eENyZWF0aW9uRmxhZ3M7ICAgICAgICAgICAgICAgIFxuICB9XG4gICAgICAgICAgXG4g
IHB1YmxpYyBHTFByb2ZpbGUgZ2V0R0xQcm9maWxlKCkge1xuICAgIHJldHVybiBjYXBzUmVxVXNl
ci5nZXRHTFByb2ZpbGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBHTENhcGFiaWxpdGllc0ltbXV0YWJs
ZSBnZXRDaG9zZW5HTENhcGFiaWxpdGllcygpIHtcbiAgICBpZiAoYXd0Q29uZmlnID09IG51bGwp
IHtcbiAgICAgICAgdGhyb3cgbmV3IEdMRXhjZXB0aW9uKFwiTm8gQVdUR3JhcGhpY3NDb25maWd1
cmF0aW9uOiBcIit0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKEdMQ2FwYWJpbGl0aWVzSW1t
dXRhYmxlKWF3dENvbmZpZy5nZXRDaG9zZW5DYXBhYmlsaXRpZXMoKTtcbiAgfVxuXG4gIHB1Ymxp
YyBHTENhcGFiaWxpdGllc0ltbXV0YWJsZSBnZXRSZXF1ZXN0ZWRHTENhcGFiaWxpdGllcygpIHtc
biAgICBpZiAoYXd0Q29uZmlnID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGNhcHNSZXFVc2Vy
O1xuICAgIH1cblxuICAgIHJldHVybiAoR0xDYXBhYmlsaXRpZXNJbW11dGFibGUpYXd0Q29uZmln
LmdldFJlcXVlc3RlZENhcGFiaWxpdGllcygpO1xuICB9XG5cbiAgcHVibGljIE5hdGl2ZVN1cmZh
Y2UgZ2V0TmF0aXZlU3VyZmFjZSgpIHtcbiAgICAgIGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAg
ICB0cnkge1xuICAgICAgICByZXR1cm4gKG51bGwgIT0gZHJhd2FibGUpID8gZHJhd2FibGUuZ2V0
TmF0aXZlU3VyZmFjZSgpIDogbnVsbDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRyYXdh
YmxlU3luYy51bmxvY2soKTtcbiAgICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb25nIGdldEhhbmRs
ZSgpIHtcbiAgICAgIGRyYXdhYmxlU3luYy5sb2NrKCk7XG4gICAgICB0cnkge1xuICAgICAgICBy
ZXR1cm4gKG51bGwgIT0gZHJhd2FibGUpID8gZHJhd2FibGUuZ2V0SGFuZGxlKCkgOiAwO1xuICAg
ICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZHJhd2FibGVTeW5jLnVubG9jaygpO1xuICAgICAgfVxu
ICB9XG5cbiAgcHVibGljIEdMRHJhd2FibGVGYWN0b3J5IGdldEZhY3RvcnkoKSB7XG4gICAgICBk
cmF3YWJsZVN5bmMubG9jaygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChudWxsICE9
IGRyYXdhYmxlKSA/IGRyYXdhYmxlLmdldEZhY3RvcnkoKSA6IG51bGw7XG4gICAgICB9IGZpbmFs
bHkge1xuICAgICAgICBkcmF3YWJsZVN5bmMudW5sb2NrKCk7XG4gICAgICB9XG4gIH1cblxuICBA
T3ZlcnJpZGVcbiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiAgICBmaW5hbCBpbnQgZHcg
PSAobnVsbCE9ZHJhd2FibGUpID8gZHJhd2FibGUuZ2V0V2lkdGgoKSA6IC0xO1xuICAgIGZpbmFs
IGludCBkaCA9IChudWxsIT1kcmF3YWJsZSkgPyBkcmF3YWJsZS5nZXRIZWlnaHQoKSA6IC0xO1xu
ICAgIFxuICAgIHJldHVybiBcIkFXVC1HTENhbnZhc1tSZWFsaXplZCBcIitpc1JlYWxpemVkKCkr
XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiLFxcblxcdFwiKygobnVsbCE9ZHJhd2FibGUp
P2RyYXdhYmxlLmdldENsYXNzKCkuZ2V0TmFtZSgpOlwibnVsbC1kcmF3YWJsZVwiKSsgICAgICAg
ICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiLFxcblxcdFJl
YWxpemVkIFwiK2lzUmVhbGl6ZWQoKStcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCIsXFxu
XFx0RmFjdG9yeSAgIFwiK2dldEZhY3RvcnkoKStcbiAgICAgICAgICAgICAgICAgICAgICAgICAg
XCIsXFxuXFx0aGFuZGxlICAgIDB4XCIrTG9uZy50b0hleFN0cmluZyhnZXRIYW5kbGUoKSkrXG4g
ICAgICAgICAgICAgICAgICAgICAgICAgIFwiLFxcblxcdERyYXdhYmxlIHNpemUgXCIrZHcrXCJ4
XCIrZGgrXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiLFxcblxcdEFXVCBwb3MgXCIrZ2V0
WCgpK1wiL1wiK2dldFkoKStcIiwgc2l6ZSBcIitnZXRXaWR0aCgpK1wieFwiK2dldEhlaWdodCgp
K1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIixcXG5cXHR2aXNpYmxlIFwiK2lzVmlzaWJs
ZSgpK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIixcXG5cXHRcIithd3RDb25maWcrXCJd
XCI7XG4gIH1cbiAgXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBJbnRlcm5hbHMgb25seSBiZWxv
dyB0aGlzIHBvaW50XG4gIC8vXG5cbiAgcHJpdmF0ZSB2b2lkIG1heWJlRG9TaW5nbGVUaHJlYWRl
ZFdvcmthcm91bmQoUnVubmFibGUgZXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbixcbiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVubmFibGUgaW52b2tlR0xB
Y3Rpb24pIHtcbiAgICBpZiAoVGhyZWFkaW5nLmlzU2luZ2xlVGhyZWFkZWQoKSAmJlxuICAgICAg
ICAhVGhyZWFkaW5nLmlzT3BlbkdMVGhyZWFkKCkpIHtcbiAgICAgIFRocmVhZGluZy5pbnZva2VP
bk9wZW5HTFRocmVhZChldmVudERpc3BhdGNoVGhyZWFkQWN0aW9uKTtcbiAgICB9IGVsc2Uge1xu
ICAgICAgZHJhd2FibGVIZWxwZXIuaW52b2tlR0woZHJhd2FibGUsIGNvbnRleHQsIGludm9rZUdM
QWN0aW9uLCBpbml0QWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBEaXNwb3NlQWN0aW9u
IGltcGxlbWVudHMgUnVubmFibGUge1xuICAgIHB1YmxpYyB2b2lkIHJ1bigpIHtcbiAgICAgIGRy
YXdhYmxlSGVscGVyLmRpc3Bvc2UoR0xDYW52YXMudGhpcyk7XG5cbiAgICAgIGlmKG51bGwhPWNv
bnRleHQpIHtcbiAgICAgICAgY29udGV4dC5tYWtlQ3VycmVudCgpOyAvLyBpbXBsaWNpdCB3YWl0
IGZvciBsb2NrIC4uXG4gICAgICAgIGNvbnRleHQuZGVzdHJveSgpO1xuICAgICAgICBjb250ZXh0
PW51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmKG51bGwhPWRyYXdhYmxlKSB7XG4gICAgICAgICAg
ZmluYWwgSkFXVFdpbmRvdyBqYXd0V2luZG93ID0gKEpBV1RXaW5kb3cpZHJhd2FibGUuZ2V0TmF0
aXZlU3VyZmFjZSgpO1xuICAgICAgICAgIGRyYXdhYmxlLnNldFJlYWxpemVkKGZhbHNlKTtcbiAg
ICAgICAgICBkcmF3YWJsZT1udWxsO1xuICAgICAgICAgIGlmKG51bGwhPWphd3RXaW5kb3cpIHtc
biAgICAgICAgICAgIGphd3RXaW5kb3cuZGVzdHJveSgpO1xuICAgICAgICAgIH0gICAgICAgICAg
XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmKGRpc3Bvc2VSZWdlbmVyYXRlKSB7XG4gICAgICAg
ICAgLy8gU2ltaWxhciBwcm9jZXNzIGFzIGluIGFkZE5vdGlmeSgpIVxuICAgICAgICAgIFxuICAg
ICAgICAgIC8vIFJlY3JlYXRlIEdMRHJhd2FibGUvR0xDb250ZXh0IHRvIHJlZmxlY3QgaXQncyBu
ZXcgZ3JhcGhpY3MgY29uZmlndXJhdGlvblxuICAgICAgICAgIGNyZWF0ZURyYXdhYmxlQW5kQ29u
dGV4dCgpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmKERFQlVHKSB7XG4gICAgICAgICAgICBT
eXN0ZW0uZXJyLnByaW50bG4oXCJHTENhbnZhcy5kaXNwb3NlKHRydWUpOiBuZXcgZHJhd2FibGU6
IFwiK2RyYXdhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsaWRhdGVHTERyYXdhYmxl
KCk7IC8vIGltbWVkaWF0ZSBhdHRlbXB0IHRvIHJlY3JlYXRlIHRoZSBkcmF3YWJsZVxuICAgICAg
fVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGJvb2xlYW4gZGlzcG9zZVJlZ2VuZXJhdGU7XG4gIHBy
aXZhdGUgRGlzcG9zZUFjdGlvbiBkaXNwb3NlQWN0aW9uID0gbmV3IERpc3Bvc2VBY3Rpb24oKTtc
blxuICBwcml2YXRlIERpc3Bvc2VPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rpb24gZGlzcG9zZU9u
RXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbiA9XG4gICAgbmV3IERpc3Bvc2VPbkV2ZW50RGlzcGF0
Y2hUaHJlYWRBY3Rpb24oKTtcblxuICBjbGFzcyBEaXNwb3NlT25FdmVudERpc3BhdGNoVGhyZWFk
QWN0aW9uIGltcGxlbWVudHMgUnVubmFibGUge1xuICAgIHB1YmxpYyB2b2lkIHJ1bigpIHtcbiAg
ICAgIGRyYXdhYmxlSGVscGVyLmludm9rZUdMKGRyYXdhYmxlLCBjb250ZXh0LCBkaXNwb3NlQWN0
aW9uLCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBEaXNwb3NlQWJzdHJhY3RHcmFwaGlj
c0RldmljZUFjdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHtcbiAgICBwdWJsaWMgdm9pZCBydW4o
KSB7XG4gICAgICBpZihudWxsICE9IGF3dENvbmZpZykge1xuICAgICAgICAgIGZpbmFsIEFic3Ry
YWN0R3JhcGhpY3NEZXZpY2UgYWRldmljZSA9IGF3dENvbmZpZy5nZXRTY3JlZW4oKS5nZXREZXZp
Y2UoKTtcbiAgICAgICAgICBmaW5hbCBTdHJpbmcgYWRldmljZU1zZztcbiAgICAgICAgICBpZihE
RUJVRykge1xuICAgICAgICAgICAgYWRldmljZU1zZyA9IGFkZXZpY2UudG9TdHJpbmcoKTtcbiAg
ICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRldmljZU1zZyA9IG51bGw7ICBcbiAgICAg
ICAgICB9XG4gICAgICAgICAgYm9vbGVhbiBjbG9zZWQgPSBhd3RDb25maWcuZ2V0U2NyZWVuKCku
Z2V0RGV2aWNlKCkuY2xvc2UoKTtcbiAgICAgICAgICBpZihERUJVRykge1xuICAgICAgICAgICAg
U3lzdGVtLmVyci5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgXCIg
LSBHTENhbnZhcy5kaXNwb3NlKGZhbHNlKTogY2xvc2VkIEdyYXBoaWNzRGV2aWNlOiBcIithZGV2
aWNlTXNnK1wiLCByZXN1bHQ6IFwiK2Nsb3NlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3
dENvbmZpZz1udWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIERpc3Bvc2VBYnN0
cmFjdEdyYXBoaWNzRGV2aWNlQWN0aW9uIGRpc3Bvc2VBYnN0cmFjdEdyYXBoaWNzRGV2aWNlQWN0
aW9uID0gbmV3IERpc3Bvc2VBYnN0cmFjdEdyYXBoaWNzRGV2aWNlQWN0aW9uKCk7XG5cbiAgLyoq
XG4gICAqIERpc3Bvc2VzIHRoZSBBYnN0cmFjdEdyYXBoaWNzRGV2aWNlIHdpdGhpbiBFRFQsXG4g
ICAqIHNpbmNlIHJlc291cmNlcyBjcmVhdGVkIChYMTE6IERpc3BsYXkpLCBtdXN0IGJlIGRlc3Ry
b3llZCBpbiB0aGUgc2FtZSB0aHJlYWQsIHdoZXJlIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQuXG4g
ICAqXG4gICAqIEBzZWUgI2Nob29zZUdyYXBoaWNzQ29uZmlndXJhdGlvbihqYXZheC5tZWRpYS5v
cGVuZ2wuR0xDYXBhYmlsaXRpZXNJbW11dGFibGUsIGphdmF4Lm1lZGlhLm9wZW5nbC5HTENhcGFi
aWxpdGllc0ltbXV0YWJsZSwgamF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJpbGl0aWVzQ2hvb3Nl
ciwgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2UpXG4gICAqL1xuICB2b2lkIGRpc3Bvc2VBYnN0cmFj
dEdyYXBoaWNzRGV2aWNlKCkgIHtcbiAgICBpZiggRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFk
KCkgfHwgVGhyZWFkLmhvbGRzTG9jayhnZXRUcmVlTG9jaygpKSApIHtcbiAgICAgICAgZGlzcG9z
ZUFic3RyYWN0R3JhcGhpY3NEZXZpY2VBY3Rpb24ucnVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAg
ICAgdHJ5IHtcbiAgICAgICAgICAgIEV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChkaXNwb3NlQWJz
dHJhY3RHcmFwaGljc0RldmljZUFjdGlvbik7XG4gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25U
YXJnZXRFeGNlcHRpb24gZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdMRXhjZXB0aW9uKGUu
Z2V0VGFyZ2V0RXhjZXB0aW9uKCkpO1xuICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2Vw
dGlvbiBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgR0xFeGNlcHRpb24oZSk7XG4gICAgICAg
IH1cbiAgICB9XG4gIH1cblxuICBjbGFzcyBJbml0QWN0aW9uIGltcGxlbWVudHMgUnVubmFibGUg
e1xuICAgIHB1YmxpYyB2b2lkIHJ1bigpIHtcbiAgICAgIGRyYXdhYmxlSGVscGVyLmluaXQoR0xD
YW52YXMudGhpcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgSW5pdEFjdGlvbiBpbml0QWN0aW9u
ID0gbmV3IEluaXRBY3Rpb24oKTtcbiAgXG4gIGNsYXNzIERpc3BsYXlBY3Rpb24gaW1wbGVtZW50
cyBSdW5uYWJsZSB7XG4gICAgcHVibGljIHZvaWQgcnVuKCkge1xuICAgICAgaWYgKHNlbmRSZXNo
YXBlKSB7XG4gICAgICAgIGlmKERFQlVHKSB7XG4gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50
bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkrXCIgLSByZXNoYXBlOiBcIitnZXRX
aWR0aCgpK1wieFwiK2dldEhlaWdodCgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiB3
ZSBpZ25vcmUgdGhlIGdpdmVuIHggYW5kIHkgd2l0aGluIHRoZSBwYXJlbnQgY29tcG9uZW50XG4g
ICAgICAgIC8vIHNpbmNlIHdlIGFyZSBkcmF3aW5nIGRpcmVjdGx5IGludG8gdGhpcyBoZWF2eXdl
aWdodCBjb21wb25lbnQuXG4gICAgICAgIGRyYXdhYmxlSGVscGVyLnJlc2hhcGUoR0xDYW52YXMu
dGhpcywgMCwgMCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpO1xuICAgICAgICBzZW5kUmVzaGFw
ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBkcmF3YWJsZUhlbHBlci5kaXNwbGF5KEdMQ2Fu
dmFzLnRoaXMpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIERpc3BsYXlBY3Rpb24gZGlzcGxheUFj
dGlvbiA9IG5ldyBEaXNwbGF5QWN0aW9uKCk7XG5cbiAgY2xhc3MgU3dhcEJ1ZmZlcnNBY3Rpb24g
aW1wbGVtZW50cyBSdW5uYWJsZSB7XG4gICAgcHVibGljIHZvaWQgcnVuKCkge1xuICAgICAgZHJh
d2FibGUuc3dhcEJ1ZmZlcnMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBTd2FwQnVmZmVyc0Fj
dGlvbiBzd2FwQnVmZmVyc0FjdGlvbiA9IG5ldyBTd2FwQnVmZmVyc0FjdGlvbigpO1xuXG4gIC8v
IFdvcmthcm91bmQgZm9yIEFUSSBkcml2ZXIgYnVncyByZWxhdGVkIHRvIG11bHRpdGhyZWFkaW5n
IGlzc3Vlc1xuICAvLyBsaWtlIHNpbXVsdGFuZW91cyByZW5kZXJpbmcgdmlhIEFuaW1hdG9ycyB0
byBjYW52YXNlcyB0aGF0IGFyZVxuICAvLyBiZWluZyByZXNpemVkIG9uIHRoZSBBV1QgZXZlbnQg
ZGlzcGF0Y2ggdGhyZWFkXG4gIGNsYXNzIERpc3BsYXlPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rp
b24gaW1wbGVtZW50cyBSdW5uYWJsZSB7XG4gICAgcHVibGljIHZvaWQgcnVuKCkge1xuICAgICAg
ZHJhd2FibGVIZWxwZXIuaW52b2tlR0woZHJhd2FibGUsIGNvbnRleHQsIGRpc3BsYXlBY3Rpb24s
IGluaXRBY3Rpb24pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIERpc3BsYXlPbkV2ZW50RGlzcGF0
Y2hUaHJlYWRBY3Rpb24gZGlzcGxheU9uRXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbiA9XG4gICAg
bmV3IERpc3BsYXlPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rpb24oKTtcbiAgY2xhc3MgU3dhcEJ1
ZmZlcnNPbkV2ZW50RGlzcGF0Y2hUaHJlYWRBY3Rpb24gaW1wbGVtZW50cyBSdW5uYWJsZSB7XG4g
ICAgcHVibGljIHZvaWQgcnVuKCkge1xuICAgICAgZHJhd2FibGVIZWxwZXIuaW52b2tlR0woZHJh
d2FibGUsIGNvbnRleHQsIHN3YXBCdWZmZXJzQWN0aW9uLCBpbml0QWN0aW9uKTtcbiAgICB9XG4g
IH1cbiAgcHJpdmF0ZSBTd2FwQnVmZmVyc09uRXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbiBzd2Fw
QnVmZmVyc09uRXZlbnREaXNwYXRjaFRocmVhZEFjdGlvbiA9XG4gICAgbmV3IFN3YXBCdWZmZXJz
T25FdmVudERpc3BhdGNoVGhyZWFkQWN0aW9uKCk7XG5cbiAgLy8gRGlzYWJsZXMgdGhlIEFXVCdz
IGVyYXNpbmcgb2YgdGhpcyBDYW52YXMncyBiYWNrZ3JvdW5kIG9uIFdpbmRvd3NcbiAgLy8gaW4g
SmF2YSBTRSA2LiBUaGlzIGludGVybmFsIEFQSSBpcyBub3QgYXZhaWxhYmxlIGluIHByZXZpb3Vz
XG4gIC8vIHJlbGVhc2VzLCBidXQgdGhlIHN5c3RlbSBwcm9wZXJ0eVxuICAvLyAtRHN1bi5hd3Qu
bm9lcmFzZWJhY2tncm91bmQ9dHJ1ZSBjYW4gYmUgc3BlY2lmaWVkIHRvIGdldCBzaW1pbGFyXG4g
IC8vIHJlc3VsdHMgZ2xvYmFsbHkgaW4gcHJldmlvdXMgcmVsZWFzZXMuXG4gIHByaXZhdGUgc3Rh
dGljIGJvb2xlYW4gZGlzYWJsZUJhY2tncm91bmRFcmFzZUluaXRpYWxpemVkO1xuICBwcml2YXRl
IHN0YXRpYyBNZXRob2QgIGRpc2FibGVCYWNrZ3JvdW5kRXJhc2VNZXRob2Q7XG4gIHByaXZhdGUg
dm9pZCBkaXNhYmxlQmFja2dyb3VuZEVyYXNlKCkge1xuICAgIGlmICghZGlzYWJsZUJhY2tncm91
bmRFcmFzZUluaXRpYWxpemVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBBY2Nlc3NDb250cm9s
bGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxPYmplY3Q+KCkge1xuICAgICAg
ICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAg
ICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBnZXRUb29sa2l0KCkuZ2V0Q2xhc3MoKTtcbiAgICAg
ICAgICAgICAgICB3aGlsZSAoY2xhenogIT0gbnVsbCAmJiBkaXNhYmxlQmFja2dyb3VuZEVyYXNl
TWV0aG9kID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAg
ICAgICAgIGRpc2FibGVCYWNrZ3JvdW5kRXJhc2VNZXRob2QgPVxuICAgICAgICAgICAgICAgICAg
ICAgIGNsYXp6LmdldERlY2xhcmVkTWV0aG9kKFwiZGlzYWJsZUJhY2tncm91bmRFcmFzZVwiLFxu
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1td
IHsgQ2FudmFzLmNsYXNzIH0pO1xuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQmFja2dyb3Vu
ZEVyYXNlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICB9IGNh
dGNoIChFeGNlcHRpb24gZSkge1xuICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IGNsYXp6Lmdl
dFN1cGVyY2xhc3MoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4g
ICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7XG4gICAgICAgICAgICAgIH1cbiAg
ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4g
ICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge1xuICAgICAgfVxuICAgICAgZGlzYWJsZUJhY2tn
cm91bmRFcmFzZUluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIGlmKERFQlVHKSB7XG4gICAgICAg
IFN5c3RlbS5lcnIucHJpbnRsbihcIkdMQ2FudmFzOiBUSyBkaXNhYmxlQmFja2dyb3VuZEVyYXNl
IG1ldGhvZCBmb3VuZDogXCIrXG4gICAgICAgICAgICAgICAgKG51bGwhPWRpc2FibGVCYWNrZ3Jv
dW5kRXJhc2VNZXRob2QpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRpc2FibGVCYWNrZ3Jv
dW5kRXJhc2VNZXRob2QgIT0gbnVsbCkge1xuICAgICAgVGhyb3dhYmxlIHQ9bnVsbDtcbiAgICAg
IHRyeSB7XG4gICAgICAgIGRpc2FibGVCYWNrZ3JvdW5kRXJhc2VNZXRob2QuaW52b2tlKGdldFRv
b2xraXQoKSwgbmV3IE9iamVjdFtdIHsgdGhpcyB9KTtcbiAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlv
biBlKSB7XG4gICAgICAgIHQgPSBlO1xuICAgICAgfVxuICAgICAgaWYoREVCVUcpIHtcbiAgICAg
ICAgU3lzdGVtLmVyci5wcmludGxuKFwiR0xDYW52YXM6IFRLIGRpc2FibGVCYWNrZ3JvdW5kRXJh
c2UgZXJyb3I6IFwiK3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1
ZXMgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbkZhY3RvcnkncyBjaG9vc2luZyBmYWNpbGl0eSB3
aXRoaW4gRURULFxuICAgKiBzaW5jZSByZXNvdXJjZXMgY3JlYXRlZCAoWDExOiBEaXNwbGF5KSwg
bXVzdCBiZSBkZXN0cm95ZWQgaW4gdGhlIHNhbWUgdGhyZWFkLCB3aGVyZSB0aGV5IGhhdmUgYmVl
biBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2Fwc0Nob3NlblxuICAgKiBAcGFyYW0gY2Fw
c1JlcXVlc3RlZFxuICAgKiBAcGFyYW0gY2hvb3NlclxuICAgKiBAcGFyYW0gZGV2aWNlXG4gICAq
IEByZXR1cm4gdGhlIGNob3NlbiBBV1RHcmFwaGljc0NvbmZpZ3VyYXRpb25cbiAgICpcbiAgICog
QHNlZSAjZGlzcG9zZUFic3RyYWN0R3JhcGhpY3NEZXZpY2UoKVxuICAgKi9cbiAgcHJpdmF0ZSBB
V1RHcmFwaGljc0NvbmZpZ3VyYXRpb24gY2hvb3NlR3JhcGhpY3NDb25maWd1cmF0aW9uKGZpbmFs
IEdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlIGNhcHNDaG9zZW4sXG4gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBHTENhcGFi
aWxpdGllc0ltbXV0YWJsZSBjYXBzUmVxdWVzdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgR0xDYXBhYmlsaXRp
ZXNDaG9vc2VyIGNob29zZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBHcmFwaGljc0RldmljZSBkZXZpY2UpIHtc
biAgICAvLyBNYWtlIEdMQ2FudmFzIGJlaGF2ZSBiZXR0ZXIgaW4gTmV0QmVhbnMgR1VJIGJ1aWxk
ZXJcbiAgICBpZiAoQmVhbnMuaXNEZXNpZ25UaW1lKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xu
ICAgIH1cblxuICAgIGZpbmFsIEFic3RyYWN0R3JhcGhpY3NTY3JlZW4gYVNjcmVlbiA9IG51bGwg
IT0gZGV2aWNlID8gXG4gICAgICAgICAgICBBV1RHcmFwaGljc1NjcmVlbi5jcmVhdGVTY3JlZW5E
ZXZpY2UoZGV2aWNlLCBBYnN0cmFjdEdyYXBoaWNzRGV2aWNlLkRFRkFVTFRfVU5JVCk6XG4gICAg
ICAgICAgICBBV1RHcmFwaGljc1NjcmVlbi5jcmVhdGVEZWZhdWx0KCk7XG4gICAgQVdUR3JhcGhp
Y3NDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7XG5cbiAgICBpZiggRXZlbnRRdWV1ZS5pc0Rp
c3BhdGNoVGhyZWFkKCkgfHwgVGhyZWFkLmhvbGRzTG9jayhnZXRUcmVlTG9jaygpKSApIHtcbiAg
ICAgICAgY29uZmlnID0gKEFXVEdyYXBoaWNzQ29uZmlndXJhdGlvbilcbiAgICAgICAgICAgICAg
ICBHcmFwaGljc0NvbmZpZ3VyYXRpb25GYWN0b3J5LmdldEZhY3RvcnkoQVdUR3JhcGhpY3NEZXZp
Y2UuY2xhc3MpLmNob29zZUdyYXBoaWNzQ29uZmlndXJhdGlvbihjYXBzQ2hvc2VuLFxuICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHNSZXF1ZXN0
ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2hvb3NlciwgYVNjcmVlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAg
ICAgIGZpbmFsIEFycmF5TGlzdDxBV1RHcmFwaGljc0NvbmZpZ3VyYXRpb24+IGJ1Y2tldCA9IG5l
dyBBcnJheUxpc3Q8QVdUR3JhcGhpY3NDb25maWd1cmF0aW9uPigxKTtcbiAgICAgICAgICAgIEV2
ZW50UXVldWUuaW52b2tlQW5kV2FpdChuZXcgUnVubmFibGUoKSB7XG4gICAgICAgICAgICAgICAg
cHVibGljIHZvaWQgcnVuKCkge1xuICAgICAgICAgICAgICAgICAgICBBV1RHcmFwaGljc0NvbmZp
Z3VyYXRpb24gYyA9IChBV1RHcmFwaGljc0NvbmZpZ3VyYXRpb24pXG4gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgR3JhcGhpY3NDb25maWd1cmF0aW9uRmFjdG9yeS5nZXRGYWN0b3J5KEFXVEdy
YXBoaWNzRGV2aWNlLmNsYXNzKS5jaG9vc2VHcmFwaGljc0NvbmZpZ3VyYXRpb24oY2Fwc0Nob3Nl
bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjYXBzUmVxdWVzdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZXIsIGFTY3JlZW4pO1xuICAg
ICAgICAgICAgICAgICAgICBidWNrZXQuYWRkKGMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAg
ICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnID0gKCBidWNrZXQuc2l6ZSgpID4gMCApID8g
YnVja2V0LmdldCgwKSA6IG51bGwgO1xuICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0
RXhjZXB0aW9uIGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBHTEV4Y2VwdGlvbihlLmdldFRh
cmdldEV4Y2VwdGlvbigpKTtcbiAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24g
ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdMRXhjZXB0aW9uKGUpO1xuICAgICAgICB9XG4g
ICAgfVxuXG4gICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgR0xFeGNl
cHRpb24oXCJFcnJvcjogQ291bGRuJ3QgZmV0Y2ggQVdUR3JhcGhpY3NDb25maWd1cmF0aW9uXCIp
O1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBBIG1v
c3Qgc2ltcGxlIEpPR0wgQVdUIHRlc3QgZW50cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdm9p
ZCBtYWluKFN0cmluZyBhcmdzW10pIHtcbiAgICBTeXN0ZW0uZXJyLnByaW50bG4oVmVyc2lvblV0
aWwuZ2V0UGxhdGZvcm1JbmZvKCkpO1xuICAgIFN5c3RlbS5lcnIucHJpbnRsbihHbHVlR2VuVmVy
c2lvbi5nZXRJbnN0YW5jZSgpKTtcbiAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oTmF0aXZlV2lu
ZG93VmVyc2lvbi5nZXRJbnN0YW5jZSgpKTtcbiAgICBTeXN0ZW0uZXJyLnByaW50bG4oSm9nbFZl
cnNpb24uZ2V0SW5zdGFuY2UoKSk7XG5cbiAgICBHTERyYXdhYmxlRmFjdG9yeSBmYWN0b3J5ID0g
R0xEcmF3YWJsZUZhY3RvcnkuZ2V0RGVza3RvcEZhY3RvcnkoKTtcbiAgICBMaXN0PEdMQ2FwYWJp
bGl0aWVzSW1tdXRhYmxlPiBhdmFpbENhcHMgPSBmYWN0b3J5LmdldEF2YWlsYWJsZUNhcGFiaWxp
dGllcyhudWxsKTtcbiAgICBmb3IoaW50IGk9MDsgaTxhdmFpbENhcHMuc2l6ZSgpOyBpKyspIHtc
biAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGF2YWlsQ2Fwcy5nZXQoaSkpO1xuICAgIH1cblxu
ICAgIEdMQ2FwYWJpbGl0aWVzSW1tdXRhYmxlIGNhcHMgPSBuZXcgR0xDYXBhYmlsaXRpZXMoIEdM
UHJvZmlsZS5nZXREZWZhdWx0KEdMUHJvZmlsZS5nZXREZWZhdWx0RGVza3RvcERldmljZSgpKSAp
O1xuICAgIEZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKFwiSk9HTCBBV1QgVGVzdFwiKTtcblxuICAg
IEdMQ2FudmFzIGdsQ2FudmFzID0gbmV3IEdMQ2FudmFzKGNhcHMpO1xuICAgIGZyYW1lLmFkZChn
bENhbnZhcyk7XG4gICAgZnJhbWUuc2V0U2l6ZSgxMjgsIDEyOCk7XG5cbiAgICBnbENhbnZhcy5h
ZGRHTEV2ZW50TGlzdGVuZXIobmV3IEdMRXZlbnRMaXN0ZW5lcigpIHtcbiAgICAgICAgcHVibGlj
IHZvaWQgaW5pdChHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkge1xuICAgICAgICAgICAgR0wgZ2wg
PSBkcmF3YWJsZS5nZXRHTCgpO1xuICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKEpvZ2xW
ZXJzaW9uLmdldEdMSW5mbyhnbCwgbnVsbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGlj
IHZvaWQgcmVzaGFwZShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSwgaW50IHgsIGludCB5LCBpbnQg
d2lkdGgsIGludCBoZWlnaHQpIHtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyB2b2lkIGRp
c3BsYXkoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUpIHtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1
YmxpYyB2b2lkIGRpc3Bvc2UoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUpIHtcbiAgICAgICAgfVxu
ICAgIH0pO1xuXG4gICAgZmluYWwgRnJhbWUgX2ZyYW1lID0gZnJhbWU7XG4gICAgZmluYWwgR0xD
YW52YXMgX2dsQ2FudmFzID0gZ2xDYW52YXM7XG5cbiAgICB0cnkge1xuICAgICAgICBqYXZheC5z
d2luZy5Td2luZ1V0aWxpdGllcy5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHtcbiAgICAg
ICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHtcbiAgICAgICAgICAgICAgICBfZnJhbWUuc2V0Vmlz
aWJsZSh0cnVlKTtcbiAgICAgICAgICAgIH19KTtcbiAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkg
e1xuICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpO1xuICAgIH1cbiAgICBnbENhbnZhcy5kaXNw
bGF5KCk7XG4gICAgdHJ5IHtcbiAgICAgICAgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXMuaW52
b2tlQW5kV2FpdChuZXcgUnVubmFibGUoKSB7XG4gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4o
KSB7XG4gICAgICAgICAgICAgICAgX2ZyYW1lLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICAg
ICAgICAgIF9mcmFtZS5yZW1vdmUoX2dsQ2FudmFzKTtcbiAgICAgICAgICAgICAgICBfZnJhbWUu
ZGlzcG9zZSgpO1xuICAgICAgICAgICAgfX0pO1xuICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7
XG4gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7XG4gICAgfVxuICB9XG5cbn1cbgo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSAuLi8uLi9BcHBsaWNhdGlvbnMvSk9HTEdJVC9qb2dsL3NyYy9qb2dsL2NsYXNzZXMv
amF2YXgvbWVkaWEvb3BlbmdsL2F3dC9HTENhbnZhcy5qYXZhCShkYXRlIDEzMjQyNjI2MzYwMDAp
CisrKyAuLi8uLi9BcHBsaWNhdGlvbnMvSk9HTEdJVC9qb2dsL3NyYy9qb2dsL2NsYXNzZXMvamF2
YXgvbWVkaWEvb3BlbmdsL2F3dC9HTENhbnZhcy5qYXZhCShyZXZpc2lvbiApCkBAIC04ODAsMTgg
Kzg4MCwyNSBAQAogICBjbGFzcyBEaXNwb3NlQWJzdHJhY3RHcmFwaGljc0RldmljZUFjdGlvbiBp
bXBsZW1lbnRzIFJ1bm5hYmxlIHsKICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICBpZihu
dWxsICE9IGF3dENvbmZpZykgewotICAgICAgICAgIGZpbmFsIEFic3RyYWN0R3JhcGhpY3NEZXZp
Y2UgYWRldmljZSA9IGF3dENvbmZpZy5nZXRTY3JlZW4oKS5nZXREZXZpY2UoKTsKKyAgICAgICAg
ZmluYWwgQWJzdHJhY3RHcmFwaGljc0RldmljZSBhZGV2aWNlID0gYXd0Q29uZmlnLmdldFNjcmVl
bigpLmdldERldmljZSgpOworICAgICAgICBmaW5hbCBBYnN0cmFjdEdyYXBoaWNzRGV2aWNlIGFO
YXRpdmVEZXZpY2UgPSBhd3RDb25maWcuZ2V0TmF0aXZlR3JhcGhpY3NDb25maWd1cmF0aW9uKCku
Z2V0U2NyZWVuKCkuZ2V0RGV2aWNlKCk7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIGFkZXZpY2VN
c2c7CisgICAgICAgIGZpbmFsIFN0cmluZyBhZGV2aWNlTXNnOworICAgICAgICBmaW5hbCBTdHJp
bmcgYU5hdGl2ZURldmljZU1TRzsKLSAgICAgICAgICBpZihERUJVRykgewotICAgICAgICAgICAg
YWRldmljZU1zZyA9IGFkZXZpY2UudG9TdHJpbmcoKTsKKyAgICAgICAgaWYoREVCVUcpIHsKKyAg
ICAgICAgICBhZGV2aWNlTXNnID0gYWRldmljZS50b1N0cmluZygpOworICAgICAgICAgIGFOYXRp
dmVEZXZpY2VNU0cgPSBhTmF0aXZlRGV2aWNlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgIGFkZXZpY2VNc2cgPSBudWxsOyAgCisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgYWRldmljZU1zZyA9IG51bGw7CisgICAgICAgICAgYU5hdGl2ZURldmljZU1TRyA9
IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJvb2xlYW4gY2xvc2VkID0gYXd0Q29uZmln
LmdldFNjcmVlbigpLmdldERldmljZSgpLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgYm9v
bGVhbiBjbG9zZWQgPSBhd3RDb25maWcuZ2V0U2NyZWVuKCkuZ2V0RGV2aWNlKCkuY2xvc2UoKTsK
KyAgICAgICAgLy9BbHNvIGNsb3NlIG5hdGl2ZSBncmFwaGljcyBjb25maWd1cmF0aW9uLCB3aGlj
aCBzZWVtcyB0byBiZSBpbXBvcnRhbnQgZm9yIFgxMQorICAgICAgICBib29sZWFuIG5hdGl2ZUNs
b3NlZCA9IGF3dENvbmZpZy5nZXROYXRpdmVHcmFwaGljc0NvbmZpZ3VyYXRpb24oKS5nZXRTY3Jl
ZW4oKS5nZXREZXZpY2UoKS5jbG9zZSgpOwotICAgICAgICAgIGlmKERFQlVHKSB7Ci0gICAgICAg
ICAgICBTeXN0ZW0uZXJyLnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkg
KyAiIC0gR0xDYW52YXMuZGlzcG9zZShmYWxzZSk6IGNsb3NlZCBHcmFwaGljc0RldmljZTogIith
ZGV2aWNlTXNnKyIsIHJlc3VsdDogIitjbG9zZWQpOworICAgICAgICBpZihERUJVRykgeworICAg
ICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUo
KSArICIgLSBHTENhbnZhcy5kaXNwb3NlKGZhbHNlKTogY2xvc2VkIEdyYXBoaWNzRGV2aWNlOiAi
K2FkZXZpY2VNc2crIiwgcmVzdWx0OiAiK2Nsb3NlZCk7CisgICAgICAgICAgU3lzdGVtLmVyci5w
cmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgIiAtIEdMQ2FudmFzLmRp
c3Bvc2UoZmFsc2UpOiBjbG9zZWQgR3JhcGhpY3NEZXZpY2U6ICIrYU5hdGl2ZURldmljZU1TRysi
LCByZXN1bHQ6ICIrbmF0aXZlQ2xvc2VkKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXd0Q29u
ZmlnPW51bGw7CisgICAgICAgIH0KKyAgICAgICAgYXd0Q29uZmlnPW51bGw7CiAgICAgICB9CiAg
ICAgfQogICB9Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>