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

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>62034</bug_id>
          
          <creation_ts>2011-06-03 11:50:32 -0700</creation_ts>
          <short_desc>[EFL] DRT: Add DumpRenderTree.cpp</short_desc>
          <delta_ts>2011-10-04 11:14:45 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>62877</dependson>
    
    <dependson>63086</dependson>
    
    <dependson>63989</dependson>
    
    <dependson>63992</dependson>
    
    <dependson>63993</dependson>
    
    <dependson>67114</dependson>
          <blocked>61962</blocked>
    
    <blocked>61974</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Leandro Pereira">leandro</reporter>
          <assigned_to name="Leandro Pereira">leandro</assigned_to>
          <cc>donggwan.kim</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>kenneth</cc>
    
    <cc>rakuco</cc>
    
    <cc>rniwa</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>415050</commentid>
    <comment_count>0</comment_count>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-03 11:50:32 -0700</bug_when>
    <thetext>[EFL] DRT: Add DumpRenderTree.cpp and DumpRenderTreeEfl.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>415055</commentid>
    <comment_count>1</comment_count>
      <attachid>95940</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-03 11:53:55 -0700</bug_when>
    <thetext>Created attachment 95940
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>418835</commentid>
    <comment_count>2</comment_count>
      <attachid>95940</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-10 12:19:42 -0700</bug_when>
    <thetext>Comment on attachment 95940
Patch

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

I would encourage you to go one more round on this patch and clean up what you can.  There will be many people who touch your DRT implementation over the years, and it&apos;s importnat to make it as readable/hackable as possible.

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:106
&gt; +            free(result);

Do we have to use manual free here?  No smart-pointers?  Other ports either use WTF and C++ objects, or their own custom smart-pointers which are shared between WebKit implementations and DRT, like GOwnPtr (gtk) or RetainPtr (mac).

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:124
&gt; +static int compareHistoryItems(const void* item1, const void* item2)

Should all this history/backfoward stuff be in a separate file?

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:210
&gt; +void dumpBackForwardListForAllWebViews(void)

Is the (void) needed/desired here?

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:282
&gt; +        if (!result) {
&gt; +            const char* errorMessage;
&gt; +            if (gLayoutTestController-&gt;dumpAsText())
&gt; +                errorMessage = &quot;[documentelement innerText]&quot;;
&gt; +            else if (gLayoutTestController-&gt;dumpDOMAsWebArchive())
&gt; +                errorMessage = &quot;[[mainFrame DOMDocument] webArchive]&quot;;
&gt; +            else if (gLayoutTestController-&gt;dumpSourceAsWebArchive())
&gt; +                errorMessage = &quot;[[mainFrame dataSource] webArchive]&quot;;
&gt; +            else
&gt; +                errorMessage = &quot;[mainFrame renderTreeAsExternalRepresentation]&quot;;
&gt; +            printf(&quot;ERROR: nil result from %s&quot;, errorMessage);

This is a huge hack which should probably be shared between more ports.  Do we acxtually have these error messages in the results?  Can we at least move this logic into a separate function for possible future sharing?

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:478
&gt; +static void initializeFonts(void)

I wonder if more of this could be shared between various linux ports of DRT.

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:539
&gt; +        snprintf(fontPath, PATH_MAX - 1, FONTS_CONF_DIR &quot;/../../fonts/WebKitWeightWatcher%i00.ttf&quot;, i);

Do you really want a relative path here?

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:704
&gt; +    evas_object_smart_callback_add(browser, &quot;load,started&quot;, onLoadStarted, 0);
&gt; +    evas_object_smart_callback_add(browser, &quot;load,finished&quot;, onLoadFinished, 0);
&gt; +    evas_object_smart_callback_add(browser, &quot;title,changed&quot;, onTitleChanged, 0);
&gt; +    evas_object_smart_callback_add(browser, &quot;window,object,cleared&quot;, onWindowObjectCleared, 0);
&gt; +    evas_object_smart_callback_add(browser, &quot;statusbar,text,set&quot;, onStatusbarTextSet, 0);

Could we put all of these callbacks on a C++ object (even though we&apos;re passing them as C function pointers?)  Seems some way of keeping all these callbacks together would be useful for readability of this file.

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:711
&gt; +    evas_object_move(browser, 0, 0);
&gt; +    evas_object_resize(browser, WIDTH, HEIGHT);
&gt; +
&gt; +    evas_object_layer_set(browser, EVAS_LAYER_MAX);
&gt; +    evas_object_show(browser);
&gt; +    ecore_evas_show(ee);

I would probably have split a bunch of this main function out into separate setup functions.

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:738
&gt; +shutdown:
&gt; +    if (gcController) {
&gt; +        delete gcController;
&gt; +        gcController = 0;
&gt; +    }
&gt; +    if (ee)

I don&apos;t think we need to worry about freeing memory before termination.  Unless you&apos;re trying to catch leaks this way?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424565</commentid>
    <comment_count>3</comment_count>
      <attachid>98012</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-21 11:01:25 -0700</bug_when>
    <thetext>Created attachment 98012
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424666</commentid>
    <comment_count>4</comment_count>
      <attachid>98042</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-21 12:25:21 -0700</bug_when>
    <thetext>Created attachment 98042
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424698</commentid>
    <comment_count>5</comment_count>
      <attachid>98048</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-21 13:19:35 -0700</bug_when>
    <thetext>Created attachment 98048
Same patch with one small bug fix.

Fix one small linebreak issue in the code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424701</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-21 13:22:14 -0700</bug_when>
    <thetext>Attachment 98048 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;]&quot; exit_code: 1

Total errors found: 0 in 0 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>425207</commentid>
    <comment_count>7</comment_count>
      <attachid>98167</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-22 07:27:09 -0700</bug_when>
    <thetext>Created attachment 98167
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>425208</commentid>
    <comment_count>8</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-22 07:27:38 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Created an attachment (id=98167) [details]
&gt; Patch

This is the same patch, now trying to please the bots.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427927</commentid>
    <comment_count>9</comment_count>
      <attachid>98723</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-27 07:46:04 -0700</bug_when>
    <thetext>Created attachment 98723
New patch with the missing DumpHistoryItem</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427939</commentid>
    <comment_count>10</comment_count>
      <attachid>98727</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-27 08:00:19 -0700</bug_when>
    <thetext>Created attachment 98727
Replace WTF::String with String, improve the ChangeLog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432753</commentid>
    <comment_count>11</comment_count>
      <attachid>99827</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-07-06 06:46:59 -0700</bug_when>
    <thetext>Created attachment 99827
New patch containing only DumpRenderTree.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432754</commentid>
    <comment_count>12</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-07-06 06:47:50 -0700</bug_when>
    <thetext>OK, the patch now contains only DumpRenderTree.cpp to make it easier to review. The other files have been moved to separate bug reports.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>437148</commentid>
    <comment_count>13</comment_count>
      <attachid>100819</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-07-14 10:01:20 -0700</bug_when>
    <thetext>Created attachment 100819
Fix up getFinalTestURL() to return URL scheme even if URL contains a pixel test hash</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>454005</commentid>
    <comment_count>14</comment_count>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-08-19 13:04:50 -0700</bug_when>
    <thetext>*** Bug 66405 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>454006</commentid>
    <comment_count>15</comment_count>
      <attachid>104549</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-08-19 13:06:28 -0700</bug_when>
    <thetext>Created attachment 104549
Updated DumpRenderTree.cpp.

EFL-specific DumpRenderTree.h isn&apos;t needed anymore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>465868</commentid>
    <comment_count>16</comment_count>
      <attachid>104549</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-09-12 15:46:17 -0700</bug_when>
    <thetext>Comment on attachment 104549
Updated DumpRenderTree.cpp.

Why are all these methods static? WebKit is a C++ project and mostly API are tolerated to be in C. Could you use a class for this like most other ports?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>465983</commentid>
    <comment_count>17</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-09-12 17:15:13 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; (From update of attachment 104549 [details])
&gt; Why are all these methods static? WebKit is a C++ project and mostly API are tolerated to be in C. Could you use a class for this like most other ports?

Mostly because we&apos;d just have a class with a lot of static methods with no apparent benefit -- the majority of the functions don&apos;t share data (the code which does is already in classes). In fact, we&apos;re following what GTK+&apos;s DRT code does, and also what Qt&apos;s DumpRenderTreeQt.cpp does (to some extent).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>469503</commentid>
    <comment_count>18</comment_count>
      <attachid>107881</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-09-19 10:43:17 -0700</bug_when>
    <thetext>Created attachment 107881
Minor changes, depend on bug 67114</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477143</commentid>
    <comment_count>19</comment_count>
      <attachid>109507</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-10-03 12:25:08 -0700</bug_when>
    <thetext>Created attachment 109507
Fix a few bugs, rebase on top of trunk</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477144</commentid>
    <comment_count>20</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-10-03 12:25:55 -0700</bug_when>
    <thetext>CC&apos;ing reviewers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477610</commentid>
    <comment_count>21</comment_count>
      <attachid>109507</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2011-10-04 08:15:12 -0700</bug_when>
    <thetext>Comment on attachment 109507
Fix a few bugs, rebase on top of trunk

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

I know you guys have been working hard to get this in, so I wont hold it to fix typos.

Congrats!

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:39
&gt; +#include &quot;ewk_private.h&quot; // FIXME: create some WebCoreSupport/DumpRenderTree.cpp instead

it could be called DumpRenderTreeSupportEFL :)

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:162
&gt; +    int option;
&gt; +
&gt; +    while ((option = getopt_long(argc, (char* const*)argv, &quot;&quot;, options, 0)) != -1) {

I would add a new line before &quot;int option&quot; the drop the one below it.

&gt; Tools/DumpRenderTree/efl/DumpRenderTree.cpp:174
&gt; +}
&gt; +
&gt; +
&gt; +static String getFinalTestURL(const String&amp; testURL)

drop one line</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477637</commentid>
    <comment_count>22</comment_count>
      <attachid>109631</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-10-04 09:22:25 -0700</bug_when>
    <thetext>Created attachment 109631
Fix the issues pointed out by tonikitoo</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477638</commentid>
    <comment_count>23</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-10-04 09:23:18 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; (From update of attachment 109507 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=109507&amp;action=review
&gt; 
&gt; I know you guys have been working hard to get this in, so I wont hold it to fix typos.

Thanks a lot, your help with all these patches we have been sending is very much appreciated :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477772</commentid>
    <comment_count>24</comment_count>
      <attachid>109631</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-04 11:14:38 -0700</bug_when>
    <thetext>Comment on attachment 109631
Fix the issues pointed out by tonikitoo

Clearing flags on attachment: 109631

Committed r96618: &lt;http://trac.webkit.org/changeset/96618&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477774</commentid>
    <comment_count>25</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-04 11:14:45 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>95940</attachid>
            <date>2011-06-03 11:53:55 -0700</date>
            <delta_ts>2011-06-21 12:26:09 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-62034-20110603155353.patch</filename>
            <type>text/plain</type>
            <size>29638</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDg4MDM0KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsNDYgQEAKKzIwMTEtMDYtMDMgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9u
Lm1vYmk+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W0VGTF0gRFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwIGFuZCBEdW1wUmVuZGVyVHJlZUVmbC5o
CisgICAgICAgIEJ1aWxkIHN5c3RlbSBjaGFuZ2VzIHdpbGwgYmUgdXBzdHJlYW1lZCBhcyBzb29u
IGFzIG90aGVyIERSVC1yZWxhdGVkCisgICAgICAgIGZpbGVzIGFyZSBhbHNvIG9uIHRoZSB0cmVl
LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIwMzQK
KworICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2VmbDogQWRkZWQuCisgICAgICAgICogRHVtcFJl
bmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcDogQWRkZWQuCisgICAgICAgIChkaXNwbGF5
V2ViVmlldyk6CisgICAgICAgIChkdW1wRnJhbWVzQXNUZXh0KToKKyAgICAgICAgKGR1bXBGcmFt
ZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKGNvbXBhcmVIaXN0b3J5SXRlbXMpOgorICAgICAg
ICAoZHVtcEhpc3RvcnlJdGVtKToKKyAgICAgICAgKGR1bXBCYWNrRm9yd2FyZExpc3RGb3JXZWJW
aWV3KToKKyAgICAgICAgKGR1bXBCYWNrRm9yd2FyZExpc3RGb3JBbGxXZWJWaWV3cyk6CisgICAg
ICAgIChzaG91bGRMb2dGcmFtZUxvYWREZWxlZ2F0ZXMpOgorICAgICAgICAoc2hvdWxkRW5hYmxl
RGV2ZWxvcGVyRXh0cmFzKToKKyAgICAgICAgKHNob3VsZER1bXBBc1RleHQpOgorICAgICAgICAo
c2VuZFBpeGVsUmVzdWx0c0VPRik6CisgICAgICAgIChpbnZhbGlkYXRlQW55UHJldmlvdXNXYWl0
VG9EdW1wV2F0Y2hkb2cpOgorICAgICAgICAoZHVtcCk6CisgICAgICAgIChwcm9jZXNzV29yayk6
CisgICAgICAgIChhZGRDb250cm9sbGVyVG9XaW5kb3cpOgorICAgICAgICAob25XaW5kb3dPYmpl
Y3RDbGVhcmVkKToKKyAgICAgICAgKG9uU3RhdHVzYmFyVGV4dFNldCk6CisgICAgICAgIChvbkxv
YWRTdGFydGVkKToKKyAgICAgICAgKG9uTG9hZEZpbmlzaGVkKToKKyAgICAgICAgKG9uVGl0bGVD
aGFuZ2VkKToKKyAgICAgICAgKG9uRG9jdW1lbnRMb2FkRmluaXNoZWQpOgorICAgICAgICAob25F
Y29yZUV2YXNSZXNpemUpOgorICAgICAgICAob25DbG9zZVdpbmRvdyk6CisgICAgICAgICh1c2VM
b25nUnVubmluZ1NlcnZlck1vZGUpOgorICAgICAgICAocGFyc2VDb21tYW5kTGluZU9wdGlvbnMp
OgorICAgICAgICAocmVzZXREZWZhdWx0c1RvQ29uc2lzdGVudFZhbHVlcyk6CisgICAgICAgIChp
bml0aWFsaXplRm9udHMpOgorICAgICAgICAocnVuVGVzdCk6CisgICAgICAgIChydW5UZXN0aW5n
U2VydmVyTG9vcCk6CisgICAgICAgIChtYWluKToKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9l
ZmwvRHVtcFJlbmRlclRyZWVFZmwuaDogQWRkZWQuCisKIDIwMTEtMDYtMDMgIFJvYmVydCBLcm9l
Z2VyICA8cmprcm9lZ2VAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0g
QmFydGguCkluZGV4OiBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5j
cHAJKHJldmlzaW9uIDApCisrKyBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRy
ZWUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc0NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDEx
IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWQgaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiRHVtcFJlbmRlclRyZWUuaCIKKworI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlVmll
dy5oIgorI2luY2x1ZGUgIkV2ZW50U2VuZGVyLmgiCisjaW5jbHVkZSAiR0NDb250cm9sbGVyLmgi
CisjaW5jbHVkZSAiTGF5b3V0VGVzdENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQaXhlbER1bXBT
dXBwb3J0LmgiCisjaW5jbHVkZSAiV29ya1F1ZXVlLmgiCisjaW5jbHVkZSAiZXdrX3ByaXZhdGUu
aCIgLy8gRklYTUU6IGNyZWF0ZSBzb21lIFdlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlLmNw
cCBpbnN0ZWFkCisjaW5jbHVkZSA8RVdlYktpdC5oPgorI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5j
bHVkZSA8RWNvcmVfRXZhcy5oPgorI2luY2x1ZGUgPEVjb3JlX0ZpbGUuaD4KKyNpbmNsdWRlIDxF
ZGplLmg+CisjaW5jbHVkZSA8RXZhcy5oPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZp
Zy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUg
PHRleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIFdJRFRIIDgw
MAorI2RlZmluZSBIRUlHSFQgNjAwCisKK0Vjb3JlX1RpbWVyKiB3YWl0VG9EdW1wV2F0Y2hkb2cg
PSAwOworRWluYV9MaXN0KiB3aW5kb3dMaXN0ID0gMDsKK0V2YXNfT2JqZWN0KiBicm93c2VyOwor
RXZhc19PYmplY3QqIG1haW5GcmFtZTsKK0V2YXNfT2JqZWN0KiB0b3BMb2FkaW5nRnJhbWUgPSAw
OworUmVmUHRyPExheW91dFRlc3RDb250cm9sbGVyPiBnTGF5b3V0VGVzdENvbnRyb2xsZXI7Citi
b29sIHdhaXRGb3JQb2xpY3k7CisKK3N0YXRpYyBFY29yZV9FdmFzKiBlZTsKK3N0YXRpYyBFdmFz
KiBldmFzOworc3RhdGljIEV3a19IaXN0b3J5X0l0ZW0qIHByZXZUZXN0QkZJdGVtID0gMDsKK3N0
YXRpYyBHQ0NvbnRyb2xsZXIqIGdjQ29udHJvbGxlciA9IDA7CitzdGF0aWMgaW50IGR1bXBQaXhl
bHMgPSBmYWxzZTsKK3N0YXRpYyBpbnQgZHVtcFRyZWUgPSB0cnVlOworc3RhdGljIGludCBwcmlu
dFNlcGFyYXRvcnMgPSB0cnVlOworc3RhdGljIGludCB1c2VYMTFXaW5kb3cgPSBmYWxzZTsKK3Zv
bGF0aWxlIGJvb2wgZG9uZSA9IGZhbHNlOworCitjb25zdCB1bnNpZ25lZCBoaXN0b3J5SXRlbUlu
ZGVudCA9IDg7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3ZvaWQgZGlzcGxheVdlYlZpZXco
dm9pZCkKK3sKK30KKworY2hhciogZHVtcEZyYW1lc0FzVGV4dChFdmFzX09iamVjdCogZnJhbWUp
Cit7CisgICAgYm9vbCBpc01haW5GcmFtZSA9IChld2tfdmlld19mcmFtZV9tYWluX2dldChicm93
c2VyKSA9PSBmcmFtZSk7CisgICAgY2hhciogcmVzdWx0ID0gMDsKKyAgICBjaGFyKiBpbm5lclRl
eHQgPSBld2tfZnJhbWVfaW5uZXJfdGV4dF9nZXQoZnJhbWUpOworCisgICAgaWYgKGlzTWFpbkZy
YW1lKSB7CisgICAgICAgIGlmIChhc3ByaW50ZigmcmVzdWx0LCAiJXNcbiIsIGlubmVyVGV4dCkg
PCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25z
dCBjaGFyKiBmcmFtZU5hbWUgPSBld2tfZnJhbWVfbmFtZV9nZXQoZnJhbWUpOworICAgICAgICBp
ZiAoYXNwcmludGYoJnJlc3VsdCwgIlxuLS0tLS0tLS1cbkZyYW1lOiAnJXMnXG4tLS0tLS0tLVxu
JXNcbiIsIGZyYW1lTmFtZSwgaW5uZXJUZXh0KSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9y
OworICAgIH0KKyAgICBmcmVlKGlubmVyVGV4dCk7CisKKyAgICBpZiAoZ0xheW91dFRlc3RDb250
cm9sbGVyLT5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSkgeworICAgICAgICBFaW5hX0l0ZXJhdG9y
KiBjaGlsZHJlbiA9IGV3a19mcmFtZV9jaGlsZHJlbl9pdGVyYXRvcl9uZXcoZnJhbWUpOworICAg
ICAgICBFdmFzX09iamVjdCogY2hpbGQ7CisgICAgICAgIEVJTkFfSVRFUkFUT1JfRk9SRUFDSChj
aGlsZHJlbiwgY2hpbGQpIHsKKyAgICAgICAgICAgIGNoYXIqIHRlbXBUZXh0ID0gZHVtcEZyYW1l
c0FzVGV4dChjaGlsZCk7CisgICAgICAgICAgICBpZiAoIXRlbXBUZXh0KQorICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2hhciogbmV3UmVzdWx0ID0gMDsKKyAgICAgICAg
ICAgIGlmIChhc3ByaW50ZigmbmV3UmVzdWx0LCAiJXMlcyIsIHJlc3VsdCwgdGVtcFRleHQpIDwg
MCkgeworICAgICAgICAgICAgICAgIGZyZWUodGVtcFRleHQpOworICAgICAgICAgICAgICAgIGVp
bmFfaXRlcmF0b3JfZnJlZShjaGlsZHJlbik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocmVzdWx0KTsKKyAgICAgICAgICAgIHJl
c3VsdCA9IG5ld1Jlc3VsdDsKKyAgICAgICAgICAgIGZyZWUodGVtcFRleHQpOworICAgICAgICB9
CisgICAgICAgIGVpbmFfaXRlcmF0b3JfZnJlZShjaGlsZHJlbik7CisgICAgfQorCisgICAgcmV0
dXJuIHJlc3VsdDsKKworZXJyb3I6CisgICAgZnJlZShyZXN1bHQpOworICAgIHJldHVybiAwOwor
fQorCit2b2lkIGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKEV2YXNfT2JqZWN0KiBtYWluRnJhbWUp
Cit7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZUhpc3RvcnlJdGVtcyhjb25zdCB2b2lkKiBpdGVt
MSwgY29uc3Qgdm9pZCogaXRlbTIpCit7CisgICAgY2hhciogdGFyZ2V0MSA9IGV3a19oaXN0b3J5
X2l0ZW1fdGFyZ2V0X2dldChzdGF0aWNfY2FzdDxjb25zdCBFd2tfSGlzdG9yeV9JdGVtKj4oaXRl
bTEpKTsKKyAgICBjaGFyKiB0YXJnZXQyID0gZXdrX2hpc3RvcnlfaXRlbV90YXJnZXRfZ2V0KHN0
YXRpY19jYXN0PGNvbnN0IEV3a19IaXN0b3J5X0l0ZW0qPihpdGVtMikpOworICAgIGludCByZXN1
bHQgPSBzdHJjYXNlY21wKHRhcmdldDEsIHRhcmdldDIpOworICAgIGZyZWUodGFyZ2V0MSk7Cisg
ICAgZnJlZSh0YXJnZXQyKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBk
dW1wSGlzdG9yeUl0ZW0oRXdrX0hpc3RvcnlfSXRlbSogaXRlbSwgaW50IGluZGVudCwgYm9vbCBj
dXJyZW50KQoreworICAgIEFTU0VSVChpdGVtKTsKKyAgICBpbnQgc3RhcnQgPSAwOworICAgIGlm
IChjdXJyZW50KSB7CisgICAgICAgIHByaW50ZigiY3Vyci0+Iik7CisgICAgICAgIHN0YXJ0ID0g
NjsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgaW5kZW50OyBpKyspCisgICAg
ICAgIHB1dGNoYXIoJyAnKTsKKworICAgIC8vIG5vcm1hbGl6ZSBmaWxlIFVSTHMuCisgICAgY29u
c3QgY2hhciogdXJpID0gZXdrX2hpc3RvcnlfaXRlbV91cmlfZ2V0KGl0ZW0pOworICAgIGlmICgh
c3RybmNhc2VjbXAodXJpLCAiZmlsZTovLyIsIHNpemVvZigiZmlsZTovLyIpIC0gMSkpIHsKKyAg
ICAgICAgY29uc3QgY2hhciogcG9zID0gc3Ryc3RyKHVyaSwgIi9MYXlvdXRUZXN0cy8iKTsKKyAg
ICAgICAgaWYgKCFwb3MpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcHJpbnRmKCIo
ZmlsZSB0ZXN0KTolcyIsIHBvcyArIHNpemVvZigiL0xheW91dFRlc3RzLyIpIC0gMSk7CisgICAg
fSBlbHNlCisgICAgICAgIHByaW50ZigiJXMiLCB1cmkpOworCisgICAgY2hhciogdGFyZ2V0ID0g
ZXdrX2hpc3RvcnlfaXRlbV90YXJnZXRfZ2V0KGl0ZW0pOworICAgIGlmICh0YXJnZXQgJiYgKnRh
cmdldCkKKyAgICAgICAgcHJpbnRmKCIgKGluIGZyYW1lIFwiJXNcIikiLCB0YXJnZXQpOworICAg
IGlmIChld2tfaGlzdG9yeV9pdGVtX3RhcmdldF9pcyhpdGVtKSkKKyAgICAgICAgcHJpbnRmKCIg
ICoqbmF2IHRhcmdldCoqIik7CisgICAgcHV0Y2hhcignXG4nKTsKKyAgICBFaW5hX0xpc3QqIGNo
aWxkcmVuID0gZXdrX2hpc3RvcnlfaXRlbV9jaGlsZHJlbl9nZXQoaXRlbSk7CisgICAgaWYgKGNo
aWxkcmVuKSB7CisgICAgICAgIC8vIG11c3Qgc29ydCB0byBlbGltaW5hdGUgYXJiaXRyYXJ5IHJl
c3VsdCBvcmRlcmluZyB3aGljaCBkZWZlYXRzIHJlcHJvZHVjaWJsZSB0ZXN0aW5nCisgICAgICAg
IGNoaWxkcmVuID0gZWluYV9saXN0X3NvcnQoY2hpbGRyZW4sIDAsIHN0YXRpY19jYXN0PEVpbmFf
Q29tcGFyZV9DYj4oY29tcGFyZUhpc3RvcnlJdGVtcykpOworICAgICAgICB2b2lkKiBjaGlsZEl0
ZW07CisgICAgICAgIEVJTkFfTElTVF9GUkVFKGNoaWxkcmVuLCBjaGlsZEl0ZW0pCisgICAgICAg
ICAgICBkdW1wSGlzdG9yeUl0ZW0oc3RhdGljX2Nhc3Q8RXdrX0hpc3RvcnlfSXRlbSo+KGNoaWxk
SXRlbSksIGluZGVudCArIDQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBmcmVlKHRhcmdldCk7Cit9
CisKK3ZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdEZvcldlYlZpZXcoRXZhc19PYmplY3QqIHZpZXcp
Cit7CisgICAgcHJpbnRmKCJcbj09PT09PT09PT09PT09IEJhY2sgRm9yd2FyZCBMaXN0ID09PT09
PT09PT09PT09XG4iKTsKKyAgICBFd2tfSGlzdG9yeSogaGlzdG9yeSA9IGV3a192aWV3X2hpc3Rv
cnlfZ2V0KHZpZXcpOworCisgICAgLy8gUHJpbnQgb3V0IGFsbCBpdGVtcyBpbiB0aGUgbGlzdCBh
ZnRlciBwcmV2VGVzdEJGSXRlbSwgd2hpY2ggd2FzIGZyb20gdGhlIHByZXZpb3VzIHRlc3QKKyAg
ICAvLyBHYXRoZXIgaXRlbXMgZnJvbSB0aGUgZW5kIG9mIHRoZSBsaXN0LCB0aGUgcHJpbnQgdGhl
bSBvdXQgZnJvbSBvbGRlc3QgdG8gbmV3ZXN0CisgICAgRWluYV9MaXN0KiBpdGVtc1RvUHJpbnQg
PSAwOworICAgIHZvaWQqIGhpc3RvcnlJdGVtOworICAgIEVpbmFfTGlzdCogYmFja3dhcmRMaXN0
ID0gZXdrX2hpc3RvcnlfYmFja19saXN0X2dldChoaXN0b3J5KTsKKyAgICBFSU5BX0xJU1RfRlJF
RShiYWNrd2FyZExpc3QsIGhpc3RvcnlJdGVtKSB7CisgICAgICAgIGlmIChoaXN0b3J5SXRlbSA9
PSBwcmV2VGVzdEJGSXRlbSkgeworICAgICAgICAgICAgZWluYV9saXN0X2ZyZWUoYmFja3dhcmRM
aXN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGl0ZW1zVG9Qcmlu
dCA9IGVpbmFfbGlzdF9hcHBlbmQoaXRlbXNUb1ByaW50LCBoaXN0b3J5SXRlbSk7CisgICAgfQor
CisgICAgRXdrX0hpc3RvcnlfSXRlbSogY3VycmVudEl0ZW0gPSBld2tfaGlzdG9yeV9oaXN0b3J5
X2l0ZW1fY3VycmVudF9nZXQoaGlzdG9yeSk7CisgICAgaWYgKGN1cnJlbnRJdGVtKQorICAgICAg
ICBpdGVtc1RvUHJpbnQgPSBlaW5hX2xpc3RfYXBwZW5kKGl0ZW1zVG9QcmludCwgY3VycmVudEl0
ZW0pOworCisgICAgRWluYV9MaXN0KiBmb3J3YXJkTGlzdCA9IGV3a19oaXN0b3J5X2ZvcndhcmRf
bGlzdF9nZXQoaGlzdG9yeSk7CisgICAgRUlOQV9MSVNUX0ZSRUUoZm9yd2FyZExpc3QsIGhpc3Rv
cnlJdGVtKSB7CisgICAgICAgIEFTU0VSVChoaXN0b3J5SXRlbSAhPSBwcmV2VGVzdEJGSXRlbSk7
CisgICAgICAgIGl0ZW1zVG9QcmludCA9IGVpbmFfbGlzdF9hcHBlbmQoaXRlbXNUb1ByaW50LCBo
aXN0b3J5SXRlbSk7CisgICAgfQorCisgICAgRUlOQV9MSVNUX0ZSRUUoaXRlbXNUb1ByaW50LCBo
aXN0b3J5SXRlbSkgeworICAgICAgICBkdW1wSGlzdG9yeUl0ZW0oc3RhdGljX2Nhc3Q8RXdrX0hp
c3RvcnlfSXRlbSo+KGhpc3RvcnlJdGVtKSwgaGlzdG9yeUl0ZW1JbmRlbnQsIGhpc3RvcnlJdGVt
ID09IGN1cnJlbnRJdGVtKTsKKyAgICAgICAgZXdrX2hpc3RvcnlfaXRlbV9mcmVlKHN0YXRpY19j
YXN0PEV3a19IaXN0b3J5X0l0ZW0qPihoaXN0b3J5SXRlbSkpOworICAgIH0KKworICAgIHByaW50
ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwor
fQorCit2b2lkIGR1bXBCYWNrRm9yd2FyZExpc3RGb3JBbGxXZWJWaWV3cyh2b2lkKQoreworICAg
IC8vIER1bXAgdGhlIGJhY2sgZm9yd2FyZCBsaXN0IG9mIHRoZSBtYWluIFdlYlZpZXcgZmlyc3QK
KyAgICBkdW1wQmFja0ZvcndhcmRMaXN0Rm9yV2ViVmlldyhicm93c2VyKTsKKworICAgIEVpbmFf
TGlzdCogdmlld0l0ZXI7CisgICAgdm9pZCogdmlldzsKKyAgICBFSU5BX0xJU1RfRk9SRUFDSCh3
aW5kb3dMaXN0LCB2aWV3SXRlciwgdmlldykKKyAgICAgICAgZHVtcEJhY2tGb3J3YXJkTGlzdEZv
cldlYlZpZXcoc3RhdGljX2Nhc3Q8RXZhc19PYmplY3QqPih2aWV3KSk7Cit9CisKK3N0YXRpYyBi
b29sIHNob3VsZExvZ0ZyYW1lTG9hZERlbGVnYXRlcyhjb25zdCBzdHJpbmcmIHBhdGhPclVSTCkK
K3sKKyAgICByZXR1cm4gcGF0aE9yVVJMLmZpbmQoImxvYWRpbmcvIikgIT0gc3RyaW5nOjpucG9z
OworfQorCitzdGF0aWMgYm9vbCBzaG91bGRFbmFibGVEZXZlbG9wZXJFeHRyYXMoY29uc3Qgc3Ry
aW5nJiBwYXRoT3JVUkwpCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHNo
b3VsZER1bXBBc1RleHQoY29uc3Qgc3RyaW5nJiBwYXRoT3JVUkwpCit7CisgICAgcmV0dXJuIHBh
dGhPclVSTC5maW5kKCJkdW1wQXNUZXh0LyIpICE9IHN0cmluZzo6bnBvczsKK30KKworc3RhdGlj
IHZvaWQgc2VuZFBpeGVsUmVzdWx0c0VPRih2b2lkKQoreworICAgIHB1dHMoIiNFT0YiKTsKKyAg
ICBmZmx1c2goc3Rkb3V0KTsKKyAgICBmZmx1c2goc3RkZXJyKTsKK30KKworc3RhdGljIHZvaWQg
aW52YWxpZGF0ZUFueVByZXZpb3VzV2FpdFRvRHVtcFdhdGNoZG9nKHZvaWQpCit7CisgICAgaWYg
KHdhaXRUb0R1bXBXYXRjaGRvZykgeworICAgICAgICBlY29yZV90aW1lcl9kZWwod2FpdFRvRHVt
cFdhdGNoZG9nKTsKKyAgICAgICAgd2FpdFRvRHVtcFdhdGNoZG9nID0gMDsKKyAgICB9CisgICAg
d2FpdEZvclBvbGljeSA9IGZhbHNlOworfQorCit2b2lkIGR1bXAodm9pZCkKK3sKKyAgICBpbnZh
bGlkYXRlQW55UHJldmlvdXNXYWl0VG9EdW1wV2F0Y2hkb2coKTsKKworICAgIGlmIChkdW1wVHJl
ZSkgeworICAgICAgICBjaGFyKiByZXNwb25zZU1pbWVUeXBlOworICAgICAgICBjaGFyKiByZXN1
bHQ7CisKKyAgICAgICAgcmVzcG9uc2VNaW1lVHlwZSA9IGV3a19mcmFtZV9yZXNwb25zZV9taW1l
X3R5cGVfZ2V0KG1haW5GcmFtZSk7CisgICAgICAgIGlmIChyZXNwb25zZU1pbWVUeXBlICYmICFz
dHJjbXAocmVzcG9uc2VNaW1lVHlwZSwgInRleHQvcGxhaW4iKSkgeworICAgICAgICAgICAgZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5zZXREdW1wQXNUZXh0KHRydWUpOworICAgICAgICAgICAgZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5zZXRHZW5lcmF0ZVBpeGVsUmVzdWx0cyhmYWxzZSk7CisgICAg
ICAgIH0KKyAgICAgICAgZnJlZShyZXNwb25zZU1pbWVUeXBlKTsKKworICAgICAgICBpZiAoZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wQXNUZXh0KCkpCisgICAgICAgICAgICByZXN1bHQgPSBk
dW1wRnJhbWVzQXNUZXh0KG1haW5GcmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJl
c3VsdCA9IGV3a19mcmFtZV9yZW5kZXJfdHJlZV9kdW1wX2dldChtYWluRnJhbWUpOworCisgICAg
ICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvck1lc3NhZ2U7
CisgICAgICAgICAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQXNUZXh0KCkpCisg
ICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gIltkb2N1bWVudGVsZW1lbnQgaW5uZXJUZXh0
XSI7CisgICAgICAgICAgICBlbHNlIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBET01B
c1dlYkFyY2hpdmUoKSkKKyAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiW1ttYWluRnJh
bWUgRE9NRG9jdW1lbnRdIHdlYkFyY2hpdmVdIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGdMYXlv
dXRUZXN0Q29udHJvbGxlci0+ZHVtcFNvdXJjZUFzV2ViQXJjaGl2ZSgpKQorICAgICAgICAgICAg
ICAgIGVycm9yTWVzc2FnZSA9ICJbW21haW5GcmFtZSBkYXRhU291cmNlXSB3ZWJBcmNoaXZlXSI7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gIlttYWlu
RnJhbWUgcmVuZGVyVHJlZUFzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbl0iOworICAgICAgICAgICAg
cHJpbnRmKCJFUlJPUjogbmlsIHJlc3VsdCBmcm9tICVzIiwgZXJyb3JNZXNzYWdlKTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMiLCByZXN1bHQpOworICAgICAgICAg
ICAgZnJlZShyZXN1bHQpOworCisgICAgICAgICAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVy
LT5kdW1wQXNUZXh0KCkKKyAgICAgICAgICAgICAgICAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVy
LT5kdW1wRE9NQXNXZWJBcmNoaXZlKCkKKyAgICAgICAgICAgICAgICAmJiAhZ0xheW91dFRlc3RD
b250cm9sbGVyLT5kdW1wU291cmNlQXNXZWJBcmNoaXZlKCkpCisgICAgICAgICAgICAgICAgZHVt
cEZyYW1lU2Nyb2xsUG9zaXRpb24obWFpbkZyYW1lKTsKKworICAgICAgICAgICAgaWYgKGdMYXlv
dXRUZXN0Q29udHJvbGxlci0+ZHVtcEJhY2tGb3J3YXJkTGlzdCgpKQorICAgICAgICAgICAgICAg
IGR1bXBCYWNrRm9yd2FyZExpc3RGb3JBbGxXZWJWaWV3cygpOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKHByaW50U2VwYXJhdG9ycykgeworICAgICAgICAgICAgcHV0cygiI0VPRiIpOworICAg
ICAgICAgICAgZnB1dHMoIiNFT0ZcbiIsIHN0ZGVycik7CisgICAgICAgICAgICBmZmx1c2goc3Rk
b3V0KTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKGR1bXBQaXhlbHMKKyAgICAgICAgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5nZW5l
cmF0ZVBpeGVsUmVzdWx0cygpCisgICAgICAgICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1
bXBET01Bc1dlYkFyY2hpdmUoKQorICAgICAgICAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5k
dW1wU291cmNlQXNXZWJBcmNoaXZlKCkpCisgICAgICAgIGR1bXBXZWJWaWV3QXNQaXhlbHNBbmRD
b21wYXJlV2l0aEV4cGVjdGVkKGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZXhwZWN0ZWRQaXhlbEhh
c2goKSk7CisKKyAgICBkb25lID0gdHJ1ZTsKKyAgICBlY29yZV9tYWluX2xvb3BfcXVpdCgpOwor
fQorCitzdGF0aWMgRWluYV9Cb29sIHByb2Nlc3NXb3JrKHZvaWQqIGRhdGEpCit7CisgICAgaWYg
KFdvcmtRdWV1ZTo6c2hhcmVkKCktPnByb2Nlc3NXb3JrKCkgJiYgIWdMYXlvdXRUZXN0Q29udHJv
bGxlci0+d2FpdFRvRHVtcCgpKQorICAgICAgICBkdW1wKCk7CisgICAgcmV0dXJuIEVDT1JFX0NB
TExCQUNLX0NBTkNFTDsKK30KKworc3RhdGljIHZvaWQgYWRkQ29udHJvbGxlclRvV2luZG93KEpT
Q29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiB3aW5kb3dPYmplY3QsIGNvbnN0IGNoYXIq
IGNvbnRyb2xsZXJOYW1lLCBKU1ZhbHVlUmVmIGNvbnRyb2xsZXIpCit7CisgICAgSlNTdHJpbmdS
ZWYgY29udHJvbGxlck5hbWVTdHIgPSBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyhjb250
cm9sbGVyTmFtZSk7CisgICAgSlNPYmplY3RTZXRQcm9wZXJ0eShjb250ZXh0LCB3aW5kb3dPYmpl
Y3QsIGNvbnRyb2xsZXJOYW1lU3RyLCBjb250cm9sbGVyLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJl
YWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlLCAwKTsKKyAgICBKU1N0cmlu
Z1JlbGVhc2UoY29udHJvbGxlck5hbWVTdHIpOworfQorCitzdGF0aWMgdm9pZCBvbldpbmRvd09i
amVjdENsZWFyZWQodm9pZCogdXNlckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBldmVu
dEluZm8pCit7CisgICAgRXdrX1dpbmRvd19PYmplY3RfQ2xlYXJlZF9FdmVudCogb2JqZWN0Q2xl
YXJlZEluZm8gPSBzdGF0aWNfY2FzdDxFd2tfV2luZG93X09iamVjdF9DbGVhcmVkX0V2ZW50Kj4o
ZXZlbnRJbmZvKTsKKyAgICBKU1ZhbHVlUmVmIGV4Y2VwdGlvbiA9IDA7CisgICAgQVNTRVJUKGdM
YXlvdXRUZXN0Q29udHJvbGxlcik7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPm1ha2VX
aW5kb3dPYmplY3Qob2JqZWN0Q2xlYXJlZEluZm8tPmNvbnRleHQsIG9iamVjdENsZWFyZWRJbmZv
LT53aW5kb3dPYmplY3QsICZleGNlcHRpb24pOworICAgIEFTU0VSVCghZXhjZXB0aW9uKTsKKwor
ICAgIGdjQ29udHJvbGxlci0+bWFrZVdpbmRvd09iamVjdChvYmplY3RDbGVhcmVkSW5mby0+Y29u
dGV4dCwgb2JqZWN0Q2xlYXJlZEluZm8tPndpbmRvd09iamVjdCwgJmV4Y2VwdGlvbik7CisgICAg
QVNTRVJUKCFleGNlcHRpb24pOworCisgICAgLyogRklYTUUgcy9mYWxzZS8hZ2V0X3BhcmVudC8g
Ki8KKyAgICBhZGRDb250cm9sbGVyVG9XaW5kb3cob2JqZWN0Q2xlYXJlZEluZm8tPmNvbnRleHQs
IG9iamVjdENsZWFyZWRJbmZvLT53aW5kb3dPYmplY3QsICJldmVudFNlbmRlciIsIG1ha2VFdmVu
dFNlbmRlcihvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgZmFsc2UpKTsKK30KKworc3RhdGlj
IHZvaWQgb25TdGF0dXNiYXJUZXh0U2V0KHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmll
dywgdm9pZCogZXZlbnRJbmZvKQoreworICAgIGlmICghZ0xheW91dFRlc3RDb250cm9sbGVyLT5k
dW1wU3RhdHVzQ2FsbGJhY2tzKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IGNoYXIq
IHN0YXR1c2JhclRleHQgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZXZlbnRJbmZvKTsKKyAg
ICBwcmludGYoIlVJIERFTEVHQVRFIFNUQVRVUyBDQUxMQkFDSzogc2V0U3RhdHVzVGV4dDolc1xu
Iiwgc3RhdHVzYmFyVGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uTG9hZFN0YXJ0ZWQodm9pZCog
dXNlckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBldmVudEluZm8pCit7CisgICAgLy8g
RklYTUU6IHdlIGFjdHVhbGx5IG5lZWQgdGhlIGZyYW1lIHJlbGF0ZWQgdG8gdGhpcyBldmVudAor
ICAgIEV2YXNfT2JqZWN0KiBmcmFtZSA9IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KHZpZXcpOwor
CisgICAgLy8gTWFrZSBzdXJlIHdlIG9ubHkgc2V0IHRoaXMgb25jZSBwZXIgdGVzdC4gSWYgaXQg
Z2V0cyBjbGVhcmVkLCBhbmQgdGhlbiBzZXQgYWdhaW4sIHdlIG1pZ2h0CisgICAgLy8gZW5kIHVw
IGRvaW5nIHR3byBkdW1wcyBmb3Igb25lIHRlc3QuCisgICAgaWYgKCF0b3BMb2FkaW5nRnJhbWUg
JiYgIWRvbmUpCisgICAgICAgIHRvcExvYWRpbmdGcmFtZSA9IGZyYW1lOworfQorCitzdGF0aWMg
dm9pZCBvbkxvYWRGaW5pc2hlZCh2b2lkKiB1c2VyRGF0YSwgRXZhc19PYmplY3QqIHZpZXcsIHZv
aWQqIGV2ZW50SW5mbykKK3sKKyAgICAvLyBGSVhNRTogd2UgYWN0dWFsbHkgbmVlZCB0aGUgZnJh
bWUgcmVsYXRlZCB0byB0aGlzIGV2ZW50CisgICAgRXZhc19PYmplY3QqIGZyYW1lID0gZXdrX3Zp
ZXdfZnJhbWVfbWFpbl9nZXQodmlldyk7CisKKyAgICBpZiAodG9wTG9hZGluZ0ZyYW1lICE9IGZy
YW1lKQorICAgICAgICByZXR1cm47CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOworCisgICAg
V29ya1F1ZXVlOjpzaGFyZWQoKS0+c2V0RnJvemVuKHRydWUpOworICAgIGlmIChnTGF5b3V0VGVz
dENvbnRyb2xsZXItPndhaXRUb0R1bXAoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKFdv
cmtRdWV1ZTo6c2hhcmVkKCktPmNvdW50KCkpCisgICAgICAgIGVjb3JlX2lkbGVyX2FkZChwcm9j
ZXNzV29yaywgMCk7CisgICAgZWxzZQorICAgICAgICBkdW1wKCk7Cit9CisKK3N0YXRpYyB2b2lk
IG9uVGl0bGVDaGFuZ2VkKHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmlldywgdm9pZCog
ZXZlbnRJbmZvKQoreworfQorCitzdGF0aWMgdm9pZCBvbkRvY3VtZW50TG9hZEZpbmlzaGVkKHZv
aWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogZnJhbWUsIHZvaWQqIGV2ZW50SW5mbykKK3sKKyAg
ICBjb25zdCBXVEY6OlN0cmluZyBmcmFtZU5hbWUoZXdrX2ZyYW1lX3N1aXRhYmxlX2RydF9uYW1l
X2dldChmcmFtZSkpOworCisgICAgaWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+
ZHVtcEZyYW1lTG9hZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIiVzIC0gZGlkRmluaXNo
RG9jdW1lbnRMb2FkRm9yRnJhbWVcbiIsIGZyYW1lTmFtZS51dGY4KCkuZGF0YSgpKTsKKyAgICBl
bHNlIGlmICghZG9uZSkgeworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgcGVuZGluZ0ZyYW1l
VW5sb2FkRXZlbnRzID0gZXdrX2ZyYW1lX3BlbmRpbmdfdW5sb2FkX2V2ZW50X2NvdW50X2dldChm
cmFtZSk7CisgICAgICAgIGlmIChwZW5kaW5nRnJhbWVVbmxvYWRFdmVudHMpCisgICAgICAgICAg
ICBwcmludGYoIiVzIC0gaGFzICV1IG9udW5sb2FkIGhhbmRsZXIocylcbiIsIGZyYW1lTmFtZS51
dGY4KCkuZGF0YSgpLCBwZW5kaW5nRnJhbWVVbmxvYWRFdmVudHMpOworICAgIH0KK30KKworc3Rh
dGljIHZvaWQgb25FY29yZUV2YXNSZXNpemUoRWNvcmVfRXZhcyogZWUpCit7CisgICAgaW50IHdp
ZHRoLCBoZWlnaHQ7CisKKyAgICBlY29yZV9ldmFzX2dlb21ldHJ5X2dldChlZSwgMCwgMCwgJndp
ZHRoLCAmaGVpZ2h0KTsKKyAgICBldmFzX29iamVjdF9tb3ZlKGJyb3dzZXIsIDAsIDApOworICAg
IGV2YXNfb2JqZWN0X3Jlc2l6ZShicm93c2VyLCB3aWR0aCwgaGVpZ2h0KTsKK30KKworc3RhdGlj
IHZvaWQgb25DbG9zZVdpbmRvdyhFY29yZV9FdmFzKiBlZSkKK3sKK30KKworc3RhdGljIEVpbmFf
Qm9vbCB1c2VMb25nUnVubmluZ1NlcnZlck1vZGUoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQorewor
ICAgIHJldHVybiAoYXJnYyA9PSBvcHRpbmQgKyAxICYmICFzdHJjbXAoYXJndltvcHRpbmRdLCAi
LSIpKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VDb21tYW5kTGluZU9wdGlvbnMoaW50IGFyZ2Ms
IGNoYXIqKiBhcmd2KQoreworICAgIHN0YXRpYyBjb25zdCBvcHRpb24gb3B0aW9uc1tdID0gewor
ICAgICAgICB7Im5vdHJlZSIsIG5vX2FyZ3VtZW50LCAmZHVtcFRyZWUsIGZhbHNlfSwKKyAgICAg
ICAgeyJwaXhlbC10ZXN0cyIsIG5vX2FyZ3VtZW50LCAmZHVtcFBpeGVscywgdHJ1ZX0sCisgICAg
ICAgIHsidHJlZSIsIG5vX2FyZ3VtZW50LCAmZHVtcFRyZWUsIHRydWV9LAorICAgICAgICB7Imd1
aSIsIG5vX2FyZ3VtZW50LCAmdXNlWDExV2luZG93LCB0cnVlfSwKKyAgICAgICAgezAsIDAsIDAs
IDB9CisgICAgfTsKKyAgICBpbnQgb3B0aW9uOworCisgICAgd2hpbGUgKChvcHRpb24gPSBnZXRv
cHRfbG9uZyhhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YsICIiLCBvcHRpb25zLCAwKSkgIT0gLTEp
IHsKKyAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAg
IGNhc2UgJzonOgorICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZXNldERlZmF1bHRzVG9Db25zaXN0ZW50
VmFsdWVzKCkKK3sKKyAgICBld2tfc2V0dGluZ3NfaWNvbl9kYXRhYmFzZV9jbGVhcigpOworICAg
IGV3a19zZXR0aW5nc19pY29uX2RhdGFiYXNlX3BhdGhfc2V0KDApOworCisgICAgZXdrX3ZpZXdf
c2V0dGluZ19wcml2YXRlX2Jyb3dzaW5nX3NldChicm93c2VyLCBFSU5BX0ZBTFNFKTsKKyAgICBl
d2tfdmlld19zZXR0aW5nX3NwYXRpYWxfbmF2aWdhdGlvbl9zZXQoYnJvd3NlciwgRUlOQV9GQUxT
RSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfZnJhbWVfZmxhdHRlbmluZ19zZXQoYnJv
d3NlciwgRUlOQV9GQUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19vZmZsaW5lX2FwcF9jYWNo
ZV9zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9z
Y3JpcHRzX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9u
dF9zdGFuZGFyZF9zZXQoYnJvd3NlciwgIlRpbWVzIik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19m
b250X21vbm9zcGFjZV9zZXQoYnJvd3NlciwgIkNvdXJpZXIiKTsKKyAgICBld2tfdmlld19zZXR0
aW5nX2ZvbnRfc2VyaWZfc2V0KGJyb3dzZXIsICJUaW1lcyIpOworICAgIGV3a192aWV3X3NldHRp
bmdfZm9udF9zYW5zX3NlcmlmX3NldChicm93c2VyLCAiSGVsdmV0aWNhIik7CisgICAgZXdrX3Zp
ZXdfc2V0dGluZ19mb250X2N1cnNpdmVfc2V0KGJyb3dzZXIsICJjdXJzaXZlIik7CisgICAgZXdr
X3ZpZXdfc2V0dGluZ19mb250X2ZhbnRhc3lfc2V0KGJyb3dzZXIsICJmYW50YXN5Iik7CisgICAg
ZXdrX3ZpZXdfc2V0dGluZ19mb250X2RlZmF1bHRfc2l6ZV9zZXQoYnJvd3NlciwgMTIpOworICAg
IGV3a192aWV3X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2l6ZV9zZXQoYnJvd3NlciwgMTApOwor
ICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9taW5pbXVtX3NpemVfc2V0KGJyb3dzZXIsIDApOwor
ICAgIGV3a192aWV3X3NldHRpbmdfY2FyZXRfYnJvd3Npbmdfc2V0KGJyb3dzZXIsIEVJTkFfRkFM
U0UpOworICAgIGV3a192aWV3X3NldHRpbmdfcGFnZV9jYWNoZV9zZXQoYnJvd3NlciwgRUlOQV9G
QUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfYXV0b19yZXNpemVfd2luZG93X3Nl
dChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3BsdWdp
bnNfc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19zY3JpcHRz
X3dpbmRvd19vcGVuX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworCisgICAgZXdrX3ZpZXdfem9v
bV9zZXQoYnJvd3NlciwgMS4wLCAwLCAwKTsKKworICAgIEV3a19IaXN0b3J5KiBoaXN0b3J5ID0g
ZXdrX3ZpZXdfaGlzdG9yeV9nZXQoYnJvd3Nlcik7CisgICAgaW50IGxpbWl0ID0gZXdrX2hpc3Rv
cnlfbGltaXRfZ2V0KGhpc3RvcnkpOworICAgIGV3a19oaXN0b3J5X2xpbWl0X3NldChoaXN0b3J5
LCAwKTsKKyAgICBld2tfaGlzdG9yeV9saW1pdF9zZXQoaGlzdG9yeSwgbGltaXQpOworCisgICAg
ZXdrX2Nvb2tpZXNfY2xlYXIoKTsKKyAgICBld2tfY29va2llc19wb2xpY3lfc2V0KEVXS19DT09L
SUVfSkFSX0FDQ0VQVF9OT19USElSRF9QQVJUWSk7CisKKyAgICBld2tfZnJhbWVfb3BlbmVyX2Ns
ZWFyKGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KGJyb3dzZXIpKTsKK30KKworc3RhdGljIHZvaWQg
aW5pdGlhbGl6ZUZvbnRzKHZvaWQpCit7CisgICAgRmNJbml0KCk7CisKKyAgICBzdGF0aWMgaW50
IG51bUZvbnRzID0gMDsKKyAgICBGY0ZvbnRTZXQqIGFwcEZvbnRTZXQgPSBGY0NvbmZpZ0dldEZv
bnRzKDAsIEZjU2V0QXBwbGljYXRpb24pOworICAgIGlmIChhcHBGb250U2V0ICYmIG51bUZvbnRz
ICYmIGFwcEZvbnRTZXQtPm5mb250ID09IG51bUZvbnRzKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBMb2FkIG91ciBjb25maWd1cmF0aW9uIGZpbGUsIHdoaWNoIHNldHMgdXAgcHJvcGVyIGFs
aWFzZXMgZm9yIGZhbWlseQorICAgIC8vIG5hbWVzIGxpa2Ugc2Fucywgc2VyaWYgYW5kIG1vbm9z
cGFjZS4KKyAgICBGY0NvbmZpZyogY29uZmlnID0gRmNDb25maWdDcmVhdGUoKTsKKyAgICBjb25z
dCBjaGFyKiBmb250Q29uZmlnRmlsZW5hbWUgPSBGT05UU19DT05GX0RJUiAiL2ZvbnRzLmNvbmYi
OworICAgIGlmICghRmNDb25maWdQYXJzZUFuZExvYWQoY29uZmlnLCByZWludGVycHJldF9jYXN0
PGNvbnN0IEZjQ2hhcjgqPihmb250Q29uZmlnRmlsZW5hbWUpLCB0cnVlKSkgeworICAgICAgICBm
cHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGxvYWQgZm9udCBjb25maWd1cmF0aW9uIGZpbGUgZnJv
bTogJXNcbiIsIGZvbnRDb25maWdGaWxlbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQor
CisgICAgLy8gRklYTUU6IERvIG5vdCBoYXJkY29kZSB0aGlzIHBhdGhzIGhlcmUuCisgICAgc3Rh
dGljIGNvbnN0IGNoYXIqIGNvbnN0IGZvbnREaXJQYXRoc1tdID0geworICAgICAgICAiL3Vzci9z
aGFyZS9mb250cy9UVEYvIiwKKyAgICAgICAgIi91c3Ivc2hhcmUvZm9udHMvdHJ1ZXR5cGUvdHRm
LWxpYmVyYXRpb24vIiwKKyAgICAgICAgIi91c3Ivc2hhcmUvZm9udHMvbGliZXJhdGlvbi8iLAor
ICAgICAgICAiL3Vzci9zaGFyZS9mb250cy90cnVldHlwZS90dGYtZGVqYXZ1LyIsCisgICAgICAg
ICIvdXNyL3NoYXJlL2ZvbnRzL2RlamF2dS8iLAorCisgICAgICAgIC8vIE1hdGhNTCB0ZXN0cyBy
ZXF1aXJlIHRoZSBTVElYIGZvbnRzLgorICAgICAgICAiL3Vzci9zaGFyZS9mb250cy9PVEYvIiwK
KyAgICAgICAgIi91c3Ivc2hhcmUvZm9udHMvb3BlbnR5cGUvc3RpeC8iLAorICAgICAgICAiL3Vz
ci9zaGFyZS9mb250cy9zdGl4LyIKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgZm9udCA9IDA7
IGZvbnQgPCAoc2l6ZW9mKGZvbnREaXJQYXRocykgLyBzaXplb2YoZm9udERpclBhdGhzWzBdKSk7
ICsrZm9udCkgeworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgaWYgKGVj
b3JlX2ZpbGVfaXNfZGlyKGZvbnREaXJQYXRoc1tmb250XSkpIHsKKyAgICAgICAgICAgIGZvdW5k
ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghRmNDb25maWdBcHBGb250QWRkRGlyKGNvbmZpZywg
cmVpbnRlcnByZXRfY2FzdDxjb25zdCBGY0NoYXI4Kj4oZm9udERpclBhdGhzW2ZvbnRdKSkpIHsK
KyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBsb2FkIGZvbnQgYXQg
JXMhIiwgZm9udERpclBhdGhzW2ZvbnRdKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAg
ICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAg
ICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5v
dCBmaW5kIGZvbnQgZGlyZWN0b3J5IGF0ICVzLiBFaXRoZXIgaW5zdGFsbCB0aGlzIGZvbnQgb3Ig
ZmlsZSBhIGJ1ZyAiCisgICAgICAgICAgICAgICAgICAgICJhdCBodHRwOi8vYnVncy53ZWJraXQu
b3JnIGlmIGl0IGlzIGluc3RhbGxlZCBpbiBhbm90aGVyIGxvY2F0aW9uLlxuIiwKKyAgICAgICAg
ICAgICAgICAgICAgZm9udERpclBhdGhzW2ZvbnRdKTsKKyAgICAgICAgICAgIGV4aXQoMSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBaGVtIGlzIHVzZWQgYnkgbWFueSBsYXlvdXQgdGVz
dHMuCisgICAgY29uc3QgY2hhciogYWhlbUZvbnRGaWxlbmFtZSA9IEZPTlRTX0NPTkZfRElSICIv
QUhFTV9fX18uVFRGIjsKKyAgICBpZiAoIUZjQ29uZmlnQXBwRm9udEFkZEZpbGUoY29uZmlnLCBy
ZWludGVycHJldF9jYXN0PGNvbnN0IEZjQ2hhcjgqPihhaGVtRm9udEZpbGVuYW1lKSkpIHsKKyAg
ICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgbG9hZCBmb250IGF0ICVzIVxuIiwgYWhl
bUZvbnRGaWxlbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZm9yIChpbnQg
aSA9IDE7IGkgPD0gOTsgaSsrKSB7CisgICAgICAgIGNoYXIgZm9udFBhdGhbUEFUSF9NQVhdOwor
ICAgICAgICBzbnByaW50Zihmb250UGF0aCwgUEFUSF9NQVggLSAxLCBGT05UU19DT05GX0RJUiAi
Ly4uLy4uL2ZvbnRzL1dlYktpdFdlaWdodFdhdGNoZXIlaTAwLnR0ZiIsIGkpOworICAgICAgICBp
ZiAoIUZjQ29uZmlnQXBwRm9udEFkZEZpbGUoY29uZmlnLCByZWludGVycHJldF9jYXN0PEZjQ2hh
cjgqPihmb250UGF0aCkpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5v
dCBsb2FkIGZvbnQgYXQgJXMhXG4iLCBmb250UGF0aCk7CisgICAgICAgICAgICBleGl0KDEpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgLy8gQSBmb250IHdpdGggbm8gdmFsaWQgRm9udGNvbmZp
ZyBlbmNvZGluZyB0byB0ZXN0IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD00NzQ1MgorICAgIGNvbnN0IGNoYXIqIGZvbnRXaXRoTm9WYWxpZEVuY29kaW5nRmlsZW5hbWUg
PSBGT05UU19DT05GX0RJUiAiL0ZvbnRXaXRoTm9WYWxpZEVuY29kaW5nLmZvbiI7CisgICAgaWYg
KCFGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlKGNvbmZpZywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBG
Y0NoYXI4Kj4oZm9udFdpdGhOb1ZhbGlkRW5jb2RpbmdGaWxlbmFtZSkpKSB7CisgICAgICAgIGZw
cmludGYoc3RkZXJyLCAiQ291bGQgbm90IGxvYWQgZm9udCBhdCAlcyFcbiIsIGZvbnRXaXRoTm9W
YWxpZEVuY29kaW5nRmlsZW5hbWUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGlm
ICghRmNDb25maWdTZXRDdXJyZW50KGNvbmZpZykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIs
ICJDb3VsZCBub3Qgc2V0IHRoZSBjdXJyZW50IGZvbnQgY29uZmlndXJhdGlvbiFcbiIpOworICAg
ICAgICBleGl0KDEpOworICAgIH0KKworICAgIG51bUZvbnRzID0gRmNDb25maWdHZXRGb250cyhj
b25maWcsIEZjU2V0QXBwbGljYXRpb24pLT5uZm9udDsKK30KKworc3RhdGljIHZvaWQgcnVuVGVz
dChjb25zdCBzdHJpbmcmIHRlc3RQYXRoT3JVUkwpCit7CisgICAgQVNTRVJUKCF0ZXN0UGF0aE9y
VVJMLmVtcHR5KCkpOworCisgICAgc3RyaW5nIHRlc3RVUkwodGVzdFBhdGhPclVSTCk7CisgICAg
c3RyaW5nIGV4cGVjdGVkUGl4ZWxIYXNoOworICAgIHNpemVfdCBzZXBhcmF0b3JQb3MgPSB0ZXN0
VVJMLmZpbmQoIiciKTsKKyAgICBpZiAoc2VwYXJhdG9yUG9zICE9IHN0cmluZzo6bnBvcykgewor
ICAgICAgICB0ZXN0VVJMID0gc3RyaW5nKHRlc3RQYXRoT3JVUkwsIDAsIHNlcGFyYXRvclBvcyk7
CisgICAgICAgIGV4cGVjdGVkUGl4ZWxIYXNoID0gc3RyaW5nKHRlc3RQYXRoT3JVUkwsIHNlcGFy
YXRvclBvcyArIDEpOworICAgIH0KKworICAgIC8vIENvbnZlcnQgdGhlIHBhdGggaW50byBhIGZ1
bGwgZmlsZSBVUkwgaWYgaXQgZG9lcyBub3QgbG9vaworICAgIC8vIGxpa2UgYW4gSFRUUC9TIFVS
TCAoZG9lc24ndCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLgorICAgIGlmICh0ZXN0
VVJMLmZpbmQoImh0dHA6Ly8iKSAmJiB0ZXN0VVJMLmZpbmQoImh0dHBzOi8vIikpIHsKKyAgICAg
ICAgY2hhciogZmlsZVBhdGggPSBlY29yZV9maWxlX3JlYWxwYXRoKHRlc3RVUkwuY19zdHIoKSk7
CisKKyAgICAgICAgaWYgKGVjb3JlX2ZpbGVfZXhpc3RzKGZpbGVQYXRoKSkgeworICAgICAgICAg
ICAgY2hhciogZmlsZVVybDsKKworICAgICAgICAgICAgY29uc3QgaW50IHJldCA9IGFzcHJpbnRm
KCZmaWxlVXJsLCAiZmlsZTovLyVzIiwgZmlsZVBhdGgpOworICAgICAgICAgICAgQVNTRVJUKHJl
dCA+IDApOworCisgICAgICAgICAgICB0ZXN0VVJMID0gZmlsZVVybDsKKyAgICAgICAgICAgIGZy
ZWUoZmlsZVVybCk7CisgICAgICAgIH0KKworICAgICAgICBmcmVlKGZpbGVQYXRoKTsKKyAgICB9
CisKKyAgICByZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKCk7CisKKyAgICBnTGF5b3V0
VGVzdENvbnRyb2xsZXIgPSBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y3JlYXRlKHRlc3RVUkwsIGV4
cGVjdGVkUGl4ZWxIYXNoKTsKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOworICAgIGRvbmUgPSBm
YWxzZTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0SWNvbkRhdGFiYXNlRW5hYmxl
ZChmYWxzZSk7CisKKyAgICBpZiAoc2hvdWxkTG9nRnJhbWVMb2FkRGVsZWdhdGVzKHRlc3RVUkwp
KQorICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBGcmFtZUxvYWRDYWxsYmFj
a3ModHJ1ZSk7CisKKyAgICBpZiAoc2hvdWxkRW5hYmxlRGV2ZWxvcGVyRXh0cmFzKHRlc3RVUkwp
KSB7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5h
YmxlZCh0cnVlKTsKKyAgICAgICAgaWYgKHNob3VsZER1bXBBc1RleHQodGVzdFVSTCkpIHsKKyAg
ICAgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEFzVGV4dCh0cnVlKTsKKyAg
ICAgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQaXhlbFJlc3VsdHMo
ZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgV29ya1F1ZXVlOjpzaGFyZWQoKS0+Y2xl
YXIoKTsKKyAgICBXb3JrUXVldWU6OnNoYXJlZCgpLT5zZXRGcm96ZW4oZmFsc2UpOworCisgICAg
Ym9vbCBpc1NWR1czQ1Rlc3QgPSAodGVzdFVSTC5maW5kKCJzdmcvVzNDLVNWRy0xLjEiKSAhPSBz
dHJpbmc6Om5wb3MpOworICAgIGludCB3aWR0aCA9IGlzU1ZHVzNDVGVzdCA/IDQ4MCA6IExheW91
dFRlc3RDb250cm9sbGVyOjptYXhWaWV3V2lkdGg7CisgICAgaW50IGhlaWdodCA9IGlzU1ZHVzND
VGVzdCA/IDM2MCA6IExheW91dFRlc3RDb250cm9sbGVyOjptYXhWaWV3SGVpZ2h0OworICAgIGV2
YXNfb2JqZWN0X3Jlc2l6ZShicm93c2VyLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGlmIChwcmV2
VGVzdEJGSXRlbSkKKyAgICAgICAgZXdrX2hpc3RvcnlfaXRlbV9mcmVlKHByZXZUZXN0QkZJdGVt
KTsKKyAgICBFd2tfSGlzdG9yeSogaGlzdG9yeSA9IGV3a192aWV3X2hpc3RvcnlfZ2V0KGJyb3dz
ZXIpOworICAgIHByZXZUZXN0QkZJdGVtID0gZXdrX2hpc3RvcnlfaGlzdG9yeV9pdGVtX2N1cnJl
bnRfZ2V0KGhpc3RvcnkpOworCisgICAgaW5pdGlhbGl6ZUZvbnRzKCk7CisKKyAgICBldmFzX29i
amVjdF9mb2N1c19zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld191cmlfc2V0
KGJyb3dzZXIsIHRlc3RVUkwuY19zdHIoKSk7CisKKyAgICBlY29yZV9tYWluX2xvb3BfYmVnaW4o
KTsKKworICAgIGlmIChzaG91bGRFbmFibGVEZXZlbG9wZXJFeHRyYXModGVzdFVSTCkpIHsKKyAg
ICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5jbG9zZVdlYkluc3BlY3RvcigpOworICAgICAg
ICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldERldmVsb3BlckV4dHJhc0VuYWJsZWQoZmFsc2Up
OworICAgIH0KKworICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmNsb3NlUmVtYWluaW5n
V2luZG93c1doZW5Db21wbGV0ZSgpIHx8IHdpbmRvd0xpc3QpIHsKKyAgICAgICAgdm9pZCogd2lu
ZG93OworICAgICAgICBFSU5BX0xJU1RfRlJFRSh3aW5kb3dMaXN0LCB3aW5kb3cpIHsKKyAgICAg
ICAgICAgIGV2YXNfb2JqZWN0X2RlbChzdGF0aWNfY2FzdDxFdmFzX09iamVjdCo+KHdpbmRvdykp
OworICAgICAgICB9CisgICAgfQorCisgICAgZXdrX3ZpZXdfdXJpX3NldChicm93c2VyLCAiYWJv
dXQ6YmxhbmsiKTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci5jbGVhcigpOworICAgIHNl
bmRQaXhlbFJlc3VsdHNFT0YoKTsKK30KKworc3RhdGljIHZvaWQgcnVuVGVzdGluZ1NlcnZlckxv
b3Aodm9pZCkKK3sKKyAgICBjaGFyIGZpbGVOYW1lW1BBVEhfTUFYXTsKKworICAgIHdoaWxlIChm
Z2V0cyhmaWxlTmFtZSwgc2l6ZW9mKGZpbGVOYW1lKSwgc3RkaW4pKSB7CisgICAgICAgIGNoYXIq
IG5ld0xpbmUgPSBzdHJyY2hyKGZpbGVOYW1lLCAnXG4nKTsKKyAgICAgICAgaWYgKG5ld0xpbmUp
CisgICAgICAgICAgICAqbmV3TGluZSA9ICdcMCc7CisKKyAgICAgICAgaWYgKGZpbGVOYW1lWzBd
ICE9ICdcMCcpCisgICAgICAgICAgICBydW5UZXN0KGZpbGVOYW1lKTsKKyAgICB9Cit9CisKK2lu
dCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBpZiAoIWVjb3JlX2V2YXNfaW5p
dCgpKQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIGlmICghZWNvcmVfZmlsZV9p
bml0KCkpIHsKKyAgICAgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworICAgICAgICByZXR1cm4g
RVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoIWVkamVfaW5pdCgpKSB7CisgICAgICAgIGVj
b3JlX2ZpbGVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworICAg
ICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBld2tfaW5pdCgpOworCisgICAg
cGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywgYXJndik7CisKKyAgICBpZiAodXNlWDExV2lu
ZG93KQorICAgICAgICBlZSA9IGVjb3JlX2V2YXNfbmV3KDAsIDAsIDAsIFdJRFRILCBIRUlHSFQs
IDApOworICAgIGVsc2UKKyAgICAgICAgZWUgPSBlY29yZV9ldmFzX2J1ZmZlcl9uZXcoV0lEVEgs
IEhFSUdIVCk7CisgICAgaWYgKCFlZSkKKyAgICAgICAgZ290byBzaHV0ZG93bjsKKworICAgIGVj
b3JlX2V2YXNfdGl0bGVfc2V0KGVlLCAiRUZMIER1bXBSZW5kZXJUcmVlIik7CisgICAgZWNvcmVf
ZXZhc19jYWxsYmFja19yZXNpemVfc2V0KGVlLCBvbkVjb3JlRXZhc1Jlc2l6ZSk7CisgICAgZWNv
cmVfZXZhc19jYWxsYmFja19kZWxldGVfcmVxdWVzdF9zZXQoZWUsIG9uQ2xvc2VXaW5kb3cpOwor
CisgICAgZXZhcyA9IGVjb3JlX2V2YXNfZ2V0KGVlKTsKKyAgICBpZiAoIWV2YXMpCisgICAgICAg
IGdvdG8gc2h1dGRvd247CisKKyAgICBicm93c2VyID0gZHJ0X3ZpZXdfdGlsZWRfYWRkKGV2YXMp
OworICAgIGlmICghYnJvd3NlcikKKyAgICAgICAgZ290byBzaHV0ZG93bjsKKyAgICBldmFzX29i
amVjdF9uYW1lX3NldChicm93c2VyLCAiYnJvd3NlciIpOworICAgIGV3a192aWV3X3RoZW1lX3Nl
dChicm93c2VyLCBEQVRBX0RJUiIvZGVmYXVsdC5lZGoiKTsKKworICAgIGV2YXNfb2JqZWN0X3Nt
YXJ0X2NhbGxiYWNrX2FkZChicm93c2VyLCAibG9hZCxzdGFydGVkIiwgb25Mb2FkU3RhcnRlZCwg
MCk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJsb2FkLGZp
bmlzaGVkIiwgb25Mb2FkRmluaXNoZWQsIDApOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxi
YWNrX2FkZChicm93c2VyLCAidGl0bGUsY2hhbmdlZCIsIG9uVGl0bGVDaGFuZ2VkLCAwKTsKKyAg
ICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQoYnJvd3NlciwgIndpbmRvdyxvYmplY3Qs
Y2xlYXJlZCIsIG9uV2luZG93T2JqZWN0Q2xlYXJlZCwgMCk7CisgICAgZXZhc19vYmplY3Rfc21h
cnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJzdGF0dXNiYXIsdGV4dCxzZXQiLCBvblN0YXR1c2Jh
clRleHRTZXQsIDApOworCisgICAgZXZhc19vYmplY3RfbW92ZShicm93c2VyLCAwLCAwKTsKKyAg
ICBldmFzX29iamVjdF9yZXNpemUoYnJvd3NlciwgV0lEVEgsIEhFSUdIVCk7CisKKyAgICBldmFz
X29iamVjdF9sYXllcl9zZXQoYnJvd3NlciwgRVZBU19MQVlFUl9NQVgpOworICAgIGV2YXNfb2Jq
ZWN0X3Nob3coYnJvd3Nlcik7CisgICAgZWNvcmVfZXZhc19zaG93KGVlKTsKKworICAgIGV2YXNf
b2JqZWN0X2ZvY3VzX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworCisgICAgbWFpbkZyYW1lID0g
ZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQoYnJvd3Nlcik7CisKKyAgICBldmFzX29iamVjdF9zbWFy
dF9jYWxsYmFja19hZGQobWFpbkZyYW1lLCAibG9hZCxkb2N1bWVudCxmaW5pc2hlZCIsIG9uRG9j
dW1lbnRMb2FkRmluaXNoZWQsIDApOworCisgICAgcmVzZXREZWZhdWx0c1RvQ29uc2lzdGVudFZh
bHVlcygpOworCisgICAgZ2NDb250cm9sbGVyID0gbmV3IEdDQ29udHJvbGxlcigpOworCisgICAg
aWYgKHVzZUxvbmdSdW5uaW5nU2VydmVyTW9kZShhcmdjLCBhcmd2KSkgeworICAgICAgICBwcmlu
dFNlcGFyYXRvcnMgPSB0cnVlOworICAgICAgICBydW5UZXN0aW5nU2VydmVyTG9vcCgpOworICAg
IH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBwcmludFNlcGFyYXRvcnMgPSAob3B0
aW5kIDwgYXJnYyAtIDEgfHwgKGR1bXBQaXhlbHMgJiYgZHVtcFRyZWUpKTsKKyAgICAgICAgZm9y
IChpID0gb3B0aW5kOyBpICE9IGFyZ2M7ICsraSkKKyAgICAgICAgICAgIHJ1blRlc3QoYXJndltp
XSk7CisgICAgfQorCitzaHV0ZG93bjoKKyAgICBpZiAoZ2NDb250cm9sbGVyKSB7CisgICAgICAg
IGRlbGV0ZSBnY0NvbnRyb2xsZXI7CisgICAgICAgIGdjQ29udHJvbGxlciA9IDA7CisgICAgfQor
ICAgIGlmIChlZSkKKyAgICAgICAgZWNvcmVfZXZhc19mcmVlKGVlKTsKKyAgICBld2tfc2h1dGRv
d24oKTsKKyAgICBlZGplX3NodXRkb3duKCk7CisgICAgZWNvcmVfZmlsZV9zaHV0ZG93bigpOwor
ICAgIGVjb3JlX2V2YXNfc2h1dGRvd24oKTsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpJ
bmRleDogVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlRWZsLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlRWZsLmgJKHJl
dmlzaW9uIDApCisrKyBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWVFZmwu
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1
bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWQgaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIER1bXBSZW5kZXJUcmVlRWZsX2gK
KyNkZWZpbmUgRHVtcFJlbmRlclRyZWVFZmxfaAorCisjaW5jbHVkZSAiTGF5b3V0VGVzdENvbnRy
b2xsZXIuaCIKKyNpbmNsdWRlIDxFY29yZS5oPgorI2luY2x1ZGUgPEV2YXMuaD4KKyNpbmNsdWRl
IDxKYXZhU2NyaXB0Q29yZS9KU0Jhc2UuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK2V4
dGVybiBFY29yZV9UaW1lciogd2FpdFRvRHVtcFdhdGNoZG9nOworZXh0ZXJuIEVpbmFfTGlzdCog
d2luZG93TGlzdDsKK2V4dGVybiBFdmFzX09iamVjdCogYnJvd3NlcjsKK2V4dGVybiBFdmFzX09i
amVjdCogbWFpbkZyYW1lOworZXh0ZXJuIEV2YXNfT2JqZWN0KiB0b3BMb2FkaW5nRnJhbWU7Citl
eHRlcm4gUmVmUHRyPExheW91dFRlc3RDb250cm9sbGVyPiBnTGF5b3V0VGVzdENvbnRyb2xsZXI7
CitleHRlcm4gYm9vbCB3YWl0Rm9yUG9saWN5OworCitjaGFyKiBKU1N0cmluZ0NvcHlVVEY4Q1N0
cmluZyhKU1N0cmluZ1JlZik7CisKKyNlbmRpZiAvKiBEdW1wUmVuZGVyVHJlZUVmbF9oICovCg==
</data>
<flag name="review"
          id="89540"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98012</attachid>
            <date>2011-06-21 11:01:25 -0700</date>
            <delta_ts>2011-06-21 12:25:13 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-62034-20110621150447.patch</filename>
            <type>text/plain</type>
            <size>30261</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODkzNjIKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA5MTE3OTAyMmQ3NTFlZjhlZWM4NGI1Y2I2NGJkYzk4ZjNl
YzQzMTQyLi5hNzlhNDhlZmFmYTZkMDE5MGZjM2E3MTMwODAxYTUyMmQ0MTkzZDhjIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTkg
QEAKKzIwMTEtMDYtMjEgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9uLm1vYmk+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0VGTF0g
RFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwIGFuZCBEdW1wUmVuZGVyVHJlZUVmbC5oIGFsb25n
IHdpdGgKKyAgICAgICAgc3VwcG9ydCBmaWxlcy4KKyAgICAgICAgQnVpbGQgc3lzdGVtIGNoYW5n
ZXMgd2lsbCBiZSB1cHN0cmVhbWVkIGFzIHNvb24gYXMgb3RoZXIgRFJULXJlbGF0ZWQKKyAgICAg
ICAgZmlsZXMgYXJlIGFsc28gb24gdGhlIHRyZWUuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MjAzNAorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUv
ZWZsL0R1bXBSZW5kZXJUcmVlLmNwcDogQWRkZWQuCisgICAgICAgIChkdW1wRnJhbWVzQXNUZXh0
KToKKyAgICAgICAgKGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZExv
Z0ZyYW1lTG9hZERlbGVnYXRlcyk6CisgICAgICAgIChzaG91bGREdW1wQXNUZXh0KToKKyAgICAg
ICAgKHNlbmRQaXhlbFJlc3VsdHNFT0YpOgorICAgICAgICAoaW52YWxpZGF0ZUFueVByZXZpb3Vz
V2FpdFRvRHVtcFdhdGNoZG9nKToKKyAgICAgICAgKHByb2Nlc3NXb3JrKToKKyAgICAgICAgKGFk
ZENvbnRyb2xsZXJUb1dpbmRvdyk6CisgICAgICAgIChvbldpbmRvd09iamVjdENsZWFyZWQpOgor
ICAgICAgICAob25TdGF0dXNiYXJUZXh0U2V0KToKKyAgICAgICAgKG9uTG9hZFN0YXJ0ZWQpOgor
ICAgICAgICAob25Mb2FkRmluaXNoZWQpOgorICAgICAgICAob25UaXRsZUNoYW5nZWQpOgorICAg
ICAgICAob25Eb2N1bWVudExvYWRGaW5pc2hlZCk6CisgICAgICAgIChvbkVjb3JlRXZhc1Jlc2l6
ZSk6CisgICAgICAgIChvbkNsb3NlV2luZG93KToKKyAgICAgICAgKHVzZUxvbmdSdW5uaW5nU2Vy
dmVyTW9kZSk6CisgICAgICAgIChwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyk6CisgICAgICAgIChy
ZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKToKKyAgICAgICAgKGdldEZpbmFsVGVzdFVS
TCk6CisgICAgICAgIChnZXRFeHBlY3RlZFBpeGVsSGFzaCk6CisgICAgICAgIChjcmVhdGVMYXlv
dXRUZXN0Q29udHJvbGxlcik6CisgICAgICAgIChydW5UZXN0KToKKyAgICAgICAgKHJ1blRlc3Rp
bmdTZXJ2ZXJMb29wKToKKyAgICAgICAgKGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKToKKyAg
ICAgICAgKGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KToKKyAgICAgICAgKHNob3VsZER1bXBGcmFt
ZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0
aEV4cGVjdGVkKToKKyAgICAgICAgKHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QpOgorICAgICAg
ICAoaW5pdEVmbCk6CisgICAgICAgIChzaHV0ZG93bkVmbCk6CisgICAgICAgIChkaXNwbGF5V2Vi
Vmlldyk6CisgICAgICAgIChkdW1wKToKKyAgICAgICAgKGNyZWF0ZUJyb3dzZXIpOgorICAgICAg
ICAoaW5pdEVjb3JlRXZhcyk6CisgICAgICAgIChtYWluKToKKyAgICAgICAgKiBEdW1wUmVuZGVy
VHJlZS9lZmwvRHVtcFJlbmRlclRyZWVFZmwuaDogQWRkZWQuCisgICAgICAgICogRHVtcFJlbmRl
clRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmNwcDogQWRkZWQuCisgICAgICAgIChnZXRGb250RGly
ZWN0b3JpZXMpOgorICAgICAgICAoZ2V0Rm9udEZpbGVzKToKKyAgICAgICAgKGFkZEZvbnREaXJl
Y3Rvcmllcyk6CisgICAgICAgIChhZGRGb250RmlsZXMpOgorICAgICAgICAoYWRkRm9udHNUb0Vu
dmlyb25tZW50KToKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQu
aDogQWRkZWQuCisKIDIwMTEtMDYtMjAgIERtaXRyeSBMb21vdiAgPGRzbG9tb3ZAZ29vZ2xlLmNv
bT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZpZCBMZXZpbi4KZGlmZiAtLWdpdCBhL1Rvb2xz
L0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHAgYi9Ub29scy9EdW1wUmVuZGVy
VHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjAzZWVmYWE3NDAzNzEyOGQ4
YWNiNTY5MzExNTRlNDliMTI2ZDExMTAKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVu
ZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwCkBAIC0wLDAgKzEsNTY0IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmln
aHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlLmgiCisKKyNpbmNsdWRlICJEdW1wSGlz
dG9yeUl0ZW0uaCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZVZpZXcuaCIKKyNpbmNsdWRlICJF
dmVudFNlbmRlci5oIgorI2luY2x1ZGUgIkZvbnRNYW5hZ2VtZW50LmgiCisjaW5jbHVkZSAiR0ND
b250cm9sbGVyLmgiCisjaW5jbHVkZSAiTGF5b3V0VGVzdENvbnRyb2xsZXIuaCIKKyNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBpeGVsRHVtcFN1cHBvcnQuaCIKKyNpbmNs
dWRlICJXb3JrUXVldWUuaCIKKyNpbmNsdWRlICJld2tfcHJpdmF0ZS5oIiAvLyBGSVhNRTogY3Jl
YXRlIHNvbWUgV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWUuY3BwIGluc3RlYWQKKyNpbmNs
dWRlIDxFV2ViS2l0Lmg+CisjaW5jbHVkZSA8RWNvcmUuaD4KKyNpbmNsdWRlIDxFY29yZV9FdmFz
Lmg+CisjaW5jbHVkZSA8RWNvcmVfRmlsZS5oPgorI2luY2x1ZGUgPEVkamUuaD4KKyNpbmNsdWRl
IDxFdmFzLmg+CisjaW5jbHVkZSA8Zm9udGNvbmZpZy9mb250Y29uZmlnLmg+CisjaW5jbHVkZSA8
Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGV4dC9DU3RyaW5nLmg+
CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8d3RmL093bkZhc3RNYWxsb2NQdHIuaD4K
KyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK0V2YXNfT2JqZWN0KiBicm93c2VyID0gMDsKK0V2
YXNfT2JqZWN0KiBtYWluRnJhbWUgPSAwOworRXZhc19PYmplY3QqIHRvcExvYWRpbmdGcmFtZSA9
IDA7Citib29sIHdhaXRGb3JQb2xpY3kgPSBmYWxzZTsKK0Vjb3JlX1RpbWVyKiB3YWl0VG9EdW1w
V2F0Y2hkb2cgPSAwOworZXh0ZXJuIEV3a19IaXN0b3J5X0l0ZW0qIHByZXZUZXN0QkZJdGVtOwor
CisvLyBGcm9tIHRoZSB0b3AtbGV2ZWwgRHVtcFJlbmRlclRyZWUuaAorUmVmUHRyPExheW91dFRl
c3RDb250cm9sbGVyPiBnTGF5b3V0VGVzdENvbnRyb2xsZXI7Cit2b2xhdGlsZSBib29sIGRvbmUg
PSBmYWxzZTsKKworc3RhdGljIGludCBkdW1wUGl4ZWxzID0gZmFsc2U7CitzdGF0aWMgaW50IGR1
bXBUcmVlID0gdHJ1ZTsKK3N0YXRpYyBpbnQgcHJpbnRTZXBhcmF0b3JzID0gdHJ1ZTsKK3N0YXRp
YyBpbnQgdXNlWDExV2luZG93ID0gZmFsc2U7CisKK3N0YXRpYyBXVEY6OlN0cmluZyBkdW1wRnJh
bWVzQXNUZXh0KEV2YXNfT2JqZWN0KiBmcmFtZSkKK3sKKyAgICBPd25GYXN0TWFsbG9jUHRyPGNo
YXI+IGlubmVyVGV4dChld2tfZnJhbWVfaW5uZXJfdGV4dF9nZXQoZnJhbWUpKTsKKyAgICBXVEY6
OlN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQoYnJvd3Nl
cikgPT0gZnJhbWUpCisgICAgICAgIHJlc3VsdCA9IFdURjo6U3RyaW5nOjpmcm9tVVRGOChpbm5l
clRleHQuZ2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gV1RGOjpTdHJpbmc6OmZv
cm1hdCgiXG4tLS0tLS0tLVxuRnJhbWU6ICclcydcbi0tLS0tLS0tXG4lc1xuIiwgZXdrX2ZyYW1l
X25hbWVfZ2V0KGZyYW1lKSwgaW5uZXJUZXh0LmdldCgpKTsKKworICAgIGlmIChnTGF5b3V0VGVz
dENvbnRyb2xsZXItPmR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpKSB7CisgICAgICAgIEVpbmFfSXRl
cmF0b3IqIGNoaWxkcmVuID0gZXdrX2ZyYW1lX2NoaWxkcmVuX2l0ZXJhdG9yX25ldyhmcmFtZSk7
CisgICAgICAgIEV2YXNfT2JqZWN0KiBjaGlsZDsKKworICAgICAgICBFSU5BX0lURVJBVE9SX0ZP
UkVBQ0goY2hpbGRyZW4sIGNoaWxkKSB7CisgICAgICAgICAgICBXVEY6OlN0cmluZyB0ZW1wVGV4
dChkdW1wRnJhbWVzQXNUZXh0KGNoaWxkKSk7CisKKyAgICAgICAgICAgIGlmICh0ZW1wVGV4dC5p
c0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHJlc3Vs
dC5hcHBlbmQodGVtcFRleHQpOworICAgICAgICB9CisKKyAgICAgICAgZWluYV9pdGVyYXRvcl9m
cmVlKGNoaWxkcmVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMg
dm9pZCBkdW1wRnJhbWVTY3JvbGxQb3NpdGlvbihFdmFzX09iamVjdCogbWFpbkZyYW1lKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZExvZ0ZyYW1lTG9h
ZERlbGVnYXRlcyhjb25zdCBXVEY6OlN0cmluZyYgcGF0aE9yVVJMKQoreworICAgIHJldHVybiBw
YXRoT3JVUkwuY29udGFpbnMoImxvYWRpbmcvIik7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZER1
bXBBc1RleHQoY29uc3QgV1RGOjpTdHJpbmcmIHBhdGhPclVSTCkKK3sKKyAgICByZXR1cm4gcGF0
aE9yVVJMLmNvbnRhaW5zKCJkdW1wQXNUZXh0LyIpOworfQorCitzdGF0aWMgdm9pZCBzZW5kUGl4
ZWxSZXN1bHRzRU9GKCkKK3sKKyAgICBwdXRzKCIjRU9GIik7CisgICAgZmZsdXNoKHN0ZG91dCk7
CisgICAgZmZsdXNoKHN0ZGVycik7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVBbnlQcmV2
aW91c1dhaXRUb0R1bXBXYXRjaGRvZygpCit7CisgICAgaWYgKHdhaXRUb0R1bXBXYXRjaGRvZykg
eworICAgICAgICBlY29yZV90aW1lcl9kZWwod2FpdFRvRHVtcFdhdGNoZG9nKTsKKyAgICAgICAg
d2FpdFRvRHVtcFdhdGNoZG9nID0gMDsKKyAgICB9CisgICAgd2FpdEZvclBvbGljeSA9IGZhbHNl
OworfQorCitzdGF0aWMgRWluYV9Cb29sIHByb2Nlc3NXb3JrKHZvaWQqIGRhdGEpCit7CisgICAg
aWYgKFdvcmtRdWV1ZTo6c2hhcmVkKCktPnByb2Nlc3NXb3JrKCkgJiYgIWdMYXlvdXRUZXN0Q29u
dHJvbGxlci0+d2FpdFRvRHVtcCgpKQorICAgICAgICBkdW1wKCk7CisgICAgcmV0dXJuIEVDT1JF
X0NBTExCQUNLX0NBTkNFTDsKK30KKworc3RhdGljIHZvaWQgYWRkQ29udHJvbGxlclRvV2luZG93
KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiB3aW5kb3dPYmplY3QsIGNvbnN0IGNo
YXIqIGNvbnRyb2xsZXJOYW1lLCBKU1ZhbHVlUmVmIGNvbnRyb2xsZXIpCit7CisgICAgSlNTdHJp
bmdSZWYgY29udHJvbGxlck5hbWVTdHIgPSBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyhj
b250cm9sbGVyTmFtZSk7CisgICAgSlNPYmplY3RTZXRQcm9wZXJ0eShjb250ZXh0LCB3aW5kb3dP
YmplY3QsIGNvbnRyb2xsZXJOYW1lU3RyLCBjb250cm9sbGVyLCBrSlNQcm9wZXJ0eUF0dHJpYnV0
ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlLCAwKTsKKyAgICBKU1N0
cmluZ1JlbGVhc2UoY29udHJvbGxlck5hbWVTdHIpOworfQorCitzdGF0aWMgdm9pZCBvbldpbmRv
d09iamVjdENsZWFyZWQodm9pZCogdXNlckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBl
dmVudEluZm8pCit7CisgICAgRXdrX1dpbmRvd19PYmplY3RfQ2xlYXJlZF9FdmVudCogb2JqZWN0
Q2xlYXJlZEluZm8gPSBzdGF0aWNfY2FzdDxFd2tfV2luZG93X09iamVjdF9DbGVhcmVkX0V2ZW50
Kj4oZXZlbnRJbmZvKTsKKyAgICBKU1ZhbHVlUmVmIGV4Y2VwdGlvbiA9IDA7CisgICAgQVNTRVJU
KGdMYXlvdXRUZXN0Q29udHJvbGxlcik7CisKKyAgICBHQ0NvbnRyb2xsZXIqIGdjQ29udHJvbGxl
ciA9IHN0YXRpY19jYXN0PEdDQ29udHJvbGxlcio+KHVzZXJEYXRhKTsKKyAgICBBU1NFUlQoZ2ND
b250cm9sbGVyKTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+bWFrZVdpbmRvd09iamVj
dChvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgb2JqZWN0Q2xlYXJlZEluZm8tPndpbmRvd09i
amVjdCwgJmV4Y2VwdGlvbik7CisgICAgQVNTRVJUKCFleGNlcHRpb24pOworCisgICAgZ2NDb250
cm9sbGVyLT5tYWtlV2luZG93T2JqZWN0KG9iamVjdENsZWFyZWRJbmZvLT5jb250ZXh0LCBvYmpl
Y3RDbGVhcmVkSW5mby0+d2luZG93T2JqZWN0LCAmZXhjZXB0aW9uKTsKKyAgICBBU1NFUlQoIWV4
Y2VwdGlvbik7CisKKyAgICAvKiBGSVhNRSBzL2ZhbHNlLyFnZXRfcGFyZW50LyAqLworICAgIGFk
ZENvbnRyb2xsZXJUb1dpbmRvdyhvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgb2JqZWN0Q2xl
YXJlZEluZm8tPndpbmRvd09iamVjdCwgImV2ZW50U2VuZGVyIiwgbWFrZUV2ZW50U2VuZGVyKG9i
amVjdENsZWFyZWRJbmZvLT5jb250ZXh0LCBmYWxzZSkpOworfQorCitzdGF0aWMgdm9pZCBvblN0
YXR1c2JhclRleHRTZXQodm9pZCogdXNlckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBl
dmVudEluZm8pCit7CisgICAgaWYgKCFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBTdGF0dXND
YWxsYmFja3MoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgY2hhciogc3RhdHVzYmFy
VGV4dCA9IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihldmVudEluZm8pOworICAgIHByaW50Zigi
VUkgREVMRUdBVEUgU1RBVFVTIENBTExCQUNLOiBzZXRTdGF0dXNUZXh0OiVzXG4iLCBzdGF0dXNi
YXJUZXh0KTsKK30KKworc3RhdGljIHZvaWQgb25Mb2FkU3RhcnRlZCh2b2lkKiB1c2VyRGF0YSwg
RXZhc19PYmplY3QqIHZpZXcsIHZvaWQqIGV2ZW50SW5mbykKK3sKKyAgICAvLyBGSVhNRTogd2Ug
YWN0dWFsbHkgbmVlZCB0aGUgZnJhbWUgcmVsYXRlZCB0byB0aGlzIGV2ZW50CisgICAgRXZhc19P
YmplY3QqIGZyYW1lID0gZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQodmlldyk7CisKKyAgICAvLyBN
YWtlIHN1cmUgd2Ugb25seSBzZXQgdGhpcyBvbmNlIHBlciB0ZXN0LiBJZiBpdCBnZXRzIGNsZWFy
ZWQsIGFuZCB0aGVuIHNldCBhZ2Fpbiwgd2UgbWlnaHQKKyAgICAvLyBlbmQgdXAgZG9pbmcgdHdv
IGR1bXBzIGZvciBvbmUgdGVzdC4KKyAgICBpZiAoIXRvcExvYWRpbmdGcmFtZSAmJiAhZG9uZSkK
KyAgICAgICAgdG9wTG9hZGluZ0ZyYW1lID0gZnJhbWU7Cit9CisKK3N0YXRpYyB2b2lkIG9uTG9h
ZEZpbmlzaGVkKHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmlldywgdm9pZCogZXZlbnRJ
bmZvKQoreworICAgIC8vIEZJWE1FOiB3ZSBhY3R1YWxseSBuZWVkIHRoZSBmcmFtZSByZWxhdGVk
IHRvIHRoaXMgZXZlbnQKKyAgICBFdmFzX09iamVjdCogZnJhbWUgPSBld2tfdmlld19mcmFtZV9t
YWluX2dldCh2aWV3KTsKKworICAgIGlmICh0b3BMb2FkaW5nRnJhbWUgIT0gZnJhbWUpCisgICAg
ICAgIHJldHVybjsKKworICAgIHRvcExvYWRpbmdGcmFtZSA9IDA7CisKKyAgICBXb3JrUXVldWU6
OnNoYXJlZCgpLT5zZXRGcm96ZW4odHJ1ZSk7CisgICAgaWYgKGdMYXlvdXRUZXN0Q29udHJvbGxl
ci0+d2FpdFRvRHVtcCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoV29ya1F1ZXVlOjpz
aGFyZWQoKS0+Y291bnQoKSkKKyAgICAgICAgZWNvcmVfaWRsZXJfYWRkKHByb2Nlc3NXb3JrLCAw
KTsKKyAgICBlbHNlCisgICAgICAgIGR1bXAoKTsKK30KKworc3RhdGljIHZvaWQgb25UaXRsZUNo
YW5nZWQodm9pZCogdXNlckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBldmVudEluZm8p
Cit7Cit9CisKK3N0YXRpYyB2b2lkIG9uRG9jdW1lbnRMb2FkRmluaXNoZWQodm9pZCogdXNlckRh
dGEsIEV2YXNfT2JqZWN0KiBmcmFtZSwgdm9pZCogZXZlbnRJbmZvKQoreworICAgIGNvbnN0IFdU
Rjo6U3RyaW5nIGZyYW1lTmFtZShld2tfZnJhbWVfc3VpdGFibGVfZHJ0X25hbWVfZ2V0KGZyYW1l
KSk7CisKKyAgICBpZiAoIWRvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRnJhbWVM
b2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiJXMgLSBkaWRGaW5pc2hEb2N1bWVudExv
YWRGb3JGcmFtZVxuIiwgZnJhbWVOYW1lLnV0ZjgoKS5kYXRhKCkpOworICAgIGVsc2UgaWYgKCFk
b25lKSB7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHBlbmRpbmdGcmFtZVVubG9hZEV2ZW50cyA9
IGV3a19mcmFtZV9wZW5kaW5nX3VubG9hZF9ldmVudF9jb3VudF9nZXQoZnJhbWUpOworICAgICAg
ICBpZiAocGVuZGluZ0ZyYW1lVW5sb2FkRXZlbnRzKQorICAgICAgICAgICAgcHJpbnRmKCIlcyAt
IGhhcyAldSBvbnVubG9hZCBoYW5kbGVyKHMpXG4iLCBmcmFtZU5hbWUudXRmOCgpLmRhdGEoKSwg
cGVuZGluZ0ZyYW1lVW5sb2FkRXZlbnRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9uRWNv
cmVFdmFzUmVzaXplKEVjb3JlX0V2YXMqIGVlKQoreworICAgIGludCB3aWR0aCwgaGVpZ2h0Owor
CisgICAgZWNvcmVfZXZhc19nZW9tZXRyeV9nZXQoZWUsIDAsIDAsICZ3aWR0aCwgJmhlaWdodCk7
CisgICAgZXZhc19vYmplY3RfbW92ZShicm93c2VyLCAwLCAwKTsKKyAgICBldmFzX29iamVjdF9y
ZXNpemUoYnJvd3Nlciwgd2lkdGgsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uQ2xvc2VX
aW5kb3coRWNvcmVfRXZhcyogZWUpCit7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgdXNlTG9uZ1J1
bm5pbmdTZXJ2ZXJNb2RlKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICByZXR1cm4gKGFy
Z2MgPT0gb3B0aW5kICsgMSAmJiAhc3RyY21wKGFyZ3Zbb3B0aW5kXSwgIi0iKSk7Cit9CisKK3N0
YXRpYyBib29sIHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikK
K3sKKyAgICBzdGF0aWMgY29uc3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICAgICAgeyJub3Ry
ZWUiLCBub19hcmd1bWVudCwgJmR1bXBUcmVlLCBmYWxzZX0sCisgICAgICAgIHsicGl4ZWwtdGVz
dHMiLCBub19hcmd1bWVudCwgJmR1bXBQaXhlbHMsIHRydWV9LAorICAgICAgICB7InRyZWUiLCBu
b19hcmd1bWVudCwgJmR1bXBUcmVlLCB0cnVlfSwKKyAgICAgICAgeyJndWkiLCBub19hcmd1bWVu
dCwgJnVzZVgxMVdpbmRvdywgdHJ1ZX0sCisgICAgICAgIHswLCAwLCAwLCAwfQorICAgIH07Cisg
ICAgaW50IG9wdGlvbjsKKworICAgIHdoaWxlICgob3B0aW9uID0gZ2V0b3B0X2xvbmcoYXJnYywg
KGNoYXIqIGNvbnN0Kilhcmd2LCAiIiwgb3B0aW9ucywgMCkpICE9IC0xKSB7CisgICAgICAgIHN3
aXRjaCAob3B0aW9uKSB7CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICBjYXNlICc6JzoKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0
cnVlOworfQorCitzdGF0aWMgdm9pZCByZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKCkK
K3sKKyAgICBld2tfc2V0dGluZ3NfaWNvbl9kYXRhYmFzZV9jbGVhcigpOworICAgIGV3a19zZXR0
aW5nc19pY29uX2RhdGFiYXNlX3BhdGhfc2V0KDApOworCisgICAgZXdrX3ZpZXdfc2V0dGluZ19w
cml2YXRlX2Jyb3dzaW5nX3NldChicm93c2VyLCBFSU5BX0ZBTFNFKTsKKyAgICBld2tfdmlld19z
ZXR0aW5nX3NwYXRpYWxfbmF2aWdhdGlvbl9zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7CisgICAg
ZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfZnJhbWVfZmxhdHRlbmluZ19zZXQoYnJvd3NlciwgRUlO
QV9GQUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19vZmZsaW5lX2FwcF9jYWNoZV9zZXQoYnJv
d3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9zY3JpcHRzX3Nl
dChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9zdGFuZGFy
ZF9zZXQoYnJvd3NlciwgIlRpbWVzIik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9z
cGFjZV9zZXQoYnJvd3NlciwgIkNvdXJpZXIiKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRf
c2VyaWZfc2V0KGJyb3dzZXIsICJUaW1lcyIpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9z
YW5zX3NlcmlmX3NldChicm93c2VyLCAiSGVsdmV0aWNhIik7CisgICAgZXdrX3ZpZXdfc2V0dGlu
Z19mb250X2N1cnNpdmVfc2V0KGJyb3dzZXIsICJjdXJzaXZlIik7CisgICAgZXdrX3ZpZXdfc2V0
dGluZ19mb250X2ZhbnRhc3lfc2V0KGJyb3dzZXIsICJmYW50YXN5Iik7CisgICAgZXdrX3ZpZXdf
c2V0dGluZ19mb250X2RlZmF1bHRfc2l6ZV9zZXQoYnJvd3NlciwgMTIpOworICAgIGV3a192aWV3
X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2l6ZV9zZXQoYnJvd3NlciwgMTApOworICAgIGV3a192
aWV3X3NldHRpbmdfZm9udF9taW5pbXVtX3NpemVfc2V0KGJyb3dzZXIsIDApOworICAgIGV3a192
aWV3X3NldHRpbmdfY2FyZXRfYnJvd3Npbmdfc2V0KGJyb3dzZXIsIEVJTkFfRkFMU0UpOworICAg
IGV3a192aWV3X3NldHRpbmdfcGFnZV9jYWNoZV9zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7Cisg
ICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfYXV0b19yZXNpemVfd2luZG93X3NldChicm93c2Vy
LCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3BsdWdpbnNfc2V0KGJy
b3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19zY3JpcHRzX3dpbmRvd19v
cGVuX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworCisgICAgZXdrX3ZpZXdfem9vbV9zZXQoYnJv
d3NlciwgMS4wLCAwLCAwKTsKKworICAgIEV3a19IaXN0b3J5KiBoaXN0b3J5ID0gZXdrX3ZpZXdf
aGlzdG9yeV9nZXQoYnJvd3Nlcik7CisgICAgaW50IGxpbWl0ID0gZXdrX2hpc3RvcnlfbGltaXRf
Z2V0KGhpc3RvcnkpOworICAgIGV3a19oaXN0b3J5X2xpbWl0X3NldChoaXN0b3J5LCAwKTsKKyAg
ICBld2tfaGlzdG9yeV9saW1pdF9zZXQoaGlzdG9yeSwgbGltaXQpOworCisgICAgZXdrX2Nvb2tp
ZXNfY2xlYXIoKTsKKyAgICBld2tfY29va2llc19wb2xpY3lfc2V0KEVXS19DT09LSUVfSkFSX0FD
Q0VQVF9OT19USElSRF9QQVJUWSk7CisKKyAgICBld2tfZnJhbWVfb3BlbmVyX2NsZWFyKGV3a192
aWV3X2ZyYW1lX21haW5fZ2V0KGJyb3dzZXIpKTsKK30KKworc3RhdGljIFdURjo6U3RyaW5nIGdl
dEZpbmFsVGVzdFVSTChjb25zdCBXVEY6OlN0cmluZyYgdGVzdFVSTCkKK3sKKyAgICBjb25zdCBz
aXplX3QgaGFzaFNlcGFyYXRvclBvcyA9IHRlc3RVUkwuZmluZCgiJyIpOworICAgIGlmIChoYXNo
U2VwYXJhdG9yUG9zICE9IG5vdEZvdW5kKQorICAgICAgICByZXR1cm4gdGVzdFVSTC5sZWZ0KGhh
c2hTZXBhcmF0b3JQb3MpOworCisgICAgLy8gQ29udmVydCB0aGUgcGF0aCBpbnRvIGEgZnVsbCBm
aWxlIFVSTCBpZiBpdCBkb2VzIG5vdCBsb29rCisgICAgLy8gbGlrZSBhbiBIVFRQL1MgVVJMIChk
b2Vzbid0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovLykuCisgICAgaWYgKCF0ZXN0VVJM
LnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAmJiAhdGVzdFVSTC5zdGFydHNXaXRoKCJodHRwczovLyIp
KSB7CisgICAgICAgIE93bkZhc3RNYWxsb2NQdHI8Y2hhcj4gZmlsZVBhdGgoZWNvcmVfZmlsZV9y
ZWFscGF0aCh0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpKTsKKworICAgICAgICBpZiAoZWNvcmVfZmls
ZV9leGlzdHMoZmlsZVBhdGguZ2V0KCkpKQorICAgICAgICAgICAgcmV0dXJuIFdURjo6U3RyaW5n
Ojpmb3JtYXQoImZpbGU6Ly8lcyIsIGZpbGVQYXRoLmdldCgpKTsKKyAgICB9CisKKyAgICByZXR1
cm4gdGVzdFVSTDsKK30KKworc3RhdGljIFdURjo6U3RyaW5nIGdldEV4cGVjdGVkUGl4ZWxIYXNo
KGNvbnN0IFdURjo6U3RyaW5nJiB0ZXN0VVJMKQoreworICAgIGNvbnN0IHNpemVfdCBoYXNoU2Vw
YXJhdG9yUG9zID0gdGVzdFVSTC5maW5kKCInIik7CisgICAgcmV0dXJuIChoYXNoU2VwYXJhdG9y
UG9zID09IG5vdEZvdW5kKSA/IHRlc3RVUkwucmlnaHQoaGFzaFNlcGFyYXRvclBvcykgOiBXVEY6
OlN0cmluZygpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVMYXlvdXRUZXN0Q29udHJvbGxlcihj
b25zdCBXVEY6OlN0cmluZyYgdGVzdFVSTCwgY29uc3QgV1RGOjpTdHJpbmcmIGV4cGVjdGVkUGl4
ZWxIYXNoKQoreworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlciA9CisgICAgICAgIExheW91dFRl
c3RDb250cm9sbGVyOjpjcmVhdGUoc3RkOjpzdHJpbmcodGVzdFVSTC51dGY4KCkuZGF0YSgpKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhleHBlY3Rl
ZFBpeGVsSGFzaC51dGY4KCkuZGF0YSgpKSk7CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOwor
ICAgIGRvbmUgPSBmYWxzZTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0SWNvbkRh
dGFiYXNlRW5hYmxlZChmYWxzZSk7CisKKyAgICBpZiAoc2hvdWxkTG9nRnJhbWVMb2FkRGVsZWdh
dGVzKHRlc3RVUkwpKQorICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBGcmFt
ZUxvYWRDYWxsYmFja3ModHJ1ZSk7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldERl
dmVsb3BlckV4dHJhc0VuYWJsZWQodHJ1ZSk7CisKKyAgICBpZiAoc2hvdWxkRHVtcEFzVGV4dCh0
ZXN0VVJMKSkgeworICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBBc1RleHQo
dHJ1ZSk7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQaXhlbFJl
c3VsdHMoZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcnVuVGVzdChjb25zdCBjaGFy
KiBjVGVzdFBhdGhPclVSTCkKK3sKKyAgICBjb25zdCBXVEY6OlN0cmluZyB0ZXN0UGF0aE9yVVJM
ID0gV1RGOjpTdHJpbmc6OmZyb21VVEY4KGNUZXN0UGF0aE9yVVJMKTsKKyAgICBBU1NFUlQoIXRl
c3RQYXRoT3JVUkwuaXNFbXB0eSgpKTsKKworICAgIGNvbnN0IFdURjo6U3RyaW5nIHRlc3RVUkwg
PSBnZXRGaW5hbFRlc3RVUkwodGVzdFBhdGhPclVSTCk7CisgICAgY29uc3QgV1RGOjpTdHJpbmcg
ZXhwZWN0ZWRQaXhlbEhhc2ggPSBnZXRFeHBlY3RlZFBpeGVsSGFzaCh0ZXN0UGF0aE9yVVJMKTsK
KworICAgIHJlc2V0RGVmYXVsdHNUb0NvbnNpc3RlbnRWYWx1ZXMoKTsKKyAgICBjcmVhdGVMYXlv
dXRUZXN0Q29udHJvbGxlcih0ZXN0VVJMLCBleHBlY3RlZFBpeGVsSGFzaCk7CisKKyAgICBXb3Jr
UXVldWU6OnNoYXJlZCgpLT5jbGVhcigpOworICAgIFdvcmtRdWV1ZTo6c2hhcmVkKCktPnNldEZy
b3plbihmYWxzZSk7CisKKyAgICBjb25zdCBib29sIGlzU1ZHVzNDVGVzdCA9IHRlc3RVUkwuY29u
dGFpbnMoInN2Zy9XM0MtU1ZHLTEuMSIpOworICAgIGNvbnN0IGludCB3aWR0aCA9IGlzU1ZHVzND
VGVzdCA/IDQ4MCA6IExheW91dFRlc3RDb250cm9sbGVyOjptYXhWaWV3V2lkdGg7CisgICAgY29u
c3QgaW50IGhlaWdodCA9IGlzU1ZHVzNDVGVzdCA/IDM2MCA6IExheW91dFRlc3RDb250cm9sbGVy
OjptYXhWaWV3SGVpZ2h0OworICAgIGV2YXNfb2JqZWN0X3Jlc2l6ZShicm93c2VyLCB3aWR0aCwg
aGVpZ2h0KTsKKworICAgIGlmIChwcmV2VGVzdEJGSXRlbSkKKyAgICAgICAgZXdrX2hpc3Rvcnlf
aXRlbV9mcmVlKHByZXZUZXN0QkZJdGVtKTsKKyAgICBjb25zdCBFd2tfSGlzdG9yeSogaGlzdG9y
eSA9IGV3a192aWV3X2hpc3RvcnlfZ2V0KGJyb3dzZXIpOworICAgIHByZXZUZXN0QkZJdGVtID0g
ZXdrX2hpc3RvcnlfaGlzdG9yeV9pdGVtX2N1cnJlbnRfZ2V0KGhpc3RvcnkpOworCisgICAgZXZh
c19vYmplY3RfZm9jdXNfc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfdXJp
X3NldChicm93c2VyLCB0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpOworCisgICAgZWNvcmVfbWFpbl9s
b29wX2JlZ2luKCk7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmNsb3NlV2ViSW5zcGVj
dG9yKCk7CisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXREZXZlbG9wZXJFeHRyYXNFbmFi
bGVkKGZhbHNlKTsKKworICAgIGV3a192aWV3X3VyaV9zZXQoYnJvd3NlciwgImFib3V0OmJsYW5r
Iik7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXIuY2xlYXIoKTsKKyAgICBzZW5kUGl4ZWxS
ZXN1bHRzRU9GKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1blRlc3RpbmdTZXJ2ZXJMb29wKCkKK3sK
KyAgICBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKworICAgIHdoaWxlIChmZ2V0cyhmaWxlbmFt
ZSwgc2l6ZW9mKGZpbGVuYW1lKSwgc3RkaW4pKSB7CisgICAgICAgIGNoYXIqIG5ld0xpbmUgPSBz
dHJyY2hyKGZpbGVuYW1lLCAnXG4nKTsKKyAgICAgICAgaWYgKG5ld0xpbmUpCisgICAgICAgICAg
ICAqbmV3TGluZSA9ICdcMCc7CisKKyAgICAgICAgaWYgKGZpbGVuYW1lWzBdICE9ICdcMCcpCisg
ICAgICAgICAgICBydW5UZXN0KGZpbGVuYW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFk
anVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKCkKK3sKKyAgICBPd25GYXN0TWFsbG9jUHRyPGNoYXI+
IHJlc3BvbnNlTWltZVR5cGUoZXdrX2ZyYW1lX3Jlc3BvbnNlX21pbWVfdHlwZV9nZXQobWFpbkZy
YW1lKSk7CisgICAgaWYgKHJlc3BvbnNlTWltZVR5cGUuZ2V0KCkgJiYgIXN0cmNtcChyZXNwb25z
ZU1pbWVUeXBlLmdldCgpLCAidGV4dC9wbGFpbiIpKSB7CisgICAgICAgIGdMYXlvdXRUZXN0Q29u
dHJvbGxlci0+c2V0RHVtcEFzVGV4dCh0cnVlKTsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9s
bGVyLT5zZXRHZW5lcmF0ZVBpeGVsUmVzdWx0cyhmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMg
dm9pZCBkdW1wRnJhbWVDb250ZW50c0FzVGV4dCgpCit7CisgICAgV1RGOjpTdHJpbmcgcmVzdWx0
OworICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBBc1RleHQoKSkKKyAgICAgICAg
cmVzdWx0ID0gZHVtcEZyYW1lc0FzVGV4dChtYWluRnJhbWUpOworICAgIGVsc2UKKyAgICAgICAg
cmVzdWx0ID0gV1RGOjpTdHJpbmc6OmZyb21VVEY4KGV3a19mcmFtZV9yZW5kZXJfdHJlZV9kdW1w
X2dldChtYWluRnJhbWUpKTsKKworICAgIHByaW50ZigiJXNcbiIsIHJlc3VsdC51dGY4KCkuZGF0
YSgpKTsKK30KKworc3RhdGljIGJvb2wgc2hvdWxkRHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oKQor
eworICAgIHJldHVybiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBBc1RleHQoKSAmJiAhZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wRE9NQXNXZWJBcmNoaXZlKCkgJiYgIWdMYXlvdXRUZXN0
Q29udHJvbGxlci0+ZHVtcFNvdXJjZUFzV2ViQXJjaGl2ZSgpOworfQorCitzdGF0aWMgYm9vbCBz
aG91bGREdW1wUGl4ZWxzQW5kQ29tcGFyZVdpdGhFeHBlY3RlZCgpCit7CisgICAgcmV0dXJuIGR1
bXBQaXhlbHMgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5nZW5lcmF0ZVBpeGVsUmVzdWx0cygp
ICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBET01Bc1dlYkFyY2hpdmUoKSAmJiAhZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wU291cmNlQXNXZWJBcmNoaXZlKCk7Cit9CisKK3N0YXRp
YyBib29sIHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QoKQoreworICAgIHJldHVybiBnTGF5b3V0
VGVzdENvbnRyb2xsZXItPmR1bXBCYWNrRm9yd2FyZExpc3QoKTsKK30KKworc3RhdGljIGJvb2wg
aW5pdEVmbCgpCit7CisgICAgaWYgKCFlY29yZV9ldmFzX2luaXQoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIGlmICghZWNvcmVfZmlsZV9pbml0KCkpIHsKKyAgICAgICAgZWNvcmVfZXZh
c19zaHV0ZG93bigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZWRq
ZV9pbml0KCkpIHsKKyAgICAgICAgZWNvcmVfZmlsZV9zaHV0ZG93bigpOworICAgICAgICBlY29y
ZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYg
KCFld2tfaW5pdCgpKSB7CisgICAgICAgIGVkamVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNvcmVf
ZmlsZV9zaHV0ZG93bigpOworICAgICAgICBlY29yZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZv
aWQgc2h1dGRvd25FZmwoKQoreworICAgIGV3a19zaHV0ZG93bigpOworICAgIGVkamVfc2h1dGRv
d24oKTsKKyAgICBlY29yZV9maWxlX3NodXRkb3duKCk7CisgICAgZWNvcmVfZXZhc19zaHV0ZG93
bigpOworfQorCit2b2lkIGRpc3BsYXlXZWJWaWV3KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworfQorCit2b2lkIGR1bXAoKQoreworICAgIGludmFsaWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1
bXBXYXRjaGRvZygpOworCisgICAgaWYgKGR1bXBUcmVlKSB7CisgICAgICAgIGFkanVzdE91dHB1
dFR5cGVCeU1pbWVUeXBlKCk7CisgICAgICAgIGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KCk7CisK
KyAgICAgICAgaWYgKHNob3VsZER1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKCkpCisgICAgICAgICAg
ICBkdW1wRnJhbWVTY3JvbGxQb3NpdGlvbihtYWluRnJhbWUpOworCisgICAgICAgIGlmIChzaG91
bGREdW1wQmFja0ZvcndhcmRMaXN0KCkpCisgICAgICAgICAgICBkdW1wQmFja0ZvcndhcmRMaXN0
Rm9yV2ViVmlldyhicm93c2VyKTsKKworICAgICAgICBpZiAocHJpbnRTZXBhcmF0b3JzKSB7Cisg
ICAgICAgICAgICBwdXRzKCIjRU9GIik7CisgICAgICAgICAgICBmcHV0cygiI0VPRlxuIiwgc3Rk
ZXJyKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgZmZsdXNoKHN0
ZGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hvdWxkRHVtcFBpeGVsc0FuZENv
bXBhcmVXaXRoRXhwZWN0ZWQoKSkKKyAgICAgICAgZHVtcFdlYlZpZXdBc1BpeGVsc0FuZENvbXBh
cmVXaXRoRXhwZWN0ZWQoZ0xheW91dFRlc3RDb250cm9sbGVyLT5leHBlY3RlZFBpeGVsSGFzaCgp
KTsKKworICAgIGRvbmUgPSB0cnVlOworICAgIGVjb3JlX21haW5fbG9vcF9xdWl0KCk7Cit9CisK
K3N0YXRpYyB2b2lkIGNyZWF0ZUJyb3dzZXIoRXZhcyogZXZhcywgR0NDb250cm9sbGVyKiBnY0Nv
bnRyb2xsZXIpCit7CisgICAgYnJvd3NlciA9IGRydF92aWV3X3RpbGVkX2FkZChldmFzKTsKKyAg
ICBpZiAoIWJyb3dzZXIpIHsKKyAgICAgICAgc2h1dGRvd25FZmwoKTsKKyAgICAgICAgZXhpdChF
WElUX0ZBSUxVUkUpOworICAgIH0KKworICAgIGV3a192aWV3X3RoZW1lX3NldChicm93c2VyLCBE
QVRBX0RJUiIvZGVmYXVsdC5lZGoiKTsKKworICAgIGV2YXNfb2JqZWN0X25hbWVfc2V0KGJyb3dz
ZXIsICJicm93c2VyIik7CisgICAgZXZhc19vYmplY3RfbW92ZShicm93c2VyLCAwLCAwKTsKKyAg
ICBldmFzX29iamVjdF9yZXNpemUoYnJvd3NlciwgODAwLCA2MDApOworICAgIGV2YXNfb2JqZWN0
X2xheWVyX3NldChicm93c2VyLCBFVkFTX0xBWUVSX01BWCk7CisgICAgZXZhc19vYmplY3Rfc2hv
dyhicm93c2VyKTsKKyAgICBldmFzX29iamVjdF9mb2N1c19zZXQoYnJvd3NlciwgRUlOQV9UUlVF
KTsKKworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChicm93c2VyLCAibG9hZCxz
dGFydGVkIiwgb25Mb2FkU3RhcnRlZCwgMCk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJh
Y2tfYWRkKGJyb3dzZXIsICJsb2FkLGZpbmlzaGVkIiwgb25Mb2FkRmluaXNoZWQsIDApOworICAg
IGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChicm93c2VyLCAidGl0bGUsY2hhbmdlZCIs
IG9uVGl0bGVDaGFuZ2VkLCAwKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQo
YnJvd3NlciwgIndpbmRvdyxvYmplY3QsY2xlYXJlZCIsIG9uV2luZG93T2JqZWN0Q2xlYXJlZCwg
Z2NDb250cm9sbGVyKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQoYnJvd3Nl
ciwgInN0YXR1c2Jhcix0ZXh0LHNldCIsIG9uU3RhdHVzYmFyVGV4dFNldCwgMCk7CisKKyAgICBt
YWluRnJhbWUgPSBld2tfdmlld19mcmFtZV9tYWluX2dldChicm93c2VyKTsKKyAgICBldmFzX29i
amVjdF9zbWFydF9jYWxsYmFja19hZGQobWFpbkZyYW1lLCAibG9hZCxkb2N1bWVudCxmaW5pc2hl
ZCIsIG9uRG9jdW1lbnRMb2FkRmluaXNoZWQsIDApOworfQorCitzdGF0aWMgRWNvcmVfRXZhcyog
aW5pdEVjb3JlRXZhcygpCit7CisgICAgRWNvcmVfRXZhcyogZWUgPSB1c2VYMTFXaW5kb3cgPyBl
Y29yZV9ldmFzX25ldygwLCAwLCAwLCA4MDAsIDYwMCwgMCkgOiBlY29yZV9ldmFzX2J1ZmZlcl9u
ZXcoODAwLCA2MDApOworICAgIGlmICghZWUpIHsKKyAgICAgICAgc2h1dGRvd25FZmwoKTsKKyAg
ICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAgIGVjb3JlX2V2YXNfdGl0bGVf
c2V0KGVlLCAiRUZMIER1bXBSZW5kZXJUcmVlIik7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19y
ZXNpemVfc2V0KGVlLCBvbkVjb3JlRXZhc1Jlc2l6ZSk7CisgICAgZWNvcmVfZXZhc19jYWxsYmFj
a19kZWxldGVfcmVxdWVzdF9zZXQoZWUsIG9uQ2xvc2VXaW5kb3cpOworICAgIGVjb3JlX2V2YXNf
c2hvdyhlZSk7CisKKyAgICByZXR1cm4gZWU7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFy
KiogYXJndikKK3sKKyAgICBpZiAoIXBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGFyZ2MsIGFyZ3Yp
KQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisgICAgaWYgKCFpbml0RWZsKCkpCisg
ICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisKKyAgICBPd25QdHI8RWNvcmVfRXZhcz4gZWNv
cmVFdmFzID0gYWRvcHRQdHIoaW5pdEVjb3JlRXZhcygpKTsKKyAgICBPd25QdHI8R0NDb250cm9s
bGVyPiBnY0NvbnRyb2xsZXIgPSBhZG9wdFB0cihuZXcgR0NDb250cm9sbGVyKTsKKyAgICBjcmVh
dGVCcm93c2VyKGVjb3JlX2V2YXNfZ2V0KGVjb3JlRXZhcy5nZXQoKSksIGdjQ29udHJvbGxlci5n
ZXQoKSk7CisgICAgYWRkRm9udHNUb0Vudmlyb25tZW50KCk7CisKKyAgICBpZiAodXNlTG9uZ1J1
bm5pbmdTZXJ2ZXJNb2RlKGFyZ2MsIGFyZ3YpKSB7CisgICAgICAgIHByaW50U2VwYXJhdG9ycyA9
IHRydWU7CisgICAgICAgIHJ1blRlc3RpbmdTZXJ2ZXJMb29wKCk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgcHJpbnRTZXBhcmF0b3JzID0gKG9wdGluZCA8IGFyZ2MgLSAxIHx8IChkdW1wUGl4ZWxz
ICYmIGR1bXBUcmVlKSk7CisgICAgICAgIGZvciAoaW50IGkgPSBvcHRpbmQ7IGkgIT0gYXJnYzsg
KytpKQorICAgICAgICAgICAgcnVuVGVzdChhcmd2W2ldKTsKKyAgICB9CisKKyAgICBlY29yZUV2
YXMuY2xlYXIoKTsKKworICAgIHNodXRkb3duRWZsKCk7CisgICAgcmV0dXJuIEVYSVRfU1VDQ0VT
UzsKK30KZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJl
ZUVmbC5oIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlRWZsLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uNjRkOTA5NmIzNjNhNDgwNDZmZWIxZTc4ZmE5MGYwM2JjNDM3YmExMwotLS0gL2Rl
di9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZUVmbC5o
CkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVt
YmVkZGVkIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNz
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkIGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwor
ICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBEdW1wUmVuZGVyVHJlZUVmbF9oCisjZGVmaW5lIER1bXBS
ZW5kZXJUcmVlRWZsX2gKKworI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5jbHVkZSA8RXZhcy5oPgor
CitleHRlcm4gRXZhc19PYmplY3QqIG1haW5GcmFtZTsKK2V4dGVybiBFdmFzX09iamVjdCogYnJv
d3NlcjsKK2V4dGVybiBFdmFzX09iamVjdCogdG9wTG9hZGluZ0ZyYW1lOworZXh0ZXJuIGJvb2wg
d2FpdEZvclBvbGljeTsKK2V4dGVybiBFY29yZV9UaW1lciogd2FpdFRvRHVtcFdhdGNoZG9nOwor
CisjZW5kaWYgLyogRHVtcFJlbmRlclRyZWVFZmxfaCAqLwpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVt
cFJlbmRlclRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVl
L2VmbC9Gb250TWFuYWdlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODlhOTMyOGZmMTVjZTQ4YmM5NDdj
OGIzMDVmNWQyYTI0MWI5YjQwZAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJU
cmVlL2VmbC9Gb250TWFuYWdlbWVudC5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVtYmVkZGVkIFN5c3RlbXMKKyAqIENvcHlyaWdodCAo
QykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiRm9udE1hbmFnZW1lbnQuaCIKKworI2luY2x1ZGUgPEVjb3JlX0ZpbGUu
aD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Zm9udGNvbmZpZy9mb250Y29uZmlnLmg+
CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4K
KyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworc3RhdGljIFZlY3RvcjxTdHJpbmc+
IGdldEZvbnREaXJlY3RvcmllcygpCit7CisgICAgVmVjdG9yPFN0cmluZz4gZm9udERpclBhdGhz
OworCisgICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvVFRG
LyIpKTsKKyAgICBmb250RGlyUGF0aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFyZS9mb250cy90
cnVldHlwZS90dGYtbGliZXJhdGlvbi8iKSk7CisgICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJp
bmcoIi91c3Ivc2hhcmUvZm9udHMvbGliZXJhdGlvbi8iKSk7CisgICAgZm9udERpclBhdGhzLmFw
cGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvdHJ1ZXR5cGUvdHRmLWRlamF2dS8iKSk7Cisg
ICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvZGVqYXZ1LyIp
KTsKKyAgICBmb250RGlyUGF0aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFyZS9mb250cy9PVEYv
IikpOyAvLyBNYXRoTUwKKyAgICBmb250RGlyUGF0aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFy
ZS9mb250cy9vcGVudHlwZS9zdGl4LyIpKTsgLy8gTWF0aE1MCisgICAgZm9udERpclBhdGhzLmFw
cGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvc3RpeC8iKSk7IC8vIE1hdGhNTAorCisgICAg
cmV0dXJuIGZvbnREaXJQYXRoczsKK30KKworc3RhdGljIFZlY3RvcjxTdHJpbmc+IGdldEZvbnRG
aWxlcygpCit7CisgICAgVmVjdG9yPFN0cmluZz4gZm9udEZpbGVQYXRoczsKKworICAgIC8vIEFo
ZW0gaXMgdXNlZCBieSBtYW55IGxheW91dCB0ZXN0cy4KKyAgICBmb250RmlsZVBhdGhzLmFwcGVu
ZChTdHJpbmcoRk9OVFNfQ09ORl9ESVIgIi9BSEVNX19fXy5UVEYiKSk7CisgICAgLy8gQSBmb250
IHdpdGggbm8gdmFsaWQgRm9udGNvbmZpZyBlbmNvZGluZyB0byB0ZXN0IGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NzQ1MgorICAgIGZvbnRGaWxlUGF0aHMuYXBwZW5k
KFN0cmluZyhGT05UU19DT05GX0RJUiAiL0ZvbnRXaXRoTm9WYWxpZEVuY29kaW5nLmZvbiIpKTsK
KworICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDk7IGkrKykgeworICAgICAgICBjaGFyIGZvbnRQ
YXRoW1BBVEhfTUFYXTsKKyAgICAgICAgc25wcmludGYoZm9udFBhdGgsIFBBVEhfTUFYIC0gMSwK
KyAgICAgICAgICAgICAgICAgRk9OVFNfQ09ORl9ESVIgIi8uLi8uLi9mb250cy9XZWJLaXRXZWln
aHRXYXRjaGVyJWkwMC50dGYiLCBpKTsKKworICAgICAgICBmb250RmlsZVBhdGhzLmFwcGVuZChT
dHJpbmcoZm9udFBhdGgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9udEZpbGVQYXRoczsKK30K
Kworc3RhdGljIHNpemVfdCBhZGRGb250RGlyZWN0b3JpZXMoY29uc3QgVmVjdG9yPFN0cmluZz4m
IGZvbnREaXJlY3RvcmllcywgRmNDb25maWcqIGNvbmZpZykKK3sKKyAgICBzaXplX3QgYWRkZWRE
aXJlY3RvcmllczsKKworICAgIGZvciAoVmVjdG9yPFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gZm9udERpcmVjdG9yaWVzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBmb250RGlyZWN0b3Jp
ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3QgQ1N0cmluZyBjdXJyZW50RGlyZWN0b3J5
ID0gKCppdCkudXRmOCgpOworICAgICAgICBjb25zdCBjaGFyKiBwYXRoID0gY3VycmVudERpcmVj
dG9yeS5kYXRhKCk7CisKKyAgICAgICAgaWYgKGVjb3JlX2ZpbGVfaXNfZGlyKHBhdGgpKSB7Cisg
ICAgICAgICAgICBpZiAoIUZjQ29uZmlnQXBwRm9udEFkZERpcihjb25maWcsIHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgRmNDaGFyOCo+KHBhdGgpKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYo
c3RkZXJyLCAiQ291bGQgbm90IGxvYWQgZm9udCBhdCAlcyFcbiIsIHBhdGgpOworICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK2FkZGVkRGly
ZWN0b3JpZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYWRkZWREaXJlY3Rvcmll
czsKK30KKworc3RhdGljIHZvaWQgYWRkRm9udEZpbGVzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBm
b250RmlsZXMsIEZjQ29uZmlnKiBjb25maWcpCit7CisgICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBmb250RmlsZXMuYmVnaW4oKTsgaXQgIT0gZm9udEZpbGVzLmVu
ZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IENTdHJpbmcgY3VycmVudEZpbGUgPSAoKml0KS51
dGY4KCk7CisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGggPSBjdXJyZW50RmlsZS5kYXRhKCk7CisK
KyAgICAgICAgaWYgKCFGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlKGNvbmZpZywgcmVpbnRlcnByZXRf
Y2FzdDxjb25zdCBGY0NoYXI4Kj4ocGF0aCkpKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIs
ICJDb3VsZCBub3QgbG9hZCBmb250IGF0ICVzIVxuIiwgcGF0aCk7CisgICAgfQorfQorCit2b2lk
IGFkZEZvbnRzVG9FbnZpcm9ubWVudCgpCit7CisgICAgRmNJbml0KCk7CisKKyAgICAvLyBMb2Fk
IG91ciBjb25maWd1cmF0aW9uIGZpbGUsIHdoaWNoIHNldHMgdXAgcHJvcGVyIGFsaWFzZXMgZm9y
IGZhbWlseQorICAgIC8vIG5hbWVzIGxpa2Ugc2Fucywgc2VyaWYgYW5kIG1vbm9zcGFjZS4KKyAg
ICBGY0NvbmZpZyogY29uZmlnID0gRmNDb25maWdDcmVhdGUoKTsKKyAgICBjb25zdCBjaGFyKiBm
b250Q29uZmlnRmlsZW5hbWUgPSBGT05UU19DT05GX0RJUiAiL2ZvbnRzLmNvbmYiOworICAgIGlm
ICghRmNDb25maWdQYXJzZUFuZExvYWQoY29uZmlnLCByZWludGVycHJldF9jYXN0PGNvbnN0IEZj
Q2hhcjgqPihmb250Q29uZmlnRmlsZW5hbWUpLCB0cnVlKSkgeworICAgICAgICBmcHJpbnRmKHN0
ZGVyciwgIkNvdWxkbid0IGxvYWQgZm9udCBjb25maWd1cmF0aW9uIGZpbGUgZnJvbTogJXNcbiIs
IGZvbnRDb25maWdGaWxlbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgaWYg
KCFhZGRGb250RGlyZWN0b3JpZXMoZ2V0Rm9udERpcmVjdG9yaWVzKCksIGNvbmZpZykpIHsKKyAg
ICAgICAgZnByaW50ZihzdGRlcnIsICJOb25lIG9mIHRoZSBmb250IGRpcmVjdG9yaWVzIGNvdWxk
IGJlIGFkZGVkLiBFaXRoZXIgaW5zdGFsbCB0aGVtICIKKyAgICAgICAgICAgICAgICAgICAgICAg
ICJvciBmaWxlIGEgYnVnIGF0IGh0dHA6Ly9idWdzLndlYmtpdC5vcmcgaWYgdGhleSBhcmUgaW5z
dGFsbGVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbm90aGVyIGxvY2F0aW9uLlxu
Iik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgYWRkRm9udEZpbGVzKGdldEZvbnRG
aWxlcygpLCBjb25maWcpOworCisgICAgaWYgKCFGY0NvbmZpZ1NldEN1cnJlbnQoY29uZmlnKSkg
eworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBzZXQgdGhlIGN1cnJlbnQgZm9u
dCBjb25maWd1cmF0aW9uIVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCmRpZmYg
LS1naXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuaCBiL1Rvb2xz
L0R1bXBSZW5kZXJUcmVlL2VmbC9Gb250TWFuYWdlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ0OTc1MTNh
ZWRjMTM5OWY0NmZjMGI5MWRkNGY0Mjg1NTdkNzQxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29s
cy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuaApAQCAtMCwwICsxLDMxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBGb250TWFuYWdlbWVudF9oCisjZGVmaW5lIEZvbnRNYW5hZ2VtZW50X2gKKwordm9pZCBhZGRG
b250c1RvRW52aXJvbm1lbnQoKTsKKworI2VuZGlmIC8vIEZvbnRNYW5hZ2VtZW50X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98042</attachid>
            <date>2011-06-21 12:25:21 -0700</date>
            <delta_ts>2011-06-21 13:19:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-62034-20110621162842.patch</filename>
            <type>text/plain</type>
            <size>30258</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODkzNjkKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA5MTE3OTAyMmQ3NTFlZjhlZWM4NGI1Y2I2NGJkYzk4ZjNl
YzQzMTQyLi5hNzlhNDhlZmFmYTZkMDE5MGZjM2E3MTMwODAxYTUyMmQ0MTkzZDhjIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTkg
QEAKKzIwMTEtMDYtMjEgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9uLm1vYmk+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0VGTF0g
RFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwIGFuZCBEdW1wUmVuZGVyVHJlZUVmbC5oIGFsb25n
IHdpdGgKKyAgICAgICAgc3VwcG9ydCBmaWxlcy4KKyAgICAgICAgQnVpbGQgc3lzdGVtIGNoYW5n
ZXMgd2lsbCBiZSB1cHN0cmVhbWVkIGFzIHNvb24gYXMgb3RoZXIgRFJULXJlbGF0ZWQKKyAgICAg
ICAgZmlsZXMgYXJlIGFsc28gb24gdGhlIHRyZWUuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MjAzNAorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUv
ZWZsL0R1bXBSZW5kZXJUcmVlLmNwcDogQWRkZWQuCisgICAgICAgIChkdW1wRnJhbWVzQXNUZXh0
KToKKyAgICAgICAgKGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZExv
Z0ZyYW1lTG9hZERlbGVnYXRlcyk6CisgICAgICAgIChzaG91bGREdW1wQXNUZXh0KToKKyAgICAg
ICAgKHNlbmRQaXhlbFJlc3VsdHNFT0YpOgorICAgICAgICAoaW52YWxpZGF0ZUFueVByZXZpb3Vz
V2FpdFRvRHVtcFdhdGNoZG9nKToKKyAgICAgICAgKHByb2Nlc3NXb3JrKToKKyAgICAgICAgKGFk
ZENvbnRyb2xsZXJUb1dpbmRvdyk6CisgICAgICAgIChvbldpbmRvd09iamVjdENsZWFyZWQpOgor
ICAgICAgICAob25TdGF0dXNiYXJUZXh0U2V0KToKKyAgICAgICAgKG9uTG9hZFN0YXJ0ZWQpOgor
ICAgICAgICAob25Mb2FkRmluaXNoZWQpOgorICAgICAgICAob25UaXRsZUNoYW5nZWQpOgorICAg
ICAgICAob25Eb2N1bWVudExvYWRGaW5pc2hlZCk6CisgICAgICAgIChvbkVjb3JlRXZhc1Jlc2l6
ZSk6CisgICAgICAgIChvbkNsb3NlV2luZG93KToKKyAgICAgICAgKHVzZUxvbmdSdW5uaW5nU2Vy
dmVyTW9kZSk6CisgICAgICAgIChwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyk6CisgICAgICAgIChy
ZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKToKKyAgICAgICAgKGdldEZpbmFsVGVzdFVS
TCk6CisgICAgICAgIChnZXRFeHBlY3RlZFBpeGVsSGFzaCk6CisgICAgICAgIChjcmVhdGVMYXlv
dXRUZXN0Q29udHJvbGxlcik6CisgICAgICAgIChydW5UZXN0KToKKyAgICAgICAgKHJ1blRlc3Rp
bmdTZXJ2ZXJMb29wKToKKyAgICAgICAgKGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKToKKyAg
ICAgICAgKGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KToKKyAgICAgICAgKHNob3VsZER1bXBGcmFt
ZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0
aEV4cGVjdGVkKToKKyAgICAgICAgKHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QpOgorICAgICAg
ICAoaW5pdEVmbCk6CisgICAgICAgIChzaHV0ZG93bkVmbCk6CisgICAgICAgIChkaXNwbGF5V2Vi
Vmlldyk6CisgICAgICAgIChkdW1wKToKKyAgICAgICAgKGNyZWF0ZUJyb3dzZXIpOgorICAgICAg
ICAoaW5pdEVjb3JlRXZhcyk6CisgICAgICAgIChtYWluKToKKyAgICAgICAgKiBEdW1wUmVuZGVy
VHJlZS9lZmwvRHVtcFJlbmRlclRyZWVFZmwuaDogQWRkZWQuCisgICAgICAgICogRHVtcFJlbmRl
clRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmNwcDogQWRkZWQuCisgICAgICAgIChnZXRGb250RGly
ZWN0b3JpZXMpOgorICAgICAgICAoZ2V0Rm9udEZpbGVzKToKKyAgICAgICAgKGFkZEZvbnREaXJl
Y3Rvcmllcyk6CisgICAgICAgIChhZGRGb250RmlsZXMpOgorICAgICAgICAoYWRkRm9udHNUb0Vu
dmlyb25tZW50KToKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQu
aDogQWRkZWQuCisKIDIwMTEtMDYtMjAgIERtaXRyeSBMb21vdiAgPGRzbG9tb3ZAZ29vZ2xlLmNv
bT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZpZCBMZXZpbi4KZGlmZiAtLWdpdCBhL1Rvb2xz
L0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHAgYi9Ub29scy9EdW1wUmVuZGVy
VHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYxZmVkZWQ3YzAzN2I3ZDEy
MDAyZmUwMjUwNzI4OWUzZDg5YmUyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVu
ZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwCkBAIC0wLDAgKzEsNTY0IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmln
aHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlLmgiCisKKyNpbmNsdWRlICJEdW1wSGlz
dG9yeUl0ZW0uaCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZVZpZXcuaCIKKyNpbmNsdWRlICJF
dmVudFNlbmRlci5oIgorI2luY2x1ZGUgIkZvbnRNYW5hZ2VtZW50LmgiCisjaW5jbHVkZSAiR0ND
b250cm9sbGVyLmgiCisjaW5jbHVkZSAiTGF5b3V0VGVzdENvbnRyb2xsZXIuaCIKKyNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBpeGVsRHVtcFN1cHBvcnQuaCIKKyNpbmNs
dWRlICJXb3JrUXVldWUuaCIKKyNpbmNsdWRlICJld2tfcHJpdmF0ZS5oIiAvLyBGSVhNRTogY3Jl
YXRlIHNvbWUgV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWUuY3BwIGluc3RlYWQKKyNpbmNs
dWRlIDxFV2ViS2l0Lmg+CisjaW5jbHVkZSA8RWNvcmUuaD4KKyNpbmNsdWRlIDxFY29yZV9FdmFz
Lmg+CisjaW5jbHVkZSA8RWNvcmVfRmlsZS5oPgorI2luY2x1ZGUgPEVkamUuaD4KKyNpbmNsdWRl
IDxFdmFzLmg+CisjaW5jbHVkZSA8Zm9udGNvbmZpZy9mb250Y29uZmlnLmg+CisjaW5jbHVkZSA8
Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGV4dC9DU3RyaW5nLmg+
CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8d3RmL093bkZhc3RNYWxsb2NQdHIuaD4K
KyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK0V2YXNfT2JqZWN0KiBicm93c2VyID0gMDsKK0V2
YXNfT2JqZWN0KiBtYWluRnJhbWUgPSAwOworRXZhc19PYmplY3QqIHRvcExvYWRpbmdGcmFtZSA9
IDA7Citib29sIHdhaXRGb3JQb2xpY3kgPSBmYWxzZTsKK0Vjb3JlX1RpbWVyKiB3YWl0VG9EdW1w
V2F0Y2hkb2cgPSAwOworZXh0ZXJuIEV3a19IaXN0b3J5X0l0ZW0qIHByZXZUZXN0QkZJdGVtOwor
CisvLyBGcm9tIHRoZSB0b3AtbGV2ZWwgRHVtcFJlbmRlclRyZWUuaAorUmVmUHRyPExheW91dFRl
c3RDb250cm9sbGVyPiBnTGF5b3V0VGVzdENvbnRyb2xsZXI7Cit2b2xhdGlsZSBib29sIGRvbmUg
PSBmYWxzZTsKKworc3RhdGljIGludCBkdW1wUGl4ZWxzID0gZmFsc2U7CitzdGF0aWMgaW50IGR1
bXBUcmVlID0gdHJ1ZTsKK3N0YXRpYyBpbnQgcHJpbnRTZXBhcmF0b3JzID0gdHJ1ZTsKK3N0YXRp
YyBpbnQgdXNlWDExV2luZG93ID0gZmFsc2U7CisKK3N0YXRpYyBXVEY6OlN0cmluZyBkdW1wRnJh
bWVzQXNUZXh0KEV2YXNfT2JqZWN0KiBmcmFtZSkKK3sKKyAgICBPd25GYXN0TWFsbG9jUHRyPGNo
YXI+IGlubmVyVGV4dChld2tfZnJhbWVfaW5uZXJfdGV4dF9nZXQoZnJhbWUpKTsKKyAgICBXVEY6
OlN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQoYnJvd3Nl
cikgPT0gZnJhbWUpCisgICAgICAgIHJlc3VsdCA9IFdURjo6U3RyaW5nOjpmcm9tVVRGOChpbm5l
clRleHQuZ2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gV1RGOjpTdHJpbmc6OmZv
cm1hdCgiXG4tLS0tLS0tLVxuRnJhbWU6ICclcydcbi0tLS0tLS0tXG4lc1xuIiwgZXdrX2ZyYW1l
X25hbWVfZ2V0KGZyYW1lKSwgaW5uZXJUZXh0LmdldCgpKTsKKworICAgIGlmIChnTGF5b3V0VGVz
dENvbnRyb2xsZXItPmR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpKSB7CisgICAgICAgIEVpbmFfSXRl
cmF0b3IqIGNoaWxkcmVuID0gZXdrX2ZyYW1lX2NoaWxkcmVuX2l0ZXJhdG9yX25ldyhmcmFtZSk7
CisgICAgICAgIEV2YXNfT2JqZWN0KiBjaGlsZDsKKworICAgICAgICBFSU5BX0lURVJBVE9SX0ZP
UkVBQ0goY2hpbGRyZW4sIGNoaWxkKSB7CisgICAgICAgICAgICBXVEY6OlN0cmluZyB0ZW1wVGV4
dChkdW1wRnJhbWVzQXNUZXh0KGNoaWxkKSk7CisKKyAgICAgICAgICAgIGlmICh0ZW1wVGV4dC5p
c0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHJlc3Vs
dC5hcHBlbmQodGVtcFRleHQpOworICAgICAgICB9CisKKyAgICAgICAgZWluYV9pdGVyYXRvcl9m
cmVlKGNoaWxkcmVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMg
dm9pZCBkdW1wRnJhbWVTY3JvbGxQb3NpdGlvbihFdmFzX09iamVjdCogbWFpbkZyYW1lKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZExvZ0ZyYW1lTG9h
ZERlbGVnYXRlcyhjb25zdCBXVEY6OlN0cmluZyYgcGF0aE9yVVJMKQoreworICAgIHJldHVybiBw
YXRoT3JVUkwuY29udGFpbnMoImxvYWRpbmcvIik7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZER1
bXBBc1RleHQoY29uc3QgV1RGOjpTdHJpbmcmIHBhdGhPclVSTCkKK3sKKyAgICByZXR1cm4gcGF0
aE9yVVJMLmNvbnRhaW5zKCJkdW1wQXNUZXh0LyIpOworfQorCitzdGF0aWMgdm9pZCBzZW5kUGl4
ZWxSZXN1bHRzRU9GKCkKK3sKKyAgICBwdXRzKCIjRU9GIik7CisgICAgZmZsdXNoKHN0ZG91dCk7
CisgICAgZmZsdXNoKHN0ZGVycik7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVBbnlQcmV2
aW91c1dhaXRUb0R1bXBXYXRjaGRvZygpCit7CisgICAgaWYgKHdhaXRUb0R1bXBXYXRjaGRvZykg
eworICAgICAgICBlY29yZV90aW1lcl9kZWwod2FpdFRvRHVtcFdhdGNoZG9nKTsKKyAgICAgICAg
d2FpdFRvRHVtcFdhdGNoZG9nID0gMDsKKyAgICB9CisgICAgd2FpdEZvclBvbGljeSA9IGZhbHNl
OworfQorCitzdGF0aWMgRWluYV9Cb29sIHByb2Nlc3NXb3JrKHZvaWQqIGRhdGEpCit7CisgICAg
aWYgKFdvcmtRdWV1ZTo6c2hhcmVkKCktPnByb2Nlc3NXb3JrKCkgJiYgIWdMYXlvdXRUZXN0Q29u
dHJvbGxlci0+d2FpdFRvRHVtcCgpKQorICAgICAgICBkdW1wKCk7CisgICAgcmV0dXJuIEVDT1JF
X0NBTExCQUNLX0NBTkNFTDsKK30KKworc3RhdGljIHZvaWQgYWRkQ29udHJvbGxlclRvV2luZG93
KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiB3aW5kb3dPYmplY3QsIGNvbnN0IGNo
YXIqIGNvbnRyb2xsZXJOYW1lLCBKU1ZhbHVlUmVmIGNvbnRyb2xsZXIpCit7CisgICAgSlNTdHJp
bmdSZWYgY29udHJvbGxlck5hbWVTdHIgPSBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyhj
b250cm9sbGVyTmFtZSk7CisgICAgSlNPYmplY3RTZXRQcm9wZXJ0eShjb250ZXh0LCB3aW5kb3dP
YmplY3QsIGNvbnRyb2xsZXJOYW1lU3RyLCBjb250cm9sbGVyLCBrSlNQcm9wZXJ0eUF0dHJpYnV0
ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlLCAwKTsKKyAgICBKU1N0
cmluZ1JlbGVhc2UoY29udHJvbGxlck5hbWVTdHIpOworfQorCitzdGF0aWMgdm9pZCBvbldpbmRv
d09iamVjdENsZWFyZWQodm9pZCogdXNlckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBl
dmVudEluZm8pCit7CisgICAgRXdrX1dpbmRvd19PYmplY3RfQ2xlYXJlZF9FdmVudCogb2JqZWN0
Q2xlYXJlZEluZm8gPSBzdGF0aWNfY2FzdDxFd2tfV2luZG93X09iamVjdF9DbGVhcmVkX0V2ZW50
Kj4oZXZlbnRJbmZvKTsKKyAgICBKU1ZhbHVlUmVmIGV4Y2VwdGlvbiA9IDA7CisgICAgQVNTRVJU
KGdMYXlvdXRUZXN0Q29udHJvbGxlcik7CisKKyAgICBHQ0NvbnRyb2xsZXIqIGdjQ29udHJvbGxl
ciA9IHN0YXRpY19jYXN0PEdDQ29udHJvbGxlcio+KHVzZXJEYXRhKTsKKyAgICBBU1NFUlQoZ2ND
b250cm9sbGVyKTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+bWFrZVdpbmRvd09iamVj
dChvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgb2JqZWN0Q2xlYXJlZEluZm8tPndpbmRvd09i
amVjdCwgJmV4Y2VwdGlvbik7CisgICAgQVNTRVJUKCFleGNlcHRpb24pOworCisgICAgZ2NDb250
cm9sbGVyLT5tYWtlV2luZG93T2JqZWN0KG9iamVjdENsZWFyZWRJbmZvLT5jb250ZXh0LCBvYmpl
Y3RDbGVhcmVkSW5mby0+d2luZG93T2JqZWN0LCAmZXhjZXB0aW9uKTsKKyAgICBBU1NFUlQoIWV4
Y2VwdGlvbik7CisKKyAgICAvKiBGSVhNRSBzL2ZhbHNlLyFnZXRfcGFyZW50LyAqLworICAgIGFk
ZENvbnRyb2xsZXJUb1dpbmRvdyhvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgb2JqZWN0Q2xl
YXJlZEluZm8tPndpbmRvd09iamVjdCwgImV2ZW50U2VuZGVyIiwgbWFrZUV2ZW50U2VuZGVyKG9i
amVjdENsZWFyZWRJbmZvLT5jb250ZXh0LCBmYWxzZSkpOworfQorCitzdGF0aWMgdm9pZCBvblN0
YXR1c2JhclRleHRTZXQodm9pZCogdXNlckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBl
dmVudEluZm8pCit7CisgICAgaWYgKCFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBTdGF0dXND
YWxsYmFja3MoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgY2hhciogc3RhdHVzYmFy
VGV4dCA9IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihldmVudEluZm8pOworICAgIHByaW50Zigi
VUkgREVMRUdBVEUgU1RBVFVTIENBTExCQUNLOiBzZXRTdGF0dXNUZXh0OiVzXG4iLCBzdGF0dXNi
YXJUZXh0KTsKK30KKworc3RhdGljIHZvaWQgb25Mb2FkU3RhcnRlZCh2b2lkKiB1c2VyRGF0YSwg
RXZhc19PYmplY3QqIHZpZXcsIHZvaWQqIGV2ZW50SW5mbykKK3sKKyAgICAvLyBGSVhNRTogd2Ug
YWN0dWFsbHkgbmVlZCB0aGUgZnJhbWUgcmVsYXRlZCB0byB0aGlzIGV2ZW50CisgICAgRXZhc19P
YmplY3QqIGZyYW1lID0gZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQodmlldyk7CisKKyAgICAvLyBN
YWtlIHN1cmUgd2Ugb25seSBzZXQgdGhpcyBvbmNlIHBlciB0ZXN0LiBJZiBpdCBnZXRzIGNsZWFy
ZWQsIGFuZCB0aGVuIHNldCBhZ2Fpbiwgd2UgbWlnaHQKKyAgICAvLyBlbmQgdXAgZG9pbmcgdHdv
IGR1bXBzIGZvciBvbmUgdGVzdC4KKyAgICBpZiAoIXRvcExvYWRpbmdGcmFtZSAmJiAhZG9uZSkK
KyAgICAgICAgdG9wTG9hZGluZ0ZyYW1lID0gZnJhbWU7Cit9CisKK3N0YXRpYyB2b2lkIG9uTG9h
ZEZpbmlzaGVkKHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmlldywgdm9pZCogZXZlbnRJ
bmZvKQoreworICAgIC8vIEZJWE1FOiB3ZSBhY3R1YWxseSBuZWVkIHRoZSBmcmFtZSByZWxhdGVk
IHRvIHRoaXMgZXZlbnQKKyAgICBFdmFzX09iamVjdCogZnJhbWUgPSBld2tfdmlld19mcmFtZV9t
YWluX2dldCh2aWV3KTsKKworICAgIGlmICh0b3BMb2FkaW5nRnJhbWUgIT0gZnJhbWUpCisgICAg
ICAgIHJldHVybjsKKworICAgIHRvcExvYWRpbmdGcmFtZSA9IDA7CisKKyAgICBXb3JrUXVldWU6
OnNoYXJlZCgpLT5zZXRGcm96ZW4odHJ1ZSk7CisgICAgaWYgKGdMYXlvdXRUZXN0Q29udHJvbGxl
ci0+d2FpdFRvRHVtcCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoV29ya1F1ZXVlOjpz
aGFyZWQoKS0+Y291bnQoKSkKKyAgICAgICAgZWNvcmVfaWRsZXJfYWRkKHByb2Nlc3NXb3JrLCAw
KTsKKyAgICBlbHNlCisgICAgICAgIGR1bXAoKTsKK30KKworc3RhdGljIHZvaWQgb25UaXRsZUNo
YW5nZWQodm9pZCogdXNlckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBldmVudEluZm8p
Cit7Cit9CisKK3N0YXRpYyB2b2lkIG9uRG9jdW1lbnRMb2FkRmluaXNoZWQodm9pZCogdXNlckRh
dGEsIEV2YXNfT2JqZWN0KiBmcmFtZSwgdm9pZCogZXZlbnRJbmZvKQoreworICAgIGNvbnN0IFdU
Rjo6U3RyaW5nIGZyYW1lTmFtZShld2tfZnJhbWVfc3VpdGFibGVfZHJ0X25hbWVfZ2V0KGZyYW1l
KSk7CisKKyAgICBpZiAoIWRvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRnJhbWVM
b2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiJXMgLSBkaWRGaW5pc2hEb2N1bWVudExv
YWRGb3JGcmFtZVxuIiwgZnJhbWVOYW1lLnV0ZjgoKS5kYXRhKCkpOworICAgIGVsc2UgaWYgKCFk
b25lKSB7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHBlbmRpbmdGcmFtZVVubG9hZEV2ZW50cyA9
IGV3a19mcmFtZV9wZW5kaW5nX3VubG9hZF9ldmVudF9jb3VudF9nZXQoZnJhbWUpOworICAgICAg
ICBpZiAocGVuZGluZ0ZyYW1lVW5sb2FkRXZlbnRzKQorICAgICAgICAgICAgcHJpbnRmKCIlcyAt
IGhhcyAldSBvbnVubG9hZCBoYW5kbGVyKHMpXG4iLCBmcmFtZU5hbWUudXRmOCgpLmRhdGEoKSwg
cGVuZGluZ0ZyYW1lVW5sb2FkRXZlbnRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9uRWNv
cmVFdmFzUmVzaXplKEVjb3JlX0V2YXMqIGVlKQoreworICAgIGludCB3aWR0aCwgaGVpZ2h0Owor
CisgICAgZWNvcmVfZXZhc19nZW9tZXRyeV9nZXQoZWUsIDAsIDAsICZ3aWR0aCwgJmhlaWdodCk7
CisgICAgZXZhc19vYmplY3RfbW92ZShicm93c2VyLCAwLCAwKTsKKyAgICBldmFzX29iamVjdF9y
ZXNpemUoYnJvd3Nlciwgd2lkdGgsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uQ2xvc2VX
aW5kb3coRWNvcmVfRXZhcyogZWUpCit7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgdXNlTG9uZ1J1
bm5pbmdTZXJ2ZXJNb2RlKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICByZXR1cm4gKGFy
Z2MgPT0gb3B0aW5kICsgMSAmJiAhc3RyY21wKGFyZ3Zbb3B0aW5kXSwgIi0iKSk7Cit9CisKK3N0
YXRpYyBib29sIHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikK
K3sKKyAgICBzdGF0aWMgY29uc3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICAgICAgeyJub3Ry
ZWUiLCBub19hcmd1bWVudCwgJmR1bXBUcmVlLCBmYWxzZX0sCisgICAgICAgIHsicGl4ZWwtdGVz
dHMiLCBub19hcmd1bWVudCwgJmR1bXBQaXhlbHMsIHRydWV9LAorICAgICAgICB7InRyZWUiLCBu
b19hcmd1bWVudCwgJmR1bXBUcmVlLCB0cnVlfSwKKyAgICAgICAgeyJndWkiLCBub19hcmd1bWVu
dCwgJnVzZVgxMVdpbmRvdywgdHJ1ZX0sCisgICAgICAgIHswLCAwLCAwLCAwfQorICAgIH07Cisg
ICAgaW50IG9wdGlvbjsKKworICAgIHdoaWxlICgob3B0aW9uID0gZ2V0b3B0X2xvbmcoYXJnYywg
KGNoYXIqIGNvbnN0Kilhcmd2LCAiIiwgb3B0aW9ucywgMCkpICE9IC0xKSB7CisgICAgICAgIHN3
aXRjaCAob3B0aW9uKSB7CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICBjYXNlICc6JzoKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0
cnVlOworfQorCitzdGF0aWMgdm9pZCByZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKCkK
K3sKKyAgICBld2tfc2V0dGluZ3NfaWNvbl9kYXRhYmFzZV9jbGVhcigpOworICAgIGV3a19zZXR0
aW5nc19pY29uX2RhdGFiYXNlX3BhdGhfc2V0KDApOworCisgICAgZXdrX3ZpZXdfc2V0dGluZ19w
cml2YXRlX2Jyb3dzaW5nX3NldChicm93c2VyLCBFSU5BX0ZBTFNFKTsKKyAgICBld2tfdmlld19z
ZXR0aW5nX3NwYXRpYWxfbmF2aWdhdGlvbl9zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7CisgICAg
ZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfZnJhbWVfZmxhdHRlbmluZ19zZXQoYnJvd3NlciwgRUlO
QV9GQUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19vZmZsaW5lX2FwcF9jYWNoZV9zZXQoYnJv
d3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9zY3JpcHRzX3Nl
dChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9zdGFuZGFy
ZF9zZXQoYnJvd3NlciwgIlRpbWVzIik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9z
cGFjZV9zZXQoYnJvd3NlciwgIkNvdXJpZXIiKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRf
c2VyaWZfc2V0KGJyb3dzZXIsICJUaW1lcyIpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9z
YW5zX3NlcmlmX3NldChicm93c2VyLCAiSGVsdmV0aWNhIik7CisgICAgZXdrX3ZpZXdfc2V0dGlu
Z19mb250X2N1cnNpdmVfc2V0KGJyb3dzZXIsICJjdXJzaXZlIik7CisgICAgZXdrX3ZpZXdfc2V0
dGluZ19mb250X2ZhbnRhc3lfc2V0KGJyb3dzZXIsICJmYW50YXN5Iik7CisgICAgZXdrX3ZpZXdf
c2V0dGluZ19mb250X2RlZmF1bHRfc2l6ZV9zZXQoYnJvd3NlciwgMTIpOworICAgIGV3a192aWV3
X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2l6ZV9zZXQoYnJvd3NlciwgMTApOworICAgIGV3a192
aWV3X3NldHRpbmdfZm9udF9taW5pbXVtX3NpemVfc2V0KGJyb3dzZXIsIDApOworICAgIGV3a192
aWV3X3NldHRpbmdfY2FyZXRfYnJvd3Npbmdfc2V0KGJyb3dzZXIsIEVJTkFfRkFMU0UpOworICAg
IGV3a192aWV3X3NldHRpbmdfcGFnZV9jYWNoZV9zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7Cisg
ICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfYXV0b19yZXNpemVfd2luZG93X3NldChicm93c2Vy
LCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3BsdWdpbnNfc2V0KGJy
b3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19zY3JpcHRzX3dpbmRvd19v
cGVuX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworCisgICAgZXdrX3ZpZXdfem9vbV9zZXQoYnJv
d3NlciwgMS4wLCAwLCAwKTsKKworICAgIEV3a19IaXN0b3J5KiBoaXN0b3J5ID0gZXdrX3ZpZXdf
aGlzdG9yeV9nZXQoYnJvd3Nlcik7CisgICAgaW50IGxpbWl0ID0gZXdrX2hpc3RvcnlfbGltaXRf
Z2V0KGhpc3RvcnkpOworICAgIGV3a19oaXN0b3J5X2xpbWl0X3NldChoaXN0b3J5LCAwKTsKKyAg
ICBld2tfaGlzdG9yeV9saW1pdF9zZXQoaGlzdG9yeSwgbGltaXQpOworCisgICAgZXdrX2Nvb2tp
ZXNfY2xlYXIoKTsKKyAgICBld2tfY29va2llc19wb2xpY3lfc2V0KEVXS19DT09LSUVfSkFSX0FD
Q0VQVF9OT19USElSRF9QQVJUWSk7CisKKyAgICBld2tfZnJhbWVfb3BlbmVyX2NsZWFyKGV3a192
aWV3X2ZyYW1lX21haW5fZ2V0KGJyb3dzZXIpKTsKK30KKworc3RhdGljIFdURjo6U3RyaW5nIGdl
dEZpbmFsVGVzdFVSTChjb25zdCBXVEY6OlN0cmluZyYgdGVzdFVSTCkKK3sKKyAgICBjb25zdCBz
aXplX3QgaGFzaFNlcGFyYXRvclBvcyA9IHRlc3RVUkwuZmluZCgiJyIpOworICAgIGlmIChoYXNo
U2VwYXJhdG9yUG9zICE9IG5vdEZvdW5kKQorICAgICAgICByZXR1cm4gdGVzdFVSTC5sZWZ0KGhh
c2hTZXBhcmF0b3JQb3MpOworCisgICAgLy8gQ29udmVydCB0aGUgcGF0aCBpbnRvIGEgZnVsbCBm
aWxlIFVSTCBpZiBpdCBkb2VzIG5vdCBsb29rCisgICAgLy8gbGlrZSBhbiBIVFRQL1MgVVJMIChk
b2Vzbid0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovLykuCisgICAgaWYgKCF0ZXN0VVJM
LnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAmJiAhdGVzdFVSTC5zdGFydHNXaXRoKCJodHRwczovLyIp
KSB7CisgICAgICAgIE93bkZhc3RNYWxsb2NQdHI8Y2hhcj4gZmlsZVBhdGgoZWNvcmVfZmlsZV9y
ZWFscGF0aCh0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpKTsKKworICAgICAgICBpZiAoZWNvcmVfZmls
ZV9leGlzdHMoZmlsZVBhdGguZ2V0KCkpKQorICAgICAgICAgICAgcmV0dXJuIFdURjo6U3RyaW5n
Ojpmb3JtYXQoImZpbGU6Ly8lcyIsIGZpbGVQYXRoLmdldCgpKTsKKyAgICB9CisKKyAgICByZXR1
cm4gdGVzdFVSTDsKK30KKworc3RhdGljIFdURjo6U3RyaW5nIGdldEV4cGVjdGVkUGl4ZWxIYXNo
KGNvbnN0IFdURjo6U3RyaW5nJiB0ZXN0VVJMKQoreworICAgIGNvbnN0IHNpemVfdCBoYXNoU2Vw
YXJhdG9yUG9zID0gdGVzdFVSTC5maW5kKCInIik7CisgICAgcmV0dXJuIChoYXNoU2VwYXJhdG9y
UG9zID09IG5vdEZvdW5kKSA/IHRlc3RVUkwucmlnaHQoaGFzaFNlcGFyYXRvclBvcykgOiBXVEY6
OlN0cmluZygpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVMYXlvdXRUZXN0Q29udHJvbGxlcihj
b25zdCBXVEY6OlN0cmluZyYgdGVzdFVSTCwgY29uc3QgV1RGOjpTdHJpbmcmIGV4cGVjdGVkUGl4
ZWxIYXNoKQoreworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlciA9CisgICAgICAgIExheW91dFRl
c3RDb250cm9sbGVyOjpjcmVhdGUoc3RkOjpzdHJpbmcodGVzdFVSTC51dGY4KCkuZGF0YSgpKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhleHBlY3Rl
ZFBpeGVsSGFzaC51dGY4KCkuZGF0YSgpKSk7CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOwor
ICAgIGRvbmUgPSBmYWxzZTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0SWNvbkRh
dGFiYXNlRW5hYmxlZChmYWxzZSk7CisKKyAgICBpZiAoc2hvdWxkTG9nRnJhbWVMb2FkRGVsZWdh
dGVzKHRlc3RVUkwpKQorICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBGcmFt
ZUxvYWRDYWxsYmFja3ModHJ1ZSk7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldERl
dmVsb3BlckV4dHJhc0VuYWJsZWQodHJ1ZSk7CisKKyAgICBpZiAoc2hvdWxkRHVtcEFzVGV4dCh0
ZXN0VVJMKSkgeworICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBBc1RleHQo
dHJ1ZSk7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQaXhlbFJl
c3VsdHMoZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcnVuVGVzdChjb25zdCBjaGFy
KiBjVGVzdFBhdGhPclVSTCkKK3sKKyAgICBjb25zdCBXVEY6OlN0cmluZyB0ZXN0UGF0aE9yVVJM
ID0gV1RGOjpTdHJpbmc6OmZyb21VVEY4KGNUZXN0UGF0aE9yVVJMKTsKKyAgICBBU1NFUlQoIXRl
c3RQYXRoT3JVUkwuaXNFbXB0eSgpKTsKKworICAgIGNvbnN0IFdURjo6U3RyaW5nIHRlc3RVUkwg
PSBnZXRGaW5hbFRlc3RVUkwodGVzdFBhdGhPclVSTCk7CisgICAgY29uc3QgV1RGOjpTdHJpbmcg
ZXhwZWN0ZWRQaXhlbEhhc2ggPSBnZXRFeHBlY3RlZFBpeGVsSGFzaCh0ZXN0UGF0aE9yVVJMKTsK
KworICAgIHJlc2V0RGVmYXVsdHNUb0NvbnNpc3RlbnRWYWx1ZXMoKTsKKyAgICBjcmVhdGVMYXlv
dXRUZXN0Q29udHJvbGxlcih0ZXN0VVJMLCBleHBlY3RlZFBpeGVsSGFzaCk7CisKKyAgICBXb3Jr
UXVldWU6OnNoYXJlZCgpLT5jbGVhcigpOworICAgIFdvcmtRdWV1ZTo6c2hhcmVkKCktPnNldEZy
b3plbihmYWxzZSk7CisKKyAgICBjb25zdCBib29sIGlzU1ZHVzNDVGVzdCA9IHRlc3RVUkwuY29u
dGFpbnMoInN2Zy9XM0MtU1ZHLTEuMSIpOworICAgIGNvbnN0IGludCB3aWR0aCA9IGlzU1ZHVzND
VGVzdCA/IDQ4MCA6IExheW91dFRlc3RDb250cm9sbGVyOjptYXhWaWV3V2lkdGg7CisgICAgY29u
c3QgaW50IGhlaWdodCA9IGlzU1ZHVzNDVGVzdCA/IDM2MCA6IExheW91dFRlc3RDb250cm9sbGVy
OjptYXhWaWV3SGVpZ2h0OworICAgIGV2YXNfb2JqZWN0X3Jlc2l6ZShicm93c2VyLCB3aWR0aCwg
aGVpZ2h0KTsKKworICAgIGlmIChwcmV2VGVzdEJGSXRlbSkKKyAgICAgICAgZXdrX2hpc3Rvcnlf
aXRlbV9mcmVlKHByZXZUZXN0QkZJdGVtKTsKKyAgICBjb25zdCBFd2tfSGlzdG9yeSogaGlzdG9y
eSA9IGV3a192aWV3X2hpc3RvcnlfZ2V0KGJyb3dzZXIpOworICAgIHByZXZUZXN0QkZJdGVtID0g
ZXdrX2hpc3RvcnlfaGlzdG9yeV9pdGVtX2N1cnJlbnRfZ2V0KGhpc3RvcnkpOworCisgICAgZXZh
c19vYmplY3RfZm9jdXNfc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfdXJp
X3NldChicm93c2VyLCB0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpOworCisgICAgZWNvcmVfbWFpbl9s
b29wX2JlZ2luKCk7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmNsb3NlV2ViSW5zcGVj
dG9yKCk7CisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXREZXZlbG9wZXJFeHRyYXNFbmFi
bGVkKGZhbHNlKTsKKworICAgIGV3a192aWV3X3VyaV9zZXQoYnJvd3NlciwgImFib3V0OmJsYW5r
Iik7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXIuY2xlYXIoKTsKKyAgICBzZW5kUGl4ZWxS
ZXN1bHRzRU9GKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1blRlc3RpbmdTZXJ2ZXJMb29wKCkKK3sK
KyAgICBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKworICAgIHdoaWxlIChmZ2V0cyhmaWxlbmFt
ZSwgc2l6ZW9mKGZpbGVuYW1lKSwgc3RkaW4pKSB7CisgICAgICAgIGNoYXIqIG5ld0xpbmUgPSBz
dHJyY2hyKGZpbGVuYW1lLCAnXG4nKTsKKyAgICAgICAgaWYgKG5ld0xpbmUpCisgICAgICAgICAg
ICAqbmV3TGluZSA9ICdcMCc7CisKKyAgICAgICAgaWYgKGZpbGVuYW1lWzBdICE9ICdcMCcpCisg
ICAgICAgICAgICBydW5UZXN0KGZpbGVuYW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFk
anVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKCkKK3sKKyAgICBPd25GYXN0TWFsbG9jUHRyPGNoYXI+
IHJlc3BvbnNlTWltZVR5cGUoZXdrX2ZyYW1lX3Jlc3BvbnNlX21pbWVfdHlwZV9nZXQobWFpbkZy
YW1lKSk7CisgICAgaWYgKHJlc3BvbnNlTWltZVR5cGUuZ2V0KCkgJiYgIXN0cmNtcChyZXNwb25z
ZU1pbWVUeXBlLmdldCgpLCAidGV4dC9wbGFpbiIpKSB7CisgICAgICAgIGdMYXlvdXRUZXN0Q29u
dHJvbGxlci0+c2V0RHVtcEFzVGV4dCh0cnVlKTsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9s
bGVyLT5zZXRHZW5lcmF0ZVBpeGVsUmVzdWx0cyhmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMg
dm9pZCBkdW1wRnJhbWVDb250ZW50c0FzVGV4dCgpCit7CisgICAgV1RGOjpTdHJpbmcgcmVzdWx0
OworICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBBc1RleHQoKSkKKyAgICAgICAg
cmVzdWx0ID0gZHVtcEZyYW1lc0FzVGV4dChtYWluRnJhbWUpOworICAgIGVsc2UKKyAgICAgICAg
cmVzdWx0ID0gV1RGOjpTdHJpbmc6OmZyb21VVEY4KGV3a19mcmFtZV9yZW5kZXJfdHJlZV9kdW1w
X2dldChtYWluRnJhbWUpKTsKKworICAgIHByaW50ZigiJXNcbiIsIHJlc3VsdC51dGY4KCkuZGF0
YSgpKTsKK30KKworc3RhdGljIGJvb2wgc2hvdWxkRHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oKQor
eworICAgIHJldHVybiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBBc1RleHQoKSAmJiAhZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wRE9NQXNXZWJBcmNoaXZlKCkgJiYgIWdMYXlvdXRUZXN0
Q29udHJvbGxlci0+ZHVtcFNvdXJjZUFzV2ViQXJjaGl2ZSgpOworfQorCitzdGF0aWMgYm9vbCBz
aG91bGREdW1wUGl4ZWxzQW5kQ29tcGFyZVdpdGhFeHBlY3RlZCgpCit7CisgICAgcmV0dXJuIGR1
bXBQaXhlbHMgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5nZW5lcmF0ZVBpeGVsUmVzdWx0cygp
ICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBET01Bc1dlYkFyY2hpdmUoKSAmJiAhZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wU291cmNlQXNXZWJBcmNoaXZlKCk7Cit9CisKK3N0YXRp
YyBib29sIHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QoKQoreworICAgIHJldHVybiBnTGF5b3V0
VGVzdENvbnRyb2xsZXItPmR1bXBCYWNrRm9yd2FyZExpc3QoKTsKK30KKworc3RhdGljIGJvb2wg
aW5pdEVmbCgpCit7CisgICAgaWYgKCFlY29yZV9ldmFzX2luaXQoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIGlmICghZWNvcmVfZmlsZV9pbml0KCkpIHsKKyAgICAgICAgZWNvcmVfZXZh
c19zaHV0ZG93bigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZWRq
ZV9pbml0KCkpIHsKKyAgICAgICAgZWNvcmVfZmlsZV9zaHV0ZG93bigpOworICAgICAgICBlY29y
ZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYg
KCFld2tfaW5pdCgpKSB7CisgICAgICAgIGVkamVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNvcmVf
ZmlsZV9zaHV0ZG93bigpOworICAgICAgICBlY29yZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZv
aWQgc2h1dGRvd25FZmwoKQoreworICAgIGV3a19zaHV0ZG93bigpOworICAgIGVkamVfc2h1dGRv
d24oKTsKKyAgICBlY29yZV9maWxlX3NodXRkb3duKCk7CisgICAgZWNvcmVfZXZhc19zaHV0ZG93
bigpOworfQorCit2b2lkIGRpc3BsYXlXZWJWaWV3KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworfQorCit2b2lkIGR1bXAoKQoreworICAgIGludmFsaWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1
bXBXYXRjaGRvZygpOworCisgICAgaWYgKGR1bXBUcmVlKSB7CisgICAgICAgIGFkanVzdE91dHB1
dFR5cGVCeU1pbWVUeXBlKCk7CisgICAgICAgIGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KCk7CisK
KyAgICAgICAgaWYgKHNob3VsZER1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKCkpCisgICAgICAgICAg
ICBkdW1wRnJhbWVTY3JvbGxQb3NpdGlvbihtYWluRnJhbWUpOworCisgICAgICAgIGlmIChzaG91
bGREdW1wQmFja0ZvcndhcmRMaXN0KCkpCisgICAgICAgICAgICBkdW1wQmFja0ZvcndhcmRMaXN0
Rm9yV2ViVmlldyhicm93c2VyKTsKKworICAgICAgICBpZiAocHJpbnRTZXBhcmF0b3JzKSB7Cisg
ICAgICAgICAgICBwdXRzKCIjRU9GIik7CisgICAgICAgICAgICBmcHV0cygiI0VPRlxuIiwgc3Rk
ZXJyKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgZmZsdXNoKHN0
ZGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hvdWxkRHVtcFBpeGVsc0FuZENv
bXBhcmVXaXRoRXhwZWN0ZWQoKSkKKyAgICAgICAgZHVtcFdlYlZpZXdBc1BpeGVsc0FuZENvbXBh
cmVXaXRoRXhwZWN0ZWQoZ0xheW91dFRlc3RDb250cm9sbGVyLT5leHBlY3RlZFBpeGVsSGFzaCgp
KTsKKworICAgIGRvbmUgPSB0cnVlOworICAgIGVjb3JlX21haW5fbG9vcF9xdWl0KCk7Cit9CisK
K3N0YXRpYyB2b2lkIGNyZWF0ZUJyb3dzZXIoRXZhcyogZXZhcywgR0NDb250cm9sbGVyKiBnY0Nv
bnRyb2xsZXIpCit7CisgICAgYnJvd3NlciA9IGRydFZpZXdUaWxlZEFkZChldmFzKTsKKyAgICBp
ZiAoIWJyb3dzZXIpIHsKKyAgICAgICAgc2h1dGRvd25FZmwoKTsKKyAgICAgICAgZXhpdChFWElU
X0ZBSUxVUkUpOworICAgIH0KKworICAgIGV3a192aWV3X3RoZW1lX3NldChicm93c2VyLCBEQVRB
X0RJUiIvZGVmYXVsdC5lZGoiKTsKKworICAgIGV2YXNfb2JqZWN0X25hbWVfc2V0KGJyb3dzZXIs
ICJicm93c2VyIik7CisgICAgZXZhc19vYmplY3RfbW92ZShicm93c2VyLCAwLCAwKTsKKyAgICBl
dmFzX29iamVjdF9yZXNpemUoYnJvd3NlciwgODAwLCA2MDApOworICAgIGV2YXNfb2JqZWN0X2xh
eWVyX3NldChicm93c2VyLCBFVkFTX0xBWUVSX01BWCk7CisgICAgZXZhc19vYmplY3Rfc2hvdyhi
cm93c2VyKTsKKyAgICBldmFzX29iamVjdF9mb2N1c19zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsK
KworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChicm93c2VyLCAibG9hZCxzdGFy
dGVkIiwgb25Mb2FkU3RhcnRlZCwgMCk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tf
YWRkKGJyb3dzZXIsICJsb2FkLGZpbmlzaGVkIiwgb25Mb2FkRmluaXNoZWQsIDApOworICAgIGV2
YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChicm93c2VyLCAidGl0bGUsY2hhbmdlZCIsIG9u
VGl0bGVDaGFuZ2VkLCAwKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQoYnJv
d3NlciwgIndpbmRvdyxvYmplY3QsY2xlYXJlZCIsIG9uV2luZG93T2JqZWN0Q2xlYXJlZCwgZ2ND
b250cm9sbGVyKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQoYnJvd3Nlciwg
InN0YXR1c2Jhcix0ZXh0LHNldCIsIG9uU3RhdHVzYmFyVGV4dFNldCwgMCk7CisKKyAgICBtYWlu
RnJhbWUgPSBld2tfdmlld19mcmFtZV9tYWluX2dldChicm93c2VyKTsKKyAgICBldmFzX29iamVj
dF9zbWFydF9jYWxsYmFja19hZGQobWFpbkZyYW1lLCAibG9hZCxkb2N1bWVudCxmaW5pc2hlZCIs
IG9uRG9jdW1lbnRMb2FkRmluaXNoZWQsIDApOworfQorCitzdGF0aWMgRWNvcmVfRXZhcyogaW5p
dEVjb3JlRXZhcygpCit7CisgICAgRWNvcmVfRXZhcyogZWUgPSB1c2VYMTFXaW5kb3cgPyBlY29y
ZV9ldmFzX25ldygwLCAwLCAwLCA4MDAsIDYwMCwgMCkgOiBlY29yZV9ldmFzX2J1ZmZlcl9uZXco
ODAwLCA2MDApOworICAgIGlmICghZWUpIHsKKyAgICAgICAgc2h1dGRvd25FZmwoKTsKKyAgICAg
ICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAgIGVjb3JlX2V2YXNfdGl0bGVfc2V0
KGVlLCAiRUZMIER1bXBSZW5kZXJUcmVlIik7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19yZXNp
emVfc2V0KGVlLCBvbkVjb3JlRXZhc1Jlc2l6ZSk7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19k
ZWxldGVfcmVxdWVzdF9zZXQoZWUsIG9uQ2xvc2VXaW5kb3cpOworICAgIGVjb3JlX2V2YXNfc2hv
dyhlZSk7CisKKyAgICByZXR1cm4gZWU7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiog
YXJndikKK3sKKyAgICBpZiAoIXBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGFyZ2MsIGFyZ3YpKQor
ICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisgICAgaWYgKCFpbml0RWZsKCkpCisgICAg
ICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisKKyAgICBPd25QdHI8RWNvcmVfRXZhcz4gZWNvcmVF
dmFzID0gYWRvcHRQdHIoaW5pdEVjb3JlRXZhcygpKTsKKyAgICBPd25QdHI8R0NDb250cm9sbGVy
PiBnY0NvbnRyb2xsZXIgPSBhZG9wdFB0cihuZXcgR0NDb250cm9sbGVyKTsKKyAgICBjcmVhdGVC
cm93c2VyKGVjb3JlX2V2YXNfZ2V0KGVjb3JlRXZhcy5nZXQoKSksIGdjQ29udHJvbGxlci5nZXQo
KSk7CisgICAgYWRkRm9udHNUb0Vudmlyb25tZW50KCk7CisKKyAgICBpZiAodXNlTG9uZ1J1bm5p
bmdTZXJ2ZXJNb2RlKGFyZ2MsIGFyZ3YpKSB7CisgICAgICAgIHByaW50U2VwYXJhdG9ycyA9IHRy
dWU7CisgICAgICAgIHJ1blRlc3RpbmdTZXJ2ZXJMb29wKCk7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgcHJpbnRTZXBhcmF0b3JzID0gKG9wdGluZCA8IGFyZ2MgLSAxIHx8IChkdW1wUGl4ZWxzICYm
IGR1bXBUcmVlKSk7CisgICAgICAgIGZvciAoaW50IGkgPSBvcHRpbmQ7IGkgIT0gYXJnYzsgKytp
KQorICAgICAgICAgICAgcnVuVGVzdChhcmd2W2ldKTsKKyAgICB9CisKKyAgICBlY29yZUV2YXMu
Y2xlYXIoKTsKKworICAgIHNodXRkb3duRWZsKCk7CisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsK
K30KZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZUVm
bC5oIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlRWZsLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uNjRkOTA5NmIzNjNhNDgwNDZmZWIxZTc4ZmE5MGYwM2JjNDM3YmExMwotLS0gL2Rldi9u
dWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZUVmbC5oCkBA
IC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVtYmVk
ZGVkIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiAgUmVkIGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICog
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBEdW1wUmVuZGVyVHJlZUVmbF9oCisjZGVmaW5lIER1bXBSZW5k
ZXJUcmVlRWZsX2gKKworI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5jbHVkZSA8RXZhcy5oPgorCitl
eHRlcm4gRXZhc19PYmplY3QqIG1haW5GcmFtZTsKK2V4dGVybiBFdmFzX09iamVjdCogYnJvd3Nl
cjsKK2V4dGVybiBFdmFzX09iamVjdCogdG9wTG9hZGluZ0ZyYW1lOworZXh0ZXJuIGJvb2wgd2Fp
dEZvclBvbGljeTsKK2V4dGVybiBFY29yZV9UaW1lciogd2FpdFRvRHVtcFdhdGNoZG9nOworCisj
ZW5kaWYgLyogRHVtcFJlbmRlclRyZWVFZmxfaCAqLwpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2Vm
bC9Gb250TWFuYWdlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODlhOTMyOGZmMTVjZTQ4YmM5NDdjOGIz
MDVmNWQyYTI0MWI5YjQwZAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVl
L2VmbC9Gb250TWFuYWdlbWVudC5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVtYmVkZGVkIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoQykg
MjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiRm9udE1hbmFnZW1lbnQuaCIKKworI2luY2x1ZGUgPEVjb3JlX0ZpbGUuaD4K
KyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Zm9udGNvbmZpZy9mb250Y29uZmlnLmg+Cisj
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNp
bmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworc3RhdGljIFZlY3RvcjxTdHJpbmc+IGdl
dEZvbnREaXJlY3RvcmllcygpCit7CisgICAgVmVjdG9yPFN0cmluZz4gZm9udERpclBhdGhzOwor
CisgICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvVFRGLyIp
KTsKKyAgICBmb250RGlyUGF0aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFyZS9mb250cy90cnVl
dHlwZS90dGYtbGliZXJhdGlvbi8iKSk7CisgICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJpbmco
Ii91c3Ivc2hhcmUvZm9udHMvbGliZXJhdGlvbi8iKSk7CisgICAgZm9udERpclBhdGhzLmFwcGVu
ZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvdHJ1ZXR5cGUvdHRmLWRlamF2dS8iKSk7CisgICAg
Zm9udERpclBhdGhzLmFwcGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvZGVqYXZ1LyIpKTsK
KyAgICBmb250RGlyUGF0aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFyZS9mb250cy9PVEYvIikp
OyAvLyBNYXRoTUwKKyAgICBmb250RGlyUGF0aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFyZS9m
b250cy9vcGVudHlwZS9zdGl4LyIpKTsgLy8gTWF0aE1MCisgICAgZm9udERpclBhdGhzLmFwcGVu
ZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvc3RpeC8iKSk7IC8vIE1hdGhNTAorCisgICAgcmV0
dXJuIGZvbnREaXJQYXRoczsKK30KKworc3RhdGljIFZlY3RvcjxTdHJpbmc+IGdldEZvbnRGaWxl
cygpCit7CisgICAgVmVjdG9yPFN0cmluZz4gZm9udEZpbGVQYXRoczsKKworICAgIC8vIEFoZW0g
aXMgdXNlZCBieSBtYW55IGxheW91dCB0ZXN0cy4KKyAgICBmb250RmlsZVBhdGhzLmFwcGVuZChT
dHJpbmcoRk9OVFNfQ09ORl9ESVIgIi9BSEVNX19fXy5UVEYiKSk7CisgICAgLy8gQSBmb250IHdp
dGggbm8gdmFsaWQgRm9udGNvbmZpZyBlbmNvZGluZyB0byB0ZXN0IGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NzQ1MgorICAgIGZvbnRGaWxlUGF0aHMuYXBwZW5kKFN0
cmluZyhGT05UU19DT05GX0RJUiAiL0ZvbnRXaXRoTm9WYWxpZEVuY29kaW5nLmZvbiIpKTsKKwor
ICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDk7IGkrKykgeworICAgICAgICBjaGFyIGZvbnRQYXRo
W1BBVEhfTUFYXTsKKyAgICAgICAgc25wcmludGYoZm9udFBhdGgsIFBBVEhfTUFYIC0gMSwKKyAg
ICAgICAgICAgICAgICAgRk9OVFNfQ09ORl9ESVIgIi8uLi8uLi9mb250cy9XZWJLaXRXZWlnaHRX
YXRjaGVyJWkwMC50dGYiLCBpKTsKKworICAgICAgICBmb250RmlsZVBhdGhzLmFwcGVuZChTdHJp
bmcoZm9udFBhdGgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9udEZpbGVQYXRoczsKK30KKwor
c3RhdGljIHNpemVfdCBhZGRGb250RGlyZWN0b3JpZXMoY29uc3QgVmVjdG9yPFN0cmluZz4mIGZv
bnREaXJlY3RvcmllcywgRmNDb25maWcqIGNvbmZpZykKK3sKKyAgICBzaXplX3QgYWRkZWREaXJl
Y3RvcmllczsKKworICAgIGZvciAoVmVjdG9yPFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
Zm9udERpcmVjdG9yaWVzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBmb250RGlyZWN0b3JpZXMu
ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3QgQ1N0cmluZyBjdXJyZW50RGlyZWN0b3J5ID0g
KCppdCkudXRmOCgpOworICAgICAgICBjb25zdCBjaGFyKiBwYXRoID0gY3VycmVudERpcmVjdG9y
eS5kYXRhKCk7CisKKyAgICAgICAgaWYgKGVjb3JlX2ZpbGVfaXNfZGlyKHBhdGgpKSB7CisgICAg
ICAgICAgICBpZiAoIUZjQ29uZmlnQXBwRm9udEFkZERpcihjb25maWcsIHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgRmNDaGFyOCo+KHBhdGgpKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3Rk
ZXJyLCAiQ291bGQgbm90IGxvYWQgZm9udCBhdCAlcyFcbiIsIHBhdGgpOworICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK2FkZGVkRGlyZWN0
b3JpZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYWRkZWREaXJlY3RvcmllczsK
K30KKworc3RhdGljIHZvaWQgYWRkRm9udEZpbGVzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBmb250
RmlsZXMsIEZjQ29uZmlnKiBjb25maWcpCit7CisgICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBmb250RmlsZXMuYmVnaW4oKTsgaXQgIT0gZm9udEZpbGVzLmVuZCgp
OyArK2l0KSB7CisgICAgICAgIGNvbnN0IENTdHJpbmcgY3VycmVudEZpbGUgPSAoKml0KS51dGY4
KCk7CisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGggPSBjdXJyZW50RmlsZS5kYXRhKCk7CisKKyAg
ICAgICAgaWYgKCFGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlKGNvbmZpZywgcmVpbnRlcnByZXRfY2Fz
dDxjb25zdCBGY0NoYXI4Kj4ocGF0aCkpKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJD
b3VsZCBub3QgbG9hZCBmb250IGF0ICVzIVxuIiwgcGF0aCk7CisgICAgfQorfQorCit2b2lkIGFk
ZEZvbnRzVG9FbnZpcm9ubWVudCgpCit7CisgICAgRmNJbml0KCk7CisKKyAgICAvLyBMb2FkIG91
ciBjb25maWd1cmF0aW9uIGZpbGUsIHdoaWNoIHNldHMgdXAgcHJvcGVyIGFsaWFzZXMgZm9yIGZh
bWlseQorICAgIC8vIG5hbWVzIGxpa2Ugc2Fucywgc2VyaWYgYW5kIG1vbm9zcGFjZS4KKyAgICBG
Y0NvbmZpZyogY29uZmlnID0gRmNDb25maWdDcmVhdGUoKTsKKyAgICBjb25zdCBjaGFyKiBmb250
Q29uZmlnRmlsZW5hbWUgPSBGT05UU19DT05GX0RJUiAiL2ZvbnRzLmNvbmYiOworICAgIGlmICgh
RmNDb25maWdQYXJzZUFuZExvYWQoY29uZmlnLCByZWludGVycHJldF9jYXN0PGNvbnN0IEZjQ2hh
cjgqPihmb250Q29uZmlnRmlsZW5hbWUpLCB0cnVlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVy
ciwgIkNvdWxkbid0IGxvYWQgZm9udCBjb25maWd1cmF0aW9uIGZpbGUgZnJvbTogJXNcbiIsIGZv
bnRDb25maWdGaWxlbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgaWYgKCFh
ZGRGb250RGlyZWN0b3JpZXMoZ2V0Rm9udERpcmVjdG9yaWVzKCksIGNvbmZpZykpIHsKKyAgICAg
ICAgZnByaW50ZihzdGRlcnIsICJOb25lIG9mIHRoZSBmb250IGRpcmVjdG9yaWVzIGNvdWxkIGJl
IGFkZGVkLiBFaXRoZXIgaW5zdGFsbCB0aGVtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJv
ciBmaWxlIGEgYnVnIGF0IGh0dHA6Ly9idWdzLndlYmtpdC5vcmcgaWYgdGhleSBhcmUgaW5zdGFs
bGVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbm90aGVyIGxvY2F0aW9uLlxuIik7
CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgYWRkRm9udEZpbGVzKGdldEZvbnRGaWxl
cygpLCBjb25maWcpOworCisgICAgaWYgKCFGY0NvbmZpZ1NldEN1cnJlbnQoY29uZmlnKSkgewor
ICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBzZXQgdGhlIGN1cnJlbnQgZm9udCBj
b25maWd1cmF0aW9uIVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCmRpZmYgLS1n
aXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuaCBiL1Rvb2xzL0R1
bXBSZW5kZXJUcmVlL2VmbC9Gb250TWFuYWdlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ0OTc1MTNhZWRj
MTM5OWY0NmZjMGI5MWRkNGY0Mjg1NTdkNzQxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9E
dW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuaApAQCAtMCwwICsxLDMxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBG
b250TWFuYWdlbWVudF9oCisjZGVmaW5lIEZvbnRNYW5hZ2VtZW50X2gKKwordm9pZCBhZGRGb250
c1RvRW52aXJvbm1lbnQoKTsKKworI2VuZGlmIC8vIEZvbnRNYW5hZ2VtZW50X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98048</attachid>
            <date>2011-06-21 13:19:35 -0700</date>
            <delta_ts>2011-06-22 07:27:02 -0700</delta_ts>
            <desc>Same patch with one small bug fix.</desc>
            <filename>drt.diff</filename>
            <type>text/plain</type>
            <size>29400</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCQorKysgYS9Ub29scy9DaGFuZ2VMb2cJCkBAIC0xLDMgKzEs
NTkgQEAgCisyMDExLTA2LTIxICBMZWFuZHJvIFBlcmVpcmEgIDxsZWFuZHJvQHByb2Z1c2lvbi5t
b2JpPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtF
RkxdIERSVDogQWRkIER1bXBSZW5kZXJUcmVlLmNwcCBhbmQgRHVtcFJlbmRlclRyZWVFZmwuaCBh
bG9uZyB3aXRoCisgICAgICAgIHN1cHBvcnQgZmlsZXMuCisgICAgICAgIEJ1aWxkIHN5c3RlbSBj
aGFuZ2VzIHdpbGwgYmUgdXBzdHJlYW1lZCBhcyBzb29uIGFzIG90aGVyIERSVC1yZWxhdGVkCisg
ICAgICAgIGZpbGVzIGFyZSBhbHNvIG9uIHRoZSB0cmVlLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIwMzQKKworICAgICAgICAqIER1bXBSZW5kZXJU
cmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHA6IEFkZGVkLgorICAgICAgICAoZHVtcEZyYW1lc0Fz
VGV4dCk6CisgICAgICAgIChkdW1wRnJhbWVTY3JvbGxQb3NpdGlvbik6CisgICAgICAgIChzaG91
bGRMb2dGcmFtZUxvYWREZWxlZ2F0ZXMpOgorICAgICAgICAoc2hvdWxkRHVtcEFzVGV4dCk6Cisg
ICAgICAgIChzZW5kUGl4ZWxSZXN1bHRzRU9GKToKKyAgICAgICAgKGludmFsaWRhdGVBbnlQcmV2
aW91c1dhaXRUb0R1bXBXYXRjaGRvZyk6CisgICAgICAgIChwcm9jZXNzV29yayk6CisgICAgICAg
IChhZGRDb250cm9sbGVyVG9XaW5kb3cpOgorICAgICAgICAob25XaW5kb3dPYmplY3RDbGVhcmVk
KToKKyAgICAgICAgKG9uU3RhdHVzYmFyVGV4dFNldCk6CisgICAgICAgIChvbkxvYWRTdGFydGVk
KToKKyAgICAgICAgKG9uTG9hZEZpbmlzaGVkKToKKyAgICAgICAgKG9uVGl0bGVDaGFuZ2VkKToK
KyAgICAgICAgKG9uRG9jdW1lbnRMb2FkRmluaXNoZWQpOgorICAgICAgICAob25FY29yZUV2YXNS
ZXNpemUpOgorICAgICAgICAob25DbG9zZVdpbmRvdyk6CisgICAgICAgICh1c2VMb25nUnVubmlu
Z1NlcnZlck1vZGUpOgorICAgICAgICAocGFyc2VDb21tYW5kTGluZU9wdGlvbnMpOgorICAgICAg
ICAocmVzZXREZWZhdWx0c1RvQ29uc2lzdGVudFZhbHVlcyk6CisgICAgICAgIChnZXRGaW5hbFRl
c3RVUkwpOgorICAgICAgICAoZ2V0RXhwZWN0ZWRQaXhlbEhhc2gpOgorICAgICAgICAoY3JlYXRl
TGF5b3V0VGVzdENvbnRyb2xsZXIpOgorICAgICAgICAocnVuVGVzdCk6CisgICAgICAgIChydW5U
ZXN0aW5nU2VydmVyTG9vcCk6CisgICAgICAgIChhZGp1c3RPdXRwdXRUeXBlQnlNaW1lVHlwZSk6
CisgICAgICAgIChkdW1wRnJhbWVDb250ZW50c0FzVGV4dCk6CisgICAgICAgIChzaG91bGREdW1w
RnJhbWVTY3JvbGxQb3NpdGlvbik6CisgICAgICAgIChzaG91bGREdW1wUGl4ZWxzQW5kQ29tcGFy
ZVdpdGhFeHBlY3RlZCk6CisgICAgICAgIChzaG91bGREdW1wQmFja0ZvcndhcmRMaXN0KToKKyAg
ICAgICAgKGluaXRFZmwpOgorICAgICAgICAoc2h1dGRvd25FZmwpOgorICAgICAgICAoZGlzcGxh
eVdlYlZpZXcpOgorICAgICAgICAoZHVtcCk6CisgICAgICAgIChjcmVhdGVCcm93c2VyKToKKyAg
ICAgICAgKGluaXRFY29yZUV2YXMpOgorICAgICAgICAobWFpbik6CisgICAgICAgICogRHVtcFJl
bmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlRWZsLmg6IEFkZGVkLgorICAgICAgICAqIER1bXBS
ZW5kZXJUcmVlL2VmbC9Gb250TWFuYWdlbWVudC5jcHA6IEFkZGVkLgorICAgICAgICAoZ2V0Rm9u
dERpcmVjdG9yaWVzKToKKyAgICAgICAgKGdldEZvbnRGaWxlcyk6CisgICAgICAgIChhZGRGb250
RGlyZWN0b3JpZXMpOgorICAgICAgICAoYWRkRm9udEZpbGVzKToKKyAgICAgICAgKGFkZEZvbnRz
VG9FbnZpcm9ubWVudCk6CisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsL0ZvbnRNYW5hZ2Vt
ZW50Lmg6IEFkZGVkLgorCiAyMDExLTA2LTIwICBEbWl0cnkgTG9tb3YgIDxkc2xvbW92QGdvb2ds
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGF2aWQgTGV2aW4uCi0tLSBhL1Rvb2xzL0R1
bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHAJCisrKyBhL1Rvb2xzL0R1bXBSZW5k
ZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHAJCkBAIC0wLDAgKzEsNTY0IEBAIAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJp
Z2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZS5oIgorCisjaW5jbHVkZSAiRHVtcEhp
c3RvcnlJdGVtLmgiCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWVWaWV3LmgiCisjaW5jbHVkZSAi
RXZlbnRTZW5kZXIuaCIKKyNpbmNsdWRlICJGb250TWFuYWdlbWVudC5oIgorI2luY2x1ZGUgIkdD
Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIkxheW91dFRlc3RDb250cm9sbGVyLmgiCisjaW5jbHVk
ZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQaXhlbER1bXBTdXBwb3J0LmgiCisjaW5j
bHVkZSAiV29ya1F1ZXVlLmgiCisjaW5jbHVkZSAiZXdrX3ByaXZhdGUuaCIgLy8gRklYTUU6IGNy
ZWF0ZSBzb21lIFdlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlLmNwcCBpbnN0ZWFkCisjaW5j
bHVkZSA8RVdlYktpdC5oPgorI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5jbHVkZSA8RWNvcmVfRXZh
cy5oPgorI2luY2x1ZGUgPEVjb3JlX0ZpbGUuaD4KKyNpbmNsdWRlIDxFZGplLmg+CisjaW5jbHVk
ZSA8RXZhcy5oPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgorI2luY2x1ZGUg
PGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRleHQvQ1N0cmluZy5o
PgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25GYXN0TWFsbG9jUHRyLmg+
CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCitFdmFzX09iamVjdCogYnJvd3NlciA9IDA7CitF
dmFzX09iamVjdCogbWFpbkZyYW1lID0gMDsKK0V2YXNfT2JqZWN0KiB0b3BMb2FkaW5nRnJhbWUg
PSAwOworYm9vbCB3YWl0Rm9yUG9saWN5ID0gZmFsc2U7CitFY29yZV9UaW1lciogd2FpdFRvRHVt
cFdhdGNoZG9nID0gMDsKK2V4dGVybiBFd2tfSGlzdG9yeV9JdGVtKiBwcmV2VGVzdEJGSXRlbTsK
KworLy8gRnJvbSB0aGUgdG9wLWxldmVsIER1bXBSZW5kZXJUcmVlLmgKK1JlZlB0cjxMYXlvdXRU
ZXN0Q29udHJvbGxlcj4gZ0xheW91dFRlc3RDb250cm9sbGVyOwordm9sYXRpbGUgYm9vbCBkb25l
ID0gZmFsc2U7CisKK3N0YXRpYyBpbnQgZHVtcFBpeGVscyA9IGZhbHNlOworc3RhdGljIGludCBk
dW1wVHJlZSA9IHRydWU7CitzdGF0aWMgaW50IHByaW50U2VwYXJhdG9ycyA9IHRydWU7CitzdGF0
aWMgaW50IHVzZVgxMVdpbmRvdyA9IGZhbHNlOworCitzdGF0aWMgV1RGOjpTdHJpbmcgZHVtcEZy
YW1lc0FzVGV4dChFdmFzX09iamVjdCogZnJhbWUpCit7CisgICAgT3duRmFzdE1hbGxvY1B0cjxj
aGFyPiBpbm5lclRleHQoZXdrX2ZyYW1lX2lubmVyX3RleHRfZ2V0KGZyYW1lKSk7CisgICAgV1RG
OjpTdHJpbmcgcmVzdWx0OworCisgICAgaWYgKGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KGJyb3dz
ZXIpID09IGZyYW1lKQorICAgICAgICByZXN1bHQgPSBXVEY6OlN0cmluZzo6Zm9ybWF0KCIlc1xu
IiwgaW5uZXJUZXh0LmdldCgpKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFdURjo6U3Ry
aW5nOjpmb3JtYXQoIlxuLS0tLS0tLS1cbkZyYW1lOiAnJXMnXG4tLS0tLS0tLVxuJXNcbiIsIGV3
a19mcmFtZV9uYW1lX2dldChmcmFtZSksIGlubmVyVGV4dC5nZXQoKSk7CisKKyAgICBpZiAoZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSkgeworICAgICAgICBF
aW5hX0l0ZXJhdG9yKiBjaGlsZHJlbiA9IGV3a19mcmFtZV9jaGlsZHJlbl9pdGVyYXRvcl9uZXco
ZnJhbWUpOworICAgICAgICBFdmFzX09iamVjdCogY2hpbGQ7CisKKyAgICAgICAgRUlOQV9JVEVS
QVRPUl9GT1JFQUNIKGNoaWxkcmVuLCBjaGlsZCkgeworICAgICAgICAgICAgV1RGOjpTdHJpbmcg
dGVtcFRleHQoZHVtcEZyYW1lc0FzVGV4dChjaGlsZCkpOworCisgICAgICAgICAgICBpZiAodGVt
cFRleHQuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAg
ICByZXN1bHQuYXBwZW5kKHRlbXBUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGVpbmFfaXRl
cmF0b3JfZnJlZShjaGlsZHJlbik7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwor
c3RhdGljIHZvaWQgZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oRXZhc19PYmplY3QqIG1haW5GcmFt
ZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGRMb2dG
cmFtZUxvYWREZWxlZ2F0ZXMoY29uc3QgV1RGOjpTdHJpbmcmIHBhdGhPclVSTCkKK3sKKyAgICBy
ZXR1cm4gcGF0aE9yVVJMLmNvbnRhaW5zKCJsb2FkaW5nLyIpOworfQorCitzdGF0aWMgYm9vbCBz
aG91bGREdW1wQXNUZXh0KGNvbnN0IFdURjo6U3RyaW5nJiBwYXRoT3JVUkwpCit7CisgICAgcmV0
dXJuIHBhdGhPclVSTC5jb250YWlucygiZHVtcEFzVGV4dC8iKTsKK30KKworc3RhdGljIHZvaWQg
c2VuZFBpeGVsUmVzdWx0c0VPRigpCit7CisgICAgcHV0cygiI0VPRiIpOworICAgIGZmbHVzaChz
dGRvdXQpOworICAgIGZmbHVzaChzdGRlcnIpOworfQorCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRl
QW55UHJldmlvdXNXYWl0VG9EdW1wV2F0Y2hkb2coKQoreworICAgIGlmICh3YWl0VG9EdW1wV2F0
Y2hkb2cpIHsKKyAgICAgICAgZWNvcmVfdGltZXJfZGVsKHdhaXRUb0R1bXBXYXRjaGRvZyk7Cisg
ICAgICAgIHdhaXRUb0R1bXBXYXRjaGRvZyA9IDA7CisgICAgfQorICAgIHdhaXRGb3JQb2xpY3kg
PSBmYWxzZTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBwcm9jZXNzV29yayh2b2lkKiBkYXRhKQor
eworICAgIGlmIChXb3JrUXVldWU6OnNoYXJlZCgpLT5wcm9jZXNzV29yaygpICYmICFnTGF5b3V0
VGVzdENvbnRyb2xsZXItPndhaXRUb0R1bXAoKSkKKyAgICAgICAgZHVtcCgpOworICAgIHJldHVy
biBFQ09SRV9DQUxMQkFDS19DQU5DRUw7Cit9CisKK3N0YXRpYyB2b2lkIGFkZENvbnRyb2xsZXJU
b1dpbmRvdyhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgd2luZG93T2JqZWN0LCBj
b25zdCBjaGFyKiBjb250cm9sbGVyTmFtZSwgSlNWYWx1ZVJlZiBjb250cm9sbGVyKQoreworICAg
IEpTU3RyaW5nUmVmIGNvbnRyb2xsZXJOYW1lU3RyID0gSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENT
dHJpbmcoY29udHJvbGxlck5hbWUpOworICAgIEpTT2JqZWN0U2V0UHJvcGVydHkoY29udGV4dCwg
d2luZG93T2JqZWN0LCBjb250cm9sbGVyTmFtZVN0ciwgY29udHJvbGxlciwga0pTUHJvcGVydHlB
dHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSwgMCk7Cisg
ICAgSlNTdHJpbmdSZWxlYXNlKGNvbnRyb2xsZXJOYW1lU3RyKTsKK30KKworc3RhdGljIHZvaWQg
b25XaW5kb3dPYmplY3RDbGVhcmVkKHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmlldywg
dm9pZCogZXZlbnRJbmZvKQoreworICAgIEV3a19XaW5kb3dfT2JqZWN0X0NsZWFyZWRfRXZlbnQq
IG9iamVjdENsZWFyZWRJbmZvID0gc3RhdGljX2Nhc3Q8RXdrX1dpbmRvd19PYmplY3RfQ2xlYXJl
ZF9FdmVudCo+KGV2ZW50SW5mbyk7CisgICAgSlNWYWx1ZVJlZiBleGNlcHRpb24gPSAwOworICAg
IEFTU0VSVChnTGF5b3V0VGVzdENvbnRyb2xsZXIpOworCisgICAgR0NDb250cm9sbGVyKiBnY0Nv
bnRyb2xsZXIgPSBzdGF0aWNfY2FzdDxHQ0NvbnRyb2xsZXIqPih1c2VyRGF0YSk7CisgICAgQVNT
RVJUKGdjQ29udHJvbGxlcik7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPm1ha2VXaW5k
b3dPYmplY3Qob2JqZWN0Q2xlYXJlZEluZm8tPmNvbnRleHQsIG9iamVjdENsZWFyZWRJbmZvLT53
aW5kb3dPYmplY3QsICZleGNlcHRpb24pOworICAgIEFTU0VSVCghZXhjZXB0aW9uKTsKKworICAg
IGdjQ29udHJvbGxlci0+bWFrZVdpbmRvd09iamVjdChvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4
dCwgb2JqZWN0Q2xlYXJlZEluZm8tPndpbmRvd09iamVjdCwgJmV4Y2VwdGlvbik7CisgICAgQVNT
RVJUKCFleGNlcHRpb24pOworCisgICAgLyogRklYTUUgcy9mYWxzZS8hZ2V0X3BhcmVudC8gKi8K
KyAgICBhZGRDb250cm9sbGVyVG9XaW5kb3cob2JqZWN0Q2xlYXJlZEluZm8tPmNvbnRleHQsIG9i
amVjdENsZWFyZWRJbmZvLT53aW5kb3dPYmplY3QsICJldmVudFNlbmRlciIsIG1ha2VFdmVudFNl
bmRlcihvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgZmFsc2UpKTsKK30KKworc3RhdGljIHZv
aWQgb25TdGF0dXNiYXJUZXh0U2V0KHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmlldywg
dm9pZCogZXZlbnRJbmZvKQoreworICAgIGlmICghZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1w
U3RhdHVzQ2FsbGJhY2tzKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IGNoYXIqIHN0
YXR1c2JhclRleHQgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZXZlbnRJbmZvKTsKKyAgICBw
cmludGYoIlVJIERFTEVHQVRFIFNUQVRVUyBDQUxMQkFDSzogc2V0U3RhdHVzVGV4dDolc1xuIiwg
c3RhdHVzYmFyVGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uTG9hZFN0YXJ0ZWQodm9pZCogdXNl
ckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBldmVudEluZm8pCit7CisgICAgLy8gRklY
TUU6IHdlIGFjdHVhbGx5IG5lZWQgdGhlIGZyYW1lIHJlbGF0ZWQgdG8gdGhpcyBldmVudAorICAg
IEV2YXNfT2JqZWN0KiBmcmFtZSA9IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KHZpZXcpOworCisg
ICAgLy8gTWFrZSBzdXJlIHdlIG9ubHkgc2V0IHRoaXMgb25jZSBwZXIgdGVzdC4gSWYgaXQgZ2V0
cyBjbGVhcmVkLCBhbmQgdGhlbiBzZXQgYWdhaW4sIHdlIG1pZ2h0CisgICAgLy8gZW5kIHVwIGRv
aW5nIHR3byBkdW1wcyBmb3Igb25lIHRlc3QuCisgICAgaWYgKCF0b3BMb2FkaW5nRnJhbWUgJiYg
IWRvbmUpCisgICAgICAgIHRvcExvYWRpbmdGcmFtZSA9IGZyYW1lOworfQorCitzdGF0aWMgdm9p
ZCBvbkxvYWRGaW5pc2hlZCh2b2lkKiB1c2VyRGF0YSwgRXZhc19PYmplY3QqIHZpZXcsIHZvaWQq
IGV2ZW50SW5mbykKK3sKKyAgICAvLyBGSVhNRTogd2UgYWN0dWFsbHkgbmVlZCB0aGUgZnJhbWUg
cmVsYXRlZCB0byB0aGlzIGV2ZW50CisgICAgRXZhc19PYmplY3QqIGZyYW1lID0gZXdrX3ZpZXdf
ZnJhbWVfbWFpbl9nZXQodmlldyk7CisKKyAgICBpZiAodG9wTG9hZGluZ0ZyYW1lICE9IGZyYW1l
KQorICAgICAgICByZXR1cm47CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOworCisgICAgV29y
a1F1ZXVlOjpzaGFyZWQoKS0+c2V0RnJvemVuKHRydWUpOworICAgIGlmIChnTGF5b3V0VGVzdENv
bnRyb2xsZXItPndhaXRUb0R1bXAoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKFdvcmtR
dWV1ZTo6c2hhcmVkKCktPmNvdW50KCkpCisgICAgICAgIGVjb3JlX2lkbGVyX2FkZChwcm9jZXNz
V29yaywgMCk7CisgICAgZWxzZQorICAgICAgICBkdW1wKCk7Cit9CisKK3N0YXRpYyB2b2lkIG9u
VGl0bGVDaGFuZ2VkKHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmlldywgdm9pZCogZXZl
bnRJbmZvKQoreworfQorCitzdGF0aWMgdm9pZCBvbkRvY3VtZW50TG9hZEZpbmlzaGVkKHZvaWQq
IHVzZXJEYXRhLCBFdmFzX09iamVjdCogZnJhbWUsIHZvaWQqIGV2ZW50SW5mbykKK3sKKyAgICBj
b25zdCBXVEY6OlN0cmluZyBmcmFtZU5hbWUoZXdrX2ZyYW1lX3N1aXRhYmxlX2RydF9uYW1lX2dl
dChmcmFtZSkpOworCisgICAgaWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVt
cEZyYW1lTG9hZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIiVzIC0gZGlkRmluaXNoRG9j
dW1lbnRMb2FkRm9yRnJhbWVcbiIsIGZyYW1lTmFtZS51dGY4KCkuZGF0YSgpKTsKKyAgICBlbHNl
IGlmICghZG9uZSkgeworICAgICAgICBjb25zdCB1bnNpZ25lZCBwZW5kaW5nRnJhbWVVbmxvYWRF
dmVudHMgPSBld2tfZnJhbWVfcGVuZGluZ191bmxvYWRfZXZlbnRfY291bnRfZ2V0KGZyYW1lKTsK
KyAgICAgICAgaWYgKHBlbmRpbmdGcmFtZVVubG9hZEV2ZW50cykKKyAgICAgICAgICAgIHByaW50
ZigiJXMgLSBoYXMgJXUgb251bmxvYWQgaGFuZGxlcihzKVxuIiwgZnJhbWVOYW1lLnV0ZjgoKS5k
YXRhKCksIHBlbmRpbmdGcmFtZVVubG9hZEV2ZW50cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9p
ZCBvbkVjb3JlRXZhc1Jlc2l6ZShFY29yZV9FdmFzKiBlZSkKK3sKKyAgICBpbnQgd2lkdGgsIGhl
aWdodDsKKworICAgIGVjb3JlX2V2YXNfZ2VvbWV0cnlfZ2V0KGVlLCAwLCAwLCAmd2lkdGgsICZo
ZWlnaHQpOworICAgIGV2YXNfb2JqZWN0X21vdmUoYnJvd3NlciwgMCwgMCk7CisgICAgZXZhc19v
YmplY3RfcmVzaXplKGJyb3dzZXIsIHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBv
bkNsb3NlV2luZG93KEVjb3JlX0V2YXMqIGVlKQoreworfQorCitzdGF0aWMgRWluYV9Cb29sIHVz
ZUxvbmdSdW5uaW5nU2VydmVyTW9kZShpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgcmV0
dXJuIChhcmdjID09IG9wdGluZCArIDEgJiYgIXN0cmNtcChhcmd2W29wdGluZF0sICItIikpOwor
fQorCitzdGF0aWMgYm9vbCBwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhpbnQgYXJnYywgY2hhcioq
IGFyZ3YpCit7CisgICAgc3RhdGljIGNvbnN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgICAg
IHsibm90cmVlIiwgbm9fYXJndW1lbnQsICZkdW1wVHJlZSwgZmFsc2V9LAorICAgICAgICB7InBp
eGVsLXRlc3RzIiwgbm9fYXJndW1lbnQsICZkdW1wUGl4ZWxzLCB0cnVlfSwKKyAgICAgICAgeyJ0
cmVlIiwgbm9fYXJndW1lbnQsICZkdW1wVHJlZSwgdHJ1ZX0sCisgICAgICAgIHsiZ3VpIiwgbm9f
YXJndW1lbnQsICZ1c2VYMTFXaW5kb3csIHRydWV9LAorICAgICAgICB7MCwgMCwgMCwgMH0KKyAg
ICB9OworICAgIGludCBvcHRpb247CisKKyAgICB3aGlsZSAoKG9wdGlvbiA9IGdldG9wdF9sb25n
KGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiwgIiIsIG9wdGlvbnMsIDApKSAhPSAtMSkgeworICAg
ICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgY2FzZSAn
Oic6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcmVzZXREZWZhdWx0c1RvQ29uc2lzdGVudFZh
bHVlcygpCit7CisgICAgZXdrX3NldHRpbmdzX2ljb25fZGF0YWJhc2VfY2xlYXIoKTsKKyAgICBl
d2tfc2V0dGluZ3NfaWNvbl9kYXRhYmFzZV9wYXRoX3NldCgwKTsKKworICAgIGV3a192aWV3X3Nl
dHRpbmdfcHJpdmF0ZV9icm93c2luZ19zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7CisgICAgZXdr
X3ZpZXdfc2V0dGluZ19zcGF0aWFsX25hdmlnYXRpb25fc2V0KGJyb3dzZXIsIEVJTkFfRkFMU0Up
OworICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX2ZyYW1lX2ZsYXR0ZW5pbmdfc2V0KGJyb3dz
ZXIsIEVJTkFfRkFMU0UpOworICAgIGV3a192aWV3X3NldHRpbmdfb2ZmbGluZV9hcHBfY2FjaGVf
c2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfc2Ny
aXB0c19zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRf
c3RhbmRhcmRfc2V0KGJyb3dzZXIsICJUaW1lcyIpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9u
dF9tb25vc3BhY2Vfc2V0KGJyb3dzZXIsICJDb3VyaWVyIik7CisgICAgZXdrX3ZpZXdfc2V0dGlu
Z19mb250X3NlcmlmX3NldChicm93c2VyLCAiVGltZXMiKTsKKyAgICBld2tfdmlld19zZXR0aW5n
X2ZvbnRfc2Fuc19zZXJpZl9zZXQoYnJvd3NlciwgIkhlbHZldGljYSIpOworICAgIGV3a192aWV3
X3NldHRpbmdfZm9udF9jdXJzaXZlX3NldChicm93c2VyLCAiY3Vyc2l2ZSIpOworICAgIGV3a192
aWV3X3NldHRpbmdfZm9udF9mYW50YXN5X3NldChicm93c2VyLCAiZmFudGFzeSIpOworICAgIGV3
a192aWV3X3NldHRpbmdfZm9udF9kZWZhdWx0X3NpemVfc2V0KGJyb3dzZXIsIDEyKTsKKyAgICBl
d2tfdmlld19zZXR0aW5nX2ZvbnRfbW9ub3NwYWNlX3NpemVfc2V0KGJyb3dzZXIsIDEwKTsKKyAg
ICBld2tfdmlld19zZXR0aW5nX2ZvbnRfbWluaW11bV9zaXplX3NldChicm93c2VyLCAwKTsKKyAg
ICBld2tfdmlld19zZXR0aW5nX2NhcmV0X2Jyb3dzaW5nX3NldChicm93c2VyLCBFSU5BX0ZBTFNF
KTsKKyAgICBld2tfdmlld19zZXR0aW5nX3BhZ2VfY2FjaGVfc2V0KGJyb3dzZXIsIEVJTkFfRkFM
U0UpOworICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX2F1dG9fcmVzaXplX3dpbmRvd19zZXQo
YnJvd3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9wbHVnaW5z
X3NldChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfc2NyaXB0c193
aW5kb3dfb3Blbl9zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKworICAgIGV3a192aWV3X3pvb21f
c2V0KGJyb3dzZXIsIDEuMCwgMCwgMCk7CisKKyAgICBFd2tfSGlzdG9yeSogaGlzdG9yeSA9IGV3
a192aWV3X2hpc3RvcnlfZ2V0KGJyb3dzZXIpOworICAgIGludCBsaW1pdCA9IGV3a19oaXN0b3J5
X2xpbWl0X2dldChoaXN0b3J5KTsKKyAgICBld2tfaGlzdG9yeV9saW1pdF9zZXQoaGlzdG9yeSwg
MCk7CisgICAgZXdrX2hpc3RvcnlfbGltaXRfc2V0KGhpc3RvcnksIGxpbWl0KTsKKworICAgIGV3
a19jb29raWVzX2NsZWFyKCk7CisgICAgZXdrX2Nvb2tpZXNfcG9saWN5X3NldChFV0tfQ09PS0lF
X0pBUl9BQ0NFUFRfTk9fVEhJUkRfUEFSVFkpOworCisgICAgZXdrX2ZyYW1lX29wZW5lcl9jbGVh
cihld2tfdmlld19mcmFtZV9tYWluX2dldChicm93c2VyKSk7Cit9CisKK3N0YXRpYyBXVEY6OlN0
cmluZyBnZXRGaW5hbFRlc3RVUkwoY29uc3QgV1RGOjpTdHJpbmcmIHRlc3RVUkwpCit7CisgICAg
Y29uc3Qgc2l6ZV90IGhhc2hTZXBhcmF0b3JQb3MgPSB0ZXN0VVJMLmZpbmQoIiciKTsKKyAgICBp
ZiAoaGFzaFNlcGFyYXRvclBvcyAhPSBub3RGb3VuZCkKKyAgICAgICAgcmV0dXJuIHRlc3RVUkwu
bGVmdChoYXNoU2VwYXJhdG9yUG9zKTsKKworICAgIC8vIENvbnZlcnQgdGhlIHBhdGggaW50byBh
IGZ1bGwgZmlsZSBVUkwgaWYgaXQgZG9lcyBub3QgbG9vaworICAgIC8vIGxpa2UgYW4gSFRUUC9T
IFVSTCAoZG9lc24ndCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLgorICAgIGlmICgh
dGVzdFVSTC5zdGFydHNXaXRoKCJodHRwOi8vIikgJiYgIXRlc3RVUkwuc3RhcnRzV2l0aCgiaHR0
cHM6Ly8iKSkgeworICAgICAgICBPd25GYXN0TWFsbG9jUHRyPGNoYXI+IGZpbGVQYXRoKGVjb3Jl
X2ZpbGVfcmVhbHBhdGgodGVzdFVSTC51dGY4KCkuZGF0YSgpKSk7CisKKyAgICAgICAgaWYgKGVj
b3JlX2ZpbGVfZXhpc3RzKGZpbGVQYXRoLmdldCgpKSkKKyAgICAgICAgICAgIHJldHVybiBXVEY6
OlN0cmluZzo6Zm9ybWF0KCJmaWxlOi8vJXMiLCBmaWxlUGF0aC5nZXQoKSk7CisgICAgfQorCisg
ICAgcmV0dXJuIHRlc3RVUkw7Cit9CisKK3N0YXRpYyBXVEY6OlN0cmluZyBnZXRFeHBlY3RlZFBp
eGVsSGFzaChjb25zdCBXVEY6OlN0cmluZyYgdGVzdFVSTCkKK3sKKyAgICBjb25zdCBzaXplX3Qg
aGFzaFNlcGFyYXRvclBvcyA9IHRlc3RVUkwuZmluZCgiJyIpOworICAgIHJldHVybiAoaGFzaFNl
cGFyYXRvclBvcyA9PSBub3RGb3VuZCkgPyB0ZXN0VVJMLnJpZ2h0KGhhc2hTZXBhcmF0b3JQb3Mp
IDogV1RGOjpTdHJpbmcoKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlTGF5b3V0VGVzdENvbnRy
b2xsZXIoY29uc3QgV1RGOjpTdHJpbmcmIHRlc3RVUkwsIGNvbnN0IFdURjo6U3RyaW5nJiBleHBl
Y3RlZFBpeGVsSGFzaCkKK3sKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXIgPQorICAgICAgICBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6Y3JlYXRlKHN0ZDo6c3RyaW5nKHRlc3RVUkwudXRmOCgpLmRh
dGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmco
ZXhwZWN0ZWRQaXhlbEhhc2gudXRmOCgpLmRhdGEoKSkpOworCisgICAgdG9wTG9hZGluZ0ZyYW1l
ID0gMDsKKyAgICBkb25lID0gZmFsc2U7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNl
dEljb25EYXRhYmFzZUVuYWJsZWQoZmFsc2UpOworCisgICAgaWYgKHNob3VsZExvZ0ZyYW1lTG9h
ZERlbGVnYXRlcyh0ZXN0VVJMKSkKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRE
dW1wRnJhbWVMb2FkQ2FsbGJhY2tzKHRydWUpOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVy
LT5zZXREZXZlbG9wZXJFeHRyYXNFbmFibGVkKHRydWUpOworCisgICAgaWYgKHNob3VsZER1bXBB
c1RleHQodGVzdFVSTCkpIHsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXREdW1w
QXNUZXh0KHRydWUpOworICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldEdlbmVyYXRl
UGl4ZWxSZXN1bHRzKGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJ1blRlc3QoY29u
c3QgY2hhciogY1Rlc3RQYXRoT3JVUkwpCit7CisgICAgY29uc3QgV1RGOjpTdHJpbmcgdGVzdFBh
dGhPclVSTCA9IFdURjo6U3RyaW5nOjpmcm9tVVRGOChjVGVzdFBhdGhPclVSTCk7CisgICAgQVNT
RVJUKCF0ZXN0UGF0aE9yVVJMLmlzRW1wdHkoKSk7CisKKyAgICBjb25zdCBXVEY6OlN0cmluZyB0
ZXN0VVJMID0gZ2V0RmluYWxUZXN0VVJMKHRlc3RQYXRoT3JVUkwpOworICAgIGNvbnN0IFdURjo6
U3RyaW5nIGV4cGVjdGVkUGl4ZWxIYXNoID0gZ2V0RXhwZWN0ZWRQaXhlbEhhc2godGVzdFBhdGhP
clVSTCk7CisKKyAgICByZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKCk7CisgICAgY3Jl
YXRlTGF5b3V0VGVzdENvbnRyb2xsZXIodGVzdFVSTCwgZXhwZWN0ZWRQaXhlbEhhc2gpOworCisg
ICAgV29ya1F1ZXVlOjpzaGFyZWQoKS0+Y2xlYXIoKTsKKyAgICBXb3JrUXVldWU6OnNoYXJlZCgp
LT5zZXRGcm96ZW4oZmFsc2UpOworCisgICAgY29uc3QgYm9vbCBpc1NWR1czQ1Rlc3QgPSB0ZXN0
VVJMLmNvbnRhaW5zKCJzdmcvVzNDLVNWRy0xLjEiKTsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBp
c1NWR1czQ1Rlc3QgPyA0ODAgOiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld1dpZHRoOwor
ICAgIGNvbnN0IGludCBoZWlnaHQgPSBpc1NWR1czQ1Rlc3QgPyAzNjAgOiBMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6bWF4Vmlld0hlaWdodDsKKyAgICBldmFzX29iamVjdF9yZXNpemUoYnJvd3Nlciwg
d2lkdGgsIGhlaWdodCk7CisKKyAgICBpZiAocHJldlRlc3RCRkl0ZW0pCisgICAgICAgIGV3a19o
aXN0b3J5X2l0ZW1fZnJlZShwcmV2VGVzdEJGSXRlbSk7CisgICAgY29uc3QgRXdrX0hpc3Rvcnkq
IGhpc3RvcnkgPSBld2tfdmlld19oaXN0b3J5X2dldChicm93c2VyKTsKKyAgICBwcmV2VGVzdEJG
SXRlbSA9IGV3a19oaXN0b3J5X2hpc3RvcnlfaXRlbV9jdXJyZW50X2dldChoaXN0b3J5KTsKKwor
ICAgIGV2YXNfb2JqZWN0X2ZvY3VzX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192
aWV3X3VyaV9zZXQoYnJvd3NlciwgdGVzdFVSTC51dGY4KCkuZGF0YSgpKTsKKworICAgIGVjb3Jl
X21haW5fbG9vcF9iZWdpbigpOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5jbG9zZVdl
Ykluc3BlY3RvcigpOworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RGV2ZWxvcGVyRXh0
cmFzRW5hYmxlZChmYWxzZSk7CisKKyAgICBld2tfdmlld191cmlfc2V0KGJyb3dzZXIsICJhYm91
dDpibGFuayIpOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLmNsZWFyKCk7CisgICAgc2Vu
ZFBpeGVsUmVzdWx0c0VPRigpOworfQorCitzdGF0aWMgdm9pZCBydW5UZXN0aW5nU2VydmVyTG9v
cCgpCit7CisgICAgY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisKKyAgICB3aGlsZSAoZmdldHMo
ZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksIHN0ZGluKSkgeworICAgICAgICBjaGFyKiBuZXdM
aW5lID0gc3RycmNocihmaWxlbmFtZSwgJ1xuJyk7CisgICAgICAgIGlmIChuZXdMaW5lKQorICAg
ICAgICAgICAgKm5ld0xpbmUgPSAnXDAnOworCisgICAgICAgIGlmIChmaWxlbmFtZVswXSAhPSAn
XDAnKQorICAgICAgICAgICAgcnVuVGVzdChmaWxlbmFtZSk7CisgICAgfQorfQorCitzdGF0aWMg
dm9pZCBhZGp1c3RPdXRwdXRUeXBlQnlNaW1lVHlwZSgpCit7CisgICAgT3duRmFzdE1hbGxvY1B0
cjxjaGFyPiByZXNwb25zZU1pbWVUeXBlKGV3a19mcmFtZV9yZXNwb25zZV9taW1lX3R5cGVfZ2V0
KG1haW5GcmFtZSkpOworICAgIGlmIChyZXNwb25zZU1pbWVUeXBlLmdldCgpICYmICFzdHJjbXAo
cmVzcG9uc2VNaW1lVHlwZS5nZXQoKSwgInRleHQvcGxhaW4iKSkgeworICAgICAgICBnTGF5b3V0
VGVzdENvbnRyb2xsZXItPnNldER1bXBBc1RleHQodHJ1ZSk7CisgICAgICAgIGdMYXlvdXRUZXN0
Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQaXhlbFJlc3VsdHMoZmFsc2UpOworICAgIH0KK30KKwor
c3RhdGljIHZvaWQgZHVtcEZyYW1lQ29udGVudHNBc1RleHQoKQoreworICAgIFdURjo6U3RyaW5n
IHJlc3VsdDsKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQXNUZXh0KCkpCisg
ICAgICAgIHJlc3VsdCA9IGR1bXBGcmFtZXNBc1RleHQobWFpbkZyYW1lKTsKKyAgICBlbHNlCisg
ICAgICAgIHJlc3VsdCA9IFdURjo6U3RyaW5nOjpmcm9tVVRGOChld2tfZnJhbWVfcmVuZGVyX3Ry
ZWVfZHVtcF9nZXQobWFpbkZyYW1lKSk7CisKKyAgICBwcmludGYoIiVzIiwgcmVzdWx0LnV0Zjgo
KS5kYXRhKCkpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGREdW1wRnJhbWVTY3JvbGxQb3NpdGlv
bigpCit7CisgICAgcmV0dXJuIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEFzVGV4dCgpICYm
ICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBET01Bc1dlYkFyY2hpdmUoKSAmJiAhZ0xheW91
dFRlc3RDb250cm9sbGVyLT5kdW1wU291cmNlQXNXZWJBcmNoaXZlKCk7Cit9CisKK3N0YXRpYyBi
b29sIHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVkKCkKK3sKKyAgICByZXR1
cm4gZHVtcFBpeGVscyAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmdlbmVyYXRlUGl4ZWxSZXN1
bHRzKCkgJiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcERPTUFzV2ViQXJjaGl2ZSgpICYm
ICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBTb3VyY2VBc1dlYkFyY2hpdmUoKTsKK30KKwor
c3RhdGljIGJvb2wgc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlzdCgpCit7CisgICAgcmV0dXJuIGdM
YXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEJhY2tGb3J3YXJkTGlzdCgpOworfQorCitzdGF0aWMg
Ym9vbCBpbml0RWZsKCkKK3sKKyAgICBpZiAoIWVjb3JlX2V2YXNfaW5pdCgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgaWYgKCFlY29yZV9maWxlX2luaXQoKSkgeworICAgICAgICBlY29y
ZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYg
KCFlZGplX2luaXQoKSkgeworICAgICAgICBlY29yZV9maWxlX3NodXRkb3duKCk7CisgICAgICAg
IGVjb3JlX2V2YXNfc2h1dGRvd24oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAg
ICBpZiAoIWV3a19pbml0KCkpIHsKKyAgICAgICAgZWRqZV9zaHV0ZG93bigpOworICAgICAgICBl
Y29yZV9maWxlX3NodXRkb3duKCk7CisgICAgICAgIGVjb3JlX2V2YXNfc2h1dGRvd24oKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0
aWMgdm9pZCBzaHV0ZG93bkVmbCgpCit7CisgICAgZXdrX3NodXRkb3duKCk7CisgICAgZWRqZV9z
aHV0ZG93bigpOworICAgIGVjb3JlX2ZpbGVfc2h1dGRvd24oKTsKKyAgICBlY29yZV9ldmFzX3No
dXRkb3duKCk7Cit9CisKK3ZvaWQgZGlzcGxheVdlYlZpZXcoKQoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK3ZvaWQgZHVtcCgpCit7CisgICAgaW52YWxpZGF0ZUFueVByZXZpb3VzV2Fp
dFRvRHVtcFdhdGNoZG9nKCk7CisKKyAgICBpZiAoZHVtcFRyZWUpIHsKKyAgICAgICAgYWRqdXN0
T3V0cHV0VHlwZUJ5TWltZVR5cGUoKTsKKyAgICAgICAgZHVtcEZyYW1lQ29udGVudHNBc1RleHQo
KTsKKworICAgICAgICBpZiAoc2hvdWxkRHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oKSkKKyAgICAg
ICAgICAgIGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKG1haW5GcmFtZSk7CisKKyAgICAgICAgaWYg
KHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QoKSkKKyAgICAgICAgICAgIGR1bXBCYWNrRm9yd2Fy
ZExpc3RGb3JXZWJWaWV3KGJyb3dzZXIpOworCisgICAgICAgIGlmIChwcmludFNlcGFyYXRvcnMp
IHsKKyAgICAgICAgICAgIHB1dHMoIiNFT0YiKTsKKyAgICAgICAgICAgIGZwdXRzKCIjRU9GXG4i
LCBzdGRlcnIpOworICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICAgICBmZmx1
c2goc3RkZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaG91bGREdW1wUGl4ZWxz
QW5kQ29tcGFyZVdpdGhFeHBlY3RlZCgpKQorICAgICAgICBkdW1wV2ViVmlld0FzUGl4ZWxzQW5k
Q29tcGFyZVdpdGhFeHBlY3RlZChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmV4cGVjdGVkUGl4ZWxI
YXNoKCkpOworCisgICAgZG9uZSA9IHRydWU7CisgICAgZWNvcmVfbWFpbl9sb29wX3F1aXQoKTsK
K30KKworc3RhdGljIHZvaWQgY3JlYXRlQnJvd3NlcihFdmFzKiBldmFzLCBHQ0NvbnRyb2xsZXIq
IGdjQ29udHJvbGxlcikKK3sKKyAgICBicm93c2VyID0gZHJ0Vmlld1RpbGVkQWRkKGV2YXMpOwor
ICAgIGlmICghYnJvd3NlcikgeworICAgICAgICBzaHV0ZG93bkVmbCgpOworICAgICAgICBleGl0
KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgZXdrX3ZpZXdfdGhlbWVfc2V0KGJyb3dzZXIs
IERBVEFfRElSIi9kZWZhdWx0LmVkaiIpOworCisgICAgZXZhc19vYmplY3RfbmFtZV9zZXQoYnJv
d3NlciwgImJyb3dzZXIiKTsKKyAgICBldmFzX29iamVjdF9tb3ZlKGJyb3dzZXIsIDAsIDApOwor
ICAgIGV2YXNfb2JqZWN0X3Jlc2l6ZShicm93c2VyLCA4MDAsIDYwMCk7CisgICAgZXZhc19vYmpl
Y3RfbGF5ZXJfc2V0KGJyb3dzZXIsIEVWQVNfTEFZRVJfTUFYKTsKKyAgICBldmFzX29iamVjdF9z
aG93KGJyb3dzZXIpOworICAgIGV2YXNfb2JqZWN0X2ZvY3VzX3NldChicm93c2VyLCBFSU5BX1RS
VUUpOworCisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJsb2Fk
LHN0YXJ0ZWQiLCBvbkxvYWRTdGFydGVkLCAwKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxs
YmFja19hZGQoYnJvd3NlciwgImxvYWQsZmluaXNoZWQiLCBvbkxvYWRGaW5pc2hlZCwgMCk7Cisg
ICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJ0aXRsZSxjaGFuZ2Vk
Iiwgb25UaXRsZUNoYW5nZWQsIDApOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2Fk
ZChicm93c2VyLCAid2luZG93LG9iamVjdCxjbGVhcmVkIiwgb25XaW5kb3dPYmplY3RDbGVhcmVk
LCBnY0NvbnRyb2xsZXIpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChicm93
c2VyLCAic3RhdHVzYmFyLHRleHQsc2V0Iiwgb25TdGF0dXNiYXJUZXh0U2V0LCAwKTsKKworICAg
IG1haW5GcmFtZSA9IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KGJyb3dzZXIpOworICAgIGV2YXNf
b2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChtYWluRnJhbWUsICJsb2FkLGRvY3VtZW50LGZpbmlz
aGVkIiwgb25Eb2N1bWVudExvYWRGaW5pc2hlZCwgMCk7Cit9CisKK3N0YXRpYyBFY29yZV9FdmFz
KiBpbml0RWNvcmVFdmFzKCkKK3sKKyAgICBFY29yZV9FdmFzKiBlZSA9IHVzZVgxMVdpbmRvdyA/
IGVjb3JlX2V2YXNfbmV3KDAsIDAsIDAsIDgwMCwgNjAwLCAwKSA6IGVjb3JlX2V2YXNfYnVmZmVy
X25ldyg4MDAsIDYwMCk7CisgICAgaWYgKCFlZSkgeworICAgICAgICBzaHV0ZG93bkVmbCgpOwor
ICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgZWNvcmVfZXZhc190aXRs
ZV9zZXQoZWUsICJFRkwgRHVtcFJlbmRlclRyZWUiKTsKKyAgICBlY29yZV9ldmFzX2NhbGxiYWNr
X3Jlc2l6ZV9zZXQoZWUsIG9uRWNvcmVFdmFzUmVzaXplKTsKKyAgICBlY29yZV9ldmFzX2NhbGxi
YWNrX2RlbGV0ZV9yZXF1ZXN0X3NldChlZSwgb25DbG9zZVdpbmRvdyk7CisgICAgZWNvcmVfZXZh
c19zaG93KGVlKTsKKworICAgIHJldHVybiBlZTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNo
YXIqKiBhcmd2KQoreworICAgIGlmICghcGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywgYXJn
dikpCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisKKyAgICBpZiAoIWluaXRFZmwoKSkK
KyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAgIE93blB0cjxFY29yZV9FdmFzPiBl
Y29yZUV2YXMgPSBhZG9wdFB0cihpbml0RWNvcmVFdmFzKCkpOworICAgIE93blB0cjxHQ0NvbnRy
b2xsZXI+IGdjQ29udHJvbGxlciA9IGFkb3B0UHRyKG5ldyBHQ0NvbnRyb2xsZXIpOworICAgIGNy
ZWF0ZUJyb3dzZXIoZWNvcmVfZXZhc19nZXQoZWNvcmVFdmFzLmdldCgpKSwgZ2NDb250cm9sbGVy
LmdldCgpKTsKKyAgICBhZGRGb250c1RvRW52aXJvbm1lbnQoKTsKKworICAgIGlmICh1c2VMb25n
UnVubmluZ1NlcnZlck1vZGUoYXJnYywgYXJndikpIHsKKyAgICAgICAgcHJpbnRTZXBhcmF0b3Jz
ID0gdHJ1ZTsKKyAgICAgICAgcnVuVGVzdGluZ1NlcnZlckxvb3AoKTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBwcmludFNlcGFyYXRvcnMgPSAob3B0aW5kIDwgYXJnYyAtIDEgfHwgKGR1bXBQaXhl
bHMgJiYgZHVtcFRyZWUpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9wdGluZDsgaSAhPSBhcmdj
OyArK2kpCisgICAgICAgICAgICBydW5UZXN0KGFyZ3ZbaV0pOworICAgIH0KKworICAgIGVjb3Jl
RXZhcy5jbGVhcigpOworCisgICAgc2h1dGRvd25FZmwoKTsKKyAgICByZXR1cm4gRVhJVF9TVUND
RVNTOworfQotLS0gYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWVFZmwu
aAkKKysrIGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlRWZsLmgJCkBA
IC0wLDAgKzEsMzggQEAgCisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJl
ZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcwor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZCBpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAq
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgRHVtcFJlbmRlclRyZWVFZmxfaAorI2RlZmluZSBEdW1wUmVu
ZGVyVHJlZUVmbF9oCisKKyNpbmNsdWRlIDxFY29yZS5oPgorI2luY2x1ZGUgPEV2YXMuaD4KKwor
ZXh0ZXJuIEV2YXNfT2JqZWN0KiBtYWluRnJhbWU7CitleHRlcm4gRXZhc19PYmplY3QqIGJyb3dz
ZXI7CitleHRlcm4gRXZhc19PYmplY3QqIHRvcExvYWRpbmdGcmFtZTsKK2V4dGVybiBib29sIHdh
aXRGb3JQb2xpY3k7CitleHRlcm4gRWNvcmVfVGltZXIqIHdhaXRUb0R1bXBXYXRjaGRvZzsKKwor
I2VuZGlmIC8qIER1bXBSZW5kZXJUcmVlRWZsX2ggKi8KLS0tIGEvVG9vbHMvRHVtcFJlbmRlclRy
ZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmNwcAkKKysrIGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZs
L0ZvbnRNYW5hZ2VtZW50LmNwcAkKQEAgLTAsMCArMSwxMzIgQEAgCisvKgorICogQ29weXJpZ2h0
IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkZvbnRNYW5hZ2VtZW50LmgiCisKKyNpbmNsdWRlIDxFY29yZV9GaWxlLmg+Cisj
aW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgorI2lu
Y2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5j
bHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK3N0YXRpYyBWZWN0b3I8U3RyaW5nPiBnZXRG
b250RGlyZWN0b3JpZXMoKQoreworICAgIFZlY3RvcjxTdHJpbmc+IGZvbnREaXJQYXRoczsKKwor
ICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL1RURi8iKSk7
CisgICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvdHJ1ZXR5
cGUvdHRmLWxpYmVyYXRpb24vIikpOworICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIv
dXNyL3NoYXJlL2ZvbnRzL2xpYmVyYXRpb24vIikpOworICAgIGZvbnREaXJQYXRocy5hcHBlbmQo
U3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL3RydWV0eXBlL3R0Zi1kZWphdnUvIikpOworICAgIGZv
bnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL2RlamF2dS8iKSk7Cisg
ICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvT1RGLyIpKTsg
Ly8gTWF0aE1MCisgICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9u
dHMvb3BlbnR5cGUvc3RpeC8iKSk7IC8vIE1hdGhNTAorICAgIGZvbnREaXJQYXRocy5hcHBlbmQo
U3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL3N0aXgvIikpOyAvLyBNYXRoTUwKKworICAgIHJldHVy
biBmb250RGlyUGF0aHM7Cit9CisKK3N0YXRpYyBWZWN0b3I8U3RyaW5nPiBnZXRGb250RmlsZXMo
KQoreworICAgIFZlY3RvcjxTdHJpbmc+IGZvbnRGaWxlUGF0aHM7CisKKyAgICAvLyBBaGVtIGlz
IHVzZWQgYnkgbWFueSBsYXlvdXQgdGVzdHMuCisgICAgZm9udEZpbGVQYXRocy5hcHBlbmQoU3Ry
aW5nKEZPTlRTX0NPTkZfRElSICIvQUhFTV9fX18uVFRGIikpOworICAgIC8vIEEgZm9udCB3aXRo
IG5vIHZhbGlkIEZvbnRjb25maWcgZW5jb2RpbmcgdG8gdGVzdCBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDc0NTIKKyAgICBmb250RmlsZVBhdGhzLmFwcGVuZChTdHJp
bmcoRk9OVFNfQ09ORl9ESVIgIi9Gb250V2l0aE5vVmFsaWRFbmNvZGluZy5mb24iKSk7CisKKyAg
ICBmb3IgKGludCBpID0gMTsgaSA8PSA5OyBpKyspIHsKKyAgICAgICAgY2hhciBmb250UGF0aFtQ
QVRIX01BWF07CisgICAgICAgIHNucHJpbnRmKGZvbnRQYXRoLCBQQVRIX01BWCAtIDEsCisgICAg
ICAgICAgICAgICAgIEZPTlRTX0NPTkZfRElSICIvLi4vLi4vZm9udHMvV2ViS2l0V2VpZ2h0V2F0
Y2hlciVpMDAudHRmIiwgaSk7CisKKyAgICAgICAgZm9udEZpbGVQYXRocy5hcHBlbmQoU3RyaW5n
KGZvbnRQYXRoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGZvbnRGaWxlUGF0aHM7Cit9CisKK3N0
YXRpYyBzaXplX3QgYWRkRm9udERpcmVjdG9yaWVzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBmb250
RGlyZWN0b3JpZXMsIEZjQ29uZmlnKiBjb25maWcpCit7CisgICAgc2l6ZV90IGFkZGVkRGlyZWN0
b3JpZXM7CisKKyAgICBmb3IgKFZlY3RvcjxTdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZv
bnREaXJlY3Rvcmllcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gZm9udERpcmVjdG9yaWVzLmVu
ZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IENTdHJpbmcgY3VycmVudERpcmVjdG9yeSA9ICgq
aXQpLnV0ZjgoKTsKKyAgICAgICAgY29uc3QgY2hhciogcGF0aCA9IGN1cnJlbnREaXJlY3Rvcnku
ZGF0YSgpOworCisgICAgICAgIGlmIChlY29yZV9maWxlX2lzX2RpcihwYXRoKSkgeworICAgICAg
ICAgICAgaWYgKCFGY0NvbmZpZ0FwcEZvbnRBZGREaXIoY29uZmlnLCByZWludGVycHJldF9jYXN0
PGNvbnN0IEZjQ2hhcjgqPihwYXRoKSkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVy
ciwgIkNvdWxkIG5vdCBsb2FkIGZvbnQgYXQgJXMhXG4iLCBwYXRoKTsKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKythZGRlZERpcmVjdG9y
aWVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGFkZGVkRGlyZWN0b3JpZXM7Cit9
CisKK3N0YXRpYyB2b2lkIGFkZEZvbnRGaWxlcyhjb25zdCBWZWN0b3I8U3RyaW5nPiYgZm9udEZp
bGVzLCBGY0NvbmZpZyogY29uZmlnKQoreworICAgIGZvciAoVmVjdG9yPFN0cmluZz46OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gZm9udEZpbGVzLmJlZ2luKCk7IGl0ICE9IGZvbnRGaWxlcy5lbmQoKTsg
KytpdCkgeworICAgICAgICBjb25zdCBDU3RyaW5nIGN1cnJlbnRGaWxlID0gKCppdCkudXRmOCgp
OworICAgICAgICBjb25zdCBjaGFyKiBwYXRoID0gY3VycmVudEZpbGUuZGF0YSgpOworCisgICAg
ICAgIGlmICghRmNDb25maWdBcHBGb250QWRkRmlsZShjb25maWcsIHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgRmNDaGFyOCo+KHBhdGgpKSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291
bGQgbm90IGxvYWQgZm9udCBhdCAlcyFcbiIsIHBhdGgpOworICAgIH0KK30KKwordm9pZCBhZGRG
b250c1RvRW52aXJvbm1lbnQoKQoreworICAgIEZjSW5pdCgpOworCisgICAgLy8gTG9hZCBvdXIg
Y29uZmlndXJhdGlvbiBmaWxlLCB3aGljaCBzZXRzIHVwIHByb3BlciBhbGlhc2VzIGZvciBmYW1p
bHkKKyAgICAvLyBuYW1lcyBsaWtlIHNhbnMsIHNlcmlmIGFuZCBtb25vc3BhY2UuCisgICAgRmND
b25maWcqIGNvbmZpZyA9IEZjQ29uZmlnQ3JlYXRlKCk7CisgICAgY29uc3QgY2hhciogZm9udENv
bmZpZ0ZpbGVuYW1lID0gRk9OVFNfQ09ORl9ESVIgIi9mb250cy5jb25mIjsKKyAgICBpZiAoIUZj
Q29uZmlnUGFyc2VBbmRMb2FkKGNvbmZpZywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGY0NoYXI4
Kj4oZm9udENvbmZpZ0ZpbGVuYW1lKSwgdHJ1ZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIs
ICJDb3VsZG4ndCBsb2FkIGZvbnQgY29uZmlndXJhdGlvbiBmaWxlIGZyb206ICVzXG4iLCBmb250
Q29uZmlnRmlsZW5hbWUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGlmICghYWRk
Rm9udERpcmVjdG9yaWVzKGdldEZvbnREaXJlY3RvcmllcygpLCBjb25maWcpKSB7CisgICAgICAg
IGZwcmludGYoc3RkZXJyLCAiTm9uZSBvZiB0aGUgZm9udCBkaXJlY3RvcmllcyBjb3VsZCBiZSBh
ZGRlZC4gRWl0aGVyIGluc3RhbGwgdGhlbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3Ig
ZmlsZSBhIGJ1ZyBhdCBodHRwOi8vYnVncy53ZWJraXQub3JnIGlmIHRoZXkgYXJlIGluc3RhbGxl
ZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYW5vdGhlciBsb2NhdGlvbi5cbiIpOwor
ICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGFkZEZvbnRGaWxlcyhnZXRGb250RmlsZXMo
KSwgY29uZmlnKTsKKworICAgIGlmICghRmNDb25maWdTZXRDdXJyZW50KGNvbmZpZykpIHsKKyAg
ICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgc2V0IHRoZSBjdXJyZW50IGZvbnQgY29u
ZmlndXJhdGlvbiFcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKwotLS0gYS9Ub29s
cy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuaAkKKysrIGEvVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmgJCkBAIC0wLDAgKzEsMzEgQEAgCisvKgorICog
Q29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmln
aHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBGb250
TWFuYWdlbWVudF9oCisjZGVmaW5lIEZvbnRNYW5hZ2VtZW50X2gKKwordm9pZCBhZGRGb250c1Rv
RW52aXJvbm1lbnQoKTsKKworI2VuZGlmIC8vIEZvbnRNYW5hZ2VtZW50X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98167</attachid>
            <date>2011-06-22 07:27:09 -0700</date>
            <delta_ts>2011-06-27 07:45:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-62034-20110622113031.patch</filename>
            <type>text/plain</type>
            <size>30266</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODk0MjkKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCBjNTc2MjA5YjQ2YWYwNmIwYzBhN2FjMTc4YWFlODM5MTgx
ZjdjYzg1Li5mMmZjY2M2OTg3M2Y5M2FiMWFlYmQxMmY5YTBmNWQ2M2M1YWM4MzA1IDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTkg
QEAKKzIwMTEtMDYtMjIgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9uLm1vYmk+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0VGTF0g
RFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwIGFuZCBEdW1wUmVuZGVyVHJlZUVmbC5oIGFsb25n
IHdpdGgKKyAgICAgICAgc3VwcG9ydCBmaWxlcy4KKyAgICAgICAgQnVpbGQgc3lzdGVtIGNoYW5n
ZXMgd2lsbCBiZSB1cHN0cmVhbWVkIGFzIHNvb24gYXMgb3RoZXIgRFJULXJlbGF0ZWQKKyAgICAg
ICAgZmlsZXMgYXJlIGFsc28gb24gdGhlIHRyZWUuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MjAzNAorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUv
ZWZsL0R1bXBSZW5kZXJUcmVlLmNwcDogQWRkZWQuCisgICAgICAgIChkdW1wRnJhbWVzQXNUZXh0
KToKKyAgICAgICAgKGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZExv
Z0ZyYW1lTG9hZERlbGVnYXRlcyk6CisgICAgICAgIChzaG91bGREdW1wQXNUZXh0KToKKyAgICAg
ICAgKHNlbmRQaXhlbFJlc3VsdHNFT0YpOgorICAgICAgICAoaW52YWxpZGF0ZUFueVByZXZpb3Vz
V2FpdFRvRHVtcFdhdGNoZG9nKToKKyAgICAgICAgKHByb2Nlc3NXb3JrKToKKyAgICAgICAgKGFk
ZENvbnRyb2xsZXJUb1dpbmRvdyk6CisgICAgICAgIChvbldpbmRvd09iamVjdENsZWFyZWQpOgor
ICAgICAgICAob25TdGF0dXNiYXJUZXh0U2V0KToKKyAgICAgICAgKG9uTG9hZFN0YXJ0ZWQpOgor
ICAgICAgICAob25Mb2FkRmluaXNoZWQpOgorICAgICAgICAob25UaXRsZUNoYW5nZWQpOgorICAg
ICAgICAob25Eb2N1bWVudExvYWRGaW5pc2hlZCk6CisgICAgICAgIChvbkVjb3JlRXZhc1Jlc2l6
ZSk6CisgICAgICAgIChvbkNsb3NlV2luZG93KToKKyAgICAgICAgKHVzZUxvbmdSdW5uaW5nU2Vy
dmVyTW9kZSk6CisgICAgICAgIChwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyk6CisgICAgICAgIChy
ZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKToKKyAgICAgICAgKGdldEZpbmFsVGVzdFVS
TCk6CisgICAgICAgIChnZXRFeHBlY3RlZFBpeGVsSGFzaCk6CisgICAgICAgIChjcmVhdGVMYXlv
dXRUZXN0Q29udHJvbGxlcik6CisgICAgICAgIChydW5UZXN0KToKKyAgICAgICAgKHJ1blRlc3Rp
bmdTZXJ2ZXJMb29wKToKKyAgICAgICAgKGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKToKKyAg
ICAgICAgKGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KToKKyAgICAgICAgKHNob3VsZER1bXBGcmFt
ZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0
aEV4cGVjdGVkKToKKyAgICAgICAgKHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QpOgorICAgICAg
ICAoaW5pdEVmbCk6CisgICAgICAgIChzaHV0ZG93bkVmbCk6CisgICAgICAgIChkaXNwbGF5V2Vi
Vmlldyk6CisgICAgICAgIChkdW1wKToKKyAgICAgICAgKGNyZWF0ZUJyb3dzZXIpOgorICAgICAg
ICAoaW5pdEVjb3JlRXZhcyk6CisgICAgICAgIChtYWluKToKKyAgICAgICAgKiBEdW1wUmVuZGVy
VHJlZS9lZmwvRHVtcFJlbmRlclRyZWVFZmwuaDogQWRkZWQuCisgICAgICAgICogRHVtcFJlbmRl
clRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmNwcDogQWRkZWQuCisgICAgICAgIChnZXRGb250RGly
ZWN0b3JpZXMpOgorICAgICAgICAoZ2V0Rm9udEZpbGVzKToKKyAgICAgICAgKGFkZEZvbnREaXJl
Y3Rvcmllcyk6CisgICAgICAgIChhZGRGb250RmlsZXMpOgorICAgICAgICAoYWRkRm9udHNUb0Vu
dmlyb25tZW50KToKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQu
aDogQWRkZWQuCisKIDIwMTEtMDYtMjIgIE1hcnRpbiBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2Fs
aWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gUm9iZW4uCmRpZmYgLS1naXQgYS9U
b29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwIGIvVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42MDExN2QyMmZiYTBk
OWNjZjNkOWViZWIxNWI1YTE4Y2JiYmNiZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVt
cFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcApAQCAtMCwwICsxLDU2NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29w
eXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICog
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZS5oIgorCisjaW5jbHVkZSAiRHVt
cEhpc3RvcnlJdGVtLmgiCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWVWaWV3LmgiCisjaW5jbHVk
ZSAiRXZlbnRTZW5kZXIuaCIKKyNpbmNsdWRlICJGb250TWFuYWdlbWVudC5oIgorI2luY2x1ZGUg
IkdDQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkxheW91dFRlc3RDb250cm9sbGVyLmgiCisjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQaXhlbER1bXBTdXBwb3J0LmgiCisj
aW5jbHVkZSAiV29ya1F1ZXVlLmgiCisjaW5jbHVkZSAiZXdrX3ByaXZhdGUuaCIgLy8gRklYTUU6
IGNyZWF0ZSBzb21lIFdlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlLmNwcCBpbnN0ZWFkCisj
aW5jbHVkZSA8RVdlYktpdC5oPgorI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5jbHVkZSA8RWNvcmVf
RXZhcy5oPgorI2luY2x1ZGUgPEVjb3JlX0ZpbGUuaD4KKyNpbmNsdWRlIDxFZGplLmg+CisjaW5j
bHVkZSA8RXZhcy5oPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgorI2luY2x1
ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRleHQvQ1N0cmlu
Zy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25GYXN0TWFsbG9jUHRy
Lmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCitFdmFzX09iamVjdCogYnJvd3NlciA9IDA7
CitFdmFzX09iamVjdCogbWFpbkZyYW1lID0gMDsKK0V2YXNfT2JqZWN0KiB0b3BMb2FkaW5nRnJh
bWUgPSAwOworYm9vbCB3YWl0Rm9yUG9saWN5ID0gZmFsc2U7CitFY29yZV9UaW1lciogd2FpdFRv
RHVtcFdhdGNoZG9nID0gMDsKK2V4dGVybiBFd2tfSGlzdG9yeV9JdGVtKiBwcmV2VGVzdEJGSXRl
bTsKKworLy8gRnJvbSB0aGUgdG9wLWxldmVsIER1bXBSZW5kZXJUcmVlLmgKK1JlZlB0cjxMYXlv
dXRUZXN0Q29udHJvbGxlcj4gZ0xheW91dFRlc3RDb250cm9sbGVyOwordm9sYXRpbGUgYm9vbCBk
b25lID0gZmFsc2U7CisKK3N0YXRpYyBpbnQgZHVtcFBpeGVscyA9IGZhbHNlOworc3RhdGljIGlu
dCBkdW1wVHJlZSA9IHRydWU7CitzdGF0aWMgaW50IHByaW50U2VwYXJhdG9ycyA9IHRydWU7Citz
dGF0aWMgaW50IHVzZVgxMVdpbmRvdyA9IGZhbHNlOworCitzdGF0aWMgV1RGOjpTdHJpbmcgZHVt
cEZyYW1lc0FzVGV4dChFdmFzX09iamVjdCogZnJhbWUpCit7CisgICAgT3duRmFzdE1hbGxvY1B0
cjxjaGFyPiBpbm5lclRleHQoZXdrX2ZyYW1lX2lubmVyX3RleHRfZ2V0KGZyYW1lKSk7CisgICAg
V1RGOjpTdHJpbmcgcmVzdWx0OworCisgICAgaWYgKGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KGJy
b3dzZXIpID09IGZyYW1lKQorICAgICAgICByZXN1bHQgPSBXVEY6OlN0cmluZzo6Zm9ybWF0KCIl
c1xuIiwgaW5uZXJUZXh0LmdldCgpKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFdURjo6
U3RyaW5nOjpmb3JtYXQoIlxuLS0tLS0tLS1cbkZyYW1lOiAnJXMnXG4tLS0tLS0tLVxuJXNcbiIs
IGV3a19mcmFtZV9uYW1lX2dldChmcmFtZSksIGlubmVyVGV4dC5nZXQoKSk7CisKKyAgICBpZiAo
Z0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSkgeworICAgICAg
ICBFaW5hX0l0ZXJhdG9yKiBjaGlsZHJlbiA9IGV3a19mcmFtZV9jaGlsZHJlbl9pdGVyYXRvcl9u
ZXcoZnJhbWUpOworICAgICAgICBFdmFzX09iamVjdCogY2hpbGQ7CisKKyAgICAgICAgRUlOQV9J
VEVSQVRPUl9GT1JFQUNIKGNoaWxkcmVuLCBjaGlsZCkgeworICAgICAgICAgICAgV1RGOjpTdHJp
bmcgdGVtcFRleHQoZHVtcEZyYW1lc0FzVGV4dChjaGlsZCkpOworCisgICAgICAgICAgICBpZiAo
dGVtcFRleHQuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg
ICAgICByZXN1bHQuYXBwZW5kKHRlbXBUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGVpbmFf
aXRlcmF0b3JfZnJlZShjaGlsZHJlbik7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30K
Kworc3RhdGljIHZvaWQgZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oRXZhc19PYmplY3QqIG1haW5G
cmFtZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGRM
b2dGcmFtZUxvYWREZWxlZ2F0ZXMoY29uc3QgV1RGOjpTdHJpbmcmIHBhdGhPclVSTCkKK3sKKyAg
ICByZXR1cm4gcGF0aE9yVVJMLmNvbnRhaW5zKCJsb2FkaW5nLyIpOworfQorCitzdGF0aWMgYm9v
bCBzaG91bGREdW1wQXNUZXh0KGNvbnN0IFdURjo6U3RyaW5nJiBwYXRoT3JVUkwpCit7CisgICAg
cmV0dXJuIHBhdGhPclVSTC5jb250YWlucygiZHVtcEFzVGV4dC8iKTsKK30KKworc3RhdGljIHZv
aWQgc2VuZFBpeGVsUmVzdWx0c0VPRigpCit7CisgICAgcHV0cygiI0VPRiIpOworICAgIGZmbHVz
aChzdGRvdXQpOworICAgIGZmbHVzaChzdGRlcnIpOworfQorCitzdGF0aWMgdm9pZCBpbnZhbGlk
YXRlQW55UHJldmlvdXNXYWl0VG9EdW1wV2F0Y2hkb2coKQoreworICAgIGlmICh3YWl0VG9EdW1w
V2F0Y2hkb2cpIHsKKyAgICAgICAgZWNvcmVfdGltZXJfZGVsKHdhaXRUb0R1bXBXYXRjaGRvZyk7
CisgICAgICAgIHdhaXRUb0R1bXBXYXRjaGRvZyA9IDA7CisgICAgfQorICAgIHdhaXRGb3JQb2xp
Y3kgPSBmYWxzZTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBwcm9jZXNzV29yayh2b2lkKiBkYXRh
KQoreworICAgIGlmIChXb3JrUXVldWU6OnNoYXJlZCgpLT5wcm9jZXNzV29yaygpICYmICFnTGF5
b3V0VGVzdENvbnRyb2xsZXItPndhaXRUb0R1bXAoKSkKKyAgICAgICAgZHVtcCgpOworICAgIHJl
dHVybiBFQ09SRV9DQUxMQkFDS19DQU5DRUw7Cit9CisKK3N0YXRpYyB2b2lkIGFkZENvbnRyb2xs
ZXJUb1dpbmRvdyhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgd2luZG93T2JqZWN0
LCBjb25zdCBjaGFyKiBjb250cm9sbGVyTmFtZSwgSlNWYWx1ZVJlZiBjb250cm9sbGVyKQorewor
ICAgIEpTU3RyaW5nUmVmIGNvbnRyb2xsZXJOYW1lU3RyID0gSlNTdHJpbmdDcmVhdGVXaXRoVVRG
OENTdHJpbmcoY29udHJvbGxlck5hbWUpOworICAgIEpTT2JqZWN0U2V0UHJvcGVydHkoY29udGV4
dCwgd2luZG93T2JqZWN0LCBjb250cm9sbGVyTmFtZVN0ciwgY29udHJvbGxlciwga0pTUHJvcGVy
dHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSwgMCk7
CisgICAgSlNTdHJpbmdSZWxlYXNlKGNvbnRyb2xsZXJOYW1lU3RyKTsKK30KKworc3RhdGljIHZv
aWQgb25XaW5kb3dPYmplY3RDbGVhcmVkKHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmll
dywgdm9pZCogZXZlbnRJbmZvKQoreworICAgIEV3a19XaW5kb3dfT2JqZWN0X0NsZWFyZWRfRXZl
bnQqIG9iamVjdENsZWFyZWRJbmZvID0gc3RhdGljX2Nhc3Q8RXdrX1dpbmRvd19PYmplY3RfQ2xl
YXJlZF9FdmVudCo+KGV2ZW50SW5mbyk7CisgICAgSlNWYWx1ZVJlZiBleGNlcHRpb24gPSAwOwor
ICAgIEFTU0VSVChnTGF5b3V0VGVzdENvbnRyb2xsZXIpOworCisgICAgR0NDb250cm9sbGVyKiBn
Y0NvbnRyb2xsZXIgPSBzdGF0aWNfY2FzdDxHQ0NvbnRyb2xsZXIqPih1c2VyRGF0YSk7CisgICAg
QVNTRVJUKGdjQ29udHJvbGxlcik7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPm1ha2VX
aW5kb3dPYmplY3Qob2JqZWN0Q2xlYXJlZEluZm8tPmNvbnRleHQsIG9iamVjdENsZWFyZWRJbmZv
LT53aW5kb3dPYmplY3QsICZleGNlcHRpb24pOworICAgIEFTU0VSVCghZXhjZXB0aW9uKTsKKwor
ICAgIGdjQ29udHJvbGxlci0+bWFrZVdpbmRvd09iamVjdChvYmplY3RDbGVhcmVkSW5mby0+Y29u
dGV4dCwgb2JqZWN0Q2xlYXJlZEluZm8tPndpbmRvd09iamVjdCwgJmV4Y2VwdGlvbik7CisgICAg
QVNTRVJUKCFleGNlcHRpb24pOworCisgICAgLyogRklYTUUgcy9mYWxzZS8hZ2V0X3BhcmVudC8g
Ki8KKyAgICBhZGRDb250cm9sbGVyVG9XaW5kb3cob2JqZWN0Q2xlYXJlZEluZm8tPmNvbnRleHQs
IG9iamVjdENsZWFyZWRJbmZvLT53aW5kb3dPYmplY3QsICJldmVudFNlbmRlciIsIG1ha2VFdmVu
dFNlbmRlcihvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgZmFsc2UpKTsKK30KKworc3RhdGlj
IHZvaWQgb25TdGF0dXNiYXJUZXh0U2V0KHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmll
dywgdm9pZCogZXZlbnRJbmZvKQoreworICAgIGlmICghZ0xheW91dFRlc3RDb250cm9sbGVyLT5k
dW1wU3RhdHVzQ2FsbGJhY2tzKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IGNoYXIq
IHN0YXR1c2JhclRleHQgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZXZlbnRJbmZvKTsKKyAg
ICBwcmludGYoIlVJIERFTEVHQVRFIFNUQVRVUyBDQUxMQkFDSzogc2V0U3RhdHVzVGV4dDolc1xu
Iiwgc3RhdHVzYmFyVGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uTG9hZFN0YXJ0ZWQodm9pZCog
dXNlckRhdGEsIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKiBldmVudEluZm8pCit7CisgICAgLy8g
RklYTUU6IHdlIGFjdHVhbGx5IG5lZWQgdGhlIGZyYW1lIHJlbGF0ZWQgdG8gdGhpcyBldmVudAor
ICAgIEV2YXNfT2JqZWN0KiBmcmFtZSA9IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KHZpZXcpOwor
CisgICAgLy8gTWFrZSBzdXJlIHdlIG9ubHkgc2V0IHRoaXMgb25jZSBwZXIgdGVzdC4gSWYgaXQg
Z2V0cyBjbGVhcmVkLCBhbmQgdGhlbiBzZXQgYWdhaW4sIHdlIG1pZ2h0CisgICAgLy8gZW5kIHVw
IGRvaW5nIHR3byBkdW1wcyBmb3Igb25lIHRlc3QuCisgICAgaWYgKCF0b3BMb2FkaW5nRnJhbWUg
JiYgIWRvbmUpCisgICAgICAgIHRvcExvYWRpbmdGcmFtZSA9IGZyYW1lOworfQorCitzdGF0aWMg
dm9pZCBvbkxvYWRGaW5pc2hlZCh2b2lkKiB1c2VyRGF0YSwgRXZhc19PYmplY3QqIHZpZXcsIHZv
aWQqIGV2ZW50SW5mbykKK3sKKyAgICAvLyBGSVhNRTogd2UgYWN0dWFsbHkgbmVlZCB0aGUgZnJh
bWUgcmVsYXRlZCB0byB0aGlzIGV2ZW50CisgICAgRXZhc19PYmplY3QqIGZyYW1lID0gZXdrX3Zp
ZXdfZnJhbWVfbWFpbl9nZXQodmlldyk7CisKKyAgICBpZiAodG9wTG9hZGluZ0ZyYW1lICE9IGZy
YW1lKQorICAgICAgICByZXR1cm47CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOworCisgICAg
V29ya1F1ZXVlOjpzaGFyZWQoKS0+c2V0RnJvemVuKHRydWUpOworICAgIGlmIChnTGF5b3V0VGVz
dENvbnRyb2xsZXItPndhaXRUb0R1bXAoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKFdv
cmtRdWV1ZTo6c2hhcmVkKCktPmNvdW50KCkpCisgICAgICAgIGVjb3JlX2lkbGVyX2FkZChwcm9j
ZXNzV29yaywgMCk7CisgICAgZWxzZQorICAgICAgICBkdW1wKCk7Cit9CisKK3N0YXRpYyB2b2lk
IG9uVGl0bGVDaGFuZ2VkKHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogdmlldywgdm9pZCog
ZXZlbnRJbmZvKQoreworfQorCitzdGF0aWMgdm9pZCBvbkRvY3VtZW50TG9hZEZpbmlzaGVkKHZv
aWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCogZnJhbWUsIHZvaWQqIGV2ZW50SW5mbykKK3sKKyAg
ICBjb25zdCBXVEY6OlN0cmluZyBmcmFtZU5hbWUoZXdrX2ZyYW1lX3N1aXRhYmxlX2RydF9uYW1l
X2dldChmcmFtZSkpOworCisgICAgaWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+
ZHVtcEZyYW1lTG9hZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIiVzIC0gZGlkRmluaXNo
RG9jdW1lbnRMb2FkRm9yRnJhbWVcbiIsIGZyYW1lTmFtZS51dGY4KCkuZGF0YSgpKTsKKyAgICBl
bHNlIGlmICghZG9uZSkgeworICAgICAgICBjb25zdCB1bnNpZ25lZCBwZW5kaW5nRnJhbWVVbmxv
YWRFdmVudHMgPSBld2tfZnJhbWVfcGVuZGluZ191bmxvYWRfZXZlbnRfY291bnRfZ2V0KGZyYW1l
KTsKKyAgICAgICAgaWYgKHBlbmRpbmdGcmFtZVVubG9hZEV2ZW50cykKKyAgICAgICAgICAgIHBy
aW50ZigiJXMgLSBoYXMgJXUgb251bmxvYWQgaGFuZGxlcihzKVxuIiwgZnJhbWVOYW1lLnV0Zjgo
KS5kYXRhKCksIHBlbmRpbmdGcmFtZVVubG9hZEV2ZW50cyk7CisgICAgfQorfQorCitzdGF0aWMg
dm9pZCBvbkVjb3JlRXZhc1Jlc2l6ZShFY29yZV9FdmFzKiBlZSkKK3sKKyAgICBpbnQgd2lkdGgs
IGhlaWdodDsKKworICAgIGVjb3JlX2V2YXNfZ2VvbWV0cnlfZ2V0KGVlLCAwLCAwLCAmd2lkdGgs
ICZoZWlnaHQpOworICAgIGV2YXNfb2JqZWN0X21vdmUoYnJvd3NlciwgMCwgMCk7CisgICAgZXZh
c19vYmplY3RfcmVzaXplKGJyb3dzZXIsIHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9p
ZCBvbkNsb3NlV2luZG93KEVjb3JlX0V2YXMqIGVlKQoreworfQorCitzdGF0aWMgRWluYV9Cb29s
IHVzZUxvbmdSdW5uaW5nU2VydmVyTW9kZShpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAg
cmV0dXJuIChhcmdjID09IG9wdGluZCArIDEgJiYgIXN0cmNtcChhcmd2W29wdGluZF0sICItIikp
OworfQorCitzdGF0aWMgYm9vbCBwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhpbnQgYXJnYywgY2hh
cioqIGFyZ3YpCit7CisgICAgc3RhdGljIGNvbnN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisgICAg
ICAgIHsibm90cmVlIiwgbm9fYXJndW1lbnQsICZkdW1wVHJlZSwgZmFsc2V9LAorICAgICAgICB7
InBpeGVsLXRlc3RzIiwgbm9fYXJndW1lbnQsICZkdW1wUGl4ZWxzLCB0cnVlfSwKKyAgICAgICAg
eyJ0cmVlIiwgbm9fYXJndW1lbnQsICZkdW1wVHJlZSwgdHJ1ZX0sCisgICAgICAgIHsiZ3VpIiwg
bm9fYXJndW1lbnQsICZ1c2VYMTFXaW5kb3csIHRydWV9LAorICAgICAgICB7MCwgMCwgMCwgMH0K
KyAgICB9OworICAgIGludCBvcHRpb247CisKKyAgICB3aGlsZSAoKG9wdGlvbiA9IGdldG9wdF9s
b25nKGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiwgIiIsIG9wdGlvbnMsIDApKSAhPSAtMSkgewor
ICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgY2Fz
ZSAnOic6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcmVzZXREZWZhdWx0c1RvQ29uc2lzdGVu
dFZhbHVlcygpCit7CisgICAgZXdrX3NldHRpbmdzX2ljb25fZGF0YWJhc2VfY2xlYXIoKTsKKyAg
ICBld2tfc2V0dGluZ3NfaWNvbl9kYXRhYmFzZV9wYXRoX3NldCgwKTsKKworICAgIGV3a192aWV3
X3NldHRpbmdfcHJpdmF0ZV9icm93c2luZ19zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7CisgICAg
ZXdrX3ZpZXdfc2V0dGluZ19zcGF0aWFsX25hdmlnYXRpb25fc2V0KGJyb3dzZXIsIEVJTkFfRkFM
U0UpOworICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX2ZyYW1lX2ZsYXR0ZW5pbmdfc2V0KGJy
b3dzZXIsIEVJTkFfRkFMU0UpOworICAgIGV3a192aWV3X3NldHRpbmdfb2ZmbGluZV9hcHBfY2Fj
aGVfc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVf
c2NyaXB0c19zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2Zv
bnRfc3RhbmRhcmRfc2V0KGJyb3dzZXIsICJUaW1lcyIpOworICAgIGV3a192aWV3X3NldHRpbmdf
Zm9udF9tb25vc3BhY2Vfc2V0KGJyb3dzZXIsICJDb3VyaWVyIik7CisgICAgZXdrX3ZpZXdfc2V0
dGluZ19mb250X3NlcmlmX3NldChicm93c2VyLCAiVGltZXMiKTsKKyAgICBld2tfdmlld19zZXR0
aW5nX2ZvbnRfc2Fuc19zZXJpZl9zZXQoYnJvd3NlciwgIkhlbHZldGljYSIpOworICAgIGV3a192
aWV3X3NldHRpbmdfZm9udF9jdXJzaXZlX3NldChicm93c2VyLCAiY3Vyc2l2ZSIpOworICAgIGV3
a192aWV3X3NldHRpbmdfZm9udF9mYW50YXN5X3NldChicm93c2VyLCAiZmFudGFzeSIpOworICAg
IGV3a192aWV3X3NldHRpbmdfZm9udF9kZWZhdWx0X3NpemVfc2V0KGJyb3dzZXIsIDEyKTsKKyAg
ICBld2tfdmlld19zZXR0aW5nX2ZvbnRfbW9ub3NwYWNlX3NpemVfc2V0KGJyb3dzZXIsIDEwKTsK
KyAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfbWluaW11bV9zaXplX3NldChicm93c2VyLCAwKTsK
KyAgICBld2tfdmlld19zZXR0aW5nX2NhcmV0X2Jyb3dzaW5nX3NldChicm93c2VyLCBFSU5BX0ZB
TFNFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX3BhZ2VfY2FjaGVfc2V0KGJyb3dzZXIsIEVJTkFf
RkFMU0UpOworICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX2F1dG9fcmVzaXplX3dpbmRvd19z
ZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9wbHVn
aW5zX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfc2NyaXB0
c193aW5kb3dfb3Blbl9zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKworICAgIGV3a192aWV3X3pv
b21fc2V0KGJyb3dzZXIsIDEuMCwgMCwgMCk7CisKKyAgICBFd2tfSGlzdG9yeSogaGlzdG9yeSA9
IGV3a192aWV3X2hpc3RvcnlfZ2V0KGJyb3dzZXIpOworICAgIGludCBsaW1pdCA9IGV3a19oaXN0
b3J5X2xpbWl0X2dldChoaXN0b3J5KTsKKyAgICBld2tfaGlzdG9yeV9saW1pdF9zZXQoaGlzdG9y
eSwgMCk7CisgICAgZXdrX2hpc3RvcnlfbGltaXRfc2V0KGhpc3RvcnksIGxpbWl0KTsKKworICAg
IGV3a19jb29raWVzX2NsZWFyKCk7CisgICAgZXdrX2Nvb2tpZXNfcG9saWN5X3NldChFV0tfQ09P
S0lFX0pBUl9BQ0NFUFRfTk9fVEhJUkRfUEFSVFkpOworCisgICAgZXdrX2ZyYW1lX29wZW5lcl9j
bGVhcihld2tfdmlld19mcmFtZV9tYWluX2dldChicm93c2VyKSk7Cit9CisKK3N0YXRpYyBXVEY6
OlN0cmluZyBnZXRGaW5hbFRlc3RVUkwoY29uc3QgV1RGOjpTdHJpbmcmIHRlc3RVUkwpCit7Cisg
ICAgY29uc3Qgc2l6ZV90IGhhc2hTZXBhcmF0b3JQb3MgPSB0ZXN0VVJMLmZpbmQoIiciKTsKKyAg
ICBpZiAoaGFzaFNlcGFyYXRvclBvcyAhPSBub3RGb3VuZCkKKyAgICAgICAgcmV0dXJuIHRlc3RV
UkwubGVmdChoYXNoU2VwYXJhdG9yUG9zKTsKKworICAgIC8vIENvbnZlcnQgdGhlIHBhdGggaW50
byBhIGZ1bGwgZmlsZSBVUkwgaWYgaXQgZG9lcyBub3QgbG9vaworICAgIC8vIGxpa2UgYW4gSFRU
UC9TIFVSTCAoZG9lc24ndCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLgorICAgIGlm
ICghdGVzdFVSTC5zdGFydHNXaXRoKCJodHRwOi8vIikgJiYgIXRlc3RVUkwuc3RhcnRzV2l0aCgi
aHR0cHM6Ly8iKSkgeworICAgICAgICBPd25GYXN0TWFsbG9jUHRyPGNoYXI+IGZpbGVQYXRoKGVj
b3JlX2ZpbGVfcmVhbHBhdGgodGVzdFVSTC51dGY4KCkuZGF0YSgpKSk7CisKKyAgICAgICAgaWYg
KGVjb3JlX2ZpbGVfZXhpc3RzKGZpbGVQYXRoLmdldCgpKSkKKyAgICAgICAgICAgIHJldHVybiBX
VEY6OlN0cmluZzo6Zm9ybWF0KCJmaWxlOi8vJXMiLCBmaWxlUGF0aC5nZXQoKSk7CisgICAgfQor
CisgICAgcmV0dXJuIHRlc3RVUkw7Cit9CisKK3N0YXRpYyBXVEY6OlN0cmluZyBnZXRFeHBlY3Rl
ZFBpeGVsSGFzaChjb25zdCBXVEY6OlN0cmluZyYgdGVzdFVSTCkKK3sKKyAgICBjb25zdCBzaXpl
X3QgaGFzaFNlcGFyYXRvclBvcyA9IHRlc3RVUkwuZmluZCgiJyIpOworICAgIHJldHVybiAoaGFz
aFNlcGFyYXRvclBvcyA9PSBub3RGb3VuZCkgPyB0ZXN0VVJMLnJpZ2h0KGhhc2hTZXBhcmF0b3JQ
b3MpIDogV1RGOjpTdHJpbmcoKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlTGF5b3V0VGVzdENv
bnRyb2xsZXIoY29uc3QgV1RGOjpTdHJpbmcmIHRlc3RVUkwsIGNvbnN0IFdURjo6U3RyaW5nJiBl
eHBlY3RlZFBpeGVsSGFzaCkKK3sKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXIgPQorICAgICAg
ICBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y3JlYXRlKHN0ZDo6c3RyaW5nKHRlc3RVUkwudXRmOCgp
LmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJp
bmcoZXhwZWN0ZWRQaXhlbEhhc2gudXRmOCgpLmRhdGEoKSkpOworCisgICAgdG9wTG9hZGluZ0Zy
YW1lID0gMDsKKyAgICBkb25lID0gZmFsc2U7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXIt
PnNldEljb25EYXRhYmFzZUVuYWJsZWQoZmFsc2UpOworCisgICAgaWYgKHNob3VsZExvZ0ZyYW1l
TG9hZERlbGVnYXRlcyh0ZXN0VVJMKSkKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5z
ZXREdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKHRydWUpOworCisgICAgZ0xheW91dFRlc3RDb250cm9s
bGVyLT5zZXREZXZlbG9wZXJFeHRyYXNFbmFibGVkKHRydWUpOworCisgICAgaWYgKHNob3VsZER1
bXBBc1RleHQodGVzdFVSTCkpIHsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRE
dW1wQXNUZXh0KHRydWUpOworICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldEdlbmVy
YXRlUGl4ZWxSZXN1bHRzKGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJ1blRlc3Qo
Y29uc3QgY2hhciogY1Rlc3RQYXRoT3JVUkwpCit7CisgICAgY29uc3QgV1RGOjpTdHJpbmcgdGVz
dFBhdGhPclVSTCA9IFdURjo6U3RyaW5nOjpmcm9tVVRGOChjVGVzdFBhdGhPclVSTCk7CisgICAg
QVNTRVJUKCF0ZXN0UGF0aE9yVVJMLmlzRW1wdHkoKSk7CisKKyAgICBjb25zdCBXVEY6OlN0cmlu
ZyB0ZXN0VVJMID0gZ2V0RmluYWxUZXN0VVJMKHRlc3RQYXRoT3JVUkwpOworICAgIGNvbnN0IFdU
Rjo6U3RyaW5nIGV4cGVjdGVkUGl4ZWxIYXNoID0gZ2V0RXhwZWN0ZWRQaXhlbEhhc2godGVzdFBh
dGhPclVSTCk7CisKKyAgICByZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKCk7CisgICAg
Y3JlYXRlTGF5b3V0VGVzdENvbnRyb2xsZXIodGVzdFVSTCwgZXhwZWN0ZWRQaXhlbEhhc2gpOwor
CisgICAgV29ya1F1ZXVlOjpzaGFyZWQoKS0+Y2xlYXIoKTsKKyAgICBXb3JrUXVldWU6OnNoYXJl
ZCgpLT5zZXRGcm96ZW4oZmFsc2UpOworCisgICAgY29uc3QgYm9vbCBpc1NWR1czQ1Rlc3QgPSB0
ZXN0VVJMLmNvbnRhaW5zKCJzdmcvVzNDLVNWRy0xLjEiKTsKKyAgICBjb25zdCBpbnQgd2lkdGgg
PSBpc1NWR1czQ1Rlc3QgPyA0ODAgOiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld1dpZHRo
OworICAgIGNvbnN0IGludCBoZWlnaHQgPSBpc1NWR1czQ1Rlc3QgPyAzNjAgOiBMYXlvdXRUZXN0
Q29udHJvbGxlcjo6bWF4Vmlld0hlaWdodDsKKyAgICBldmFzX29iamVjdF9yZXNpemUoYnJvd3Nl
ciwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBpZiAocHJldlRlc3RCRkl0ZW0pCisgICAgICAgIGV3
a19oaXN0b3J5X2l0ZW1fZnJlZShwcmV2VGVzdEJGSXRlbSk7CisgICAgY29uc3QgRXdrX0hpc3Rv
cnkqIGhpc3RvcnkgPSBld2tfdmlld19oaXN0b3J5X2dldChicm93c2VyKTsKKyAgICBwcmV2VGVz
dEJGSXRlbSA9IGV3a19oaXN0b3J5X2hpc3RvcnlfaXRlbV9jdXJyZW50X2dldChoaXN0b3J5KTsK
KworICAgIGV2YXNfb2JqZWN0X2ZvY3VzX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3
a192aWV3X3VyaV9zZXQoYnJvd3NlciwgdGVzdFVSTC51dGY4KCkuZGF0YSgpKTsKKworICAgIGVj
b3JlX21haW5fbG9vcF9iZWdpbigpOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5jbG9z
ZVdlYkluc3BlY3RvcigpOworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RGV2ZWxvcGVy
RXh0cmFzRW5hYmxlZChmYWxzZSk7CisKKyAgICBld2tfdmlld191cmlfc2V0KGJyb3dzZXIsICJh
Ym91dDpibGFuayIpOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLmNsZWFyKCk7CisgICAg
c2VuZFBpeGVsUmVzdWx0c0VPRigpOworfQorCitzdGF0aWMgdm9pZCBydW5UZXN0aW5nU2VydmVy
TG9vcCgpCit7CisgICAgY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisKKyAgICB3aGlsZSAoZmdl
dHMoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksIHN0ZGluKSkgeworICAgICAgICBjaGFyKiBu
ZXdMaW5lID0gc3RycmNocihmaWxlbmFtZSwgJ1xuJyk7CisgICAgICAgIGlmIChuZXdMaW5lKQor
ICAgICAgICAgICAgKm5ld0xpbmUgPSAnXDAnOworCisgICAgICAgIGlmIChmaWxlbmFtZVswXSAh
PSAnXDAnKQorICAgICAgICAgICAgcnVuVGVzdChmaWxlbmFtZSk7CisgICAgfQorfQorCitzdGF0
aWMgdm9pZCBhZGp1c3RPdXRwdXRUeXBlQnlNaW1lVHlwZSgpCit7CisgICAgT3duRmFzdE1hbGxv
Y1B0cjxjaGFyPiByZXNwb25zZU1pbWVUeXBlKGV3a19mcmFtZV9yZXNwb25zZV9taW1lX3R5cGVf
Z2V0KG1haW5GcmFtZSkpOworICAgIGlmIChyZXNwb25zZU1pbWVUeXBlLmdldCgpICYmICFzdHJj
bXAocmVzcG9uc2VNaW1lVHlwZS5nZXQoKSwgInRleHQvcGxhaW4iKSkgeworICAgICAgICBnTGF5
b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBBc1RleHQodHJ1ZSk7CisgICAgICAgIGdMYXlvdXRU
ZXN0Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQaXhlbFJlc3VsdHMoZmFsc2UpOworICAgIH0KK30K
Kworc3RhdGljIHZvaWQgZHVtcEZyYW1lQ29udGVudHNBc1RleHQoKQoreworICAgIFdURjo6U3Ry
aW5nIHJlc3VsdDsKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQXNUZXh0KCkp
CisgICAgICAgIHJlc3VsdCA9IGR1bXBGcmFtZXNBc1RleHQobWFpbkZyYW1lKTsKKyAgICBlbHNl
CisgICAgICAgIHJlc3VsdCA9IFdURjo6U3RyaW5nOjpmcm9tVVRGOChld2tfZnJhbWVfcmVuZGVy
X3RyZWVfZHVtcF9nZXQobWFpbkZyYW1lKSk7CisKKyAgICBwcmludGYoIiVzIiwgcmVzdWx0LnV0
ZjgoKS5kYXRhKCkpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGREdW1wRnJhbWVTY3JvbGxQb3Np
dGlvbigpCit7CisgICAgcmV0dXJuIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEFzVGV4dCgp
ICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBET01Bc1dlYkFyY2hpdmUoKSAmJiAhZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wU291cmNlQXNXZWJBcmNoaXZlKCk7Cit9CisKK3N0YXRp
YyBib29sIHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVkKCkKK3sKKyAgICBy
ZXR1cm4gZHVtcFBpeGVscyAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmdlbmVyYXRlUGl4ZWxS
ZXN1bHRzKCkgJiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcERPTUFzV2ViQXJjaGl2ZSgp
ICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBTb3VyY2VBc1dlYkFyY2hpdmUoKTsKK30K
Kworc3RhdGljIGJvb2wgc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlzdCgpCit7CisgICAgcmV0dXJu
IGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEJhY2tGb3J3YXJkTGlzdCgpOworfQorCitzdGF0
aWMgYm9vbCBpbml0RWZsKCkKK3sKKyAgICBpZiAoIWVjb3JlX2V2YXNfaW5pdCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFlY29yZV9maWxlX2luaXQoKSkgeworICAgICAgICBl
Y29yZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAg
aWYgKCFlZGplX2luaXQoKSkgeworICAgICAgICBlY29yZV9maWxlX3NodXRkb3duKCk7CisgICAg
ICAgIGVjb3JlX2V2YXNfc2h1dGRvd24oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KyAgICBpZiAoIWV3a19pbml0KCkpIHsKKyAgICAgICAgZWRqZV9zaHV0ZG93bigpOworICAgICAg
ICBlY29yZV9maWxlX3NodXRkb3duKCk7CisgICAgICAgIGVjb3JlX2V2YXNfc2h1dGRvd24oKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitz
dGF0aWMgdm9pZCBzaHV0ZG93bkVmbCgpCit7CisgICAgZXdrX3NodXRkb3duKCk7CisgICAgZWRq
ZV9zaHV0ZG93bigpOworICAgIGVjb3JlX2ZpbGVfc2h1dGRvd24oKTsKKyAgICBlY29yZV9ldmFz
X3NodXRkb3duKCk7Cit9CisKK3ZvaWQgZGlzcGxheVdlYlZpZXcoKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7Cit9CisKK3ZvaWQgZHVtcCgpCit7CisgICAgaW52YWxpZGF0ZUFueVByZXZpb3Vz
V2FpdFRvRHVtcFdhdGNoZG9nKCk7CisKKyAgICBpZiAoZHVtcFRyZWUpIHsKKyAgICAgICAgYWRq
dXN0T3V0cHV0VHlwZUJ5TWltZVR5cGUoKTsKKyAgICAgICAgZHVtcEZyYW1lQ29udGVudHNBc1Rl
eHQoKTsKKworICAgICAgICBpZiAoc2hvdWxkRHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oKSkKKyAg
ICAgICAgICAgIGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKG1haW5GcmFtZSk7CisKKyAgICAgICAg
aWYgKHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QoKSkKKyAgICAgICAgICAgIGR1bXBCYWNrRm9y
d2FyZExpc3RGb3JXZWJWaWV3KGJyb3dzZXIpOworCisgICAgICAgIGlmIChwcmludFNlcGFyYXRv
cnMpIHsKKyAgICAgICAgICAgIHB1dHMoIiNFT0YiKTsKKyAgICAgICAgICAgIGZwdXRzKCIjRU9G
XG4iLCBzdGRlcnIpOworICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICAgICBm
Zmx1c2goc3RkZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaG91bGREdW1wUGl4
ZWxzQW5kQ29tcGFyZVdpdGhFeHBlY3RlZCgpKQorICAgICAgICBkdW1wV2ViVmlld0FzUGl4ZWxz
QW5kQ29tcGFyZVdpdGhFeHBlY3RlZChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmV4cGVjdGVkUGl4
ZWxIYXNoKCkpOworCisgICAgZG9uZSA9IHRydWU7CisgICAgZWNvcmVfbWFpbl9sb29wX3F1aXQo
KTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlQnJvd3NlcihFdmFzKiBldmFzLCBHQ0NvbnRyb2xs
ZXIqIGdjQ29udHJvbGxlcikKK3sKKyAgICBicm93c2VyID0gZHJ0Vmlld1RpbGVkQWRkKGV2YXMp
OworICAgIGlmICghYnJvd3NlcikgeworICAgICAgICBzaHV0ZG93bkVmbCgpOworICAgICAgICBl
eGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgZXdrX3ZpZXdfdGhlbWVfc2V0KGJyb3dz
ZXIsIERBVEFfRElSIi9kZWZhdWx0LmVkaiIpOworCisgICAgZXZhc19vYmplY3RfbmFtZV9zZXQo
YnJvd3NlciwgImJyb3dzZXIiKTsKKyAgICBldmFzX29iamVjdF9tb3ZlKGJyb3dzZXIsIDAsIDAp
OworICAgIGV2YXNfb2JqZWN0X3Jlc2l6ZShicm93c2VyLCA4MDAsIDYwMCk7CisgICAgZXZhc19v
YmplY3RfbGF5ZXJfc2V0KGJyb3dzZXIsIEVWQVNfTEFZRVJfTUFYKTsKKyAgICBldmFzX29iamVj
dF9zaG93KGJyb3dzZXIpOworICAgIGV2YXNfb2JqZWN0X2ZvY3VzX3NldChicm93c2VyLCBFSU5B
X1RSVUUpOworCisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJs
b2FkLHN0YXJ0ZWQiLCBvbkxvYWRTdGFydGVkLCAwKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9j
YWxsYmFja19hZGQoYnJvd3NlciwgImxvYWQsZmluaXNoZWQiLCBvbkxvYWRGaW5pc2hlZCwgMCk7
CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJ0aXRsZSxjaGFu
Z2VkIiwgb25UaXRsZUNoYW5nZWQsIDApOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNr
X2FkZChicm93c2VyLCAid2luZG93LG9iamVjdCxjbGVhcmVkIiwgb25XaW5kb3dPYmplY3RDbGVh
cmVkLCBnY0NvbnRyb2xsZXIpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChi
cm93c2VyLCAic3RhdHVzYmFyLHRleHQsc2V0Iiwgb25TdGF0dXNiYXJUZXh0U2V0LCAwKTsKKwor
ICAgIG1haW5GcmFtZSA9IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KGJyb3dzZXIpOworICAgIGV2
YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChtYWluRnJhbWUsICJsb2FkLGRvY3VtZW50LGZp
bmlzaGVkIiwgb25Eb2N1bWVudExvYWRGaW5pc2hlZCwgMCk7Cit9CisKK3N0YXRpYyBFY29yZV9F
dmFzKiBpbml0RWNvcmVFdmFzKCkKK3sKKyAgICBFY29yZV9FdmFzKiBlZSA9IHVzZVgxMVdpbmRv
dyA/IGVjb3JlX2V2YXNfbmV3KDAsIDAsIDAsIDgwMCwgNjAwLCAwKSA6IGVjb3JlX2V2YXNfYnVm
ZmVyX25ldyg4MDAsIDYwMCk7CisgICAgaWYgKCFlZSkgeworICAgICAgICBzaHV0ZG93bkVmbCgp
OworICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgZWNvcmVfZXZhc190
aXRsZV9zZXQoZWUsICJFRkwgRHVtcFJlbmRlclRyZWUiKTsKKyAgICBlY29yZV9ldmFzX2NhbGxi
YWNrX3Jlc2l6ZV9zZXQoZWUsIG9uRWNvcmVFdmFzUmVzaXplKTsKKyAgICBlY29yZV9ldmFzX2Nh
bGxiYWNrX2RlbGV0ZV9yZXF1ZXN0X3NldChlZSwgb25DbG9zZVdpbmRvdyk7CisgICAgZWNvcmVf
ZXZhc19zaG93KGVlKTsKKworICAgIHJldHVybiBlZTsKK30KKworaW50IG1haW4oaW50IGFyZ2Ms
IGNoYXIqKiBhcmd2KQoreworICAgIGlmICghcGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywg
YXJndikpCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisKKyAgICBpZiAoIWluaXRFZmwo
KSkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAgIE93blB0cjxFY29yZV9FdmFz
PiBlY29yZUV2YXMgPSBhZG9wdFB0cihpbml0RWNvcmVFdmFzKCkpOworICAgIE93blB0cjxHQ0Nv
bnRyb2xsZXI+IGdjQ29udHJvbGxlciA9IGFkb3B0UHRyKG5ldyBHQ0NvbnRyb2xsZXIpOworICAg
IGNyZWF0ZUJyb3dzZXIoZWNvcmVfZXZhc19nZXQoZWNvcmVFdmFzLmdldCgpKSwgZ2NDb250cm9s
bGVyLmdldCgpKTsKKyAgICBhZGRGb250c1RvRW52aXJvbm1lbnQoKTsKKworICAgIGlmICh1c2VM
b25nUnVubmluZ1NlcnZlck1vZGUoYXJnYywgYXJndikpIHsKKyAgICAgICAgcHJpbnRTZXBhcmF0
b3JzID0gdHJ1ZTsKKyAgICAgICAgcnVuVGVzdGluZ1NlcnZlckxvb3AoKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBwcmludFNlcGFyYXRvcnMgPSAob3B0aW5kIDwgYXJnYyAtIDEgfHwgKGR1bXBQ
aXhlbHMgJiYgZHVtcFRyZWUpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9wdGluZDsgaSAhPSBh
cmdjOyArK2kpCisgICAgICAgICAgICBydW5UZXN0KGFyZ3ZbaV0pOworICAgIH0KKworICAgIGVj
b3JlRXZhcy5jbGVhcigpOworCisgICAgc2h1dGRvd25FZmwoKTsKKyAgICByZXR1cm4gRVhJVF9T
VUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5k
ZXJUcmVlRWZsLmggYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWVFZmwu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi42NGQ5MDk2YjM2M2E0ODA0NmZlYjFlNzhmYTkwZjAzYmM0MzdiYTEzCi0t
LSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVl
RWZsLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJ
T04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ry
b25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWQgaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIER1bXBSZW5kZXJUcmVlRWZsX2gKKyNkZWZpbmUg
RHVtcFJlbmRlclRyZWVFZmxfaAorCisjaW5jbHVkZSA8RWNvcmUuaD4KKyNpbmNsdWRlIDxFdmFz
Lmg+CisKK2V4dGVybiBFdmFzX09iamVjdCogbWFpbkZyYW1lOworZXh0ZXJuIEV2YXNfT2JqZWN0
KiBicm93c2VyOworZXh0ZXJuIEV2YXNfT2JqZWN0KiB0b3BMb2FkaW5nRnJhbWU7CitleHRlcm4g
Ym9vbCB3YWl0Rm9yUG9saWN5OworZXh0ZXJuIEVjb3JlX1RpbWVyKiB3YWl0VG9EdW1wV2F0Y2hk
b2c7CisKKyNlbmRpZiAvKiBEdW1wUmVuZGVyVHJlZUVmbF9oICovCmRpZmYgLS1naXQgYS9Ub29s
cy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuY3BwIGIvVG9vbHMvRHVtcFJlbmRl
clRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44OWE5MzI4ZmYxNWNlNDhi
Yzk0N2M4YjMwNWY1ZDJhMjQxYjliNDBkCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmNwcApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJp
Z2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJGb250TWFuYWdlbWVudC5oIgorCisjaW5jbHVkZSA8RWNvcmVf
RmlsZS5oPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25m
aWcuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmlu
Zy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCitzdGF0aWMgVmVjdG9yPFN0
cmluZz4gZ2V0Rm9udERpcmVjdG9yaWVzKCkKK3sKKyAgICBWZWN0b3I8U3RyaW5nPiBmb250RGly
UGF0aHM7CisKKyAgICBmb250RGlyUGF0aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFyZS9mb250
cy9UVEYvIikpOworICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2Zv
bnRzL3RydWV0eXBlL3R0Zi1saWJlcmF0aW9uLyIpKTsKKyAgICBmb250RGlyUGF0aHMuYXBwZW5k
KFN0cmluZygiL3Vzci9zaGFyZS9mb250cy9saWJlcmF0aW9uLyIpKTsKKyAgICBmb250RGlyUGF0
aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFyZS9mb250cy90cnVldHlwZS90dGYtZGVqYXZ1LyIp
KTsKKyAgICBmb250RGlyUGF0aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFyZS9mb250cy9kZWph
dnUvIikpOworICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRz
L09URi8iKSk7IC8vIE1hdGhNTAorICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNy
L3NoYXJlL2ZvbnRzL29wZW50eXBlL3N0aXgvIikpOyAvLyBNYXRoTUwKKyAgICBmb250RGlyUGF0
aHMuYXBwZW5kKFN0cmluZygiL3Vzci9zaGFyZS9mb250cy9zdGl4LyIpKTsgLy8gTWF0aE1MCisK
KyAgICByZXR1cm4gZm9udERpclBhdGhzOworfQorCitzdGF0aWMgVmVjdG9yPFN0cmluZz4gZ2V0
Rm9udEZpbGVzKCkKK3sKKyAgICBWZWN0b3I8U3RyaW5nPiBmb250RmlsZVBhdGhzOworCisgICAg
Ly8gQWhlbSBpcyB1c2VkIGJ5IG1hbnkgbGF5b3V0IHRlc3RzLgorICAgIGZvbnRGaWxlUGF0aHMu
YXBwZW5kKFN0cmluZyhGT05UU19DT05GX0RJUiAiL0FIRU1fX19fLlRURiIpKTsKKyAgICAvLyBB
IGZvbnQgd2l0aCBubyB2YWxpZCBGb250Y29uZmlnIGVuY29kaW5nIHRvIHRlc3QgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NDUyCisgICAgZm9udEZpbGVQYXRocy5h
cHBlbmQoU3RyaW5nKEZPTlRTX0NPTkZfRElSICIvRm9udFdpdGhOb1ZhbGlkRW5jb2RpbmcuZm9u
IikpOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gOTsgaSsrKSB7CisgICAgICAgIGNoYXIg
Zm9udFBhdGhbUEFUSF9NQVhdOworICAgICAgICBzbnByaW50Zihmb250UGF0aCwgUEFUSF9NQVgg
LSAxLAorICAgICAgICAgICAgICAgICBGT05UU19DT05GX0RJUiAiLy4uLy4uL2ZvbnRzL1dlYktp
dFdlaWdodFdhdGNoZXIlaTAwLnR0ZiIsIGkpOworCisgICAgICAgIGZvbnRGaWxlUGF0aHMuYXBw
ZW5kKFN0cmluZyhmb250UGF0aCkpOworICAgIH0KKworICAgIHJldHVybiBmb250RmlsZVBhdGhz
OworfQorCitzdGF0aWMgc2l6ZV90IGFkZEZvbnREaXJlY3Rvcmllcyhjb25zdCBWZWN0b3I8U3Ry
aW5nPiYgZm9udERpcmVjdG9yaWVzLCBGY0NvbmZpZyogY29uZmlnKQoreworICAgIHNpemVfdCBh
ZGRlZERpcmVjdG9yaWVzOworCisgICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBmb250RGlyZWN0b3JpZXMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGZvbnREaXJl
Y3Rvcmllcy5lbmQoKTsgKytpdCkgeworICAgICAgICBjb25zdCBDU3RyaW5nIGN1cnJlbnREaXJl
Y3RvcnkgPSAoKml0KS51dGY4KCk7CisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGggPSBjdXJyZW50
RGlyZWN0b3J5LmRhdGEoKTsKKworICAgICAgICBpZiAoZWNvcmVfZmlsZV9pc19kaXIocGF0aCkp
IHsKKyAgICAgICAgICAgIGlmICghRmNDb25maWdBcHBGb250QWRkRGlyKGNvbmZpZywgcmVpbnRl
cnByZXRfY2FzdDxjb25zdCBGY0NoYXI4Kj4ocGF0aCkpKSB7CisgICAgICAgICAgICAgICAgZnBy
aW50ZihzdGRlcnIsICJDb3VsZCBub3QgbG9hZCBmb250IGF0ICVzIVxuIiwgcGF0aCk7CisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrYWRk
ZWREaXJlY3RvcmllczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhZGRlZERpcmVj
dG9yaWVzOworfQorCitzdGF0aWMgdm9pZCBhZGRGb250RmlsZXMoY29uc3QgVmVjdG9yPFN0cmlu
Zz4mIGZvbnRGaWxlcywgRmNDb25maWcqIGNvbmZpZykKK3sKKyAgICBmb3IgKFZlY3RvcjxTdHJp
bmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZvbnRGaWxlcy5iZWdpbigpOyBpdCAhPSBmb250Rmls
ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3QgQ1N0cmluZyBjdXJyZW50RmlsZSA9ICgq
aXQpLnV0ZjgoKTsKKyAgICAgICAgY29uc3QgY2hhciogcGF0aCA9IGN1cnJlbnRGaWxlLmRhdGEo
KTsKKworICAgICAgICBpZiAoIUZjQ29uZmlnQXBwRm9udEFkZEZpbGUoY29uZmlnLCByZWludGVy
cHJldF9jYXN0PGNvbnN0IEZjQ2hhcjgqPihwYXRoKSkpCisgICAgICAgICAgICBmcHJpbnRmKHN0
ZGVyciwgIkNvdWxkIG5vdCBsb2FkIGZvbnQgYXQgJXMhXG4iLCBwYXRoKTsKKyAgICB9Cit9CisK
K3ZvaWQgYWRkRm9udHNUb0Vudmlyb25tZW50KCkKK3sKKyAgICBGY0luaXQoKTsKKworICAgIC8v
IExvYWQgb3VyIGNvbmZpZ3VyYXRpb24gZmlsZSwgd2hpY2ggc2V0cyB1cCBwcm9wZXIgYWxpYXNl
cyBmb3IgZmFtaWx5CisgICAgLy8gbmFtZXMgbGlrZSBzYW5zLCBzZXJpZiBhbmQgbW9ub3NwYWNl
LgorICAgIEZjQ29uZmlnKiBjb25maWcgPSBGY0NvbmZpZ0NyZWF0ZSgpOworICAgIGNvbnN0IGNo
YXIqIGZvbnRDb25maWdGaWxlbmFtZSA9IEZPTlRTX0NPTkZfRElSICIvZm9udHMuY29uZiI7Cisg
ICAgaWYgKCFGY0NvbmZpZ1BhcnNlQW5kTG9hZChjb25maWcsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgRmNDaGFyOCo+KGZvbnRDb25maWdGaWxlbmFtZSksIHRydWUpKSB7CisgICAgICAgIGZwcmlu
dGYoc3RkZXJyLCAiQ291bGRuJ3QgbG9hZCBmb250IGNvbmZpZ3VyYXRpb24gZmlsZSBmcm9tOiAl
c1xuIiwgZm9udENvbmZpZ0ZpbGVuYW1lKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAg
ICBpZiAoIWFkZEZvbnREaXJlY3RvcmllcyhnZXRGb250RGlyZWN0b3JpZXMoKSwgY29uZmlnKSkg
eworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vbmUgb2YgdGhlIGZvbnQgZGlyZWN0b3JpZXMg
Y291bGQgYmUgYWRkZWQuIEVpdGhlciBpbnN0YWxsIHRoZW0gIgorICAgICAgICAgICAgICAgICAg
ICAgICAgIm9yIGZpbGUgYSBidWcgYXQgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZyBpZiB0aGV5IGFy
ZSBpbnN0YWxsZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgImFub3RoZXIgbG9jYXRp
b24uXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBhZGRGb250RmlsZXMoZ2V0
Rm9udEZpbGVzKCksIGNvbmZpZyk7CisKKyAgICBpZiAoIUZjQ29uZmlnU2V0Q3VycmVudChjb25m
aWcpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHNldCB0aGUgY3VycmVu
dCBmb250IGNvbmZpZ3VyYXRpb24hXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisK
ZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9Gb250TWFuYWdlbWVudC5oIGIv
VG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDQ5
NzUxM2FlZGMxMzk5ZjQ2ZmMwYjkxZGQ0ZjQyODU1N2Q3NDFhMwotLS0gL2Rldi9udWxsCisrKyBi
L1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9Gb250TWFuYWdlbWVudC5oCkBAIC0wLDAgKzEsMzEg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVtYmVkZGVkIFN5c3RlbXMK
KyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICog
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIEZvbnRNYW5hZ2VtZW50X2gKKyNkZWZpbmUgRm9udE1hbmFnZW1lbnRfaAorCit2b2lk
IGFkZEZvbnRzVG9FbnZpcm9ubWVudCgpOworCisjZW5kaWYgLy8gRm9udE1hbmFnZW1lbnRfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98723</attachid>
            <date>2011-06-27 07:46:04 -0700</date>
            <delta_ts>2011-06-27 08:00:12 -0700</delta_ts>
            <desc>New patch with the missing DumpHistoryItem</desc>
            <filename>bug-62034-20110627114926.patch</filename>
            <type>text/plain</type>
            <size>37519</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODk4MTUKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA2NTYxZGJhYmUyNjM0OThkY2EzZGQ0OThlZTBhODA0YzZi
YzRiNGQwLi5iMDgyMjM0MTQ5YWVjOTdkNTc3ZjJjNWUzMzA0ZDkzNmQ2MzNiNGM4IDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjQg
QEAKKzIwMTEtMDYtMjcgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9uLm1vYmk+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0VGTF0g
RFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwIGFuZCBEdW1wUmVuZGVyVHJlZUVmbC5oIGFsb25n
IHdpdGgKKyAgICAgICAgc3VwcG9ydCBmaWxlcy4KKyAgICAgICAgQnVpbGQgc3lzdGVtIGNoYW5n
ZXMgd2lsbCBiZSB1cHN0cmVhbWVkIGFzIHNvb24gYXMgb3RoZXIgRFJULXJlbGF0ZWQKKyAgICAg
ICAgZmlsZXMgYXJlIGFsc28gb24gdGhlIHRyZWUuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MjAzNAorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUv
ZWZsL0R1bXBIaXN0b3J5SXRlbS5jcHA6IEFkZGVkLgorICAgICAgICAoY29tcGFyZUhpc3RvcnlJ
dGVtcyk6CisgICAgICAgIChkdW1wSGlzdG9yeUl0ZW0pOgorICAgICAgICAoZHVtcEJhY2tGb3J3
YXJkTGlzdEZvcldlYlZpZXcpOgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2VmbC9EdW1wSGlz
dG9yeUl0ZW0uaDogQWRkZWQuCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5k
ZXJUcmVlLmNwcDogQWRkZWQuCisgICAgICAgIChkdW1wRnJhbWVzQXNUZXh0KToKKyAgICAgICAg
KGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZExvZ0ZyYW1lTG9hZERl
bGVnYXRlcyk6CisgICAgICAgIChzaG91bGREdW1wQXNUZXh0KToKKyAgICAgICAgKHNlbmRQaXhl
bFJlc3VsdHNFT0YpOgorICAgICAgICAoaW52YWxpZGF0ZUFueVByZXZpb3VzV2FpdFRvRHVtcFdh
dGNoZG9nKToKKyAgICAgICAgKHByb2Nlc3NXb3JrKToKKyAgICAgICAgKGFkZENvbnRyb2xsZXJU
b1dpbmRvdyk6CisgICAgICAgIChvbldpbmRvd09iamVjdENsZWFyZWQpOgorICAgICAgICAob25T
dGF0dXNiYXJUZXh0U2V0KToKKyAgICAgICAgKG9uTG9hZFN0YXJ0ZWQpOgorICAgICAgICAob25M
b2FkRmluaXNoZWQpOgorICAgICAgICAob25UaXRsZUNoYW5nZWQpOgorICAgICAgICAob25Eb2N1
bWVudExvYWRGaW5pc2hlZCk6CisgICAgICAgIChvbkVjb3JlRXZhc1Jlc2l6ZSk6CisgICAgICAg
IChvbkNsb3NlV2luZG93KToKKyAgICAgICAgKHVzZUxvbmdSdW5uaW5nU2VydmVyTW9kZSk6Cisg
ICAgICAgIChwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyk6CisgICAgICAgIChyZXNldERlZmF1bHRz
VG9Db25zaXN0ZW50VmFsdWVzKToKKyAgICAgICAgKGdldEZpbmFsVGVzdFVSTCk6CisgICAgICAg
IChnZXRFeHBlY3RlZFBpeGVsSGFzaCk6CisgICAgICAgIChjcmVhdGVMYXlvdXRUZXN0Q29udHJv
bGxlcik6CisgICAgICAgIChydW5UZXN0KToKKyAgICAgICAgKHJ1blRlc3RpbmdTZXJ2ZXJMb29w
KToKKyAgICAgICAgKGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKToKKyAgICAgICAgKGR1bXBG
cmFtZUNvbnRlbnRzQXNUZXh0KToKKyAgICAgICAgKHNob3VsZER1bXBGcmFtZVNjcm9sbFBvc2l0
aW9uKToKKyAgICAgICAgKHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVkKToK
KyAgICAgICAgKHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QpOgorICAgICAgICAoaW5pdEVmbCk6
CisgICAgICAgIChzaHV0ZG93bkVmbCk6CisgICAgICAgIChkaXNwbGF5V2ViVmlldyk6CisgICAg
ICAgIChkdW1wKToKKyAgICAgICAgKGNyZWF0ZUJyb3dzZXIpOgorICAgICAgICAoaW5pdEVjb3Jl
RXZhcyk6CisgICAgICAgIChtYWluKToKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvRHVt
cFJlbmRlclRyZWVFZmwuaDogQWRkZWQuCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsL0Zv
bnRNYW5hZ2VtZW50LmNwcDogQWRkZWQuCisgICAgICAgIChnZXRGb250RGlyZWN0b3JpZXMpOgor
ICAgICAgICAoZ2V0Rm9udEZpbGVzKToKKyAgICAgICAgKGFkZEZvbnREaXJlY3Rvcmllcyk6Cisg
ICAgICAgIChhZGRGb250RmlsZXMpOgorICAgICAgICAoYWRkRm9udHNUb0Vudmlyb25tZW50KToK
KyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuaDogQWRkZWQuCisK
IDIwMTEtMDYtMjcgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEFkYW0gQmFydGguCmRpZmYgLS1naXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9l
ZmwvRHVtcEhpc3RvcnlJdGVtLmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wSGlz
dG9yeUl0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjk2Y2E4NWE2NmM0YzU2ZGY2MWFmYzQ0MzFmYzg5MDRm
ZDI1ZTU2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVt
cEhpc3RvcnlJdGVtLmNwcApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNh
bXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJEdW1wSGlzdG9yeUl0ZW0uaCIKKworI2luY2x1ZGUgImV3a19wcml2YXRlLmgiCisjaW5j
bHVkZSA8RVdlYktpdC5oPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDx3dGYvT3duRmFz
dE1hbGxvY1B0ci5oPgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworRXdrX0hpc3RvcnlfSXRl
bSogcHJldlRlc3RCRkl0ZW0gPSAwOworY29uc3QgdW5zaWduZWQgaGlzdG9yeUl0ZW1JbmRlbnQg
PSA4OworCitzdGF0aWMgaW50IGNvbXBhcmVIaXN0b3J5SXRlbXMoY29uc3Qgdm9pZCogaXRlbTEs
IGNvbnN0IHZvaWQqIGl0ZW0yKQoreworICAgIE93bkZhc3RNYWxsb2NQdHI8Y2hhcj4gdGFyZ2V0
MShld2tfaGlzdG9yeV9pdGVtX3RhcmdldF9nZXQoc3RhdGljX2Nhc3Q8Y29uc3QgRXdrX0hpc3Rv
cnlfSXRlbSo+KGl0ZW0xKSkpOworICAgIE93bkZhc3RNYWxsb2NQdHI8Y2hhcj4gdGFyZ2V0Mihl
d2tfaGlzdG9yeV9pdGVtX3RhcmdldF9nZXQoc3RhdGljX2Nhc3Q8Y29uc3QgRXdrX0hpc3Rvcnlf
SXRlbSo+KGl0ZW0yKSkpOworICAgIHJldHVybiBzdHJjYXNlY21wKHRhcmdldDEuZ2V0KCksIHRh
cmdldDIuZ2V0KCkpOworfQorCitzdGF0aWMgdm9pZCBkdW1wSGlzdG9yeUl0ZW0oY29uc3QgRXdr
X0hpc3RvcnlfSXRlbSogaXRlbSwgaW50IGluZGVudCwgYm9vbCBjdXJyZW50KQoreworICAgIEFT
U0VSVChpdGVtKTsKKyAgICBpbnQgc3RhcnQgPSAwOworICAgIGlmIChjdXJyZW50KSB7CisgICAg
ICAgIHByaW50ZigiY3Vyci0+Iik7CisgICAgICAgIHN0YXJ0ID0gNjsKKyAgICB9CisgICAgZm9y
IChpbnQgaSA9IHN0YXJ0OyBpIDwgaW5kZW50OyBpKyspCisgICAgICAgIHB1dGNoYXIoJyAnKTsK
KworICAgIC8vIG5vcm1hbGl6ZSBmaWxlIFVSTHMuCisgICAgY29uc3QgY2hhciogdXJpID0gZXdr
X2hpc3RvcnlfaXRlbV91cmlfZ2V0KGl0ZW0pOworICAgIGlmICghc3RybmNhc2VjbXAodXJpLCAi
ZmlsZTovLyIsIHNpemVvZigiZmlsZTovLyIpIC0gMSkpIHsKKyAgICAgICAgY29uc3QgY2hhciog
cG9zID0gc3Ryc3RyKHVyaSwgIi9MYXlvdXRUZXN0cy8iKTsKKyAgICAgICAgaWYgKCFwb3MpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcHJpbnRmKCIoZmlsZSB0ZXN0KTolcyIsIHBv
cyArIHNpemVvZigiL0xheW91dFRlc3RzLyIpIC0gMSk7CisgICAgfSBlbHNlCisgICAgICAgIHBy
aW50ZigiJXMiLCB1cmkpOworCisgICAgT3duRmFzdE1hbGxvY1B0cjxjaGFyPiB0YXJnZXQoZXdr
X2hpc3RvcnlfaXRlbV90YXJnZXRfZ2V0KGl0ZW0pKTsKKyAgICBpZiAodGFyZ2V0LmdldCgpICYm
ICoodGFyZ2V0LmdldCgpKSkKKyAgICAgICAgcHJpbnRmKCIgKGluIGZyYW1lIFwiJXNcIikiLCB0
YXJnZXQuZ2V0KCkpOworICAgIGlmIChld2tfaGlzdG9yeV9pdGVtX3RhcmdldF9pcyhpdGVtKSkK
KyAgICAgICAgcHJpbnRmKCIgICoqbmF2IHRhcmdldCoqIik7CisgICAgcHV0Y2hhcignXG4nKTsK
KyAgICBFaW5hX0xpc3QqIGNoaWxkcmVuID0gZXdrX2hpc3RvcnlfaXRlbV9jaGlsZHJlbl9nZXQo
aXRlbSk7CisgICAgaWYgKGNoaWxkcmVuKSB7CisgICAgICAgIC8vIG11c3Qgc29ydCB0byBlbGlt
aW5hdGUgYXJiaXRyYXJ5IHJlc3VsdCBvcmRlcmluZyB3aGljaCBkZWZlYXRzIHJlcHJvZHVjaWJs
ZSB0ZXN0aW5nCisgICAgICAgIGNoaWxkcmVuID0gZWluYV9saXN0X3NvcnQoY2hpbGRyZW4sIDAs
IHN0YXRpY19jYXN0PEVpbmFfQ29tcGFyZV9DYj4oY29tcGFyZUhpc3RvcnlJdGVtcykpOworICAg
ICAgICB2b2lkKiBjaGlsZEl0ZW07CisgICAgICAgIEVJTkFfTElTVF9GUkVFKGNoaWxkcmVuLCBj
aGlsZEl0ZW0pCisgICAgICAgICAgICBkdW1wSGlzdG9yeUl0ZW0oc3RhdGljX2Nhc3Q8RXdrX0hp
c3RvcnlfSXRlbSo+KGNoaWxkSXRlbSksIGluZGVudCArIDQsIGZhbHNlKTsKKyAgICB9Cit9CisK
K3ZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdEZvcldlYlZpZXcoRXZhc19PYmplY3QqIHZpZXcpCit7
CisgICAgcHJpbnRmKCJcbj09PT09PT09PT09PT09IEJhY2sgRm9yd2FyZCBMaXN0ID09PT09PT09
PT09PT09XG4iKTsKKworICAgIGNvbnN0IEV3a19IaXN0b3J5KiBoaXN0b3J5ID0gZXdrX3ZpZXdf
aGlzdG9yeV9nZXQodmlldyk7CisKKyAgICAvLyBQcmludCBvdXQgYWxsIGl0ZW1zIGluIHRoZSBs
aXN0IGFmdGVyIHByZXZUZXN0QkZJdGVtLCB3aGljaCB3YXMgZnJvbSB0aGUgcHJldmlvdXMgdGVz
dAorICAgIC8vIEdhdGhlciBpdGVtcyBmcm9tIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHRoZSBwcmlu
dCB0aGVtIG91dCBmcm9tIG9sZGVzdCB0byBuZXdlc3QKKyAgICBFaW5hX0xpc3QqIGl0ZW1zVG9Q
cmludCA9IDA7CisgICAgdm9pZCogaGlzdG9yeUl0ZW07CisgICAgRWluYV9MaXN0KiBiYWNrd2Fy
ZExpc3QgPSBld2tfaGlzdG9yeV9iYWNrX2xpc3RfZ2V0KGhpc3RvcnkpOworICAgIEVJTkFfTElT
VF9GUkVFKGJhY2t3YXJkTGlzdCwgaGlzdG9yeUl0ZW0pIHsKKyAgICAgICAgaWYgKGhpc3RvcnlJ
dGVtID09IHByZXZUZXN0QkZJdGVtKSB7CisgICAgICAgICAgICBlaW5hX2xpc3RfZnJlZShiYWNr
d2FyZExpc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaXRlbXNU
b1ByaW50ID0gZWluYV9saXN0X2FwcGVuZChpdGVtc1RvUHJpbnQsIGhpc3RvcnlJdGVtKTsKKyAg
ICB9CisKKyAgICBjb25zdCBFd2tfSGlzdG9yeV9JdGVtKiBjdXJyZW50SXRlbSA9IGV3a19oaXN0
b3J5X2hpc3RvcnlfaXRlbV9jdXJyZW50X2dldChoaXN0b3J5KTsKKyAgICBpZiAoY3VycmVudEl0
ZW0pCisgICAgICAgIGl0ZW1zVG9QcmludCA9IGVpbmFfbGlzdF9hcHBlbmQoaXRlbXNUb1ByaW50
LCBjdXJyZW50SXRlbSk7CisKKyAgICBFaW5hX0xpc3QqIGZvcndhcmRMaXN0ID0gZXdrX2hpc3Rv
cnlfZm9yd2FyZF9saXN0X2dldChoaXN0b3J5KTsKKyAgICBFSU5BX0xJU1RfRlJFRShmb3J3YXJk
TGlzdCwgaGlzdG9yeUl0ZW0pIHsKKyAgICAgICAgQVNTRVJUKGhpc3RvcnlJdGVtICE9IHByZXZU
ZXN0QkZJdGVtKTsKKyAgICAgICAgaXRlbXNUb1ByaW50ID0gZWluYV9saXN0X2FwcGVuZChpdGVt
c1RvUHJpbnQsIGhpc3RvcnlJdGVtKTsKKyAgICB9CisKKyAgICBFSU5BX0xJU1RfRlJFRShpdGVt
c1RvUHJpbnQsIGhpc3RvcnlJdGVtKSB7CisgICAgICAgIGR1bXBIaXN0b3J5SXRlbShzdGF0aWNf
Y2FzdDxFd2tfSGlzdG9yeV9JdGVtKj4oaGlzdG9yeUl0ZW0pLCBoaXN0b3J5SXRlbUluZGVudCwg
aGlzdG9yeUl0ZW0gPT0gY3VycmVudEl0ZW0pOworICAgICAgICBld2tfaGlzdG9yeV9pdGVtX2Zy
ZWUoc3RhdGljX2Nhc3Q8RXdrX0hpc3RvcnlfSXRlbSo+KGhpc3RvcnlJdGVtKSk7CisgICAgfQor
CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PVxuIik7Cit9CisKZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1w
SGlzdG9yeUl0ZW0uaCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wSGlzdG9yeUl0ZW0u
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi4yOTgyODdlMjMxZmQyYmE2NWFhZTQ5ODdjZDY0YTA2ZjdjYjQ3ZWFhCi0t
LSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBIaXN0b3J5SXRl
bS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9O
IEVtYmVkZGVkIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9u
aWNzCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
CisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIER1bXBIaXN0b3J5SXRlbV9oCisjZGVmaW5lIER1bXBI
aXN0b3J5SXRlbV9oCisKKyNpbmNsdWRlIDxFdmFzLmg+CisKK3ZvaWQgZHVtcEJhY2tGb3J3YXJk
TGlzdEZvcldlYlZpZXcoRXZhc19PYmplY3QqIHZpZXcpOworCisjZW5kaWYgLy8gRHVtcEhpc3Rv
cnlJdGVtX2gKZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVy
VHJlZS5jcHAgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmM5ODExMGU1YTYzNzQyZDdhMDIzZDk2Nzc5NzI4NzA3YWIxOGY0Y2QKLS0tIC9k
ZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3Bw
CkBAIC0wLDAgKzEsNTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBF
bWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmlj
cworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwor
ICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJU
cmVlLmgiCisKKyNpbmNsdWRlICJEdW1wSGlzdG9yeUl0ZW0uaCIKKyNpbmNsdWRlICJEdW1wUmVu
ZGVyVHJlZVZpZXcuaCIKKyNpbmNsdWRlICJFdmVudFNlbmRlci5oIgorI2luY2x1ZGUgIkZvbnRN
YW5hZ2VtZW50LmgiCisjaW5jbHVkZSAiR0NDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiTGF5b3V0
VGVzdENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUg
IlBpeGVsRHVtcFN1cHBvcnQuaCIKKyNpbmNsdWRlICJXb3JrUXVldWUuaCIKKyNpbmNsdWRlICJl
d2tfcHJpdmF0ZS5oIiAvLyBGSVhNRTogY3JlYXRlIHNvbWUgV2ViQ29yZVN1cHBvcnQvRHVtcFJl
bmRlclRyZWUuY3BwIGluc3RlYWQKKyNpbmNsdWRlIDxFV2ViS2l0Lmg+CisjaW5jbHVkZSA8RWNv
cmUuaD4KKyNpbmNsdWRlIDxFY29yZV9FdmFzLmg+CisjaW5jbHVkZSA8RWNvcmVfRmlsZS5oPgor
I2luY2x1ZGUgPEVkamUuaD4KKyNpbmNsdWRlIDxFdmFzLmg+CisjaW5jbHVkZSA8Zm9udGNvbmZp
Zy9mb250Y29uZmlnLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+
CisjaW5jbHVkZSA8dGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVk
ZSA8d3RmL093bkZhc3RNYWxsb2NQdHIuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK0V2
YXNfT2JqZWN0KiBicm93c2VyID0gMDsKK0V2YXNfT2JqZWN0KiBtYWluRnJhbWUgPSAwOworRXZh
c19PYmplY3QqIHRvcExvYWRpbmdGcmFtZSA9IDA7Citib29sIHdhaXRGb3JQb2xpY3kgPSBmYWxz
ZTsKK0Vjb3JlX1RpbWVyKiB3YWl0VG9EdW1wV2F0Y2hkb2cgPSAwOworZXh0ZXJuIEV3a19IaXN0
b3J5X0l0ZW0qIHByZXZUZXN0QkZJdGVtOworCisvLyBGcm9tIHRoZSB0b3AtbGV2ZWwgRHVtcFJl
bmRlclRyZWUuaAorUmVmUHRyPExheW91dFRlc3RDb250cm9sbGVyPiBnTGF5b3V0VGVzdENvbnRy
b2xsZXI7Cit2b2xhdGlsZSBib29sIGRvbmUgPSBmYWxzZTsKKworc3RhdGljIGludCBkdW1wUGl4
ZWxzID0gZmFsc2U7CitzdGF0aWMgaW50IGR1bXBUcmVlID0gdHJ1ZTsKK3N0YXRpYyBpbnQgcHJp
bnRTZXBhcmF0b3JzID0gdHJ1ZTsKK3N0YXRpYyBpbnQgdXNlWDExV2luZG93ID0gZmFsc2U7CisK
K3N0YXRpYyBXVEY6OlN0cmluZyBkdW1wRnJhbWVzQXNUZXh0KEV2YXNfT2JqZWN0KiBmcmFtZSkK
K3sKKyAgICBXVEY6OlN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoZXdrX3ZpZXdfZnJhbWVfbWFp
bl9nZXQoYnJvd3NlcikgIT0gZnJhbWUpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4tLS0t
LS0tLVxuRnJhbWU6ICciKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChXVEY6OlN0cmluZzo6ZnJv
bVVURjgoZXdrX2ZyYW1lX25hbWVfZ2V0KGZyYW1lKSkpOworICAgICAgICByZXN1bHQuYXBwZW5k
KCInXG4tLS0tLS0tLVxuIik7CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZChld2tfZnJhbWVf
aW5uZXJfdGV4dF9nZXQoZnJhbWUpKTsKKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworCisgICAg
aWYgKGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkpIHsKKyAg
ICAgICAgRWluYV9JdGVyYXRvciogY2hpbGRyZW4gPSBld2tfZnJhbWVfY2hpbGRyZW5faXRlcmF0
b3JfbmV3KGZyYW1lKTsKKyAgICAgICAgRXZhc19PYmplY3QqIGNoaWxkOworCisgICAgICAgIEVJ
TkFfSVRFUkFUT1JfRk9SRUFDSChjaGlsZHJlbiwgY2hpbGQpIHsKKyAgICAgICAgICAgIFdURjo6
U3RyaW5nIHRlbXBUZXh0KGR1bXBGcmFtZXNBc1RleHQoY2hpbGQpKTsKKworICAgICAgICAgICAg
aWYgKHRlbXBUZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICAgICAgcmVzdWx0LmFwcGVuZCh0ZW1wVGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBl
aW5hX2l0ZXJhdG9yX2ZyZWUoY2hpbGRyZW4pOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKEV2YXNfT2JqZWN0KikK
K3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGRMb2dGcmFt
ZUxvYWREZWxlZ2F0ZXMoY29uc3QgV1RGOjpTdHJpbmcmIHBhdGhPclVSTCkKK3sKKyAgICByZXR1
cm4gcGF0aE9yVVJMLmNvbnRhaW5zKCJsb2FkaW5nLyIpOworfQorCitzdGF0aWMgYm9vbCBzaG91
bGREdW1wQXNUZXh0KGNvbnN0IFdURjo6U3RyaW5nJiBwYXRoT3JVUkwpCit7CisgICAgcmV0dXJu
IHBhdGhPclVSTC5jb250YWlucygiZHVtcEFzVGV4dC8iKTsKK30KKworc3RhdGljIHZvaWQgc2Vu
ZFBpeGVsUmVzdWx0c0VPRigpCit7CisgICAgcHV0cygiI0VPRiIpOworICAgIGZmbHVzaChzdGRv
dXQpOworICAgIGZmbHVzaChzdGRlcnIpOworfQorCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlQW55
UHJldmlvdXNXYWl0VG9EdW1wV2F0Y2hkb2coKQoreworICAgIGlmICh3YWl0VG9EdW1wV2F0Y2hk
b2cpIHsKKyAgICAgICAgZWNvcmVfdGltZXJfZGVsKHdhaXRUb0R1bXBXYXRjaGRvZyk7CisgICAg
ICAgIHdhaXRUb0R1bXBXYXRjaGRvZyA9IDA7CisgICAgfQorICAgIHdhaXRGb3JQb2xpY3kgPSBm
YWxzZTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBwcm9jZXNzV29yayh2b2lkKiBkYXRhKQorewor
ICAgIGlmIChXb3JrUXVldWU6OnNoYXJlZCgpLT5wcm9jZXNzV29yaygpICYmICFnTGF5b3V0VGVz
dENvbnRyb2xsZXItPndhaXRUb0R1bXAoKSkKKyAgICAgICAgZHVtcCgpOworICAgIHJldHVybiBF
Q09SRV9DQUxMQkFDS19DQU5DRUw7Cit9CisKK3N0YXRpYyB2b2lkIGFkZENvbnRyb2xsZXJUb1dp
bmRvdyhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgd2luZG93T2JqZWN0LCBjb25z
dCBjaGFyKiBjb250cm9sbGVyTmFtZSwgSlNWYWx1ZVJlZiBjb250cm9sbGVyKQoreworICAgIEpT
U3RyaW5nUmVmIGNvbnRyb2xsZXJOYW1lU3RyID0gSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJp
bmcoY29udHJvbGxlck5hbWUpOworICAgIEpTT2JqZWN0U2V0UHJvcGVydHkoY29udGV4dCwgd2lu
ZG93T2JqZWN0LCBjb250cm9sbGVyTmFtZVN0ciwgY29udHJvbGxlciwga0pTUHJvcGVydHlBdHRy
aWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSwgMCk7CisgICAg
SlNTdHJpbmdSZWxlYXNlKGNvbnRyb2xsZXJOYW1lU3RyKTsKK30KKworc3RhdGljIHZvaWQgb25X
aW5kb3dPYmplY3RDbGVhcmVkKHZvaWQqIHVzZXJEYXRhLCBFdmFzX09iamVjdCosIHZvaWQqIGV2
ZW50SW5mbykKK3sKKyAgICBFd2tfV2luZG93X09iamVjdF9DbGVhcmVkX0V2ZW50KiBvYmplY3RD
bGVhcmVkSW5mbyA9IHN0YXRpY19jYXN0PEV3a19XaW5kb3dfT2JqZWN0X0NsZWFyZWRfRXZlbnQq
PihldmVudEluZm8pOworICAgIEpTVmFsdWVSZWYgZXhjZXB0aW9uID0gMDsKKyAgICBBU1NFUlQo
Z0xheW91dFRlc3RDb250cm9sbGVyKTsKKworICAgIEdDQ29udHJvbGxlciogZ2NDb250cm9sbGVy
ID0gc3RhdGljX2Nhc3Q8R0NDb250cm9sbGVyKj4odXNlckRhdGEpOworICAgIEFTU0VSVChnY0Nv
bnRyb2xsZXIpOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5tYWtlV2luZG93T2JqZWN0
KG9iamVjdENsZWFyZWRJbmZvLT5jb250ZXh0LCBvYmplY3RDbGVhcmVkSW5mby0+d2luZG93T2Jq
ZWN0LCAmZXhjZXB0aW9uKTsKKyAgICBBU1NFUlQoIWV4Y2VwdGlvbik7CisKKyAgICBnY0NvbnRy
b2xsZXItPm1ha2VXaW5kb3dPYmplY3Qob2JqZWN0Q2xlYXJlZEluZm8tPmNvbnRleHQsIG9iamVj
dENsZWFyZWRJbmZvLT53aW5kb3dPYmplY3QsICZleGNlcHRpb24pOworICAgIEFTU0VSVCghZXhj
ZXB0aW9uKTsKKworICAgIC8qIEZJWE1FIHMvZmFsc2UvIWdldF9wYXJlbnQvICovCisgICAgYWRk
Q29udHJvbGxlclRvV2luZG93KG9iamVjdENsZWFyZWRJbmZvLT5jb250ZXh0LCBvYmplY3RDbGVh
cmVkSW5mby0+d2luZG93T2JqZWN0LCAiZXZlbnRTZW5kZXIiLCBtYWtlRXZlbnRTZW5kZXIob2Jq
ZWN0Q2xlYXJlZEluZm8tPmNvbnRleHQsIGZhbHNlKSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uU3Rh
dHVzYmFyVGV4dFNldCh2b2lkKiwgRXZhc19PYmplY3QqLCB2b2lkKiBldmVudEluZm8pCit7Cisg
ICAgaWYgKCFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBTdGF0dXNDYWxsYmFja3MoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgY29uc3QgY2hhciogc3RhdHVzYmFyVGV4dCA9IHN0YXRpY19j
YXN0PGNvbnN0IGNoYXIqPihldmVudEluZm8pOworICAgIHByaW50ZigiVUkgREVMRUdBVEUgU1RB
VFVTIENBTExCQUNLOiBzZXRTdGF0dXNUZXh0OiVzXG4iLCBzdGF0dXNiYXJUZXh0KTsKK30KKwor
c3RhdGljIHZvaWQgb25Mb2FkU3RhcnRlZCh2b2lkKiwgRXZhc19PYmplY3QqIHZpZXcsIHZvaWQq
KQoreworICAgIC8vIEZJWE1FOiB3ZSBhY3R1YWxseSBuZWVkIHRoZSBmcmFtZSByZWxhdGVkIHRv
IHRoaXMgZXZlbnQKKyAgICBFdmFzX09iamVjdCogZnJhbWUgPSBld2tfdmlld19mcmFtZV9tYWlu
X2dldCh2aWV3KTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBvbmx5IHNldCB0aGlzIG9uY2UgcGVy
IHRlc3QuIElmIGl0IGdldHMgY2xlYXJlZCwgYW5kIHRoZW4gc2V0IGFnYWluLCB3ZSBtaWdodAor
ICAgIC8vIGVuZCB1cCBkb2luZyB0d28gZHVtcHMgZm9yIG9uZSB0ZXN0LgorICAgIGlmICghdG9w
TG9hZGluZ0ZyYW1lICYmICFkb25lKQorICAgICAgICB0b3BMb2FkaW5nRnJhbWUgPSBmcmFtZTsK
K30KKworc3RhdGljIHZvaWQgb25Mb2FkRmluaXNoZWQodm9pZCosIEV2YXNfT2JqZWN0KiB2aWV3
LCB2b2lkKikKK3sKKyAgICAvLyBGSVhNRTogd2UgYWN0dWFsbHkgbmVlZCB0aGUgZnJhbWUgcmVs
YXRlZCB0byB0aGlzIGV2ZW50CisgICAgRXZhc19PYmplY3QqIGZyYW1lID0gZXdrX3ZpZXdfZnJh
bWVfbWFpbl9nZXQodmlldyk7CisKKyAgICBpZiAodG9wTG9hZGluZ0ZyYW1lICE9IGZyYW1lKQor
ICAgICAgICByZXR1cm47CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOworCisgICAgV29ya1F1
ZXVlOjpzaGFyZWQoKS0+c2V0RnJvemVuKHRydWUpOworICAgIGlmIChnTGF5b3V0VGVzdENvbnRy
b2xsZXItPndhaXRUb0R1bXAoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKFdvcmtRdWV1
ZTo6c2hhcmVkKCktPmNvdW50KCkpCisgICAgICAgIGVjb3JlX2lkbGVyX2FkZChwcm9jZXNzV29y
aywgMCk7CisgICAgZWxzZQorICAgICAgICBkdW1wKCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uVGl0
bGVDaGFuZ2VkKHZvaWQqLCBFdmFzX09iamVjdCosIHZvaWQqKQoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uRG9jdW1lbnRMb2FkRmluaXNoZWQodm9pZCosIEV2
YXNfT2JqZWN0KiBmcmFtZSwgdm9pZCopCit7CisgICAgY29uc3QgV1RGOjpTdHJpbmcgZnJhbWVO
YW1lKGV3a19mcmFtZV9zdWl0YWJsZV9kcnRfbmFtZV9nZXQoZnJhbWUpKTsKKworICAgIGlmICgh
ZG9uZSAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBGcmFtZUxvYWRDYWxsYmFja3MoKSkK
KyAgICAgICAgcHJpbnRmKCIlcyAtIGRpZEZpbmlzaERvY3VtZW50TG9hZEZvckZyYW1lXG4iLCBm
cmFtZU5hbWUudXRmOCgpLmRhdGEoKSk7CisgICAgZWxzZSBpZiAoIWRvbmUpIHsKKyAgICAgICAg
Y29uc3QgdW5zaWduZWQgcGVuZGluZ0ZyYW1lVW5sb2FkRXZlbnRzID0gZXdrX2ZyYW1lX3BlbmRp
bmdfdW5sb2FkX2V2ZW50X2NvdW50X2dldChmcmFtZSk7CisgICAgICAgIGlmIChwZW5kaW5nRnJh
bWVVbmxvYWRFdmVudHMpCisgICAgICAgICAgICBwcmludGYoIiVzIC0gaGFzICV1IG9udW5sb2Fk
IGhhbmRsZXIocylcbiIsIGZyYW1lTmFtZS51dGY4KCkuZGF0YSgpLCBwZW5kaW5nRnJhbWVVbmxv
YWRFdmVudHMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgb25FY29yZUV2YXNSZXNpemUoRWNv
cmVfRXZhcyogZWNvcmVFdmFzKQoreworICAgIGludCB3aWR0aCwgaGVpZ2h0OworCisgICAgZWNv
cmVfZXZhc19nZW9tZXRyeV9nZXQoZWNvcmVFdmFzLCAwLCAwLCAmd2lkdGgsICZoZWlnaHQpOwor
ICAgIGV2YXNfb2JqZWN0X21vdmUoYnJvd3NlciwgMCwgMCk7CisgICAgZXZhc19vYmplY3RfcmVz
aXplKGJyb3dzZXIsIHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBvbkNsb3NlV2lu
ZG93KEVjb3JlX0V2YXMqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBF
aW5hX0Jvb2wgdXNlTG9uZ1J1bm5pbmdTZXJ2ZXJNb2RlKGludCBhcmdjLCBjaGFyKiogYXJndikK
K3sKKyAgICByZXR1cm4gKGFyZ2MgPT0gb3B0aW5kICsgMSAmJiAhc3RyY21wKGFyZ3Zbb3B0aW5k
XSwgIi0iKSk7Cit9CisKK3N0YXRpYyBib29sIHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGludCBh
cmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBzdGF0aWMgY29uc3Qgb3B0aW9uIG9wdGlvbnNbXSA9
IHsKKyAgICAgICAgeyJub3RyZWUiLCBub19hcmd1bWVudCwgJmR1bXBUcmVlLCBmYWxzZX0sCisg
ICAgICAgIHsicGl4ZWwtdGVzdHMiLCBub19hcmd1bWVudCwgJmR1bXBQaXhlbHMsIHRydWV9LAor
ICAgICAgICB7InRyZWUiLCBub19hcmd1bWVudCwgJmR1bXBUcmVlLCB0cnVlfSwKKyAgICAgICAg
eyJndWkiLCBub19hcmd1bWVudCwgJnVzZVgxMVdpbmRvdywgdHJ1ZX0sCisgICAgICAgIHswLCAw
LCAwLCAwfQorICAgIH07CisgICAgaW50IG9wdGlvbjsKKworICAgIHdoaWxlICgob3B0aW9uID0g
Z2V0b3B0X2xvbmcoYXJnYywgKGNoYXIqIGNvbnN0Kilhcmd2LCAiIiwgb3B0aW9ucywgMCkpICE9
IC0xKSB7CisgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgIGNhc2UgJz8nOgorICAg
ICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCByZXNldERlZmF1bHRzVG9D
b25zaXN0ZW50VmFsdWVzKCkKK3sKKyAgICBld2tfc2V0dGluZ3NfaWNvbl9kYXRhYmFzZV9jbGVh
cigpOworICAgIGV3a19zZXR0aW5nc19pY29uX2RhdGFiYXNlX3BhdGhfc2V0KDApOworCisgICAg
ZXdrX3ZpZXdfc2V0dGluZ19wcml2YXRlX2Jyb3dzaW5nX3NldChicm93c2VyLCBFSU5BX0ZBTFNF
KTsKKyAgICBld2tfdmlld19zZXR0aW5nX3NwYXRpYWxfbmF2aWdhdGlvbl9zZXQoYnJvd3Nlciwg
RUlOQV9GQUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfZnJhbWVfZmxhdHRlbmlu
Z19zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19vZmZsaW5l
X2FwcF9jYWNoZV9zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19zZXR0aW5n
X2VuYWJsZV9zY3JpcHRzX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3Nl
dHRpbmdfZm9udF9zdGFuZGFyZF9zZXQoYnJvd3NlciwgIlRpbWVzIik7CisgICAgZXdrX3ZpZXdf
c2V0dGluZ19mb250X21vbm9zcGFjZV9zZXQoYnJvd3NlciwgIkNvdXJpZXIiKTsKKyAgICBld2tf
dmlld19zZXR0aW5nX2ZvbnRfc2VyaWZfc2V0KGJyb3dzZXIsICJUaW1lcyIpOworICAgIGV3a192
aWV3X3NldHRpbmdfZm9udF9zYW5zX3NlcmlmX3NldChicm93c2VyLCAiSGVsdmV0aWNhIik7Cisg
ICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2N1cnNpdmVfc2V0KGJyb3dzZXIsICJjdXJzaXZlIik7
CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2ZhbnRhc3lfc2V0KGJyb3dzZXIsICJmYW50YXN5
Iik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2RlZmF1bHRfc2l6ZV9zZXQoYnJvd3Nlciwg
MTIpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2l6ZV9zZXQoYnJvd3Nl
ciwgMTApOworICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9taW5pbXVtX3NpemVfc2V0KGJyb3dz
ZXIsIDApOworICAgIGV3a192aWV3X3NldHRpbmdfY2FyZXRfYnJvd3Npbmdfc2V0KGJyb3dzZXIs
IEVJTkFfRkFMU0UpOworICAgIGV3a192aWV3X3NldHRpbmdfcGFnZV9jYWNoZV9zZXQoYnJvd3Nl
ciwgRUlOQV9GQUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfYXV0b19yZXNpemVf
d2luZG93X3NldChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfZW5h
YmxlX3BsdWdpbnNfc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGlu
Z19zY3JpcHRzX3dpbmRvd19vcGVuX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworCisgICAgZXdr
X3ZpZXdfem9vbV9zZXQoYnJvd3NlciwgMS4wLCAwLCAwKTsKKworICAgIEV3a19IaXN0b3J5KiBo
aXN0b3J5ID0gZXdrX3ZpZXdfaGlzdG9yeV9nZXQoYnJvd3Nlcik7CisgICAgaW50IGxpbWl0ID0g
ZXdrX2hpc3RvcnlfbGltaXRfZ2V0KGhpc3RvcnkpOworICAgIGV3a19oaXN0b3J5X2xpbWl0X3Nl
dChoaXN0b3J5LCAwKTsKKyAgICBld2tfaGlzdG9yeV9saW1pdF9zZXQoaGlzdG9yeSwgbGltaXQp
OworCisgICAgZXdrX2Nvb2tpZXNfY2xlYXIoKTsKKyAgICBld2tfY29va2llc19wb2xpY3lfc2V0
KEVXS19DT09LSUVfSkFSX0FDQ0VQVF9OT19USElSRF9QQVJUWSk7CisKKyAgICBld2tfZnJhbWVf
b3BlbmVyX2NsZWFyKGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KGJyb3dzZXIpKTsKK30KKworc3Rh
dGljIFdURjo6U3RyaW5nIGdldEZpbmFsVGVzdFVSTChjb25zdCBXVEY6OlN0cmluZyYgdGVzdFVS
TCkKK3sKKyAgICBjb25zdCBzaXplX3QgaGFzaFNlcGFyYXRvclBvcyA9IHRlc3RVUkwuZmluZCgi
JyIpOworICAgIGlmIChoYXNoU2VwYXJhdG9yUG9zICE9IG5vdEZvdW5kKQorICAgICAgICByZXR1
cm4gdGVzdFVSTC5sZWZ0KGhhc2hTZXBhcmF0b3JQb3MpOworCisgICAgLy8gQ29udmVydCB0aGUg
cGF0aCBpbnRvIGEgZnVsbCBmaWxlIFVSTCBpZiBpdCBkb2VzIG5vdCBsb29rCisgICAgLy8gbGlr
ZSBhbiBIVFRQL1MgVVJMIChkb2Vzbid0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovLyku
CisgICAgaWYgKCF0ZXN0VVJMLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAmJiAhdGVzdFVSTC5zdGFy
dHNXaXRoKCJodHRwczovLyIpKSB7CisgICAgICAgIE93bkZhc3RNYWxsb2NQdHI8Y2hhcj4gZmls
ZVBhdGgoZWNvcmVfZmlsZV9yZWFscGF0aCh0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpKTsKKworICAg
ICAgICBpZiAoZWNvcmVfZmlsZV9leGlzdHMoZmlsZVBhdGguZ2V0KCkpKQorICAgICAgICAgICAg
cmV0dXJuIFdURjo6U3RyaW5nKCJmaWxlOi8vIikgKyBXVEY6OlN0cmluZzo6ZnJvbVVURjgoZmls
ZVBhdGguZ2V0KCkpOworICAgIH0KKworICAgIHJldHVybiB0ZXN0VVJMOworfQorCitzdGF0aWMg
V1RGOjpTdHJpbmcgZ2V0RXhwZWN0ZWRQaXhlbEhhc2goY29uc3QgV1RGOjpTdHJpbmcmIHRlc3RV
UkwpCit7CisgICAgY29uc3Qgc2l6ZV90IGhhc2hTZXBhcmF0b3JQb3MgPSB0ZXN0VVJMLmZpbmQo
IiciKTsKKyAgICByZXR1cm4gKGhhc2hTZXBhcmF0b3JQb3MgPT0gbm90Rm91bmQpID8gdGVzdFVS
TC5yaWdodChoYXNoU2VwYXJhdG9yUG9zKSA6IFdURjo6U3RyaW5nKCk7Cit9CisKK3N0YXRpYyB2
b2lkIGNyZWF0ZUxheW91dFRlc3RDb250cm9sbGVyKGNvbnN0IFdURjo6U3RyaW5nJiB0ZXN0VVJM
LCBjb25zdCBXVEY6OlN0cmluZyYgZXhwZWN0ZWRQaXhlbEhhc2gpCit7CisgICAgZ0xheW91dFRl
c3RDb250cm9sbGVyID0KKyAgICAgICAgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmNyZWF0ZShzdGQ6
OnN0cmluZyh0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGV4cGVjdGVkUGl4ZWxIYXNoLnV0ZjgoKS5kYXRhKCkp
KTsKKworICAgIHRvcExvYWRpbmdGcmFtZSA9IDA7CisgICAgZG9uZSA9IGZhbHNlOworCisgICAg
Z0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRJY29uRGF0YWJhc2VFbmFibGVkKGZhbHNlKTsKKwor
ICAgIGlmIChzaG91bGRMb2dGcmFtZUxvYWREZWxlZ2F0ZXModGVzdFVSTCkpCisgICAgICAgIGdM
YXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEZyYW1lTG9hZENhbGxiYWNrcyh0cnVlKTsKKwor
ICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCh0cnVl
KTsKKworICAgIGlmIChzaG91bGREdW1wQXNUZXh0KHRlc3RVUkwpKSB7CisgICAgICAgIGdMYXlv
dXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEFzVGV4dCh0cnVlKTsKKyAgICAgICAgZ0xheW91dFRl
c3RDb250cm9sbGVyLT5zZXRHZW5lcmF0ZVBpeGVsUmVzdWx0cyhmYWxzZSk7CisgICAgfQorfQor
CitzdGF0aWMgdm9pZCBydW5UZXN0KGNvbnN0IGNoYXIqIGNUZXN0UGF0aE9yVVJMKQoreworICAg
IGNvbnN0IFdURjo6U3RyaW5nIHRlc3RQYXRoT3JVUkwgPSBXVEY6OlN0cmluZzo6ZnJvbVVURjgo
Y1Rlc3RQYXRoT3JVUkwpOworICAgIEFTU0VSVCghdGVzdFBhdGhPclVSTC5pc0VtcHR5KCkpOwor
CisgICAgY29uc3QgV1RGOjpTdHJpbmcgdGVzdFVSTCA9IGdldEZpbmFsVGVzdFVSTCh0ZXN0UGF0
aE9yVVJMKTsKKyAgICBjb25zdCBXVEY6OlN0cmluZyBleHBlY3RlZFBpeGVsSGFzaCA9IGdldEV4
cGVjdGVkUGl4ZWxIYXNoKHRlc3RQYXRoT3JVUkwpOworCisgICAgcmVzZXREZWZhdWx0c1RvQ29u
c2lzdGVudFZhbHVlcygpOworICAgIGNyZWF0ZUxheW91dFRlc3RDb250cm9sbGVyKHRlc3RVUkws
IGV4cGVjdGVkUGl4ZWxIYXNoKTsKKworICAgIFdvcmtRdWV1ZTo6c2hhcmVkKCktPmNsZWFyKCk7
CisgICAgV29ya1F1ZXVlOjpzaGFyZWQoKS0+c2V0RnJvemVuKGZhbHNlKTsKKworICAgIGNvbnN0
IGJvb2wgaXNTVkdXM0NUZXN0ID0gdGVzdFVSTC5jb250YWlucygic3ZnL1czQy1TVkctMS4xIik7
CisgICAgY29uc3QgaW50IHdpZHRoID0gaXNTVkdXM0NUZXN0ID8gNDgwIDogTGF5b3V0VGVzdENv
bnRyb2xsZXI6Om1heFZpZXdXaWR0aDsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gaXNTVkdXM0NU
ZXN0ID8gMzYwIDogTGF5b3V0VGVzdENvbnRyb2xsZXI6Om1heFZpZXdIZWlnaHQ7CisgICAgZXZh
c19vYmplY3RfcmVzaXplKGJyb3dzZXIsIHdpZHRoLCBoZWlnaHQpOworCisgICAgaWYgKHByZXZU
ZXN0QkZJdGVtKQorICAgICAgICBld2tfaGlzdG9yeV9pdGVtX2ZyZWUocHJldlRlc3RCRkl0ZW0p
OworICAgIGNvbnN0IEV3a19IaXN0b3J5KiBoaXN0b3J5ID0gZXdrX3ZpZXdfaGlzdG9yeV9nZXQo
YnJvd3Nlcik7CisgICAgcHJldlRlc3RCRkl0ZW0gPSBld2tfaGlzdG9yeV9oaXN0b3J5X2l0ZW1f
Y3VycmVudF9nZXQoaGlzdG9yeSk7CisKKyAgICBldmFzX29iamVjdF9mb2N1c19zZXQoYnJvd3Nl
ciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld191cmlfc2V0KGJyb3dzZXIsIHRlc3RVUkwudXRm
OCgpLmRhdGEoKSk7CisKKyAgICBlY29yZV9tYWluX2xvb3BfYmVnaW4oKTsKKworICAgIGdMYXlv
dXRUZXN0Q29udHJvbGxlci0+Y2xvc2VXZWJJbnNwZWN0b3IoKTsKKyAgICBnTGF5b3V0VGVzdENv
bnRyb2xsZXItPnNldERldmVsb3BlckV4dHJhc0VuYWJsZWQoZmFsc2UpOworCisgICAgZXdrX3Zp
ZXdfdXJpX3NldChicm93c2VyLCAiYWJvdXQ6YmxhbmsiKTsKKworICAgIGdMYXlvdXRUZXN0Q29u
dHJvbGxlci5jbGVhcigpOworICAgIHNlbmRQaXhlbFJlc3VsdHNFT0YoKTsKK30KKworc3RhdGlj
IHZvaWQgcnVuVGVzdGluZ1NlcnZlckxvb3AoKQoreworICAgIGNoYXIgZmlsZW5hbWVbUEFUSF9N
QVhdOworCisgICAgd2hpbGUgKGZnZXRzKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCBzdGRp
bikpIHsKKyAgICAgICAgY2hhciogbmV3TGluZSA9IHN0cnJjaHIoZmlsZW5hbWUsICdcbicpOwor
ICAgICAgICBpZiAobmV3TGluZSkKKyAgICAgICAgICAgICpuZXdMaW5lID0gJ1wwJzsKKworICAg
ICAgICBpZiAoZmlsZW5hbWVbMF0gIT0gJ1wwJykKKyAgICAgICAgICAgIHJ1blRlc3QoZmlsZW5h
bWUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRqdXN0T3V0cHV0VHlwZUJ5TWltZVR5cGUo
KQoreworICAgIE93bkZhc3RNYWxsb2NQdHI8Y2hhcj4gcmVzcG9uc2VNaW1lVHlwZShld2tfZnJh
bWVfcmVzcG9uc2VfbWltZV90eXBlX2dldChtYWluRnJhbWUpKTsKKyAgICBpZiAocmVzcG9uc2VN
aW1lVHlwZS5nZXQoKSAmJiAhc3RyY21wKHJlc3BvbnNlTWltZVR5cGUuZ2V0KCksICJ0ZXh0L3Bs
YWluIikpIHsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXREdW1wQXNUZXh0KHRy
dWUpOworICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldEdlbmVyYXRlUGl4ZWxSZXN1
bHRzKGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBGcmFtZUNvbnRlbnRzQXNU
ZXh0KCkKK3sKKyAgICBXVEY6OlN0cmluZyByZXN1bHQ7CisgICAgaWYgKGdMYXlvdXRUZXN0Q29u
dHJvbGxlci0+ZHVtcEFzVGV4dCgpKQorICAgICAgICByZXN1bHQgPSBkdW1wRnJhbWVzQXNUZXh0
KG1haW5GcmFtZSk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBXVEY6OlN0cmluZzo6ZnJv
bVVURjgoZXdrX2ZyYW1lX3JlbmRlcl90cmVlX2R1bXBfZ2V0KG1haW5GcmFtZSkpOworCisgICAg
cHJpbnRmKCIlcyIsIHJlc3VsdC51dGY4KCkuZGF0YSgpKTsKK30KKworc3RhdGljIGJvb2wgc2hv
dWxkRHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oKQoreworICAgIHJldHVybiBnTGF5b3V0VGVzdENv
bnRyb2xsZXItPmR1bXBBc1RleHQoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRE9N
QXNXZWJBcmNoaXZlKCkgJiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcFNvdXJjZUFzV2Vi
QXJjaGl2ZSgpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGREdW1wUGl4ZWxzQW5kQ29tcGFyZVdp
dGhFeHBlY3RlZCgpCit7CisgICAgcmV0dXJuIGR1bXBQaXhlbHMgJiYgZ0xheW91dFRlc3RDb250
cm9sbGVyLT5nZW5lcmF0ZVBpeGVsUmVzdWx0cygpICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXIt
PmR1bXBET01Bc1dlYkFyY2hpdmUoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wU291
cmNlQXNXZWJBcmNoaXZlKCk7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZER1bXBCYWNrRm9yd2Fy
ZExpc3QoKQoreworICAgIHJldHVybiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBCYWNrRm9y
d2FyZExpc3QoKTsKK30KKworc3RhdGljIGJvb2wgaW5pdEVmbCgpCit7CisgICAgaWYgKCFlY29y
ZV9ldmFzX2luaXQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghZWNvcmVfZmls
ZV9pbml0KCkpIHsKKyAgICAgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZWRqZV9pbml0KCkpIHsKKyAgICAgICAgZWNvcmVf
ZmlsZV9zaHV0ZG93bigpOworICAgICAgICBlY29yZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFld2tfaW5pdCgpKSB7CisgICAgICAgIGVk
amVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNvcmVfZmlsZV9zaHV0ZG93bigpOworICAgICAgICBl
Y29yZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgc2h1dGRvd25FZmwoKQoreworICAgIGV3
a19zaHV0ZG93bigpOworICAgIGVkamVfc2h1dGRvd24oKTsKKyAgICBlY29yZV9maWxlX3NodXRk
b3duKCk7CisgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworfQorCit2b2lkIGRpc3BsYXlXZWJW
aWV3KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIGR1bXAoKQoreworICAg
IGludmFsaWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1bXBXYXRjaGRvZygpOworCisgICAgaWYgKGR1
bXBUcmVlKSB7CisgICAgICAgIGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKCk7CisgICAgICAg
IGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KCk7CisKKyAgICAgICAgaWYgKHNob3VsZER1bXBGcmFt
ZVNjcm9sbFBvc2l0aW9uKCkpCisgICAgICAgICAgICBkdW1wRnJhbWVTY3JvbGxQb3NpdGlvbiht
YWluRnJhbWUpOworCisgICAgICAgIGlmIChzaG91bGREdW1wQmFja0ZvcndhcmRMaXN0KCkpCisg
ICAgICAgICAgICBkdW1wQmFja0ZvcndhcmRMaXN0Rm9yV2ViVmlldyhicm93c2VyKTsKKworICAg
ICAgICBpZiAocHJpbnRTZXBhcmF0b3JzKSB7CisgICAgICAgICAgICBwdXRzKCIjRU9GIik7Cisg
ICAgICAgICAgICBmcHV0cygiI0VPRlxuIiwgc3RkZXJyKTsKKyAgICAgICAgICAgIGZmbHVzaChz
dGRvdXQpOworICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoc2hvdWxkRHVtcFBpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQoKSkKKyAgICAg
ICAgZHVtcFdlYlZpZXdBc1BpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQoZ0xheW91dFRlc3RD
b250cm9sbGVyLT5leHBlY3RlZFBpeGVsSGFzaCgpKTsKKworICAgIGRvbmUgPSB0cnVlOworICAg
IGVjb3JlX21haW5fbG9vcF9xdWl0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZUJyb3dzZXIo
RXZhcyogZXZhcywgR0NDb250cm9sbGVyKiBnY0NvbnRyb2xsZXIpCit7CisgICAgYnJvd3NlciA9
IGRydFZpZXdUaWxlZEFkZChldmFzKTsKKyAgICBpZiAoIWJyb3dzZXIpIHsKKyAgICAgICAgc2h1
dGRvd25FZmwoKTsKKyAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAgIGV3
a192aWV3X3RoZW1lX3NldChicm93c2VyLCBEQVRBX0RJUiIvZGVmYXVsdC5lZGoiKTsKKworICAg
IGV2YXNfb2JqZWN0X25hbWVfc2V0KGJyb3dzZXIsICJicm93c2VyIik7CisgICAgZXZhc19vYmpl
Y3RfbW92ZShicm93c2VyLCAwLCAwKTsKKyAgICBldmFzX29iamVjdF9yZXNpemUoYnJvd3Nlciwg
ODAwLCA2MDApOworICAgIGV2YXNfb2JqZWN0X2xheWVyX3NldChicm93c2VyLCBFVkFTX0xBWUVS
X01BWCk7CisgICAgZXZhc19vYmplY3Rfc2hvdyhicm93c2VyKTsKKyAgICBldmFzX29iamVjdF9m
b2N1c19zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2Nh
bGxiYWNrX2FkZChicm93c2VyLCAibG9hZCxzdGFydGVkIiwgb25Mb2FkU3RhcnRlZCwgMCk7Cisg
ICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJsb2FkLGZpbmlzaGVk
Iiwgb25Mb2FkRmluaXNoZWQsIDApOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2Fk
ZChicm93c2VyLCAidGl0bGUsY2hhbmdlZCIsIG9uVGl0bGVDaGFuZ2VkLCAwKTsKKyAgICBldmFz
X29iamVjdF9zbWFydF9jYWxsYmFja19hZGQoYnJvd3NlciwgIndpbmRvdyxvYmplY3QsY2xlYXJl
ZCIsIG9uV2luZG93T2JqZWN0Q2xlYXJlZCwgZ2NDb250cm9sbGVyKTsKKyAgICBldmFzX29iamVj
dF9zbWFydF9jYWxsYmFja19hZGQoYnJvd3NlciwgInN0YXR1c2Jhcix0ZXh0LHNldCIsIG9uU3Rh
dHVzYmFyVGV4dFNldCwgMCk7CisKKyAgICBtYWluRnJhbWUgPSBld2tfdmlld19mcmFtZV9tYWlu
X2dldChicm93c2VyKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQobWFpbkZy
YW1lLCAibG9hZCxkb2N1bWVudCxmaW5pc2hlZCIsIG9uRG9jdW1lbnRMb2FkRmluaXNoZWQsIDAp
OworfQorCitzdGF0aWMgRWNvcmVfRXZhcyogaW5pdEVjb3JlRXZhcygpCit7CisgICAgRWNvcmVf
RXZhcyogZWNvcmVFdmFzID0gdXNlWDExV2luZG93ID8gZWNvcmVfZXZhc19uZXcoMCwgMCwgMCwg
ODAwLCA2MDAsIDApIDogZWNvcmVfZXZhc19idWZmZXJfbmV3KDgwMCwgNjAwKTsKKyAgICBpZiAo
IWVjb3JlRXZhcykgeworICAgICAgICBzaHV0ZG93bkVmbCgpOworICAgICAgICBleGl0KEVYSVRf
RkFJTFVSRSk7CisgICAgfQorCisgICAgZWNvcmVfZXZhc190aXRsZV9zZXQoZWNvcmVFdmFzLCAi
RUZMIER1bXBSZW5kZXJUcmVlIik7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19yZXNpemVfc2V0
KGVjb3JlRXZhcywgb25FY29yZUV2YXNSZXNpemUpOworICAgIGVjb3JlX2V2YXNfY2FsbGJhY2tf
ZGVsZXRlX3JlcXVlc3Rfc2V0KGVjb3JlRXZhcywgb25DbG9zZVdpbmRvdyk7CisgICAgZWNvcmVf
ZXZhc19zaG93KGVjb3JlRXZhcyk7CisKKyAgICByZXR1cm4gZWNvcmVFdmFzOworfQorCitpbnQg
bWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgaWYgKCFwYXJzZUNvbW1hbmRMaW5l
T3B0aW9ucyhhcmdjLCBhcmd2KSkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAg
IGlmICghaW5pdEVmbCgpKQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisgICAgT3du
UHRyPEVjb3JlX0V2YXM+IGVjb3JlRXZhcyA9IGFkb3B0UHRyKGluaXRFY29yZUV2YXMoKSk7Cisg
ICAgT3duUHRyPEdDQ29udHJvbGxlcj4gZ2NDb250cm9sbGVyID0gYWRvcHRQdHIobmV3IEdDQ29u
dHJvbGxlcik7CisgICAgY3JlYXRlQnJvd3NlcihlY29yZV9ldmFzX2dldChlY29yZUV2YXMuZ2V0
KCkpLCBnY0NvbnRyb2xsZXIuZ2V0KCkpOworICAgIGFkZEZvbnRzVG9FbnZpcm9ubWVudCgpOwor
CisgICAgaWYgKHVzZUxvbmdSdW5uaW5nU2VydmVyTW9kZShhcmdjLCBhcmd2KSkgeworICAgICAg
ICBwcmludFNlcGFyYXRvcnMgPSB0cnVlOworICAgICAgICBydW5UZXN0aW5nU2VydmVyTG9vcCgp
OworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50U2VwYXJhdG9ycyA9IChvcHRpbmQgPCBhcmdj
IC0gMSB8fCAoZHVtcFBpeGVscyAmJiBkdW1wVHJlZSkpOworICAgICAgICBmb3IgKGludCBpID0g
b3B0aW5kOyBpICE9IGFyZ2M7ICsraSkKKyAgICAgICAgICAgIHJ1blRlc3QoYXJndltpXSk7Cisg
ICAgfQorCisgICAgZWNvcmVFdmFzLmNsZWFyKCk7CisKKyAgICBzaHV0ZG93bkVmbCgpOworICAg
IHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9Ub29scy9EdW1wUmVuZGVyVHJl
ZS9lZmwvRHVtcFJlbmRlclRyZWVFZmwuaCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1w
UmVuZGVyVHJlZUVmbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjY0ZDkwOTZiMzYzYTQ4MDQ2ZmViMWU3OGZhOTBm
MDNiYzQzN2JhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwv
RHVtcFJlbmRlclRyZWVFZmwuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEg
U2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZCBpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRHVtcFJlbmRlclRyZWVF
ZmxfaAorI2RlZmluZSBEdW1wUmVuZGVyVHJlZUVmbF9oCisKKyNpbmNsdWRlIDxFY29yZS5oPgor
I2luY2x1ZGUgPEV2YXMuaD4KKworZXh0ZXJuIEV2YXNfT2JqZWN0KiBtYWluRnJhbWU7CitleHRl
cm4gRXZhc19PYmplY3QqIGJyb3dzZXI7CitleHRlcm4gRXZhc19PYmplY3QqIHRvcExvYWRpbmdG
cmFtZTsKK2V4dGVybiBib29sIHdhaXRGb3JQb2xpY3k7CitleHRlcm4gRWNvcmVfVGltZXIqIHdh
aXRUb0R1bXBXYXRjaGRvZzsKKworI2VuZGlmIC8qIER1bXBSZW5kZXJUcmVlRWZsX2ggKi8KZGlm
ZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9Gb250TWFuYWdlbWVudC5jcHAgYi9U
b29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjg5
YTkzMjhmZjE1Y2U0OGJjOTQ3YzhiMzA1ZjVkMmEyNDFiOWI0MGQKLS0tIC9kZXYvbnVsbAorKysg
Yi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuY3BwCkBAIC0wLDAgKzEs
MTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0
ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04K
KyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvbnRNYW5hZ2VtZW50LmgiCisKKyNp
bmNsdWRlIDxFY29yZV9GaWxlLmg+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGZvbnRj
b25maWcvZm9udGNvbmZpZy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK3N0
YXRpYyBWZWN0b3I8U3RyaW5nPiBnZXRGb250RGlyZWN0b3JpZXMoKQoreworICAgIFZlY3RvcjxT
dHJpbmc+IGZvbnREaXJQYXRoczsKKworICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIv
dXNyL3NoYXJlL2ZvbnRzL1RURi8iKSk7CisgICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJpbmco
Ii91c3Ivc2hhcmUvZm9udHMvdHJ1ZXR5cGUvdHRmLWxpYmVyYXRpb24vIikpOworICAgIGZvbnRE
aXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL2xpYmVyYXRpb24vIikpOwor
ICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL3RydWV0eXBl
L3R0Zi1kZWphdnUvIikpOworICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3No
YXJlL2ZvbnRzL2RlamF2dS8iKSk7CisgICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJpbmcoIi91
c3Ivc2hhcmUvZm9udHMvT1RGLyIpKTsgLy8gTWF0aE1MCisgICAgZm9udERpclBhdGhzLmFwcGVu
ZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvb3BlbnR5cGUvc3RpeC8iKSk7IC8vIE1hdGhNTAor
ICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL3N0aXgvIikp
OyAvLyBNYXRoTUwKKworICAgIHJldHVybiBmb250RGlyUGF0aHM7Cit9CisKK3N0YXRpYyBWZWN0
b3I8U3RyaW5nPiBnZXRGb250RmlsZXMoKQoreworICAgIFZlY3RvcjxTdHJpbmc+IGZvbnRGaWxl
UGF0aHM7CisKKyAgICAvLyBBaGVtIGlzIHVzZWQgYnkgbWFueSBsYXlvdXQgdGVzdHMuCisgICAg
Zm9udEZpbGVQYXRocy5hcHBlbmQoU3RyaW5nKEZPTlRTX0NPTkZfRElSICIvQUhFTV9fX18uVFRG
IikpOworICAgIC8vIEEgZm9udCB3aXRoIG5vIHZhbGlkIEZvbnRjb25maWcgZW5jb2RpbmcgdG8g
dGVzdCBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDc0NTIKKyAgICBm
b250RmlsZVBhdGhzLmFwcGVuZChTdHJpbmcoRk9OVFNfQ09ORl9ESVIgIi9Gb250V2l0aE5vVmFs
aWRFbmNvZGluZy5mb24iKSk7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8PSA5OyBpKyspIHsK
KyAgICAgICAgY2hhciBmb250UGF0aFtQQVRIX01BWF07CisgICAgICAgIHNucHJpbnRmKGZvbnRQ
YXRoLCBQQVRIX01BWCAtIDEsCisgICAgICAgICAgICAgICAgIEZPTlRTX0NPTkZfRElSICIvLi4v
Li4vZm9udHMvV2ViS2l0V2VpZ2h0V2F0Y2hlciVpMDAudHRmIiwgaSk7CisKKyAgICAgICAgZm9u
dEZpbGVQYXRocy5hcHBlbmQoU3RyaW5nKGZvbnRQYXRoKSk7CisgICAgfQorCisgICAgcmV0dXJu
IGZvbnRGaWxlUGF0aHM7Cit9CisKK3N0YXRpYyBzaXplX3QgYWRkRm9udERpcmVjdG9yaWVzKGNv
bnN0IFZlY3RvcjxTdHJpbmc+JiBmb250RGlyZWN0b3JpZXMsIEZjQ29uZmlnKiBjb25maWcpCit7
CisgICAgc2l6ZV90IGFkZGVkRGlyZWN0b3JpZXM7CisKKyAgICBmb3IgKFZlY3RvcjxTdHJpbmc+
Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZvbnREaXJlY3Rvcmllcy5iZWdpbigpOworICAgICAgICAg
aXQgIT0gZm9udERpcmVjdG9yaWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IENTdHJp
bmcgY3VycmVudERpcmVjdG9yeSA9ICgqaXQpLnV0ZjgoKTsKKyAgICAgICAgY29uc3QgY2hhciog
cGF0aCA9IGN1cnJlbnREaXJlY3RvcnkuZGF0YSgpOworCisgICAgICAgIGlmIChlY29yZV9maWxl
X2lzX2RpcihwYXRoKSkgeworICAgICAgICAgICAgaWYgKCFGY0NvbmZpZ0FwcEZvbnRBZGREaXIo
Y29uZmlnLCByZWludGVycHJldF9jYXN0PGNvbnN0IEZjQ2hhcjgqPihwYXRoKSkpIHsKKyAgICAg
ICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBsb2FkIGZvbnQgYXQgJXMhXG4i
LCBwYXRoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgKythZGRlZERpcmVjdG9yaWVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIGFkZGVkRGlyZWN0b3JpZXM7Cit9CisKK3N0YXRpYyB2b2lkIGFkZEZvbnRGaWxlcyhjb25z
dCBWZWN0b3I8U3RyaW5nPiYgZm9udEZpbGVzLCBGY0NvbmZpZyogY29uZmlnKQoreworICAgIGZv
ciAoVmVjdG9yPFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZm9udEZpbGVzLmJlZ2luKCk7
IGl0ICE9IGZvbnRGaWxlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBjb25zdCBDU3RyaW5nIGN1
cnJlbnRGaWxlID0gKCppdCkudXRmOCgpOworICAgICAgICBjb25zdCBjaGFyKiBwYXRoID0gY3Vy
cmVudEZpbGUuZGF0YSgpOworCisgICAgICAgIGlmICghRmNDb25maWdBcHBGb250QWRkRmlsZShj
b25maWcsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmNDaGFyOCo+KHBhdGgpKSkKKyAgICAgICAg
ICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGxvYWQgZm9udCBhdCAlcyFcbiIsIHBhdGgp
OworICAgIH0KK30KKwordm9pZCBhZGRGb250c1RvRW52aXJvbm1lbnQoKQoreworICAgIEZjSW5p
dCgpOworCisgICAgLy8gTG9hZCBvdXIgY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaCBzZXRzIHVw
IHByb3BlciBhbGlhc2VzIGZvciBmYW1pbHkKKyAgICAvLyBuYW1lcyBsaWtlIHNhbnMsIHNlcmlm
IGFuZCBtb25vc3BhY2UuCisgICAgRmNDb25maWcqIGNvbmZpZyA9IEZjQ29uZmlnQ3JlYXRlKCk7
CisgICAgY29uc3QgY2hhciogZm9udENvbmZpZ0ZpbGVuYW1lID0gRk9OVFNfQ09ORl9ESVIgIi9m
b250cy5jb25mIjsKKyAgICBpZiAoIUZjQ29uZmlnUGFyc2VBbmRMb2FkKGNvbmZpZywgcmVpbnRl
cnByZXRfY2FzdDxjb25zdCBGY0NoYXI4Kj4oZm9udENvbmZpZ0ZpbGVuYW1lKSwgdHJ1ZSkpIHsK
KyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBsb2FkIGZvbnQgY29uZmlndXJhdGlv
biBmaWxlIGZyb206ICVzXG4iLCBmb250Q29uZmlnRmlsZW5hbWUpOworICAgICAgICBleGl0KDEp
OworICAgIH0KKworICAgIGlmICghYWRkRm9udERpcmVjdG9yaWVzKGdldEZvbnREaXJlY3Rvcmll
cygpLCBjb25maWcpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm9uZSBvZiB0aGUgZm9u
dCBkaXJlY3RvcmllcyBjb3VsZCBiZSBhZGRlZC4gRWl0aGVyIGluc3RhbGwgdGhlbSAiCisgICAg
ICAgICAgICAgICAgICAgICAgICAib3IgZmlsZSBhIGJ1ZyBhdCBodHRwOi8vYnVncy53ZWJraXQu
b3JnIGlmIHRoZXkgYXJlIGluc3RhbGxlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAi
YW5vdGhlciBsb2NhdGlvbi5cbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGFk
ZEZvbnRGaWxlcyhnZXRGb250RmlsZXMoKSwgY29uZmlnKTsKKworICAgIGlmICghRmNDb25maWdT
ZXRDdXJyZW50KGNvbmZpZykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qg
c2V0IHRoZSBjdXJyZW50IGZvbnQgY29uZmlndXJhdGlvbiFcbiIpOworICAgICAgICBleGl0KDEp
OworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0ZvbnRN
YW5hZ2VtZW50LmggYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi5kNDk3NTEzYWVkYzEzOTlmNDZmYzBiOTFkZDRmNDI4NTU3ZDc0MWEzCi0tLSAv
ZGV2L251bGwKKysrIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0ZvbnRNYW5hZ2VtZW50LmgK
QEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1i
ZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MK
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAq
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgRm9udE1hbmFnZW1lbnRfaAorI2RlZmluZSBGb250TWFuYWdl
bWVudF9oCisKK3ZvaWQgYWRkRm9udHNUb0Vudmlyb25tZW50KCk7CisKKyNlbmRpZiAvLyBGb250
TWFuYWdlbWVudF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98727</attachid>
            <date>2011-06-27 08:00:19 -0700</date>
            <delta_ts>2011-07-06 06:46:51 -0700</delta_ts>
            <desc>Replace WTF::String with String, improve the ChangeLog</desc>
            <filename>bug-62034-20110627120342.patch</filename>
            <type>text/plain</type>
            <size>37411</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODk4MTUKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA2NTYxZGJhYmUyNjM0OThkY2EzZGQ0OThlZTBhODA0YzZi
YzRiNGQwLi4yNzYwMDQ2M2RiZGFkNjlmZTUyODA2YzE3ODZmNTEwYzM2MjFkNDQ4IDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjUg
QEAKKzIwMTEtMDYtMjcgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9uLm1vYmk+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0VGTF0g
RFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwIGFuZCBEdW1wUmVuZGVyVHJlZUVmbC5oIGFsb25n
IHdpdGgKKyAgICAgICAgc3VwcG9ydCBmaWxlcy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTYyMDM0CisKKyAgICAgICAgQnVpbGQgc3lzdGVtIGNoYW5n
ZXMgd2lsbCBiZSB1cHN0cmVhbWVkIGFzIHNvb24gYXMgb3RoZXIgRFJULXJlbGF0ZWQKKyAgICAg
ICAgZmlsZXMgYXJlIGFsc28gb24gdGhlIHRyZWUuCisKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJl
ZS9lZmwvRHVtcEhpc3RvcnlJdGVtLmNwcDogQWRkZWQuCisgICAgICAgIChjb21wYXJlSGlzdG9y
eUl0ZW1zKToKKyAgICAgICAgKGR1bXBIaXN0b3J5SXRlbSk6CisgICAgICAgIChkdW1wQmFja0Zv
cndhcmRMaXN0Rm9yV2ViVmlldyk6CisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBI
aXN0b3J5SXRlbS5oOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJl
bmRlclRyZWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKGR1bXBGcmFtZXNBc1RleHQpOgorICAgICAg
ICAoZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24pOgorICAgICAgICAoc2hvdWxkTG9nRnJhbWVMb2Fk
RGVsZWdhdGVzKToKKyAgICAgICAgKHNob3VsZER1bXBBc1RleHQpOgorICAgICAgICAoc2VuZFBp
eGVsUmVzdWx0c0VPRik6CisgICAgICAgIChpbnZhbGlkYXRlQW55UHJldmlvdXNXYWl0VG9EdW1w
V2F0Y2hkb2cpOgorICAgICAgICAocHJvY2Vzc1dvcmspOgorICAgICAgICAoYWRkQ29udHJvbGxl
clRvV2luZG93KToKKyAgICAgICAgKG9uV2luZG93T2JqZWN0Q2xlYXJlZCk6CisgICAgICAgIChv
blN0YXR1c2JhclRleHRTZXQpOgorICAgICAgICAob25Mb2FkU3RhcnRlZCk6CisgICAgICAgIChv
bkxvYWRGaW5pc2hlZCk6CisgICAgICAgIChvblRpdGxlQ2hhbmdlZCk6CisgICAgICAgIChvbkRv
Y3VtZW50TG9hZEZpbmlzaGVkKToKKyAgICAgICAgKG9uRWNvcmVFdmFzUmVzaXplKToKKyAgICAg
ICAgKG9uQ2xvc2VXaW5kb3cpOgorICAgICAgICAodXNlTG9uZ1J1bm5pbmdTZXJ2ZXJNb2RlKToK
KyAgICAgICAgKHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKToKKyAgICAgICAgKHJlc2V0RGVmYXVs
dHNUb0NvbnNpc3RlbnRWYWx1ZXMpOgorICAgICAgICAoZ2V0RmluYWxUZXN0VVJMKToKKyAgICAg
ICAgKGdldEV4cGVjdGVkUGl4ZWxIYXNoKToKKyAgICAgICAgKGNyZWF0ZUxheW91dFRlc3RDb250
cm9sbGVyKToKKyAgICAgICAgKHJ1blRlc3QpOgorICAgICAgICAocnVuVGVzdGluZ1NlcnZlckxv
b3ApOgorICAgICAgICAoYWRqdXN0T3V0cHV0VHlwZUJ5TWltZVR5cGUpOgorICAgICAgICAoZHVt
cEZyYW1lQ29udGVudHNBc1RleHQpOgorICAgICAgICAoc2hvdWxkRHVtcEZyYW1lU2Nyb2xsUG9z
aXRpb24pOgorICAgICAgICAoc2hvdWxkRHVtcFBpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQp
OgorICAgICAgICAoc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlzdCk6CisgICAgICAgIChpbml0RWZs
KToKKyAgICAgICAgKHNodXRkb3duRWZsKToKKyAgICAgICAgKGRpc3BsYXlXZWJWaWV3KToKKyAg
ICAgICAgKGR1bXApOgorICAgICAgICAoY3JlYXRlQnJvd3Nlcik6CisgICAgICAgIChpbml0RWNv
cmVFdmFzKToKKyAgICAgICAgKG1haW4pOgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2VmbC9E
dW1wUmVuZGVyVHJlZUVmbC5oOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwv
Rm9udE1hbmFnZW1lbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKGdldEZvbnREaXJlY3Rvcmllcyk6
CisgICAgICAgIChnZXRGb250RmlsZXMpOgorICAgICAgICAoYWRkRm9udERpcmVjdG9yaWVzKToK
KyAgICAgICAgKGFkZEZvbnRGaWxlcyk6CisgICAgICAgIChhZGRGb250c1RvRW52aXJvbm1lbnQp
OgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2VmbC9Gb250TWFuYWdlbWVudC5oOiBBZGRlZC4K
KwogMjAxMS0wNi0yNyAgRXJpYyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgQWRhbSBCYXJ0aC4KZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVl
L2VmbC9EdW1wSGlzdG9yeUl0ZW0uY3BwIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBI
aXN0b3J5SXRlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTZjYTg1YTY2YzRjNTZkZjYxYWZjNDQzMWZjODkw
NGZkMjVlNTZhMwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9E
dW1wSGlzdG9yeUl0ZW0uY3BwCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEg
U2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkR1bXBIaXN0b3J5SXRlbS5oIgorCisjaW5jbHVkZSAiZXdrX3ByaXZhdGUuaCIKKyNp
bmNsdWRlIDxFV2ViS2l0Lmg+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPHd0Zi9Pd25G
YXN0TWFsbG9jUHRyLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCitFd2tfSGlzdG9yeV9J
dGVtKiBwcmV2VGVzdEJGSXRlbSA9IDA7Citjb25zdCB1bnNpZ25lZCBoaXN0b3J5SXRlbUluZGVu
dCA9IDg7CisKK3N0YXRpYyBpbnQgY29tcGFyZUhpc3RvcnlJdGVtcyhjb25zdCB2b2lkKiBpdGVt
MSwgY29uc3Qgdm9pZCogaXRlbTIpCit7CisgICAgT3duRmFzdE1hbGxvY1B0cjxjaGFyPiB0YXJn
ZXQxKGV3a19oaXN0b3J5X2l0ZW1fdGFyZ2V0X2dldChzdGF0aWNfY2FzdDxjb25zdCBFd2tfSGlz
dG9yeV9JdGVtKj4oaXRlbTEpKSk7CisgICAgT3duRmFzdE1hbGxvY1B0cjxjaGFyPiB0YXJnZXQy
KGV3a19oaXN0b3J5X2l0ZW1fdGFyZ2V0X2dldChzdGF0aWNfY2FzdDxjb25zdCBFd2tfSGlzdG9y
eV9JdGVtKj4oaXRlbTIpKSk7CisgICAgcmV0dXJuIHN0cmNhc2VjbXAodGFyZ2V0MS5nZXQoKSwg
dGFyZ2V0Mi5nZXQoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBIaXN0b3J5SXRlbShjb25zdCBF
d2tfSGlzdG9yeV9JdGVtKiBpdGVtLCBpbnQgaW5kZW50LCBib29sIGN1cnJlbnQpCit7CisgICAg
QVNTRVJUKGl0ZW0pOworICAgIGludCBzdGFydCA9IDA7CisgICAgaWYgKGN1cnJlbnQpIHsKKyAg
ICAgICAgcHJpbnRmKCJjdXJyLT4iKTsKKyAgICAgICAgc3RhcnQgPSA2OworICAgIH0KKyAgICBm
b3IgKGludCBpID0gc3RhcnQ7IGkgPCBpbmRlbnQ7IGkrKykKKyAgICAgICAgcHV0Y2hhcignICcp
OworCisgICAgLy8gbm9ybWFsaXplIGZpbGUgVVJMcy4KKyAgICBjb25zdCBjaGFyKiB1cmkgPSBl
d2tfaGlzdG9yeV9pdGVtX3VyaV9nZXQoaXRlbSk7CisgICAgaWYgKCFzdHJuY2FzZWNtcCh1cmks
ICJmaWxlOi8vIiwgc2l6ZW9mKCJmaWxlOi8vIikgLSAxKSkgeworICAgICAgICBjb25zdCBjaGFy
KiBwb3MgPSBzdHJzdHIodXJpLCAiL0xheW91dFRlc3RzLyIpOworICAgICAgICBpZiAoIXBvcykK
KyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBwcmludGYoIihmaWxlIHRlc3QpOiVzIiwg
cG9zICsgc2l6ZW9mKCIvTGF5b3V0VGVzdHMvIikgLSAxKTsKKyAgICB9IGVsc2UKKyAgICAgICAg
cHJpbnRmKCIlcyIsIHVyaSk7CisKKyAgICBPd25GYXN0TWFsbG9jUHRyPGNoYXI+IHRhcmdldChl
d2tfaGlzdG9yeV9pdGVtX3RhcmdldF9nZXQoaXRlbSkpOworICAgIGlmICh0YXJnZXQuZ2V0KCkg
JiYgKih0YXJnZXQuZ2V0KCkpKQorICAgICAgICBwcmludGYoIiAoaW4gZnJhbWUgXCIlc1wiKSIs
IHRhcmdldC5nZXQoKSk7CisgICAgaWYgKGV3a19oaXN0b3J5X2l0ZW1fdGFyZ2V0X2lzKGl0ZW0p
KQorICAgICAgICBwcmludGYoIiAgKipuYXYgdGFyZ2V0KioiKTsKKyAgICBwdXRjaGFyKCdcbicp
OworICAgIEVpbmFfTGlzdCogY2hpbGRyZW4gPSBld2tfaGlzdG9yeV9pdGVtX2NoaWxkcmVuX2dl
dChpdGVtKTsKKyAgICBpZiAoY2hpbGRyZW4pIHsKKyAgICAgICAgLy8gbXVzdCBzb3J0IHRvIGVs
aW1pbmF0ZSBhcmJpdHJhcnkgcmVzdWx0IG9yZGVyaW5nIHdoaWNoIGRlZmVhdHMgcmVwcm9kdWNp
YmxlIHRlc3RpbmcKKyAgICAgICAgY2hpbGRyZW4gPSBlaW5hX2xpc3Rfc29ydChjaGlsZHJlbiwg
MCwgc3RhdGljX2Nhc3Q8RWluYV9Db21wYXJlX0NiPihjb21wYXJlSGlzdG9yeUl0ZW1zKSk7Cisg
ICAgICAgIHZvaWQqIGNoaWxkSXRlbTsKKyAgICAgICAgRUlOQV9MSVNUX0ZSRUUoY2hpbGRyZW4s
IGNoaWxkSXRlbSkKKyAgICAgICAgICAgIGR1bXBIaXN0b3J5SXRlbShzdGF0aWNfY2FzdDxFd2tf
SGlzdG9yeV9JdGVtKj4oY2hpbGRJdGVtKSwgaW5kZW50ICsgNCwgZmFsc2UpOworICAgIH0KK30K
Kwordm9pZCBkdW1wQmFja0ZvcndhcmRMaXN0Rm9yV2ViVmlldyhFdmFzX09iamVjdCogdmlldykK
K3sKKyAgICBwcmludGYoIlxuPT09PT09PT09PT09PT0gQmFjayBGb3J3YXJkIExpc3QgPT09PT09
PT09PT09PT1cbiIpOworCisgICAgY29uc3QgRXdrX0hpc3RvcnkqIGhpc3RvcnkgPSBld2tfdmll
d19oaXN0b3J5X2dldCh2aWV3KTsKKworICAgIC8vIFByaW50IG91dCBhbGwgaXRlbXMgaW4gdGhl
IGxpc3QgYWZ0ZXIgcHJldlRlc3RCRkl0ZW0sIHdoaWNoIHdhcyBmcm9tIHRoZSBwcmV2aW91cyB0
ZXN0CisgICAgLy8gR2F0aGVyIGl0ZW1zIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlIHBy
aW50IHRoZW0gb3V0IGZyb20gb2xkZXN0IHRvIG5ld2VzdAorICAgIEVpbmFfTGlzdCogaXRlbXNU
b1ByaW50ID0gMDsKKyAgICB2b2lkKiBoaXN0b3J5SXRlbTsKKyAgICBFaW5hX0xpc3QqIGJhY2t3
YXJkTGlzdCA9IGV3a19oaXN0b3J5X2JhY2tfbGlzdF9nZXQoaGlzdG9yeSk7CisgICAgRUlOQV9M
SVNUX0ZSRUUoYmFja3dhcmRMaXN0LCBoaXN0b3J5SXRlbSkgeworICAgICAgICBpZiAoaGlzdG9y
eUl0ZW0gPT0gcHJldlRlc3RCRkl0ZW0pIHsKKyAgICAgICAgICAgIGVpbmFfbGlzdF9mcmVlKGJh
Y2t3YXJkTGlzdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpdGVt
c1RvUHJpbnQgPSBlaW5hX2xpc3RfYXBwZW5kKGl0ZW1zVG9QcmludCwgaGlzdG9yeUl0ZW0pOwor
ICAgIH0KKworICAgIGNvbnN0IEV3a19IaXN0b3J5X0l0ZW0qIGN1cnJlbnRJdGVtID0gZXdrX2hp
c3RvcnlfaGlzdG9yeV9pdGVtX2N1cnJlbnRfZ2V0KGhpc3RvcnkpOworICAgIGlmIChjdXJyZW50
SXRlbSkKKyAgICAgICAgaXRlbXNUb1ByaW50ID0gZWluYV9saXN0X2FwcGVuZChpdGVtc1RvUHJp
bnQsIGN1cnJlbnRJdGVtKTsKKworICAgIEVpbmFfTGlzdCogZm9yd2FyZExpc3QgPSBld2tfaGlz
dG9yeV9mb3J3YXJkX2xpc3RfZ2V0KGhpc3RvcnkpOworICAgIEVJTkFfTElTVF9GUkVFKGZvcndh
cmRMaXN0LCBoaXN0b3J5SXRlbSkgeworICAgICAgICBBU1NFUlQoaGlzdG9yeUl0ZW0gIT0gcHJl
dlRlc3RCRkl0ZW0pOworICAgICAgICBpdGVtc1RvUHJpbnQgPSBlaW5hX2xpc3RfYXBwZW5kKGl0
ZW1zVG9QcmludCwgaGlzdG9yeUl0ZW0pOworICAgIH0KKworICAgIEVJTkFfTElTVF9GUkVFKGl0
ZW1zVG9QcmludCwgaGlzdG9yeUl0ZW0pIHsKKyAgICAgICAgZHVtcEhpc3RvcnlJdGVtKHN0YXRp
Y19jYXN0PEV3a19IaXN0b3J5X0l0ZW0qPihoaXN0b3J5SXRlbSksIGhpc3RvcnlJdGVtSW5kZW50
LCBoaXN0b3J5SXRlbSA9PSBjdXJyZW50SXRlbSk7CisgICAgICAgIGV3a19oaXN0b3J5X2l0ZW1f
ZnJlZShzdGF0aWNfY2FzdDxFd2tfSGlzdG9yeV9JdGVtKj4oaGlzdG9yeUl0ZW0pKTsKKyAgICB9
CisKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09XG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1
bXBIaXN0b3J5SXRlbS5oIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBIaXN0b3J5SXRl
bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjI5ODI4N2UyMzFmZDJiYTY1YWFlNDk4N2NkNjRhMDZmN2NiNDdlYWEK
LS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcEhpc3RvcnlJ
dGVtLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJ
T04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ry
b25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRHVtcEhpc3RvcnlJdGVtX2gKKyNkZWZpbmUgRHVt
cEhpc3RvcnlJdGVtX2gKKworI2luY2x1ZGUgPEV2YXMuaD4KKwordm9pZCBkdW1wQmFja0Zvcndh
cmRMaXN0Rm9yV2ViVmlldyhFdmFzX09iamVjdCogdmlldyk7CisKKyNlbmRpZiAvLyBEdW1wSGlz
dG9yeUl0ZW1faApkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5k
ZXJUcmVlLmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uNzQ0MzVmYjEwMDBhN2VkZWVkMjkyZDFiOTE3ODhkYmM1ZWFlOTRiYwotLS0g
L2Rldi9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5j
cHAKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9O
IEVtYmVkZGVkIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9u
aWNzCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
CisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRHVtcFJlbmRl
clRyZWUuaCIKKworI2luY2x1ZGUgIkR1bXBIaXN0b3J5SXRlbS5oIgorI2luY2x1ZGUgIkR1bXBS
ZW5kZXJUcmVlVmlldy5oIgorI2luY2x1ZGUgIkV2ZW50U2VuZGVyLmgiCisjaW5jbHVkZSAiRm9u
dE1hbmFnZW1lbnQuaCIKKyNpbmNsdWRlICJHQ0NvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJMYXlv
dXRUZXN0Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVk
ZSAiUGl4ZWxEdW1wU3VwcG9ydC5oIgorI2luY2x1ZGUgIldvcmtRdWV1ZS5oIgorI2luY2x1ZGUg
ImV3a19wcml2YXRlLmgiIC8vIEZJWE1FOiBjcmVhdGUgc29tZSBXZWJDb3JlU3VwcG9ydC9EdW1w
UmVuZGVyVHJlZS5jcHAgaW5zdGVhZAorI2luY2x1ZGUgPEVXZWJLaXQuaD4KKyNpbmNsdWRlIDxF
Y29yZS5oPgorI2luY2x1ZGUgPEVjb3JlX0V2YXMuaD4KKyNpbmNsdWRlIDxFY29yZV9GaWxlLmg+
CisjaW5jbHVkZSA8RWRqZS5oPgorI2luY2x1ZGUgPEV2YXMuaD4KKyNpbmNsdWRlIDxmb250Y29u
ZmlnL2ZvbnRjb25maWcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdGRsaWIu
aD4KKyNpbmNsdWRlIDx0ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNs
dWRlIDx3dGYvT3duRmFzdE1hbGxvY1B0ci5oPgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKwor
RXZhc19PYmplY3QqIGJyb3dzZXIgPSAwOworRXZhc19PYmplY3QqIG1haW5GcmFtZSA9IDA7CitF
dmFzX09iamVjdCogdG9wTG9hZGluZ0ZyYW1lID0gMDsKK2Jvb2wgd2FpdEZvclBvbGljeSA9IGZh
bHNlOworRWNvcmVfVGltZXIqIHdhaXRUb0R1bXBXYXRjaGRvZyA9IDA7CitleHRlcm4gRXdrX0hp
c3RvcnlfSXRlbSogcHJldlRlc3RCRkl0ZW07CisKKy8vIEZyb20gdGhlIHRvcC1sZXZlbCBEdW1w
UmVuZGVyVHJlZS5oCitSZWZQdHI8TGF5b3V0VGVzdENvbnRyb2xsZXI+IGdMYXlvdXRUZXN0Q29u
dHJvbGxlcjsKK3ZvbGF0aWxlIGJvb2wgZG9uZSA9IGZhbHNlOworCitzdGF0aWMgaW50IGR1bXBQ
aXhlbHMgPSBmYWxzZTsKK3N0YXRpYyBpbnQgZHVtcFRyZWUgPSB0cnVlOworc3RhdGljIGludCBw
cmludFNlcGFyYXRvcnMgPSB0cnVlOworc3RhdGljIGludCB1c2VYMTFXaW5kb3cgPSBmYWxzZTsK
Kworc3RhdGljIFN0cmluZyBkdW1wRnJhbWVzQXNUZXh0KEV2YXNfT2JqZWN0KiBmcmFtZSkKK3sK
KyAgICBTdHJpbmcgcmVzdWx0OworCisgICAgaWYgKGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KGJy
b3dzZXIpICE9IGZyYW1lKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuLS0tLS0tLS1cbkZy
YW1lOiAnIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nOjpmcm9tVVRGOChld2tfZnJh
bWVfbmFtZV9nZXQoZnJhbWUpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIidcbi0tLS0tLS0t
XG4iKTsKKyAgICB9CisKKyAgICByZXN1bHQuYXBwZW5kKGV3a19mcmFtZV9pbm5lcl90ZXh0X2dl
dChmcmFtZSkpOworICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisKKyAgICBpZiAoZ0xheW91dFRl
c3RDb250cm9sbGVyLT5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSkgeworICAgICAgICBFaW5hX0l0
ZXJhdG9yKiBjaGlsZHJlbiA9IGV3a19mcmFtZV9jaGlsZHJlbl9pdGVyYXRvcl9uZXcoZnJhbWUp
OworICAgICAgICBFdmFzX09iamVjdCogY2hpbGQ7CisKKyAgICAgICAgRUlOQV9JVEVSQVRPUl9G
T1JFQUNIKGNoaWxkcmVuLCBjaGlsZCkgeworICAgICAgICAgICAgU3RyaW5nIHRlbXBUZXh0KGR1
bXBGcmFtZXNBc1RleHQoY2hpbGQpKTsKKworICAgICAgICAgICAgaWYgKHRlbXBUZXh0LmlzRW1w
dHkoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgcmVzdWx0LmFw
cGVuZCh0ZW1wVGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBlaW5hX2l0ZXJhdG9yX2ZyZWUo
Y2hpbGRyZW4pOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lk
IGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKEV2YXNfT2JqZWN0KikKK3sKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGRMb2dGcmFtZUxvYWREZWxlZ2F0ZXMoY29u
c3QgU3RyaW5nJiBwYXRoT3JVUkwpCit7CisgICAgcmV0dXJuIHBhdGhPclVSTC5jb250YWlucygi
bG9hZGluZy8iKTsKK30KKworc3RhdGljIGJvb2wgc2hvdWxkRHVtcEFzVGV4dChjb25zdCBTdHJp
bmcmIHBhdGhPclVSTCkKK3sKKyAgICByZXR1cm4gcGF0aE9yVVJMLmNvbnRhaW5zKCJkdW1wQXNU
ZXh0LyIpOworfQorCitzdGF0aWMgdm9pZCBzZW5kUGl4ZWxSZXN1bHRzRU9GKCkKK3sKKyAgICBw
dXRzKCIjRU9GIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZmZsdXNoKHN0ZGVycik7Cit9
CisKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1bXBXYXRjaGRvZygp
Cit7CisgICAgaWYgKHdhaXRUb0R1bXBXYXRjaGRvZykgeworICAgICAgICBlY29yZV90aW1lcl9k
ZWwod2FpdFRvRHVtcFdhdGNoZG9nKTsKKyAgICAgICAgd2FpdFRvRHVtcFdhdGNoZG9nID0gMDsK
KyAgICB9CisgICAgd2FpdEZvclBvbGljeSA9IGZhbHNlOworfQorCitzdGF0aWMgRWluYV9Cb29s
IHByb2Nlc3NXb3JrKHZvaWQqIGRhdGEpCit7CisgICAgaWYgKFdvcmtRdWV1ZTo6c2hhcmVkKCkt
PnByb2Nlc3NXb3JrKCkgJiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+d2FpdFRvRHVtcCgpKQor
ICAgICAgICBkdW1wKCk7CisgICAgcmV0dXJuIEVDT1JFX0NBTExCQUNLX0NBTkNFTDsKK30KKwor
c3RhdGljIHZvaWQgYWRkQ29udHJvbGxlclRvV2luZG93KEpTQ29udGV4dFJlZiBjb250ZXh0LCBK
U09iamVjdFJlZiB3aW5kb3dPYmplY3QsIGNvbnN0IGNoYXIqIGNvbnRyb2xsZXJOYW1lLCBKU1Zh
bHVlUmVmIGNvbnRyb2xsZXIpCit7CisgICAgSlNTdHJpbmdSZWYgY29udHJvbGxlck5hbWVTdHIg
PSBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyhjb250cm9sbGVyTmFtZSk7CisgICAgSlNP
YmplY3RTZXRQcm9wZXJ0eShjb250ZXh0LCB3aW5kb3dPYmplY3QsIGNvbnRyb2xsZXJOYW1lU3Ry
LCBjb250cm9sbGVyLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlB
dHRyaWJ1dGVEb250RGVsZXRlLCAwKTsKKyAgICBKU1N0cmluZ1JlbGVhc2UoY29udHJvbGxlck5h
bWVTdHIpOworfQorCitzdGF0aWMgdm9pZCBvbldpbmRvd09iamVjdENsZWFyZWQodm9pZCogdXNl
ckRhdGEsIEV2YXNfT2JqZWN0Kiwgdm9pZCogZXZlbnRJbmZvKQoreworICAgIEV3a19XaW5kb3df
T2JqZWN0X0NsZWFyZWRfRXZlbnQqIG9iamVjdENsZWFyZWRJbmZvID0gc3RhdGljX2Nhc3Q8RXdr
X1dpbmRvd19PYmplY3RfQ2xlYXJlZF9FdmVudCo+KGV2ZW50SW5mbyk7CisgICAgSlNWYWx1ZVJl
ZiBleGNlcHRpb24gPSAwOworICAgIEFTU0VSVChnTGF5b3V0VGVzdENvbnRyb2xsZXIpOworCisg
ICAgR0NDb250cm9sbGVyKiBnY0NvbnRyb2xsZXIgPSBzdGF0aWNfY2FzdDxHQ0NvbnRyb2xsZXIq
Pih1c2VyRGF0YSk7CisgICAgQVNTRVJUKGdjQ29udHJvbGxlcik7CisKKyAgICBnTGF5b3V0VGVz
dENvbnRyb2xsZXItPm1ha2VXaW5kb3dPYmplY3Qob2JqZWN0Q2xlYXJlZEluZm8tPmNvbnRleHQs
IG9iamVjdENsZWFyZWRJbmZvLT53aW5kb3dPYmplY3QsICZleGNlcHRpb24pOworICAgIEFTU0VS
VCghZXhjZXB0aW9uKTsKKworICAgIGdjQ29udHJvbGxlci0+bWFrZVdpbmRvd09iamVjdChvYmpl
Y3RDbGVhcmVkSW5mby0+Y29udGV4dCwgb2JqZWN0Q2xlYXJlZEluZm8tPndpbmRvd09iamVjdCwg
JmV4Y2VwdGlvbik7CisgICAgQVNTRVJUKCFleGNlcHRpb24pOworCisgICAgLyogRklYTUUgcy9m
YWxzZS8hZ2V0X3BhcmVudC8gKi8KKyAgICBhZGRDb250cm9sbGVyVG9XaW5kb3cob2JqZWN0Q2xl
YXJlZEluZm8tPmNvbnRleHQsIG9iamVjdENsZWFyZWRJbmZvLT53aW5kb3dPYmplY3QsICJldmVu
dFNlbmRlciIsIG1ha2VFdmVudFNlbmRlcihvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgZmFs
c2UpKTsKK30KKworc3RhdGljIHZvaWQgb25TdGF0dXNiYXJUZXh0U2V0KHZvaWQqLCBFdmFzX09i
amVjdCosIHZvaWQqIGV2ZW50SW5mbykKK3sKKyAgICBpZiAoIWdMYXlvdXRUZXN0Q29udHJvbGxl
ci0+ZHVtcFN0YXR1c0NhbGxiYWNrcygpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBj
aGFyKiBzdGF0dXNiYXJUZXh0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGV2ZW50SW5mbyk7
CisgICAgcHJpbnRmKCJVSSBERUxFR0FURSBTVEFUVVMgQ0FMTEJBQ0s6IHNldFN0YXR1c1RleHQ6
JXNcbiIsIHN0YXR1c2JhclRleHQpOworfQorCitzdGF0aWMgdm9pZCBvbkxvYWRTdGFydGVkKHZv
aWQqLCBFdmFzX09iamVjdCogdmlldywgdm9pZCopCit7CisgICAgLy8gRklYTUU6IHdlIGFjdHVh
bGx5IG5lZWQgdGhlIGZyYW1lIHJlbGF0ZWQgdG8gdGhpcyBldmVudAorICAgIEV2YXNfT2JqZWN0
KiBmcmFtZSA9IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KHZpZXcpOworCisgICAgLy8gTWFrZSBz
dXJlIHdlIG9ubHkgc2V0IHRoaXMgb25jZSBwZXIgdGVzdC4gSWYgaXQgZ2V0cyBjbGVhcmVkLCBh
bmQgdGhlbiBzZXQgYWdhaW4sIHdlIG1pZ2h0CisgICAgLy8gZW5kIHVwIGRvaW5nIHR3byBkdW1w
cyBmb3Igb25lIHRlc3QuCisgICAgaWYgKCF0b3BMb2FkaW5nRnJhbWUgJiYgIWRvbmUpCisgICAg
ICAgIHRvcExvYWRpbmdGcmFtZSA9IGZyYW1lOworfQorCitzdGF0aWMgdm9pZCBvbkxvYWRGaW5p
c2hlZCh2b2lkKiwgRXZhc19PYmplY3QqIHZpZXcsIHZvaWQqKQoreworICAgIC8vIEZJWE1FOiB3
ZSBhY3R1YWxseSBuZWVkIHRoZSBmcmFtZSByZWxhdGVkIHRvIHRoaXMgZXZlbnQKKyAgICBFdmFz
X09iamVjdCogZnJhbWUgPSBld2tfdmlld19mcmFtZV9tYWluX2dldCh2aWV3KTsKKworICAgIGlm
ICh0b3BMb2FkaW5nRnJhbWUgIT0gZnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIHRvcExv
YWRpbmdGcmFtZSA9IDA7CisKKyAgICBXb3JrUXVldWU6OnNoYXJlZCgpLT5zZXRGcm96ZW4odHJ1
ZSk7CisgICAgaWYgKGdMYXlvdXRUZXN0Q29udHJvbGxlci0+d2FpdFRvRHVtcCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAoV29ya1F1ZXVlOjpzaGFyZWQoKS0+Y291bnQoKSkKKyAgICAg
ICAgZWNvcmVfaWRsZXJfYWRkKHByb2Nlc3NXb3JrLCAwKTsKKyAgICBlbHNlCisgICAgICAgIGR1
bXAoKTsKK30KKworc3RhdGljIHZvaWQgb25UaXRsZUNoYW5nZWQodm9pZCosIEV2YXNfT2JqZWN0
Kiwgdm9pZCopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworc3RhdGljIHZvaWQgb25E
b2N1bWVudExvYWRGaW5pc2hlZCh2b2lkKiwgRXZhc19PYmplY3QqIGZyYW1lLCB2b2lkKikKK3sK
KyAgICBjb25zdCBTdHJpbmcgZnJhbWVOYW1lKGV3a19mcmFtZV9zdWl0YWJsZV9kcnRfbmFtZV9n
ZXQoZnJhbWUpKTsKKworICAgIGlmICghZG9uZSAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1
bXBGcmFtZUxvYWRDYWxsYmFja3MoKSkKKyAgICAgICAgcHJpbnRmKCIlcyAtIGRpZEZpbmlzaERv
Y3VtZW50TG9hZEZvckZyYW1lXG4iLCBmcmFtZU5hbWUudXRmOCgpLmRhdGEoKSk7CisgICAgZWxz
ZSBpZiAoIWRvbmUpIHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgcGVuZGluZ0ZyYW1lVW5sb2Fk
RXZlbnRzID0gZXdrX2ZyYW1lX3BlbmRpbmdfdW5sb2FkX2V2ZW50X2NvdW50X2dldChmcmFtZSk7
CisgICAgICAgIGlmIChwZW5kaW5nRnJhbWVVbmxvYWRFdmVudHMpCisgICAgICAgICAgICBwcmlu
dGYoIiVzIC0gaGFzICV1IG9udW5sb2FkIGhhbmRsZXIocylcbiIsIGZyYW1lTmFtZS51dGY4KCku
ZGF0YSgpLCBwZW5kaW5nRnJhbWVVbmxvYWRFdmVudHMpOworICAgIH0KK30KKworc3RhdGljIHZv
aWQgb25FY29yZUV2YXNSZXNpemUoRWNvcmVfRXZhcyogZWNvcmVFdmFzKQoreworICAgIGludCB3
aWR0aCwgaGVpZ2h0OworCisgICAgZWNvcmVfZXZhc19nZW9tZXRyeV9nZXQoZWNvcmVFdmFzLCAw
LCAwLCAmd2lkdGgsICZoZWlnaHQpOworICAgIGV2YXNfb2JqZWN0X21vdmUoYnJvd3NlciwgMCwg
MCk7CisgICAgZXZhc19vYmplY3RfcmVzaXplKGJyb3dzZXIsIHdpZHRoLCBoZWlnaHQpOworfQor
CitzdGF0aWMgdm9pZCBvbkNsb3NlV2luZG93KEVjb3JlX0V2YXMqKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgdXNlTG9uZ1J1bm5pbmdTZXJ2ZXJNb2Rl
KGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICByZXR1cm4gKGFyZ2MgPT0gb3B0aW5kICsg
MSAmJiAhc3RyY21wKGFyZ3Zbb3B0aW5kXSwgIi0iKSk7Cit9CisKK3N0YXRpYyBib29sIHBhcnNl
Q29tbWFuZExpbmVPcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBzdGF0aWMg
Y29uc3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICAgICAgeyJub3RyZWUiLCBub19hcmd1bWVu
dCwgJmR1bXBUcmVlLCBmYWxzZX0sCisgICAgICAgIHsicGl4ZWwtdGVzdHMiLCBub19hcmd1bWVu
dCwgJmR1bXBQaXhlbHMsIHRydWV9LAorICAgICAgICB7InRyZWUiLCBub19hcmd1bWVudCwgJmR1
bXBUcmVlLCB0cnVlfSwKKyAgICAgICAgeyJndWkiLCBub19hcmd1bWVudCwgJnVzZVgxMVdpbmRv
dywgdHJ1ZX0sCisgICAgICAgIHswLCAwLCAwLCAwfQorICAgIH07CisgICAgaW50IG9wdGlvbjsK
KworICAgIHdoaWxlICgob3B0aW9uID0gZ2V0b3B0X2xvbmcoYXJnYywgKGNoYXIqIGNvbnN0Kilh
cmd2LCAiIiwgb3B0aW9ucywgMCkpICE9IC0xKSB7CisgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7
CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0
aWMgdm9pZCByZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKCkKK3sKKyAgICBld2tfc2V0
dGluZ3NfaWNvbl9kYXRhYmFzZV9jbGVhcigpOworICAgIGV3a19zZXR0aW5nc19pY29uX2RhdGFi
YXNlX3BhdGhfc2V0KDApOworCisgICAgZXdrX3ZpZXdfc2V0dGluZ19wcml2YXRlX2Jyb3dzaW5n
X3NldChicm93c2VyLCBFSU5BX0ZBTFNFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX3NwYXRpYWxf
bmF2aWdhdGlvbl9zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0dGlu
Z19lbmFibGVfZnJhbWVfZmxhdHRlbmluZ19zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7CisgICAg
ZXdrX3ZpZXdfc2V0dGluZ19vZmZsaW5lX2FwcF9jYWNoZV9zZXQoYnJvd3NlciwgRUlOQV9UUlVF
KTsKKyAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9zY3JpcHRzX3NldChicm93c2VyLCBFSU5B
X1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9zdGFuZGFyZF9zZXQoYnJvd3Nlciwg
IlRpbWVzIik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9zcGFjZV9zZXQoYnJvd3Nl
ciwgIkNvdXJpZXIiKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfc2VyaWZfc2V0KGJyb3dz
ZXIsICJUaW1lcyIpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9zYW5zX3NlcmlmX3NldChi
cm93c2VyLCAiSGVsdmV0aWNhIik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2N1cnNpdmVf
c2V0KGJyb3dzZXIsICJjdXJzaXZlIik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2ZhbnRh
c3lfc2V0KGJyb3dzZXIsICJmYW50YXN5Iik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2Rl
ZmF1bHRfc2l6ZV9zZXQoYnJvd3NlciwgMTIpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9t
b25vc3BhY2Vfc2l6ZV9zZXQoYnJvd3NlciwgMTApOworICAgIGV3a192aWV3X3NldHRpbmdfZm9u
dF9taW5pbXVtX3NpemVfc2V0KGJyb3dzZXIsIDApOworICAgIGV3a192aWV3X3NldHRpbmdfY2Fy
ZXRfYnJvd3Npbmdfc2V0KGJyb3dzZXIsIEVJTkFfRkFMU0UpOworICAgIGV3a192aWV3X3NldHRp
bmdfcGFnZV9jYWNoZV9zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0
dGluZ19lbmFibGVfYXV0b19yZXNpemVfd2luZG93X3NldChicm93c2VyLCBFSU5BX1RSVUUpOwor
ICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3BsdWdpbnNfc2V0KGJyb3dzZXIsIEVJTkFfVFJV
RSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19zY3JpcHRzX3dpbmRvd19vcGVuX3NldChicm93c2Vy
LCBFSU5BX1RSVUUpOworCisgICAgZXdrX3ZpZXdfem9vbV9zZXQoYnJvd3NlciwgMS4wLCAwLCAw
KTsKKworICAgIEV3a19IaXN0b3J5KiBoaXN0b3J5ID0gZXdrX3ZpZXdfaGlzdG9yeV9nZXQoYnJv
d3Nlcik7CisgICAgaW50IGxpbWl0ID0gZXdrX2hpc3RvcnlfbGltaXRfZ2V0KGhpc3RvcnkpOwor
ICAgIGV3a19oaXN0b3J5X2xpbWl0X3NldChoaXN0b3J5LCAwKTsKKyAgICBld2tfaGlzdG9yeV9s
aW1pdF9zZXQoaGlzdG9yeSwgbGltaXQpOworCisgICAgZXdrX2Nvb2tpZXNfY2xlYXIoKTsKKyAg
ICBld2tfY29va2llc19wb2xpY3lfc2V0KEVXS19DT09LSUVfSkFSX0FDQ0VQVF9OT19USElSRF9Q
QVJUWSk7CisKKyAgICBld2tfZnJhbWVfb3BlbmVyX2NsZWFyKGV3a192aWV3X2ZyYW1lX21haW5f
Z2V0KGJyb3dzZXIpKTsKK30KKworc3RhdGljIFN0cmluZyBnZXRGaW5hbFRlc3RVUkwoY29uc3Qg
U3RyaW5nJiB0ZXN0VVJMKQoreworICAgIGNvbnN0IHNpemVfdCBoYXNoU2VwYXJhdG9yUG9zID0g
dGVzdFVSTC5maW5kKCInIik7CisgICAgaWYgKGhhc2hTZXBhcmF0b3JQb3MgIT0gbm90Rm91bmQp
CisgICAgICAgIHJldHVybiB0ZXN0VVJMLmxlZnQoaGFzaFNlcGFyYXRvclBvcyk7CisKKyAgICAv
LyBDb252ZXJ0IHRoZSBwYXRoIGludG8gYSBmdWxsIGZpbGUgVVJMIGlmIGl0IGRvZXMgbm90IGxv
b2sKKyAgICAvLyBsaWtlIGFuIEhUVFAvUyBVUkwgKGRvZXNuJ3Qgc3RhcnQgd2l0aCBodHRwOi8v
IG9yIGh0dHBzOi8vKS4KKyAgICBpZiAoIXRlc3RVUkwuc3RhcnRzV2l0aCgiaHR0cDovLyIpICYm
ICF0ZXN0VVJMLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikpIHsKKyAgICAgICAgT3duRmFzdE1hbGxv
Y1B0cjxjaGFyPiBmaWxlUGF0aChlY29yZV9maWxlX3JlYWxwYXRoKHRlc3RVUkwudXRmOCgpLmRh
dGEoKSkpOworCisgICAgICAgIGlmIChlY29yZV9maWxlX2V4aXN0cyhmaWxlUGF0aC5nZXQoKSkp
CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCJmaWxlOi8vIikgKyBTdHJpbmc6OmZyb21VVEY4
KGZpbGVQYXRoLmdldCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVzdFVSTDsKK30KKworc3Rh
dGljIFN0cmluZyBnZXRFeHBlY3RlZFBpeGVsSGFzaChjb25zdCBTdHJpbmcmIHRlc3RVUkwpCit7
CisgICAgY29uc3Qgc2l6ZV90IGhhc2hTZXBhcmF0b3JQb3MgPSB0ZXN0VVJMLmZpbmQoIiciKTsK
KyAgICByZXR1cm4gKGhhc2hTZXBhcmF0b3JQb3MgPT0gbm90Rm91bmQpID8gdGVzdFVSTC5yaWdo
dChoYXNoU2VwYXJhdG9yUG9zKSA6IFN0cmluZygpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVM
YXlvdXRUZXN0Q29udHJvbGxlcihjb25zdCBTdHJpbmcmIHRlc3RVUkwsIGNvbnN0IFN0cmluZyYg
ZXhwZWN0ZWRQaXhlbEhhc2gpCit7CisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyID0KKyAgICAg
ICAgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmNyZWF0ZShzdGQ6OnN0cmluZyh0ZXN0VVJMLnV0Zjgo
KS5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3Ry
aW5nKGV4cGVjdGVkUGl4ZWxIYXNoLnV0ZjgoKS5kYXRhKCkpKTsKKworICAgIHRvcExvYWRpbmdG
cmFtZSA9IDA7CisgICAgZG9uZSA9IGZhbHNlOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVy
LT5zZXRJY29uRGF0YWJhc2VFbmFibGVkKGZhbHNlKTsKKworICAgIGlmIChzaG91bGRMb2dGcmFt
ZUxvYWREZWxlZ2F0ZXModGVzdFVSTCkpCisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+
c2V0RHVtcEZyYW1lTG9hZENhbGxiYWNrcyh0cnVlKTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJv
bGxlci0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCh0cnVlKTsKKworICAgIGlmIChzaG91bGRE
dW1wQXNUZXh0KHRlc3RVUkwpKSB7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0
RHVtcEFzVGV4dCh0cnVlKTsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRHZW5l
cmF0ZVBpeGVsUmVzdWx0cyhmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBydW5UZXN0
KGNvbnN0IGNoYXIqIGNUZXN0UGF0aE9yVVJMKQoreworICAgIGNvbnN0IFN0cmluZyB0ZXN0UGF0
aE9yVVJMID0gU3RyaW5nOjpmcm9tVVRGOChjVGVzdFBhdGhPclVSTCk7CisgICAgQVNTRVJUKCF0
ZXN0UGF0aE9yVVJMLmlzRW1wdHkoKSk7CisKKyAgICBjb25zdCBTdHJpbmcgdGVzdFVSTCA9IGdl
dEZpbmFsVGVzdFVSTCh0ZXN0UGF0aE9yVVJMKTsKKyAgICBjb25zdCBTdHJpbmcgZXhwZWN0ZWRQ
aXhlbEhhc2ggPSBnZXRFeHBlY3RlZFBpeGVsSGFzaCh0ZXN0UGF0aE9yVVJMKTsKKworICAgIHJl
c2V0RGVmYXVsdHNUb0NvbnNpc3RlbnRWYWx1ZXMoKTsKKyAgICBjcmVhdGVMYXlvdXRUZXN0Q29u
dHJvbGxlcih0ZXN0VVJMLCBleHBlY3RlZFBpeGVsSGFzaCk7CisKKyAgICBXb3JrUXVldWU6OnNo
YXJlZCgpLT5jbGVhcigpOworICAgIFdvcmtRdWV1ZTo6c2hhcmVkKCktPnNldEZyb3plbihmYWxz
ZSk7CisKKyAgICBjb25zdCBib29sIGlzU1ZHVzNDVGVzdCA9IHRlc3RVUkwuY29udGFpbnMoInN2
Zy9XM0MtU1ZHLTEuMSIpOworICAgIGNvbnN0IGludCB3aWR0aCA9IGlzU1ZHVzNDVGVzdCA/IDQ4
MCA6IExheW91dFRlc3RDb250cm9sbGVyOjptYXhWaWV3V2lkdGg7CisgICAgY29uc3QgaW50IGhl
aWdodCA9IGlzU1ZHVzNDVGVzdCA/IDM2MCA6IExheW91dFRlc3RDb250cm9sbGVyOjptYXhWaWV3
SGVpZ2h0OworICAgIGV2YXNfb2JqZWN0X3Jlc2l6ZShicm93c2VyLCB3aWR0aCwgaGVpZ2h0KTsK
KworICAgIGlmIChwcmV2VGVzdEJGSXRlbSkKKyAgICAgICAgZXdrX2hpc3RvcnlfaXRlbV9mcmVl
KHByZXZUZXN0QkZJdGVtKTsKKyAgICBjb25zdCBFd2tfSGlzdG9yeSogaGlzdG9yeSA9IGV3a192
aWV3X2hpc3RvcnlfZ2V0KGJyb3dzZXIpOworICAgIHByZXZUZXN0QkZJdGVtID0gZXdrX2hpc3Rv
cnlfaGlzdG9yeV9pdGVtX2N1cnJlbnRfZ2V0KGhpc3RvcnkpOworCisgICAgZXZhc19vYmplY3Rf
Zm9jdXNfc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfdXJpX3NldChicm93
c2VyLCB0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpOworCisgICAgZWNvcmVfbWFpbl9sb29wX2JlZ2lu
KCk7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmNsb3NlV2ViSW5zcGVjdG9yKCk7Cisg
ICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXREZXZlbG9wZXJFeHRyYXNFbmFibGVkKGZhbHNl
KTsKKworICAgIGV3a192aWV3X3VyaV9zZXQoYnJvd3NlciwgImFib3V0OmJsYW5rIik7CisKKyAg
ICBnTGF5b3V0VGVzdENvbnRyb2xsZXIuY2xlYXIoKTsKKyAgICBzZW5kUGl4ZWxSZXN1bHRzRU9G
KCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1blRlc3RpbmdTZXJ2ZXJMb29wKCkKK3sKKyAgICBjaGFy
IGZpbGVuYW1lW1BBVEhfTUFYXTsKKworICAgIHdoaWxlIChmZ2V0cyhmaWxlbmFtZSwgc2l6ZW9m
KGZpbGVuYW1lKSwgc3RkaW4pKSB7CisgICAgICAgIGNoYXIqIG5ld0xpbmUgPSBzdHJyY2hyKGZp
bGVuYW1lLCAnXG4nKTsKKyAgICAgICAgaWYgKG5ld0xpbmUpCisgICAgICAgICAgICAqbmV3TGlu
ZSA9ICdcMCc7CisKKyAgICAgICAgaWYgKGZpbGVuYW1lWzBdICE9ICdcMCcpCisgICAgICAgICAg
ICBydW5UZXN0KGZpbGVuYW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkanVzdE91dHB1
dFR5cGVCeU1pbWVUeXBlKCkKK3sKKyAgICBPd25GYXN0TWFsbG9jUHRyPGNoYXI+IHJlc3BvbnNl
TWltZVR5cGUoZXdrX2ZyYW1lX3Jlc3BvbnNlX21pbWVfdHlwZV9nZXQobWFpbkZyYW1lKSk7Cisg
ICAgaWYgKHJlc3BvbnNlTWltZVR5cGUuZ2V0KCkgJiYgIXN0cmNtcChyZXNwb25zZU1pbWVUeXBl
LmdldCgpLCAidGV4dC9wbGFpbiIpKSB7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+
c2V0RHVtcEFzVGV4dCh0cnVlKTsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRH
ZW5lcmF0ZVBpeGVsUmVzdWx0cyhmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkdW1w
RnJhbWVDb250ZW50c0FzVGV4dCgpCit7CisgICAgU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAoZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wQXNUZXh0KCkpCisgICAgICAgIHJlc3VsdCA9IGR1bXBG
cmFtZXNBc1RleHQobWFpbkZyYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFN0cmlu
Zzo6ZnJvbVVURjgoZXdrX2ZyYW1lX3JlbmRlcl90cmVlX2R1bXBfZ2V0KG1haW5GcmFtZSkpOwor
CisgICAgcHJpbnRmKCIlcyIsIHJlc3VsdC51dGY4KCkuZGF0YSgpKTsKK30KKworc3RhdGljIGJv
b2wgc2hvdWxkRHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oKQoreworICAgIHJldHVybiBnTGF5b3V0
VGVzdENvbnRyb2xsZXItPmR1bXBBc1RleHQoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5k
dW1wRE9NQXNXZWJBcmNoaXZlKCkgJiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcFNvdXJj
ZUFzV2ViQXJjaGl2ZSgpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGREdW1wUGl4ZWxzQW5kQ29t
cGFyZVdpdGhFeHBlY3RlZCgpCit7CisgICAgcmV0dXJuIGR1bXBQaXhlbHMgJiYgZ0xheW91dFRl
c3RDb250cm9sbGVyLT5nZW5lcmF0ZVBpeGVsUmVzdWx0cygpICYmICFnTGF5b3V0VGVzdENvbnRy
b2xsZXItPmR1bXBET01Bc1dlYkFyY2hpdmUoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5k
dW1wU291cmNlQXNXZWJBcmNoaXZlKCk7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZER1bXBCYWNr
Rm9yd2FyZExpc3QoKQoreworICAgIHJldHVybiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBC
YWNrRm9yd2FyZExpc3QoKTsKK30KKworc3RhdGljIGJvb2wgaW5pdEVmbCgpCit7CisgICAgaWYg
KCFlY29yZV9ldmFzX2luaXQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghZWNv
cmVfZmlsZV9pbml0KCkpIHsKKyAgICAgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZWRqZV9pbml0KCkpIHsKKyAgICAgICAg
ZWNvcmVfZmlsZV9zaHV0ZG93bigpOworICAgICAgICBlY29yZV9ldmFzX3NodXRkb3duKCk7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFld2tfaW5pdCgpKSB7CisgICAg
ICAgIGVkamVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNvcmVfZmlsZV9zaHV0ZG93bigpOworICAg
ICAgICBlY29yZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgc2h1dGRvd25FZmwoKQorewor
ICAgIGV3a19zaHV0ZG93bigpOworICAgIGVkamVfc2h1dGRvd24oKTsKKyAgICBlY29yZV9maWxl
X3NodXRkb3duKCk7CisgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworfQorCit2b2lkIGRpc3Bs
YXlXZWJWaWV3KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIGR1bXAoKQor
eworICAgIGludmFsaWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1bXBXYXRjaGRvZygpOworCisgICAg
aWYgKGR1bXBUcmVlKSB7CisgICAgICAgIGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKCk7Cisg
ICAgICAgIGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KCk7CisKKyAgICAgICAgaWYgKHNob3VsZER1
bXBGcmFtZVNjcm9sbFBvc2l0aW9uKCkpCisgICAgICAgICAgICBkdW1wRnJhbWVTY3JvbGxQb3Np
dGlvbihtYWluRnJhbWUpOworCisgICAgICAgIGlmIChzaG91bGREdW1wQmFja0ZvcndhcmRMaXN0
KCkpCisgICAgICAgICAgICBkdW1wQmFja0ZvcndhcmRMaXN0Rm9yV2ViVmlldyhicm93c2VyKTsK
KworICAgICAgICBpZiAocHJpbnRTZXBhcmF0b3JzKSB7CisgICAgICAgICAgICBwdXRzKCIjRU9G
Iik7CisgICAgICAgICAgICBmcHV0cygiI0VPRlxuIiwgc3RkZXJyKTsKKyAgICAgICAgICAgIGZm
bHVzaChzdGRvdXQpOworICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBpZiAoc2hvdWxkRHVtcFBpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQoKSkK
KyAgICAgICAgZHVtcFdlYlZpZXdBc1BpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQoZ0xheW91
dFRlc3RDb250cm9sbGVyLT5leHBlY3RlZFBpeGVsSGFzaCgpKTsKKworICAgIGRvbmUgPSB0cnVl
OworICAgIGVjb3JlX21haW5fbG9vcF9xdWl0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZUJy
b3dzZXIoRXZhcyogZXZhcywgR0NDb250cm9sbGVyKiBnY0NvbnRyb2xsZXIpCit7CisgICAgYnJv
d3NlciA9IGRydFZpZXdUaWxlZEFkZChldmFzKTsKKyAgICBpZiAoIWJyb3dzZXIpIHsKKyAgICAg
ICAgc2h1dGRvd25FZmwoKTsKKyAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKwor
ICAgIGV3a192aWV3X3RoZW1lX3NldChicm93c2VyLCBEQVRBX0RJUiIvZGVmYXVsdC5lZGoiKTsK
KworICAgIGV2YXNfb2JqZWN0X25hbWVfc2V0KGJyb3dzZXIsICJicm93c2VyIik7CisgICAgZXZh
c19vYmplY3RfbW92ZShicm93c2VyLCAwLCAwKTsKKyAgICBldmFzX29iamVjdF9yZXNpemUoYnJv
d3NlciwgODAwLCA2MDApOworICAgIGV2YXNfb2JqZWN0X2xheWVyX3NldChicm93c2VyLCBFVkFT
X0xBWUVSX01BWCk7CisgICAgZXZhc19vYmplY3Rfc2hvdyhicm93c2VyKTsKKyAgICBldmFzX29i
amVjdF9mb2N1c19zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKworICAgIGV2YXNfb2JqZWN0X3Nt
YXJ0X2NhbGxiYWNrX2FkZChicm93c2VyLCAibG9hZCxzdGFydGVkIiwgb25Mb2FkU3RhcnRlZCwg
MCk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJsb2FkLGZp
bmlzaGVkIiwgb25Mb2FkRmluaXNoZWQsIDApOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxi
YWNrX2FkZChicm93c2VyLCAidGl0bGUsY2hhbmdlZCIsIG9uVGl0bGVDaGFuZ2VkLCAwKTsKKyAg
ICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQoYnJvd3NlciwgIndpbmRvdyxvYmplY3Qs
Y2xlYXJlZCIsIG9uV2luZG93T2JqZWN0Q2xlYXJlZCwgZ2NDb250cm9sbGVyKTsKKyAgICBldmFz
X29iamVjdF9zbWFydF9jYWxsYmFja19hZGQoYnJvd3NlciwgInN0YXR1c2Jhcix0ZXh0LHNldCIs
IG9uU3RhdHVzYmFyVGV4dFNldCwgMCk7CisKKyAgICBtYWluRnJhbWUgPSBld2tfdmlld19mcmFt
ZV9tYWluX2dldChicm93c2VyKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQo
bWFpbkZyYW1lLCAibG9hZCxkb2N1bWVudCxmaW5pc2hlZCIsIG9uRG9jdW1lbnRMb2FkRmluaXNo
ZWQsIDApOworfQorCitzdGF0aWMgRWNvcmVfRXZhcyogaW5pdEVjb3JlRXZhcygpCit7CisgICAg
RWNvcmVfRXZhcyogZWNvcmVFdmFzID0gdXNlWDExV2luZG93ID8gZWNvcmVfZXZhc19uZXcoMCwg
MCwgMCwgODAwLCA2MDAsIDApIDogZWNvcmVfZXZhc19idWZmZXJfbmV3KDgwMCwgNjAwKTsKKyAg
ICBpZiAoIWVjb3JlRXZhcykgeworICAgICAgICBzaHV0ZG93bkVmbCgpOworICAgICAgICBleGl0
KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgZWNvcmVfZXZhc190aXRsZV9zZXQoZWNvcmVF
dmFzLCAiRUZMIER1bXBSZW5kZXJUcmVlIik7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19yZXNp
emVfc2V0KGVjb3JlRXZhcywgb25FY29yZUV2YXNSZXNpemUpOworICAgIGVjb3JlX2V2YXNfY2Fs
bGJhY2tfZGVsZXRlX3JlcXVlc3Rfc2V0KGVjb3JlRXZhcywgb25DbG9zZVdpbmRvdyk7CisgICAg
ZWNvcmVfZXZhc19zaG93KGVjb3JlRXZhcyk7CisKKyAgICByZXR1cm4gZWNvcmVFdmFzOworfQor
CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgaWYgKCFwYXJzZUNvbW1h
bmRMaW5lT3B0aW9ucyhhcmdjLCBhcmd2KSkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsK
KworICAgIGlmICghaW5pdEVmbCgpKQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisg
ICAgT3duUHRyPEVjb3JlX0V2YXM+IGVjb3JlRXZhcyA9IGFkb3B0UHRyKGluaXRFY29yZUV2YXMo
KSk7CisgICAgT3duUHRyPEdDQ29udHJvbGxlcj4gZ2NDb250cm9sbGVyID0gYWRvcHRQdHIobmV3
IEdDQ29udHJvbGxlcik7CisgICAgY3JlYXRlQnJvd3NlcihlY29yZV9ldmFzX2dldChlY29yZUV2
YXMuZ2V0KCkpLCBnY0NvbnRyb2xsZXIuZ2V0KCkpOworICAgIGFkZEZvbnRzVG9FbnZpcm9ubWVu
dCgpOworCisgICAgaWYgKHVzZUxvbmdSdW5uaW5nU2VydmVyTW9kZShhcmdjLCBhcmd2KSkgewor
ICAgICAgICBwcmludFNlcGFyYXRvcnMgPSB0cnVlOworICAgICAgICBydW5UZXN0aW5nU2VydmVy
TG9vcCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50U2VwYXJhdG9ycyA9IChvcHRpbmQg
PCBhcmdjIC0gMSB8fCAoZHVtcFBpeGVscyAmJiBkdW1wVHJlZSkpOworICAgICAgICBmb3IgKGlu
dCBpID0gb3B0aW5kOyBpICE9IGFyZ2M7ICsraSkKKyAgICAgICAgICAgIHJ1blRlc3QoYXJndltp
XSk7CisgICAgfQorCisgICAgZWNvcmVFdmFzLmNsZWFyKCk7CisKKyAgICBzaHV0ZG93bkVmbCgp
OworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9Ub29scy9EdW1wUmVu
ZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWVFZmwuaCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2Vm
bC9EdW1wUmVuZGVyVHJlZUVmbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjY0ZDkwOTZiMzYzYTQ4MDQ2ZmViMWU3
OGZhOTBmMDNiYzQzN2JhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJl
ZS9lZmwvRHVtcFJlbmRlclRyZWVFZmwuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZCBpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRHVtcFJlbmRl
clRyZWVFZmxfaAorI2RlZmluZSBEdW1wUmVuZGVyVHJlZUVmbF9oCisKKyNpbmNsdWRlIDxFY29y
ZS5oPgorI2luY2x1ZGUgPEV2YXMuaD4KKworZXh0ZXJuIEV2YXNfT2JqZWN0KiBtYWluRnJhbWU7
CitleHRlcm4gRXZhc19PYmplY3QqIGJyb3dzZXI7CitleHRlcm4gRXZhc19PYmplY3QqIHRvcExv
YWRpbmdGcmFtZTsKK2V4dGVybiBib29sIHdhaXRGb3JQb2xpY3k7CitleHRlcm4gRWNvcmVfVGlt
ZXIqIHdhaXRUb0R1bXBXYXRjaGRvZzsKKworI2VuZGlmIC8qIER1bXBSZW5kZXJUcmVlRWZsX2gg
Ki8KZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9Gb250TWFuYWdlbWVudC5j
cHAgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjg5YTkzMjhmZjE1Y2U0OGJjOTQ3YzhiMzA1ZjVkMmEyNDFiOWI0MGQKLS0tIC9kZXYvbnVs
bAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1lbnQuY3BwCkBAIC0w
LDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRl
ZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvbnRNYW5hZ2VtZW50Lmgi
CisKKyNpbmNsdWRlIDxFY29yZV9GaWxlLmg+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUg
PGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+
CisKK3N0YXRpYyBWZWN0b3I8U3RyaW5nPiBnZXRGb250RGlyZWN0b3JpZXMoKQoreworICAgIFZl
Y3RvcjxTdHJpbmc+IGZvbnREaXJQYXRoczsKKworICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3Ry
aW5nKCIvdXNyL3NoYXJlL2ZvbnRzL1RURi8iKSk7CisgICAgZm9udERpclBhdGhzLmFwcGVuZChT
dHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvdHJ1ZXR5cGUvdHRmLWxpYmVyYXRpb24vIikpOworICAg
IGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL2xpYmVyYXRpb24v
IikpOworICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL3Ry
dWV0eXBlL3R0Zi1kZWphdnUvIikpOworICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIv
dXNyL3NoYXJlL2ZvbnRzL2RlamF2dS8iKSk7CisgICAgZm9udERpclBhdGhzLmFwcGVuZChTdHJp
bmcoIi91c3Ivc2hhcmUvZm9udHMvT1RGLyIpKTsgLy8gTWF0aE1MCisgICAgZm9udERpclBhdGhz
LmFwcGVuZChTdHJpbmcoIi91c3Ivc2hhcmUvZm9udHMvb3BlbnR5cGUvc3RpeC8iKSk7IC8vIE1h
dGhNTAorICAgIGZvbnREaXJQYXRocy5hcHBlbmQoU3RyaW5nKCIvdXNyL3NoYXJlL2ZvbnRzL3N0
aXgvIikpOyAvLyBNYXRoTUwKKworICAgIHJldHVybiBmb250RGlyUGF0aHM7Cit9CisKK3N0YXRp
YyBWZWN0b3I8U3RyaW5nPiBnZXRGb250RmlsZXMoKQoreworICAgIFZlY3RvcjxTdHJpbmc+IGZv
bnRGaWxlUGF0aHM7CisKKyAgICAvLyBBaGVtIGlzIHVzZWQgYnkgbWFueSBsYXlvdXQgdGVzdHMu
CisgICAgZm9udEZpbGVQYXRocy5hcHBlbmQoU3RyaW5nKEZPTlRTX0NPTkZfRElSICIvQUhFTV9f
X18uVFRGIikpOworICAgIC8vIEEgZm9udCB3aXRoIG5vIHZhbGlkIEZvbnRjb25maWcgZW5jb2Rp
bmcgdG8gdGVzdCBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDc0NTIK
KyAgICBmb250RmlsZVBhdGhzLmFwcGVuZChTdHJpbmcoRk9OVFNfQ09ORl9ESVIgIi9Gb250V2l0
aE5vVmFsaWRFbmNvZGluZy5mb24iKSk7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8PSA5OyBp
KyspIHsKKyAgICAgICAgY2hhciBmb250UGF0aFtQQVRIX01BWF07CisgICAgICAgIHNucHJpbnRm
KGZvbnRQYXRoLCBQQVRIX01BWCAtIDEsCisgICAgICAgICAgICAgICAgIEZPTlRTX0NPTkZfRElS
ICIvLi4vLi4vZm9udHMvV2ViS2l0V2VpZ2h0V2F0Y2hlciVpMDAudHRmIiwgaSk7CisKKyAgICAg
ICAgZm9udEZpbGVQYXRocy5hcHBlbmQoU3RyaW5nKGZvbnRQYXRoKSk7CisgICAgfQorCisgICAg
cmV0dXJuIGZvbnRGaWxlUGF0aHM7Cit9CisKK3N0YXRpYyBzaXplX3QgYWRkRm9udERpcmVjdG9y
aWVzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBmb250RGlyZWN0b3JpZXMsIEZjQ29uZmlnKiBjb25m
aWcpCit7CisgICAgc2l6ZV90IGFkZGVkRGlyZWN0b3JpZXM7CisKKyAgICBmb3IgKFZlY3RvcjxT
dHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZvbnREaXJlY3Rvcmllcy5iZWdpbigpOworICAg
ICAgICAgaXQgIT0gZm9udERpcmVjdG9yaWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0
IENTdHJpbmcgY3VycmVudERpcmVjdG9yeSA9ICgqaXQpLnV0ZjgoKTsKKyAgICAgICAgY29uc3Qg
Y2hhciogcGF0aCA9IGN1cnJlbnREaXJlY3RvcnkuZGF0YSgpOworCisgICAgICAgIGlmIChlY29y
ZV9maWxlX2lzX2RpcihwYXRoKSkgeworICAgICAgICAgICAgaWYgKCFGY0NvbmZpZ0FwcEZvbnRB
ZGREaXIoY29uZmlnLCByZWludGVycHJldF9jYXN0PGNvbnN0IEZjQ2hhcjgqPihwYXRoKSkpIHsK
KyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBsb2FkIGZvbnQgYXQg
JXMhXG4iLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgKythZGRlZERpcmVjdG9yaWVzOworICAgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIGFkZGVkRGlyZWN0b3JpZXM7Cit9CisKK3N0YXRpYyB2b2lkIGFkZEZvbnRGaWxl
cyhjb25zdCBWZWN0b3I8U3RyaW5nPiYgZm9udEZpbGVzLCBGY0NvbmZpZyogY29uZmlnKQorewor
ICAgIGZvciAoVmVjdG9yPFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZm9udEZpbGVzLmJl
Z2luKCk7IGl0ICE9IGZvbnRGaWxlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBjb25zdCBDU3Ry
aW5nIGN1cnJlbnRGaWxlID0gKCppdCkudXRmOCgpOworICAgICAgICBjb25zdCBjaGFyKiBwYXRo
ID0gY3VycmVudEZpbGUuZGF0YSgpOworCisgICAgICAgIGlmICghRmNDb25maWdBcHBGb250QWRk
RmlsZShjb25maWcsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmNDaGFyOCo+KHBhdGgpKSkKKyAg
ICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGxvYWQgZm9udCBhdCAlcyFcbiIs
IHBhdGgpOworICAgIH0KK30KKwordm9pZCBhZGRGb250c1RvRW52aXJvbm1lbnQoKQoreworICAg
IEZjSW5pdCgpOworCisgICAgLy8gTG9hZCBvdXIgY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaCBz
ZXRzIHVwIHByb3BlciBhbGlhc2VzIGZvciBmYW1pbHkKKyAgICAvLyBuYW1lcyBsaWtlIHNhbnMs
IHNlcmlmIGFuZCBtb25vc3BhY2UuCisgICAgRmNDb25maWcqIGNvbmZpZyA9IEZjQ29uZmlnQ3Jl
YXRlKCk7CisgICAgY29uc3QgY2hhciogZm9udENvbmZpZ0ZpbGVuYW1lID0gRk9OVFNfQ09ORl9E
SVIgIi9mb250cy5jb25mIjsKKyAgICBpZiAoIUZjQ29uZmlnUGFyc2VBbmRMb2FkKGNvbmZpZywg
cmVpbnRlcnByZXRfY2FzdDxjb25zdCBGY0NoYXI4Kj4oZm9udENvbmZpZ0ZpbGVuYW1lKSwgdHJ1
ZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBsb2FkIGZvbnQgY29uZmln
dXJhdGlvbiBmaWxlIGZyb206ICVzXG4iLCBmb250Q29uZmlnRmlsZW5hbWUpOworICAgICAgICBl
eGl0KDEpOworICAgIH0KKworICAgIGlmICghYWRkRm9udERpcmVjdG9yaWVzKGdldEZvbnREaXJl
Y3RvcmllcygpLCBjb25maWcpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm9uZSBvZiB0
aGUgZm9udCBkaXJlY3RvcmllcyBjb3VsZCBiZSBhZGRlZC4gRWl0aGVyIGluc3RhbGwgdGhlbSAi
CisgICAgICAgICAgICAgICAgICAgICAgICAib3IgZmlsZSBhIGJ1ZyBhdCBodHRwOi8vYnVncy53
ZWJraXQub3JnIGlmIHRoZXkgYXJlIGluc3RhbGxlZCBpbiAiCisgICAgICAgICAgICAgICAgICAg
ICAgICAiYW5vdGhlciBsb2NhdGlvbi5cbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKwor
ICAgIGFkZEZvbnRGaWxlcyhnZXRGb250RmlsZXMoKSwgY29uZmlnKTsKKworICAgIGlmICghRmND
b25maWdTZXRDdXJyZW50KGNvbmZpZykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3Vs
ZCBub3Qgc2V0IHRoZSBjdXJyZW50IGZvbnQgY29uZmlndXJhdGlvbiFcbiIpOworICAgICAgICBl
eGl0KDEpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZs
L0ZvbnRNYW5hZ2VtZW50LmggYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRm9udE1hbmFnZW1l
bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi5kNDk3NTEzYWVkYzEzOTlmNDZmYzBiOTFkZDRmNDI4NTU3ZDc0MWEz
Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0ZvbnRNYW5hZ2Vt
ZW50LmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJ
T04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ry
b25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRm9udE1hbmFnZW1lbnRfaAorI2RlZmluZSBGb250
TWFuYWdlbWVudF9oCisKK3ZvaWQgYWRkRm9udHNUb0Vudmlyb25tZW50KCk7CisKKyNlbmRpZiAv
LyBGb250TWFuYWdlbWVudF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99827</attachid>
            <date>2011-07-06 06:46:59 -0700</date>
            <delta_ts>2011-07-14 10:01:13 -0700</delta_ts>
            <desc>New patch containing only DumpRenderTree.cpp</desc>
            <filename>bug-62034-20110706105023.patch</filename>
            <type>text/plain</type>
            <size>20543</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTA0NTQKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCBjN2ExMGFhOWJmNmYwMjZjMzA5YzI1NzM3YzY1NTQ1OWU3
ZDIzZGNkLi45OTVlYzg5YmFmZjhlNGFhMDNhNzVlMTI2MDBlMWYzOGE5ZWRjMTEwIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTEg
QEAKKzIwMTEtMDctMDYgIFJhcGhhZWwgS3VibyBkYSBDb3N0YSAgPGt1Ym9AcHJvZnVzaW9uLm1v
Ymk+CisKKyAgICAgICAgW0VGTF0gRFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MjAzNAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgaXMgdGhlIG1haW4g
ZmlsZSBmb3IgRUZMJ3MgRHVtcFJlbmRlclRyZWUgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICAg
IGVmZmVjdGl2ZWx5IHJ1bnMgdGhlIHRlc3RzLgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUv
ZWZsL0R1bXBSZW5kZXJUcmVlLmNwcDogQWRkZWQuCisgICAgICAgIChkdW1wRnJhbWVzQXNUZXh0
KToKKyAgICAgICAgKGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZExv
Z0ZyYW1lTG9hZERlbGVnYXRlcyk6CisgICAgICAgIChzaG91bGREdW1wQXNUZXh0KToKKyAgICAg
ICAgKHNlbmRQaXhlbFJlc3VsdHNFT0YpOgorICAgICAgICAoaW52YWxpZGF0ZUFueVByZXZpb3Vz
V2FpdFRvRHVtcFdhdGNoZG9nKToKKyAgICAgICAgKHByb2Nlc3NXb3JrKToKKyAgICAgICAgKGFk
ZENvbnRyb2xsZXJUb1dpbmRvdyk6CisgICAgICAgIChvbldpbmRvd09iamVjdENsZWFyZWQpOgor
ICAgICAgICAob25TdGF0dXNiYXJUZXh0U2V0KToKKyAgICAgICAgKG9uTG9hZFN0YXJ0ZWQpOgor
ICAgICAgICAob25Mb2FkRmluaXNoZWQpOgorICAgICAgICAob25UaXRsZUNoYW5nZWQpOgorICAg
ICAgICAob25Eb2N1bWVudExvYWRGaW5pc2hlZCk6CisgICAgICAgIChvbkVjb3JlRXZhc1Jlc2l6
ZSk6CisgICAgICAgIChvbkNsb3NlV2luZG93KToKKyAgICAgICAgKHVzZUxvbmdSdW5uaW5nU2Vy
dmVyTW9kZSk6CisgICAgICAgIChwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyk6CisgICAgICAgIChy
ZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKToKKyAgICAgICAgKGdldEZpbmFsVGVzdFVS
TCk6CisgICAgICAgIChnZXRFeHBlY3RlZFBpeGVsSGFzaCk6CisgICAgICAgIChjcmVhdGVMYXlv
dXRUZXN0Q29udHJvbGxlcik6CisgICAgICAgIChydW5UZXN0KToKKyAgICAgICAgKHJ1blRlc3Rp
bmdTZXJ2ZXJMb29wKToKKyAgICAgICAgKGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKToKKyAg
ICAgICAgKGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KToKKyAgICAgICAgKHNob3VsZER1bXBGcmFt
ZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0
aEV4cGVjdGVkKToKKyAgICAgICAgKHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QpOgorICAgICAg
ICAoaW5pdEVmbCk6CisgICAgICAgIChzaHV0ZG93bkVmbCk6CisgICAgICAgIChkaXNwbGF5V2Vi
Vmlldyk6CisgICAgICAgIChkdW1wKToKKyAgICAgICAgKGNyZWF0ZUJyb3dzZXIpOgorICAgICAg
ICAoaW5pdEVjb3JlRXZhcyk6CisgICAgICAgIChtYWluKToKKwogMjAxMS0wNy0wNiAgRXJpYyBT
ZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZC4uCmRpZmYgLS1n
aXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwIGIvVG9vbHMv
RHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMTVkOWQ4
YjZmZjQ4NTZmNTJhZDk2MjBjNDI2YjRkYmFmN2VkZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvVG9v
bHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcApAQCAtMCwwICsxLDU3MCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcwor
ICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZS5oIgorCisjaW5jbHVk
ZSAiRHVtcEhpc3RvcnlJdGVtLmgiCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWVWaWV3LmgiCisj
aW5jbHVkZSAiRXZlbnRTZW5kZXIuaCIKKyNpbmNsdWRlICJGb250TWFuYWdlbWVudC5oIgorI2lu
Y2x1ZGUgIkdDQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkxheW91dFRlc3RDb250cm9sbGVyLmgi
CisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQaXhlbER1bXBTdXBwb3J0
LmgiCisjaW5jbHVkZSAiV29ya1F1ZXVlLmgiCisjaW5jbHVkZSAiZXdrX3ByaXZhdGUuaCIgLy8g
RklYTUU6IGNyZWF0ZSBzb21lIFdlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlLmNwcCBpbnN0
ZWFkCisjaW5jbHVkZSA8RVdlYktpdC5oPgorI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5jbHVkZSA8
RWNvcmVfRXZhcy5oPgorI2luY2x1ZGUgPEVjb3JlX0ZpbGUuaD4KKyNpbmNsdWRlIDxFZGplLmg+
CisjaW5jbHVkZSA8RXZhcy5oPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgor
I2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRleHQv
Q1N0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25GYXN0TWFs
bG9jUHRyLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCitFdmFzX09iamVjdCogYnJvd3Nl
ciA9IDA7CitFdmFzX09iamVjdCogbWFpbkZyYW1lID0gMDsKK0V2YXNfT2JqZWN0KiB0b3BMb2Fk
aW5nRnJhbWUgPSAwOworYm9vbCB3YWl0Rm9yUG9saWN5ID0gZmFsc2U7CitFY29yZV9UaW1lciog
d2FpdFRvRHVtcFdhdGNoZG9nID0gMDsKK2V4dGVybiBFd2tfSGlzdG9yeV9JdGVtKiBwcmV2VGVz
dEJGSXRlbTsKKworLy8gRnJvbSB0aGUgdG9wLWxldmVsIER1bXBSZW5kZXJUcmVlLmgKK1JlZlB0
cjxMYXlvdXRUZXN0Q29udHJvbGxlcj4gZ0xheW91dFRlc3RDb250cm9sbGVyOwordm9sYXRpbGUg
Ym9vbCBkb25lID0gZmFsc2U7CisKK3N0YXRpYyBpbnQgZHVtcFBpeGVscyA9IGZhbHNlOworc3Rh
dGljIGludCBkdW1wVHJlZSA9IHRydWU7CitzdGF0aWMgaW50IHByaW50U2VwYXJhdG9ycyA9IHRy
dWU7CitzdGF0aWMgaW50IHVzZVgxMVdpbmRvdyA9IGZhbHNlOworCitzdGF0aWMgU3RyaW5nIGR1
bXBGcmFtZXNBc1RleHQoRXZhc19PYmplY3QqIGZyYW1lKQoreworICAgIFN0cmluZyByZXN1bHQ7
CisKKyAgICBpZiAoZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQoYnJvd3NlcikgIT0gZnJhbWUpIHsK
KyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4tLS0tLS0tLVxuRnJhbWU6ICciKTsKKyAgICAgICAg
cmVzdWx0LmFwcGVuZChTdHJpbmc6OmZyb21VVEY4KGV3a19mcmFtZV9uYW1lX2dldChmcmFtZSkp
KTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiJ1xuLS0tLS0tLS1cbiIpOworICAgIH0KKworICAg
IHJlc3VsdC5hcHBlbmQoZXdrX2ZyYW1lX2lubmVyX3RleHRfZ2V0KGZyYW1lKSk7CisgICAgcmVz
dWx0LmFwcGVuZCgiXG4iKTsKKworICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBD
aGlsZEZyYW1lc0FzVGV4dCgpKSB7CisgICAgICAgIEVpbmFfSXRlcmF0b3IqIGNoaWxkcmVuID0g
ZXdrX2ZyYW1lX2NoaWxkcmVuX2l0ZXJhdG9yX25ldyhmcmFtZSk7CisgICAgICAgIEV2YXNfT2Jq
ZWN0KiBjaGlsZDsKKworICAgICAgICBFSU5BX0lURVJBVE9SX0ZPUkVBQ0goY2hpbGRyZW4sIGNo
aWxkKSB7CisgICAgICAgICAgICBTdHJpbmcgdGVtcFRleHQoZHVtcEZyYW1lc0FzVGV4dChjaGls
ZCkpOworCisgICAgICAgICAgICBpZiAodGVtcFRleHQuaXNFbXB0eSgpKQorICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRlbXBUZXh0KTsKKyAg
ICAgICAgfQorCisgICAgICAgIGVpbmFfaXRlcmF0b3JfZnJlZShjaGlsZHJlbik7CisgICAgfQor
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZHVtcEZyYW1lU2Nyb2xsUG9z
aXRpb24oRXZhc19PYmplY3QqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRp
YyBib29sIHNob3VsZExvZ0ZyYW1lTG9hZERlbGVnYXRlcyhjb25zdCBTdHJpbmcmIHBhdGhPclVS
TCkKK3sKKyAgICByZXR1cm4gcGF0aE9yVVJMLmNvbnRhaW5zKCJsb2FkaW5nLyIpOworfQorCitz
dGF0aWMgYm9vbCBzaG91bGREdW1wQXNUZXh0KGNvbnN0IFN0cmluZyYgcGF0aE9yVVJMKQorewor
ICAgIHJldHVybiBwYXRoT3JVUkwuY29udGFpbnMoImR1bXBBc1RleHQvIik7Cit9CisKK3N0YXRp
YyB2b2lkIHNlbmRQaXhlbFJlc3VsdHNFT0YoKQoreworICAgIHB1dHMoIiNFT0YiKTsKKyAgICBm
Zmx1c2goc3Rkb3V0KTsKKyAgICBmZmx1c2goc3RkZXJyKTsKK30KKworc3RhdGljIHZvaWQgaW52
YWxpZGF0ZUFueVByZXZpb3VzV2FpdFRvRHVtcFdhdGNoZG9nKCkKK3sKKyAgICBpZiAod2FpdFRv
RHVtcFdhdGNoZG9nKSB7CisgICAgICAgIGVjb3JlX3RpbWVyX2RlbCh3YWl0VG9EdW1wV2F0Y2hk
b2cpOworICAgICAgICB3YWl0VG9EdW1wV2F0Y2hkb2cgPSAwOworICAgIH0KKyAgICB3YWl0Rm9y
UG9saWN5ID0gZmFsc2U7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgcHJvY2Vzc1dvcmsodm9pZCog
ZGF0YSkKK3sKKyAgICBpZiAoV29ya1F1ZXVlOjpzaGFyZWQoKS0+cHJvY2Vzc1dvcmsoKSAmJiAh
Z0xheW91dFRlc3RDb250cm9sbGVyLT53YWl0VG9EdW1wKCkpCisgICAgICAgIGR1bXAoKTsKKyAg
ICByZXR1cm4gRUNPUkVfQ0FMTEJBQ0tfQ0FOQ0VMOworfQorCitzdGF0aWMgdm9pZCBhZGRDb250
cm9sbGVyVG9XaW5kb3coSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIHdpbmRvd09i
amVjdCwgY29uc3QgY2hhciogY29udHJvbGxlck5hbWUsIEpTVmFsdWVSZWYgY29udHJvbGxlcikK
K3sKKyAgICBKU1N0cmluZ1JlZiBjb250cm9sbGVyTmFtZVN0ciA9IEpTU3RyaW5nQ3JlYXRlV2l0
aFVURjhDU3RyaW5nKGNvbnRyb2xsZXJOYW1lKTsKKyAgICBKU09iamVjdFNldFByb3BlcnR5KGNv
bnRleHQsIHdpbmRvd09iamVjdCwgY29udHJvbGxlck5hbWVTdHIsIGNvbnRyb2xsZXIsIGtKU1By
b3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUs
IDApOworICAgIEpTU3RyaW5nUmVsZWFzZShjb250cm9sbGVyTmFtZVN0cik7Cit9CisKK3N0YXRp
YyB2b2lkIG9uV2luZG93T2JqZWN0Q2xlYXJlZCh2b2lkKiB1c2VyRGF0YSwgRXZhc19PYmplY3Qq
LCB2b2lkKiBldmVudEluZm8pCit7CisgICAgRXdrX1dpbmRvd19PYmplY3RfQ2xlYXJlZF9FdmVu
dCogb2JqZWN0Q2xlYXJlZEluZm8gPSBzdGF0aWNfY2FzdDxFd2tfV2luZG93X09iamVjdF9DbGVh
cmVkX0V2ZW50Kj4oZXZlbnRJbmZvKTsKKyAgICBKU1ZhbHVlUmVmIGV4Y2VwdGlvbiA9IDA7Cisg
ICAgQVNTRVJUKGdMYXlvdXRUZXN0Q29udHJvbGxlcik7CisKKyAgICBHQ0NvbnRyb2xsZXIqIGdj
Q29udHJvbGxlciA9IHN0YXRpY19jYXN0PEdDQ29udHJvbGxlcio+KHVzZXJEYXRhKTsKKyAgICBB
U1NFUlQoZ2NDb250cm9sbGVyKTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+bWFrZVdp
bmRvd09iamVjdChvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgb2JqZWN0Q2xlYXJlZEluZm8t
PndpbmRvd09iamVjdCwgJmV4Y2VwdGlvbik7CisgICAgQVNTRVJUKCFleGNlcHRpb24pOworCisg
ICAgZ2NDb250cm9sbGVyLT5tYWtlV2luZG93T2JqZWN0KG9iamVjdENsZWFyZWRJbmZvLT5jb250
ZXh0LCBvYmplY3RDbGVhcmVkSW5mby0+d2luZG93T2JqZWN0LCAmZXhjZXB0aW9uKTsKKyAgICBB
U1NFUlQoIWV4Y2VwdGlvbik7CisKKyAgICAvKiBGSVhNRSBzL2ZhbHNlLyFnZXRfcGFyZW50LyAq
LworICAgIGFkZENvbnRyb2xsZXJUb1dpbmRvdyhvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwg
b2JqZWN0Q2xlYXJlZEluZm8tPndpbmRvd09iamVjdCwgImV2ZW50U2VuZGVyIiwgbWFrZUV2ZW50
U2VuZGVyKG9iamVjdENsZWFyZWRJbmZvLT5jb250ZXh0LCBmYWxzZSkpOworfQorCitzdGF0aWMg
dm9pZCBvblN0YXR1c2JhclRleHRTZXQodm9pZCosIEV2YXNfT2JqZWN0Kiwgdm9pZCogZXZlbnRJ
bmZvKQoreworICAgIGlmICghZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wU3RhdHVzQ2FsbGJh
Y2tzKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IGNoYXIqIHN0YXR1c2JhclRleHQg
PSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZXZlbnRJbmZvKTsKKyAgICBwcmludGYoIlVJIERF
TEVHQVRFIFNUQVRVUyBDQUxMQkFDSzogc2V0U3RhdHVzVGV4dDolc1xuIiwgc3RhdHVzYmFyVGV4
dCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uTG9hZFN0YXJ0ZWQodm9pZCosIEV2YXNfT2JqZWN0KiB2
aWV3LCB2b2lkKikKK3sKKyAgICAvLyBGSVhNRTogd2UgYWN0dWFsbHkgbmVlZCB0aGUgZnJhbWUg
cmVsYXRlZCB0byB0aGlzIGV2ZW50CisgICAgRXZhc19PYmplY3QqIGZyYW1lID0gZXdrX3ZpZXdf
ZnJhbWVfbWFpbl9nZXQodmlldyk7CisKKyAgICAvLyBNYWtlIHN1cmUgd2Ugb25seSBzZXQgdGhp
cyBvbmNlIHBlciB0ZXN0LiBJZiBpdCBnZXRzIGNsZWFyZWQsIGFuZCB0aGVuIHNldCBhZ2Fpbiwg
d2UgbWlnaHQKKyAgICAvLyBlbmQgdXAgZG9pbmcgdHdvIGR1bXBzIGZvciBvbmUgdGVzdC4KKyAg
ICBpZiAoIXRvcExvYWRpbmdGcmFtZSAmJiAhZG9uZSkKKyAgICAgICAgdG9wTG9hZGluZ0ZyYW1l
ID0gZnJhbWU7Cit9CisKK3N0YXRpYyB2b2lkIG9uTG9hZEZpbmlzaGVkKHZvaWQqLCBFdmFzX09i
amVjdCogdmlldywgdm9pZCopCit7CisgICAgLy8gRklYTUU6IHdlIGFjdHVhbGx5IG5lZWQgdGhl
IGZyYW1lIHJlbGF0ZWQgdG8gdGhpcyBldmVudAorICAgIEV2YXNfT2JqZWN0KiBmcmFtZSA9IGV3
a192aWV3X2ZyYW1lX21haW5fZ2V0KHZpZXcpOworCisgICAgaWYgKHRvcExvYWRpbmdGcmFtZSAh
PSBmcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdG9wTG9hZGluZ0ZyYW1lID0gMDsKKwor
ICAgIFdvcmtRdWV1ZTo6c2hhcmVkKCktPnNldEZyb3plbih0cnVlKTsKKyAgICBpZiAoZ0xheW91
dFRlc3RDb250cm9sbGVyLT53YWl0VG9EdW1wKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
IChXb3JrUXVldWU6OnNoYXJlZCgpLT5jb3VudCgpKQorICAgICAgICBlY29yZV9pZGxlcl9hZGQo
cHJvY2Vzc1dvcmssIDApOworICAgIGVsc2UKKyAgICAgICAgZHVtcCgpOworfQorCitzdGF0aWMg
dm9pZCBvblRpdGxlQ2hhbmdlZCh2b2lkKiwgRXZhc19PYmplY3QqLCB2b2lkKikKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworfQorCitzdGF0aWMgdm9pZCBvbkRvY3VtZW50TG9hZEZpbmlzaGVk
KHZvaWQqLCBFdmFzX09iamVjdCogZnJhbWUsIHZvaWQqKQoreworICAgIGNvbnN0IFN0cmluZyBm
cmFtZU5hbWUoZXdrX2ZyYW1lX3N1aXRhYmxlX2RydF9uYW1lX2dldChmcmFtZSkpOworCisgICAg
aWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEZyYW1lTG9hZENhbGxiYWNr
cygpKQorICAgICAgICBwcmludGYoIiVzIC0gZGlkRmluaXNoRG9jdW1lbnRMb2FkRm9yRnJhbWVc
biIsIGZyYW1lTmFtZS51dGY4KCkuZGF0YSgpKTsKKyAgICBlbHNlIGlmICghZG9uZSkgeworICAg
ICAgICBjb25zdCB1bnNpZ25lZCBwZW5kaW5nRnJhbWVVbmxvYWRFdmVudHMgPSBld2tfZnJhbWVf
cGVuZGluZ191bmxvYWRfZXZlbnRfY291bnRfZ2V0KGZyYW1lKTsKKyAgICAgICAgaWYgKHBlbmRp
bmdGcmFtZVVubG9hZEV2ZW50cykKKyAgICAgICAgICAgIHByaW50ZigiJXMgLSBoYXMgJXUgb251
bmxvYWQgaGFuZGxlcihzKVxuIiwgZnJhbWVOYW1lLnV0ZjgoKS5kYXRhKCksIHBlbmRpbmdGcmFt
ZVVubG9hZEV2ZW50cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvbkVjb3JlRXZhc1Jlc2l6
ZShFY29yZV9FdmFzKiBlY29yZUV2YXMpCit7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAg
ICBlY29yZV9ldmFzX2dlb21ldHJ5X2dldChlY29yZUV2YXMsIDAsIDAsICZ3aWR0aCwgJmhlaWdo
dCk7CisgICAgZXZhc19vYmplY3RfbW92ZShicm93c2VyLCAwLCAwKTsKKyAgICBldmFzX29iamVj
dF9yZXNpemUoYnJvd3Nlciwgd2lkdGgsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uQ2xv
c2VXaW5kb3coRWNvcmVfRXZhcyopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworc3Rh
dGljIEVpbmFfQm9vbCB1c2VMb25nUnVubmluZ1NlcnZlck1vZGUoaW50IGFyZ2MsIGNoYXIqKiBh
cmd2KQoreworICAgIHJldHVybiAoYXJnYyA9PSBvcHRpbmQgKyAxICYmICFzdHJjbXAoYXJndltv
cHRpbmRdLCAiLSIpKTsKK30KKworc3RhdGljIGJvb2wgcGFyc2VDb21tYW5kTGluZU9wdGlvbnMo
aW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIHN0YXRpYyBjb25zdCBvcHRpb24gb3B0aW9u
c1tdID0geworICAgICAgICB7Im5vdHJlZSIsIG5vX2FyZ3VtZW50LCAmZHVtcFRyZWUsIGZhbHNl
fSwKKyAgICAgICAgeyJwaXhlbC10ZXN0cyIsIG5vX2FyZ3VtZW50LCAmZHVtcFBpeGVscywgdHJ1
ZX0sCisgICAgICAgIHsidHJlZSIsIG5vX2FyZ3VtZW50LCAmZHVtcFRyZWUsIHRydWV9LAorICAg
ICAgICB7Imd1aSIsIG5vX2FyZ3VtZW50LCAmdXNlWDExV2luZG93LCB0cnVlfSwKKyAgICAgICAg
ezAsIDAsIDAsIDB9CisgICAgfTsKKyAgICBpbnQgb3B0aW9uOworCisgICAgd2hpbGUgKChvcHRp
b24gPSBnZXRvcHRfbG9uZyhhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YsICIiLCBvcHRpb25zLCAw
KSkgIT0gLTEpIHsKKyAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgY2FzZSAnPyc6
CisgICAgICAgIGNhc2UgJzonOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0RGVmYXVs
dHNUb0NvbnNpc3RlbnRWYWx1ZXMoKQoreworICAgIGV3a19zZXR0aW5nc19pY29uX2RhdGFiYXNl
X2NsZWFyKCk7CisgICAgZXdrX3NldHRpbmdzX2ljb25fZGF0YWJhc2VfcGF0aF9zZXQoMCk7CisK
KyAgICBld2tfdmlld19zZXR0aW5nX3ByaXZhdGVfYnJvd3Npbmdfc2V0KGJyb3dzZXIsIEVJTkFf
RkFMU0UpOworICAgIGV3a192aWV3X3NldHRpbmdfc3BhdGlhbF9uYXZpZ2F0aW9uX3NldChicm93
c2VyLCBFSU5BX0ZBTFNFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9mcmFtZV9mbGF0
dGVuaW5nX3NldChicm93c2VyLCBFSU5BX0ZBTFNFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX29m
ZmxpbmVfYXBwX2NhY2hlX3NldChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3Nl
dHRpbmdfZW5hYmxlX3NjcmlwdHNfc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3Zp
ZXdfc2V0dGluZ19mb250X3N0YW5kYXJkX3NldChicm93c2VyLCAiVGltZXMiKTsKKyAgICBld2tf
dmlld19zZXR0aW5nX2ZvbnRfbW9ub3NwYWNlX3NldChicm93c2VyLCAiQ291cmllciIpOworICAg
IGV3a192aWV3X3NldHRpbmdfZm9udF9zZXJpZl9zZXQoYnJvd3NlciwgIlRpbWVzIik7CisgICAg
ZXdrX3ZpZXdfc2V0dGluZ19mb250X3NhbnNfc2VyaWZfc2V0KGJyb3dzZXIsICJIZWx2ZXRpY2Ei
KTsKKyAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfY3Vyc2l2ZV9zZXQoYnJvd3NlciwgImN1cnNp
dmUiKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfZmFudGFzeV9zZXQoYnJvd3NlciwgImZh
bnRhc3kiKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfZGVmYXVsdF9zaXplX3NldChicm93
c2VyLCAxMik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9zcGFjZV9zaXplX3NldChi
cm93c2VyLCAxMCk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fc2l6ZV9zZXQo
YnJvd3NlciwgMCk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19jYXJldF9icm93c2luZ19zZXQoYnJv
d3NlciwgRUlOQV9GQUxTRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19wYWdlX2NhY2hlX3NldChi
cm93c2VyLCBFSU5BX0ZBTFNFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9hdXRvX3Jl
c2l6ZV93aW5kb3dfc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGlu
Z19lbmFibGVfcGx1Z2luc19zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19z
ZXR0aW5nX3NjcmlwdHNfd2luZG93X29wZW5fc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAg
ZXdrX3ZpZXdfc2V0dGluZ19zY3JpcHRzX3dpbmRvd19jbG9zZV9zZXQoYnJvd3NlciwgRUlOQV9U
UlVFKTsKKworICAgIGV3a192aWV3X3pvb21fc2V0KGJyb3dzZXIsIDEuMCwgMCwgMCk7CisKKyAg
ICBFd2tfSGlzdG9yeSogaGlzdG9yeSA9IGV3a192aWV3X2hpc3RvcnlfZ2V0KGJyb3dzZXIpOwor
ICAgIGludCBsaW1pdCA9IGV3a19oaXN0b3J5X2xpbWl0X2dldChoaXN0b3J5KTsKKyAgICBld2tf
aGlzdG9yeV9saW1pdF9zZXQoaGlzdG9yeSwgMCk7CisgICAgZXdrX2hpc3RvcnlfbGltaXRfc2V0
KGhpc3RvcnksIGxpbWl0KTsKKworICAgIGV3a19jb29raWVzX2NsZWFyKCk7CisgICAgZXdrX2Nv
b2tpZXNfcG9saWN5X3NldChFV0tfQ09PS0lFX0pBUl9BQ0NFUFRfTk9fVEhJUkRfUEFSVFkpOwor
CisgICAgZXdrX2ZyYW1lX29wZW5lcl9jbGVhcihld2tfdmlld19mcmFtZV9tYWluX2dldChicm93
c2VyKSk7Cit9CisKK3N0YXRpYyBTdHJpbmcgZ2V0RmluYWxUZXN0VVJMKGNvbnN0IFN0cmluZyYg
dGVzdFVSTCkKK3sKKyAgICBjb25zdCBzaXplX3QgaGFzaFNlcGFyYXRvclBvcyA9IHRlc3RVUkwu
ZmluZCgiJyIpOworICAgIGlmIChoYXNoU2VwYXJhdG9yUG9zICE9IG5vdEZvdW5kKQorICAgICAg
ICByZXR1cm4gdGVzdFVSTC5sZWZ0KGhhc2hTZXBhcmF0b3JQb3MpOworCisgICAgLy8gQ29udmVy
dCB0aGUgcGF0aCBpbnRvIGEgZnVsbCBmaWxlIFVSTCBpZiBpdCBkb2VzIG5vdCBsb29rCisgICAg
Ly8gbGlrZSBhbiBIVFRQL1MgVVJMIChkb2Vzbid0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRw
czovLykuCisgICAgaWYgKCF0ZXN0VVJMLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAmJiAhdGVzdFVS
TC5zdGFydHNXaXRoKCJodHRwczovLyIpKSB7CisgICAgICAgIE93bkZhc3RNYWxsb2NQdHI8Y2hh
cj4gZmlsZVBhdGgoZWNvcmVfZmlsZV9yZWFscGF0aCh0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpKTsK
KworICAgICAgICBpZiAoZWNvcmVfZmlsZV9leGlzdHMoZmlsZVBhdGguZ2V0KCkpKQorICAgICAg
ICAgICAgcmV0dXJuIFN0cmluZygiZmlsZTovLyIpICsgU3RyaW5nOjpmcm9tVVRGOChmaWxlUGF0
aC5nZXQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRlc3RVUkw7Cit9CisKK3N0YXRpYyBTdHJp
bmcgZ2V0RXhwZWN0ZWRQaXhlbEhhc2goY29uc3QgU3RyaW5nJiB0ZXN0VVJMKQoreworICAgIGNv
bnN0IHNpemVfdCBoYXNoU2VwYXJhdG9yUG9zID0gdGVzdFVSTC5maW5kKCInIik7CisgICAgcmV0
dXJuIChoYXNoU2VwYXJhdG9yUG9zID09IG5vdEZvdW5kKSA/IHRlc3RVUkwucmlnaHQoaGFzaFNl
cGFyYXRvclBvcykgOiBTdHJpbmcoKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlTGF5b3V0VGVz
dENvbnRyb2xsZXIoY29uc3QgU3RyaW5nJiB0ZXN0VVJMLCBjb25zdCBTdHJpbmcmIGV4cGVjdGVk
UGl4ZWxIYXNoKQoreworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlciA9CisgICAgICAgIExheW91
dFRlc3RDb250cm9sbGVyOjpjcmVhdGUoc3RkOjpzdHJpbmcodGVzdFVSTC51dGY4KCkuZGF0YSgp
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhleHBl
Y3RlZFBpeGVsSGFzaC51dGY4KCkuZGF0YSgpKSk7CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAw
OworICAgIGRvbmUgPSBmYWxzZTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0SWNv
bkRhdGFiYXNlRW5hYmxlZChmYWxzZSk7CisKKyAgICBpZiAoc2hvdWxkTG9nRnJhbWVMb2FkRGVs
ZWdhdGVzKHRlc3RVUkwpKQorICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBG
cmFtZUxvYWRDYWxsYmFja3ModHJ1ZSk7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNl
dERldmVsb3BlckV4dHJhc0VuYWJsZWQodHJ1ZSk7CisKKyAgICBpZiAoc2hvdWxkRHVtcEFzVGV4
dCh0ZXN0VVJMKSkgeworICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBBc1Rl
eHQodHJ1ZSk7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQaXhl
bFJlc3VsdHMoZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcnVuVGVzdChjb25zdCBj
aGFyKiBjVGVzdFBhdGhPclVSTCkKK3sKKyAgICBjb25zdCBTdHJpbmcgdGVzdFBhdGhPclVSTCA9
IFN0cmluZzo6ZnJvbVVURjgoY1Rlc3RQYXRoT3JVUkwpOworICAgIEFTU0VSVCghdGVzdFBhdGhP
clVSTC5pc0VtcHR5KCkpOworCisgICAgY29uc3QgU3RyaW5nIHRlc3RVUkwgPSBnZXRGaW5hbFRl
c3RVUkwodGVzdFBhdGhPclVSTCk7CisgICAgY29uc3QgU3RyaW5nIGV4cGVjdGVkUGl4ZWxIYXNo
ID0gZ2V0RXhwZWN0ZWRQaXhlbEhhc2godGVzdFBhdGhPclVSTCk7CisKKyAgICByZXNldERlZmF1
bHRzVG9Db25zaXN0ZW50VmFsdWVzKCk7CisgICAgY3JlYXRlTGF5b3V0VGVzdENvbnRyb2xsZXIo
dGVzdFVSTCwgZXhwZWN0ZWRQaXhlbEhhc2gpOworCisgICAgV29ya1F1ZXVlOjpzaGFyZWQoKS0+
Y2xlYXIoKTsKKyAgICBXb3JrUXVldWU6OnNoYXJlZCgpLT5zZXRGcm96ZW4oZmFsc2UpOworCisg
ICAgY29uc3QgYm9vbCBpc1NWR1czQ1Rlc3QgPSB0ZXN0VVJMLmNvbnRhaW5zKCJzdmcvVzNDLVNW
Ry0xLjEiKTsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBpc1NWR1czQ1Rlc3QgPyA0ODAgOiBMYXlv
dXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld1dpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBp
c1NWR1czQ1Rlc3QgPyAzNjAgOiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld0hlaWdodDsK
KyAgICBldmFzX29iamVjdF9yZXNpemUoYnJvd3Nlciwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBp
ZiAocHJldlRlc3RCRkl0ZW0pCisgICAgICAgIGV3a19oaXN0b3J5X2l0ZW1fZnJlZShwcmV2VGVz
dEJGSXRlbSk7CisgICAgY29uc3QgRXdrX0hpc3RvcnkqIGhpc3RvcnkgPSBld2tfdmlld19oaXN0
b3J5X2dldChicm93c2VyKTsKKyAgICBwcmV2VGVzdEJGSXRlbSA9IGV3a19oaXN0b3J5X2hpc3Rv
cnlfaXRlbV9jdXJyZW50X2dldChoaXN0b3J5KTsKKworICAgIGV2YXNfb2JqZWN0X2ZvY3VzX3Nl
dChicm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3VyaV9zZXQoYnJvd3NlciwgdGVz
dFVSTC51dGY4KCkuZGF0YSgpKTsKKworICAgIGVjb3JlX21haW5fbG9vcF9iZWdpbigpOworCisg
ICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5jbG9zZVdlYkluc3BlY3RvcigpOworICAgIGdMYXlv
dXRUZXN0Q29udHJvbGxlci0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZChmYWxzZSk7CisKKyAg
ICBld2tfdmlld191cmlfc2V0KGJyb3dzZXIsICJhYm91dDpibGFuayIpOworCisgICAgZ0xheW91
dFRlc3RDb250cm9sbGVyLmNsZWFyKCk7CisgICAgc2VuZFBpeGVsUmVzdWx0c0VPRigpOworfQor
CitzdGF0aWMgdm9pZCBydW5UZXN0aW5nU2VydmVyTG9vcCgpCit7CisgICAgY2hhciBmaWxlbmFt
ZVtQQVRIX01BWF07CisKKyAgICB3aGlsZSAoZmdldHMoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFt
ZSksIHN0ZGluKSkgeworICAgICAgICBjaGFyKiBuZXdMaW5lID0gc3RycmNocihmaWxlbmFtZSwg
J1xuJyk7CisgICAgICAgIGlmIChuZXdMaW5lKQorICAgICAgICAgICAgKm5ld0xpbmUgPSAnXDAn
OworCisgICAgICAgIGlmIChmaWxlbmFtZVswXSAhPSAnXDAnKQorICAgICAgICAgICAgcnVuVGVz
dChmaWxlbmFtZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGp1c3RPdXRwdXRUeXBlQnlN
aW1lVHlwZSgpCit7CisgICAgT3duRmFzdE1hbGxvY1B0cjxjaGFyPiByZXNwb25zZU1pbWVUeXBl
KGV3a19mcmFtZV9yZXNwb25zZV9taW1lX3R5cGVfZ2V0KG1haW5GcmFtZSkpOworICAgIGlmIChy
ZXNwb25zZU1pbWVUeXBlLmdldCgpICYmICFzdHJjbXAocmVzcG9uc2VNaW1lVHlwZS5nZXQoKSwg
InRleHQvcGxhaW4iKSkgeworICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBB
c1RleHQodHJ1ZSk7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQ
aXhlbFJlc3VsdHMoZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHVtcEZyYW1lQ29u
dGVudHNBc1RleHQoKQoreworICAgIFN0cmluZyByZXN1bHQ7CisgICAgaWYgKGdMYXlvdXRUZXN0
Q29udHJvbGxlci0+ZHVtcEFzVGV4dCgpKQorICAgICAgICByZXN1bHQgPSBkdW1wRnJhbWVzQXNU
ZXh0KG1haW5GcmFtZSk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBTdHJpbmc6OmZyb21V
VEY4KGV3a19mcmFtZV9yZW5kZXJfdHJlZV9kdW1wX2dldChtYWluRnJhbWUpKTsKKworICAgIHBy
aW50ZigiJXMiLCByZXN1bHQudXRmOCgpLmRhdGEoKSk7Cit9CisKK3N0YXRpYyBib29sIHNob3Vs
ZER1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKCkKK3sKKyAgICByZXR1cm4gZ0xheW91dFRlc3RDb250
cm9sbGVyLT5kdW1wQXNUZXh0KCkgJiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcERPTUFz
V2ViQXJjaGl2ZSgpICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBTb3VyY2VBc1dlYkFy
Y2hpdmUoKTsKK30KKworc3RhdGljIGJvb2wgc2hvdWxkRHVtcFBpeGVsc0FuZENvbXBhcmVXaXRo
RXhwZWN0ZWQoKQoreworICAgIHJldHVybiBkdW1wUGl4ZWxzICYmIGdMYXlvdXRUZXN0Q29udHJv
bGxlci0+Z2VuZXJhdGVQaXhlbFJlc3VsdHMoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5k
dW1wRE9NQXNXZWJBcmNoaXZlKCkgJiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcFNvdXJj
ZUFzV2ViQXJjaGl2ZSgpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGREdW1wQmFja0ZvcndhcmRM
aXN0KCkKK3sKKyAgICByZXR1cm4gZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQmFja0Zvcndh
cmRMaXN0KCk7Cit9CisKK3N0YXRpYyBib29sIGluaXRFZmwoKQoreworICAgIGlmICghZWNvcmVf
ZXZhc19pbml0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWVjb3JlX2ZpbGVf
aW5pdCgpKSB7CisgICAgICAgIGVjb3JlX2V2YXNfc2h1dGRvd24oKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyAgICBpZiAoIWVkamVfaW5pdCgpKSB7CisgICAgICAgIGVjb3JlX2Zp
bGVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZXdrX2luaXQoKSkgeworICAgICAgICBlZGpl
X3NodXRkb3duKCk7CisgICAgICAgIGVjb3JlX2ZpbGVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNv
cmVfZXZhc19zaHV0ZG93bigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
cmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHNodXRkb3duRWZsKCkKK3sKKyAgICBld2tf
c2h1dGRvd24oKTsKKyAgICBlZGplX3NodXRkb3duKCk7CisgICAgZWNvcmVfZmlsZV9zaHV0ZG93
bigpOworICAgIGVjb3JlX2V2YXNfc2h1dGRvd24oKTsKK30KKwordm9pZCBkaXNwbGF5V2ViVmll
dygpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBkdW1wKCkKK3sKKyAgICBp
bnZhbGlkYXRlQW55UHJldmlvdXNXYWl0VG9EdW1wV2F0Y2hkb2coKTsKKworICAgIGlmIChkdW1w
VHJlZSkgeworICAgICAgICBhZGp1c3RPdXRwdXRUeXBlQnlNaW1lVHlwZSgpOworICAgICAgICBk
dW1wRnJhbWVDb250ZW50c0FzVGV4dCgpOworCisgICAgICAgIGlmIChzaG91bGREdW1wRnJhbWVT
Y3JvbGxQb3NpdGlvbigpKQorICAgICAgICAgICAgZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24obWFp
bkZyYW1lKTsKKworICAgICAgICBpZiAoc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlzdCgpKQorICAg
ICAgICAgICAgZHVtcEJhY2tGb3J3YXJkTGlzdEZvcldlYlZpZXcoYnJvd3Nlcik7CisKKyAgICAg
ICAgaWYgKHByaW50U2VwYXJhdG9ycykgeworICAgICAgICAgICAgcHV0cygiI0VPRiIpOworICAg
ICAgICAgICAgZnB1dHMoIiNFT0ZcbiIsIHN0ZGVycik7CisgICAgICAgICAgICBmZmx1c2goc3Rk
b3V0KTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVkKCkpCisgICAgICAg
IGR1bXBXZWJWaWV3QXNQaXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVkKGdMYXlvdXRUZXN0Q29u
dHJvbGxlci0+ZXhwZWN0ZWRQaXhlbEhhc2goKSk7CisKKyAgICBkb25lID0gdHJ1ZTsKKyAgICBl
Y29yZV9tYWluX2xvb3BfcXVpdCgpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVCcm93c2VyKEV2
YXMqIGV2YXMsIEdDQ29udHJvbGxlciogZ2NDb250cm9sbGVyKQoreworICAgIGJyb3dzZXIgPSBk
cnRWaWV3VGlsZWRBZGQoZXZhcyk7CisgICAgaWYgKCFicm93c2VyKSB7CisgICAgICAgIHNodXRk
b3duRWZsKCk7CisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgICBld2tf
dmlld190aGVtZV9zZXQoYnJvd3NlciwgREFUQV9ESVIiL2RlZmF1bHQuZWRqIik7CisKKyAgICBl
dmFzX29iamVjdF9uYW1lX3NldChicm93c2VyLCAiYnJvd3NlciIpOworICAgIGV2YXNfb2JqZWN0
X21vdmUoYnJvd3NlciwgMCwgMCk7CisgICAgZXZhc19vYmplY3RfcmVzaXplKGJyb3dzZXIsIDgw
MCwgNjAwKTsKKyAgICBldmFzX29iamVjdF9sYXllcl9zZXQoYnJvd3NlciwgRVZBU19MQVlFUl9N
QVgpOworICAgIGV2YXNfb2JqZWN0X3Nob3coYnJvd3Nlcik7CisgICAgZXZhc19vYmplY3RfZm9j
dXNfc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxs
YmFja19hZGQoYnJvd3NlciwgImxvYWQsc3RhcnRlZCIsIG9uTG9hZFN0YXJ0ZWQsIDApOworICAg
IGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChicm93c2VyLCAibG9hZCxmaW5pc2hlZCIs
IG9uTG9hZEZpbmlzaGVkLCAwKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQo
YnJvd3NlciwgInRpdGxlLGNoYW5nZWQiLCBvblRpdGxlQ2hhbmdlZCwgMCk7CisgICAgZXZhc19v
YmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJ3aW5kb3csb2JqZWN0LGNsZWFyZWQi
LCBvbldpbmRvd09iamVjdENsZWFyZWQsIGdjQ29udHJvbGxlcik7CisgICAgZXZhc19vYmplY3Rf
c21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJzdGF0dXNiYXIsdGV4dCxzZXQiLCBvblN0YXR1
c2JhclRleHRTZXQsIDApOworCisgICAgbWFpbkZyYW1lID0gZXdrX3ZpZXdfZnJhbWVfbWFpbl9n
ZXQoYnJvd3Nlcik7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKG1haW5GcmFt
ZSwgImxvYWQsZG9jdW1lbnQsZmluaXNoZWQiLCBvbkRvY3VtZW50TG9hZEZpbmlzaGVkLCAwKTsK
K30KKworc3RhdGljIEVjb3JlX0V2YXMqIGluaXRFY29yZUV2YXMoKQoreworICAgIEVjb3JlX0V2
YXMqIGVjb3JlRXZhcyA9IHVzZVgxMVdpbmRvdyA/IGVjb3JlX2V2YXNfbmV3KDAsIDAsIDAsIDgw
MCwgNjAwLCAwKSA6IGVjb3JlX2V2YXNfYnVmZmVyX25ldyg4MDAsIDYwMCk7CisgICAgaWYgKCFl
Y29yZUV2YXMpIHsKKyAgICAgICAgc2h1dGRvd25FZmwoKTsKKyAgICAgICAgZXhpdChFWElUX0ZB
SUxVUkUpOworICAgIH0KKworICAgIGVjb3JlX2V2YXNfdGl0bGVfc2V0KGVjb3JlRXZhcywgIkVG
TCBEdW1wUmVuZGVyVHJlZSIpOworICAgIGVjb3JlX2V2YXNfY2FsbGJhY2tfcmVzaXplX3NldChl
Y29yZUV2YXMsIG9uRWNvcmVFdmFzUmVzaXplKTsKKyAgICBlY29yZV9ldmFzX2NhbGxiYWNrX2Rl
bGV0ZV9yZXF1ZXN0X3NldChlY29yZUV2YXMsIG9uQ2xvc2VXaW5kb3cpOworICAgIGVjb3JlX2V2
YXNfc2hvdyhlY29yZUV2YXMpOworCisgICAgcmV0dXJuIGVjb3JlRXZhczsKK30KKworaW50IG1h
aW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGlmICghcGFyc2VDb21tYW5kTGluZU9w
dGlvbnMoYXJnYywgYXJndikpCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisKKyAgICBp
ZiAoIWluaXRFZmwoKSkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAgIE93blB0
cjxFY29yZV9FdmFzPiBlY29yZUV2YXMgPSBhZG9wdFB0cihpbml0RWNvcmVFdmFzKCkpOworICAg
IE93blB0cjxHQ0NvbnRyb2xsZXI+IGdjQ29udHJvbGxlciA9IGFkb3B0UHRyKG5ldyBHQ0NvbnRy
b2xsZXIpOworICAgIGNyZWF0ZUJyb3dzZXIoZWNvcmVfZXZhc19nZXQoZWNvcmVFdmFzLmdldCgp
KSwgZ2NDb250cm9sbGVyLmdldCgpKTsKKyAgICBhZGRGb250c1RvRW52aXJvbm1lbnQoKTsKKwor
ICAgIGlmICh1c2VMb25nUnVubmluZ1NlcnZlck1vZGUoYXJnYywgYXJndikpIHsKKyAgICAgICAg
cHJpbnRTZXBhcmF0b3JzID0gdHJ1ZTsKKyAgICAgICAgcnVuVGVzdGluZ1NlcnZlckxvb3AoKTsK
KyAgICB9IGVsc2UgeworICAgICAgICBwcmludFNlcGFyYXRvcnMgPSAob3B0aW5kIDwgYXJnYyAt
IDEgfHwgKGR1bXBQaXhlbHMgJiYgZHVtcFRyZWUpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9w
dGluZDsgaSAhPSBhcmdjOyArK2kpCisgICAgICAgICAgICBydW5UZXN0KGFyZ3ZbaV0pOworICAg
IH0KKworICAgIGVjb3JlRXZhcy5jbGVhcigpOworCisgICAgc2h1dGRvd25FZmwoKTsKKyAgICBy
ZXR1cm4gRVhJVF9TVUNDRVNTOworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>100819</attachid>
            <date>2011-07-14 10:01:20 -0700</date>
            <delta_ts>2011-08-19 13:06:28 -0700</delta_ts>
            <desc>Fix up getFinalTestURL() to return URL scheme even if URL contains a pixel test hash</desc>
            <filename>bug-62034-20110714140446.patch</filename>
            <type>text/plain</type>
            <size>20596</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTEwMDQKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCAwOGNlMTRkOTZjYzM0MjgyNWQxMWYyNDEyMmZkOTVhMGIw
Mjc4MzU5Li5mNDU0MTk3MWY5Mzg0MzkwNWIxNTgyMDczZjA0Mzc1ODYyOGRkNzBhIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTEg
QEAKKzIwMTEtMDctMTQgIFJhcGhhZWwgS3VibyBkYSBDb3N0YSAgPGt1Ym9AcHJvZnVzaW9uLm1v
Ymk+CisKKyAgICAgICAgW0VGTF0gRFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MjAzNAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgaXMgdGhlIG1haW4g
ZmlsZSBmb3IgRUZMJ3MgRHVtcFJlbmRlclRyZWUgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICAg
IGVmZmVjdGl2ZWx5IHJ1bnMgdGhlIHRlc3RzLgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUv
ZWZsL0R1bXBSZW5kZXJUcmVlLmNwcDogQWRkZWQuCisgICAgICAgIChkdW1wRnJhbWVzQXNUZXh0
KToKKyAgICAgICAgKGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZExv
Z0ZyYW1lTG9hZERlbGVnYXRlcyk6CisgICAgICAgIChzaG91bGREdW1wQXNUZXh0KToKKyAgICAg
ICAgKHNlbmRQaXhlbFJlc3VsdHNFT0YpOgorICAgICAgICAoaW52YWxpZGF0ZUFueVByZXZpb3Vz
V2FpdFRvRHVtcFdhdGNoZG9nKToKKyAgICAgICAgKHByb2Nlc3NXb3JrKToKKyAgICAgICAgKGFk
ZENvbnRyb2xsZXJUb1dpbmRvdyk6CisgICAgICAgIChvbldpbmRvd09iamVjdENsZWFyZWQpOgor
ICAgICAgICAob25TdGF0dXNiYXJUZXh0U2V0KToKKyAgICAgICAgKG9uTG9hZFN0YXJ0ZWQpOgor
ICAgICAgICAob25Mb2FkRmluaXNoZWQpOgorICAgICAgICAob25UaXRsZUNoYW5nZWQpOgorICAg
ICAgICAob25Eb2N1bWVudExvYWRGaW5pc2hlZCk6CisgICAgICAgIChvbkVjb3JlRXZhc1Jlc2l6
ZSk6CisgICAgICAgIChvbkNsb3NlV2luZG93KToKKyAgICAgICAgKHVzZUxvbmdSdW5uaW5nU2Vy
dmVyTW9kZSk6CisgICAgICAgIChwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyk6CisgICAgICAgIChy
ZXNldERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKToKKyAgICAgICAgKGdldEZpbmFsVGVzdFVS
TCk6CisgICAgICAgIChnZXRFeHBlY3RlZFBpeGVsSGFzaCk6CisgICAgICAgIChjcmVhdGVMYXlv
dXRUZXN0Q29udHJvbGxlcik6CisgICAgICAgIChydW5UZXN0KToKKyAgICAgICAgKHJ1blRlc3Rp
bmdTZXJ2ZXJMb29wKToKKyAgICAgICAgKGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKToKKyAg
ICAgICAgKGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KToKKyAgICAgICAgKHNob3VsZER1bXBGcmFt
ZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0
aEV4cGVjdGVkKToKKyAgICAgICAgKHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3QpOgorICAgICAg
ICAoaW5pdEVmbCk6CisgICAgICAgIChzaHV0ZG93bkVmbCk6CisgICAgICAgIChkaXNwbGF5V2Vi
Vmlldyk6CisgICAgICAgIChkdW1wKToKKyAgICAgICAgKGNyZWF0ZUJyb3dzZXIpOgorICAgICAg
ICAoaW5pdEVjb3JlRXZhcyk6CisgICAgICAgIChtYWluKToKKwogMjAxMS0wNy0xNCAgQWRhbSBC
YXJ0aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIEZpeCBQeXRob24gZXhjZXB0aW9u
IGJsb2NraW5nIHRoZSBjb21taXQtcXVldWUuCmRpZmYgLS1naXQgYS9Ub29scy9EdW1wUmVuZGVy
VHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1
bXBSZW5kZXJUcmVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44YTNkM2JmZWRkNDY1ODNlNjE5NTBlYzI4Mzdi
ODQzOWE4MWZlMzY5Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZs
L0R1bXBSZW5kZXJUcmVlLmNwcApAQCAtMCwwICsxLDU3MCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDEx
IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJEdW1wUmVuZGVyVHJlZS5oIgorCisjaW5jbHVkZSAiRHVtcEhpc3RvcnlJdGVtLmgi
CisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWVWaWV3LmgiCisjaW5jbHVkZSAiRXZlbnRTZW5kZXIu
aCIKKyNpbmNsdWRlICJGb250TWFuYWdlbWVudC5oIgorI2luY2x1ZGUgIkdDQ29udHJvbGxlci5o
IgorI2luY2x1ZGUgIkxheW91dFRlc3RDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiTm90SW1wbGVt
ZW50ZWQuaCIKKyNpbmNsdWRlICJQaXhlbER1bXBTdXBwb3J0LmgiCisjaW5jbHVkZSAiV29ya1F1
ZXVlLmgiCisjaW5jbHVkZSAiZXdrX3ByaXZhdGUuaCIgLy8gRklYTUU6IGNyZWF0ZSBzb21lIFdl
YkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlLmNwcCBpbnN0ZWFkCisjaW5jbHVkZSA8RVdlYktp
dC5oPgorI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5jbHVkZSA8RWNvcmVfRXZhcy5oPgorI2luY2x1
ZGUgPEVjb3JlX0ZpbGUuaD4KKyNpbmNsdWRlIDxFZGplLmg+CisjaW5jbHVkZSA8RXZhcy5oPgor
I2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgor
I2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUg
PHVuaXN0ZC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25GYXN0TWFsbG9jUHRyLmg+CisjaW5jbHVkZSA8
d3RmL093blB0ci5oPgorCitFdmFzX09iamVjdCogYnJvd3NlciA9IDA7CitFdmFzX09iamVjdCog
bWFpbkZyYW1lID0gMDsKK0V2YXNfT2JqZWN0KiB0b3BMb2FkaW5nRnJhbWUgPSAwOworYm9vbCB3
YWl0Rm9yUG9saWN5ID0gZmFsc2U7CitFY29yZV9UaW1lciogd2FpdFRvRHVtcFdhdGNoZG9nID0g
MDsKK2V4dGVybiBFd2tfSGlzdG9yeV9JdGVtKiBwcmV2VGVzdEJGSXRlbTsKKworLy8gRnJvbSB0
aGUgdG9wLWxldmVsIER1bXBSZW5kZXJUcmVlLmgKK1JlZlB0cjxMYXlvdXRUZXN0Q29udHJvbGxl
cj4gZ0xheW91dFRlc3RDb250cm9sbGVyOwordm9sYXRpbGUgYm9vbCBkb25lID0gZmFsc2U7CisK
K3N0YXRpYyBpbnQgZHVtcFBpeGVscyA9IGZhbHNlOworc3RhdGljIGludCBkdW1wVHJlZSA9IHRy
dWU7CitzdGF0aWMgaW50IHByaW50U2VwYXJhdG9ycyA9IHRydWU7CitzdGF0aWMgaW50IHVzZVgx
MVdpbmRvdyA9IGZhbHNlOworCitzdGF0aWMgU3RyaW5nIGR1bXBGcmFtZXNBc1RleHQoRXZhc19P
YmplY3QqIGZyYW1lKQoreworICAgIFN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoZXdrX3ZpZXdf
ZnJhbWVfbWFpbl9nZXQoYnJvd3NlcikgIT0gZnJhbWUpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVu
ZCgiXG4tLS0tLS0tLVxuRnJhbWU6ICciKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmc6
OmZyb21VVEY4KGV3a19mcmFtZV9uYW1lX2dldChmcmFtZSkpKTsKKyAgICAgICAgcmVzdWx0LmFw
cGVuZCgiJ1xuLS0tLS0tLS1cbiIpOworICAgIH0KKworICAgIHJlc3VsdC5hcHBlbmQoZXdrX2Zy
YW1lX2lubmVyX3RleHRfZ2V0KGZyYW1lKSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKwor
ICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpKSB7
CisgICAgICAgIEVpbmFfSXRlcmF0b3IqIGNoaWxkcmVuID0gZXdrX2ZyYW1lX2NoaWxkcmVuX2l0
ZXJhdG9yX25ldyhmcmFtZSk7CisgICAgICAgIEV2YXNfT2JqZWN0KiBjaGlsZDsKKworICAgICAg
ICBFSU5BX0lURVJBVE9SX0ZPUkVBQ0goY2hpbGRyZW4sIGNoaWxkKSB7CisgICAgICAgICAgICBT
dHJpbmcgdGVtcFRleHQoZHVtcEZyYW1lc0FzVGV4dChjaGlsZCkpOworCisgICAgICAgICAgICBp
ZiAodGVtcFRleHQuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgICAgICByZXN1bHQuYXBwZW5kKHRlbXBUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGVp
bmFfaXRlcmF0b3JfZnJlZShjaGlsZHJlbik7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsK
K30KKworc3RhdGljIHZvaWQgZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oRXZhc19PYmplY3QqKQor
eworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZExvZ0ZyYW1l
TG9hZERlbGVnYXRlcyhjb25zdCBTdHJpbmcmIHBhdGhPclVSTCkKK3sKKyAgICByZXR1cm4gcGF0
aE9yVVJMLmNvbnRhaW5zKCJsb2FkaW5nLyIpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGREdW1w
QXNUZXh0KGNvbnN0IFN0cmluZyYgcGF0aE9yVVJMKQoreworICAgIHJldHVybiBwYXRoT3JVUkwu
Y29udGFpbnMoImR1bXBBc1RleHQvIik7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRQaXhlbFJlc3Vs
dHNFT0YoKQoreworICAgIHB1dHMoIiNFT0YiKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBm
Zmx1c2goc3RkZXJyKTsKK30KKworc3RhdGljIHZvaWQgaW52YWxpZGF0ZUFueVByZXZpb3VzV2Fp
dFRvRHVtcFdhdGNoZG9nKCkKK3sKKyAgICBpZiAod2FpdFRvRHVtcFdhdGNoZG9nKSB7CisgICAg
ICAgIGVjb3JlX3RpbWVyX2RlbCh3YWl0VG9EdW1wV2F0Y2hkb2cpOworICAgICAgICB3YWl0VG9E
dW1wV2F0Y2hkb2cgPSAwOworICAgIH0KKyAgICB3YWl0Rm9yUG9saWN5ID0gZmFsc2U7Cit9CisK
K3N0YXRpYyBFaW5hX0Jvb2wgcHJvY2Vzc1dvcmsodm9pZCogZGF0YSkKK3sKKyAgICBpZiAoV29y
a1F1ZXVlOjpzaGFyZWQoKS0+cHJvY2Vzc1dvcmsoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVy
LT53YWl0VG9EdW1wKCkpCisgICAgICAgIGR1bXAoKTsKKyAgICByZXR1cm4gRUNPUkVfQ0FMTEJB
Q0tfQ0FOQ0VMOworfQorCitzdGF0aWMgdm9pZCBhZGRDb250cm9sbGVyVG9XaW5kb3coSlNDb250
ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIHdpbmRvd09iamVjdCwgY29uc3QgY2hhciogY29u
dHJvbGxlck5hbWUsIEpTVmFsdWVSZWYgY29udHJvbGxlcikKK3sKKyAgICBKU1N0cmluZ1JlZiBj
b250cm9sbGVyTmFtZVN0ciA9IEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKGNvbnRyb2xs
ZXJOYW1lKTsKKyAgICBKU09iamVjdFNldFByb3BlcnR5KGNvbnRleHQsIHdpbmRvd09iamVjdCwg
Y29udHJvbGxlck5hbWVTdHIsIGNvbnRyb2xsZXIsIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9u
bHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUsIDApOworICAgIEpTU3RyaW5nUmVs
ZWFzZShjb250cm9sbGVyTmFtZVN0cik7Cit9CisKK3N0YXRpYyB2b2lkIG9uV2luZG93T2JqZWN0
Q2xlYXJlZCh2b2lkKiB1c2VyRGF0YSwgRXZhc19PYmplY3QqLCB2b2lkKiBldmVudEluZm8pCit7
CisgICAgRXdrX1dpbmRvd19PYmplY3RfQ2xlYXJlZF9FdmVudCogb2JqZWN0Q2xlYXJlZEluZm8g
PSBzdGF0aWNfY2FzdDxFd2tfV2luZG93X09iamVjdF9DbGVhcmVkX0V2ZW50Kj4oZXZlbnRJbmZv
KTsKKyAgICBKU1ZhbHVlUmVmIGV4Y2VwdGlvbiA9IDA7CisgICAgQVNTRVJUKGdMYXlvdXRUZXN0
Q29udHJvbGxlcik7CisKKyAgICBHQ0NvbnRyb2xsZXIqIGdjQ29udHJvbGxlciA9IHN0YXRpY19j
YXN0PEdDQ29udHJvbGxlcio+KHVzZXJEYXRhKTsKKyAgICBBU1NFUlQoZ2NDb250cm9sbGVyKTsK
KworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+bWFrZVdpbmRvd09iamVjdChvYmplY3RDbGVh
cmVkSW5mby0+Y29udGV4dCwgb2JqZWN0Q2xlYXJlZEluZm8tPndpbmRvd09iamVjdCwgJmV4Y2Vw
dGlvbik7CisgICAgQVNTRVJUKCFleGNlcHRpb24pOworCisgICAgZ2NDb250cm9sbGVyLT5tYWtl
V2luZG93T2JqZWN0KG9iamVjdENsZWFyZWRJbmZvLT5jb250ZXh0LCBvYmplY3RDbGVhcmVkSW5m
by0+d2luZG93T2JqZWN0LCAmZXhjZXB0aW9uKTsKKyAgICBBU1NFUlQoIWV4Y2VwdGlvbik7CisK
KyAgICAvKiBGSVhNRSBzL2ZhbHNlLyFnZXRfcGFyZW50LyAqLworICAgIGFkZENvbnRyb2xsZXJU
b1dpbmRvdyhvYmplY3RDbGVhcmVkSW5mby0+Y29udGV4dCwgb2JqZWN0Q2xlYXJlZEluZm8tPndp
bmRvd09iamVjdCwgImV2ZW50U2VuZGVyIiwgbWFrZUV2ZW50U2VuZGVyKG9iamVjdENsZWFyZWRJ
bmZvLT5jb250ZXh0LCBmYWxzZSkpOworfQorCitzdGF0aWMgdm9pZCBvblN0YXR1c2JhclRleHRT
ZXQodm9pZCosIEV2YXNfT2JqZWN0Kiwgdm9pZCogZXZlbnRJbmZvKQoreworICAgIGlmICghZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wU3RhdHVzQ2FsbGJhY2tzKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGNvbnN0IGNoYXIqIHN0YXR1c2JhclRleHQgPSBzdGF0aWNfY2FzdDxjb25zdCBj
aGFyKj4oZXZlbnRJbmZvKTsKKyAgICBwcmludGYoIlVJIERFTEVHQVRFIFNUQVRVUyBDQUxMQkFD
Szogc2V0U3RhdHVzVGV4dDolc1xuIiwgc3RhdHVzYmFyVGV4dCk7Cit9CisKK3N0YXRpYyB2b2lk
IG9uTG9hZFN0YXJ0ZWQodm9pZCosIEV2YXNfT2JqZWN0KiB2aWV3LCB2b2lkKikKK3sKKyAgICAv
LyBGSVhNRTogd2UgYWN0dWFsbHkgbmVlZCB0aGUgZnJhbWUgcmVsYXRlZCB0byB0aGlzIGV2ZW50
CisgICAgRXZhc19PYmplY3QqIGZyYW1lID0gZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQodmlldyk7
CisKKyAgICAvLyBNYWtlIHN1cmUgd2Ugb25seSBzZXQgdGhpcyBvbmNlIHBlciB0ZXN0LiBJZiBp
dCBnZXRzIGNsZWFyZWQsIGFuZCB0aGVuIHNldCBhZ2Fpbiwgd2UgbWlnaHQKKyAgICAvLyBlbmQg
dXAgZG9pbmcgdHdvIGR1bXBzIGZvciBvbmUgdGVzdC4KKyAgICBpZiAoIXRvcExvYWRpbmdGcmFt
ZSAmJiAhZG9uZSkKKyAgICAgICAgdG9wTG9hZGluZ0ZyYW1lID0gZnJhbWU7Cit9CisKK3N0YXRp
YyB2b2lkIG9uTG9hZEZpbmlzaGVkKHZvaWQqLCBFdmFzX09iamVjdCogdmlldywgdm9pZCopCit7
CisgICAgLy8gRklYTUU6IHdlIGFjdHVhbGx5IG5lZWQgdGhlIGZyYW1lIHJlbGF0ZWQgdG8gdGhp
cyBldmVudAorICAgIEV2YXNfT2JqZWN0KiBmcmFtZSA9IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0
KHZpZXcpOworCisgICAgaWYgKHRvcExvYWRpbmdGcmFtZSAhPSBmcmFtZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgdG9wTG9hZGluZ0ZyYW1lID0gMDsKKworICAgIFdvcmtRdWV1ZTo6c2hhcmVk
KCktPnNldEZyb3plbih0cnVlKTsKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT53YWl0
VG9EdW1wKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChXb3JrUXVldWU6OnNoYXJlZCgp
LT5jb3VudCgpKQorICAgICAgICBlY29yZV9pZGxlcl9hZGQocHJvY2Vzc1dvcmssIDApOworICAg
IGVsc2UKKyAgICAgICAgZHVtcCgpOworfQorCitzdGF0aWMgdm9pZCBvblRpdGxlQ2hhbmdlZCh2
b2lkKiwgRXZhc19PYmplY3QqLCB2b2lkKikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
CitzdGF0aWMgdm9pZCBvbkRvY3VtZW50TG9hZEZpbmlzaGVkKHZvaWQqLCBFdmFzX09iamVjdCog
ZnJhbWUsIHZvaWQqKQoreworICAgIGNvbnN0IFN0cmluZyBmcmFtZU5hbWUoZXdrX2ZyYW1lX3N1
aXRhYmxlX2RydF9uYW1lX2dldChmcmFtZSkpOworCisgICAgaWYgKCFkb25lICYmIGdMYXlvdXRU
ZXN0Q29udHJvbGxlci0+ZHVtcEZyYW1lTG9hZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYo
IiVzIC0gZGlkRmluaXNoRG9jdW1lbnRMb2FkRm9yRnJhbWVcbiIsIGZyYW1lTmFtZS51dGY4KCku
ZGF0YSgpKTsKKyAgICBlbHNlIGlmICghZG9uZSkgeworICAgICAgICBjb25zdCB1bnNpZ25lZCBw
ZW5kaW5nRnJhbWVVbmxvYWRFdmVudHMgPSBld2tfZnJhbWVfcGVuZGluZ191bmxvYWRfZXZlbnRf
Y291bnRfZ2V0KGZyYW1lKTsKKyAgICAgICAgaWYgKHBlbmRpbmdGcmFtZVVubG9hZEV2ZW50cykK
KyAgICAgICAgICAgIHByaW50ZigiJXMgLSBoYXMgJXUgb251bmxvYWQgaGFuZGxlcihzKVxuIiwg
ZnJhbWVOYW1lLnV0ZjgoKS5kYXRhKCksIHBlbmRpbmdGcmFtZVVubG9hZEV2ZW50cyk7CisgICAg
fQorfQorCitzdGF0aWMgdm9pZCBvbkVjb3JlRXZhc1Jlc2l6ZShFY29yZV9FdmFzKiBlY29yZUV2
YXMpCit7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgICBlY29yZV9ldmFzX2dlb21ldHJ5
X2dldChlY29yZUV2YXMsIDAsIDAsICZ3aWR0aCwgJmhlaWdodCk7CisgICAgZXZhc19vYmplY3Rf
bW92ZShicm93c2VyLCAwLCAwKTsKKyAgICBldmFzX29iamVjdF9yZXNpemUoYnJvd3Nlciwgd2lk
dGgsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uQ2xvc2VXaW5kb3coRWNvcmVfRXZhcyop
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworc3RhdGljIEVpbmFfQm9vbCB1c2VMb25n
UnVubmluZ1NlcnZlck1vZGUoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIHJldHVybiAo
YXJnYyA9PSBvcHRpbmQgKyAxICYmICFzdHJjbXAoYXJndltvcHRpbmRdLCAiLSIpKTsKK30KKwor
c3RhdGljIGJvb2wgcGFyc2VDb21tYW5kTGluZU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2
KQoreworICAgIHN0YXRpYyBjb25zdCBvcHRpb24gb3B0aW9uc1tdID0geworICAgICAgICB7Im5v
dHJlZSIsIG5vX2FyZ3VtZW50LCAmZHVtcFRyZWUsIGZhbHNlfSwKKyAgICAgICAgeyJwaXhlbC10
ZXN0cyIsIG5vX2FyZ3VtZW50LCAmZHVtcFBpeGVscywgdHJ1ZX0sCisgICAgICAgIHsidHJlZSIs
IG5vX2FyZ3VtZW50LCAmZHVtcFRyZWUsIHRydWV9LAorICAgICAgICB7Imd1aSIsIG5vX2FyZ3Vt
ZW50LCAmdXNlWDExV2luZG93LCB0cnVlfSwKKyAgICAgICAgezAsIDAsIDAsIDB9CisgICAgfTsK
KyAgICBpbnQgb3B0aW9uOworCisgICAgd2hpbGUgKChvcHRpb24gPSBnZXRvcHRfbG9uZyhhcmdj
LCAoY2hhciogY29uc3QqKWFyZ3YsICIiLCBvcHRpb25zLCAwKSkgIT0gLTEpIHsKKyAgICAgICAg
c3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAgIGNhc2UgJzonOgor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0RGVmYXVsdHNUb0NvbnNpc3RlbnRWYWx1ZXMo
KQoreworICAgIGV3a19zZXR0aW5nc19pY29uX2RhdGFiYXNlX2NsZWFyKCk7CisgICAgZXdrX3Nl
dHRpbmdzX2ljb25fZGF0YWJhc2VfcGF0aF9zZXQoMCk7CisKKyAgICBld2tfdmlld19zZXR0aW5n
X3ByaXZhdGVfYnJvd3Npbmdfc2V0KGJyb3dzZXIsIEVJTkFfRkFMU0UpOworICAgIGV3a192aWV3
X3NldHRpbmdfc3BhdGlhbF9uYXZpZ2F0aW9uX3NldChicm93c2VyLCBFSU5BX0ZBTFNFKTsKKyAg
ICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9mcmFtZV9mbGF0dGVuaW5nX3NldChicm93c2VyLCBF
SU5BX0ZBTFNFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX29mZmxpbmVfYXBwX2NhY2hlX3NldChi
cm93c2VyLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3NjcmlwdHNf
c2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X3N0YW5k
YXJkX3NldChicm93c2VyLCAiVGltZXMiKTsKKyAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfbW9u
b3NwYWNlX3NldChicm93c2VyLCAiQ291cmllciIpOworICAgIGV3a192aWV3X3NldHRpbmdfZm9u
dF9zZXJpZl9zZXQoYnJvd3NlciwgIlRpbWVzIik7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250
X3NhbnNfc2VyaWZfc2V0KGJyb3dzZXIsICJIZWx2ZXRpY2EiKTsKKyAgICBld2tfdmlld19zZXR0
aW5nX2ZvbnRfY3Vyc2l2ZV9zZXQoYnJvd3NlciwgImN1cnNpdmUiKTsKKyAgICBld2tfdmlld19z
ZXR0aW5nX2ZvbnRfZmFudGFzeV9zZXQoYnJvd3NlciwgImZhbnRhc3kiKTsKKyAgICBld2tfdmll
d19zZXR0aW5nX2ZvbnRfZGVmYXVsdF9zaXplX3NldChicm93c2VyLCAxMik7CisgICAgZXdrX3Zp
ZXdfc2V0dGluZ19mb250X21vbm9zcGFjZV9zaXplX3NldChicm93c2VyLCAxMCk7CisgICAgZXdr
X3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fc2l6ZV9zZXQoYnJvd3NlciwgMCk7CisgICAgZXdr
X3ZpZXdfc2V0dGluZ19jYXJldF9icm93c2luZ19zZXQoYnJvd3NlciwgRUlOQV9GQUxTRSk7Cisg
ICAgZXdrX3ZpZXdfc2V0dGluZ19wYWdlX2NhY2hlX3NldChicm93c2VyLCBFSU5BX0ZBTFNFKTsK
KyAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9hdXRvX3Jlc2l6ZV93aW5kb3dfc2V0KGJyb3dz
ZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfcGx1Z2luc19zZXQo
YnJvd3NlciwgRUlOQV9UUlVFKTsKKyAgICBld2tfdmlld19zZXR0aW5nX3NjcmlwdHNfd2luZG93
X29wZW5fc2V0KGJyb3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfc2V0dGluZ19zY3Jp
cHRzX3dpbmRvd19jbG9zZV9zZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKworICAgIGV3a192aWV3
X3pvb21fc2V0KGJyb3dzZXIsIDEuMCwgMCwgMCk7CisKKyAgICBFd2tfSGlzdG9yeSogaGlzdG9y
eSA9IGV3a192aWV3X2hpc3RvcnlfZ2V0KGJyb3dzZXIpOworICAgIGludCBsaW1pdCA9IGV3a19o
aXN0b3J5X2xpbWl0X2dldChoaXN0b3J5KTsKKyAgICBld2tfaGlzdG9yeV9saW1pdF9zZXQoaGlz
dG9yeSwgMCk7CisgICAgZXdrX2hpc3RvcnlfbGltaXRfc2V0KGhpc3RvcnksIGxpbWl0KTsKKwor
ICAgIGV3a19jb29raWVzX2NsZWFyKCk7CisgICAgZXdrX2Nvb2tpZXNfcG9saWN5X3NldChFV0tf
Q09PS0lFX0pBUl9BQ0NFUFRfTk9fVEhJUkRfUEFSVFkpOworCisgICAgZXdrX2ZyYW1lX29wZW5l
cl9jbGVhcihld2tfdmlld19mcmFtZV9tYWluX2dldChicm93c2VyKSk7Cit9CisKK3N0YXRpYyBT
dHJpbmcgZ2V0RmluYWxUZXN0VVJMKGNvbnN0IFN0cmluZyYgdGVzdFVSTCkKK3sKKyAgICBjb25z
dCBzaXplX3QgaGFzaFNlcGFyYXRvclBvcyA9IHRlc3RVUkwuZmluZCgiJyIpOworICAgIGlmICho
YXNoU2VwYXJhdG9yUG9zICE9IG5vdEZvdW5kKQorICAgICAgICByZXR1cm4gZ2V0RmluYWxUZXN0
VVJMKHRlc3RVUkwubGVmdChoYXNoU2VwYXJhdG9yUG9zKSk7CisKKyAgICAvLyBDb252ZXJ0IHRo
ZSBwYXRoIGludG8gYSBmdWxsIGZpbGUgVVJMIGlmIGl0IGRvZXMgbm90IGxvb2sKKyAgICAvLyBs
aWtlIGFuIEhUVFAvUyBVUkwgKGRvZXNuJ3Qgc3RhcnQgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8v
KS4KKyAgICBpZiAoIXRlc3RVUkwuc3RhcnRzV2l0aCgiaHR0cDovLyIpIHx8ICF0ZXN0VVJMLnN0
YXJ0c1dpdGgoImh0dHBzOi8vIikpIHsKKyAgICAgICAgT3duRmFzdE1hbGxvY1B0cjxjaGFyPiBm
aWxlUGF0aChlY29yZV9maWxlX3JlYWxwYXRoKHRlc3RVUkwudXRmOCgpLmRhdGEoKSkpOworCisg
ICAgICAgIGlmIChlY29yZV9maWxlX2V4aXN0cyhmaWxlUGF0aC5nZXQoKSkpCisgICAgICAgICAg
ICByZXR1cm4gU3RyaW5nKCJmaWxlOi8vIikgKyBTdHJpbmc6OmZyb21VVEY4KGZpbGVQYXRoLmdl
dCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVzdFVSTDsKK30KKworc3RhdGljIFN0cmluZyBn
ZXRFeHBlY3RlZFBpeGVsSGFzaChjb25zdCBTdHJpbmcmIHRlc3RVUkwpCit7CisgICAgY29uc3Qg
c2l6ZV90IGhhc2hTZXBhcmF0b3JQb3MgPSB0ZXN0VVJMLmZpbmQoIiciKTsKKyAgICByZXR1cm4g
KGhhc2hTZXBhcmF0b3JQb3MgPT0gbm90Rm91bmQpID8gdGVzdFVSTC5yaWdodChoYXNoU2VwYXJh
dG9yUG9zKSA6IFN0cmluZygpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVMYXlvdXRUZXN0Q29u
dHJvbGxlcihjb25zdCBTdHJpbmcmIHRlc3RVUkwsIGNvbnN0IFN0cmluZyYgZXhwZWN0ZWRQaXhl
bEhhc2gpCit7CisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyID0KKyAgICAgICAgTGF5b3V0VGVz
dENvbnRyb2xsZXI6OmNyZWF0ZShzdGQ6OnN0cmluZyh0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGV4cGVjdGVk
UGl4ZWxIYXNoLnV0ZjgoKS5kYXRhKCkpKTsKKworICAgIHRvcExvYWRpbmdGcmFtZSA9IDA7Cisg
ICAgZG9uZSA9IGZhbHNlOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRJY29uRGF0
YWJhc2VFbmFibGVkKGZhbHNlKTsKKworICAgIGlmIChzaG91bGRMb2dGcmFtZUxvYWREZWxlZ2F0
ZXModGVzdFVSTCkpCisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEZyYW1l
TG9hZENhbGxiYWNrcyh0cnVlKTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RGV2
ZWxvcGVyRXh0cmFzRW5hYmxlZCh0cnVlKTsKKworICAgIGlmIChzaG91bGREdW1wQXNUZXh0KHRl
c3RVUkwpKSB7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEFzVGV4dCh0
cnVlKTsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRHZW5lcmF0ZVBpeGVsUmVz
dWx0cyhmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBydW5UZXN0KGNvbnN0IGNoYXIq
IGNUZXN0UGF0aE9yVVJMKQoreworICAgIGNvbnN0IFN0cmluZyB0ZXN0UGF0aE9yVVJMID0gU3Ry
aW5nOjpmcm9tVVRGOChjVGVzdFBhdGhPclVSTCk7CisgICAgQVNTRVJUKCF0ZXN0UGF0aE9yVVJM
LmlzRW1wdHkoKSk7CisKKyAgICBjb25zdCBTdHJpbmcgdGVzdFVSTCA9IGdldEZpbmFsVGVzdFVS
TCh0ZXN0UGF0aE9yVVJMKTsKKyAgICBjb25zdCBTdHJpbmcgZXhwZWN0ZWRQaXhlbEhhc2ggPSBn
ZXRFeHBlY3RlZFBpeGVsSGFzaCh0ZXN0UGF0aE9yVVJMKTsKKworICAgIHJlc2V0RGVmYXVsdHNU
b0NvbnNpc3RlbnRWYWx1ZXMoKTsKKyAgICBjcmVhdGVMYXlvdXRUZXN0Q29udHJvbGxlcih0ZXN0
VVJMLCBleHBlY3RlZFBpeGVsSGFzaCk7CisKKyAgICBXb3JrUXVldWU6OnNoYXJlZCgpLT5jbGVh
cigpOworICAgIFdvcmtRdWV1ZTo6c2hhcmVkKCktPnNldEZyb3plbihmYWxzZSk7CisKKyAgICBj
b25zdCBib29sIGlzU1ZHVzNDVGVzdCA9IHRlc3RVUkwuY29udGFpbnMoInN2Zy9XM0MtU1ZHLTEu
MSIpOworICAgIGNvbnN0IGludCB3aWR0aCA9IGlzU1ZHVzNDVGVzdCA/IDQ4MCA6IExheW91dFRl
c3RDb250cm9sbGVyOjptYXhWaWV3V2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IGlzU1ZH
VzNDVGVzdCA/IDM2MCA6IExheW91dFRlc3RDb250cm9sbGVyOjptYXhWaWV3SGVpZ2h0OworICAg
IGV2YXNfb2JqZWN0X3Jlc2l6ZShicm93c2VyLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGlmIChw
cmV2VGVzdEJGSXRlbSkKKyAgICAgICAgZXdrX2hpc3RvcnlfaXRlbV9mcmVlKHByZXZUZXN0QkZJ
dGVtKTsKKyAgICBjb25zdCBFd2tfSGlzdG9yeSogaGlzdG9yeSA9IGV3a192aWV3X2hpc3Rvcnlf
Z2V0KGJyb3dzZXIpOworICAgIHByZXZUZXN0QkZJdGVtID0gZXdrX2hpc3RvcnlfaGlzdG9yeV9p
dGVtX2N1cnJlbnRfZ2V0KGhpc3RvcnkpOworCisgICAgZXZhc19vYmplY3RfZm9jdXNfc2V0KGJy
b3dzZXIsIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdfdXJpX3NldChicm93c2VyLCB0ZXN0VVJM
LnV0ZjgoKS5kYXRhKCkpOworCisgICAgZWNvcmVfbWFpbl9sb29wX2JlZ2luKCk7CisKKyAgICBn
TGF5b3V0VGVzdENvbnRyb2xsZXItPmNsb3NlV2ViSW5zcGVjdG9yKCk7CisgICAgZ0xheW91dFRl
c3RDb250cm9sbGVyLT5zZXREZXZlbG9wZXJFeHRyYXNFbmFibGVkKGZhbHNlKTsKKworICAgIGV3
a192aWV3X3VyaV9zZXQoYnJvd3NlciwgImFib3V0OmJsYW5rIik7CisKKyAgICBnTGF5b3V0VGVz
dENvbnRyb2xsZXIuY2xlYXIoKTsKKyAgICBzZW5kUGl4ZWxSZXN1bHRzRU9GKCk7Cit9CisKK3N0
YXRpYyB2b2lkIHJ1blRlc3RpbmdTZXJ2ZXJMb29wKCkKK3sKKyAgICBjaGFyIGZpbGVuYW1lW1BB
VEhfTUFYXTsKKworICAgIHdoaWxlIChmZ2V0cyhmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwg
c3RkaW4pKSB7CisgICAgICAgIGNoYXIqIG5ld0xpbmUgPSBzdHJyY2hyKGZpbGVuYW1lLCAnXG4n
KTsKKyAgICAgICAgaWYgKG5ld0xpbmUpCisgICAgICAgICAgICAqbmV3TGluZSA9ICdcMCc7CisK
KyAgICAgICAgaWYgKGZpbGVuYW1lWzBdICE9ICdcMCcpCisgICAgICAgICAgICBydW5UZXN0KGZp
bGVuYW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkanVzdE91dHB1dFR5cGVCeU1pbWVU
eXBlKCkKK3sKKyAgICBPd25GYXN0TWFsbG9jUHRyPGNoYXI+IHJlc3BvbnNlTWltZVR5cGUoZXdr
X2ZyYW1lX3Jlc3BvbnNlX21pbWVfdHlwZV9nZXQobWFpbkZyYW1lKSk7CisgICAgaWYgKHJlc3Bv
bnNlTWltZVR5cGUuZ2V0KCkgJiYgIXN0cmNtcChyZXNwb25zZU1pbWVUeXBlLmdldCgpLCAidGV4
dC9wbGFpbiIpKSB7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEFzVGV4
dCh0cnVlKTsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRHZW5lcmF0ZVBpeGVs
UmVzdWx0cyhmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkdW1wRnJhbWVDb250ZW50
c0FzVGV4dCgpCit7CisgICAgU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAoZ0xheW91dFRlc3RDb250
cm9sbGVyLT5kdW1wQXNUZXh0KCkpCisgICAgICAgIHJlc3VsdCA9IGR1bXBGcmFtZXNBc1RleHQo
bWFpbkZyYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFN0cmluZzo6ZnJvbVVURjgo
ZXdrX2ZyYW1lX3JlbmRlcl90cmVlX2R1bXBfZ2V0KG1haW5GcmFtZSkpOworCisgICAgcHJpbnRm
KCIlcyIsIHJlc3VsdC51dGY4KCkuZGF0YSgpKTsKK30KKworc3RhdGljIGJvb2wgc2hvdWxkRHVt
cEZyYW1lU2Nyb2xsUG9zaXRpb24oKQoreworICAgIHJldHVybiBnTGF5b3V0VGVzdENvbnRyb2xs
ZXItPmR1bXBBc1RleHQoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRE9NQXNXZWJB
cmNoaXZlKCkgJiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcFNvdXJjZUFzV2ViQXJjaGl2
ZSgpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGREdW1wUGl4ZWxzQW5kQ29tcGFyZVdpdGhFeHBl
Y3RlZCgpCit7CisgICAgcmV0dXJuIGR1bXBQaXhlbHMgJiYgZ0xheW91dFRlc3RDb250cm9sbGVy
LT5nZW5lcmF0ZVBpeGVsUmVzdWx0cygpICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBE
T01Bc1dlYkFyY2hpdmUoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wU291cmNlQXNX
ZWJBcmNoaXZlKCk7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZER1bXBCYWNrRm9yd2FyZExpc3Qo
KQoreworICAgIHJldHVybiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBCYWNrRm9yd2FyZExp
c3QoKTsKK30KKworc3RhdGljIGJvb2wgaW5pdEVmbCgpCit7CisgICAgaWYgKCFlY29yZV9ldmFz
X2luaXQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghZWNvcmVfZmlsZV9pbml0
KCkpIHsKKyAgICAgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorICAgIGlmICghZWRqZV9pbml0KCkpIHsKKyAgICAgICAgZWNvcmVfZmlsZV9z
aHV0ZG93bigpOworICAgICAgICBlY29yZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFld2tfaW5pdCgpKSB7CisgICAgICAgIGVkamVfc2h1
dGRvd24oKTsKKyAgICAgICAgZWNvcmVfZmlsZV9zaHV0ZG93bigpOworICAgICAgICBlY29yZV9l
dmFzX3NodXRkb3duKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgc2h1dGRvd25FZmwoKQoreworICAgIGV3a19zaHV0
ZG93bigpOworICAgIGVkamVfc2h1dGRvd24oKTsKKyAgICBlY29yZV9maWxlX3NodXRkb3duKCk7
CisgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworfQorCit2b2lkIGRpc3BsYXlXZWJWaWV3KCkK
K3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIGR1bXAoKQoreworICAgIGludmFs
aWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1bXBXYXRjaGRvZygpOworCisgICAgaWYgKGR1bXBUcmVl
KSB7CisgICAgICAgIGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKCk7CisgICAgICAgIGR1bXBG
cmFtZUNvbnRlbnRzQXNUZXh0KCk7CisKKyAgICAgICAgaWYgKHNob3VsZER1bXBGcmFtZVNjcm9s
bFBvc2l0aW9uKCkpCisgICAgICAgICAgICBkdW1wRnJhbWVTY3JvbGxQb3NpdGlvbihtYWluRnJh
bWUpOworCisgICAgICAgIGlmIChzaG91bGREdW1wQmFja0ZvcndhcmRMaXN0KCkpCisgICAgICAg
ICAgICBkdW1wQmFja0ZvcndhcmRMaXN0Rm9yV2ViVmlldyhicm93c2VyKTsKKworICAgICAgICBp
ZiAocHJpbnRTZXBhcmF0b3JzKSB7CisgICAgICAgICAgICBwdXRzKCIjRU9GIik7CisgICAgICAg
ICAgICBmcHV0cygiI0VPRlxuIiwgc3RkZXJyKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQp
OworICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBp
ZiAoc2hvdWxkRHVtcFBpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQoKSkKKyAgICAgICAgZHVt
cFdlYlZpZXdBc1BpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQoZ0xheW91dFRlc3RDb250cm9s
bGVyLT5leHBlY3RlZFBpeGVsSGFzaCgpKTsKKworICAgIGRvbmUgPSB0cnVlOworICAgIGVjb3Jl
X21haW5fbG9vcF9xdWl0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZUJyb3dzZXIoRXZhcyog
ZXZhcywgR0NDb250cm9sbGVyKiBnY0NvbnRyb2xsZXIpCit7CisgICAgYnJvd3NlciA9IGRydFZp
ZXdUaWxlZEFkZChldmFzKTsKKyAgICBpZiAoIWJyb3dzZXIpIHsKKyAgICAgICAgc2h1dGRvd25F
ZmwoKTsKKyAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAgIGV3a192aWV3
X3RoZW1lX3NldChicm93c2VyLCBEQVRBX0RJUiIvZGVmYXVsdC5lZGoiKTsKKworICAgIGV2YXNf
b2JqZWN0X25hbWVfc2V0KGJyb3dzZXIsICJicm93c2VyIik7CisgICAgZXZhc19vYmplY3RfbW92
ZShicm93c2VyLCAwLCAwKTsKKyAgICBldmFzX29iamVjdF9yZXNpemUoYnJvd3NlciwgODAwLCA2
MDApOworICAgIGV2YXNfb2JqZWN0X2xheWVyX3NldChicm93c2VyLCBFVkFTX0xBWUVSX01BWCk7
CisgICAgZXZhc19vYmplY3Rfc2hvdyhicm93c2VyKTsKKyAgICBldmFzX29iamVjdF9mb2N1c19z
ZXQoYnJvd3NlciwgRUlOQV9UUlVFKTsKKworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNr
X2FkZChicm93c2VyLCAibG9hZCxzdGFydGVkIiwgb25Mb2FkU3RhcnRlZCwgMCk7CisgICAgZXZh
c19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKGJyb3dzZXIsICJsb2FkLGZpbmlzaGVkIiwgb25M
b2FkRmluaXNoZWQsIDApOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZChicm93
c2VyLCAidGl0bGUsY2hhbmdlZCIsIG9uVGl0bGVDaGFuZ2VkLCAwKTsKKyAgICBldmFzX29iamVj
dF9zbWFydF9jYWxsYmFja19hZGQoYnJvd3NlciwgIndpbmRvdyxvYmplY3QsY2xlYXJlZCIsIG9u
V2luZG93T2JqZWN0Q2xlYXJlZCwgZ2NDb250cm9sbGVyKTsKKyAgICBldmFzX29iamVjdF9zbWFy
dF9jYWxsYmFja19hZGQoYnJvd3NlciwgInN0YXR1c2Jhcix0ZXh0LHNldCIsIG9uU3RhdHVzYmFy
VGV4dFNldCwgMCk7CisKKyAgICBtYWluRnJhbWUgPSBld2tfdmlld19mcmFtZV9tYWluX2dldChi
cm93c2VyKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19hZGQobWFpbkZyYW1lLCAi
bG9hZCxkb2N1bWVudCxmaW5pc2hlZCIsIG9uRG9jdW1lbnRMb2FkRmluaXNoZWQsIDApOworfQor
CitzdGF0aWMgRWNvcmVfRXZhcyogaW5pdEVjb3JlRXZhcygpCit7CisgICAgRWNvcmVfRXZhcyog
ZWNvcmVFdmFzID0gdXNlWDExV2luZG93ID8gZWNvcmVfZXZhc19uZXcoMCwgMCwgMCwgODAwLCA2
MDAsIDApIDogZWNvcmVfZXZhc19idWZmZXJfbmV3KDgwMCwgNjAwKTsKKyAgICBpZiAoIWVjb3Jl
RXZhcykgeworICAgICAgICBzaHV0ZG93bkVmbCgpOworICAgICAgICBleGl0KEVYSVRfRkFJTFVS
RSk7CisgICAgfQorCisgICAgZWNvcmVfZXZhc190aXRsZV9zZXQoZWNvcmVFdmFzLCAiRUZMIER1
bXBSZW5kZXJUcmVlIik7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19yZXNpemVfc2V0KGVjb3Jl
RXZhcywgb25FY29yZUV2YXNSZXNpemUpOworICAgIGVjb3JlX2V2YXNfY2FsbGJhY2tfZGVsZXRl
X3JlcXVlc3Rfc2V0KGVjb3JlRXZhcywgb25DbG9zZVdpbmRvdyk7CisgICAgZWNvcmVfZXZhc19z
aG93KGVjb3JlRXZhcyk7CisKKyAgICByZXR1cm4gZWNvcmVFdmFzOworfQorCitpbnQgbWFpbihp
bnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgaWYgKCFwYXJzZUNvbW1hbmRMaW5lT3B0aW9u
cyhhcmdjLCBhcmd2KSkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAgIGlmICgh
aW5pdEVmbCgpKQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisgICAgT3duUHRyPEVj
b3JlX0V2YXM+IGVjb3JlRXZhcyA9IGFkb3B0UHRyKGluaXRFY29yZUV2YXMoKSk7CisgICAgT3du
UHRyPEdDQ29udHJvbGxlcj4gZ2NDb250cm9sbGVyID0gYWRvcHRQdHIobmV3IEdDQ29udHJvbGxl
cik7CisgICAgY3JlYXRlQnJvd3NlcihlY29yZV9ldmFzX2dldChlY29yZUV2YXMuZ2V0KCkpLCBn
Y0NvbnRyb2xsZXIuZ2V0KCkpOworICAgIGFkZEZvbnRzVG9FbnZpcm9ubWVudCgpOworCisgICAg
aWYgKHVzZUxvbmdSdW5uaW5nU2VydmVyTW9kZShhcmdjLCBhcmd2KSkgeworICAgICAgICBwcmlu
dFNlcGFyYXRvcnMgPSB0cnVlOworICAgICAgICBydW5UZXN0aW5nU2VydmVyTG9vcCgpOworICAg
IH0gZWxzZSB7CisgICAgICAgIHByaW50U2VwYXJhdG9ycyA9IChvcHRpbmQgPCBhcmdjIC0gMSB8
fCAoZHVtcFBpeGVscyAmJiBkdW1wVHJlZSkpOworICAgICAgICBmb3IgKGludCBpID0gb3B0aW5k
OyBpICE9IGFyZ2M7ICsraSkKKyAgICAgICAgICAgIHJ1blRlc3QoYXJndltpXSk7CisgICAgfQor
CisgICAgZWNvcmVFdmFzLmNsZWFyKCk7CisKKyAgICBzaHV0ZG93bkVmbCgpOworICAgIHJldHVy
biBFWElUX1NVQ0NFU1M7Cit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>104549</attachid>
            <date>2011-08-19 13:06:28 -0700</date>
            <delta_ts>2011-09-19 10:43:09 -0700</delta_ts>
            <desc>Updated DumpRenderTree.cpp.</desc>
            <filename>attachment.cgi?id=104231</filename>
            <type>text/plain</type>
            <size>14087</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDkzMjM2KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsNDAgQEAKKzIwMTEtMDgtMTcgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9u
Lm1vYmk+CisKKyAgICAgICAgW0VGTF0gRFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02NjQwNQorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAgICAgVGhpcyBp
cyB0aGUgbWFpbiBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciBFRkwncyBEdW1wUmVuZGVyVHJlZS4K
KworICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHA6IEFkZGVk
LgorICAgICAgICAoZHVtcEZyYW1lc0FzVGV4dCk6CisgICAgICAgIChkdW1wRnJhbWVTY3JvbGxQ
b3NpdGlvbik6CisgICAgICAgIChzaG91bGRMb2dGcmFtZUxvYWREZWxlZ2F0ZXMpOgorICAgICAg
ICAoc2hvdWxkRHVtcEFzVGV4dCk6CisgICAgICAgIChzZW5kUGl4ZWxSZXN1bHRzRU9GKToKKyAg
ICAgICAgKGludmFsaWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1bXBXYXRjaGRvZyk6CisgICAgICAg
IChvbkVjb3JlRXZhc1Jlc2l6ZSk6CisgICAgICAgIChvbkNsb3NlV2luZG93KToKKyAgICAgICAg
KHVzZUxvbmdSdW5uaW5nU2VydmVyTW9kZSk6CisgICAgICAgIChwYXJzZUNvbW1hbmRMaW5lT3B0
aW9ucyk6CisgICAgICAgIChnZXRGaW5hbFRlc3RVUkwpOgorICAgICAgICAoZ2V0RXhwZWN0ZWRQ
aXhlbEhhc2gpOgorICAgICAgICAoY3JlYXRlTGF5b3V0VGVzdENvbnRyb2xsZXIpOgorICAgICAg
ICAocnVuVGVzdCk6CisgICAgICAgIChydW5UZXN0aW5nU2VydmVyTG9vcCk6CisgICAgICAgIChh
ZGp1c3RPdXRwdXRUeXBlQnlNaW1lVHlwZSk6CisgICAgICAgIChkdW1wRnJhbWVDb250ZW50c0Fz
VGV4dCk6CisgICAgICAgIChzaG91bGREdW1wRnJhbWVTY3JvbGxQb3NpdGlvbik6CisgICAgICAg
IChzaG91bGREdW1wUGl4ZWxzQW5kQ29tcGFyZVdpdGhFeHBlY3RlZCk6CisgICAgICAgIChzaG91
bGREdW1wQmFja0ZvcndhcmRMaXN0KToKKyAgICAgICAgKGluaXRFZmwpOgorICAgICAgICAoc2h1
dGRvd25FZmwpOgorICAgICAgICAoZGlzcGxheVdlYlZpZXcpOgorICAgICAgICAoZHVtcCk6Cisg
ICAgICAgIChpbml0RWNvcmVFdmFzKToKKyAgICAgICAgKG1haW4pOgorCiAyMDExLTA4LTE3ICBB
ZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAgICAgICAgZ2FyZGVuLW8tbWF0aWMg
c2hvdWxkIGJlIGFibGUgdG8gcmViYXNlbGluZSBleHBlY3RlZCBmYWlsdXJlcwpJbmRleDogVG9v
bHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwCShyZXZpc2lvbiAwKQor
KysgVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9O
IEVtYmVkZGVkIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9u
aWNzCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBBTkQgSVRTIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWUuaCIKKworI2luY2x1ZGUgIkR1bXBIaXN0
b3J5SXRlbS5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlQ2hyb21lLmgiCisjaW5jbHVkZSAi
RHVtcFJlbmRlclRyZWVWaWV3LmgiCisjaW5jbHVkZSAiRXZlbnRTZW5kZXIuaCIKKyNpbmNsdWRl
ICJGb250TWFuYWdlbWVudC5oIgorI2luY2x1ZGUgIkxheW91dFRlc3RDb250cm9sbGVyLmgiCisj
aW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQaXhlbER1bXBTdXBwb3J0Lmgi
CisjaW5jbHVkZSAiV29ya1F1ZXVlLmgiCisjaW5jbHVkZSAiZXdrX3ByaXZhdGUuaCIgLy8gRklY
TUU6IGNyZWF0ZSBzb21lIFdlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlLmNwcCBpbnN0ZWFk
CisjaW5jbHVkZSA8RVdlYktpdC5oPgorI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5jbHVkZSA8RWNv
cmVfRXZhcy5oPgorI2luY2x1ZGUgPEVjb3JlX0ZpbGUuaD4KKyNpbmNsdWRlIDxFZGplLmg+Cisj
aW5jbHVkZSA8RXZhcy5oPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgorI2lu
Y2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRleHQvQ1N0
cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25GYXN0TWFsbG9j
UHRyLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCitPd25QdHI8RHVtcFJlbmRlclRyZWVD
aHJvbWU+IGJyb3dzZXI7CitFdmFzX09iamVjdCogdG9wTG9hZGluZ0ZyYW1lID0gMDsKK2Jvb2wg
d2FpdEZvclBvbGljeSA9IGZhbHNlOworRWNvcmVfVGltZXIqIHdhaXRUb0R1bXBXYXRjaGRvZyA9
IDA7CitleHRlcm4gRXdrX0hpc3RvcnlfSXRlbSogcHJldlRlc3RCRkl0ZW07CisKKy8vIEZyb20g
dGhlIHRvcC1sZXZlbCBEdW1wUmVuZGVyVHJlZS5oCitSZWZQdHI8TGF5b3V0VGVzdENvbnRyb2xs
ZXI+IGdMYXlvdXRUZXN0Q29udHJvbGxlcjsKK3ZvbGF0aWxlIGJvb2wgZG9uZSA9IGZhbHNlOwor
CitzdGF0aWMgaW50IGR1bXBQaXhlbHMgPSBmYWxzZTsKK3N0YXRpYyBpbnQgZHVtcFRyZWUgPSB0
cnVlOworc3RhdGljIGludCBwcmludFNlcGFyYXRvcnMgPSB0cnVlOworc3RhdGljIGludCB1c2VY
MTFXaW5kb3cgPSBmYWxzZTsKKworc3RhdGljIFN0cmluZyBkdW1wRnJhbWVzQXNUZXh0KEV2YXNf
T2JqZWN0KiBmcmFtZSkKK3sKKyAgICBTdHJpbmcgcmVzdWx0OworCisgICAgaWYgKGJyb3dzZXIt
Pm1haW5GcmFtZSgpICE9IGZyYW1lKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuLS0tLS0t
LS1cbkZyYW1lOiAnIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nOjpmcm9tVVRGOChl
d2tfZnJhbWVfbmFtZV9nZXQoZnJhbWUpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIidcbi0t
LS0tLS0tXG4iKTsKKyAgICB9CisKKyAgICByZXN1bHQuYXBwZW5kKGV3a19mcmFtZV9pbm5lcl90
ZXh0X2dldChmcmFtZSkpOworICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisKKyAgICBpZiAoZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSkgeworICAgICAgICBF
aW5hX0xpc3QqIGNoaWxkcmVuID0gZXdrX2ZyYW1lX2NoaWxkcmVuX2dldChmcmFtZSk7CisgICAg
ICAgIHZvaWQqIGl0ZXJhdG9yOworCisgICAgICAgIEVJTkFfTElTVF9GUkVFKGNoaWxkcmVuLCBp
dGVyYXRvcikgeworICAgICAgICAgICAgRXZhc19PYmplY3QqIGN1cnJlbnRGcmFtZSA9IHN0YXRp
Y19jYXN0PEV2YXNfT2JqZWN0Kj4oaXRlcmF0b3IpOworICAgICAgICAgICAgU3RyaW5nIHRlbXBU
ZXh0KGR1bXBGcmFtZXNBc1RleHQoY3VycmVudEZyYW1lKSk7CisKKyAgICAgICAgICAgIGlmICh0
ZW1wVGV4dC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
ICAgIHJlc3VsdC5hcHBlbmQodGVtcFRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oRXZh
c19PYmplY3QqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBib29sIHNo
b3VsZExvZ0ZyYW1lTG9hZERlbGVnYXRlcyhjb25zdCBTdHJpbmcmIHBhdGhPclVSTCkKK3sKKyAg
ICByZXR1cm4gcGF0aE9yVVJMLmNvbnRhaW5zKCJsb2FkaW5nLyIpOworfQorCitzdGF0aWMgYm9v
bCBzaG91bGREdW1wQXNUZXh0KGNvbnN0IFN0cmluZyYgcGF0aE9yVVJMKQoreworICAgIHJldHVy
biBwYXRoT3JVUkwuY29udGFpbnMoImR1bXBBc1RleHQvIik7Cit9CisKK3N0YXRpYyB2b2lkIHNl
bmRQaXhlbFJlc3VsdHNFT0YoKQoreworICAgIHB1dHMoIiNFT0YiKTsKKyAgICBmZmx1c2goc3Rk
b3V0KTsKKyAgICBmZmx1c2goc3RkZXJyKTsKK30KKworc3RhdGljIHZvaWQgaW52YWxpZGF0ZUFu
eVByZXZpb3VzV2FpdFRvRHVtcFdhdGNoZG9nKCkKK3sKKyAgICBpZiAod2FpdFRvRHVtcFdhdGNo
ZG9nKSB7CisgICAgICAgIGVjb3JlX3RpbWVyX2RlbCh3YWl0VG9EdW1wV2F0Y2hkb2cpOworICAg
ICAgICB3YWl0VG9EdW1wV2F0Y2hkb2cgPSAwOworICAgIH0KKyAgICB3YWl0Rm9yUG9saWN5ID0g
ZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIG9uRWNvcmVFdmFzUmVzaXplKEVjb3JlX0V2YXMqIGVj
b3JlRXZhcykKK3sKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKworICAgIGVjb3JlX2V2YXNfZ2Vv
bWV0cnlfZ2V0KGVjb3JlRXZhcywgMCwgMCwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBldmFzX29i
amVjdF9tb3ZlKGJyb3dzZXItPm1haW5WaWV3KCksIDAsIDApOworICAgIGV2YXNfb2JqZWN0X3Jl
c2l6ZShicm93c2VyLT5tYWluVmlldygpLCB3aWR0aCwgaGVpZ2h0KTsKK30KKworc3RhdGljIHZv
aWQgb25DbG9zZVdpbmRvdyhFY29yZV9FdmFzKikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCitzdGF0aWMgRWluYV9Cb29sIHVzZUxvbmdSdW5uaW5nU2VydmVyTW9kZShpbnQgYXJnYywg
Y2hhcioqIGFyZ3YpCit7CisgICAgcmV0dXJuIChhcmdjID09IG9wdGluZCArIDEgJiYgIXN0cmNt
cChhcmd2W29wdGluZF0sICItIikpOworfQorCitzdGF0aWMgYm9vbCBwYXJzZUNvbW1hbmRMaW5l
T3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgc3RhdGljIGNvbnN0IG9wdGlv
biBvcHRpb25zW10gPSB7CisgICAgICAgIHsibm90cmVlIiwgbm9fYXJndW1lbnQsICZkdW1wVHJl
ZSwgZmFsc2V9LAorICAgICAgICB7InBpeGVsLXRlc3RzIiwgbm9fYXJndW1lbnQsICZkdW1wUGl4
ZWxzLCB0cnVlfSwKKyAgICAgICAgeyJ0cmVlIiwgbm9fYXJndW1lbnQsICZkdW1wVHJlZSwgdHJ1
ZX0sCisgICAgICAgIHsiZ3VpIiwgbm9fYXJndW1lbnQsICZ1c2VYMTFXaW5kb3csIHRydWV9LAor
ICAgICAgICB7MCwgMCwgMCwgMH0KKyAgICB9OworICAgIGludCBvcHRpb247CisKKyAgICB3aGls
ZSAoKG9wdGlvbiA9IGdldG9wdF9sb25nKGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiwgIiIsIG9w
dGlvbnMsIDApKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICBj
YXNlICc/JzoKKyAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgU3RyaW5n
IGdldEZpbmFsVGVzdFVSTChjb25zdCBTdHJpbmcmIHRlc3RVUkwpCit7CisgICAgY29uc3Qgc2l6
ZV90IGhhc2hTZXBhcmF0b3JQb3MgPSB0ZXN0VVJMLmZpbmQoIiciKTsKKyAgICBpZiAoaGFzaFNl
cGFyYXRvclBvcyAhPSBub3RGb3VuZCkKKyAgICAgICAgcmV0dXJuIGdldEZpbmFsVGVzdFVSTCh0
ZXN0VVJMLmxlZnQoaGFzaFNlcGFyYXRvclBvcykpOworCisgICAgLy8gQ29udmVydCB0aGUgcGF0
aCBpbnRvIGEgZnVsbCBmaWxlIFVSTCBpZiBpdCBkb2VzIG5vdCBsb29rCisgICAgLy8gbGlrZSBh
biBIVFRQL1MgVVJMIChkb2Vzbid0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovLykuCisg
ICAgaWYgKCF0ZXN0VVJMLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSB8fCAhdGVzdFVSTC5zdGFydHNX
aXRoKCJodHRwczovLyIpKSB7CisgICAgICAgIE93bkZhc3RNYWxsb2NQdHI8Y2hhcj4gZmlsZVBh
dGgoZWNvcmVfZmlsZV9yZWFscGF0aCh0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpKTsKKworICAgICAg
ICBpZiAoZWNvcmVfZmlsZV9leGlzdHMoZmlsZVBhdGguZ2V0KCkpKQorICAgICAgICAgICAgcmV0
dXJuIFN0cmluZygiZmlsZTovLyIpICsgU3RyaW5nOjpmcm9tVVRGOChmaWxlUGF0aC5nZXQoKSk7
CisgICAgfQorCisgICAgcmV0dXJuIHRlc3RVUkw7Cit9CisKK3N0YXRpYyBTdHJpbmcgZ2V0RXhw
ZWN0ZWRQaXhlbEhhc2goY29uc3QgU3RyaW5nJiB0ZXN0VVJMKQoreworICAgIGNvbnN0IHNpemVf
dCBoYXNoU2VwYXJhdG9yUG9zID0gdGVzdFVSTC5maW5kKCInIik7CisgICAgcmV0dXJuIChoYXNo
U2VwYXJhdG9yUG9zID09IG5vdEZvdW5kKSA/IHRlc3RVUkwucmlnaHQoaGFzaFNlcGFyYXRvclBv
cykgOiBTdHJpbmcoKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlTGF5b3V0VGVzdENvbnRyb2xs
ZXIoY29uc3QgU3RyaW5nJiB0ZXN0VVJMLCBjb25zdCBTdHJpbmcmIGV4cGVjdGVkUGl4ZWxIYXNo
KQoreworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlciA9CisgICAgICAgIExheW91dFRlc3RDb250
cm9sbGVyOjpjcmVhdGUoc3RkOjpzdHJpbmcodGVzdFVSTC51dGY4KCkuZGF0YSgpKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhleHBlY3RlZFBpeGVs
SGFzaC51dGY4KCkuZGF0YSgpKSk7CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOworICAgIGRv
bmUgPSBmYWxzZTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0SWNvbkRhdGFiYXNl
RW5hYmxlZChmYWxzZSk7CisKKyAgICBpZiAoc2hvdWxkTG9nRnJhbWVMb2FkRGVsZWdhdGVzKHRl
c3RVUkwpKQorICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBGcmFtZUxvYWRD
YWxsYmFja3ModHJ1ZSk7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldERldmVsb3Bl
ckV4dHJhc0VuYWJsZWQodHJ1ZSk7CisKKyAgICBpZiAoc2hvdWxkRHVtcEFzVGV4dCh0ZXN0VVJM
KSkgeworICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBBc1RleHQodHJ1ZSk7
CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQaXhlbFJlc3VsdHMo
ZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcnVuVGVzdChjb25zdCBjaGFyKiBjVGVz
dFBhdGhPclVSTCkKK3sKKyAgICBjb25zdCBTdHJpbmcgdGVzdFBhdGhPclVSTCA9IFN0cmluZzo6
ZnJvbVVURjgoY1Rlc3RQYXRoT3JVUkwpOworICAgIEFTU0VSVCghdGVzdFBhdGhPclVSTC5pc0Vt
cHR5KCkpOworCisgICAgY29uc3QgU3RyaW5nIHRlc3RVUkwgPSBnZXRGaW5hbFRlc3RVUkwodGVz
dFBhdGhPclVSTCk7CisgICAgY29uc3QgU3RyaW5nIGV4cGVjdGVkUGl4ZWxIYXNoID0gZ2V0RXhw
ZWN0ZWRQaXhlbEhhc2godGVzdFBhdGhPclVSTCk7CisKKyAgICBicm93c2VyLT5yZXNldERlZmF1
bHRzVG9Db25zaXN0ZW50VmFsdWVzKCk7CisgICAgY3JlYXRlTGF5b3V0VGVzdENvbnRyb2xsZXIo
dGVzdFVSTCwgZXhwZWN0ZWRQaXhlbEhhc2gpOworCisgICAgV29ya1F1ZXVlOjpzaGFyZWQoKS0+
Y2xlYXIoKTsKKyAgICBXb3JrUXVldWU6OnNoYXJlZCgpLT5zZXRGcm96ZW4oZmFsc2UpOworCisg
ICAgY29uc3QgYm9vbCBpc1NWR1czQ1Rlc3QgPSB0ZXN0VVJMLmNvbnRhaW5zKCJzdmcvVzNDLVNW
Ry0xLjEiKTsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBpc1NWR1czQ1Rlc3QgPyA0ODAgOiBMYXlv
dXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld1dpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBp
c1NWR1czQ1Rlc3QgPyAzNjAgOiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld0hlaWdodDsK
KyAgICBldmFzX29iamVjdF9yZXNpemUoYnJvd3Nlci0+bWFpblZpZXcoKSwgd2lkdGgsIGhlaWdo
dCk7CisKKyAgICBpZiAocHJldlRlc3RCRkl0ZW0pCisgICAgICAgIGV3a19oaXN0b3J5X2l0ZW1f
ZnJlZShwcmV2VGVzdEJGSXRlbSk7CisgICAgY29uc3QgRXdrX0hpc3RvcnkqIGhpc3RvcnkgPSBl
d2tfdmlld19oaXN0b3J5X2dldChicm93c2VyLT5tYWluVmlldygpKTsKKyAgICBwcmV2VGVzdEJG
SXRlbSA9IGV3a19oaXN0b3J5X2hpc3RvcnlfaXRlbV9jdXJyZW50X2dldChoaXN0b3J5KTsKKwor
ICAgIGV2YXNfb2JqZWN0X2ZvY3VzX3NldChicm93c2VyLT5tYWluVmlldygpLCBFSU5BX1RSVUUp
OworICAgIGV3a192aWV3X3VyaV9zZXQoYnJvd3Nlci0+bWFpblZpZXcoKSwgdGVzdFVSTC51dGY4
KCkuZGF0YSgpKTsKKworICAgIGVjb3JlX21haW5fbG9vcF9iZWdpbigpOworCisgICAgZ0xheW91
dFRlc3RDb250cm9sbGVyLT5jbG9zZVdlYkluc3BlY3RvcigpOworICAgIGdMYXlvdXRUZXN0Q29u
dHJvbGxlci0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZChmYWxzZSk7CisKKyAgICBld2tfdmll
d191cmlfc2V0KGJyb3dzZXItPm1haW5WaWV3KCksICJhYm91dDpibGFuayIpOworCisgICAgZ0xh
eW91dFRlc3RDb250cm9sbGVyLmNsZWFyKCk7CisgICAgc2VuZFBpeGVsUmVzdWx0c0VPRigpOwor
fQorCitzdGF0aWMgdm9pZCBydW5UZXN0aW5nU2VydmVyTG9vcCgpCit7CisgICAgY2hhciBmaWxl
bmFtZVtQQVRIX01BWF07CisKKyAgICB3aGlsZSAoZmdldHMoZmlsZW5hbWUsIHNpemVvZihmaWxl
bmFtZSksIHN0ZGluKSkgeworICAgICAgICBjaGFyKiBuZXdMaW5lID0gc3RycmNocihmaWxlbmFt
ZSwgJ1xuJyk7CisgICAgICAgIGlmIChuZXdMaW5lKQorICAgICAgICAgICAgKm5ld0xpbmUgPSAn
XDAnOworCisgICAgICAgIGlmIChmaWxlbmFtZVswXSAhPSAnXDAnKQorICAgICAgICAgICAgcnVu
VGVzdChmaWxlbmFtZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGp1c3RPdXRwdXRUeXBl
QnlNaW1lVHlwZShjb25zdCBFdmFzX09iamVjdCogZnJhbWUpCit7CisgICAgT3duRmFzdE1hbGxv
Y1B0cjxjaGFyPiByZXNwb25zZU1pbWVUeXBlKGV3a19mcmFtZV9yZXNwb25zZV9taW1lX3R5cGVf
Z2V0KGZyYW1lKSk7CisgICAgaWYgKHJlc3BvbnNlTWltZVR5cGUuZ2V0KCkgJiYgIXN0cmNtcChy
ZXNwb25zZU1pbWVUeXBlLmdldCgpLCAidGV4dC9wbGFpbiIpKSB7CisgICAgICAgIGdMYXlvdXRU
ZXN0Q29udHJvbGxlci0+c2V0RHVtcEFzVGV4dCh0cnVlKTsKKyAgICAgICAgZ0xheW91dFRlc3RD
b250cm9sbGVyLT5zZXRHZW5lcmF0ZVBpeGVsUmVzdWx0cyhmYWxzZSk7CisgICAgfQorfQorCitz
dGF0aWMgdm9pZCBkdW1wRnJhbWVDb250ZW50c0FzVGV4dChFdmFzX09iamVjdCogZnJhbWUpCit7
CisgICAgU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1w
QXNUZXh0KCkpCisgICAgICAgIHJlc3VsdCA9IGR1bXBGcmFtZXNBc1RleHQoZnJhbWUpOworICAg
IGVsc2UKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nOjpmcm9tVVRGOChld2tfZnJhbWVfcmVuZGVy
X3RyZWVfZHVtcF9nZXQoZnJhbWUpKTsKKworICAgIHByaW50ZigiJXMiLCByZXN1bHQudXRmOCgp
LmRhdGEoKSk7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZER1bXBGcmFtZVNjcm9sbFBvc2l0aW9u
KCkKK3sKKyAgICByZXR1cm4gZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQXNUZXh0KCkgJiYg
IWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcERPTUFzV2ViQXJjaGl2ZSgpICYmICFnTGF5b3V0
VGVzdENvbnRyb2xsZXItPmR1bXBTb3VyY2VBc1dlYkFyY2hpdmUoKTsKK30KKworc3RhdGljIGJv
b2wgc2hvdWxkRHVtcFBpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQoKQoreworICAgIHJldHVy
biBkdW1wUGl4ZWxzICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+Z2VuZXJhdGVQaXhlbFJlc3Vs
dHMoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRE9NQXNXZWJBcmNoaXZlKCkgJiYg
IWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcFNvdXJjZUFzV2ViQXJjaGl2ZSgpOworfQorCitz
dGF0aWMgYm9vbCBzaG91bGREdW1wQmFja0ZvcndhcmRMaXN0KCkKK3sKKyAgICByZXR1cm4gZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wQmFja0ZvcndhcmRMaXN0KCk7Cit9CisKK3N0YXRpYyBi
b29sIGluaXRFZmwoKQoreworICAgIGlmICghZWNvcmVfZXZhc19pbml0KCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAoIWVjb3JlX2ZpbGVfaW5pdCgpKSB7CisgICAgICAgIGVjb3Jl
X2V2YXNfc2h1dGRvd24oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAo
IWVkamVfaW5pdCgpKSB7CisgICAgICAgIGVjb3JlX2ZpbGVfc2h1dGRvd24oKTsKKyAgICAgICAg
ZWNvcmVfZXZhc19zaHV0ZG93bigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IGlmICghZXdrX2luaXQoKSkgeworICAgICAgICBlZGplX3NodXRkb3duKCk7CisgICAgICAgIGVj
b3JlX2ZpbGVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRp
YyB2b2lkIHNodXRkb3duRWZsKCkKK3sKKyAgICBld2tfc2h1dGRvd24oKTsKKyAgICBlZGplX3No
dXRkb3duKCk7CisgICAgZWNvcmVfZmlsZV9zaHV0ZG93bigpOworICAgIGVjb3JlX2V2YXNfc2h1
dGRvd24oKTsKK30KKwordm9pZCBkaXNwbGF5V2ViVmlldygpCit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKK30KKwordm9pZCBkdW1wKCkKK3sKKyAgICBFdmFzX09iamVjdCogZnJhbWUgPSBicm93
c2VyLT5tYWluRnJhbWUoKTsKKworICAgIGludmFsaWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1bXBX
YXRjaGRvZygpOworCisgICAgaWYgKGR1bXBUcmVlKSB7CisgICAgICAgIGFkanVzdE91dHB1dFR5
cGVCeU1pbWVUeXBlKGZyYW1lKTsKKyAgICAgICAgZHVtcEZyYW1lQ29udGVudHNBc1RleHQoZnJh
bWUpOworCisgICAgICAgIGlmIChzaG91bGREdW1wRnJhbWVTY3JvbGxQb3NpdGlvbigpKQorICAg
ICAgICAgICAgZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oZnJhbWUpOworCisgICAgICAgIGlmIChz
aG91bGREdW1wQmFja0ZvcndhcmRMaXN0KCkpCisgICAgICAgICAgICBkdW1wQmFja0ZvcndhcmRM
aXN0Rm9yV2ViVmlld3MoKTsKKworICAgICAgICBpZiAocHJpbnRTZXBhcmF0b3JzKSB7CisgICAg
ICAgICAgICBwdXRzKCIjRU9GIik7CisgICAgICAgICAgICBmcHV0cygiI0VPRlxuIiwgc3RkZXJy
KTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgZmZsdXNoKHN0ZGVy
cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hvdWxkRHVtcFBpeGVsc0FuZENvbXBh
cmVXaXRoRXhwZWN0ZWQoKSkKKyAgICAgICAgZHVtcFdlYlZpZXdBc1BpeGVsc0FuZENvbXBhcmVX
aXRoRXhwZWN0ZWQoZ0xheW91dFRlc3RDb250cm9sbGVyLT5leHBlY3RlZFBpeGVsSGFzaCgpKTsK
KworICAgIGRvbmUgPSB0cnVlOworICAgIGVjb3JlX21haW5fbG9vcF9xdWl0KCk7Cit9CisKK3N0
YXRpYyBFY29yZV9FdmFzKiBpbml0RWNvcmVFdmFzKCkKK3sKKyAgICBFY29yZV9FdmFzKiBlY29y
ZUV2YXMgPSB1c2VYMTFXaW5kb3cgPyBlY29yZV9ldmFzX25ldygwLCAwLCAwLCA4MDAsIDYwMCwg
MCkgOiBlY29yZV9ldmFzX2J1ZmZlcl9uZXcoODAwLCA2MDApOworICAgIGlmICghZWNvcmVFdmFz
KSB7CisgICAgICAgIHNodXRkb3duRWZsKCk7CisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsK
KyAgICB9CisKKyAgICBlY29yZV9ldmFzX3RpdGxlX3NldChlY29yZUV2YXMsICJFRkwgRHVtcFJl
bmRlclRyZWUiKTsKKyAgICBlY29yZV9ldmFzX2NhbGxiYWNrX3Jlc2l6ZV9zZXQoZWNvcmVFdmFz
LCBvbkVjb3JlRXZhc1Jlc2l6ZSk7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19kZWxldGVfcmVx
dWVzdF9zZXQoZWNvcmVFdmFzLCBvbkNsb3NlV2luZG93KTsKKyAgICBlY29yZV9ldmFzX3Nob3co
ZWNvcmVFdmFzKTsKKworICAgIHJldHVybiBlY29yZUV2YXM7Cit9CisKK2ludCBtYWluKGludCBh
cmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBpZiAoIXBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGFy
Z2MsIGFyZ3YpKQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisgICAgaWYgKCFpbml0
RWZsKCkpCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisKKyAgICBPd25QdHI8RWNvcmVf
RXZhcz4gZWNvcmVFdmFzID0gYWRvcHRQdHIoaW5pdEVjb3JlRXZhcygpKTsKKyAgICBicm93c2Vy
ID0gRHVtcFJlbmRlclRyZWVDaHJvbWU6OmNyZWF0ZShlY29yZV9ldmFzX2dldChlY29yZUV2YXMu
Z2V0KCkpKTsKKyAgICBhZGRGb250c1RvRW52aXJvbm1lbnQoKTsKKworICAgIGlmICh1c2VMb25n
UnVubmluZ1NlcnZlck1vZGUoYXJnYywgYXJndikpIHsKKyAgICAgICAgcHJpbnRTZXBhcmF0b3Jz
ID0gdHJ1ZTsKKyAgICAgICAgcnVuVGVzdGluZ1NlcnZlckxvb3AoKTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBwcmludFNlcGFyYXRvcnMgPSAob3B0aW5kIDwgYXJnYyAtIDEgfHwgKGR1bXBQaXhl
bHMgJiYgZHVtcFRyZWUpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9wdGluZDsgaSAhPSBhcmdj
OyArK2kpCisgICAgICAgICAgICBydW5UZXN0KGFyZ3ZbaV0pOworICAgIH0KKworICAgIGVjb3Jl
RXZhcy5jbGVhcigpOworCisgICAgc2h1dGRvd25FZmwoKTsKKyAgICByZXR1cm4gRVhJVF9TVUND
RVNTOworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107881</attachid>
            <date>2011-09-19 10:43:17 -0700</date>
            <delta_ts>2011-10-03 12:24:59 -0700</delta_ts>
            <desc>Minor changes, depend on bug 67114</desc>
            <filename>bug-62034-20110919144317.patch</filename>
            <type>text/plain</type>
            <size>14252</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTU0MzcKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA4OWNjYWU1NWNiMzRjYWJjZTY4NzkwZDBjYzdmOGIzMmIz
YWQ1ZTIwLi4wYzA3NThlNTFlMzc1YTMzMTI3ZmFlNWVmMTE3NjJjYTgwOGQ5MTAzIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDAg
QEAKKzIwMTEtMDktMTkgIFJhcGhhZWwgS3VibyBkYSBDb3N0YSAgPGt1Ym9AcHJvZnVzaW9uLm1v
Ymk+CisKKyAgICAgICAgW0VGTF0gRFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwIGFuZCBEdW1w
UmVuZGVyVHJlZUVmbC5oCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD02MjAzNAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFRoaXMgaXMgdGhlIG1haW4gaW1wbGVtZW50YXRpb24gZmlsZSBmb3IgRUZMJ3MgRHVt
cFJlbmRlclRyZWUuCisKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRy
ZWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKGR1bXBGcmFtZXNBc1RleHQpOgorICAgICAgICAoZHVt
cEZyYW1lU2Nyb2xsUG9zaXRpb24pOgorICAgICAgICAoc2hvdWxkTG9nRnJhbWVMb2FkRGVsZWdh
dGVzKToKKyAgICAgICAgKHNob3VsZER1bXBBc1RleHQpOgorICAgICAgICAoc2VuZFBpeGVsUmVz
dWx0c0VPRik6CisgICAgICAgIChpbnZhbGlkYXRlQW55UHJldmlvdXNXYWl0VG9EdW1wV2F0Y2hk
b2cpOgorICAgICAgICAob25FY29yZUV2YXNSZXNpemUpOgorICAgICAgICAob25DbG9zZVdpbmRv
dyk6CisgICAgICAgICh1c2VMb25nUnVubmluZ1NlcnZlck1vZGUpOgorICAgICAgICAocGFyc2VD
b21tYW5kTGluZU9wdGlvbnMpOgorICAgICAgICAoZ2V0RmluYWxUZXN0VVJMKToKKyAgICAgICAg
KGdldEV4cGVjdGVkUGl4ZWxIYXNoKToKKyAgICAgICAgKGNyZWF0ZUxheW91dFRlc3RDb250cm9s
bGVyKToKKyAgICAgICAgKHJ1blRlc3QpOgorICAgICAgICAocnVuVGVzdGluZ1NlcnZlckxvb3Ap
OgorICAgICAgICAoYWRqdXN0T3V0cHV0VHlwZUJ5TWltZVR5cGUpOgorICAgICAgICAoZHVtcEZy
YW1lQ29udGVudHNBc1RleHQpOgorICAgICAgICAoc2hvdWxkRHVtcEZyYW1lU2Nyb2xsUG9zaXRp
b24pOgorICAgICAgICAoc2hvdWxkRHVtcFBpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQpOgor
ICAgICAgICAoc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlzdCk6CisgICAgICAgIChpbml0RWZsKToK
KyAgICAgICAgKHNodXRkb3duRWZsKToKKyAgICAgICAgKGRpc3BsYXlXZWJWaWV3KToKKyAgICAg
ICAgKGR1bXApOgorICAgICAgICAoaW5pdEVjb3JlRXZhcyk6CisgICAgICAgIChtYWluKToKKwog
MjAxMS0wOS0xNiAgRWxsaW90IFBvZ2VyICA8ZXBvZ2VyQGdvb2dsZS5jb20+CiAKICAgICAgICAg
YWRkIG5vbi1DRyBXZWJraXQtTWFjIGJ1aWxkcyB0byBmbGFraW5lc3MgZGFzaGJvYXJkCmRpZmYg
LS1naXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwIGIvVG9v
bHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yZmNi
NThmZTRkYjZiYTZiMDE5MWU0Yzk2ZGRhN2Q3Mzc0NTA2ZjU1Ci0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcApAQCAtMCwwICsxLDQx
NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVt
cworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisg
KiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZS5oIgorCisjaW5j
bHVkZSAiRHVtcEhpc3RvcnlJdGVtLmgiCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWVDaHJvbWUu
aCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZVZpZXcuaCIKKyNpbmNsdWRlICJFdmVudFNlbmRl
ci5oIgorI2luY2x1ZGUgIkZvbnRNYW5hZ2VtZW50LmgiCisjaW5jbHVkZSAiTGF5b3V0VGVzdENv
bnRyb2xsZXIuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBpeGVs
RHVtcFN1cHBvcnQuaCIKKyNpbmNsdWRlICJXZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1
cHBvcnRFZmwuaCIKKyNpbmNsdWRlICJXb3JrUXVldWUuaCIKKyNpbmNsdWRlICJld2tfcHJpdmF0
ZS5oIiAvLyBGSVhNRTogY3JlYXRlIHNvbWUgV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWUu
Y3BwIGluc3RlYWQKKyNpbmNsdWRlIDxFV2ViS2l0Lmg+CisjaW5jbHVkZSA8RWNvcmUuaD4KKyNp
bmNsdWRlIDxFY29yZV9FdmFzLmg+CisjaW5jbHVkZSA8RWNvcmVfRmlsZS5oPgorI2luY2x1ZGUg
PEVkamUuaD4KKyNpbmNsdWRlIDxFdmFzLmg+CisjaW5jbHVkZSA8Zm9udGNvbmZpZy9mb250Y29u
ZmlnLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVk
ZSA8dGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8d3RmL093
bkZhc3RNYWxsb2NQdHIuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK093blB0cjxEdW1w
UmVuZGVyVHJlZUNocm9tZT4gYnJvd3NlcjsKK0V2YXNfT2JqZWN0KiB0b3BMb2FkaW5nRnJhbWUg
PSAwOworYm9vbCB3YWl0Rm9yUG9saWN5ID0gZmFsc2U7CitFY29yZV9UaW1lciogd2FpdFRvRHVt
cFdhdGNoZG9nID0gMDsKK2V4dGVybiBFd2tfSGlzdG9yeV9JdGVtKiBwcmV2VGVzdEJGSXRlbTsK
KworLy8gRnJvbSB0aGUgdG9wLWxldmVsIER1bXBSZW5kZXJUcmVlLmgKK1JlZlB0cjxMYXlvdXRU
ZXN0Q29udHJvbGxlcj4gZ0xheW91dFRlc3RDb250cm9sbGVyOwordm9sYXRpbGUgYm9vbCBkb25l
ID0gZmFsc2U7CisKK3N0YXRpYyBpbnQgZHVtcFBpeGVscyA9IGZhbHNlOworc3RhdGljIGludCBk
dW1wVHJlZSA9IHRydWU7CitzdGF0aWMgaW50IHByaW50U2VwYXJhdG9ycyA9IHRydWU7CitzdGF0
aWMgaW50IHVzZVgxMVdpbmRvdyA9IGZhbHNlOworCitzdGF0aWMgU3RyaW5nIGR1bXBGcmFtZXNB
c1RleHQoRXZhc19PYmplY3QqIGZyYW1lKQoreworICAgIFN0cmluZyByZXN1bHQ7CisKKyAgICBp
ZiAoYnJvd3Nlci0+bWFpbkZyYW1lKCkgIT0gZnJhbWUpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVu
ZCgiXG4tLS0tLS0tLVxuRnJhbWU6ICciKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmc6
OmZyb21VVEY4KGV3a19mcmFtZV9uYW1lX2dldChmcmFtZSkpKTsKKyAgICAgICAgcmVzdWx0LmFw
cGVuZCgiJ1xuLS0tLS0tLS1cbiIpOworICAgIH0KKworICAgIGNvbnN0IE93bkZhc3RNYWxsb2NQ
dHI8Y2hhcj4gZnJhbWVDb250ZW50cyhld2tfZnJhbWVfcGxhaW5fdGV4dF9nZXQoZnJhbWUpKTsK
KyAgICByZXN1bHQuYXBwZW5kKGZyYW1lQ29udGVudHMuZ2V0KCkpOworICAgIHJlc3VsdC5hcHBl
bmQoIlxuIik7CisKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQ2hpbGRGcmFt
ZXNBc1RleHQoKSkgeworICAgICAgICBFaW5hX0xpc3QqIGNoaWxkcmVuID0gRHVtcFJlbmRlclRy
ZWVTdXBwb3J0RWZsOjpmcmFtZUNoaWxkcmVuKGZyYW1lKTsKKyAgICAgICAgdm9pZCogaXRlcmF0
b3I7CisKKyAgICAgICAgRUlOQV9MSVNUX0ZSRUUoY2hpbGRyZW4sIGl0ZXJhdG9yKSB7CisgICAg
ICAgICAgICBFdmFzX09iamVjdCogY3VycmVudEZyYW1lID0gc3RhdGljX2Nhc3Q8RXZhc19PYmpl
Y3QqPihpdGVyYXRvcik7CisgICAgICAgICAgICBTdHJpbmcgdGVtcFRleHQoZHVtcEZyYW1lc0Fz
VGV4dChjdXJyZW50RnJhbWUpKTsKKworICAgICAgICAgICAgaWYgKHRlbXBUZXh0LmlzRW1wdHko
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgcmVzdWx0LmFwcGVu
ZCh0ZW1wVGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CitzdGF0aWMgdm9pZCBkdW1wRnJhbWVTY3JvbGxQb3NpdGlvbihFdmFzX09iamVjdCopCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworc3RhdGljIGJvb2wgc2hvdWxkTG9nRnJhbWVMb2Fk
RGVsZWdhdGVzKGNvbnN0IFN0cmluZyYgcGF0aE9yVVJMKQoreworICAgIHJldHVybiBwYXRoT3JV
UkwuY29udGFpbnMoImxvYWRpbmcvIik7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZER1bXBBc1Rl
eHQoY29uc3QgU3RyaW5nJiBwYXRoT3JVUkwpCit7CisgICAgcmV0dXJuIHBhdGhPclVSTC5jb250
YWlucygiZHVtcEFzVGV4dC8iKTsKK30KKworc3RhdGljIHZvaWQgc2VuZFBpeGVsUmVzdWx0c0VP
RigpCit7CisgICAgcHV0cygiI0VPRiIpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGZmbHVz
aChzdGRlcnIpOworfQorCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlQW55UHJldmlvdXNXYWl0VG9E
dW1wV2F0Y2hkb2coKQoreworICAgIGlmICh3YWl0VG9EdW1wV2F0Y2hkb2cpIHsKKyAgICAgICAg
ZWNvcmVfdGltZXJfZGVsKHdhaXRUb0R1bXBXYXRjaGRvZyk7CisgICAgICAgIHdhaXRUb0R1bXBX
YXRjaGRvZyA9IDA7CisgICAgfQorICAgIHdhaXRGb3JQb2xpY3kgPSBmYWxzZTsKK30KKworc3Rh
dGljIHZvaWQgb25FY29yZUV2YXNSZXNpemUoRWNvcmVfRXZhcyogZWNvcmVFdmFzKQoreworICAg
IGludCB3aWR0aCwgaGVpZ2h0OworCisgICAgZWNvcmVfZXZhc19nZW9tZXRyeV9nZXQoZWNvcmVF
dmFzLCAwLCAwLCAmd2lkdGgsICZoZWlnaHQpOworICAgIGV2YXNfb2JqZWN0X21vdmUoYnJvd3Nl
ci0+bWFpblZpZXcoKSwgMCwgMCk7CisgICAgZXZhc19vYmplY3RfcmVzaXplKGJyb3dzZXItPm1h
aW5WaWV3KCksIHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBvbkNsb3NlV2luZG93
KEVjb3JlX0V2YXMqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBFaW5h
X0Jvb2wgdXNlTG9uZ1J1bm5pbmdTZXJ2ZXJNb2RlKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sK
KyAgICByZXR1cm4gKGFyZ2MgPT0gb3B0aW5kICsgMSAmJiAhc3RyY21wKGFyZ3Zbb3B0aW5kXSwg
Ii0iKSk7Cit9CisKK3N0YXRpYyBib29sIHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGludCBhcmdj
LCBjaGFyKiogYXJndikKK3sKKyAgICBzdGF0aWMgY29uc3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsK
KyAgICAgICAgeyJub3RyZWUiLCBub19hcmd1bWVudCwgJmR1bXBUcmVlLCBmYWxzZX0sCisgICAg
ICAgIHsicGl4ZWwtdGVzdHMiLCBub19hcmd1bWVudCwgJmR1bXBQaXhlbHMsIHRydWV9LAorICAg
ICAgICB7InRyZWUiLCBub19hcmd1bWVudCwgJmR1bXBUcmVlLCB0cnVlfSwKKyAgICAgICAgeyJn
dWkiLCBub19hcmd1bWVudCwgJnVzZVgxMVdpbmRvdywgdHJ1ZX0sCisgICAgICAgIHswLCAwLCAw
LCAwfQorICAgIH07CisgICAgaW50IG9wdGlvbjsKKworICAgIHdoaWxlICgob3B0aW9uID0gZ2V0
b3B0X2xvbmcoYXJnYywgKGNoYXIqIGNvbnN0Kilhcmd2LCAiIiwgb3B0aW9ucywgMCkpICE9IC0x
KSB7CisgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgIGNhc2UgJz8nOgorICAgICAg
ICBjYXNlICc6JzoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBTdHJpbmcgZ2V0RmluYWxUZXN0VVJM
KGNvbnN0IFN0cmluZyYgdGVzdFVSTCkKK3sKKyAgICBjb25zdCBzaXplX3QgaGFzaFNlcGFyYXRv
clBvcyA9IHRlc3RVUkwuZmluZCgiJyIpOworICAgIGlmIChoYXNoU2VwYXJhdG9yUG9zICE9IG5v
dEZvdW5kKQorICAgICAgICByZXR1cm4gZ2V0RmluYWxUZXN0VVJMKHRlc3RVUkwubGVmdChoYXNo
U2VwYXJhdG9yUG9zKSk7CisKKyAgICAvLyBDb252ZXJ0IHRoZSBwYXRoIGludG8gYSBmdWxsIGZp
bGUgVVJMIGlmIGl0IGRvZXMgbm90IGxvb2sKKyAgICAvLyBsaWtlIGFuIEhUVFAvUyBVUkwgKGRv
ZXNuJ3Qgc3RhcnQgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8vKS4KKyAgICBpZiAoIXRlc3RVUkwu
c3RhcnRzV2l0aCgiaHR0cDovLyIpIHx8ICF0ZXN0VVJMLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikp
IHsKKyAgICAgICAgT3duRmFzdE1hbGxvY1B0cjxjaGFyPiBmaWxlUGF0aChlY29yZV9maWxlX3Jl
YWxwYXRoKHRlc3RVUkwudXRmOCgpLmRhdGEoKSkpOworCisgICAgICAgIGlmIChlY29yZV9maWxl
X2V4aXN0cyhmaWxlUGF0aC5nZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCJmaWxl
Oi8vIikgKyBTdHJpbmc6OmZyb21VVEY4KGZpbGVQYXRoLmdldCgpKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdGVzdFVSTDsKK30KKworc3RhdGljIFN0cmluZyBnZXRFeHBlY3RlZFBpeGVsSGFzaChj
b25zdCBTdHJpbmcmIHRlc3RVUkwpCit7CisgICAgY29uc3Qgc2l6ZV90IGhhc2hTZXBhcmF0b3JQ
b3MgPSB0ZXN0VVJMLmZpbmQoIiciKTsKKyAgICByZXR1cm4gKGhhc2hTZXBhcmF0b3JQb3MgPT0g
bm90Rm91bmQpID8gdGVzdFVSTC5yaWdodChoYXNoU2VwYXJhdG9yUG9zKSA6IFN0cmluZygpOwor
fQorCitzdGF0aWMgdm9pZCBjcmVhdGVMYXlvdXRUZXN0Q29udHJvbGxlcihjb25zdCBTdHJpbmcm
IHRlc3RVUkwsIGNvbnN0IFN0cmluZyYgZXhwZWN0ZWRQaXhlbEhhc2gpCit7CisgICAgZ0xheW91
dFRlc3RDb250cm9sbGVyID0KKyAgICAgICAgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmNyZWF0ZShz
dGQ6OnN0cmluZyh0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGV4cGVjdGVkUGl4ZWxIYXNoLnV0ZjgoKS5kYXRh
KCkpKTsKKworICAgIHRvcExvYWRpbmdGcmFtZSA9IDA7CisgICAgZG9uZSA9IGZhbHNlOworCisg
ICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRJY29uRGF0YWJhc2VFbmFibGVkKGZhbHNlKTsK
KworICAgIGlmIChzaG91bGRMb2dGcmFtZUxvYWREZWxlZ2F0ZXModGVzdFVSTCkpCisgICAgICAg
IGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEZyYW1lTG9hZENhbGxiYWNrcyh0cnVlKTsK
KworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCh0
cnVlKTsKKworICAgIGlmIChzaG91bGREdW1wQXNUZXh0KHRlc3RVUkwpKSB7CisgICAgICAgIGdM
YXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEFzVGV4dCh0cnVlKTsKKyAgICAgICAgZ0xheW91
dFRlc3RDb250cm9sbGVyLT5zZXRHZW5lcmF0ZVBpeGVsUmVzdWx0cyhmYWxzZSk7CisgICAgfQor
fQorCitzdGF0aWMgdm9pZCBydW5UZXN0KGNvbnN0IGNoYXIqIGNUZXN0UGF0aE9yVVJMKQorewor
ICAgIGNvbnN0IFN0cmluZyB0ZXN0UGF0aE9yVVJMID0gU3RyaW5nOjpmcm9tVVRGOChjVGVzdFBh
dGhPclVSTCk7CisgICAgQVNTRVJUKCF0ZXN0UGF0aE9yVVJMLmlzRW1wdHkoKSk7CisKKyAgICBj
b25zdCBTdHJpbmcgdGVzdFVSTCA9IGdldEZpbmFsVGVzdFVSTCh0ZXN0UGF0aE9yVVJMKTsKKyAg
ICBjb25zdCBTdHJpbmcgZXhwZWN0ZWRQaXhlbEhhc2ggPSBnZXRFeHBlY3RlZFBpeGVsSGFzaCh0
ZXN0UGF0aE9yVVJMKTsKKworICAgIGJyb3dzZXItPnJlc2V0RGVmYXVsdHNUb0NvbnNpc3RlbnRW
YWx1ZXMoKTsKKyAgICBjcmVhdGVMYXlvdXRUZXN0Q29udHJvbGxlcih0ZXN0VVJMLCBleHBlY3Rl
ZFBpeGVsSGFzaCk7CisKKyAgICBXb3JrUXVldWU6OnNoYXJlZCgpLT5jbGVhcigpOworICAgIFdv
cmtRdWV1ZTo6c2hhcmVkKCktPnNldEZyb3plbihmYWxzZSk7CisKKyAgICBjb25zdCBib29sIGlz
U1ZHVzNDVGVzdCA9IHRlc3RVUkwuY29udGFpbnMoInN2Zy9XM0MtU1ZHLTEuMSIpOworICAgIGNv
bnN0IGludCB3aWR0aCA9IGlzU1ZHVzNDVGVzdCA/IDQ4MCA6IExheW91dFRlc3RDb250cm9sbGVy
OjptYXhWaWV3V2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IGlzU1ZHVzNDVGVzdCA/IDM2
MCA6IExheW91dFRlc3RDb250cm9sbGVyOjptYXhWaWV3SGVpZ2h0OworICAgIGV2YXNfb2JqZWN0
X3Jlc2l6ZShicm93c2VyLT5tYWluVmlldygpLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGlmIChw
cmV2VGVzdEJGSXRlbSkKKyAgICAgICAgZXdrX2hpc3RvcnlfaXRlbV9mcmVlKHByZXZUZXN0QkZJ
dGVtKTsKKyAgICBjb25zdCBFd2tfSGlzdG9yeSogaGlzdG9yeSA9IGV3a192aWV3X2hpc3Rvcnlf
Z2V0KGJyb3dzZXItPm1haW5WaWV3KCkpOworICAgIHByZXZUZXN0QkZJdGVtID0gZXdrX2hpc3Rv
cnlfaGlzdG9yeV9pdGVtX2N1cnJlbnRfZ2V0KGhpc3RvcnkpOworCisgICAgZXZhc19vYmplY3Rf
Zm9jdXNfc2V0KGJyb3dzZXItPm1haW5WaWV3KCksIEVJTkFfVFJVRSk7CisgICAgZXdrX3ZpZXdf
dXJpX3NldChicm93c2VyLT5tYWluVmlldygpLCB0ZXN0VVJMLnV0ZjgoKS5kYXRhKCkpOworCisg
ICAgZWNvcmVfbWFpbl9sb29wX2JlZ2luKCk7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXIt
PmNsb3NlV2ViSW5zcGVjdG9yKCk7CisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXREZXZl
bG9wZXJFeHRyYXNFbmFibGVkKGZhbHNlKTsKKworICAgIGV3a192aWV3X3VyaV9zZXQoYnJvd3Nl
ci0+bWFpblZpZXcoKSwgImFib3V0OmJsYW5rIik7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xs
ZXIuY2xlYXIoKTsKKyAgICBzZW5kUGl4ZWxSZXN1bHRzRU9GKCk7Cit9CisKK3N0YXRpYyB2b2lk
IHJ1blRlc3RpbmdTZXJ2ZXJMb29wKCkKK3sKKyAgICBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsK
KworICAgIHdoaWxlIChmZ2V0cyhmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgc3RkaW4pKSB7
CisgICAgICAgIGNoYXIqIG5ld0xpbmUgPSBzdHJyY2hyKGZpbGVuYW1lLCAnXG4nKTsKKyAgICAg
ICAgaWYgKG5ld0xpbmUpCisgICAgICAgICAgICAqbmV3TGluZSA9ICdcMCc7CisKKyAgICAgICAg
aWYgKGZpbGVuYW1lWzBdICE9ICdcMCcpCisgICAgICAgICAgICBydW5UZXN0KGZpbGVuYW1lKTsK
KyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkanVzdE91dHB1dFR5cGVCeU1pbWVUeXBlKGNvbnN0
IEV2YXNfT2JqZWN0KiBmcmFtZSkKK3sKKyAgICBjb25zdCBTdHJpbmcgcmVzcG9uc2VNaW1lVHlw
ZShEdW1wUmVuZGVyVHJlZVN1cHBvcnRFZmw6OnJlc3BvbnNlTWltZVR5cGUoZnJhbWUpKTsKKyAg
ICBpZiAocmVzcG9uc2VNaW1lVHlwZSA9PSAidGV4dC9wbGFpbiIpIHsKKyAgICAgICAgZ0xheW91
dFRlc3RDb250cm9sbGVyLT5zZXREdW1wQXNUZXh0KHRydWUpOworICAgICAgICBnTGF5b3V0VGVz
dENvbnRyb2xsZXItPnNldEdlbmVyYXRlUGl4ZWxSZXN1bHRzKGZhbHNlKTsKKyAgICB9Cit9CisK
K3N0YXRpYyB2b2lkIGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KEV2YXNfT2JqZWN0KiBmcmFtZSkK
K3sKKyAgICBTdHJpbmcgcmVzdWx0OworICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1
bXBBc1RleHQoKSkKKyAgICAgICAgcmVzdWx0ID0gZHVtcEZyYW1lc0FzVGV4dChmcmFtZSk7Cisg
ICAgZWxzZQorICAgICAgICByZXN1bHQgPSBEdW1wUmVuZGVyVHJlZVN1cHBvcnRFZmw6OnJlbmRl
clRyZWVEdW1wKGZyYW1lKTsKKworICAgIHByaW50ZigiJXMiLCByZXN1bHQudXRmOCgpLmRhdGEo
KSk7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZER1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKCkKK3sK
KyAgICByZXR1cm4gZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQXNUZXh0KCkgJiYgIWdMYXlv
dXRUZXN0Q29udHJvbGxlci0+ZHVtcERPTUFzV2ViQXJjaGl2ZSgpICYmICFnTGF5b3V0VGVzdENv
bnRyb2xsZXItPmR1bXBTb3VyY2VBc1dlYkFyY2hpdmUoKTsKK30KKworc3RhdGljIGJvb2wgc2hv
dWxkRHVtcFBpeGVsc0FuZENvbXBhcmVXaXRoRXhwZWN0ZWQoKQoreworICAgIHJldHVybiBkdW1w
UGl4ZWxzICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+Z2VuZXJhdGVQaXhlbFJlc3VsdHMoKSAm
JiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRE9NQXNXZWJBcmNoaXZlKCkgJiYgIWdMYXlv
dXRUZXN0Q29udHJvbGxlci0+ZHVtcFNvdXJjZUFzV2ViQXJjaGl2ZSgpOworfQorCitzdGF0aWMg
Ym9vbCBzaG91bGREdW1wQmFja0ZvcndhcmRMaXN0KCkKK3sKKyAgICByZXR1cm4gZ0xheW91dFRl
c3RDb250cm9sbGVyLT5kdW1wQmFja0ZvcndhcmRMaXN0KCk7Cit9CisKK3N0YXRpYyBib29sIGlu
aXRFZmwoKQoreworICAgIGlmICghZWNvcmVfZXZhc19pbml0KCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAoIWVjb3JlX2ZpbGVfaW5pdCgpKSB7CisgICAgICAgIGVjb3JlX2V2YXNf
c2h1dGRvd24oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWVkamVf
aW5pdCgpKSB7CisgICAgICAgIGVjb3JlX2ZpbGVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNvcmVf
ZXZhc19zaHV0ZG93bigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICgh
ZXdrX2luaXQoKSkgeworICAgICAgICBlZGplX3NodXRkb3duKCk7CisgICAgICAgIGVjb3JlX2Zp
bGVfc2h1dGRvd24oKTsKKyAgICAgICAgZWNvcmVfZXZhc19zaHV0ZG93bigpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lk
IHNodXRkb3duRWZsKCkKK3sKKyAgICBld2tfc2h1dGRvd24oKTsKKyAgICBlZGplX3NodXRkb3du
KCk7CisgICAgZWNvcmVfZmlsZV9zaHV0ZG93bigpOworICAgIGVjb3JlX2V2YXNfc2h1dGRvd24o
KTsKK30KKwordm9pZCBkaXNwbGF5V2ViVmlldygpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
K30KKwordm9pZCBkdW1wKCkKK3sKKyAgICBFdmFzX09iamVjdCogZnJhbWUgPSBicm93c2VyLT5t
YWluRnJhbWUoKTsKKworICAgIGludmFsaWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1bXBXYXRjaGRv
ZygpOworCisgICAgaWYgKGR1bXBUcmVlKSB7CisgICAgICAgIGFkanVzdE91dHB1dFR5cGVCeU1p
bWVUeXBlKGZyYW1lKTsKKyAgICAgICAgZHVtcEZyYW1lQ29udGVudHNBc1RleHQoZnJhbWUpOwor
CisgICAgICAgIGlmIChzaG91bGREdW1wRnJhbWVTY3JvbGxQb3NpdGlvbigpKQorICAgICAgICAg
ICAgZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oZnJhbWUpOworCisgICAgICAgIGlmIChzaG91bGRE
dW1wQmFja0ZvcndhcmRMaXN0KCkpCisgICAgICAgICAgICBkdW1wQmFja0ZvcndhcmRMaXN0Rm9y
V2ViVmlld3MoKTsKKworICAgICAgICBpZiAocHJpbnRTZXBhcmF0b3JzKSB7CisgICAgICAgICAg
ICBwdXRzKCIjRU9GIik7CisgICAgICAgICAgICBmcHV0cygiI0VPRlxuIiwgc3RkZXJyKTsKKyAg
ICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hvdWxkRHVtcFBpeGVsc0FuZENvbXBhcmVXaXRo
RXhwZWN0ZWQoKSkKKyAgICAgICAgZHVtcFdlYlZpZXdBc1BpeGVsc0FuZENvbXBhcmVXaXRoRXhw
ZWN0ZWQoZ0xheW91dFRlc3RDb250cm9sbGVyLT5leHBlY3RlZFBpeGVsSGFzaCgpKTsKKworICAg
IGRvbmUgPSB0cnVlOworICAgIGVjb3JlX21haW5fbG9vcF9xdWl0KCk7Cit9CisKK3N0YXRpYyBF
Y29yZV9FdmFzKiBpbml0RWNvcmVFdmFzKCkKK3sKKyAgICBFY29yZV9FdmFzKiBlY29yZUV2YXMg
PSB1c2VYMTFXaW5kb3cgPyBlY29yZV9ldmFzX25ldygwLCAwLCAwLCA4MDAsIDYwMCwgMCkgOiBl
Y29yZV9ldmFzX2J1ZmZlcl9uZXcoODAwLCA2MDApOworICAgIGlmICghZWNvcmVFdmFzKSB7Cisg
ICAgICAgIHNodXRkb3duRWZsKCk7CisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9
CisKKyAgICBlY29yZV9ldmFzX3RpdGxlX3NldChlY29yZUV2YXMsICJFRkwgRHVtcFJlbmRlclRy
ZWUiKTsKKyAgICBlY29yZV9ldmFzX2NhbGxiYWNrX3Jlc2l6ZV9zZXQoZWNvcmVFdmFzLCBvbkVj
b3JlRXZhc1Jlc2l6ZSk7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19kZWxldGVfcmVxdWVzdF9z
ZXQoZWNvcmVFdmFzLCBvbkNsb3NlV2luZG93KTsKKyAgICBlY29yZV9ldmFzX3Nob3coZWNvcmVF
dmFzKTsKKworICAgIHJldHVybiBlY29yZUV2YXM7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBj
aGFyKiogYXJndikKK3sKKyAgICBpZiAoIXBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGFyZ2MsIGFy
Z3YpKQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisgICAgaWYgKCFpbml0RWZsKCkp
CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisKKyAgICBPd25QdHI8RWNvcmVfRXZhcz4g
ZWNvcmVFdmFzID0gYWRvcHRQdHIoaW5pdEVjb3JlRXZhcygpKTsKKyAgICBicm93c2VyID0gRHVt
cFJlbmRlclRyZWVDaHJvbWU6OmNyZWF0ZShlY29yZV9ldmFzX2dldChlY29yZUV2YXMuZ2V0KCkp
KTsKKyAgICBhZGRGb250c1RvRW52aXJvbm1lbnQoKTsKKworICAgIGlmICh1c2VMb25nUnVubmlu
Z1NlcnZlck1vZGUoYXJnYywgYXJndikpIHsKKyAgICAgICAgcHJpbnRTZXBhcmF0b3JzID0gdHJ1
ZTsKKyAgICAgICAgcnVuVGVzdGluZ1NlcnZlckxvb3AoKTsKKyAgICB9IGVsc2UgeworICAgICAg
ICBwcmludFNlcGFyYXRvcnMgPSAob3B0aW5kIDwgYXJnYyAtIDEgfHwgKGR1bXBQaXhlbHMgJiYg
ZHVtcFRyZWUpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9wdGluZDsgaSAhPSBhcmdjOyArK2kp
CisgICAgICAgICAgICBydW5UZXN0KGFyZ3ZbaV0pOworICAgIH0KKworICAgIGVjb3JlRXZhcy5j
bGVhcigpOworCisgICAgc2h1dGRvd25FZmwoKTsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwor
fQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109507</attachid>
            <date>2011-10-03 12:25:08 -0700</date>
            <delta_ts>2011-10-04 09:22:14 -0700</delta_ts>
            <desc>Fix a few bugs, rebase on top of trunk</desc>
            <filename>bug-62034-20111003162457.patch</filename>
            <type>text/plain</type>
            <size>14310</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTY0OTgKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA1ODNjZDEyZmIwN2U0ZGIyMjczYTE0ZThkMWMzMjkzZjY3
YjRhOGNkLi45ZDM4YTM0NmM1MWJiY2UyYTM1YTIwODg1OGU2MGVjZmExYmQyNmI1IDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNDIg
QEAKIDIwMTEtMTAtMDMgIFJhcGhhZWwgS3VibyBkYSBDb3N0YSAgPGt1Ym9AcHJvZnVzaW9uLm1v
Ymk+CiAKKyAgICAgICAgW0VGTF0gRFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwLgorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIwMzQKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIGlzIHRoZSBtYWlu
IGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIEVGTCdzIER1bXBSZW5kZXJUcmVlLgorCisgICAgICAg
ICogRHVtcFJlbmRlclRyZWUvZWZsL0R1bXBSZW5kZXJUcmVlLmNwcDogQWRkZWQuCisgICAgICAg
IChkdW1wRnJhbWVzQXNUZXh0KToKKyAgICAgICAgKGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKToK
KyAgICAgICAgKHNob3VsZExvZ0ZyYW1lTG9hZERlbGVnYXRlcyk6CisgICAgICAgIChzaG91bGRE
dW1wQXNUZXh0KToKKyAgICAgICAgKHNlbmRQaXhlbFJlc3VsdHNFT0YpOgorICAgICAgICAoaW52
YWxpZGF0ZUFueVByZXZpb3VzV2FpdFRvRHVtcFdhdGNoZG9nKToKKyAgICAgICAgKG9uRWNvcmVF
dmFzUmVzaXplKToKKyAgICAgICAgKG9uQ2xvc2VXaW5kb3cpOgorICAgICAgICAodXNlTG9uZ1J1
bm5pbmdTZXJ2ZXJNb2RlKToKKyAgICAgICAgKHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKToKKyAg
ICAgICAgKGdldEZpbmFsVGVzdFVSTCk6CisgICAgICAgIChnZXRFeHBlY3RlZFBpeGVsSGFzaCk6
CisgICAgICAgIChjcmVhdGVMYXlvdXRUZXN0Q29udHJvbGxlcik6CisgICAgICAgIChydW5UZXN0
KToKKyAgICAgICAgKHJ1blRlc3RpbmdTZXJ2ZXJMb29wKToKKyAgICAgICAgKGFkanVzdE91dHB1
dFR5cGVCeU1pbWVUeXBlKToKKyAgICAgICAgKGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KToKKyAg
ICAgICAgKHNob3VsZER1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKHNob3VsZER1
bXBQaXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVkKToKKyAgICAgICAgKHNob3VsZER1bXBCYWNr
Rm9yd2FyZExpc3QpOgorICAgICAgICAoaW5pdEVmbCk6CisgICAgICAgIChzaHV0ZG93bkVmbCk6
CisgICAgICAgIChkaXNwbGF5V2ViVmlldyk6CisgICAgICAgIChkdW1wKToKKyAgICAgICAgKGlu
aXRFY29yZUV2YXMpOgorICAgICAgICAobWFpbik6CisKKzIwMTEtMTAtMDMgIFJhcGhhZWwgS3Vi
byBkYSBDb3N0YSAgPGt1Ym9AcHJvZnVzaW9uLm1vYmk+CisKICAgICAgICAgW0VGTF0gRFJUOiBB
ZGQgRHVtcEhpc3RvcnlJdGVtLntjcHAsaH0KICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTYzOTkyCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJU
cmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHAgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVt
cFJlbmRlclRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQwYjgxYjkwOGRiZDUzNTc5Njc1MWY2OWU0MTMw
MTBjYTBiMGJiODYKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwv
RHVtcFJlbmRlclRyZWUuY3BwCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEg
U2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkR1bXBSZW5kZXJUcmVlLmgiCisKKyNpbmNsdWRlICJEdW1wSGlzdG9yeUl0ZW0uaCIK
KyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZUNocm9tZS5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJU
cmVlVmlldy5oIgorI2luY2x1ZGUgIkV2ZW50U2VuZGVyLmgiCisjaW5jbHVkZSAiRm9udE1hbmFn
ZW1lbnQuaCIKKyNpbmNsdWRlICJMYXlvdXRUZXN0Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGl4ZWxEdW1wU3VwcG9ydC5oIgorI2luY2x1ZGUg
IldlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEVmbC5oIgorI2luY2x1ZGUgIldv
cmtRdWV1ZS5oIgorI2luY2x1ZGUgImV3a19wcml2YXRlLmgiIC8vIEZJWE1FOiBjcmVhdGUgc29t
ZSBXZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZS5jcHAgaW5zdGVhZAorI2luY2x1ZGUgPEVX
ZWJLaXQuaD4KKyNpbmNsdWRlIDxFY29yZS5oPgorI2luY2x1ZGUgPEVjb3JlX0V2YXMuaD4KKyNp
bmNsdWRlIDxFY29yZV9GaWxlLmg+CisjaW5jbHVkZSA8RWRqZS5oPgorI2luY2x1ZGUgPEV2YXMu
aD4KKyNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25maWcuaD4KKyNpbmNsdWRlIDxnZXRvcHQu
aD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0ZXh0L0NTdHJpbmcuaD4KKyNpbmNs
dWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx3dGYvT3duRmFzdE1hbGxvY1B0ci5oPgorI2luY2x1
ZGUgPHd0Zi9Pd25QdHIuaD4KKworT3duUHRyPER1bXBSZW5kZXJUcmVlQ2hyb21lPiBicm93c2Vy
OworRXZhc19PYmplY3QqIHRvcExvYWRpbmdGcmFtZSA9IDA7Citib29sIHdhaXRGb3JQb2xpY3kg
PSBmYWxzZTsKK0Vjb3JlX1RpbWVyKiB3YWl0VG9EdW1wV2F0Y2hkb2cgPSAwOworZXh0ZXJuIEV3
a19IaXN0b3J5X0l0ZW0qIHByZXZUZXN0QkZJdGVtOworCisvLyBGcm9tIHRoZSB0b3AtbGV2ZWwg
RHVtcFJlbmRlclRyZWUuaAorUmVmUHRyPExheW91dFRlc3RDb250cm9sbGVyPiBnTGF5b3V0VGVz
dENvbnRyb2xsZXI7Cit2b2xhdGlsZSBib29sIGRvbmUgPSBmYWxzZTsKKworc3RhdGljIGludCBk
dW1wUGl4ZWxzID0gZmFsc2U7CitzdGF0aWMgaW50IGR1bXBUcmVlID0gdHJ1ZTsKK3N0YXRpYyBp
bnQgcHJpbnRTZXBhcmF0b3JzID0gdHJ1ZTsKK3N0YXRpYyBpbnQgdXNlWDExV2luZG93ID0gZmFs
c2U7CisKK3N0YXRpYyBTdHJpbmcgZHVtcEZyYW1lc0FzVGV4dChFdmFzX09iamVjdCogZnJhbWUp
Cit7CisgICAgU3RyaW5nIHJlc3VsdDsKKworICAgIGlmIChicm93c2VyLT5tYWluRnJhbWUoKSAh
PSBmcmFtZSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbi0tLS0tLS0tXG5GcmFtZTogJyIp
OworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZzo6ZnJvbVVURjgoZXdrX2ZyYW1lX25hbWVf
Z2V0KGZyYW1lKSkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCInXG4tLS0tLS0tLVxuIik7Cisg
ICAgfQorCisgICAgY29uc3QgT3duRmFzdE1hbGxvY1B0cjxjaGFyPiBmcmFtZUNvbnRlbnRzKGV3
a19mcmFtZV9wbGFpbl90ZXh0X2dldChmcmFtZSkpOworICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5n
Ojpmcm9tVVRGOChmcmFtZUNvbnRlbnRzLmdldCgpKSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXG4i
KTsKKworICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBDaGlsZEZyYW1lc0FzVGV4
dCgpKSB7CisgICAgICAgIEVpbmFfTGlzdCogY2hpbGRyZW4gPSBEdW1wUmVuZGVyVHJlZVN1cHBv
cnRFZmw6OmZyYW1lQ2hpbGRyZW4oZnJhbWUpOworICAgICAgICB2b2lkKiBpdGVyYXRvcjsKKwor
ICAgICAgICBFSU5BX0xJU1RfRlJFRShjaGlsZHJlbiwgaXRlcmF0b3IpIHsKKyAgICAgICAgICAg
IEV2YXNfT2JqZWN0KiBjdXJyZW50RnJhbWUgPSBzdGF0aWNfY2FzdDxFdmFzX09iamVjdCo+KGl0
ZXJhdG9yKTsKKyAgICAgICAgICAgIFN0cmluZyB0ZW1wVGV4dChkdW1wRnJhbWVzQXNUZXh0KGN1
cnJlbnRGcmFtZSkpOworCisgICAgICAgICAgICBpZiAodGVtcFRleHQuaXNFbXB0eSgpKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRlbXBU
ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRp
YyB2b2lkIGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKEV2YXNfT2JqZWN0KikKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGRMb2dGcmFtZUxvYWREZWxlZ2F0
ZXMoY29uc3QgU3RyaW5nJiBwYXRoT3JVUkwpCit7CisgICAgcmV0dXJuIHBhdGhPclVSTC5jb250
YWlucygibG9hZGluZy8iKTsKK30KKworc3RhdGljIGJvb2wgc2hvdWxkRHVtcEFzVGV4dChjb25z
dCBTdHJpbmcmIHBhdGhPclVSTCkKK3sKKyAgICByZXR1cm4gcGF0aE9yVVJMLmNvbnRhaW5zKCJk
dW1wQXNUZXh0LyIpOworfQorCitzdGF0aWMgdm9pZCBzZW5kUGl4ZWxSZXN1bHRzRU9GKCkKK3sK
KyAgICBwdXRzKCIjRU9GIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZmZsdXNoKHN0ZGVy
cik7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1bXBXYXRj
aGRvZygpCit7CisgICAgaWYgKHdhaXRUb0R1bXBXYXRjaGRvZykgeworICAgICAgICBlY29yZV90
aW1lcl9kZWwod2FpdFRvRHVtcFdhdGNoZG9nKTsKKyAgICAgICAgd2FpdFRvRHVtcFdhdGNoZG9n
ID0gMDsKKyAgICB9CisgICAgd2FpdEZvclBvbGljeSA9IGZhbHNlOworfQorCitzdGF0aWMgdm9p
ZCBvbkVjb3JlRXZhc1Jlc2l6ZShFY29yZV9FdmFzKiBlY29yZUV2YXMpCit7CisgICAgaW50IHdp
ZHRoLCBoZWlnaHQ7CisKKyAgICBlY29yZV9ldmFzX2dlb21ldHJ5X2dldChlY29yZUV2YXMsIDAs
IDAsICZ3aWR0aCwgJmhlaWdodCk7CisgICAgZXZhc19vYmplY3RfbW92ZShicm93c2VyLT5tYWlu
VmlldygpLCAwLCAwKTsKKyAgICBldmFzX29iamVjdF9yZXNpemUoYnJvd3Nlci0+bWFpblZpZXco
KSwgd2lkdGgsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uQ2xvc2VXaW5kb3coRWNvcmVf
RXZhcyopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworc3RhdGljIEVpbmFfQm9vbCB1
c2VMb25nUnVubmluZ1NlcnZlck1vZGUoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIHJl
dHVybiAoYXJnYyA9PSBvcHRpbmQgKyAxICYmICFzdHJjbXAoYXJndltvcHRpbmRdLCAiLSIpKTsK
K30KKworc3RhdGljIGJvb2wgcGFyc2VDb21tYW5kTGluZU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIq
KiBhcmd2KQoreworICAgIHN0YXRpYyBjb25zdCBvcHRpb24gb3B0aW9uc1tdID0geworICAgICAg
ICB7Im5vdHJlZSIsIG5vX2FyZ3VtZW50LCAmZHVtcFRyZWUsIGZhbHNlfSwKKyAgICAgICAgeyJw
aXhlbC10ZXN0cyIsIG5vX2FyZ3VtZW50LCAmZHVtcFBpeGVscywgdHJ1ZX0sCisgICAgICAgIHsi
dHJlZSIsIG5vX2FyZ3VtZW50LCAmZHVtcFRyZWUsIHRydWV9LAorICAgICAgICB7Imd1aSIsIG5v
X2FyZ3VtZW50LCAmdXNlWDExV2luZG93LCB0cnVlfSwKKyAgICAgICAgezAsIDAsIDAsIDB9Cisg
ICAgfTsKKyAgICBpbnQgb3B0aW9uOworCisgICAgd2hpbGUgKChvcHRpb24gPSBnZXRvcHRfbG9u
ZyhhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YsICIiLCBvcHRpb25zLCAwKSkgIT0gLTEpIHsKKyAg
ICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAgIGNhc2Ug
JzonOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIHRydWU7Cit9CisKKworc3RhdGljIFN0cmluZyBnZXRGaW5hbFRlc3RVUkwoY29uc3Qg
U3RyaW5nJiB0ZXN0VVJMKQoreworICAgIGNvbnN0IHNpemVfdCBoYXNoU2VwYXJhdG9yUG9zID0g
dGVzdFVSTC5maW5kKCInIik7CisgICAgaWYgKGhhc2hTZXBhcmF0b3JQb3MgIT0gbm90Rm91bmQp
CisgICAgICAgIHJldHVybiBnZXRGaW5hbFRlc3RVUkwodGVzdFVSTC5sZWZ0KGhhc2hTZXBhcmF0
b3JQb3MpKTsKKworICAgIC8vIENvbnZlcnQgdGhlIHBhdGggaW50byBhIGZ1bGwgZmlsZSBVUkwg
aWYgaXQgZG9lcyBub3QgbG9vaworICAgIC8vIGxpa2UgYW4gSFRUUC9TIFVSTCAoZG9lc24ndCBz
dGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLgorICAgIGlmICghdGVzdFVSTC5zdGFydHNX
aXRoKCJodHRwOi8vIikgfHwgIXRlc3RVUkwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSkgeworICAg
ICAgICBPd25GYXN0TWFsbG9jUHRyPGNoYXI+IGZpbGVQYXRoKGVjb3JlX2ZpbGVfcmVhbHBhdGgo
dGVzdFVSTC51dGY4KCkuZGF0YSgpKSk7CisKKyAgICAgICAgaWYgKGVjb3JlX2ZpbGVfZXhpc3Rz
KGZpbGVQYXRoLmdldCgpKSkKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcoImZpbGU6Ly8iKSAr
IFN0cmluZzo6ZnJvbVVURjgoZmlsZVBhdGguZ2V0KCkpOworICAgIH0KKworICAgIHJldHVybiB0
ZXN0VVJMOworfQorCitzdGF0aWMgU3RyaW5nIGdldEV4cGVjdGVkUGl4ZWxIYXNoKGNvbnN0IFN0
cmluZyYgdGVzdFVSTCkKK3sKKyAgICBjb25zdCBzaXplX3QgaGFzaFNlcGFyYXRvclBvcyA9IHRl
c3RVUkwuZmluZCgiJyIpOworICAgIHJldHVybiAoaGFzaFNlcGFyYXRvclBvcyAhPSBub3RGb3Vu
ZCkgPyB0ZXN0VVJMLnN1YnN0cmluZyhoYXNoU2VwYXJhdG9yUG9zICsgMSkgOiBTdHJpbmcoKTsK
K30KKworc3RhdGljIHZvaWQgY3JlYXRlTGF5b3V0VGVzdENvbnRyb2xsZXIoY29uc3QgU3RyaW5n
JiB0ZXN0VVJMLCBjb25zdCBTdHJpbmcmIGV4cGVjdGVkUGl4ZWxIYXNoKQoreworICAgIGdMYXlv
dXRUZXN0Q29udHJvbGxlciA9CisgICAgICAgIExheW91dFRlc3RDb250cm9sbGVyOjpjcmVhdGUo
c3RkOjpzdHJpbmcodGVzdFVSTC51dGY4KCkuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhleHBlY3RlZFBpeGVsSGFzaC51dGY4KCkuZGF0
YSgpKSk7CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOworICAgIGRvbmUgPSBmYWxzZTsKKwor
ICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0SWNvbkRhdGFiYXNlRW5hYmxlZChmYWxzZSk7
CisKKyAgICBpZiAoc2hvdWxkTG9nRnJhbWVMb2FkRGVsZWdhdGVzKHRlc3RVUkwpKQorICAgICAg
ICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBGcmFtZUxvYWRDYWxsYmFja3ModHJ1ZSk7
CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldERldmVsb3BlckV4dHJhc0VuYWJsZWQo
dHJ1ZSk7CisKKyAgICBpZiAoc2hvdWxkRHVtcEFzVGV4dCh0ZXN0VVJMKSkgeworICAgICAgICBn
TGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBBc1RleHQodHJ1ZSk7CisgICAgICAgIGdMYXlv
dXRUZXN0Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQaXhlbFJlc3VsdHMoZmFsc2UpOworICAgIH0K
K30KKworc3RhdGljIHZvaWQgcnVuVGVzdChjb25zdCBjaGFyKiBjVGVzdFBhdGhPclVSTCkKK3sK
KyAgICBjb25zdCBTdHJpbmcgdGVzdFBhdGhPclVSTCA9IFN0cmluZzo6ZnJvbVVURjgoY1Rlc3RQ
YXRoT3JVUkwpOworICAgIEFTU0VSVCghdGVzdFBhdGhPclVSTC5pc0VtcHR5KCkpOworCisgICAg
Y29uc3QgU3RyaW5nIHRlc3RVUkwgPSBnZXRGaW5hbFRlc3RVUkwodGVzdFBhdGhPclVSTCk7Cisg
ICAgY29uc3QgU3RyaW5nIGV4cGVjdGVkUGl4ZWxIYXNoID0gZ2V0RXhwZWN0ZWRQaXhlbEhhc2go
dGVzdFBhdGhPclVSTCk7CisKKyAgICBicm93c2VyLT5yZXNldERlZmF1bHRzVG9Db25zaXN0ZW50
VmFsdWVzKCk7CisgICAgY3JlYXRlTGF5b3V0VGVzdENvbnRyb2xsZXIodGVzdFVSTCwgZXhwZWN0
ZWRQaXhlbEhhc2gpOworCisgICAgV29ya1F1ZXVlOjpzaGFyZWQoKS0+Y2xlYXIoKTsKKyAgICBX
b3JrUXVldWU6OnNoYXJlZCgpLT5zZXRGcm96ZW4oZmFsc2UpOworCisgICAgY29uc3QgYm9vbCBp
c1NWR1czQ1Rlc3QgPSB0ZXN0VVJMLmNvbnRhaW5zKCJzdmcvVzNDLVNWRy0xLjEiKTsKKyAgICBj
b25zdCBpbnQgd2lkdGggPSBpc1NWR1czQ1Rlc3QgPyA0ODAgOiBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6bWF4Vmlld1dpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBpc1NWR1czQ1Rlc3QgPyAz
NjAgOiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld0hlaWdodDsKKyAgICBldmFzX29iamVj
dF9yZXNpemUoYnJvd3Nlci0+bWFpblZpZXcoKSwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBpZiAo
cHJldlRlc3RCRkl0ZW0pCisgICAgICAgIGV3a19oaXN0b3J5X2l0ZW1fZnJlZShwcmV2VGVzdEJG
SXRlbSk7CisgICAgY29uc3QgRXdrX0hpc3RvcnkqIGhpc3RvcnkgPSBld2tfdmlld19oaXN0b3J5
X2dldChicm93c2VyLT5tYWluVmlldygpKTsKKyAgICBwcmV2VGVzdEJGSXRlbSA9IGV3a19oaXN0
b3J5X2hpc3RvcnlfaXRlbV9jdXJyZW50X2dldChoaXN0b3J5KTsKKworICAgIGV2YXNfb2JqZWN0
X2ZvY3VzX3NldChicm93c2VyLT5tYWluVmlldygpLCBFSU5BX1RSVUUpOworICAgIGV3a192aWV3
X3VyaV9zZXQoYnJvd3Nlci0+bWFpblZpZXcoKSwgdGVzdFVSTC51dGY4KCkuZGF0YSgpKTsKKwor
ICAgIGVjb3JlX21haW5fbG9vcF9iZWdpbigpOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVy
LT5jbG9zZVdlYkluc3BlY3RvcigpOworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RGV2
ZWxvcGVyRXh0cmFzRW5hYmxlZChmYWxzZSk7CisKKyAgICBld2tfdmlld191cmlfc2V0KGJyb3dz
ZXItPm1haW5WaWV3KCksICJhYm91dDpibGFuayIpOworCisgICAgZ0xheW91dFRlc3RDb250cm9s
bGVyLmNsZWFyKCk7CisgICAgc2VuZFBpeGVsUmVzdWx0c0VPRigpOworfQorCitzdGF0aWMgdm9p
ZCBydW5UZXN0aW5nU2VydmVyTG9vcCgpCit7CisgICAgY2hhciBmaWxlbmFtZVtQQVRIX01BWF07
CisKKyAgICB3aGlsZSAoZmdldHMoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksIHN0ZGluKSkg
eworICAgICAgICBjaGFyKiBuZXdMaW5lID0gc3RycmNocihmaWxlbmFtZSwgJ1xuJyk7CisgICAg
ICAgIGlmIChuZXdMaW5lKQorICAgICAgICAgICAgKm5ld0xpbmUgPSAnXDAnOworCisgICAgICAg
IGlmIChmaWxlbmFtZVswXSAhPSAnXDAnKQorICAgICAgICAgICAgcnVuVGVzdChmaWxlbmFtZSk7
CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGp1c3RPdXRwdXRUeXBlQnlNaW1lVHlwZShjb25z
dCBFdmFzX09iamVjdCogZnJhbWUpCit7CisgICAgY29uc3QgU3RyaW5nIHJlc3BvbnNlTWltZVR5
cGUoRHVtcFJlbmRlclRyZWVTdXBwb3J0RWZsOjpyZXNwb25zZU1pbWVUeXBlKGZyYW1lKSk7Cisg
ICAgaWYgKHJlc3BvbnNlTWltZVR5cGUgPT0gInRleHQvcGxhaW4iKSB7CisgICAgICAgIGdMYXlv
dXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEFzVGV4dCh0cnVlKTsKKyAgICAgICAgZ0xheW91dFRl
c3RDb250cm9sbGVyLT5zZXRHZW5lcmF0ZVBpeGVsUmVzdWx0cyhmYWxzZSk7CisgICAgfQorfQor
CitzdGF0aWMgdm9pZCBkdW1wRnJhbWVDb250ZW50c0FzVGV4dChFdmFzX09iamVjdCogZnJhbWUp
Cit7CisgICAgU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5k
dW1wQXNUZXh0KCkpCisgICAgICAgIHJlc3VsdCA9IGR1bXBGcmFtZXNBc1RleHQoZnJhbWUpOwor
ICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gRHVtcFJlbmRlclRyZWVTdXBwb3J0RWZsOjpyZW5k
ZXJUcmVlRHVtcChmcmFtZSk7CisKKyAgICBwcmludGYoIiVzIiwgcmVzdWx0LnV0ZjgoKS5kYXRh
KCkpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGREdW1wRnJhbWVTY3JvbGxQb3NpdGlvbigpCit7
CisgICAgcmV0dXJuIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEFzVGV4dCgpICYmICFnTGF5
b3V0VGVzdENvbnRyb2xsZXItPmR1bXBET01Bc1dlYkFyY2hpdmUoKSAmJiAhZ0xheW91dFRlc3RD
b250cm9sbGVyLT5kdW1wU291cmNlQXNXZWJBcmNoaXZlKCk7Cit9CisKK3N0YXRpYyBib29sIHNo
b3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVkKCkKK3sKKyAgICByZXR1cm4gZHVt
cFBpeGVscyAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmdlbmVyYXRlUGl4ZWxSZXN1bHRzKCkg
JiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcERPTUFzV2ViQXJjaGl2ZSgpICYmICFnTGF5
b3V0VGVzdENvbnRyb2xsZXItPmR1bXBTb3VyY2VBc1dlYkFyY2hpdmUoKTsKK30KKworc3RhdGlj
IGJvb2wgc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlzdCgpCit7CisgICAgcmV0dXJuIGdMYXlvdXRU
ZXN0Q29udHJvbGxlci0+ZHVtcEJhY2tGb3J3YXJkTGlzdCgpOworfQorCitzdGF0aWMgYm9vbCBp
bml0RWZsKCkKK3sKKyAgICBpZiAoIWVjb3JlX2V2YXNfaW5pdCgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgaWYgKCFlY29yZV9maWxlX2luaXQoKSkgeworICAgICAgICBlY29yZV9ldmFz
X3NodXRkb3duKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFlZGpl
X2luaXQoKSkgeworICAgICAgICBlY29yZV9maWxlX3NodXRkb3duKCk7CisgICAgICAgIGVjb3Jl
X2V2YXNfc2h1dGRvd24oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAo
IWV3a19pbml0KCkpIHsKKyAgICAgICAgZWRqZV9zaHV0ZG93bigpOworICAgICAgICBlY29yZV9m
aWxlX3NodXRkb3duKCk7CisgICAgICAgIGVjb3JlX2V2YXNfc2h1dGRvd24oKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9p
ZCBzaHV0ZG93bkVmbCgpCit7CisgICAgZXdrX3NodXRkb3duKCk7CisgICAgZWRqZV9zaHV0ZG93
bigpOworICAgIGVjb3JlX2ZpbGVfc2h1dGRvd24oKTsKKyAgICBlY29yZV9ldmFzX3NodXRkb3du
KCk7Cit9CisKK3ZvaWQgZGlzcGxheVdlYlZpZXcoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7
Cit9CisKK3ZvaWQgZHVtcCgpCit7CisgICAgRXZhc19PYmplY3QqIGZyYW1lID0gYnJvd3Nlci0+
bWFpbkZyYW1lKCk7CisKKyAgICBpbnZhbGlkYXRlQW55UHJldmlvdXNXYWl0VG9EdW1wV2F0Y2hk
b2coKTsKKworICAgIGlmIChkdW1wVHJlZSkgeworICAgICAgICBhZGp1c3RPdXRwdXRUeXBlQnlN
aW1lVHlwZShmcmFtZSk7CisgICAgICAgIGR1bXBGcmFtZUNvbnRlbnRzQXNUZXh0KGZyYW1lKTsK
KworICAgICAgICBpZiAoc2hvdWxkRHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oKSkKKyAgICAgICAg
ICAgIGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKGZyYW1lKTsKKworICAgICAgICBpZiAoc2hvdWxk
RHVtcEJhY2tGb3J3YXJkTGlzdCgpKQorICAgICAgICAgICAgZHVtcEJhY2tGb3J3YXJkTGlzdEZv
cldlYlZpZXdzKCk7CisKKyAgICAgICAgaWYgKHByaW50U2VwYXJhdG9ycykgeworICAgICAgICAg
ICAgcHV0cygiI0VPRiIpOworICAgICAgICAgICAgZnB1dHMoIiNFT0ZcbiIsIHN0ZGVycik7Cisg
ICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0
aEV4cGVjdGVkKCkpCisgICAgICAgIGR1bXBXZWJWaWV3QXNQaXhlbHNBbmRDb21wYXJlV2l0aEV4
cGVjdGVkKGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZXhwZWN0ZWRQaXhlbEhhc2goKSk7CisKKyAg
ICBkb25lID0gdHJ1ZTsKKyAgICBlY29yZV9tYWluX2xvb3BfcXVpdCgpOworfQorCitzdGF0aWMg
RWNvcmVfRXZhcyogaW5pdEVjb3JlRXZhcygpCit7CisgICAgRWNvcmVfRXZhcyogZWNvcmVFdmFz
ID0gdXNlWDExV2luZG93ID8gZWNvcmVfZXZhc19uZXcoMCwgMCwgMCwgODAwLCA2MDAsIDApIDog
ZWNvcmVfZXZhc19idWZmZXJfbmV3KDgwMCwgNjAwKTsKKyAgICBpZiAoIWVjb3JlRXZhcykgewor
ICAgICAgICBzaHV0ZG93bkVmbCgpOworICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAg
fQorCisgICAgZWNvcmVfZXZhc190aXRsZV9zZXQoZWNvcmVFdmFzLCAiRUZMIER1bXBSZW5kZXJU
cmVlIik7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19yZXNpemVfc2V0KGVjb3JlRXZhcywgb25F
Y29yZUV2YXNSZXNpemUpOworICAgIGVjb3JlX2V2YXNfY2FsbGJhY2tfZGVsZXRlX3JlcXVlc3Rf
c2V0KGVjb3JlRXZhcywgb25DbG9zZVdpbmRvdyk7CisgICAgZWNvcmVfZXZhc19zaG93KGVjb3Jl
RXZhcyk7CisKKyAgICByZXR1cm4gZWNvcmVFdmFzOworfQorCitpbnQgbWFpbihpbnQgYXJnYywg
Y2hhcioqIGFyZ3YpCit7CisgICAgaWYgKCFwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhhcmdjLCBh
cmd2KSkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAgIGlmICghaW5pdEVmbCgp
KQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisgICAgT3duUHRyPEVjb3JlX0V2YXM+
IGVjb3JlRXZhcyA9IGFkb3B0UHRyKGluaXRFY29yZUV2YXMoKSk7CisgICAgYnJvd3NlciA9IER1
bXBSZW5kZXJUcmVlQ2hyb21lOjpjcmVhdGUoZWNvcmVfZXZhc19nZXQoZWNvcmVFdmFzLmdldCgp
KSk7CisgICAgYWRkRm9udHNUb0Vudmlyb25tZW50KCk7CisKKyAgICBpZiAodXNlTG9uZ1J1bm5p
bmdTZXJ2ZXJNb2RlKGFyZ2MsIGFyZ3YpKSB7CisgICAgICAgIHByaW50U2VwYXJhdG9ycyA9IHRy
dWU7CisgICAgICAgIHJ1blRlc3RpbmdTZXJ2ZXJMb29wKCk7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgcHJpbnRTZXBhcmF0b3JzID0gKG9wdGluZCA8IGFyZ2MgLSAxIHx8IChkdW1wUGl4ZWxzICYm
IGR1bXBUcmVlKSk7CisgICAgICAgIGZvciAoaW50IGkgPSBvcHRpbmQ7IGkgIT0gYXJnYzsgKytp
KQorICAgICAgICAgICAgcnVuVGVzdChhcmd2W2ldKTsKKyAgICB9CisKKyAgICBlY29yZUV2YXMu
Y2xlYXIoKTsKKworICAgIHNodXRkb3duRWZsKCk7CisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsK
K30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109631</attachid>
            <date>2011-10-04 09:22:25 -0700</date>
            <delta_ts>2011-10-04 11:14:38 -0700</delta_ts>
            <desc>Fix the issues pointed out by tonikitoo</desc>
            <filename>bug-62034-20111004132214.patch</filename>
            <type>text/plain</type>
            <size>14217</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTY1OTYKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCBiMTJjZGJhMTk0NGI2NGUxZmRlOTEzMWUxMGJhZTJlYWM2
ZjgxZGU2Li42NTExZDZmNzg5YTBkYmQ3ZDQzOTA2ODE5YmIwZTEyNGRkZTQ3ZDQ0IDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDAg
QEAKKzIwMTEtMTAtMDQgIFJhcGhhZWwgS3VibyBkYSBDb3N0YSAgPGt1Ym9AcHJvZnVzaW9uLm1v
Ymk+CisKKyAgICAgICAgW0VGTF0gRFJUOiBBZGQgRHVtcFJlbmRlclRyZWUuY3BwCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MjAzNAorCisgICAgICAg
IFJldmlld2VkIGJ5IEFudG9uaW8gR29tZXMuCisKKyAgICAgICAgVGhpcyBpcyB0aGUgbWFpbiBp
bXBsZW1lbnRhdGlvbiBmaWxlIGZvciBFRkwncyBEdW1wUmVuZGVyVHJlZS4KKworICAgICAgICAq
IER1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHA6IEFkZGVkLgorICAgICAgICAo
ZHVtcEZyYW1lc0FzVGV4dCk6CisgICAgICAgIChkdW1wRnJhbWVTY3JvbGxQb3NpdGlvbik6Cisg
ICAgICAgIChzaG91bGRMb2dGcmFtZUxvYWREZWxlZ2F0ZXMpOgorICAgICAgICAoc2hvdWxkRHVt
cEFzVGV4dCk6CisgICAgICAgIChzZW5kUGl4ZWxSZXN1bHRzRU9GKToKKyAgICAgICAgKGludmFs
aWRhdGVBbnlQcmV2aW91c1dhaXRUb0R1bXBXYXRjaGRvZyk6CisgICAgICAgIChvbkVjb3JlRXZh
c1Jlc2l6ZSk6CisgICAgICAgIChvbkNsb3NlV2luZG93KToKKyAgICAgICAgKHVzZUxvbmdSdW5u
aW5nU2VydmVyTW9kZSk6CisgICAgICAgIChwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyk6CisgICAg
ICAgIChnZXRGaW5hbFRlc3RVUkwpOgorICAgICAgICAoZ2V0RXhwZWN0ZWRQaXhlbEhhc2gpOgor
ICAgICAgICAoY3JlYXRlTGF5b3V0VGVzdENvbnRyb2xsZXIpOgorICAgICAgICAocnVuVGVzdCk6
CisgICAgICAgIChydW5UZXN0aW5nU2VydmVyTG9vcCk6CisgICAgICAgIChhZGp1c3RPdXRwdXRU
eXBlQnlNaW1lVHlwZSk6CisgICAgICAgIChkdW1wRnJhbWVDb250ZW50c0FzVGV4dCk6CisgICAg
ICAgIChzaG91bGREdW1wRnJhbWVTY3JvbGxQb3NpdGlvbik6CisgICAgICAgIChzaG91bGREdW1w
UGl4ZWxzQW5kQ29tcGFyZVdpdGhFeHBlY3RlZCk6CisgICAgICAgIChzaG91bGREdW1wQmFja0Zv
cndhcmRMaXN0KToKKyAgICAgICAgKGluaXRFZmwpOgorICAgICAgICAoc2h1dGRvd25FZmwpOgor
ICAgICAgICAoZGlzcGxheVdlYlZpZXcpOgorICAgICAgICAoZHVtcCk6CisgICAgICAgIChpbml0
RWNvcmVFdmFzKToKKyAgICAgICAgKG1haW4pOgorCiAyMDExLTEwLTAzICBBZGFtIEJhcnRoICA8
YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAgICAgICAgZ2FyZGVuLW8tbWF0aWMgc2hvdWxkIHJlbW92
ZSBidWlsZGVycyBmcm9tIHRoZSBmYWlsdXJlIGdyaWQgb25jZSB0aGV5IHN0YXJ0IHRvIHBhc3MK
ZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9EdW1wUmVuZGVyVHJlZS5jcHAg
Yi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjUxYzFmYjhhMTBmZTkzM2I1ZGEwY2UxZTgxZWZiNGFiZmRmNDk5ZDcKLS0tIC9kZXYvbnVsbAor
KysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRHVtcFJlbmRlclRyZWUuY3BwCkBAIC0wLDAg
KzEsNDE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBT
eXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlLmgiCisK
KyNpbmNsdWRlICJEdW1wSGlzdG9yeUl0ZW0uaCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZUNo
cm9tZS5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlVmlldy5oIgorI2luY2x1ZGUgIkV2ZW50
U2VuZGVyLmgiCisjaW5jbHVkZSAiRm9udE1hbmFnZW1lbnQuaCIKKyNpbmNsdWRlICJMYXlvdXRU
ZXN0Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAi
UGl4ZWxEdW1wU3VwcG9ydC5oIgorI2luY2x1ZGUgIldlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJU
cmVlU3VwcG9ydEVmbC5oIgorI2luY2x1ZGUgIldvcmtRdWV1ZS5oIgorI2luY2x1ZGUgImV3a19w
cml2YXRlLmgiCisjaW5jbHVkZSA8RVdlYktpdC5oPgorI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5j
bHVkZSA8RWNvcmVfRXZhcy5oPgorI2luY2x1ZGUgPEVjb3JlX0ZpbGUuaD4KKyNpbmNsdWRlIDxF
ZGplLmg+CisjaW5jbHVkZSA8RXZhcy5oPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZp
Zy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUg
PHRleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25G
YXN0TWFsbG9jUHRyLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCitPd25QdHI8RHVtcFJl
bmRlclRyZWVDaHJvbWU+IGJyb3dzZXI7CitFdmFzX09iamVjdCogdG9wTG9hZGluZ0ZyYW1lID0g
MDsKK2Jvb2wgd2FpdEZvclBvbGljeSA9IGZhbHNlOworRWNvcmVfVGltZXIqIHdhaXRUb0R1bXBX
YXRjaGRvZyA9IDA7CitleHRlcm4gRXdrX0hpc3RvcnlfSXRlbSogcHJldlRlc3RCRkl0ZW07CisK
Ky8vIEZyb20gdGhlIHRvcC1sZXZlbCBEdW1wUmVuZGVyVHJlZS5oCitSZWZQdHI8TGF5b3V0VGVz
dENvbnRyb2xsZXI+IGdMYXlvdXRUZXN0Q29udHJvbGxlcjsKK3ZvbGF0aWxlIGJvb2wgZG9uZSA9
IGZhbHNlOworCitzdGF0aWMgaW50IGR1bXBQaXhlbHMgPSBmYWxzZTsKK3N0YXRpYyBpbnQgZHVt
cFRyZWUgPSB0cnVlOworc3RhdGljIGludCBwcmludFNlcGFyYXRvcnMgPSB0cnVlOworc3RhdGlj
IGludCB1c2VYMTFXaW5kb3cgPSBmYWxzZTsKKworc3RhdGljIFN0cmluZyBkdW1wRnJhbWVzQXNU
ZXh0KEV2YXNfT2JqZWN0KiBmcmFtZSkKK3sKKyAgICBTdHJpbmcgcmVzdWx0OworCisgICAgaWYg
KGJyb3dzZXItPm1haW5GcmFtZSgpICE9IGZyYW1lKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQo
IlxuLS0tLS0tLS1cbkZyYW1lOiAnIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nOjpm
cm9tVVRGOChld2tfZnJhbWVfbmFtZV9nZXQoZnJhbWUpKSk7CisgICAgICAgIHJlc3VsdC5hcHBl
bmQoIidcbi0tLS0tLS0tXG4iKTsKKyAgICB9CisKKyAgICBjb25zdCBPd25GYXN0TWFsbG9jUHRy
PGNoYXI+IGZyYW1lQ29udGVudHMoZXdrX2ZyYW1lX3BsYWluX3RleHRfZ2V0KGZyYW1lKSk7Cisg
ICAgcmVzdWx0LmFwcGVuZChTdHJpbmc6OmZyb21VVEY4KGZyYW1lQ29udGVudHMuZ2V0KCkpKTsK
KyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworCisgICAgaWYgKGdMYXlvdXRUZXN0Q29udHJvbGxl
ci0+ZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkpIHsKKyAgICAgICAgRWluYV9MaXN0KiBjaGlsZHJl
biA9IER1bXBSZW5kZXJUcmVlU3VwcG9ydEVmbDo6ZnJhbWVDaGlsZHJlbihmcmFtZSk7CisgICAg
ICAgIHZvaWQqIGl0ZXJhdG9yOworCisgICAgICAgIEVJTkFfTElTVF9GUkVFKGNoaWxkcmVuLCBp
dGVyYXRvcikgeworICAgICAgICAgICAgRXZhc19PYmplY3QqIGN1cnJlbnRGcmFtZSA9IHN0YXRp
Y19jYXN0PEV2YXNfT2JqZWN0Kj4oaXRlcmF0b3IpOworICAgICAgICAgICAgU3RyaW5nIHRlbXBU
ZXh0KGR1bXBGcmFtZXNBc1RleHQoY3VycmVudEZyYW1lKSk7CisKKyAgICAgICAgICAgIGlmICh0
ZW1wVGV4dC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
ICAgIHJlc3VsdC5hcHBlbmQodGVtcFRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24oRXZh
c19PYmplY3QqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBib29sIHNo
b3VsZExvZ0ZyYW1lTG9hZERlbGVnYXRlcyhjb25zdCBTdHJpbmcmIHBhdGhPclVSTCkKK3sKKyAg
ICByZXR1cm4gcGF0aE9yVVJMLmNvbnRhaW5zKCJsb2FkaW5nLyIpOworfQorCitzdGF0aWMgYm9v
bCBzaG91bGREdW1wQXNUZXh0KGNvbnN0IFN0cmluZyYgcGF0aE9yVVJMKQoreworICAgIHJldHVy
biBwYXRoT3JVUkwuY29udGFpbnMoImR1bXBBc1RleHQvIik7Cit9CisKK3N0YXRpYyB2b2lkIHNl
bmRQaXhlbFJlc3VsdHNFT0YoKQoreworICAgIHB1dHMoIiNFT0YiKTsKKyAgICBmZmx1c2goc3Rk
b3V0KTsKKyAgICBmZmx1c2goc3RkZXJyKTsKK30KKworc3RhdGljIHZvaWQgaW52YWxpZGF0ZUFu
eVByZXZpb3VzV2FpdFRvRHVtcFdhdGNoZG9nKCkKK3sKKyAgICBpZiAod2FpdFRvRHVtcFdhdGNo
ZG9nKSB7CisgICAgICAgIGVjb3JlX3RpbWVyX2RlbCh3YWl0VG9EdW1wV2F0Y2hkb2cpOworICAg
ICAgICB3YWl0VG9EdW1wV2F0Y2hkb2cgPSAwOworICAgIH0KKyAgICB3YWl0Rm9yUG9saWN5ID0g
ZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIG9uRWNvcmVFdmFzUmVzaXplKEVjb3JlX0V2YXMqIGVj
b3JlRXZhcykKK3sKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKworICAgIGVjb3JlX2V2YXNfZ2Vv
bWV0cnlfZ2V0KGVjb3JlRXZhcywgMCwgMCwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBldmFzX29i
amVjdF9tb3ZlKGJyb3dzZXItPm1haW5WaWV3KCksIDAsIDApOworICAgIGV2YXNfb2JqZWN0X3Jl
c2l6ZShicm93c2VyLT5tYWluVmlldygpLCB3aWR0aCwgaGVpZ2h0KTsKK30KKworc3RhdGljIHZv
aWQgb25DbG9zZVdpbmRvdyhFY29yZV9FdmFzKikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCitzdGF0aWMgRWluYV9Cb29sIHVzZUxvbmdSdW5uaW5nU2VydmVyTW9kZShpbnQgYXJnYywg
Y2hhcioqIGFyZ3YpCit7CisgICAgcmV0dXJuIChhcmdjID09IG9wdGluZCArIDEgJiYgIXN0cmNt
cChhcmd2W29wdGluZF0sICItIikpOworfQorCitzdGF0aWMgYm9vbCBwYXJzZUNvbW1hbmRMaW5l
T3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgc3RhdGljIGNvbnN0IG9wdGlv
biBvcHRpb25zW10gPSB7CisgICAgICAgIHsibm90cmVlIiwgbm9fYXJndW1lbnQsICZkdW1wVHJl
ZSwgZmFsc2V9LAorICAgICAgICB7InBpeGVsLXRlc3RzIiwgbm9fYXJndW1lbnQsICZkdW1wUGl4
ZWxzLCB0cnVlfSwKKyAgICAgICAgeyJ0cmVlIiwgbm9fYXJndW1lbnQsICZkdW1wVHJlZSwgdHJ1
ZX0sCisgICAgICAgIHsiZ3VpIiwgbm9fYXJndW1lbnQsICZ1c2VYMTFXaW5kb3csIHRydWV9LAor
ICAgICAgICB7MCwgMCwgMCwgMH0KKyAgICB9OworCisgICAgaW50IG9wdGlvbjsKKyAgICB3aGls
ZSAoKG9wdGlvbiA9IGdldG9wdF9sb25nKGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiwgIiIsIG9w
dGlvbnMsIDApKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICBj
YXNlICc/JzoKKyAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIFN0cmluZyBn
ZXRGaW5hbFRlc3RVUkwoY29uc3QgU3RyaW5nJiB0ZXN0VVJMKQoreworICAgIGNvbnN0IHNpemVf
dCBoYXNoU2VwYXJhdG9yUG9zID0gdGVzdFVSTC5maW5kKCInIik7CisgICAgaWYgKGhhc2hTZXBh
cmF0b3JQb3MgIT0gbm90Rm91bmQpCisgICAgICAgIHJldHVybiBnZXRGaW5hbFRlc3RVUkwodGVz
dFVSTC5sZWZ0KGhhc2hTZXBhcmF0b3JQb3MpKTsKKworICAgIC8vIENvbnZlcnQgdGhlIHBhdGgg
aW50byBhIGZ1bGwgZmlsZSBVUkwgaWYgaXQgZG9lcyBub3QgbG9vaworICAgIC8vIGxpa2UgYW4g
SFRUUC9TIFVSTCAoZG9lc24ndCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLgorICAg
IGlmICghdGVzdFVSTC5zdGFydHNXaXRoKCJodHRwOi8vIikgfHwgIXRlc3RVUkwuc3RhcnRzV2l0
aCgiaHR0cHM6Ly8iKSkgeworICAgICAgICBPd25GYXN0TWFsbG9jUHRyPGNoYXI+IGZpbGVQYXRo
KGVjb3JlX2ZpbGVfcmVhbHBhdGgodGVzdFVSTC51dGY4KCkuZGF0YSgpKSk7CisKKyAgICAgICAg
aWYgKGVjb3JlX2ZpbGVfZXhpc3RzKGZpbGVQYXRoLmdldCgpKSkKKyAgICAgICAgICAgIHJldHVy
biBTdHJpbmcoImZpbGU6Ly8iKSArIFN0cmluZzo6ZnJvbVVURjgoZmlsZVBhdGguZ2V0KCkpOwor
ICAgIH0KKworICAgIHJldHVybiB0ZXN0VVJMOworfQorCitzdGF0aWMgU3RyaW5nIGdldEV4cGVj
dGVkUGl4ZWxIYXNoKGNvbnN0IFN0cmluZyYgdGVzdFVSTCkKK3sKKyAgICBjb25zdCBzaXplX3Qg
aGFzaFNlcGFyYXRvclBvcyA9IHRlc3RVUkwuZmluZCgiJyIpOworICAgIHJldHVybiAoaGFzaFNl
cGFyYXRvclBvcyAhPSBub3RGb3VuZCkgPyB0ZXN0VVJMLnN1YnN0cmluZyhoYXNoU2VwYXJhdG9y
UG9zICsgMSkgOiBTdHJpbmcoKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlTGF5b3V0VGVzdENv
bnRyb2xsZXIoY29uc3QgU3RyaW5nJiB0ZXN0VVJMLCBjb25zdCBTdHJpbmcmIGV4cGVjdGVkUGl4
ZWxIYXNoKQoreworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlciA9CisgICAgICAgIExheW91dFRl
c3RDb250cm9sbGVyOjpjcmVhdGUoc3RkOjpzdHJpbmcodGVzdFVSTC51dGY4KCkuZGF0YSgpKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhleHBlY3Rl
ZFBpeGVsSGFzaC51dGY4KCkuZGF0YSgpKSk7CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAwOwor
ICAgIGRvbmUgPSBmYWxzZTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0SWNvbkRh
dGFiYXNlRW5hYmxlZChmYWxzZSk7CisKKyAgICBpZiAoc2hvdWxkTG9nRnJhbWVMb2FkRGVsZWdh
dGVzKHRlc3RVUkwpKQorICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBGcmFt
ZUxvYWRDYWxsYmFja3ModHJ1ZSk7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldERl
dmVsb3BlckV4dHJhc0VuYWJsZWQodHJ1ZSk7CisKKyAgICBpZiAoc2hvdWxkRHVtcEFzVGV4dCh0
ZXN0VVJMKSkgeworICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBBc1RleHQo
dHJ1ZSk7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0R2VuZXJhdGVQaXhlbFJl
c3VsdHMoZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcnVuVGVzdChjb25zdCBjaGFy
KiBjVGVzdFBhdGhPclVSTCkKK3sKKyAgICBjb25zdCBTdHJpbmcgdGVzdFBhdGhPclVSTCA9IFN0
cmluZzo6ZnJvbVVURjgoY1Rlc3RQYXRoT3JVUkwpOworICAgIEFTU0VSVCghdGVzdFBhdGhPclVS
TC5pc0VtcHR5KCkpOworCisgICAgY29uc3QgU3RyaW5nIHRlc3RVUkwgPSBnZXRGaW5hbFRlc3RV
UkwodGVzdFBhdGhPclVSTCk7CisgICAgY29uc3QgU3RyaW5nIGV4cGVjdGVkUGl4ZWxIYXNoID0g
Z2V0RXhwZWN0ZWRQaXhlbEhhc2godGVzdFBhdGhPclVSTCk7CisKKyAgICBicm93c2VyLT5yZXNl
dERlZmF1bHRzVG9Db25zaXN0ZW50VmFsdWVzKCk7CisgICAgY3JlYXRlTGF5b3V0VGVzdENvbnRy
b2xsZXIodGVzdFVSTCwgZXhwZWN0ZWRQaXhlbEhhc2gpOworCisgICAgV29ya1F1ZXVlOjpzaGFy
ZWQoKS0+Y2xlYXIoKTsKKyAgICBXb3JrUXVldWU6OnNoYXJlZCgpLT5zZXRGcm96ZW4oZmFsc2Up
OworCisgICAgY29uc3QgYm9vbCBpc1NWR1czQ1Rlc3QgPSB0ZXN0VVJMLmNvbnRhaW5zKCJzdmcv
VzNDLVNWRy0xLjEiKTsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBpc1NWR1czQ1Rlc3QgPyA0ODAg
OiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld1dpZHRoOworICAgIGNvbnN0IGludCBoZWln
aHQgPSBpc1NWR1czQ1Rlc3QgPyAzNjAgOiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld0hl
aWdodDsKKyAgICBldmFzX29iamVjdF9yZXNpemUoYnJvd3Nlci0+bWFpblZpZXcoKSwgd2lkdGgs
IGhlaWdodCk7CisKKyAgICBpZiAocHJldlRlc3RCRkl0ZW0pCisgICAgICAgIGV3a19oaXN0b3J5
X2l0ZW1fZnJlZShwcmV2VGVzdEJGSXRlbSk7CisgICAgY29uc3QgRXdrX0hpc3RvcnkqIGhpc3Rv
cnkgPSBld2tfdmlld19oaXN0b3J5X2dldChicm93c2VyLT5tYWluVmlldygpKTsKKyAgICBwcmV2
VGVzdEJGSXRlbSA9IGV3a19oaXN0b3J5X2hpc3RvcnlfaXRlbV9jdXJyZW50X2dldChoaXN0b3J5
KTsKKworICAgIGV2YXNfb2JqZWN0X2ZvY3VzX3NldChicm93c2VyLT5tYWluVmlldygpLCBFSU5B
X1RSVUUpOworICAgIGV3a192aWV3X3VyaV9zZXQoYnJvd3Nlci0+bWFpblZpZXcoKSwgdGVzdFVS
TC51dGY4KCkuZGF0YSgpKTsKKworICAgIGVjb3JlX21haW5fbG9vcF9iZWdpbigpOworCisgICAg
Z0xheW91dFRlc3RDb250cm9sbGVyLT5jbG9zZVdlYkluc3BlY3RvcigpOworICAgIGdMYXlvdXRU
ZXN0Q29udHJvbGxlci0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZChmYWxzZSk7CisKKyAgICBl
d2tfdmlld191cmlfc2V0KGJyb3dzZXItPm1haW5WaWV3KCksICJhYm91dDpibGFuayIpOworCisg
ICAgZ0xheW91dFRlc3RDb250cm9sbGVyLmNsZWFyKCk7CisgICAgc2VuZFBpeGVsUmVzdWx0c0VP
RigpOworfQorCitzdGF0aWMgdm9pZCBydW5UZXN0aW5nU2VydmVyTG9vcCgpCit7CisgICAgY2hh
ciBmaWxlbmFtZVtQQVRIX01BWF07CisKKyAgICB3aGlsZSAoZmdldHMoZmlsZW5hbWUsIHNpemVv
ZihmaWxlbmFtZSksIHN0ZGluKSkgeworICAgICAgICBjaGFyKiBuZXdMaW5lID0gc3RycmNocihm
aWxlbmFtZSwgJ1xuJyk7CisgICAgICAgIGlmIChuZXdMaW5lKQorICAgICAgICAgICAgKm5ld0xp
bmUgPSAnXDAnOworCisgICAgICAgIGlmIChmaWxlbmFtZVswXSAhPSAnXDAnKQorICAgICAgICAg
ICAgcnVuVGVzdChmaWxlbmFtZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGp1c3RPdXRw
dXRUeXBlQnlNaW1lVHlwZShjb25zdCBFdmFzX09iamVjdCogZnJhbWUpCit7CisgICAgY29uc3Qg
U3RyaW5nIHJlc3BvbnNlTWltZVR5cGUoRHVtcFJlbmRlclRyZWVTdXBwb3J0RWZsOjpyZXNwb25z
ZU1pbWVUeXBlKGZyYW1lKSk7CisgICAgaWYgKHJlc3BvbnNlTWltZVR5cGUgPT0gInRleHQvcGxh
aW4iKSB7CisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0RHVtcEFzVGV4dCh0cnVl
KTsKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRHZW5lcmF0ZVBpeGVsUmVzdWx0
cyhmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkdW1wRnJhbWVDb250ZW50c0FzVGV4
dChFdmFzX09iamVjdCogZnJhbWUpCit7CisgICAgU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAoZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wQXNUZXh0KCkpCisgICAgICAgIHJlc3VsdCA9IGR1bXBG
cmFtZXNBc1RleHQoZnJhbWUpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gRHVtcFJlbmRl
clRyZWVTdXBwb3J0RWZsOjpyZW5kZXJUcmVlRHVtcChmcmFtZSk7CisKKyAgICBwcmludGYoIiVz
IiwgcmVzdWx0LnV0ZjgoKS5kYXRhKCkpOworfQorCitzdGF0aWMgYm9vbCBzaG91bGREdW1wRnJh
bWVTY3JvbGxQb3NpdGlvbigpCit7CisgICAgcmV0dXJuIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+
ZHVtcEFzVGV4dCgpICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBET01Bc1dlYkFyY2hp
dmUoKSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wU291cmNlQXNXZWJBcmNoaXZlKCk7
Cit9CisKK3N0YXRpYyBib29sIHNob3VsZER1bXBQaXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVk
KCkKK3sKKyAgICByZXR1cm4gZHVtcFBpeGVscyAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmdl
bmVyYXRlUGl4ZWxSZXN1bHRzKCkgJiYgIWdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcERPTUFz
V2ViQXJjaGl2ZSgpICYmICFnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBTb3VyY2VBc1dlYkFy
Y2hpdmUoKTsKK30KKworc3RhdGljIGJvb2wgc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlzdCgpCit7
CisgICAgcmV0dXJuIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEJhY2tGb3J3YXJkTGlzdCgp
OworfQorCitzdGF0aWMgYm9vbCBpbml0RWZsKCkKK3sKKyAgICBpZiAoIWVjb3JlX2V2YXNfaW5p
dCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFlY29yZV9maWxlX2luaXQoKSkg
eworICAgICAgICBlY29yZV9ldmFzX3NodXRkb3duKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisgICAgaWYgKCFlZGplX2luaXQoKSkgeworICAgICAgICBlY29yZV9maWxlX3NodXRk
b3duKCk7CisgICAgICAgIGVjb3JlX2V2YXNfc2h1dGRvd24oKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKyAgICBpZiAoIWV3a19pbml0KCkpIHsKKyAgICAgICAgZWRqZV9zaHV0ZG93
bigpOworICAgICAgICBlY29yZV9maWxlX3NodXRkb3duKCk7CisgICAgICAgIGVjb3JlX2V2YXNf
c2h1dGRvd24oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0
cnVlOworfQorCitzdGF0aWMgdm9pZCBzaHV0ZG93bkVmbCgpCit7CisgICAgZXdrX3NodXRkb3du
KCk7CisgICAgZWRqZV9zaHV0ZG93bigpOworICAgIGVjb3JlX2ZpbGVfc2h1dGRvd24oKTsKKyAg
ICBlY29yZV9ldmFzX3NodXRkb3duKCk7Cit9CisKK3ZvaWQgZGlzcGxheVdlYlZpZXcoKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgZHVtcCgpCit7CisgICAgRXZhc19PYmpl
Y3QqIGZyYW1lID0gYnJvd3Nlci0+bWFpbkZyYW1lKCk7CisKKyAgICBpbnZhbGlkYXRlQW55UHJl
dmlvdXNXYWl0VG9EdW1wV2F0Y2hkb2coKTsKKworICAgIGlmIChkdW1wVHJlZSkgeworICAgICAg
ICBhZGp1c3RPdXRwdXRUeXBlQnlNaW1lVHlwZShmcmFtZSk7CisgICAgICAgIGR1bXBGcmFtZUNv
bnRlbnRzQXNUZXh0KGZyYW1lKTsKKworICAgICAgICBpZiAoc2hvdWxkRHVtcEZyYW1lU2Nyb2xs
UG9zaXRpb24oKSkKKyAgICAgICAgICAgIGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKGZyYW1lKTsK
KworICAgICAgICBpZiAoc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlzdCgpKQorICAgICAgICAgICAg
ZHVtcEJhY2tGb3J3YXJkTGlzdEZvcldlYlZpZXdzKCk7CisKKyAgICAgICAgaWYgKHByaW50U2Vw
YXJhdG9ycykgeworICAgICAgICAgICAgcHV0cygiI0VPRiIpOworICAgICAgICAgICAgZnB1dHMo
IiNFT0ZcbiIsIHN0ZGVycik7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAg
ICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNob3VsZER1
bXBQaXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVkKCkpCisgICAgICAgIGR1bXBXZWJWaWV3QXNQ
aXhlbHNBbmRDb21wYXJlV2l0aEV4cGVjdGVkKGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZXhwZWN0
ZWRQaXhlbEhhc2goKSk7CisKKyAgICBkb25lID0gdHJ1ZTsKKyAgICBlY29yZV9tYWluX2xvb3Bf
cXVpdCgpOworfQorCitzdGF0aWMgRWNvcmVfRXZhcyogaW5pdEVjb3JlRXZhcygpCit7CisgICAg
RWNvcmVfRXZhcyogZWNvcmVFdmFzID0gdXNlWDExV2luZG93ID8gZWNvcmVfZXZhc19uZXcoMCwg
MCwgMCwgODAwLCA2MDAsIDApIDogZWNvcmVfZXZhc19idWZmZXJfbmV3KDgwMCwgNjAwKTsKKyAg
ICBpZiAoIWVjb3JlRXZhcykgeworICAgICAgICBzaHV0ZG93bkVmbCgpOworICAgICAgICBleGl0
KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgZWNvcmVfZXZhc190aXRsZV9zZXQoZWNvcmVF
dmFzLCAiRUZMIER1bXBSZW5kZXJUcmVlIik7CisgICAgZWNvcmVfZXZhc19jYWxsYmFja19yZXNp
emVfc2V0KGVjb3JlRXZhcywgb25FY29yZUV2YXNSZXNpemUpOworICAgIGVjb3JlX2V2YXNfY2Fs
bGJhY2tfZGVsZXRlX3JlcXVlc3Rfc2V0KGVjb3JlRXZhcywgb25DbG9zZVdpbmRvdyk7CisgICAg
ZWNvcmVfZXZhc19zaG93KGVjb3JlRXZhcyk7CisKKyAgICByZXR1cm4gZWNvcmVFdmFzOworfQor
CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgaWYgKCFwYXJzZUNvbW1h
bmRMaW5lT3B0aW9ucyhhcmdjLCBhcmd2KSkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsK
KworICAgIGlmICghaW5pdEVmbCgpKQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisg
ICAgT3duUHRyPEVjb3JlX0V2YXM+IGVjb3JlRXZhcyA9IGFkb3B0UHRyKGluaXRFY29yZUV2YXMo
KSk7CisgICAgYnJvd3NlciA9IER1bXBSZW5kZXJUcmVlQ2hyb21lOjpjcmVhdGUoZWNvcmVfZXZh
c19nZXQoZWNvcmVFdmFzLmdldCgpKSk7CisgICAgYWRkRm9udHNUb0Vudmlyb25tZW50KCk7CisK
KyAgICBpZiAodXNlTG9uZ1J1bm5pbmdTZXJ2ZXJNb2RlKGFyZ2MsIGFyZ3YpKSB7CisgICAgICAg
IHByaW50U2VwYXJhdG9ycyA9IHRydWU7CisgICAgICAgIHJ1blRlc3RpbmdTZXJ2ZXJMb29wKCk7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRTZXBhcmF0b3JzID0gKG9wdGluZCA8IGFyZ2Mg
LSAxIHx8IChkdW1wUGl4ZWxzICYmIGR1bXBUcmVlKSk7CisgICAgICAgIGZvciAoaW50IGkgPSBv
cHRpbmQ7IGkgIT0gYXJnYzsgKytpKQorICAgICAgICAgICAgcnVuVGVzdChhcmd2W2ldKTsKKyAg
ICB9CisKKyAgICBlY29yZUV2YXMuY2xlYXIoKTsKKworICAgIHNodXRkb3duRWZsKCk7CisgICAg
cmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30K
</data>

          </attachment>
      

    </bug>

</bugzilla>