<?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>98317</bug_id>
          
          <creation_ts>2012-10-03 16:07:31 -0700</creation_ts>
          <short_desc>Only measure text once instead of twice when performing line layout</short_desc>
          <delta_ts>2012-10-30 16:14:21 -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>Layout and Rendering</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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>98545</dependson>
    
    <dependson>98826</dependson>
    
    <dependson>98876</dependson>
          <blocked>100794</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Enrica Casucci">enrica</reporter>
          <assigned_to name="Enrica Casucci">enrica</assigned_to>
          <cc>abarth</cc>
    
    <cc>adele</cc>
    
    <cc>bashi</cc>
    
    <cc>eric</cc>
    
    <cc>hyatt</cc>
    
    <cc>jshin</cc>
    
    <cc>koivisto</cc>
    
    <cc>leviw</cc>
    
    <cc>mitz</cc>
    
    <cc>ned</cc>
    
    <cc>ossy</cc>
    
    <cc>schenney</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xji</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>734137</commentid>
    <comment_count>0</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-03 16:07:31 -0700</bug_when>
    <thetext>Since we are measuring each word to find where the line break should occur,
we should cache that information to avoid measuring the run again when
creating the line box.

&lt;rdar://problem/12080821&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734228</commentid>
    <comment_count>1</comment_count>
      <attachid>167001</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-03 17:07:25 -0700</bug_when>
    <thetext>Created attachment 167001
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734231</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-10-03 17:09:52 -0700</bug_when>
    <thetext>Attachment 167001 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/rendering/RenderBlockLineLayout.cpp:686:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/rendering/RenderBlockLineLayout.cpp:833:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Total errors found: 2 in 6 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>734249</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-10-03 17:31:16 -0700</bug_when>
    <thetext>Do we have any data on how much of an epic perf win this is? :)

I remember https://github.com/dglazkov/performance-tests showing a bunch of time spent in width(), similarly I think http://trac.webkit.org/browser/trunk/PerformanceTests/Layout/line-layout.html does as well.

run-perf-tests Layout/line-layout.html may show you want you want to see. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734264</commentid>
    <comment_count>4</comment_count>
      <attachid>167001</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-10-03 17:47:12 -0700</bug_when>
    <thetext>Comment on attachment 167001
Patch

Attachment 167001 did not pass mac-ews (mac):
Output: http://queues.webkit.org/results/14135867

New failing tests:
editing/selection/vertical-rl-rtl-extend-line-backward-br.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734273</commentid>
    <comment_count>5</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-03 17:56:09 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Do we have any data on how much of an epic perf win this is? :)
&gt; 
&gt; I remember https://github.com/dglazkov/performance-tests showing a bunch of time spent in width(), similarly I think http://trac.webkit.org/browser/trunk/PerformanceTests/Layout/line-layout.html does as well.
&gt; 
&gt; run-perf-tests Layout/line-layout.html may show you want you want to see. :)

I measured a speedup of about 10%.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734276</commentid>
    <comment_count>6</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-03 17:57:45 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 167001 [details])
&gt; Attachment 167001 [details] did not pass mac-ews (mac):
&gt; Output: http://queues.webkit.org/results/14135867
&gt; 
&gt; New failing tests:
&gt; editing/selection/vertical-rl-rtl-extend-line-backward-br.html

I noticed that this new method of measuring text uncovers an issue with system fallback fonts on the Mac platform. I&apos;ll file a bug and block this one on it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734880</commentid>
    <comment_count>7</comment_count>
      <attachid>167001</attachid>
    <who name="">mitz</who>
    <bug_when>2012-10-04 11:35:19 -0700</bug_when>
    <thetext>Comment on attachment 167001
Patch

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

&gt; Source/WebCore/ChangeLog:13
&gt; +        be consumed in setLogicalWidthForText run where we used to measure the

typo: “setLogicalWidthForText run”

&gt; Source/WebCore/ChangeLog:16
&gt; +        about the start and end offset in the run, the renderer, the meaasured with

“start and end offset of the run” or “start and end offset in the RenderText”
typos: “meaasured with”

&gt; Source/WebCore/ChangeLog:24
&gt; +        (Font): Added fallback fonts parameter to the static width method/

typo: “/”. I’d call it “static member function” rather than “method”.

&gt; Source/WebCore/ChangeLog:29
&gt; +        (WebCore::Font::width): Added fallback fonts parameter.

Perhaps you can call out the fact that you’re adding the fallback fonts parameter to the TextLayout versions of these functions (as I was reading this, I was confused because I was thinking “don’t these functions already support fallback fonts?” not realizing these were the TextLayout-enabled overloads) and more importantly, explain somewhere in the change log why you’re doing so (we used to get the fallback fonts when we remeasured the entire run, which we did without a TextLayout, but now we no longer do that).

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:54
&gt; -        , m_controller(adoptPtr(new ComplexTextController(&amp;m_font, m_run, true)))
&gt;      {
&gt; +        m_controller = adoptPtr(new ComplexTextController(&amp;m_font, m_run, true, &amp;m_fallbackFonts));

Any reason to switch from initializer syntax to this?

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:57
&gt; +    float width(unsigned from, unsigned len, HashSet&lt;const SimpleFontData*&gt;* fallbackFonts = 0)

No need for “= 0” here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734906</commentid>
    <comment_count>8</comment_count>
      <attachid>167001</attachid>
    <who name="">mitz</who>
    <bug_when>2012-10-04 11:57:00 -0700</bug_when>
    <thetext>Comment on attachment 167001
Patch

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

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:69
&gt; +        if (fallbackFonts &amp;&amp; !m_fallbackFonts.isEmpty()) {
&gt; +            HashSet&lt;const SimpleFontData*&gt;::const_iterator end = m_fallbackFonts.end();
&gt; +            for (HashSet&lt;const SimpleFontData*&gt;::const_iterator it = m_fallbackFonts.begin(); it != end; ++it)
&gt; +                fallbackFonts-&gt;add(*it);
&gt; +        }

This doesn’t look very efficient, but what I really worry about here is correctness. m_fallbackFonts contains fallback fonts for the entire TextRun but fallbackFonts should only contain fallback fonts for the range from from to (from + len).

&gt; Source/WebCore/rendering/RenderBlock.h:64
&gt;  typedef WTF::HashMap&lt;const RenderBox*, HashSet&lt;RenderBlock*&gt;*&gt; TrackedContainerMap;

Please add an empty line here.

&gt; Source/WebCore/rendering/RenderBlock.h:65
&gt; +class TextMeasureEntry {

Can you forward-declare this class here? I think you can. Then the definition can move into the only .cpp file that uses it.
I am not happy with the name TextMeasureEntry. For one, I wish we could get rid of “entry” in the name, as it doesn’t add much (it’s like saying “object”, “data”, or “info”). I don’t think “measure”, as a noun, is the right word to use here. The right noun would be “measurement”, but maybe we can find a different term altogether. I also wonder if instead of just “Text” we should say something that indicates that this is a subrange of a RenderText. Maybe we can use the term “word”, since that’s what these ranges are normally.

&gt; Source/WebCore/rendering/RenderBlock.h:70
&gt; +    TextMeasureEntry() : renderer(0),
&gt; +        textWidth(0),
&gt; +        startOffset(0),
&gt; +        endOffset(0)

This is not the normal style for initializer list. The first one should be on a line of its own that starts with a colon, and subsequent lines should start with a comma.

&gt; Source/WebCore/rendering/RenderBlock.h:72
&gt; +    }

Please add an empty line here.

&gt; Source/WebCore/rendering/RenderBlock.h:74
&gt; +    float textWidth;

Can just call this “width”.

&gt; Source/WebCore/rendering/RenderBlock.h:80
&gt; +typedef Vector&lt;TextMeasureEntry&gt; TextMeasures;

Once we decide on a name for TextMeasureEntry, we’ll need to consider what to name this type. You should forward-declare it here if possible (and then you won’t even need to forward-declare TextMeasureEntry at all).

You should give this vector some inline capacity. Without it, I think we always allocate its storage on the heap!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734959</commentid>
    <comment_count>9</comment_count>
      <attachid>167001</attachid>
    <who name="">mitz</who>
    <bug_when>2012-10-04 13:24:26 -0700</bug_when>
    <thetext>Comment on attachment 167001
Patch

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

&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:711
&gt; +    bool isKerningEnabled = renderer-&gt;style()-&gt;font().typesettingFeatures() &amp; Kerning;

This should use style(lineInfo.isFirstLine()). Since we need the same Font in the block above, I’d just move the font local out of that block and use it there and again here. I don’t we’re not consistent about naming of boolean variables, but I find that a name that is a statement, like “kerningIsEnabled”, reads better than a name that is a question like “isKerningEnabled” once you use it in an expression: if (kerningIsEnabled)…

&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:713
&gt; +    if (!lineBox-&gt;fitsToGlyphs() &amp;&amp; !textMeasures.isEmpty()) {

Needs a comment about why you’re checking fitsToGlyphs().

&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:715
&gt; +        for (size_t i = 0; i &lt; textMeasures.size() &amp;&amp; lastEndOffset &lt; run-&gt;m_stop; i++) {

It can be more efficient to get the size once. The new style for doing so is
    for (size_t i = 0, size = textMeasures.size(); i &lt; size &amp;&amp; lastEndOffset &lt; run-&gt;m_stop; ++i) {
(we also use pre-increment as a rule).

&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:734
&gt; +            // we don&apos;t have enough cached data, we&apos;ll measure again

Please format this as a sentence (start with a capital letter and end with a period).

&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2078
&gt; +static ALWAYS_INLINE float textWidth(RenderText* text, unsigned from, unsigned len, const Font&amp; font, float xPos, bool isFixedPitch, bool collapseWhiteSpace, HashSet&lt;const SimpleFontData*&gt;* fallbackFonts = 0, TextLayout* layout = 0)

What’s with the change from inline to ALWAYS_INLINE here?

&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2263
&gt; +    entry.fallbackFonts.clear();

What’s happening here? I don’t think we want to be copying HashSets all the time. I think instead the TextMeasureEntry that the code below updates should already by in the vector. Then if we don’t need it, we can delete it (or reuse it, I suppose).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734975</commentid>
    <comment_count>10</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-04 13:40:54 -0700</bug_when>
    <thetext>&gt; &gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:54
&gt; &gt; -        , m_controller(adoptPtr(new ComplexTextController(&amp;m_font, m_run, true)))
&gt; &gt;      {
&gt; &gt; +        m_controller = adoptPtr(new ComplexTextController(&amp;m_font, m_run, true, &amp;m_fallbackFonts));
&gt; 
&gt; Any reason to switch from initializer syntax to this?
&gt; 
I moved it here because I declared m_fallbackFonts after m_controller and m_fallbackFonts wasn&apos;t initialized yet, then I forgot to change the order. I&apos;ll fix it.

Thanks for all the comments. I&apos;ll address them all in the new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734980</commentid>
    <comment_count>11</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-04 13:46:30 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 167001 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=167001&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:69
&gt; &gt; +        if (fallbackFonts &amp;&amp; !m_fallbackFonts.isEmpty()) {
&gt; &gt; +            HashSet&lt;const SimpleFontData*&gt;::const_iterator end = m_fallbackFonts.end();
&gt; &gt; +            for (HashSet&lt;const SimpleFontData*&gt;::const_iterator it = m_fallbackFonts.begin(); it != end; ++it)
&gt; &gt; +                fallbackFonts-&gt;add(*it);
&gt; &gt; +        }
&gt; 
&gt; This doesn’t look very efficient, but what I really worry about here is correctness. m_fallbackFonts contains fallback fonts for the entire TextRun but fallbackFonts should only contain fallback fonts for the range from from to (from + len).

Is it a problem to have redundant information? I think the worst case is that we&apos;ll have fallbackFonts that are not needed for the part of the original run. Is this going to affect the rendering?

&gt; 
&gt; &gt; Source/WebCore/rendering/RenderBlock.h:64
&gt; &gt;  typedef WTF::HashMap&lt;const RenderBox*, HashSet&lt;RenderBlock*&gt;*&gt; TrackedContainerMap;
&gt; 
&gt; Please add an empty line here.
&gt; 
&gt; &gt; Source/WebCore/rendering/RenderBlock.h:65
&gt; &gt; +class TextMeasureEntry {
&gt; 
&gt; Can you forward-declare this class here? I think you can. Then the definition can move into the only .cpp file that uses it.
&gt; I am not happy with the name TextMeasureEntry. For one, I wish we could get rid of “entry” in the name, as it doesn’t add much (it’s like saying “object”, “data”, or “info”). I don’t think “measure”, as a noun, is the right word to use here. The right noun would be “measurement”, but maybe we can find a different term altogether. I also wonder if instead of just “Text” we should say something that indicates that this is a subrange of a RenderText. Maybe we can use the term “word”, since that’s what these ranges are normally.

What about WordMeasurement? or WordWidth?

&gt; 
&gt; You should give this vector some inline capacity. Without it, I think we always allocate its storage on the heap!

Great catch, thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>734992</commentid>
    <comment_count>12</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-04 13:53:14 -0700</bug_when>
    <thetext> 
&gt; &gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2078
&gt; &gt; +static ALWAYS_INLINE float textWidth(RenderText* text, unsigned from, unsigned len, const Font&amp; font, float xPos, bool isFixedPitch, bool collapseWhiteSpace, HashSet&lt;const SimpleFontData*&gt;* fallbackFonts = 0, TextLayout* layout = 0)
&gt; 
&gt; What’s with the change from inline to ALWAYS_INLINE here?
&gt; 

Ok to all the other comments, I changed this because I saw with Instruments that this was not inline.
I know the compiler can override some inline definition based on the number of parameters and their type.
ALWAYS_INLINE forces it to be inline and we gain a little performance.

&gt; &gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2263
&gt; &gt; +    entry.fallbackFonts.clear();
&gt; 
&gt; What’s happening here? I don’t think we want to be copying HashSets all the time. I think instead the TextMeasureEntry that the code below updates should already by in the vector. Then if we don’t need it, we can delete it (or reuse it, I suppose).

I&apos;m not sure I understand your comment here. This variable entry is used over and over while measuring different runs in different renderers that fit on the same line. We don&apos;t want to have the fallbackfonts for one run associated with a different run.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>735019</commentid>
    <comment_count>13</comment_count>
    <who name="">mitz</who>
    <bug_when>2012-10-04 14:33:43 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #8)
&gt; &gt; (From update of attachment 167001 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=167001&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:69
&gt; &gt; &gt; +        if (fallbackFonts &amp;&amp; !m_fallbackFonts.isEmpty()) {
&gt; &gt; &gt; +            HashSet&lt;const SimpleFontData*&gt;::const_iterator end = m_fallbackFonts.end();
&gt; &gt; &gt; +            for (HashSet&lt;const SimpleFontData*&gt;::const_iterator it = m_fallbackFonts.begin(); it != end; ++it)
&gt; &gt; &gt; +                fallbackFonts-&gt;add(*it);
&gt; &gt; &gt; +        }
&gt; &gt; 
&gt; &gt; This doesn’t look very efficient, but what I really worry about here is correctness. m_fallbackFonts contains fallback fonts for the entire TextRun but fallbackFonts should only contain fallback fonts for the range from from to (from + len).
&gt; 
&gt; Is it a problem to have redundant information? I think the worst case is that we&apos;ll have fallbackFonts that are not needed for the part of the original run. Is this going to affect the rendering?

Yes, we may end up making a line unnecessarily tall because of some font that happens to be used only on the next line.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/rendering/RenderBlock.h:64
&gt; &gt; &gt;  typedef WTF::HashMap&lt;const RenderBox*, HashSet&lt;RenderBlock*&gt;*&gt; TrackedContainerMap;
&gt; &gt; 
&gt; &gt; Please add an empty line here.
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/rendering/RenderBlock.h:65
&gt; &gt; &gt; +class TextMeasureEntry {
&gt; &gt; 
&gt; &gt; Can you forward-declare this class here? I think you can. Then the definition can move into the only .cpp file that uses it.
&gt; &gt; I am not happy with the name TextMeasureEntry. For one, I wish we could get rid of “entry” in the name, as it doesn’t add much (it’s like saying “object”, “data”, or “info”). I don’t think “measure”, as a noun, is the right word to use here. The right noun would be “measurement”, but maybe we can find a different term altogether. I also wonder if instead of just “Text” we should say something that indicates that this is a subrange of a RenderText. Maybe we can use the term “word”, since that’s what these ranges are normally.
&gt; 
&gt; What about WordMeasurement? or WordWidth?

I like Width because it’s short and descriptive but I don’t like that it hides the fact that there’s more than just the width in this class. Measurement sounds better, though not great.

&gt; 
&gt; &gt; 
&gt; &gt; You should give this vector some inline capacity. Without it, I think we always allocate its storage on the heap!
&gt; 
&gt; Great catch, thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>735029</commentid>
    <comment_count>14</comment_count>
    <who name="">mitz</who>
    <bug_when>2012-10-04 14:41:45 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt; &gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2078
&gt; &gt; &gt; +static ALWAYS_INLINE float textWidth(RenderText* text, unsigned from, unsigned len, const Font&amp; font, float xPos, bool isFixedPitch, bool collapseWhiteSpace, HashSet&lt;const SimpleFontData*&gt;* fallbackFonts = 0, TextLayout* layout = 0)
&gt; &gt; 
&gt; &gt; What’s with the change from inline to ALWAYS_INLINE here?
&gt; &gt; 
&gt; 
&gt; Ok to all the other comments, I changed this because I saw with Instruments that this was not inline.
&gt; I know the compiler can override some inline definition based on the number of parameters and their type.
&gt; ALWAYS_INLINE forces it to be inline and we gain a little performance.

Thanks for the explanation. Just wanted to confirm that this is the case.

&gt; 
&gt; &gt; &gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2263
&gt; &gt; &gt; +    entry.fallbackFonts.clear();
&gt; &gt; 
&gt; &gt; What’s happening here? I don’t think we want to be copying HashSets all the time. I think instead the TextMeasureEntry that the code below updates should already by in the vector. Then if we don’t need it, we can delete it (or reuse it, I suppose).
&gt; 
&gt; I&apos;m not sure I understand your comment here. This variable entry is used over and over while measuring different runs in different renderers that fit on the same line. We don&apos;t want to have the fallbackfonts for one run associated with a different run.

I’m saying that instead of using a local variable, we should use a “provisional” entry in the Vector, so that we don’t need to later copy from the local to the place in the Vector.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>735056</commentid>
    <comment_count>15</comment_count>
      <attachid>167001</attachid>
    <who name="Stephen Chenney">schenney</who>
    <bug_when>2012-10-04 15:15:01 -0700</bug_when>
    <thetext>Comment on attachment 167001
Patch

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

&gt;&gt; Source/WebCore/ChangeLog:16
&gt;&gt; +        about the start and end offset in the run, the renderer, the meaasured with
&gt; 
&gt; “start and end offset of the run” or “start and end offset in the RenderText”
&gt; typos: “meaasured with”

&quot;measured width&quot;

&gt;&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:54
&gt;&gt; +        m_controller = adoptPtr(new ComplexTextController(&amp;m_font, m_run, true, &amp;m_fallbackFonts));
&gt; 
&gt; Any reason to switch from initializer syntax to this?

You would have to declare m_fallbackFonts before m_controller, I suspect, but that itself would be OK.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:88
&gt; +    HashSet&lt;const SimpleFontData*&gt; m_fallbackFonts;

I am concerned about the lifetime of the SimpleFontData stored here. Are you certain that the pointers in the set will be cleared when the SimpleFontData is deleted?

FontData and derived classes are ref counted, and their ref count may cause deletion when the cache is cleared because no FontFallbackList is using the FontData (in turn because no Font is using that FontFallbackList). There is no need to ref count the SimpleFontData here provided you are sure that the list will never have a pointer that is not also held in m_font.m_fontFallbackList-&gt;m_fontList.

&gt;&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:686
&gt;&gt; +                                             GlyphOverflowAndFallbackFontsMap&amp; textBoxDataMap, VerticalPositionCache&amp; verticalPositionCache, TextMeasures&amp; textMeasures)
&gt; 
&gt; Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]

The style bot has started warning about this, where it is line wrapping causing the problems. Apparently we now need to always start the next line of a wrap with just an additional tab (4 spaces).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736456</commentid>
    <comment_count>16</comment_count>
      <attachid>167493</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-07 19:30:19 -0700</bug_when>
    <thetext>Created attachment 167493
Patch2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736457</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-10-07 19:34:39 -0700</bug_when>
    <thetext>Attachment 167493 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/rendering/RenderBlockLineLayout.cpp:703:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/rendering/RenderBlockLineLayout.cpp:856:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Total errors found: 2 in 7 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>736487</commentid>
    <comment_count>18</comment_count>
      <attachid>167493</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-10-07 21:25:53 -0700</bug_when>
    <thetext>Comment on attachment 167493
Patch2

Attachment 167493 did not pass mac-ews (mac):
Output: http://queues.webkit.org/results/14228118

New failing tests:
fast/text/international/text-combine-image-test.html
fast/writing-mode/vertical-baseline-alignment.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737963</commentid>
    <comment_count>19</comment_count>
      <attachid>167493</attachid>
    <who name="">mitz</who>
    <bug_when>2012-10-09 11:18:21 -0700</bug_when>
    <thetext>Comment on attachment 167493
Patch2

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

r=me but please try to address my comments before landing

&gt; Source/WebCore/ChangeLog:15
&gt; +        Each entry in the vector is a Measure object that contains information

You ended up calling this Measurement, not Measure.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:538
&gt; +        if (fallbackFonts &amp;&amp; complexTextRun.fontData() != m_font.primaryFont())
&gt; +            fallbackFonts-&gt;add(complexTextRun.fontData());

Doing this here may be too late! There are return statements in the while() loop above.

&gt; Source/WebCore/rendering/RenderBlock.h:56
&gt;  class LineInfo;
&gt;  class RenderRubyRun;
&gt;  class TextLayout;
&gt; +class Measurement;

These should be kept sorted.

&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2489
&gt; +            float wordSpacingForTextMeasure = 0;

ForTextMeasurement?

&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2570
&gt; +                    measurements.append(Measurement());

You want to avoid creating a temporary Measurement object and then copying it into the Vector. I don’t know if the above code does this. Instead, you can just use Vector’s grow() function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738140</commentid>
    <comment_count>20</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-09 13:34:57 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; (From update of attachment 167493 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=167493&amp;action=review
&gt; 
&gt; r=me but please try to address my comments before landing
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:15
&gt; &gt; +        Each entry in the vector is a Measure object that contains information
&gt; 
&gt; You ended up calling this Measurement, not Measure.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:538
&gt; &gt; +        if (fallbackFonts &amp;&amp; complexTextRun.fontData() != m_font.primaryFont())
&gt; &gt; +            fallbackFonts-&gt;add(complexTextRun.fontData());
&gt; 
&gt; Doing this here may be too late! There are return statements in the while() loop above.
&gt; 
&gt; &gt; Source/WebCore/rendering/RenderBlock.h:56
&gt; &gt;  class LineInfo;
&gt; &gt;  class RenderRubyRun;
&gt; &gt;  class TextLayout;
&gt; &gt; +class Measurement;
&gt; 
&gt; These should be kept sorted.
&gt; 
&gt; &gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2489
&gt; &gt; +            float wordSpacingForTextMeasure = 0;
&gt; 
&gt; ForTextMeasurement?
&gt; 
&gt; &gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2570
&gt; &gt; +                    measurements.append(Measurement());
&gt; 
&gt; You want to avoid creating a temporary Measurement object and then copying it into the Vector. I don’t know if the above code does this. Instead, you can just use Vector’s grow() function.

I will definitely do that. Per our latest discussion, I&apos;ll change the types to WordMeasurement and WordMeasurements.
Thanks for the review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738194</commentid>
    <comment_count>21</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-09 14:35:28 -0700</bug_when>
    <thetext>Committed revision 130812.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738236</commentid>
    <comment_count>22</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-09 15:13:43 -0700</bug_when>
    <thetext>I wonder if this patch caused this regression:

Expected:
http://build.chromium.org/f/chromium/layout_test_results/Webkit_Mac10_6/results/layout-test-results/fast/text/shaping/shaping-selection-rect-expected.png

Actual:
http://build.chromium.org/f/chromium/layout_test_results/Webkit_Mac10_6/results/layout-test-results/fast/text/shaping/shaping-selection-rect-actual.png

Notice the gap in the selection between the C and the F.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738239</commentid>
    <comment_count>23</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-10-09 15:15:43 -0700</bug_when>
    <thetext>Re-opened since this is blocked by bug 98826</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738252</commentid>
    <comment_count>24</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-09 15:21:18 -0700</bug_when>
    <thetext>fast/lists/003-vertical.html
fast/overflow/scrollRevealButton.html
fast/text/international/vertical-text-glyph-test.html
fast/text/shaping/shaping-selection-rect.html
platform/chromium/fast/forms/date/date-suggestion-picker-appearance-with-scroll-bar.html

The tests listed above might have been affected as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738260</commentid>
    <comment_count>25</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-09 15:30:49 -0700</bug_when>
    <thetext>The bots see these failures on at least chromium-mac-lion and chromium-mac-snowleopard.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738276</commentid>
    <comment_count>26</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-09 15:47:26 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; fast/lists/003-vertical.html
&gt; fast/overflow/scrollRevealButton.html
&gt; fast/text/international/vertical-text-glyph-test.html

The 3 tests above all pass on Mac.

&gt; fast/text/shaping/shaping-selection-rect.html

This is skipped for Mac.

&gt; platform/chromium/fast/forms/date/date-suggestion-picker-appearance-with-scroll-bar.html
&gt; 

For this one I have no idea.
&gt; The tests listed above might have been affected as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738287</commentid>
    <comment_count>27</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-09 16:02:46 -0700</bug_when>
    <thetext>&gt; fast/lists/003-vertical.html
&gt; fast/text/international/vertical-text-glyph-test.html
&gt; fast/text/shaping/shaping-selection-rect.html

^^^ These three were fixed by the rollout.  The others are likely caused by http://trac.webkit.org/changeset/130811</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738328</commentid>
    <comment_count>28</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-09 16:46:34 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; &gt; fast/lists/003-vertical.html
&gt; &gt; fast/text/international/vertical-text-glyph-test.html
&gt; &gt; fast/text/shaping/shaping-selection-rect.html
&gt; 
&gt; ^^^ These three were fixed by the rollout.  The others are likely caused by http://trac.webkit.org/changeset/130811

These tests differ by 1px. I think we only need new baseline results.
Probably the difference is caused by sub pixel layout being enabled for chromium.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738342</commentid>
    <comment_count>29</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-09 17:08:30 -0700</bug_when>
    <thetext>&gt; These tests differ by 1px. I think we only need new baseline results.
&gt; Probably the difference is caused by sub pixel layout being enabled for chromium.

Even fast/text/shaping/shaping-selection-rect.html ?  The text in the text seems to warn against precisely the failure mode we&apos;re seeing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738361</commentid>
    <comment_count>30</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-09 17:33:27 -0700</bug_when>
    <thetext>(In reply to comment #29)
&gt; &gt; These tests differ by 1px. I think we only need new baseline results.
&gt; &gt; Probably the difference is caused by sub pixel layout being enabled for chromium.
&gt; 
&gt; Even fast/text/shaping/shaping-selection-rect.html ?  The text in the text seems to warn against precisely the failure mode we&apos;re seeing.

I think my patch might have uncovered a pre-existing bug in the code for complex text on the chromium platform. This problem doesn&apos;t reproduce on the same mac platforms for our port.
Since I have no way to debug the complex text path for HarfBuzz we have two alternatives to move forward:
1. I can land my patch and disable my optimization for HarfBuzz
2. I can land the original patch and mark the three tests as failing in TestExpectations

Please let me know what you&apos;d prefer. If I don&apos;t hear back I&apos;ll disable the optimization for HarfBuzz.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738364</commentid>
    <comment_count>31</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-09 17:37:08 -0700</bug_when>
    <thetext>&gt; Please let me know what you&apos;d prefer. If I don&apos;t hear back I&apos;ll disable the optimization for HarfBuzz.

I don&apos;t know enough about line layout to know what the best course of action is here.  Please use your best judgement or, if you&apos;re unsure, consult with some folks who know about HarfBuzz.  Tony Chang might be a good person to ask.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738365</commentid>
    <comment_count>32</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-09 17:37:49 -0700</bug_when>
    <thetext>Eric Seidel also knows this code and might have more intelligent things to say about the matter than I do.  :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738369</commentid>
    <comment_count>33</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-10-09 17:43:46 -0700</bug_when>
    <thetext>I can look at the test, but Emil, Levi, Tony or Jungshik are likely to have more immediate context than I do. I will speak with Levi/Emil tomorrow and make sure someone comments before 2pm tomorrow.  Thank you for letting us know.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738413</commentid>
    <comment_count>34</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-10-09 18:31:50 -0700</bug_when>
    <thetext>Regarding the test, I suspect that the issue here is that measuring text run lengths and strings can give different results in the complex text path (at least on Chromium). When the string in the test is broken up by the span, findNextLineBreak measures each run individually resulting in three measurements. In createLineBoxesFromBidiRuns, we will measure the string a single time, which can yield different results. I&apos;d say the correct approach here is to begin by disabling this in the complex text case (at least for HarfBuzz platforms), and attack that issue in a separate bug.

In other matters: \o/! Awesome!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738578</commentid>
    <comment_count>35</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-10-09 22:49:57 -0700</bug_when>
    <thetext>Landed again, disabling the optimization for platforms using HarfBuzz.

Committed revision 130851.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738579</commentid>
    <comment_count>36</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-10-09 22:50:56 -0700</bug_when>
    <thetext>Wonderful, thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738629</commentid>
    <comment_count>37</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-09 23:43:52 -0700</bug_when>
    <thetext>I could be mistaken, but I don&apos;t think we use HarfBuzz on chromium-mac.  My understanding is that we use it on Linux.  In any case, the test failures have returned on chromium-mac.  I&apos;ll mark them as failing in TestExpectations and file another bug where we can sort this issue out.

Thanks for your patience.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738639</commentid>
    <comment_count>38</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-10-09 23:52:14 -0700</bug_when>
    <thetext>Followup regarding chromium-mac failures is Bug 98867</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>738642</commentid>
    <comment_count>39</comment_count>
    <who name="">mitz</who>
    <bug_when>2012-10-09 23:54:28 -0700</bug_when>
    <thetext>(In reply to comment #37)
&gt; I could be mistaken, but I don&apos;t think we use HarfBuzz on chromium-mac.

There’s HarfBuzz-related code in #if PLATFORM(CHROMIUM) blocks in FontComplexTextMac.cpp.

&gt; My understanding is that we use it on Linux.  In any case, the test failures have returned on chromium-mac.  I&apos;ll mark them as failing in TestExpectations and file another bug where we can sort this issue out.
&gt; 

Perhaps Chormium’s use of HarfBuzz on Mac is not subject to #if USE(HARFBUZZ_NG)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>739073</commentid>
    <comment_count>40</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2012-10-10 10:29:13 -0700</bug_when>
    <thetext>We use harfbuzz-ng on Chromium Mac only when -webkit-font-feature-settings is specified.

We&apos;re not using harfbuzz-ng yet on Chromium Linux, but plan to soon.  bashi is driving that effort.

I&apos;ll post a follow up on bug 98865 since this patch has landed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>748418</commentid>
    <comment_count>41</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2012-10-23 02:42:16 -0700</bug_when>
    <thetext>(In reply to comment #35)
&gt; Landed again, disabling the optimization for platforms using HarfBuzz.
&gt; 
&gt; Committed revision 130851.

It caused a regression on Qt - https://bugs.webkit.org/show_bug.cgi?id=98876</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>167001</attachid>
            <date>2012-10-03 17:07:25 -0700</date>
            <delta_ts>2012-10-04 15:15:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>text-layout-measure-once.txt</filename>
            <type>text/plain</type>
            <size>29648</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMDM0NCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ0IEBACisyMDEyLTEwLTAzICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgT25seSBtZWFzdXJlIHRleHQg
b25jZSBpbnN0ZWFkIG9mIHR3aWNlIHdoZW4gcGVyZm9ybWluZyBsaW5lIGxheW91dC4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk4MzE3CisgICAgICAg
IDxyZGFyOi8vcHJvYmxlbS8xMjA4MDgyMT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBTaW5jZSB3ZSBhcmUgbWVhc3VyaW5nIGVhY2ggd29yZCB0byBm
aW5kIG91dCB3aGVyZSB0aGUgbGluZSBicmVhayBzaG91bGQgb2NjdXIsCisgICAgICAgIHdlIHNo
b3VsZCBjYWNoZSB0aGF0IGluZm9ybWF0aW9uIHRvIGF2b2lkIG1lYXN1cmluZyB0aGUgcnVuIGFn
YWluIHdoZW4KKyAgICAgICAgY3JlYXRpbmcgdGhlIGxpbmUgYm94LiBUaGUgYnVsayBvZiB0aGUg
Y2hhbmdlIGlzIGluIG5leHRMaW5lQnJlYWssIHdoZXJlCisgICAgICAgIHRoZSBtZWFzdXJlbWVu
dHMgYXJlIGNvbGxlY3RlZCBhbmQgcGxhY2VkIGluIGEgdmVjdG9yIHNvIHRoYXQgdGhleSBjYW4K
KyAgICAgICAgYmUgY29uc3VtZWQgaW4gc2V0TG9naWNhbFdpZHRoRm9yVGV4dCBydW4gd2hlcmUg
d2UgdXNlZCB0byBtZWFzdXJlIHRoZQorICAgICAgICB0ZXh0IG9uZSBtb3JlIHRpbWUuCisgICAg
ICAgIEVhY2ggZW50cnkgaW4gdGhlIHZlY3RvciBpcyBhIFRleHRNZWFzdXJlRW50cnkgb2JqZWN0
IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24KKyAgICAgICAgYWJvdXQgdGhlIHN0YXJ0IGFuZCBl
bmQgb2Zmc2V0IGluIHRoZSBydW4sIHRoZSByZW5kZXJlciwgdGhlIG1lYWFzdXJlZCB3aXRoCisg
ICAgICAgIGFuZCBwb3NzaWJseSBhIGxpc3Qgb2YgZmFsbGJhY2sgZm9udHMuCisgICAgICAgIFdo
ZW4gd2UgbmVlZCB0byBjb21wdXRlIHRoZSB3aWR0aCBvZiB0aGUgcnVuIHRvIGNyZWF0ZSB0aGUg
bGluZSBib3gsIHdlIGFkZAorICAgICAgICBhbGwgdGhlIG1lYXN1cmVtZW50cyBmb3IgdGhlIGdp
dmVuIHJlbmRlcmVyIGluIHRoZSBydW4gdG8gZ2V0IHRoZSB0b3RhbCB3aWR0aC4KKworICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6
d2lkdGgpOiBBZGRlZCBmYWxsYmFjayBmb250cyBwYXJhbWV0ZXIuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvRm9udC5oOgorICAgICAgICAoRm9udCk6IEFkZGVkIGZhbGxiYWNrIGZvbnRz
IHBhcmFtZXRlciB0byB0aGUgc3RhdGljIHdpZHRoIG1ldGhvZC8KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OlRleHRMYXlvdXQ6OlRleHRMYXlvdXQpOiBBZGRlZCBmYWxsYmFjayBmb250cyBtZW1iZXIg
dmFyaWFibGUsIHRoYXQgaXMKKyAgICAgICAgdXNlZCB3aGVuIGJ1aWxkaW5nIHRoZSBDb21wbGV4
VGV4dENvbnRyb2xsZXIgb2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6VGV4dExheW91dDo6d2lk
dGgpOiBBZGRlZCBmYWxsYmFjayBmb250cyBwYXJhbWV0ZXIuCisgICAgICAgIChXZWJDb3JlOjpG
b250Ojp3aWR0aCk6IEFkZGVkIGZhbGxiYWNrIGZvbnRzIHBhcmFtZXRlci4KKyAgICAgICAgKiBy
ZW5kZXJpbmcvUmVuZGVyQmxvY2suaDogQWRkZWQgVGV4dE1lYXN1cmVzIHBhcmFtZXRlciB0byBm
ZXcgbWV0aG9kcy4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OnNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4pOiBUaGlzIGlz
IHdoZXJlIHdlIGNvbXB1dGUgdGhlIHJ1biB3aWR0aCB1c2luZyB0aGUKKyAgICAgICAgY2FjaGVk
IGluZm9ybWF0aW9uLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmNvbXB1dGVJbmxp
bmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKTogQWRkZWQgdGV4dE1lYXN1cmVzIHBhcmFtZXRl
ci4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpjcmVhdGVMaW5lQm94ZXNGcm9tQmlk
aVJ1bnMpOiBBZGRlZCB0ZXh0TWVhc3VyZXMgcGFyYW1ldGVyLgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKTogQWRkZWQgZGVjbGFyYXRp
b24gb2YgdGhlIFRleHRNZWFzdXJlcyB2ZWN0b3IgYW5kIGl0cyB1c2UuCisgICAgICAgIChXZWJD
b3JlOjp0ZXh0V2lkdGgpOiBBZGRlZCBmYWxsYmFja0ZvbnRzIHBhcmFtZXRlciwgc2luY2Ugbm93
IHdlIG9ubHkgbWVhc3VyZSBvbmNlLgorICAgICAgICAoV2ViQ29yZTo6YWRkVGV4dE1lYXN1cmUp
OiBBZGRzIHRoZSBUZXh0TWVhc3VyZUVudHJ5IG9iamVjdCB0byB0aGUgdmVjdG9yLgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOjpuZXh0TGluZUJyZWFrKTogVGhp
cyBtZXRob2QgaGFzIGJlZW4gbW9kaWZpZWQgdG8gY29sbGVjdAorICAgICAgICB0aGUgbWVhc3Vy
ZW1lbnRzIG9mIHRoZSBpbmRpdmlkdWFsIHdvcmRzIGFuZCBhZGQgdGhlbSB0byB0aGUgdmVjdG9y
LgorCiAyMDEyLTEwLTAzICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAgICAg
ICAgUmVtb3ZlIHN1cHBvcnQgZm9yIEVOQUJMRShMRUdBQ1lfV0VCS0lUX0JMT0JfQlVJTERFUikK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCShyZXZpc2lv
biAxMzAzMDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjE4LDcgKzIxOCw3IEBAIHZvaWQgRm9udDo6ZGVsZXRlTGF5b3V0
KFRleHRMYXlvdXQqKQogewogfQogCi1mbG9hdCBGb250Ojp3aWR0aChUZXh0TGF5b3V0JiwgdW5z
aWduZWQsIHVuc2lnbmVkKQorZmxvYXQgRm9udDo6d2lkdGgoVGV4dExheW91dCYsIHVuc2lnbmVk
LCB1bnNpZ25lZCwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KikKIHsKICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKICAgICByZXR1cm4gMDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9Gb250LmgJKHJldmlzaW9uIDEzMDMwMCkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMTA1LDcgKzEwNSw3
IEBAIHB1YmxpYzoKIAogICAgIFBhc3NPd25QdHI8VGV4dExheW91dD4gY3JlYXRlTGF5b3V0KFJl
bmRlclRleHQqLCBmbG9hdCB4UG9zLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSkgY29uc3Q7CiAg
ICAgc3RhdGljIHZvaWQgZGVsZXRlTGF5b3V0KFRleHRMYXlvdXQqKTsKLSAgICBzdGF0aWMgZmxv
YXQgd2lkdGgoVGV4dExheW91dCYsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbik7CisgICAg
c3RhdGljIGZsb2F0IHdpZHRoKFRleHRMYXlvdXQmLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBs
ZW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9IDApOwog
CiAgICAgaW50IG9mZnNldEZvclBvc2l0aW9uKGNvbnN0IFRleHRSdW4mLCBmbG9hdCBwb3NpdGlv
biwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3Q7CiAgICAgRmxvYXRSZWN0IHNlbGVj
dGlvblJlY3RGb3JUZXh0KGNvbnN0IFRleHRSdW4mLCBjb25zdCBGbG9hdFBvaW50JiwgaW50IGgs
IGludCBmcm9tID0gMCwgaW50IHRvID0gLTEpIGNvbnN0OwpJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29u
dHJvbGxlci5jcHAJKHJldmlzaW9uIDEzMDMwMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC01MCwxMSArNTAsMTEgQEAgcHVibGljOgogICAgIFRleHRMYXlvdXQoUmVuZGVyVGV4dCogdGV4
dCwgY29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcykKICAgICAgICAgOiBtX2ZvbnQoZm9udCkK
ICAgICAgICAgLCBtX3J1bihjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHhQb3MpKQotICAg
ICAgICAsIG1fY29udHJvbGxlcihhZG9wdFB0cihuZXcgQ29tcGxleFRleHRDb250cm9sbGVyKCZt
X2ZvbnQsIG1fcnVuLCB0cnVlKSkpCiAgICAgeworICAgICAgICBtX2NvbnRyb2xsZXIgPSBhZG9w
dFB0cihuZXcgQ29tcGxleFRleHRDb250cm9sbGVyKCZtX2ZvbnQsIG1fcnVuLCB0cnVlLCAmbV9m
YWxsYmFja0ZvbnRzKSk7CiAgICAgfQogCi0gICAgZmxvYXQgd2lkdGgodW5zaWduZWQgZnJvbSwg
dW5zaWduZWQgbGVuKQorICAgIGZsb2F0IHdpZHRoKHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxl
biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCkKICAg
ICB7CiAgICAgICAgIG1fY29udHJvbGxlci0+YWR2YW5jZShmcm9tLCAwLCBCeVdob2xlR2x5cGhz
KTsKICAgICAgICAgZmxvYXQgYmVmb3JlV2lkdGggPSBtX2NvbnRyb2xsZXItPnJ1bldpZHRoU29G
YXIoKTsKQEAgLTYyLDYgKzYyLDExIEBAIHB1YmxpYzoKICAgICAgICAgICAgIGJlZm9yZVdpZHRo
ICs9IG1fZm9udC53b3JkU3BhY2luZygpOwogICAgICAgICBtX2NvbnRyb2xsZXItPmFkdmFuY2Uo
ZnJvbSArIGxlbiwgMCwgQnlXaG9sZUdseXBocyk7CiAgICAgICAgIGZsb2F0IGFmdGVyV2lkdGgg
PSBtX2NvbnRyb2xsZXItPnJ1bldpZHRoU29GYXIoKTsKKyAgICAgICAgaWYgKGZhbGxiYWNrRm9u
dHMgJiYgIW1fZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEhhc2hTZXQ8
Y29uc3QgU2ltcGxlRm9udERhdGEqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9mYWxsYmFja0Zv
bnRzLmVuZCgpOworICAgICAgICAgICAgZm9yIChIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRh
Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9mYWxsYmFja0ZvbnRzLmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkKKyAgICAgICAgICAgICAgICBmYWxsYmFja0ZvbnRzLT5hZGQoKml0KTsKKyAgICAg
ICAgfQogICAgICAgICByZXR1cm4gYWZ0ZXJXaWR0aCAtIGJlZm9yZVdpZHRoOwogICAgIH0KIApA
QCAtODAsNiArODUsNyBAQCBwcml2YXRlOgogICAgIEZvbnQgbV9mb250OwogICAgIFRleHRSdW4g
bV9ydW47CiAgICAgT3duUHRyPENvbXBsZXhUZXh0Q29udHJvbGxlcj4gbV9jb250cm9sbGVyOwor
ICAgIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiBtX2ZhbGxiYWNrRm9udHM7CiB9Owog
CiBQYXNzT3duUHRyPFRleHRMYXlvdXQ+IEZvbnQ6OmNyZWF0ZUxheW91dChSZW5kZXJUZXh0KiB0
ZXh0LCBmbG9hdCB4UG9zLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSkgY29uc3QKQEAgLTk0LDkg
KzEwMCw5IEBAIHZvaWQgRm9udDo6ZGVsZXRlTGF5b3V0KFRleHRMYXlvdXQqIGxheW8KICAgICBk
ZWxldGUgbGF5b3V0OwogfQogCi1mbG9hdCBGb250Ojp3aWR0aChUZXh0TGF5b3V0JiBsYXlvdXQs
IHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbikKK2Zsb2F0IEZvbnQ6OndpZHRoKFRleHRMYXlv
dXQmIGxheW91dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBIYXNoU2V0PGNvbnN0IFNp
bXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9udHMpCiB7Ci0gICAgcmV0dXJuIGxheW91dC53aWR0
aChmcm9tLCBsZW4pOworICAgIHJldHVybiBsYXlvdXQud2lkdGgoZnJvbSwgbGVuLCBmYWxsYmFj
a0ZvbnRzKTsKIH0KIAogc3RhdGljIGlubGluZSBDR0Zsb2F0IHJvdW5kQ0dGbG9hdChDR0Zsb2F0
IGYpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkocmV2aXNpb24g
MTMwMzAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtp
bmcgY29weSkKQEAgLTYyLDYgKzYyLDIyIEBAIHR5cGVkZWYgTWlkcG9pbnRTdGF0ZTxJbmxpbmVJ
dGVyYXRvcj4gTGkKIHR5cGVkZWYgV1RGOjpMaXN0SGFzaFNldDxSZW5kZXJCb3gqLCAxNj4gVHJh
Y2tlZFJlbmRlcmVyTGlzdEhhc2hTZXQ7CiB0eXBlZGVmIFdURjo6SGFzaE1hcDxjb25zdCBSZW5k
ZXJCbG9jayosIFRyYWNrZWRSZW5kZXJlckxpc3RIYXNoU2V0Kj4gVHJhY2tlZERlc2NlbmRhbnRz
TWFwOwogdHlwZWRlZiBXVEY6Okhhc2hNYXA8Y29uc3QgUmVuZGVyQm94KiwgSGFzaFNldDxSZW5k
ZXJCbG9jayo+Kj4gVHJhY2tlZENvbnRhaW5lck1hcDsKK2NsYXNzIFRleHRNZWFzdXJlRW50cnkg
eworcHVibGljOgorICAgIFRleHRNZWFzdXJlRW50cnkoKSA6IHJlbmRlcmVyKDApLAorICAgICAg
ICB0ZXh0V2lkdGgoMCksCisgICAgICAgIHN0YXJ0T2Zmc2V0KDApLAorICAgICAgICBlbmRPZmZz
ZXQoMCkKKyAgICB7CisgICAgfQorICAgIFJlbmRlclRleHQqIHJlbmRlcmVyOworICAgIGZsb2F0
IHRleHRXaWR0aDsKKyAgICBpbnQgc3RhcnRPZmZzZXQ7CisgICAgaW50IGVuZE9mZnNldDsKKyAg
ICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4gZmFsbGJhY2tGb250czsKK307CisKK3R5
cGVkZWYgVmVjdG9yPFRleHRNZWFzdXJlRW50cnk+IFRleHRNZWFzdXJlczsKIAogZW51bSBDYXJl
dFR5cGUgeyBDdXJzb3JDYXJldCwgRHJhZ0NhcmV0IH07CiAKQEAgLTcyOSw3ICs3NDUsNyBAQCBw
cml2YXRlOgogICAgICAgICAgICAgcmVzZXQoKTsKICAgICAgICAgfQogCi0gICAgICAgIElubGlu
ZUl0ZXJhdG9yIG5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBS
ZW5kZXJUZXh0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
LCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgICAgIElubGluZUl0
ZXJhdG9yIG5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBSZW5k
ZXJUZXh0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1
bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgVGV4dE1lYXN1cmVzJik7CiAKICAg
ICAgICAgYm9vbCBsaW5lV2FzSHlwaGVuYXRlZCgpIHsgcmV0dXJuIG1faHlwaGVuYXRlZDsgfQog
ICAgICAgICBjb25zdCBWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKCkgeyBy
ZXR1cm4gbV9wb3NpdGlvbmVkT2JqZWN0czsgfQpAQCAtNzU3LDcgKzc3Myw3IEBAIHByaXZhdGU6
CiAKICAgICB2b2lkIHNldE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qLCBSZW5kZXJSdWJ5UnVu
KiwgUmVuZGVyT2JqZWN0KiwgY29uc3QgTGluZUluZm8mKTsKIAotICAgIHZvaWQgY29tcHV0ZUlu
bGluZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIGNvbnN0IExpbmVJ
bmZvJiwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wg
cmVhY2hlZEVuZCwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmLCBWZXJ0aWNhbFBv
c2l0aW9uQ2FjaGUmKTsKKyAgICB2b2lkIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNG
b3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYsIEJpZGlSdW4qIGZpcnN0UnVu
LCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQsIEdseXBoT3ZlcmZs
b3dBbmRGYWxsYmFja0ZvbnRzTWFwJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgVGV4dE1lYXN1
cmVzJik7CiAgICAgdm9pZCBjb21wdXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJv
b3RJbmxpbmVCb3gqLCBCaWRpUnVuKiwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAm
LCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmKTsKICAgICB2b2lkIGRlbGV0ZUVsbGlwc2lzTGluZUJv
eGVzKCk7CiAgICAgdm9pZCBjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KCk7CkBAIC05NjMsNyAr
OTc5LDcgQEAgcHJpdmF0ZToKICAgICAvLyBFbmQgaGVscGVyIGZ1bmN0aW9ucyBhbmQgc3RydWN0
cyB1c2VkIGJ5IGxheW91dEJsb2NrQ2hpbGRyZW4uCiAKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24g
Zm9yIGxheW91dElubGluZUNoaWxkcmVuKCkKLSAgICBSb290SW5saW5lQm94KiBjcmVhdGVMaW5l
Qm94ZXNGcm9tQmlkaVJ1bnMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mLCBjb25zdCBJbmxpbmVJdGVy
YXRvciYgZW5kLCBMaW5lSW5mbyYsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYsIEJpZGlSdW4qIHRy
YWlsaW5nU3BhY2VSdW4pOworICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUxpbmVCb3hlc0Zyb21C
aWRpUnVucyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQs
IExpbmVJbmZvJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgQmlkaVJ1biogdHJhaWxpbmdTcGFj
ZVJ1biwgVGV4dE1lYXN1cmVzJik7CiAgICAgdm9pZCBsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVM
YXlvdXRTdGF0ZSYsIGJvb2wgaGFzSW5saW5lQ2hpbGQpOwogICAgIHZvaWQgbGF5b3V0UnVuc0Fu
ZEZsb2F0c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiwgSW5saW5lQmlkaVJlc29sdmVyJiwgY29u
c3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBjbGVh
bkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CiAg
ICAgdm9pZCBsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJik7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNw
cAkocmV2aXNpb24gMTMwMzAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJs
b2NrTGluZUxheW91dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY4Myw3ICs2ODMsNyBAQCBzdGF0
aWMgaW5saW5lIGZsb2F0IG1lYXN1cmVIeXBoZW5XaWR0aChSCiB9CiAKIHN0YXRpYyBpbmxpbmUg
dm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJp
ZGlSdW4qIHJ1biwgUmVuZGVyVGV4dCogcmVuZGVyZXIsIGZsb2F0IHhQb3MsIGNvbnN0IExpbmVJ
bmZvJiBsaW5lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2x5cGhP
dmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0
aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0
ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2Fj
aGUsIFRleHRNZWFzdXJlcyYgdGV4dE1lYXN1cmVzKQogewogICAgIEhhc2hTZXQ8Y29uc3QgU2lt
cGxlRm9udERhdGEqPiBmYWxsYmFja0ZvbnRzOwogICAgIEdseXBoT3ZlcmZsb3cgZ2x5cGhPdmVy
ZmxvdzsKQEAgLTcwNyw3ICs3MDcsNDAgQEAgc3RhdGljIGlubGluZSB2b2lkIHNldExvZ2ljYWxX
aWR0aEZvclRleAogICAgICAgICBjb25zdCBGb250JiBmb250ID0gcmVuZGVyZXItPnN0eWxlKGxp
bmVJbmZvLmlzRmlyc3RMaW5lKCkpLT5mb250KCk7CiAgICAgICAgIGh5cGhlbldpZHRoID0gbWVh
c3VyZUh5cGhlbldpZHRoKHJlbmRlcmVyLCBmb250KTsKICAgICB9Ci0gICAgcnVuLT5tX2JveC0+
c2V0TG9naWNhbFdpZHRoKHJlbmRlcmVyLT53aWR0aChydW4tPm1fc3RhcnQsIHJ1bi0+bV9zdG9w
IC0gcnVuLT5tX3N0YXJ0LCB4UG9zLCBsaW5lSW5mby5pc0ZpcnN0TGluZSgpLCAmZmFsbGJhY2tG
b250cywgJmdseXBoT3ZlcmZsb3cpICsgaHlwaGVuV2lkdGgpOworICAgIGZsb2F0IG1lYXN1cmVk
V2lkdGggPSAwOworICAgIGJvb2wgaXNLZXJuaW5nRW5hYmxlZCA9IHJlbmRlcmVyLT5zdHlsZSgp
LT5mb250KCkudHlwZXNldHRpbmdGZWF0dXJlcygpICYgS2VybmluZzsKKyAgICAKKyAgICBpZiAo
IWxpbmVCb3gtPmZpdHNUb0dseXBocygpICYmICF0ZXh0TWVhc3VyZXMuaXNFbXB0eSgpKSB7Cisg
ICAgICAgIGludCBsYXN0RW5kT2Zmc2V0ID0gcnVuLT5tX3N0YXJ0OworICAgICAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHRleHRNZWFzdXJlcy5zaXplKCkgJiYgbGFzdEVuZE9mZnNldCA8IHJ1
bi0+bV9zdG9wOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFRleHRNZWFzdXJlRW50cnkmIGVu
dHJ5ID0gdGV4dE1lYXN1cmVzW2ldOworICAgICAgICAgICAgaWYgKGVudHJ5LnJlbmRlcmVyICE9
IHJlbmRlcmVyIHx8IGVudHJ5LnN0YXJ0T2Zmc2V0ICE9IGxhc3RFbmRPZmZzZXQgfHwgZW50cnku
ZW5kT2Zmc2V0ID4gcnVuLT5tX3N0b3ApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgICAgIGxhc3RFbmRPZmZzZXQgPSBlbnRyeS5lbmRPZmZzZXQ7CisgICAgICAgICAgICBp
ZiAoaXNLZXJuaW5nRW5hYmxlZCAmJiBsYXN0RW5kT2Zmc2V0ID09IHJ1bi0+bV9zdG9wKSB7Cisg
ICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCArPSByZW5kZXJlci0+d2lkdGgoZW50cnkuc3Rh
cnRPZmZzZXQsIGxhc3RFbmRPZmZzZXQgLSBlbnRyeS5zdGFydE9mZnNldCwgeFBvcywgbGluZUlu
Zm8uaXNGaXJzdExpbmUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAg
ICAgICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLT5zdHlsZSgpLT53b3JkU3BhY2lu
ZygpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCAr
PSBlbnRyeS50ZXh0V2lkdGg7CisgICAgICAgICAgICBpZiAoIWVudHJ5LmZhbGxiYWNrRm9udHMu
aXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0
YSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBlbnRyeS5mYWxsYmFja0ZvbnRzLmVuZCgpOworICAg
ICAgICAgICAgICAgIGZvciAoSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+Ojpjb25zdF9p
dGVyYXRvciBpdCA9IGVudHJ5LmZhbGxiYWNrRm9udHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KQorICAgICAgICAgICAgICAgICAgICBmYWxsYmFja0ZvbnRzLmFkZCgqaXQpOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtZWFzdXJlZFdpZHRoICYmIGxhc3RFbmRPZmZz
ZXQgIT0gcnVuLT5tX3N0b3ApIHsKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgZW5vdWdo
IGNhY2hlZCBkYXRhLCB3ZSdsbCBtZWFzdXJlIGFnYWluCisgICAgICAgICAgICBtZWFzdXJlZFdp
ZHRoID0gMDsKKyAgICAgICAgICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGlmICghbWVhc3VyZWRXaWR0aCkKKyAgICAgICAgbWVhc3VyZWRXaWR0aCA9
IHJlbmRlcmVyLT53aWR0aChydW4tPm1fc3RhcnQsIHJ1bi0+bV9zdG9wIC0gcnVuLT5tX3N0YXJ0
LCB4UG9zLCBsaW5lSW5mby5pc0ZpcnN0TGluZSgpLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3Zl
cmZsb3cpOworCisgICAgcnVuLT5tX2JveC0+c2V0TG9naWNhbFdpZHRoKG1lYXN1cmVkV2lkdGgg
KyBoeXBoZW5XaWR0aCk7CiAgICAgaWYgKCFmYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkgewogICAg
ICAgICBBU1NFUlQocnVuLT5tX2JveC0+aXNUZXh0KCkpOwogICAgICAgICBHbHlwaE92ZXJmbG93
QW5kRmFsbGJhY2tGb250c01hcDo6aXRlcmF0b3IgaXQgPSB0ZXh0Qm94RGF0YU1hcC5hZGQodG9J
bmxpbmVUZXh0Qm94KHJ1bi0+bV9ib3gpLCBtYWtlX3BhaXIoVmVjdG9yPGNvbnN0IFNpbXBsZUZv
bnREYXRhKj4oKSwgR2x5cGhPdmVyZmxvdygpKSkuaXRlcmF0b3I7CkBAIC03OTcsNyArODMwLDcg
QEAgdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlTG9naWNhbFdpZHRoRm9yQQogfQogCiB2b2lkIFJl
bmRlckJsb2NrOjpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5s
aW5lQm94KiBsaW5lQm94LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIEJpZGlSdW4qIGZpcnN0
UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaE92
ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRp
b25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNr
Rm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2Fs
UG9zaXRpb25DYWNoZSwgVGV4dE1lYXN1cmVzJiB0ZXh0TWVhc3VyZXMpCiB7CiAgICAgRVRleHRB
bGlnbiB0ZXh0QWxpZ24gPSB0ZXh0QWxpZ25tZW50Rm9yTGluZSghcmVhY2hlZEVuZCAmJiAhbGlu
ZUJveC0+ZW5kc1dpdGhCcmVhaygpKTsKICAgICAKQEAgLTg0NCw3ICs4NzcsNyBAQCB2b2lkIFJl
bmRlckJsb2NrOjpjb21wdXRlSW5saW5lRGlyZWN0aW9uCiAgICAgICAgICAgICAgICAgbmVlZHNX
b3JkU3BhY2luZyA9ICFpc1NwYWNlT3JOZXdsaW5lKHJ0LT5jaGFyYWN0ZXJzKClbci0+bV9zdG9w
IC0gMV0pICYmIHItPm1fc3RvcCA9PSBsZW5ndGg7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAg
ICAgIHNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4obGluZUJveCwgciwgcnQsIHRvdGFsTG9naWNh
bFdpZHRoLCBsaW5lSW5mbywgdGV4dEJveERhdGFNYXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSk7
CisgICAgICAgICAgICBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKGxpbmVCb3gsIHIsIHJ0LCB0
b3RhbExvZ2ljYWxXaWR0aCwgbGluZUluZm8sIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0
aW9uQ2FjaGUsIHRleHRNZWFzdXJlcyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBp
c0FmdGVyRXhwYW5zaW9uID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAoIXItPm1fb2JqZWN0LT5p
c1JlbmRlcklubGluZSgpKSB7CkBAIC0xMDcxLDcgKzExMDQsNyBAQCBzdGF0aWMgaW5saW5lIHZv
aWQgY29uc3RydWN0QmlkaVJ1bnMoSW5sCiB9CiAKIC8vIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0
cyBsaW5lIGJveGVzIGZvciBhbGwgb2YgdGhlIHRleHQgcnVucyBpbiB0aGUgcmVzb2x2ZXIgYW5k
IGNvbXB1dGVzIHRoZWlyIHBvc2l0aW9uLgotUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNy
ZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIExpbmVJbmZvJiBsaW5lSW5mbywgVmVydGljYWxQ
b3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIEJpZGlSdW4qIHRyYWlsaW5nU3Bh
Y2VSdW4pCitSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlTGluZUJveGVzRnJvbUJp
ZGlSdW5zKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0
b3ImIGVuZCwgTGluZUluZm8mIGxpbmVJbmZvLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRp
Y2FsUG9zaXRpb25DYWNoZSwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgVGV4dE1lYXN1cmVz
JiB0ZXh0TWVhc3VyZXMpCiB7CiAgICAgaWYgKCFiaWRpUnVucy5ydW5Db3VudCgpKQogICAgICAg
ICByZXR1cm4gMDsKQEAgLTEwOTUsNyArMTEyOCw3IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJs
b2NrOjpjcmVhdGVMaW5lQm8KICAgICAKICAgICAvLyBOb3cgd2UgcG9zaXRpb24gYWxsIG9mIG91
ciB0ZXh0IHJ1bnMgaG9yaXpvbnRhbGx5LgogICAgIGlmICghaXNTVkdSb290SW5saW5lQm94KQot
ICAgICAgICBjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBs
aW5lSW5mbywgYmlkaVJ1bnMuZmlyc3RSdW4oKSwgdHJhaWxpbmdTcGFjZVJ1biwgZW5kLmF0RW5k
KCksIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpOworICAgICAgICBjb21w
dXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBsaW5lSW5mbywgYmlk
aVJ1bnMuZmlyc3RSdW4oKSwgdHJhaWxpbmdTcGFjZVJ1biwgZW5kLmF0RW5kKCksIHRleHRCb3hE
YXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIHRleHRNZWFzdXJlcyk7CiAgICAgCiAgICAg
Ly8gTm93IHBvc2l0aW9uIG91ciB0ZXh0IHJ1bnMgdmVydGljYWxseS4KICAgICBjb21wdXRlQmxv
Y2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGJpZGlSdW5zLmZpcnN0UnVuKCks
IHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpOwpAQCAtMTM0MSw3ICsxMzc0
LDggQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUgogICAgICAgICAg
ICAgZXhjbHVzaW9uU2hhcGVJbnNpZGVJbmZvLT5jb21wdXRlU2VnbWVudHNGb3JMaW5lKGxpbmVU
b3AsIGxpbmVCb3R0b20pOwogICAgICAgICB9CiAjZW5kaWYKLSAgICAgICAgZW5kID0gbGluZUJy
ZWFrZXIubmV4dExpbmVCcmVhayhyZXNvbHZlciwgbGF5b3V0U3RhdGUubGluZUluZm8oKSwgcmVu
ZGVyVGV4dEluZm8sIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGNvbnNlY3V0aXZlSHlwaGVu
YXRlZExpbmVzKTsKKyAgICAgICAgVGV4dE1lYXN1cmVzIHRleHRNZWFzdXJlczsKKyAgICAgICAg
ZW5kID0gbGluZUJyZWFrZXIubmV4dExpbmVCcmVhayhyZXNvbHZlciwgbGF5b3V0U3RhdGUubGlu
ZUluZm8oKSwgcmVuZGVyVGV4dEluZm8sIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGNvbnNl
Y3V0aXZlSHlwaGVuYXRlZExpbmVzLCB0ZXh0TWVhc3VyZXMpOwogICAgICAgICBpZiAocmVzb2x2
ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7CiAgICAgICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxk
bid0IGJlIGNyZWF0aW5nIGFueSBydW5zIGluIG5leHRMaW5lQnJlYWsgdG8gYmVnaW4gd2l0aCEK
ICAgICAgICAgICAgIC8vIE9uY2UgQmlkaVJ1bkxpc3QgaXMgc2VwYXJhdGVkIGZyb20gQmlkaVJl
c29sdmVyIHRoaXMgd2lsbCBub3QgYmUgbmVlZGVkLgpAQCAtMTM4Myw3ICsxNDE3LDcgQEAgdm9p
ZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUgogICAgICAgICAgICAgLy8gaW5s
aW5lIGZsb3cgYm94ZXMuCiAKICAgICAgICAgICAgIExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdo
dCA9IGxvZ2ljYWxIZWlnaHQoKTsKLSAgICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gg
PSBjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnMoYmlkaVJ1bnMsIGVuZCwgbGF5b3V0U3RhdGUu
bGluZUluZm8oKSwgdmVydGljYWxQb3NpdGlvbkNhY2hlLCB0cmFpbGluZ1NwYWNlUnVuKTsKKyAg
ICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmVCb3ggPSBjcmVhdGVMaW5lQm94ZXNGcm9tQmlk
aVJ1bnMoYmlkaVJ1bnMsIGVuZCwgbGF5b3V0U3RhdGUubGluZUluZm8oKSwgdmVydGljYWxQb3Np
dGlvbkNhY2hlLCB0cmFpbGluZ1NwYWNlUnVuLCB0ZXh0TWVhc3VyZXMpOwogCiAgICAgICAgICAg
ICBiaWRpUnVucy5kZWxldGVSdW5zKCk7CiAgICAgICAgICAgICByZXNvbHZlci5tYXJrQ3VycmVu
dFJ1bkVtcHR5KCk7IC8vIEZJWE1FOiBUaGlzIGNhbiBwcm9iYWJseSBiZSByZXBsYWNlZCBieSBh
biBBU1NFUlQgKG9yIGp1c3QgcmVtb3ZlZCkuCkBAIC0yMDQxLDEzICsyMDc1LDE0IEBAIHN0YXRp
YyBib29sIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGEKICAgICByZXR1cm4gZmFsc2U7CiB9
CiAKLXN0YXRpYyBpbmxpbmUgZmxvYXQgdGV4dFdpZHRoKFJlbmRlclRleHQqIHRleHQsIHVuc2ln
bmVkIGZyb20sIHVuc2lnbmVkIGxlbiwgY29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcywgYm9v
bCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBUZXh0TGF5b3V0KiBsYXlv
dXQgPSAwKQorc3RhdGljIEFMV0FZU19JTkxJTkUgZmxvYXQgdGV4dFdpZHRoKFJlbmRlclRleHQq
IHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbiwgY29uc3QgRm9udCYgZm9udCwgZmxv
YXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBIYXNo
U2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9udHMgPSAwLCBUZXh0TGF5b3V0
KiBsYXlvdXQgPSAwKQogeworICAgIEdseXBoT3ZlcmZsb3cgZ2x5cGhPdmVyZmxvdzsKICAgICBp
ZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4gPT0gdGV4dC0+dGV4dExlbmd0aCgpKSB8
fCB0ZXh0LT5zdHlsZSgpLT5oYXNUZXh0Q29tYmluZSgpKQotICAgICAgICByZXR1cm4gdGV4dC0+
d2lkdGgoZnJvbSwgbGVuLCBmb250LCB4UG9zKTsKKyAgICAgICAgcmV0dXJuIHRleHQtPndpZHRo
KGZyb20sIGxlbiwgZm9udCwgeFBvcywgZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOwog
CiAgICAgaWYgKGxheW91dCkKLSAgICAgICAgcmV0dXJuIEZvbnQ6OndpZHRoKCpsYXlvdXQsIGZy
b20sIGxlbik7CisgICAgICAgIHJldHVybiBGb250Ojp3aWR0aCgqbGF5b3V0LCBmcm9tLCBsZW4s
IGZhbGxiYWNrRm9udHMpOwogCiAgICAgVGV4dFJ1biBydW4gPSBSZW5kZXJCbG9jazo6Y29uc3Ry
dWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LT5jaGFyYWN0ZXJzKCkgKyBmcm9tLCBsZW4sIHRl
eHQtPnN0eWxlKCkpOwogICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRleHQtPnRleHRMZW5n
dGgoKSAtIGZyb20pOwpAQCAtMjA1Niw3ICsyMDkxLDcgQEAgc3RhdGljIGlubGluZSBmbG9hdCB0
ZXh0V2lkdGgoUmVuZGVyVGV4dAogICAgIHJ1bi5zZXRDaGFyYWN0ZXJTY2FuRm9yQ29kZVBhdGgo
IXRleHQtPmNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCgpKTsKICAgICBydW4uc2V0VGFiU2l6ZSgh
Y29sbGFwc2VXaGl0ZVNwYWNlLCB0ZXh0LT5zdHlsZSgpLT50YWJTaXplKCkpOwogICAgIHJ1bi5z
ZXRYUG9zKHhQb3MpOwotICAgIHJldHVybiBmb250LndpZHRoKHJ1bik7CisgICAgcmV0dXJuIGZv
bnQud2lkdGgocnVuLCBmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7CiB9CiAKIHN0YXRp
YyB2b2lkIHRyeUh5cGhlbmF0aW5nKFJlbmRlclRleHQqIHRleHQsIGNvbnN0IEZvbnQmIGZvbnQs
IGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxlSWRlbnRpZmllciwgdW5zaWduZWQgY29uc2VjdXRp
dmVIeXBoZW5hdGVkTGluZXMsIGludCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0LCBp
bnQgbWluaW11bVByZWZpeExlbmd0aCwgaW50IG1pbmltdW1TdWZmaXhMZW5ndGgsIGludCBsYXN0
U3BhY2UsIGludCBwb3MsIGZsb2F0IHhQb3MsIGludCBhdmFpbGFibGVXaWR0aCwgYm9vbCBpc0Zp
eGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBpbnQgbGFzdFNwYWNlV29yZFNwYWNp
bmcsIElubGluZUl0ZXJhdG9yJiBsaW5lQnJlYWssIGludCBuZXh0QnJlYWthYmxlLCBib29sJiBo
eXBoZW5hdGVkKQpAQCAtMjIxMCw3ICsyMjQ1LDI1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OkxpbmVC
cmVha2VyOjpyZXNldCgpCiAgICAgbV9jbGVhciA9IENOT05FOwogfQogCi1JbmxpbmVJdGVyYXRv
ciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6Om5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29s
dmVyJiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZvLCBSZW5kZXJUZXh0SW5mbyYgcmVuZGVy
VGV4dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNp
Z25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRU
ZXh0TWVhc3VyZShUZXh0TWVhc3VyZUVudHJ5JiBlbnRyeSwgVGV4dE1lYXN1cmVzJiBtZWFzdXJl
cykKK3sKKyAgICBpZiAoZW50cnkudGV4dFdpZHRoIDw9IDAgfHwgZW50cnkuc3RhcnRPZmZzZXQg
PT0gZW50cnkuZW5kT2Zmc2V0KQorICAgICAgICByZXR1cm47CisgICAgCisgICAgaWYgKG1lYXN1
cmVzLmlzRW1wdHkoKSkgeworICAgICAgICBtZWFzdXJlcy5hcHBlbmQoZW50cnkpOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIAorICAgIFRleHRNZWFzdXJlRW50cnkmIGxhc3RFbnRyeSA9
IG1lYXN1cmVzW21lYXN1cmVzLnNpemUoKSAtIDFdOworICAgIGlmIChsYXN0RW50cnkuc3RhcnRP
ZmZzZXQgPT0gZW50cnkuc3RhcnRPZmZzZXQgJiYgbGFzdEVudHJ5LmVuZE9mZnNldCA9PSBlbnRy
eS5lbmRPZmZzZXQpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBtZWFzdXJlcy5hcHBlbmQo
ZW50cnkpOworICAgIGVudHJ5LmZhbGxiYWNrRm9udHMuY2xlYXIoKTsKK30KKworSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOjpuZXh0TGluZUJyZWFrKElubGluZUJpZGlS
ZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvJiBsaW5lSW5mbywgUmVuZGVyVGV4dEluZm8mIHJl
bmRlclRleHRJbmZvLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwg
dW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIFRleHRNZWFzdXJlcyYgdGV4dE1l
YXN1cmVzKQogewogICAgIHJlc2V0KCk7CiAKQEAgLTIyNjEsNiArMjMxNCwxMSBAQCBJbmxpbmVJ
dGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAKICAgICBFV2hpdGVTcGFjZSBjdXJy
V1MgPSBibG9ja1N0eWxlLT53aGl0ZVNwYWNlKCk7CiAgICAgRVdoaXRlU3BhY2UgbGFzdFdTID0g
Y3VycldTOworCisgICAgVGV4dE1lYXN1cmVFbnRyeSB0ZXh0RW50cnk7CisgICAgICAgIAorICAg
IGJvb2wgdXNlQ2FjaGVkTWVhc3VyZW1lbnRzID0gdHJ1ZTsKKwogICAgIHdoaWxlIChjdXJyZW50
Lm1fb2JqKSB7CiAgICAgICAgIFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUgPSBjdXJyZW50Lm1f
b2JqLT5zdHlsZSgpOwogICAgICAgICBSZW5kZXJPYmplY3QqIG5leHQgPSBiaWRpTmV4dFNraXBw
aW5nRW1wdHlJbmxpbmVzKG1fYmxvY2ssIGN1cnJlbnQubV9vYmopOwpAQCAtMjQyMiwxMiArMjQ4
MCwxNiBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAKICAgICAg
ICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHQtPnN0eWxlKGxpbmVJbmZvLmlzRmlyc3RMaW5l
KCkpOwogICAgICAgICAgICAgY29uc3QgRm9udCYgZiA9IHN0eWxlLT5mb250KCk7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIHVzZUNhY2hlZE1lYXN1cmVtZW50cyA9IHQtPmNhblVzZVNpbXBs
ZUZvbnRDb2RlUGF0aCgpOworICAgICAgICAgICAgCiAgICAgICAgICAgICBib29sIGlzRml4ZWRQ
aXRjaCA9IGYuaXNGaXhlZFBpdGNoKCk7CiAgICAgICAgICAgICBib29sIGNhbkh5cGhlbmF0ZSA9
IHN0eWxlLT5oeXBoZW5zKCkgPT0gSHlwaGVuc0F1dG8gJiYgV2ViQ29yZTo6Y2FuSHlwaGVuYXRl
KHN0eWxlLT5sb2NhbGUoKSk7CiAKICAgICAgICAgICAgIGludCBsYXN0U3BhY2UgPSBjdXJyZW50
Lm1fcG9zOwogICAgICAgICAgICAgZmxvYXQgd29yZFNwYWNpbmcgPSBjdXJyZW50U3R5bGUtPndv
cmRTcGFjaW5nKCk7CiAgICAgICAgICAgICBmbG9hdCBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7
CisgICAgICAgICAgICBmbG9hdCB3b3JkU3BhY2luZ0ZvclRleHRNZWFzdXJlID0gMDsKIAogICAg
ICAgICAgICAgZmxvYXQgd3JhcFcgPSB3aWR0aC51bmNvbW1pdHRlZFdpZHRoKCkgKyBpbmxpbmVM
b2dpY2FsV2lkdGgoY3VycmVudC5tX29iaiwgIWFwcGxpZWRTdGFydFdpZHRoLCB0cnVlKTsKICAg
ICAgICAgICAgIGZsb2F0IGNoYXJXaWR0aCA9IDA7CkBAIC0yNDU3LDYgKzI1MTksNyBAQCBJbmxp
bmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAgICAgICAgICAgICB9CiAKICAg
ICAgICAgICAgIFRleHRMYXlvdXQqIHRleHRMYXlvdXQgPSByZW5kZXJUZXh0SW5mby5tX2xheW91
dC5nZXQoKTsKKyAgICAgICAgICAgIHRleHRFbnRyeS5yZW5kZXJlciA9IHQ7CiAKICAgICAgICAg
ICAgIC8vIE5vbi16ZXJvIG9ubHkgd2hlbiBrZXJuaW5nIGlzIGVuYWJsZWQgYW5kIFRleHRMYXlv
dXQgaXNuJ3QgdXNlZCwgaW4gd2hpY2ggY2FzZSB3ZSBtZWFzdXJlCiAgICAgICAgICAgICAvLyB3
b3JkcyB3aXRoIHRoZWlyIHRyYWlsaW5nIHNwYWNlLCB0aGVuIHN1YnRyYWN0IGl0cyB3aWR0aC4K
QEAgLTI0ODMsNyArMjU0Niw3IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJl
YWtlcjoKICAgICAgICAgICAgICAgICBpZiAoKGJyZWFrQWxsIHx8IGJyZWFrV29yZHMpICYmICFt
aWRXb3JkQnJlYWspIHsKICAgICAgICAgICAgICAgICAgICAgd3JhcFcgKz0gY2hhcldpZHRoOwog
ICAgICAgICAgICAgICAgICAgICBib29sIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFp
ciA9IFUxNl9JU19MRUFEKGMpICYmIGN1cnJlbnQubV9wb3MgKyAxIDwgdC0+dGV4dExlbmd0aCgp
ICYmIFUxNl9JU19UUkFJTCh0LT5jaGFyYWN0ZXJzKClbY3VycmVudC5tX3BvcyArIDFdKTsKLSAg
ICAgICAgICAgICAgICAgICAgY2hhcldpZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJlbnQubV9wb3Ms
IG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA/IDIgOiAxLCBmLCB3aWR0aC5jb21t
aXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCB0
ZXh0TGF5b3V0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcldpZHRoID0gdGV4dFdpZHRoKHQs
IGN1cnJlbnQubV9wb3MsIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA/IDIgOiAx
LCBmLCB3aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwgY29sbGFw
c2VXaGl0ZVNwYWNlLCAmdGV4dEVudHJ5LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwogICAg
ICAgICAgICAgICAgICAgICBtaWRXb3JkQnJlYWsgPSB3aWR0aC5jb21taXR0ZWRXaWR0aCgpICsg
d3JhcFcgKyBjaGFyV2lkdGggPiB3aWR0aC5hdmFpbGFibGVXaWR0aCgpOwogICAgICAgICAgICAg
ICAgIH0KIApAQCAtMjQ5OCw2ICsyNTYxLDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6
OkxpbmVCcmVha2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBwb2ludC4K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmluZ1NwYWNlcyA9IGZhbHNlOwogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gMDsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvclRleHRNZWFzdXJlID0gMDsKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U3BhY2UgPSBjdXJyZW50Lm1fcG9zOyAvLyBl
LmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQgc3BhY2Vz
LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0
YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBjdXJyZW50Lm1fb2JqLCBjdXJyZW50Lm1fcG9zKSk7CiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gdHJ1ZTsK
QEAgLTI1MDksMTYgKzI1NzMsMjEgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVC
cmVha2VyOgogCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxUbXBXOwogICAg
ICAgICAgICAgICAgICAgICBpZiAod29yZFRyYWlsaW5nU3BhY2VXaWR0aCAmJiBjdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUbXBXID0g
dGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyArIDEgLSBsYXN0U3BhY2UsIGYs
IHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwg
dGV4dExheW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoICsgbGFzdFNwYWNlV29yZFNwYWNp
bmc7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0aCh0
LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgKyAxIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJy
ZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsICZ0ZXh0RW50cnku
ZmFsbGJhY2tGb250cywgdGV4dExheW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOwogICAg
ICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFs
VG1wVyA9IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2Us
IGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFj
ZSwgdGV4dExheW91dCkgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGFkZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5t
X3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwg
Y29sbGFwc2VXaGl0ZVNwYWNlLCAmdGV4dEVudHJ5LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQp
OworCisgICAgICAgICAgICAgICAgICAgIHRleHRFbnRyeS5lbmRPZmZzZXQgPSBjdXJyZW50Lm1f
cG9zOworICAgICAgICAgICAgICAgICAgICB0ZXh0RW50cnkuc3RhcnRPZmZzZXQgPSBsYXN0U3Bh
Y2U7CisgICAgICAgICAgICAgICAgICAgIHRleHRFbnRyeS50ZXh0V2lkdGggPSBhZGRpdGlvbmFs
VG1wVyArIHdvcmRTcGFjaW5nRm9yVGV4dE1lYXN1cmU7CisgICAgICAgICAgICAgICAgICAgIGFk
ZGl0aW9uYWxUbXBXICs9IGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAgICAgICAgICAgICAgICAg
ICB3aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUbXBXKTsKICAgICAgICAgICAg
ICAgICAgICAgaWYgKCFhcHBsaWVkU3RhcnRXaWR0aCkgewogICAgICAgICAgICAgICAgICAgICAg
ICAgd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgoY3VycmVudC5t
X29iaiwgdHJ1ZSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWRTdGFy
dFdpZHRoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAg
ICAgIGFwcGx5V29yZFNwYWNpbmcgPSAgd29yZFNwYWNpbmcgJiYgY3VycmVudENoYXJhY3Rlcklz
U3BhY2U7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5V29yZFNwYWNpbmcgPSB3b3JkU3BhY2lu
ZyAmJiBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAo
IXdpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgYXV0b1dyYXAgJiYgIXdpZHRoLmZpdHNPbkxpbmUo
KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLmZpdEJlbG93RmxvYXRzKCk7CkBAIC0y
NTI4LDcgKzI1OTcsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6
CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBjYW5kaWRhdGUgd2lkdGggZm9yIHRoaXMg
bGluZS4KICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGluZVdhc1Rvb1dpZGUgPSBmYWxz
ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aC5maXRzT25MaW5lKCkgJiYgY3Vy
cmVudENoYXJhY3RlcklzV1MgJiYgY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3Bh
Y2UoKSAmJiAhbWlkV29yZEJyZWFrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxv
YXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJlbnQubV9wb3MsIDEsIGYsIHdpZHRoLmN1
cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgdGV4dExheW91
dCkgKyAoYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJlbnQubV9w
b3MsIDEsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hp
dGVTcGFjZSwgJnRleHRFbnRyeS5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSArIChhcHBseVdv
cmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcgZXZlbiB3aXRob3V0IHRoZSBleHRyYSBzcGFj
ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUu
IElmIGl0IGlzIG5vdCwgZG8gbm90aGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBJZiB0aGUgbGluZSBuZWVkcyB0aGUgZXh0cmEgd2hpdGVzcGFjZSB0byBiZSB0b28gbG9uZywK
QEAgLTI1NTQsOSArMjYyMywxNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJy
ZWFrZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbEJyZWFrLmluY3JlbWVudCgpOwogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBsaW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkodHJ1ZSk7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbnRyeS5lbmRPZmZzZXQgPSBs
QnJlYWsubV9wb3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChsQnJlYWsubV9vYmogJiYgbEJyZWFrLm1fcG9zICYmIGxCcmVh
ay5tX29iai0+aXNUZXh0KCkgJiYgdG9SZW5kZXJUZXh0KGxCcmVhay5tX29iaiktPnRleHRMZW5n
dGgoKSAmJiB0b1JlbmRlclRleHQobEJyZWFrLm1fb2JqKS0+Y2hhcmFjdGVycygpW2xCcmVhay5t
X3BvcyAtIDFdID09IHNvZnRIeXBoZW4gJiYgc3R5bGUtPmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9u
ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9oeXBoZW5hdGVkID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAobEJyZWFrLm1fcG9zICYmIGxCcmVhay5tX3BvcyAhPSAodW5zaWduZWQpdGV4dEVudHJ5
LmVuZE9mZnNldCAmJiAhdGV4dEVudHJ5LnRleHRXaWR0aCkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoY2hhcldpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0ZXh0RW50cnkuZW5kT2Zmc2V0ID0gbEJyZWFrLm1fcG9zOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVudHJ5LnRleHRXaWR0aCA9IGNoYXJXaWR0
aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsgLy8gRGlk
bid0IGZpdC4gSnVtcCB0byB0aGUgZW5kLgogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJldHdlZW5Xb3JkcyB8fCAobWlk
V29yZEJyZWFrICYmICFhdXRvV3JhcCkpCkBAIC0yNTY4LDYgKzI2NDUsOCBAQCBJbmxpbmVJdGVy
YXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgIGlmICh1c2VDYWNoZWRNZWFzdXJlbWVudHMpCisgICAgICAgICAg
ICAgICAgICAgICAgICBhZGRUZXh0TWVhc3VyZSh0ZXh0RW50cnksIHRleHRNZWFzdXJlcyk7CiAK
ICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJyAmJiBwcmVzZXJ2ZU5ld2xpbmUpIHsK
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcHBlZElnbm9yaW5nU3BhY2VzICYmIGN1
cnJlbnQubV9wb3MgPiAwKSB7CkBAIC0yNTk5LDYgKzI2NzgsNyBAQCBJbmxpbmVJdGVyYXRvciBS
ZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGJldHdl
ZW5Xb3JkcykgewogICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNwYWNpbmcg
PSBhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwOworICAgICAgICAgICAgICAgICAg
ICAgICAgd29yZFNwYWNpbmdGb3JUZXh0TWVhc3VyZSA9IChhcHBseVdvcmRTcGFjaW5nICYmIHRl
eHRFbnRyeS50ZXh0V2lkdGgpID8gd29yZFNwYWNpbmcgOiAwOwogICAgICAgICAgICAgICAgICAg
ICAgICAgbGFzdFNwYWNlID0gY3VycmVudC5tX3BvczsKICAgICAgICAgICAgICAgICAgICAgfQog
CkBAIC0yNjIxLDYgKzI3MDEsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJy
ZWFrZXI6CiAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBwb2ludC4KICAgICAgICAgICAgICAg
ICAgICAgaWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbGFzdFNw
YWNlV29yZFNwYWNpbmcgPSBhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwOworICAg
ICAgICAgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvclRleHRNZWFzdXJlID0gKGFwcGx5V29yZFNw
YWNpbmcgJiYgdGV4dEVudHJ5LnRleHRXaWR0aCkgPyB3b3JkU3BhY2luZyA6IDA7CiAgICAgICAg
ICAgICAgICAgICAgIGxhc3RTcGFjZSA9IGN1cnJlbnQubV9wb3M7IC8vIGUuZy4sICJGb28gICAg
Z29vIiwgZG9uJ3QgYWRkIGluIGFueSBvZiB0aGUgaWdub3JlZCBzcGFjZXMuCiAgICAgICAgICAg
ICAgICAgICAgIGFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigw
LCBjdXJyZW50Lm1fb2JqLCBjdXJyZW50Lm1fcG9zKSk7CiAgICAgICAgICAgICAgICAgfQpAQCAt
MjY1NCw3ICsyNzM1LDExIEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtl
cjoKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSU1QT1JUQU5UOiBjdXJyZW50Lm1f
cG9zIGlzID4gbGVuZ3RoIGhlcmUhCi0gICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVG1wVyA9
IGlnbm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9w
b3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNv
bGxhcHNlV2hpdGVTcGFjZSwgdGV4dExheW91dCkgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAg
ICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxUbXBXID0gaWdub3JpbmdTcGFjZXMgPyAwIDogdGV4
dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGgu
Y3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCAmdGV4dEVu
dHJ5LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOworICAgICAgICAgICAgdGV4dEVudHJ5LnN0
YXJ0T2Zmc2V0ID0gbGFzdFNwYWNlOworICAgICAgICAgICAgdGV4dEVudHJ5LmVuZE9mZnNldCA9
IGN1cnJlbnQubV9wb3M7CisgICAgICAgICAgICB0ZXh0RW50cnkudGV4dFdpZHRoID0gaWdub3Jp
bmdTcGFjZXMgPyAwIDogYWRkaXRpb25hbFRtcFcgKyB3b3JkU3BhY2luZ0ZvclRleHRNZWFzdXJl
OworICAgICAgICAgICAgYWRkaXRpb25hbFRtcFcgKz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7CiAg
ICAgICAgICAgICB3aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUbXBXICsgaW5s
aW5lTG9naWNhbFdpZHRoKGN1cnJlbnQubV9vYmosICFhcHBsaWVkU3RhcnRXaWR0aCwgaW5jbHVk
ZUVuZFdpZHRoKSk7CiAgICAgICAgICAgICBpbmNsdWRlRW5kV2lkdGggPSBmYWxzZTsKIApAQCAt
MjY2OCw2ICsyNzUzLDggQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2Vy
OgogICAgICAgICAgICAgICAgIGlmIChtX2h5cGhlbmF0ZWQpCiAgICAgICAgICAgICAgICAgICAg
IGdvdG8gZW5kOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVzZUNhY2hlZE1lYXN1
cmVtZW50cykKKyAgICAgICAgICAgICAgICBhZGRUZXh0TWVhc3VyZSh0ZXh0RW50cnksIHRleHRN
ZWFzdXJlcyk7CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CiAKQEAgLTI3MzcsNiArMjgyNCwxMSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6
TGluZUJyZWFrZXI6CiAgICAgICAgIGxCcmVhay5jbGVhcigpOwogCiAgZW5kOgorICAgIGlmICh1
c2VDYWNoZWRNZWFzdXJlbWVudHMpIHsKKyAgICAgICAgaWYgKChjdXJyZW50Lm1fb2JqICYmIGN1
cnJlbnQubV9vYmotPmlzVGV4dCgpKSB8fCAobGFzdCAmJiBsYXN0LT5pc1RleHQoKSkpCisgICAg
ICAgICAgICBhZGRUZXh0TWVhc3VyZSh0ZXh0RW50cnksIHRleHRNZWFzdXJlcyk7CisgICAgfQor
CiAgICAgaWYgKGxCcmVhayA9PSByZXNvbHZlci5wb3NpdGlvbigpICYmICghbEJyZWFrLm1fb2Jq
IHx8ICFsQnJlYWsubV9vYmotPmlzQlIoKSkpIHsKICAgICAgICAgLy8gd2UganVzdCBhZGQgYXMg
bXVjaCBhcyBwb3NzaWJsZQogICAgICAgICBpZiAoYmxvY2tTdHlsZS0+d2hpdGVTcGFjZSgpID09
IFBSRSkgewo=
</data>
<flag name="review"
          id="179536"
          type_id="1"
          status="-"
          setter="mitz"
    />
    <flag name="commit-queue"
          id="179548"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>167493</attachid>
            <date>2012-10-07 19:30:19 -0700</date>
            <delta_ts>2012-10-09 11:18:21 -0700</delta_ts>
            <desc>Patch2</desc>
            <filename>text-layout-measure-once-new.txt</filename>
            <type>text/plain</type>
            <size>30478</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMDYxMykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDEyLTEwLTA3ICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgT25seSBtZWFzdXJlIHRleHQg
b25jZSBpbnN0ZWFkIG9mIHR3aWNlIHdoZW4gcGVyZm9ybWluZyBsaW5lIGxheW91dC4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk4MzE3CisgICAgICAg
IDxyZGFyOi8vcHJvYmxlbS8xMjA4MDgyMT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBTaW5jZSB3ZSBhcmUgbWVhc3VyaW5nIGVhY2ggd29yZCB0byBm
aW5kIG91dCB3aGVyZSB0aGUgbGluZSBicmVhayBzaG91bGQgb2NjdXIsCisgICAgICAgIHdlIHNo
b3VsZCBjYWNoZSB0aGF0IGluZm9ybWF0aW9uIHRvIGF2b2lkIG1lYXN1cmluZyB0aGUgcnVuIGFn
YWluIHdoZW4KKyAgICAgICAgY3JlYXRpbmcgdGhlIGxpbmUgYm94LiBUaGUgYnVsayBvZiB0aGUg
Y2hhbmdlIGlzIGluIG5leHRMaW5lQnJlYWssIHdoZXJlCisgICAgICAgIHRoZSBtZWFzdXJlbWVu
dHMgYXJlIGNvbGxlY3RlZCBhbmQgcGxhY2VkIGluIGEgdmVjdG9yIHNvIHRoYXQgdGhleSBjYW4K
KyAgICAgICAgYmUgY29uc3VtZWQgaW4gc2V0TG9naWNhbFdpZHRoRm9yVGV4dFJ1biB3aGVyZSB3
ZSB1c2VkIHRvIG1lYXN1cmUgdGhlCisgICAgICAgIHRleHQgb25lIG1vcmUgdGltZS4KKyAgICAg
ICAgRWFjaCBlbnRyeSBpbiB0aGUgdmVjdG9yIGlzIGEgTWVhc3VyZSBvYmplY3QgdGhhdCBjb250
YWlucyBpbmZvcm1hdGlvbgorICAgICAgICBhYm91dCB0aGUgc3RhcnQgYW5kIGVuZCBvZmZzZXQg
aW4gdGhlIHJ1biwgdGhlIHJlbmRlcmVyLCB0aGUgbWVhc3VyZWQgd2lkdGgKKyAgICAgICAgYW5k
LCBwb3NzaWJseSwgYSBsaXN0IG9mIGZhbGxiYWNrIGZvbnRzLgorICAgICAgICBXaGVuIHdlIG5l
ZWQgdG8gY29tcHV0ZSB0aGUgd2lkdGggb2YgdGhlIHJ1biB0byBjcmVhdGUgdGhlIGxpbmUgYm94
LCB3ZSBhZGQKKyAgICAgICAgYWxsIHRoZSBtZWFzdXJlbWVudHMgZm9yIHRoZSBnaXZlbiByZW5k
ZXJlciBpbiB0aGUgcnVuIHRvIGdldCB0aGUgdG90YWwgd2lkdGguCisKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9Gb250LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OndpZHRoKTog
QWRkZWQgZmFsbGJhY2sgZm9udHMgcGFyYW1ldGVyLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL0ZvbnQuaDoKKyAgICAgICAgKEZvbnQpOiBBZGRlZCBmYWxsYmFjayBmb250cyBwYXJhbWV0
ZXIgdG8gdGhlIHdpZHRoIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uCisgICAgICAgIFRoaXMgbWV0
aG9kIGlzIGNhbGxlZCB3aGVuIHdlIGNvbXB1dGUgdGhlIHdpZHRoIHVzaW5nIFRleHRMYXlvdXQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0TGF5b3V0Ojp3aWR0aCk6IEFkZGVkIGZhbGxiYWNr
IGZvbnRzIHBhcmFtZXRlci4KKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OndpZHRoKTogCisgICAg
ICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuaDoKKyAgICAgICAg
KENvbXBsZXhUZXh0Q29udHJvbGxlcik6IEFkZGVkIGZhbGxiYWNrIGZvbnRzIHBhcmFtZXRlciB0
byBhZHZhbmNlIG1ldGhvZC4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2suaDogQWRk
ZWQgTWVhc3VyZXMgcGFyYW1ldGVyIHRvIGZldyBtZXRob2RzLgorICAgICAgICAqIHJlbmRlcmlu
Zy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwOgorICAgICAgICAoTWVhc3VyZW1lbnQpOiBBZGRl
ZCBuZXcgY2xhc3MgdG8gaG9sZCBtZWFzdXJlbWVudCBpbmZvcm1hdGlvbi4KKyAgICAgICAgKFdl
YkNvcmU6OnNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4pOiBUaGlzIGlzIHdoZXJlIHdlIGNvbXB1
dGUgdGhlIHJ1biB3aWR0aCB1c2luZyB0aGUKKyAgICAgICAgY2FjaGVkIGluZm9ybWF0aW9uLgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3Np
dGlvbnNGb3JMaW5lKTogQWRkZWQgbWVhc3VyZXMgcGFyYW1ldGVyLgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyk6IEFkZGVkIG1lYXN1
cmVzIHBhcmFtZXRlci4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpsYXlvdXRSdW5z
QW5kRmxvYXRzSW5SYW5nZSk6IEFkZGVkIGRlY2xhcmF0aW9uIG9mIHRoZSBNZWFzdXJlcyB2ZWN0
b3IgYW5kIGl0cyB1c2UuCisgICAgICAgIChXZWJDb3JlOjp0ZXh0V2lkdGgpOiBBZGRlZCBmYWxs
YmFja0ZvbnRzIHBhcmFtZXRlciwgc2luY2Ugbm93IHdlIG9ubHkgbWVhc3VyZSBvbmNlLgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOjpuZXh0TGluZUJyZWFrKTog
VGhpcyBtZXRob2QgaGFzIGJlZW4gbW9kaWZpZWQgdG8gY29sbGVjdAorICAgICAgICB0aGUgbWVh
c3VyZW1lbnRzIG9mIHRoZSBpbmRpdmlkdWFsIHdvcmRzIGFuZCBhZGQgdGhlbSB0byB0aGUgdmVj
dG9yLgorCiAyMDEyLTEwLTA3ICBNYXJ0aW4gUm9iaW5zb24gIDxtcm9iaW5zb25AaWdhbGlhLmNv
bT4KIAogICAgICAgICBbU291cF0gQ2xlYW4gdXAgUmVzb3VyY2VFcnJvciBjcmVhdGlvbgpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAJKHJldmlzaW9uIDEz
MDQ0MykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMTgsNyArMjE4LDcgQEAgdm9pZCBGb250OjpkZWxldGVMYXlvdXQoVGV4
dExheW91dCopCiB7CiB9CiAKLWZsb2F0IEZvbnQ6OndpZHRoKFRleHRMYXlvdXQmLCB1bnNpZ25l
ZCwgdW5zaWduZWQpCitmbG9hdCBGb250Ojp3aWR0aChUZXh0TGF5b3V0JiwgdW5zaWduZWQsIHVu
c2lnbmVkLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qKQogewogICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwogICAgIHJldHVybiAwOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvRm9udC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0ZvbnQuaAkocmV2aXNpb24gMTMwNDQzKQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvRm9udC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDUsNyArMTA1LDcgQEAg
cHVibGljOgogCiAgICAgUGFzc093blB0cjxUZXh0TGF5b3V0PiBjcmVhdGVMYXlvdXQoUmVuZGVy
VGV4dCosIGZsb2F0IHhQb3MsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlKSBjb25zdDsKICAgICBz
dGF0aWMgdm9pZCBkZWxldGVMYXlvdXQoVGV4dExheW91dCopOwotICAgIHN0YXRpYyBmbG9hdCB3
aWR0aChUZXh0TGF5b3V0JiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuKTsKKyAgICBzdGF0
aWMgZmxvYXQgd2lkdGgoVGV4dExheW91dCYsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbiwg
SGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCk7CiAKICAg
ICBpbnQgb2Zmc2V0Rm9yUG9zaXRpb24oY29uc3QgVGV4dFJ1biYsIGZsb2F0IHBvc2l0aW9uLCBi
b29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdDsKICAgICBGbG9hdFJlY3Qgc2VsZWN0aW9u
UmVjdEZvclRleHQoY29uc3QgVGV4dFJ1biYsIGNvbnN0IEZsb2F0UG9pbnQmLCBpbnQgaCwgaW50
IGZyb20gPSAwLCBpbnQgdG8gPSAtMSkgY29uc3Q7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9s
bGVyLmNwcAkocmV2aXNpb24gMTMwNDQzKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0
LDEzICs1NCwxMyBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAotICAgIGZsb2F0IHdpZHRoKHVu
c2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbikKKyAgICBmbG9hdCB3aWR0aCh1bnNpZ25lZCBmcm9t
LCB1bnNpZ25lZCBsZW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tG
b250cykKICAgICB7Ci0gICAgICAgIG1fY29udHJvbGxlci0+YWR2YW5jZShmcm9tLCAwLCBCeVdo
b2xlR2x5cGhzKTsKKyAgICAgICAgbV9jb250cm9sbGVyLT5hZHZhbmNlKGZyb20sIDAsIEJ5V2hv
bGVHbHlwaHMsIGZhbGxiYWNrRm9udHMpOwogICAgICAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IG1f
Y29udHJvbGxlci0+cnVuV2lkdGhTb0ZhcigpOwogICAgICAgICBpZiAobV9mb250LndvcmRTcGFj
aW5nKCkgJiYgZnJvbSAmJiBGb250Ojp0cmVhdEFzU3BhY2UobV9ydW5bZnJvbV0pKQogICAgICAg
ICAgICAgYmVmb3JlV2lkdGggKz0gbV9mb250LndvcmRTcGFjaW5nKCk7Ci0gICAgICAgIG1fY29u
dHJvbGxlci0+YWR2YW5jZShmcm9tICsgbGVuLCAwLCBCeVdob2xlR2x5cGhzKTsKKyAgICAgICAg
bV9jb250cm9sbGVyLT5hZHZhbmNlKGZyb20gKyBsZW4sIDAsIEJ5V2hvbGVHbHlwaHMsIGZhbGxi
YWNrRm9udHMpOwogICAgICAgICBmbG9hdCBhZnRlcldpZHRoID0gbV9jb250cm9sbGVyLT5ydW5X
aWR0aFNvRmFyKCk7CiAgICAgICAgIHJldHVybiBhZnRlcldpZHRoIC0gYmVmb3JlV2lkdGg7CiAg
ICAgfQpAQCAtOTQsOSArOTQsOSBAQCB2b2lkIEZvbnQ6OmRlbGV0ZUxheW91dChUZXh0TGF5b3V0
KiBsYXlvCiAgICAgZGVsZXRlIGxheW91dDsKIH0KIAotZmxvYXQgRm9udDo6d2lkdGgoVGV4dExh
eW91dCYgbGF5b3V0LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4pCitmbG9hdCBGb250Ojp3
aWR0aChUZXh0TGF5b3V0JiBsYXlvdXQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbiwgSGFz
aFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzKQogewotICAgIHJldHVy
biBsYXlvdXQud2lkdGgoZnJvbSwgbGVuKTsKKyAgICByZXR1cm4gbGF5b3V0LndpZHRoKGZyb20s
IGxlbiwgZmFsbGJhY2tGb250cyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgQ0dGbG9hdCByb3VuZENH
RmxvYXQoQ0dGbG9hdCBmKQpAQCAtNDYwLDcgKzQ2MCw3IEBAIHVuc2lnbmVkIENvbXBsZXhUZXh0
Q29udHJvbGxlcjo6aW5jcmVtZW4KICAgICByZXR1cm4gaW5kZXhPZkN1cnJlbnRSdW4obGVmdG1v
c3RHbHlwaCk7CiB9CiAKLXZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2ln
bmVkIG9mZnNldCwgR2x5cGhCdWZmZXIqIGdseXBoQnVmZmVyLCBHbHlwaEl0ZXJhdGlvblN0eWxl
IGl0ZXJhdGlvblN0eWxlKQordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UodW5z
aWduZWQgb2Zmc2V0LCBHbHlwaEJ1ZmZlciogZ2x5cGhCdWZmZXIsIEdseXBoSXRlcmF0aW9uU3R5
bGUgaXRlcmF0aW9uU3R5bGUsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJh
Y2tGb250cykKIHsKICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihvZmZzZXQpID4gbV9lbmQpCiAg
ICAgICAgIG9mZnNldCA9IG1fZW5kOwpAQCAtNTM0LDYgKzUzNCw5IEBAIHZvaWQgQ29tcGxleFRl
eHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2kKICAgICAgICAgICAgICAgICBrLS07CiAgICAgICAg
ICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGZhbGxiYWNrRm9udHMgJiYgY29tcGxleFRl
eHRSdW4uZm9udERhdGEoKSAhPSBtX2ZvbnQucHJpbWFyeUZvbnQoKSkKKyAgICAgICAgICAgIGZh
bGxiYWNrRm9udHMtPmFkZChjb21wbGV4VGV4dFJ1bi5mb250RGF0YSgpKTsKKyAgICAgICAgICAg
IAogICAgICAgICBjdXJyZW50UnVuSW5kZXggPSBpbmNyZW1lbnRDdXJyZW50UnVuKGxlZnRtb3N0
R2x5cGgpOwogICAgICAgICBtX2dseXBoSW5DdXJyZW50UnVuID0gMDsKICAgICB9CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVy
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0Nv
bXBsZXhUZXh0Q29udHJvbGxlci5oCShyZXZpc2lvbiAxMzA0NDMpCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTU0LDcgKzU0LDcgQEAgcHVibGljOgogICAgIENvbXBsZXhUZXh0Q29udHJvbGxl
cihjb25zdCBGb250KiwgY29uc3QgVGV4dFJ1biYsIGJvb2wgbWF5VXNlTmF0dXJhbFdyaXRpbmdE
aXJlY3Rpb24gPSBmYWxzZSwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFj
a0ZvbnRzID0gMCwgYm9vbCBmb3JUZXh0RW1waGFzaXMgPSBmYWxzZSk7CiAKICAgICAvLyBBZHZh
bmNlIGFuZCBlbWl0IGdseXBocyB1cCB0byB0aGUgc3BlY2lmaWVkIGNoYXJhY3Rlci4KLSAgICB2
b2lkIGFkdmFuY2UodW5zaWduZWQgdG8sIEdseXBoQnVmZmVyKiA9IDAsIEdseXBoSXRlcmF0aW9u
U3R5bGUgPSBJbmNsdWRlUGFydGlhbEdseXBocyk7CisgICAgdm9pZCBhZHZhbmNlKHVuc2lnbmVk
IHRvLCBHbHlwaEJ1ZmZlciogPSAwLCBHbHlwaEl0ZXJhdGlvblN0eWxlID0gSW5jbHVkZVBhcnRp
YWxHbHlwaHMsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9
IDApOwogCiAgICAgLy8gQ29tcHV0ZSB0aGUgY2hhcmFjdGVyIG9mZnNldCBmb3IgYSBnaXZlbiB4
IGNvb3JkaW5hdGUuCiAgICAgaW50IG9mZnNldEZvclBvc2l0aW9uKGZsb2F0IHgsIGJvb2wgaW5j
bHVkZVBhcnRpYWxHbHlwaHMpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJs
b2NrLmgJKHJldmlzaW9uIDEzMDQ0MykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC01Myw2ICs1Myw3IEBAIHN0cnVjdCBQYWludElu
Zm87CiBjbGFzcyBMaW5lSW5mbzsKIGNsYXNzIFJlbmRlclJ1YnlSdW47CiBjbGFzcyBUZXh0TGF5
b3V0OworY2xhc3MgTWVhc3VyZW1lbnQ7CiAKIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvciwgY2xh
c3MgUnVuPiBjbGFzcyBCaWRpUmVzb2x2ZXI7CiB0ZW1wbGF0ZSA8Y2xhc3MgUnVuPiBjbGFzcyBC
aWRpUnVuTGlzdDsKQEAgLTYyLDYgKzYzLDcgQEAgdHlwZWRlZiBNaWRwb2ludFN0YXRlPElubGlu
ZUl0ZXJhdG9yPiBMaQogdHlwZWRlZiBXVEY6Okxpc3RIYXNoU2V0PFJlbmRlckJveCosIDE2PiBU
cmFja2VkUmVuZGVyZXJMaXN0SGFzaFNldDsKIHR5cGVkZWYgV1RGOjpIYXNoTWFwPGNvbnN0IFJl
bmRlckJsb2NrKiwgVHJhY2tlZFJlbmRlcmVyTGlzdEhhc2hTZXQqPiBUcmFja2VkRGVzY2VuZGFu
dHNNYXA7CiB0eXBlZGVmIFdURjo6SGFzaE1hcDxjb25zdCBSZW5kZXJCb3gqLCBIYXNoU2V0PFJl
bmRlckJsb2NrKj4qPiBUcmFja2VkQ29udGFpbmVyTWFwOwordHlwZWRlZiBWZWN0b3I8TWVhc3Vy
ZW1lbnQsIDY0PiBNZWFzdXJlbWVudHM7CiAKIGVudW0gQ2FyZXRUeXBlIHsgQ3Vyc29yQ2FyZXQs
IERyYWdDYXJldCB9OwogCkBAIC03MjksNyArNzMxLDcgQEAgcHJpdmF0ZToKICAgICAgICAgICAg
IHJlc2V0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBJbmxpbmVJdGVyYXRvciBuZXh0TGluZUJy
ZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZvJiwgUmVuZGVyVGV4dEluZm8mLCBGbG9h
dGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRp
dmVIeXBoZW5hdGVkTGluZXMpOworICAgICAgICBJbmxpbmVJdGVyYXRvciBuZXh0TGluZUJyZWFr
KElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZvJiwgUmVuZGVyVGV4dEluZm8mLCBGbG9hdGlu
Z09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMsIE1lYXN1cmVtZW50cyYpOwogCiAgICAgICAgIGJvb2wgbGluZVdhc0h5
cGhlbmF0ZWQoKSB7IHJldHVybiBtX2h5cGhlbmF0ZWQ7IH0KICAgICAgICAgY29uc3QgVmVjdG9y
PFJlbmRlckJveCo+JiBwb3NpdGlvbmVkT2JqZWN0cygpIHsgcmV0dXJuIG1fcG9zaXRpb25lZE9i
amVjdHM7IH0KQEAgLTc1Nyw3ICs3NTksNyBAQCBwcml2YXRlOgogCiAgICAgdm9pZCBzZXRNYXJn
aW5zRm9yUnVieVJ1bihCaWRpUnVuKiwgUmVuZGVyUnVieVJ1biosIFJlbmRlck9iamVjdCosIGNv
bnN0IExpbmVJbmZvJik7CiAKLSAgICB2b2lkIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlv
bnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYsIEJpZGlSdW4qIGZpcnN0
UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQsIEdseXBoT3Zl
cmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJik7CisgICAg
dm9pZCBjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94
KiwgY29uc3QgTGluZUluZm8mLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdT
cGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01h
cCYsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYsIE1lYXN1cmVtZW50cyYpOwogICAgIHZvaWQgY29t
cHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgQmlkaVJ1
biosIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiwgVmVydGljYWxQb3NpdGlvbkNh
Y2hlJik7CiAgICAgdm9pZCBkZWxldGVFbGxpcHNpc0xpbmVCb3hlcygpOwogICAgIHZvaWQgY2hl
Y2tMaW5lc0ZvclRleHRPdmVyZmxvdygpOwpAQCAtOTYzLDcgKzk2NSw3IEBAIHByaXZhdGU6CiAg
ICAgLy8gRW5kIGhlbHBlciBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgdXNlZCBieSBsYXlvdXRCbG9j
a0NoaWxkcmVuLgogCiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBsYXlvdXRJbmxpbmVDaGls
ZHJlbigpCi0gICAgUm9vdElubGluZUJveCogY3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKEJp
ZGlSdW5MaXN0PEJpZGlSdW4+JiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgTGluZUluZm8m
LCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuKTsKKyAg
ICBSb290SW5saW5lQm94KiBjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnMoQmlkaVJ1bkxpc3Q8
QmlkaVJ1bj4mLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBMaW5lSW5mbyYsIFZlcnRpY2Fs
UG9zaXRpb25DYWNoZSYsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIE1lYXN1cmVtZW50cyYp
OwogICAgIHZvaWQgbGF5b3V0UnVuc0FuZEZsb2F0cyhMaW5lTGF5b3V0U3RhdGUmLCBib29sIGhh
c0lubGluZUNoaWxkKTsKICAgICB2b2lkIGxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVM
YXlvdXRTdGF0ZSYsIElubGluZUJpZGlSZXNvbHZlciYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBj
bGVhbkxpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cywgdW5z
aWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpOwogICAgIHZvaWQgbGlua1RvRW5kTGlu
ZUlmTmVlZGVkKExpbmVMYXlvdXRTdGF0ZSYpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9uIDEzMDQ0MykK
KysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC02ODIsMjIgKzY4Miw0MCBAQCBzdGF0aWMgaW5saW5lIGZsb2F0IG1l
YXN1cmVIeXBoZW5XaWR0aChSCiAgICAgcmV0dXJuIGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6OmNv
bnN0cnVjdFRleHRSdW4ocmVuZGVyZXIsIGZvbnQsIHN0eWxlLT5oeXBoZW5TdHJpbmcoKS5zdHJp
bmcoKSwgc3R5bGUpKTsKIH0KIAorY2xhc3MgTWVhc3VyZW1lbnQgeworcHVibGljOgorICAgIE1l
YXN1cmVtZW50KCkKKyAgICAgICAgOiByZW5kZXJlcigwKQorICAgICAgICAsIHdpZHRoKDApCisg
ICAgICAgICwgc3RhcnRPZmZzZXQoMCkKKyAgICAgICAgLCBlbmRPZmZzZXQoMCkKKyAgICB7Cisg
ICAgfQorICAgIAorICAgIFJlbmRlclRleHQqIHJlbmRlcmVyOworICAgIGZsb2F0IHdpZHRoOwor
ICAgIGludCBzdGFydE9mZnNldDsKKyAgICBpbnQgZW5kT2Zmc2V0OworICAgIEhhc2hTZXQ8Y29u
c3QgU2ltcGxlRm9udERhdGEqPiBmYWxsYmFja0ZvbnRzOworfTsKKwogc3RhdGljIGlubGluZSB2
b2lkIHNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4oUm9vdElubGluZUJveCogbGluZUJveCwgQmlk
aVJ1biogcnVuLCBSZW5kZXJUZXh0KiByZW5kZXJlciwgZmxvYXQgeFBvcywgY29uc3QgTGluZUlu
Zm8mIGxpbmVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaE92
ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRp
b25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRl
eHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNo
ZSwgTWVhc3VyZW1lbnRzJiBtZWFzdXJlbWVudHMpCiB7CiAgICAgSGFzaFNldDxjb25zdCBTaW1w
bGVGb250RGF0YSo+IGZhbGxiYWNrRm9udHM7CiAgICAgR2x5cGhPdmVyZmxvdyBnbHlwaE92ZXJm
bG93OwogICAgIAorICAgIGNvbnN0IEZvbnQmIGZvbnQgPSByZW5kZXJlci0+c3R5bGUobGluZUlu
Zm8uaXNGaXJzdExpbmUoKSktPmZvbnQoKTsKICAgICAvLyBBbHdheXMgY29tcHV0ZSBnbHlwaCBv
dmVyZmxvdyBpZiB0aGUgYmxvY2sncyBsaW5lLWJveC1jb250YWluIHZhbHVlIGlzICJnbHlwaHMi
LgogICAgIGlmIChsaW5lQm94LT5maXRzVG9HbHlwaHMoKSkgewogICAgICAgICAvLyBJZiB3ZSBk
b24ndCBzdGljayBvdXQgb2YgdGhlIHJvb3QgbGluZSdzIGZvbnQgYm94LCB0aGVuIGRvbid0IGJv
dGhlciBjb21wdXRpbmcgb3VyIGdseXBoIG92ZXJmbG93LiBUaGlzIG9wdGltaXphdGlvbgogICAg
ICAgICAvLyB3aWxsIGtlZXAgdXMgZnJvbSBjb21wdXRpbmcgZ2x5cGggYm91bmRzIGluIG5lYXJs
eSBhbGwgY2FzZXMuCiAgICAgICAgIGJvb2wgaW5jbHVkZVJvb3RMaW5lID0gbGluZUJveC0+aW5j
bHVkZXNSb290TGluZUJveEZvbnRPckxlYWRpbmcoKTsKICAgICAgICAgaW50IGJhc2VsaW5lU2hp
ZnQgPSBsaW5lQm94LT52ZXJ0aWNhbFBvc2l0aW9uRm9yQm94KHJ1bi0+bV9ib3gsIHZlcnRpY2Fs
UG9zaXRpb25DYWNoZSk7Ci0gICAgICAgIGludCByb290RGVzY2VudCA9IGluY2x1ZGVSb290TGlu
ZSA/IGxpbmVCb3gtPnJlbmRlcmVyKCktPnN0eWxlKGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkpLT5m
b250KCkuZm9udE1ldHJpY3MoKS5kZXNjZW50KCkgOiAwOwotICAgICAgICBpbnQgcm9vdEFzY2Vu
dCA9IGluY2x1ZGVSb290TGluZSA/IGxpbmVCb3gtPnJlbmRlcmVyKCktPnN0eWxlKGxpbmVJbmZv
LmlzRmlyc3RMaW5lKCkpLT5mb250KCkuZm9udE1ldHJpY3MoKS5hc2NlbnQoKSA6IDA7Ci0gICAg
ICAgIGludCBib3hBc2NlbnQgPSByZW5kZXJlci0+c3R5bGUobGluZUluZm8uaXNGaXJzdExpbmUo
KSktPmZvbnQoKS5mb250TWV0cmljcygpLmFzY2VudCgpIC0gYmFzZWxpbmVTaGlmdDsKLSAgICAg
ICAgaW50IGJveERlc2NlbnQgPSByZW5kZXJlci0+c3R5bGUobGluZUluZm8uaXNGaXJzdExpbmUo
KSktPmZvbnQoKS5mb250TWV0cmljcygpLmRlc2NlbnQoKSArIGJhc2VsaW5lU2hpZnQ7CisgICAg
ICAgIGludCByb290RGVzY2VudCA9IGluY2x1ZGVSb290TGluZSA/IGZvbnQuZm9udE1ldHJpY3Mo
KS5kZXNjZW50KCkgOiAwOworICAgICAgICBpbnQgcm9vdEFzY2VudCA9IGluY2x1ZGVSb290TGlu
ZSA/IGZvbnQuZm9udE1ldHJpY3MoKS5hc2NlbnQoKSA6IDA7CisgICAgICAgIGludCBib3hBc2Nl
bnQgPSBmb250LmZvbnRNZXRyaWNzKCkuYXNjZW50KCkgLSBiYXNlbGluZVNoaWZ0OworICAgICAg
ICBpbnQgYm94RGVzY2VudCA9IGZvbnQuZm9udE1ldHJpY3MoKS5kZXNjZW50KCkgKyBiYXNlbGlu
ZVNoaWZ0OwogICAgICAgICBpZiAoYm94QXNjZW50ID4gcm9vdERlc2NlbnQgfHwgIGJveERlc2Nl
bnQgPiByb290QXNjZW50KQogICAgICAgICAgICAgZ2x5cGhPdmVyZmxvdy5jb21wdXRlQm91bmRz
ID0gdHJ1ZTsgCiAgICAgfQpAQCAtNzA3LDcgKzcyNSw0NSBAQCBzdGF0aWMgaW5saW5lIHZvaWQg
c2V0TG9naWNhbFdpZHRoRm9yVGV4CiAgICAgICAgIGNvbnN0IEZvbnQmIGZvbnQgPSByZW5kZXJl
ci0+c3R5bGUobGluZUluZm8uaXNGaXJzdExpbmUoKSktPmZvbnQoKTsKICAgICAgICAgaHlwaGVu
V2lkdGggPSBtZWFzdXJlSHlwaGVuV2lkdGgocmVuZGVyZXIsIGZvbnQpOwogICAgIH0KLSAgICBy
dW4tPm1fYm94LT5zZXRMb2dpY2FsV2lkdGgocmVuZGVyZXItPndpZHRoKHJ1bi0+bV9zdGFydCwg
cnVuLT5tX3N0b3AgLSBydW4tPm1fc3RhcnQsIHhQb3MsIGxpbmVJbmZvLmlzRmlyc3RMaW5lKCks
ICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdykgKyBoeXBoZW5XaWR0aCk7CisgICAgZmxv
YXQgbWVhc3VyZWRXaWR0aCA9IDA7CisgICAgYm9vbCBrZXJuaW5nSXNFbmFibGVkID0gZm9udC50
eXBlc2V0dGluZ0ZlYXR1cmVzKCkgJiBLZXJuaW5nOworICAgIAorICAgIC8vIFNpbmNlIHdlIGRv
bid0IGNhY2hlIGdseXBoIG92ZXJmbG93cywgd2UgbmVlZCB0byByZS1tZWFzdXJlIHRoZSBydW4g
aWYKKyAgICAvLyB0aGUgc3R5bGUgaXMgbGluZWJveC1jb250YWluOiBnbHlwaC4KKyAgICAKKyAg
ICBpZiAoIWxpbmVCb3gtPmZpdHNUb0dseXBocygpICYmIHJlbmRlcmVyLT5jYW5Vc2VTaW1wbGVG
b250Q29kZVBhdGgoKSkgeworICAgICAgICBpbnQgbGFzdEVuZE9mZnNldCA9IHJ1bi0+bV9zdGFy
dDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDAsIHNpemUgPSBtZWFzdXJlbWVudHMuc2l6ZSgp
OyBpIDwgc2l6ZSAmJiBsYXN0RW5kT2Zmc2V0IDwgcnVuLT5tX3N0b3A7ICsraSkgeworICAgICAg
ICAgICAgY29uc3QgTWVhc3VyZW1lbnQmIG1lYXN1cmVtZW50ID0gbWVhc3VyZW1lbnRzW2ldOwor
ICAgICAgICAgICAgaWYgKG1lYXN1cmVtZW50LndpZHRoIDw9MCB8fCBtZWFzdXJlbWVudC5zdGFy
dE9mZnNldCA9PSBtZWFzdXJlbWVudC5lbmRPZmZzZXQpCisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICBpZiAobWVhc3VyZW1lbnQucmVuZGVyZXIgIT0gcmVuZGVyZXIgfHwg
bWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgIT0gbGFzdEVuZE9mZnNldCB8fCBtZWFzdXJlbWVudC5l
bmRPZmZzZXQgPiBydW4tPm1fc3RvcCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICAgICAgbGFzdEVuZE9mZnNldCA9IG1lYXN1cmVtZW50LmVuZE9mZnNldDsKKyAgICAgICAg
ICAgIGlmIChrZXJuaW5nSXNFbmFibGVkICYmIGxhc3RFbmRPZmZzZXQgPT0gcnVuLT5tX3N0b3Ap
IHsKKyAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLT53aWR0aChtZWFz
dXJlbWVudC5zdGFydE9mZnNldCwgbGFzdEVuZE9mZnNldCAtIG1lYXN1cmVtZW50LnN0YXJ0T2Zm
c2V0LCB4UG9zLCBsaW5lSW5mby5pc0ZpcnN0TGluZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAo
aSA+IDApCisgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggKz0gcmVuZGVyZXItPnN0
eWxlKCktPndvcmRTcGFjaW5nKCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAg
ICBtZWFzdXJlZFdpZHRoICs9IG1lYXN1cmVtZW50LndpZHRoOworICAgICAgICAgICAgaWYgKCFt
ZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEhh
c2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbWVhc3Vy
ZW1lbnQuZmFsbGJhY2tGb250cy5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEhhc2hTZXQ8
Y29uc3QgU2ltcGxlRm9udERhdGEqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZWFzdXJlbWVudC5m
YWxsYmFja0ZvbnRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgICAgICAg
ICAgZmFsbGJhY2tGb250cy5hZGQoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgICBpZiAobWVhc3VyZWRXaWR0aCAmJiBsYXN0RW5kT2Zmc2V0ICE9IHJ1bi0+bV9zdG9wKSB7
CisgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBjYWNoZWQgZGF0YSwgd2Un
bGwgbWVhc3VyZSB0aGUgcnVuIGFnYWluLgorICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IDA7
CisgICAgICAgICAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoIW1lYXN1cmVkV2lkdGgpCisgICAgICAgIG1lYXN1cmVkV2lkdGggPSByZW5kZXJl
ci0+d2lkdGgocnVuLT5tX3N0YXJ0LCBydW4tPm1fc3RvcCAtIHJ1bi0+bV9zdGFydCwgeFBvcywg
bGluZUluZm8uaXNGaXJzdExpbmUoKSwgJmZhbGxiYWNrRm9udHMsICZnbHlwaE92ZXJmbG93KTsK
KworICAgIHJ1bi0+bV9ib3gtPnNldExvZ2ljYWxXaWR0aChtZWFzdXJlZFdpZHRoICsgaHlwaGVu
V2lkdGgpOwogICAgIGlmICghZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpIHsKICAgICAgICAgQVNT
RVJUKHJ1bi0+bV9ib3gtPmlzVGV4dCgpKTsKICAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxi
YWNrRm9udHNNYXA6Oml0ZXJhdG9yIGl0ID0gdGV4dEJveERhdGFNYXAuYWRkKHRvSW5saW5lVGV4
dEJveChydW4tPm1fYm94KSwgbWFrZV9wYWlyKFZlY3Rvcjxjb25zdCBTaW1wbGVGb250RGF0YSo+
KCksIEdseXBoT3ZlcmZsb3coKSkpLml0ZXJhdG9yOwpAQCAtNzk3LDcgKzg1Myw3IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OnVwZGF0ZUxvZ2ljYWxXaWR0aEZvckEKIH0KIAogdm9pZCBSZW5kZXJCbG9j
azo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCog
bGluZUJveCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlk
aVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2x5cGhPdmVyZmxvd0Fu
ZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUm
IHZlcnRpY2FsUG9zaXRpb25DYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFw
JiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9u
Q2FjaGUsIE1lYXN1cmVtZW50cyYgbWVhc3VyZW1lbnRzKQogewogICAgIEVUZXh0QWxpZ24gdGV4
dEFsaWduID0gdGV4dEFsaWdubWVudEZvckxpbmUoIXJlYWNoZWRFbmQgJiYgIWxpbmVCb3gtPmVu
ZHNXaXRoQnJlYWsoKSk7CiAgICAgCkBAIC04NDQsNyArOTAwLDcgQEAgdm9pZCBSZW5kZXJCbG9j
azo6Y29tcHV0ZUlubGluZURpcmVjdGlvbgogICAgICAgICAgICAgICAgIG5lZWRzV29yZFNwYWNp
bmcgPSAhaXNTcGFjZU9yTmV3bGluZShydC0+Y2hhcmFjdGVycygpW3ItPm1fc3RvcCAtIDFdKSAm
JiByLT5tX3N0b3AgPT0gbGVuZ3RoOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzZXRM
b2dpY2FsV2lkdGhGb3JUZXh0UnVuKGxpbmVCb3gsIHIsIHJ0LCB0b3RhbExvZ2ljYWxXaWR0aCwg
bGluZUluZm8sIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpOworICAgICAg
ICAgICAgc2V0TG9naWNhbFdpZHRoRm9yVGV4dFJ1bihsaW5lQm94LCByLCBydCwgdG90YWxMb2dp
Y2FsV2lkdGgsIGxpbmVJbmZvLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hl
LCBtZWFzdXJlbWVudHMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaXNBZnRlckV4
cGFuc2lvbiA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKCFyLT5tX29iamVjdC0+aXNSZW5kZXJJ
bmxpbmUoKSkgewpAQCAtMTA3MSw3ICsxMTI3LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGNvbnN0
cnVjdEJpZGlSdW5zKElubAogfQogCiAvLyBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgbGluZSBi
b3hlcyBmb3IgYWxsIG9mIHRoZSB0ZXh0IHJ1bnMgaW4gdGhlIHJlc29sdmVyIGFuZCBjb21wdXRl
cyB0aGVpciBwb3NpdGlvbi4KLVJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVMaW5l
Qm94ZXNGcm9tQmlkaVJ1bnMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBJ
bmxpbmVJdGVyYXRvciYgZW5kLCBMaW5lSW5mbyYgbGluZUluZm8sIFZlcnRpY2FsUG9zaXRpb25D
YWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuKQor
Um9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyhC
aWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQs
IExpbmVJbmZvJiBsaW5lSW5mbywgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0
aW9uQ2FjaGUsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIE1lYXN1cmVtZW50cyYgbWVhc3Vy
ZW1lbnRzKQogewogICAgIGlmICghYmlkaVJ1bnMucnVuQ291bnQoKSkKICAgICAgICAgcmV0dXJu
IDA7CkBAIC0xMDk1LDcgKzExNTEsNyBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6Y3Jl
YXRlTGluZUJvCiAgICAgCiAgICAgLy8gTm93IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4dCBy
dW5zIGhvcml6b250YWxseS4KICAgICBpZiAoIWlzU1ZHUm9vdElubGluZUJveCkKLSAgICAgICAg
Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUobGluZUJveCwgbGluZUluZm8s
IGJpZGlSdW5zLmZpcnN0UnVuKCksIHRyYWlsaW5nU3BhY2VSdW4sIGVuZC5hdEVuZCgpLCB0ZXh0
Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hlKTsKKyAgICAgICAgY29tcHV0ZUlubGlu
ZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUobGluZUJveCwgbGluZUluZm8sIGJpZGlSdW5zLmZp
cnN0UnVuKCksIHRyYWlsaW5nU3BhY2VSdW4sIGVuZC5hdEVuZCgpLCB0ZXh0Qm94RGF0YU1hcCwg
dmVydGljYWxQb3NpdGlvbkNhY2hlLCBtZWFzdXJlbWVudHMpOwogICAgIAogICAgIC8vIE5vdyBw
b3NpdGlvbiBvdXIgdGV4dCBydW5zIHZlcnRpY2FsbHkuCiAgICAgY29tcHV0ZUJsb2NrRGlyZWN0
aW9uUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBiaWRpUnVucy5maXJzdFJ1bigpLCB0ZXh0Qm94
RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hlKTsKQEAgLTEzNDEsNyArMTM5Nyw4IEBAIHZv
aWQgUmVuZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblIKICAgICAgICAgICAgIGV4Y2x1
c2lvblNoYXBlSW5zaWRlSW5mby0+Y29tcHV0ZVNlZ21lbnRzRm9yTGluZShsaW5lVG9wLCBsaW5l
Qm90dG9tKTsKICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgIGVuZCA9IGxpbmVCcmVha2VyLm5l
eHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZvKCksIHJlbmRlclRleHRJ
bmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5l
cyk7CisgICAgICAgIE1lYXN1cmVtZW50cyBtZWFzdXJlbWVudHM7CisgICAgICAgIGVuZCA9IGxp
bmVCcmVha2VyLm5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZvKCks
IHJlbmRlclRleHRJbmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5
cGhlbmF0ZWRMaW5lcywgbWVhc3VyZW1lbnRzKTsKICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0
aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBiZSBj
cmVhdGluZyBhbnkgcnVucyBpbiBuZXh0TGluZUJyZWFrIHRvIGJlZ2luIHdpdGghCiAgICAgICAg
ICAgICAvLyBPbmNlIEJpZGlSdW5MaXN0IGlzIHNlcGFyYXRlZCBmcm9tIEJpZGlSZXNvbHZlciB0
aGlzIHdpbGwgbm90IGJlIG5lZWRlZC4KQEAgLTEzODMsNyArMTQ0MCw3IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblIKICAgICAgICAgICAgIC8vIGlubGluZSBmbG93
IGJveGVzLgogCiAgICAgICAgICAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQgPSBsb2dp
Y2FsSGVpZ2h0KCk7Ci0gICAgICAgICAgICBSb290SW5saW5lQm94KiBsaW5lQm94ID0gY3JlYXRl
TGluZUJveGVzRnJvbUJpZGlSdW5zKGJpZGlSdW5zLCBlbmQsIGxheW91dFN0YXRlLmxpbmVJbmZv
KCksIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgdHJhaWxpbmdTcGFjZVJ1bik7CisgICAgICAgICAg
ICBSb290SW5saW5lQm94KiBsaW5lQm94ID0gY3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKGJp
ZGlSdW5zLCBlbmQsIGxheW91dFN0YXRlLmxpbmVJbmZvKCksIHZlcnRpY2FsUG9zaXRpb25DYWNo
ZSwgdHJhaWxpbmdTcGFjZVJ1biwgbWVhc3VyZW1lbnRzKTsKIAogICAgICAgICAgICAgYmlkaVJ1
bnMuZGVsZXRlUnVucygpOwogICAgICAgICAgICAgcmVzb2x2ZXIubWFya0N1cnJlbnRSdW5FbXB0
eSgpOyAvLyBGSVhNRTogVGhpcyBjYW4gcHJvYmFibHkgYmUgcmVwbGFjZWQgYnkgYW4gQVNTRVJU
IChvciBqdXN0IHJlbW92ZWQpLgpAQCAtMjA0MSwxMyArMjA5OCwxNCBAQCBzdGF0aWMgYm9vbCBz
aG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0
aWMgaW5saW5lIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0LCB1bnNpZ25lZCBmcm9t
LCB1bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQb3MsIGJvb2wgaXNGaXhl
ZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgVGV4dExheW91dCogbGF5b3V0ID0gMCkK
K3N0YXRpYyBBTFdBWVNfSU5MSU5FIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0LCB1
bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQb3Ms
IGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgSGFzaFNldDxjb25z
dCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCwgVGV4dExheW91dCogbGF5b3V0
ID0gMCkKIHsKKyAgICBHbHlwaE92ZXJmbG93IGdseXBoT3ZlcmZsb3c7CiAgICAgaWYgKGlzRml4
ZWRQaXRjaCB8fCAoIWZyb20gJiYgbGVuID09IHRleHQtPnRleHRMZW5ndGgoKSkgfHwgdGV4dC0+
c3R5bGUoKS0+aGFzVGV4dENvbWJpbmUoKSkKLSAgICAgICAgcmV0dXJuIHRleHQtPndpZHRoKGZy
b20sIGxlbiwgZm9udCwgeFBvcyk7CisgICAgICAgIHJldHVybiB0ZXh0LT53aWR0aChmcm9tLCBs
ZW4sIGZvbnQsIHhQb3MsIGZhbGxiYWNrRm9udHMsICZnbHlwaE92ZXJmbG93KTsKIAogICAgIGlm
IChsYXlvdXQpCi0gICAgICAgIHJldHVybiBGb250Ojp3aWR0aCgqbGF5b3V0LCBmcm9tLCBsZW4p
OworICAgICAgICByZXR1cm4gRm9udDo6d2lkdGgoKmxheW91dCwgZnJvbSwgbGVuLCBmYWxsYmFj
a0ZvbnRzKTsKIAogICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRS
dW4odGV4dCwgZm9udCwgdGV4dC0+Y2hhcmFjdGVycygpICsgZnJvbSwgbGVuLCB0ZXh0LT5zdHls
ZSgpKTsKICAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkgLSBm
cm9tKTsKQEAgLTIwNTYsNyArMjExNCw3IEBAIHN0YXRpYyBpbmxpbmUgZmxvYXQgdGV4dFdpZHRo
KFJlbmRlclRleHQKICAgICBydW4uc2V0Q2hhcmFjdGVyU2NhbkZvckNvZGVQYXRoKCF0ZXh0LT5j
YW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKSk7CiAgICAgcnVuLnNldFRhYlNpemUoIWNvbGxhcHNl
V2hpdGVTcGFjZSwgdGV4dC0+c3R5bGUoKS0+dGFiU2l6ZSgpKTsKICAgICBydW4uc2V0WFBvcyh4
UG9zKTsKLSAgICByZXR1cm4gZm9udC53aWR0aChydW4pOworICAgIHJldHVybiBmb250LndpZHRo
KHJ1biwgZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOwogfQogCiBzdGF0aWMgdm9pZCB0
cnlIeXBoZW5hdGluZyhSZW5kZXJUZXh0KiB0ZXh0LCBjb25zdCBGb250JiBmb250LCBjb25zdCBB
dG9taWNTdHJpbmcmIGxvY2FsZUlkZW50aWZpZXIsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVu
YXRlZExpbmVzLCBpbnQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCwgaW50IG1pbmlt
dW1QcmVmaXhMZW5ndGgsIGludCBtaW5pbXVtU3VmZml4TGVuZ3RoLCBpbnQgbGFzdFNwYWNlLCBp
bnQgcG9zLCBmbG9hdCB4UG9zLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGJvb2wgaXNGaXhlZFBpdGNo
LCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgaW50IGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBJbmxp
bmVJdGVyYXRvciYgbGluZUJyZWFrLCBpbnQgbmV4dEJyZWFrYWJsZSwgYm9vbCYgaHlwaGVuYXRl
ZCkKQEAgLTIyMTAsNyArMjI2OCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOjpy
ZXNldCgpCiAgICAgbV9jbGVhciA9IENOT05FOwogfQogCi1JbmxpbmVJdGVyYXRvciBSZW5kZXJC
bG9jazo6TGluZUJyZWFrZXI6Om5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiByZXNv
bHZlciwgTGluZUluZm8mIGxpbmVJbmZvLCBSZW5kZXJUZXh0SW5mbyYgcmVuZGVyVGV4dEluZm8s
IEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKK0lubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5l
QnJlYWtlcjo6bmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBMaW5l
SW5mbyYgbGluZUluZm8sIFJlbmRlclRleHRJbmZvJiByZW5kZXJUZXh0SW5mbywgRmxvYXRpbmdP
YmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlw
aGVuYXRlZExpbmVzLCBNZWFzdXJlbWVudHMmIG1lYXN1cmVtZW50cykKIHsKICAgICByZXNldCgp
OwogCkBAIC0yNDI4LDYgKzI0ODYsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGlu
ZUJyZWFrZXI6CiAgICAgICAgICAgICBpbnQgbGFzdFNwYWNlID0gY3VycmVudC5tX3BvczsKICAg
ICAgICAgICAgIGZsb2F0IHdvcmRTcGFjaW5nID0gY3VycmVudFN0eWxlLT53b3JkU3BhY2luZygp
OwogICAgICAgICAgICAgZmxvYXQgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSAwOworICAgICAgICAg
ICAgZmxvYXQgd29yZFNwYWNpbmdGb3JUZXh0TWVhc3VyZSA9IDA7CiAKICAgICAgICAgICAgIGZs
b2F0IHdyYXBXID0gd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpICsgaW5saW5lTG9naWNhbFdpZHRo
KGN1cnJlbnQubV9vYmosICFhcHBsaWVkU3RhcnRXaWR0aCwgdHJ1ZSk7CiAgICAgICAgICAgICBm
bG9hdCBjaGFyV2lkdGggPSAwOwpAQCAtMjQ4Myw3ICsyNTQyLDcgQEAgSW5saW5lSXRlcmF0b3Ig
UmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogICAgICAgICAgICAgICAgIGlmICgoYnJlYWtBbGwg
fHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRCcmVhaykgewogICAgICAgICAgICAgICAgICAgICB3
cmFwVyArPSBjaGFyV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFr
SXNCZWZvcmVTdXJyb2dhdGVQYWlyID0gVTE2X0lTX0xFQUQoYykgJiYgY3VycmVudC5tX3BvcyAr
IDEgPCB0LT50ZXh0TGVuZ3RoKCkgJiYgVTE2X0lTX1RSQUlMKHQtPmNoYXJhY3RlcnMoKVtjdXJy
ZW50Lm1fcG9zICsgMV0pOwotICAgICAgICAgICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lk
dGgodCwgY3VycmVudC5tX3BvcywgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID8g
MiA6IDEsIGYsIHdpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBj
b2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBjaGFy
V2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgbWlkV29yZEJyZWFrSXNCZWZvcmVT
dXJyb2dhdGVQYWlyID8gMiA6IDEsIGYsIHdpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVywg
aXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIDAsIHRleHRMYXlvdXQpOwogICAgICAg
ICAgICAgICAgICAgICBtaWRXb3JkQnJlYWsgPSB3aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3Jh
cFcgKyBjaGFyV2lkdGggPiB3aWR0aC5hdmFpbGFibGVXaWR0aCgpOwogICAgICAgICAgICAgICAg
IH0KIApAQCAtMjQ5OCw2ICsyNTU3LDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6Okxp
bmVCcmVha2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBwb2ludC4KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmluZ1NwYWNlcyA9IGZhbHNlOwogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gMDsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvclRleHRNZWFzdXJlID0gMDsKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBsYXN0U3BhY2UgPSBjdXJyZW50Lm1fcG9zOyAvLyBlLmcu
LCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQgc3BhY2VzLgog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRl
LCBJbmxpbmVJdGVyYXRvcigwLCBjdXJyZW50Lm1fb2JqLCBjdXJyZW50Lm1fcG9zKSk7CiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKQEAg
LTI1MDcsMTggKzI1NjcsMjggQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVh
a2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAK
KyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnRzLmFwcGVuZChNZWFzdXJlbWVudCgpKTsK
KyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZW1lbnQmIG1lYXN1cmVtZW50ID0gbWVhc3VyZW1l
bnRzLmxhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG1l
YXN1cmVtZW50LnJlbmRlcmVyID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQu
ZW5kT2Zmc2V0ID0gY3VycmVudC5tX3BvczsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1l
bnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7CisgICAgICAgICAgICAgICAgICAgIAogICAgICAg
ICAgICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVG1wVzsKICAgICAgICAgICAgICAgICAgICAg
aWYgKHdvcmRUcmFpbGluZ1NwYWNlV2lkdGggJiYgY3VycmVudENoYXJhY3RlcklzU3BhY2UpCi0g
ICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0aCh0LCBsYXN0
U3BhY2UsIGN1cnJlbnQubV9wb3MgKyAxIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50V2lk
dGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpIC0gd29y
ZFRyYWlsaW5nU3BhY2VXaWR0aCArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgICAgICAgICAg
ICAgICAgICAgICAgYWRkaXRpb25hbFRtcFcgPSB0ZXh0V2lkdGgodCwgbGFzdFNwYWNlLCBjdXJy
ZW50Lm1fcG9zICsgMSAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4
ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCAmbWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywg
dGV4dExheW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOwogICAgICAgICAgICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0
aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJl
bnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgdGV4dExheW91dCkg
KyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9u
YWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxhc3RTcGFj
ZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNw
YWNlLCAmbWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7CisKKyAgICAgICAg
ICAgICAgICAgICAgbWVhc3VyZW1lbnQud2lkdGggPSBhZGRpdGlvbmFsVG1wVyArIHdvcmRTcGFj
aW5nRm9yVGV4dE1lYXN1cmU7CisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUbXBXICs9
IGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAgICAgICAgICAgICAgICAgICB3aWR0aC5hZGRVbmNv
bW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUbXBXKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFh
cHBsaWVkU3RhcnRXaWR0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGguYWRkVW5j
b21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgoY3VycmVudC5tX29iaiwgdHJ1ZSwgZmFs
c2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWRTdGFydFdpZHRoID0gdHJ1ZTsK
ICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGFwcGx5V29yZFNw
YWNpbmcgPSAgd29yZFNwYWNpbmcgJiYgY3VycmVudENoYXJhY3RlcklzU3BhY2U7CisgICAgICAg
ICAgICAgICAgICAgIGFwcGx5V29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZyAmJiBjdXJyZW50Q2hh
cmFjdGVySXNTcGFjZTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIXdpZHRoLmNvbW1pdHRl
ZFdpZHRoKCkgJiYgYXV0b1dyYXAgJiYgIXdpZHRoLmZpdHNPbkxpbmUoKSkKICAgICAgICAgICAg
ICAgICAgICAgICAgIHdpZHRoLmZpdEJlbG93RmxvYXRzKCk7CkBAIC0yNTI4LDcgKzI1OTgsNyBA
QCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBhcyBjYW5kaWRhdGUgd2lkdGggZm9yIHRoaXMgbGluZS4KICAgICAgICAg
ICAgICAgICAgICAgICAgIGJvb2wgbGluZVdhc1Rvb1dpZGUgPSBmYWxzZTsKICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICh3aWR0aC5maXRzT25MaW5lKCkgJiYgY3VycmVudENoYXJhY3Rlcklz
V1MgJiYgY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKSAmJiAhbWlkV29y
ZEJyZWFrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2hhcldpZHRoID0g
dGV4dFdpZHRoKHQsIGN1cnJlbnQubV9wb3MsIDEsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBp
c0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgdGV4dExheW91dCkgKyAoYXBwbHlXb3Jk
U3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJlbnQubV9wb3MsIDEsIGYsIHdpZHRo
LmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgJm1lYXN1
cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpICsgKGFwcGx5V29yZFNwYWNpbmcgPyB3
b3JkU3BhY2luZyA6IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlm
IGxpbmUgaXMgdG9vIGJpZyBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIHNwYWNlCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gSWYgaXQgaXMgbm90
LCBkbyBub3RoaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5l
IG5lZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25nLApAQCAtMjU1NCw5ICsy
NjI0LDE2IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBsQnJlYWsuaW5jcmVtZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGxpbmVJbmZvLnNldFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbEJyZWFrLm1fcG9z
OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAobEJyZWFrLm1fb2JqICYmIGxCcmVhay5tX3BvcyAmJiBsQnJlYWsubV9vYmotPmlz
VGV4dCgpICYmIHRvUmVuZGVyVGV4dChsQnJlYWsubV9vYmopLT50ZXh0TGVuZ3RoKCkgJiYgdG9S
ZW5kZXJUZXh0KGxCcmVhay5tX29iaiktPmNoYXJhY3RlcnMoKVtsQnJlYWsubV9wb3MgLSAxXSA9
PSBzb2Z0SHlwaGVuICYmIHN0eWxlLT5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUpCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1faHlwaGVuYXRlZCA9IHRydWU7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGxCcmVhay5tX3BvcyAmJiBsQnJlYWsubV9wb3MgIT0gKHVu
c2lnbmVkKW1lYXN1cmVtZW50LmVuZE9mZnNldCAmJiAhbWVhc3VyZW1lbnQud2lkdGgpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJXaWR0aCkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbEJyZWFr
Lm1fcG9zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQu
d2lkdGggPSBjaGFyV2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Z290byBlbmQ7IC8vIERpZG4ndCBmaXQuIEp1bXAgdG8gdGhlIGVuZC4KICAgICAgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiZXR3
ZWVuV29yZHMgfHwgKG1pZFdvcmRCcmVhayAmJiAhYXV0b1dyYXApKQpAQCAtMjU5OSw2ICsyNjc2
LDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogCiAgICAgICAg
ICAgICAgICAgICAgIGlmIChiZXR3ZWVuV29yZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAg
IGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDog
MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9yVGV4dE1lYXN1cmUgPSAo
YXBwbHlXb3JkU3BhY2luZyAmJiBtZWFzdXJlbWVudC53aWR0aCkgPyB3b3JkU3BhY2luZyA6IDA7
CiAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U3BhY2UgPSBjdXJyZW50Lm1fcG9zOwogICAg
ICAgICAgICAgICAgICAgICB9CiAKQEAgLTI2MjEsNiArMjY5OSw3IEBAIElubGluZUl0ZXJhdG9y
IFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHBv
aW50LgogICAgICAgICAgICAgICAgICAgICBpZ25vcmluZ1NwYWNlcyA9IGZhbHNlOwogICAgICAg
ICAgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IGFwcGx5V29yZFNwYWNpbmcgPyB3
b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9yVGV4dE1l
YXN1cmUgPSAoYXBwbHlXb3JkU3BhY2luZyAmJiBtZWFzdXJlbWVudHMubGFzdCgpLndpZHRoKSA/
IHdvcmRTcGFjaW5nIDogMDsKICAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNlID0gY3VycmVu
dC5tX3BvczsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9mIHRoZSBp
Z25vcmVkIHNwYWNlcy4KICAgICAgICAgICAgICAgICAgICAgYWRkTWlkcG9pbnQobGluZU1pZHBv
aW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIGN1cnJlbnQubV9vYmosIGN1cnJlbnQubV9wb3Mp
KTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNjUzLDggKzI3MzIsMTYgQEAgSW5saW5lSXRlcmF0
b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogICAgICAgICAgICAgICAgIGF0U3RhcnQgPSBm
YWxzZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgbWVhc3VyZW1lbnRzLmFwcGVuZChN
ZWFzdXJlbWVudCgpKTsKKyAgICAgICAgICAgIE1lYXN1cmVtZW50JiBtZWFzdXJlbWVudCA9IG1l
YXN1cmVtZW50cy5sYXN0KCk7CisgICAgICAgICAgICBtZWFzdXJlbWVudC5yZW5kZXJlciA9IHQ7
CisKICAgICAgICAgICAgIC8vIElNUE9SVEFOVDogY3VycmVudC5tX3BvcyBpcyA+IGxlbmd0aCBo
ZXJlIQotICAgICAgICAgICAgZmxvYXQgYWRkaXRpb25hbFRtcFcgPSBpZ25vcmluZ1NwYWNlcyA/
IDAgOiB0ZXh0V2lkdGgodCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBm
LCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2Us
IHRleHRMYXlvdXQpICsgbGFzdFNwYWNlV29yZFNwYWNpbmc7CisgICAgICAgICAgICBmbG9hdCBh
ZGRpdGlvbmFsVG1wVyA9IGlnbm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0aCh0LCBsYXN0U3Bh
Y2UsIGN1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBp
c0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgJm1lYXN1cmVtZW50LmZhbGxiYWNrRm9u
dHMsIHRleHRMYXlvdXQpOworICAgICAgICAgICAgbWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgPSBs
YXN0U3BhY2U7CisgICAgICAgICAgICBtZWFzdXJlbWVudC5lbmRPZmZzZXQgPSBjdXJyZW50Lm1f
cG9zOworICAgICAgICAgICAgbWVhc3VyZW1lbnQud2lkdGggPSBpZ25vcmluZ1NwYWNlcyA/IDAg
OiBhZGRpdGlvbmFsVG1wVyArIHdvcmRTcGFjaW5nRm9yVGV4dE1lYXN1cmU7CisgICAgICAgICAg
ICBhZGRpdGlvbmFsVG1wVyArPSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKICAgICAgICAgICAgIHdp
ZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoYWRkaXRpb25hbFRtcFcgKyBpbmxpbmVMb2dpY2FsV2lk
dGgoY3VycmVudC5tX29iaiwgIWFwcGxpZWRTdGFydFdpZHRoLCBpbmNsdWRlRW5kV2lkdGgpKTsK
ICAgICAgICAgICAgIGluY2x1ZGVFbmRXaWR0aCA9IGZhbHNlOwogCg==
</data>
<flag name="review"
          id="180181"
          type_id="1"
          status="+"
          setter="mitz"
    />
    <flag name="commit-queue"
          id="180195"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
      

    </bug>

</bugzilla>