<?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>129527</bug_id>
          
          <creation_ts>2014-02-28 18:25:10 -0800</creation_ts>
          <short_desc>AX: Support IOS Accessibility in WK2</short_desc>
          <delta_ts>2014-06-04 00:50:46 -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>Accessibility</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="chris fleizach">cfleizach</reporter>
          <assigned_to name="chris fleizach">cfleizach</assigned_to>
          <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>985811</commentid>
    <comment_count>0</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-02-28 18:25:10 -0800</bug_when>
    <thetext>Add in enough support to make this work</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>985812</commentid>
    <comment_count>1</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-02-28 18:25:47 -0800</bug_when>
    <thetext>&lt;rdar://problem/15062381&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>985813</commentid>
    <comment_count>2</comment_count>
      <attachid>225518</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-02-28 18:33:45 -0800</bug_when>
    <thetext>Created attachment 225518
patch

This patch will need a corresponding change with WKSI, so it will not build until that piece lands</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>985848</commentid>
    <comment_count>3</comment_count>
      <attachid>225518</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2014-02-28 20:32:12 -0800</bug_when>
    <thetext>Comment on attachment 225518
patch

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

&gt; Source/WebKit2/Platform/IPC/Connection.h:177
&gt; +    // Used by accessibility to know the mach_port.

I don&apos;t think this comment adds much.

&gt; Source/WebKit2/Platform/IPC/mac/ConnectionMac.cpp:500
&gt; +IPC::Connection::Identifier Connection::identifier() const
&gt; +{
&gt; +    return Identifier(m_isServer ? m_receivePort : m_sendPort);
&gt; +}

The Identifier should probably also include the xpc_connection if there is one.

&gt; Source/WebKit2/UIProcess/ios/WKContentView.mm:237
&gt; +    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);

Please use a RetainPtr&lt;&gt; here.

&gt; Source/WebKit2/WebProcess/WebPage/WKAccessibilityWebPageObjectIOS.h:35
&gt; +#ifndef WKAccessibilityWebPageObjectIOS_h
&gt; +#define WKAccessibilityWebPageObjectIOS_h
&gt; +
&gt; +#include &quot;WKAccessibilityWebPageObjectBase.h&quot;
&gt; +
&gt; +@interface WKAccessibilityWebPageObject : WKAccessibilityWebPageObjectBase
&gt; +
&gt; +@property(nonatomic, retain) NSData *remoteTokenData;
&gt; +
&gt; +@end

You should probably wrap this file in #if PLATFORM(IOS)

&gt; Source/WebKit2/WebProcess/WebPage/WKAccessibilityWebPageObjectIOS.mm:35
&gt; +#import &quot;config.h&quot;
&gt; +#import &quot;WKAccessibilityWebPageObjectIOS.h&quot;
&gt; +
&gt; +#import &quot;WebFrame.h&quot;
&gt; +#import &quot;WebPage.h&quot;
&gt; +#import &lt;WebCore/FrameView.h&gt;
&gt; +
&gt; +/* 
&gt; + The implementation of this class will be augmented by an accesibility bundle that is loaded only when accessibility is requested to be enabled.
&gt; + */

You should probably wrap this file in #if PLATFORM(IOS)

&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:34
&gt; +&lt;&lt;&lt;&lt;&lt;&lt;&lt; .mine
&gt; +#import &quot;DataReference.h&quot;
&gt; +=======
&gt;  #if PLATFORM(IOS)
&gt;  
&gt; +&gt;&gt;&gt;&gt;&gt;&gt;&gt; .r164901

I don&apos;t think you meant this.

&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:100
&gt; +    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
&gt; +    NSData *remoteToken = WKAXRemoteToken(uuid);
&gt; +    CFRelease(uuid);

RetainPtr&lt;&gt;.

&gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.h:38
&gt; +#ifndef WKAccessibilityWebPageObjectMac_h
&gt; +#define WKAccessibilityWebPageObjectMac_h
&gt; +
&gt; +#include &quot;WKAccessibilityWebPageObjectBase.h&quot;
&gt; +
&gt; +@interface WKAccessibilityWebPageObject : WKAccessibilityWebPageObjectBase {
&gt; +    NSArray* m_attributeNames;
&gt; +    NSMutableArray* m_accessibilityChildren;
&gt; +}
&gt; +
&gt; +- (NSPoint)convertScreenPointToRootView:(NSPoint)point;
&gt; +
&gt; +@end

This should probably be wrapped in PLATFORM(MAC).

&gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:65
&gt; +
&gt; +using namespace WebCore;
&gt; +using namespace WebKit;
&gt; +
&gt; +@implementation WKAccessibilityWebPageObject
&gt; +
&gt; +- (void)dealloc
&gt; +{
&gt; +    WKUnregisterUniqueIdForElement(self);
&gt; +    [m_accessibilityChildren release];
&gt; +    [m_attributeNames release];
&gt; +    [m_parent release];
&gt; +    [super dealloc];
&gt; +}
&gt; +
&gt; +- (BOOL)accessibilityIsIgnored
&gt; +{
&gt; +    return NO;
&gt; +}
&gt; +
&gt; +- (NSArray *)accessibilityAttributeNames

This file should probably be wrapped in PLATFORM(MAC).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>986526</commentid>
    <comment_count>4</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-03-03 15:24:48 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/165014</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>986560</commentid>
    <comment_count>5</comment_count>
      <attachid>225518</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2014-03-03 16:26:39 -0800</bug_when>
    <thetext>Comment on attachment 225518
patch

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

&gt;&gt; Source/WebKit2/UIProcess/ios/WKContentView.mm:237
&gt;&gt; +    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
&gt; 
&gt; Please use a RetainPtr&lt;&gt; here.

Your committed code leaks.

&gt; Source/WebKit2/UIProcess/ios/WKContentView.mm:239
&gt; +    IPC::Connection* connection = _page-&gt;process().connection();

This asserts in a debug build. Did you test it?

&gt; Source/WebKit2/WebProcess/WebPage/WKAccessibilityWebPageObjectIOS.mm:39
&gt; +- (id)init

Return instancetype.

&gt; Source/WebKit2/WebProcess/WebPage/WKAccessibilityWebPageObjectIOS.mm:65
&gt; +- (void)dealloc
&gt; +{
&gt; +    [[NSNotificationCenter defaultCenter] removeObserver:self];
&gt; +    self.remoteTokenData = nil;
&gt; +    [super dealloc];
&gt; +}

Please move this up under the -init.

You should not use property syntax in the dealloc method.

&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:95
&gt; +    m_mockAccessibilityElement = [[[WKAccessibilityWebPageObject alloc] init] autorelease];

m_mockAccessibilityElement = adoptNS([[WKAccessibilityWebPageObject alloc] init]).

&gt;&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:100
&gt;&gt; +    CFRelease(uuid);
&gt; 
&gt; RetainPtr&lt;&gt;.

Without leaking!

&gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.h:33
&gt; +    NSArray* m_attributeNames;
&gt; +    NSMutableArray* m_accessibilityChildren;

What is the ownership model for these? Should they be RetainPtr?

&gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:102
&gt; +    return;

Remove.

&gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:140
&gt; +    if ([attribute isEqualToString:NSAccessibilityParentAttribute])
&gt; +        return m_parent;
&gt; +    if ([attribute isEqualToString:NSAccessibilityWindowAttribute])
&gt; +        return [m_parent accessibilityAttributeValue:NSAccessibilityWindowAttribute];
&gt; +    if ([attribute isEqualToString:NSAccessibilityTopLevelUIElementAttribute])
&gt; +        return [m_parent accessibilityAttributeValue:NSAccessibilityTopLevelUIElementAttribute];
&gt; +    if ([attribute isEqualToString:NSAccessibilityRoleAttribute])
&gt; +        return NSAccessibilityGroupRole;
&gt; +    if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute])
&gt; +        return NSAccessibilityRoleDescription(NSAccessibilityGroupRole, nil);
&gt; +    if ([attribute isEqualToString:NSAccessibilityFocusedAttribute])
&gt; +        return [NSNumber numberWithBool:NO];

Some spaces would make this more readable.

&gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:163
&gt; +    if ([parameter isKindOfClass:[NSValue class]] &amp;&amp; strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) == 0) {

Isn&apos;t there a better way than strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) ?

&gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:176
&gt; +        return CFBridgingRelease(WKStringCopyCFString(kCFAllocatorDefault, (WKStringRef)result.get()));
&gt; +    else if (toImpl(result.get())-&gt;type() == API::Boolean::APIType)
&gt; +        return [NSNumber numberWithBool:WKBooleanGetValue(static_cast&lt;WKBooleanRef&gt;(result.get()))];

No else after return.

&gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:187
&gt; +#pragma clang diagnostic push
&gt; +#pragma clang diagnostic ignored &quot;-Wdeprecated-declarations&quot;

Can this be removed at some point?

&gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:210
&gt; +    // Hit-test point comes in as bottom-screen coordinates. Needs to be normalized to the frame of the web page.
&gt; +    NSPoint remotePosition = [[self accessibilityAttributeValue:NSAccessibilityPositionAttribute] pointValue];
&gt; +    NSSize remoteSize = [[self accessibilityAttributeValue:NSAccessibilitySizeAttribute] sizeValue];
&gt; +    
&gt; +    // Get the y position of the WKView (we have to screen-flip and go from bottom left to top left).
&gt; +    CGFloat screenHeight = [(NSScreen *)[[NSScreen screens] objectAtIndex:0] frame].size.height;
&gt; +    remotePosition.y = (screenHeight - remotePosition.y) - remoteSize.height;
&gt; +    
&gt; +    point.y = screenHeight - point.y;
&gt; +    
&gt; +    // Re-center point into the web page&apos;s frame.
&gt; +    point.y -= remotePosition.y;
&gt; +    point.x -= remotePosition.x;
&gt; +    
&gt; +    WebCore::FrameView* frameView = m_page ? m_page-&gt;mainFrameView() : 0;
&gt; +    if (frameView) {
&gt; +        point.y += frameView-&gt;scrollPosition().y();
&gt; +        point.x += frameView-&gt;scrollPosition().x();
&gt; +    }
&gt; +    
&gt; +    return [[self accessibilityRootObjectWrapper] accessibilityHitTest:point];

We have &quot;screen to view&quot; conversions on ScrollView (screenToContents() etc). Can this use it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>986574</commentid>
    <comment_count>6</comment_count>
      <attachid>225712</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-03-03 16:48:19 -0800</bug_when>
    <thetext>Created attachment 225712
patch to avoid assertions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>986577</commentid>
    <comment_count>7</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-03-03 16:50:45 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 225518 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=225518&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebKit2/UIProcess/ios/WKContentView.mm:237
&gt; &gt;&gt; +    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
&gt; &gt; 
&gt; &gt; Please use a RetainPtr&lt;&gt; here.
&gt; 
&gt; Your committed code leaks.
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/WKContentView.mm:239
&gt; &gt; +    IPC::Connection* connection = _page-&gt;process().connection();
&gt; 
&gt; This asserts in a debug build. Did you test it?

Yes I&apos;ve been testing. I&apos;ve never hit a crash thus far on device

&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/WKAccessibilityWebPageObjectIOS.mm:39
&gt; &gt; +- (id)init
&gt; 
&gt; Return instancetype.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/WKAccessibilityWebPageObjectIOS.mm:65
&gt; &gt; +- (void)dealloc
&gt; &gt; +{
&gt; &gt; +    [[NSNotificationCenter defaultCenter] removeObserver:self];
&gt; &gt; +    self.remoteTokenData = nil;
&gt; &gt; +    [super dealloc];
&gt; &gt; +}
&gt; 
&gt; Please move this up under the -init.
&gt; 
&gt; You should not use property syntax in the dealloc method.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:95
&gt; &gt; +    m_mockAccessibilityElement = [[[WKAccessibilityWebPageObject alloc] init] autorelease];
&gt; 
&gt; m_mockAccessibilityElement = adoptNS([[WKAccessibilityWebPageObject alloc] init]).
&gt; 
&gt; &gt;&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:100
&gt; &gt;&gt; +    CFRelease(uuid);
&gt; &gt; 
&gt; &gt; RetainPtr&lt;&gt;.
&gt; 
&gt; Without leaking!
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.h:33
&gt; &gt; +    NSArray* m_attributeNames;
&gt; &gt; +    NSMutableArray* m_accessibilityChildren;
&gt; 
&gt; What is the ownership model for these? Should they be RetainPtr?
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:102
&gt; &gt; +    return;
&gt; 
&gt; Remove.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:140
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityParentAttribute])
&gt; &gt; +        return m_parent;
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityWindowAttribute])
&gt; &gt; +        return [m_parent accessibilityAttributeValue:NSAccessibilityWindowAttribute];
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityTopLevelUIElementAttribute])
&gt; &gt; +        return [m_parent accessibilityAttributeValue:NSAccessibilityTopLevelUIElementAttribute];
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityRoleAttribute])
&gt; &gt; +        return NSAccessibilityGroupRole;
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute])
&gt; &gt; +        return NSAccessibilityRoleDescription(NSAccessibilityGroupRole, nil);
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityFocusedAttribute])
&gt; &gt; +        return [NSNumber numberWithBool:NO];
&gt; 
&gt; Some spaces would make this more readable.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:163
&gt; &gt; +    if ([parameter isKindOfClass:[NSValue class]] &amp;&amp; strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) == 0) {
&gt; 
&gt; Isn&apos;t there a better way than strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) ?
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:176
&gt; &gt; +        return CFBridgingRelease(WKStringCopyCFString(kCFAllocatorDefault, (WKStringRef)result.get()));
&gt; &gt; +    else if (toImpl(result.get())-&gt;type() == API::Boolean::APIType)
&gt; &gt; +        return [NSNumber numberWithBool:WKBooleanGetValue(static_cast&lt;WKBooleanRef&gt;(result.get()))];
&gt; 
&gt; No else after return.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:187
&gt; &gt; +#pragma clang diagnostic push
&gt; &gt; +#pragma clang diagnostic ignored &quot;-Wdeprecated-declarations&quot;
&gt; 
&gt; Can this be removed at some point?
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:210
&gt; &gt; +    // Hit-test point comes in as bottom-screen coordinates. Needs to be normalized to the frame of the web page.
&gt; &gt; +    NSPoint remotePosition = [[self accessibilityAttributeValue:NSAccessibilityPositionAttribute] pointValue];
&gt; &gt; +    NSSize remoteSize = [[self accessibilityAttributeValue:NSAccessibilitySizeAttribute] sizeValue];
&gt; &gt; +    
&gt; &gt; +    // Get the y position of the WKView (we have to screen-flip and go from bottom left to top left).
&gt; &gt; +    CGFloat screenHeight = [(NSScreen *)[[NSScreen screens] objectAtIndex:0] frame].size.height;
&gt; &gt; +    remotePosition.y = (screenHeight - remotePosition.y) - remoteSize.height;
&gt; &gt; +    
&gt; &gt; +    point.y = screenHeight - point.y;
&gt; &gt; +    
&gt; &gt; +    // Re-center point into the web page&apos;s frame.
&gt; &gt; +    point.y -= remotePosition.y;
&gt; &gt; +    point.x -= remotePosition.x;
&gt; &gt; +    
&gt; &gt; +    WebCore::FrameView* frameView = m_page ? m_page-&gt;mainFrameView() : 0;
&gt; &gt; +    if (frameView) {
&gt; &gt; +        point.y += frameView-&gt;scrollPosition().y();
&gt; &gt; +        point.x += frameView-&gt;scrollPosition().x();
&gt; &gt; +    }
&gt; &gt; +    
&gt; &gt; +    return [[self accessibilityRootObjectWrapper] accessibilityHitTest:point];
&gt; 
&gt; We have &quot;screen to view&quot; conversions on ScrollView (screenToContents() etc). Can this use it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>986581</commentid>
    <comment_count>8</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-03-03 16:53:39 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 225518 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=225518&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebKit2/UIProcess/ios/WKContentView.mm:237
&gt; &gt;&gt; +    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
&gt; &gt; 
&gt; &gt; Please use a RetainPtr&lt;&gt; here.
&gt; 
&gt; Your committed code leaks.
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/WKContentView.mm:239
&gt; &gt; +    IPC::Connection* connection = _page-&gt;process().connection();
&gt; 
&gt; This asserts in a debug build. Did you test it?
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/WKAccessibilityWebPageObjectIOS.mm:39
&gt; &gt; +- (id)init
&gt; 
&gt; Return instancetype.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/WKAccessibilityWebPageObjectIOS.mm:65
&gt; &gt; +- (void)dealloc
&gt; &gt; +{
&gt; &gt; +    [[NSNotificationCenter defaultCenter] removeObserver:self];
&gt; &gt; +    self.remoteTokenData = nil;
&gt; &gt; +    [super dealloc];
&gt; &gt; +}
&gt; 
&gt; Please move this up under the -init.
&gt; 
&gt; You should not use property syntax in the dealloc method.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:95
&gt; &gt; +    m_mockAccessibilityElement = [[[WKAccessibilityWebPageObject alloc] init] autorelease];
&gt; 
&gt; m_mockAccessibilityElement = adoptNS([[WKAccessibilityWebPageObject alloc] init]).
&gt; 
&gt; &gt;&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:100
&gt; &gt;&gt; +    CFRelease(uuid);
&gt; &gt; 
&gt; &gt; RetainPtr&lt;&gt;.
&gt; 
&gt; Without leaking!
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.h:33
&gt; &gt; +    NSArray* m_attributeNames;
&gt; &gt; +    NSMutableArray* m_accessibilityChildren;
&gt; 
&gt; What is the ownership model for these? Should they be RetainPtr?

This Mac related code has been here for maybe two years. It&apos;s looking a little crufty. I&apos;ll clean it up

&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:102
&gt; &gt; +    return;
&gt; 
&gt; Remove.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:140
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityParentAttribute])
&gt; &gt; +        return m_parent;
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityWindowAttribute])
&gt; &gt; +        return [m_parent accessibilityAttributeValue:NSAccessibilityWindowAttribute];
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityTopLevelUIElementAttribute])
&gt; &gt; +        return [m_parent accessibilityAttributeValue:NSAccessibilityTopLevelUIElementAttribute];
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityRoleAttribute])
&gt; &gt; +        return NSAccessibilityGroupRole;
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute])
&gt; &gt; +        return NSAccessibilityRoleDescription(NSAccessibilityGroupRole, nil);
&gt; &gt; +    if ([attribute isEqualToString:NSAccessibilityFocusedAttribute])
&gt; &gt; +        return [NSNumber numberWithBool:NO];
&gt; 
&gt; Some spaces would make this more readable.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:163
&gt; &gt; +    if ([parameter isKindOfClass:[NSValue class]] &amp;&amp; strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) == 0) {
&gt; 
&gt; Isn&apos;t there a better way than strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) ?
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:176
&gt; &gt; +        return CFBridgingRelease(WKStringCopyCFString(kCFAllocatorDefault, (WKStringRef)result.get()));
&gt; &gt; +    else if (toImpl(result.get())-&gt;type() == API::Boolean::APIType)
&gt; &gt; +        return [NSNumber numberWithBool:WKBooleanGetValue(static_cast&lt;WKBooleanRef&gt;(result.get()))];
&gt; 
&gt; No else after return.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:187
&gt; &gt; +#pragma clang diagnostic push
&gt; &gt; +#pragma clang diagnostic ignored &quot;-Wdeprecated-declarations&quot;
&gt; 
&gt; Can this be removed at some point?
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:210
&gt; &gt; +    // Hit-test point comes in as bottom-screen coordinates. Needs to be normalized to the frame of the web page.
&gt; &gt; +    NSPoint remotePosition = [[self accessibilityAttributeValue:NSAccessibilityPositionAttribute] pointValue];
&gt; &gt; +    NSSize remoteSize = [[self accessibilityAttributeValue:NSAccessibilitySizeAttribute] sizeValue];
&gt; &gt; +    
&gt; &gt; +    // Get the y position of the WKView (we have to screen-flip and go from bottom left to top left).
&gt; &gt; +    CGFloat screenHeight = [(NSScreen *)[[NSScreen screens] objectAtIndex:0] frame].size.height;
&gt; &gt; +    remotePosition.y = (screenHeight - remotePosition.y) - remoteSize.height;
&gt; &gt; +    
&gt; &gt; +    point.y = screenHeight - point.y;
&gt; &gt; +    
&gt; &gt; +    // Re-center point into the web page&apos;s frame.
&gt; &gt; +    point.y -= remotePosition.y;
&gt; &gt; +    point.x -= remotePosition.x;
&gt; &gt; +    
&gt; &gt; +    WebCore::FrameView* frameView = m_page ? m_page-&gt;mainFrameView() : 0;
&gt; &gt; +    if (frameView) {
&gt; &gt; +        point.y += frameView-&gt;scrollPosition().y();
&gt; &gt; +        point.x += frameView-&gt;scrollPosition().x();
&gt; &gt; +    }
&gt; &gt; +    
&gt; &gt; +    return [[self accessibilityRootObjectWrapper] accessibilityHitTest:point];
&gt; 
&gt; We have &quot;screen to view&quot; conversions on ScrollView (screenToContents() etc). Can this use it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>986598</commentid>
    <comment_count>9</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-03-03 17:06:02 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 225518 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=225518&amp;action=review
&gt; 
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/mac/WKAccessibilityWebPageObjectMac.mm:163
&gt; &gt; +    if ([parameter isKindOfClass:[NSValue class]] &amp;&amp; strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) == 0) {
&gt; 
&gt; Isn&apos;t there a better way than strcmp([(NSValue*)parameter objCType], @encode(NSPoint)) ?
&gt; 

I looked through a bunch of projects. It looks like this is what everyone is doing.

&gt; &gt; +    NSSize remoteSize = [[self accessibilityAttributeValue:NSAccessibilitySizeAttribute] sizeValue];
&gt; &gt; +    
&gt; &gt; +    // Get the y position of the WKView (we have to screen-flip and go from bottom left to top left).
&gt; &gt; +    CGFloat screenHeight = [(NSScreen *)[[NSScreen screens] objectAtIndex:0] frame].size.height;
&gt; &gt; +    remotePosition.y = (screenHeight - remotePosition.y) - remoteSize.height;
&gt; &gt; +    
&gt; &gt; +    point.y = screenHeight - point.y;
&gt; &gt; +    
&gt; &gt; +    // Re-center point into the web page&apos;s frame.
&gt; &gt; +    point.y -= remotePosition.y;
&gt; &gt; +    point.x -= remotePosition.x;
&gt; &gt; +    
&gt; &gt; +    WebCore::FrameView* frameView = m_page ? m_page-&gt;mainFrameView() : 0;
&gt; &gt; +    if (frameView) {
&gt; &gt; +        point.y += frameView-&gt;scrollPosition().y();
&gt; &gt; +        point.x += frameView-&gt;scrollPosition().x();
&gt; &gt; +    }
&gt; &gt; +    
&gt; &gt; +    return [[self accessibilityRootObjectWrapper] accessibilityHitTest:point];
&gt; 
&gt; We have &quot;screen to view&quot; conversions on ScrollView (screenToContents() etc). Can this use it?

Filed https://bugs.webkit.org/show_bug.cgi?id=129643 to take care of that suggestion.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>987478</commentid>
    <comment_count>10</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-03-05 18:46:29 -0800</bug_when>
    <thetext>Simon&apos;s review comments addressed in
http://trac.webkit.org/changeset/165159</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1013256</commentid>
    <comment_count>11</comment_count>
      <attachid>225712</attachid>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2014-06-04 00:50:46 -0700</bug_when>
    <thetext>Comment on attachment 225712
patch to avoid assertions

Cleared review? from attachment 225712 so that this bug does not appear in http://webkit.org/pending-review.  If you would like this patch reviewed, please attach it to a new bug (or re-open this bug before marking it for review again).</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>225518</attachid>
            <date>2014-02-28 18:33:45 -0800</date>
            <delta_ts>2014-03-03 16:26:39 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>56098</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NDkwMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE2IEBACisyMDE0LTAyLTI4ICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFN1cHBvcnQgSU9T
IEFjY2Vzc2liaWxpdHkgaW4gV0syCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xMjk1MjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBVcGRhdGUgdGhlIGlPUyB3cmFwcGVyIHNvIHRoYXQgaXQgY2FuIGNvbnZl
cnQgcG9pbnRzIHRvIHNjcmVlbiBzcGFjZSBpbiBXZWJLaXQyLgorCisgICAgICAgICogYWNjZXNz
aWJpbGl0eS9pb3MvV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJJT1MubW06CisgICAgICAg
ICgtW1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyIGNvbnZlcnRQb2ludFRvU2NyZWVuU3Bh
Y2U6XSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyIGNvbnZlcnRS
ZWN0VG9TY3JlZW5TcGFjZTpdKToKKwogMjAxNC0wMi0yOCAgRGVhbiBKYWNrc29uICA8ZGlub0Bh
cHBsZS5jb20+CiAKICAgICAgICAgQ3Jhc2ggYXQgZWJheS5jb20gd2hlbiB2aWV3aW5nIGF1Y3Rp
b24gaXRlbXMgYXQgY29tLmFwcGxlLldlYkNvcmU6IFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpnZXRFeHRlbnNpb25zICsgMTAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
aW9zL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVySU9TLm1tCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvaW9zL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFw
cGVySU9TLm1tCShyZXZpc2lvbiAxNjQ5MDEpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L2lvcy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlcklPUy5tbQkod29ya2luZyBjb3B5
KQpAQCAtMjksOCArMjksMTEgQEAKICNpZiBIQVZFKEFDQ0VTU0lCSUxJVFkpICYmIFBMQVRGT1JN
KElPUykKIAogI2ltcG9ydCAiQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5oIgorI2ltcG9ydCAi
QWNjZXNzaWJpbGl0eVNjcm9sbFZpZXcuaCIKICNpbXBvcnQgIkFjY2Vzc2liaWxpdHlUYWJsZS5o
IgogI2ltcG9ydCAiQWNjZXNzaWJpbGl0eVRhYmxlQ2VsbC5oIgorI2ltcG9ydCAiQ2hyb21lLmgi
CisjaW1wb3J0ICJDaHJvbWVDbGllbnQuaCIKICNpbXBvcnQgIkZvbnQuaCIKICNpbXBvcnQgIkZy
YW1lLmgiCiAjaW1wb3J0ICJGcmFtZVNlbGVjdGlvbi5oIgpAQCAtNDEsNiArNDQsNyBAQAogI2lt
cG9ydCAiSFRNTE5hbWVzLmgiCiAjaW1wb3J0ICJJbnRSZWN0LmgiCiAjaW1wb3J0ICJJbnRTaXpl
LmgiCisjaW1wb3J0ICJQYWdlLmgiCiAjaW1wb3J0ICJSYW5nZS5oIgogI2ltcG9ydCAiUmVuZGVy
Vmlldy5oIgogI2ltcG9ydCAiUnVudGltZUFwcGxpY2F0aW9uQ2hlY2tzSU9TLmgiCkBAIC05OTMs
MTcgKzk5Nyw0NiBAQAogICAgIENHUG9pbnQgY2dQb2ludCA9IENHUG9pbnRNYWtlKHBvaW50Lngo
KSwgcG9pbnQueSgpKTsKICAgICAKICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IG1fb2JqZWN0
LT5kb2N1bWVudEZyYW1lVmlldygpOwotICAgIGlmIChmcmFtZVZpZXcpIHsKLSAgICAgICAgV0FL
VmlldyogdmlldyA9IGZyYW1lVmlldy0+ZG9jdW1lbnRWaWV3KCk7Ci0gICAgICAgIGNnUG9pbnQg
PSBbdmlldyBjb252ZXJ0UG9pbnQ6Y2dQb2ludCB0b1ZpZXc6bmlsXTsKKyAgICBXQUtWaWV3KiBk
b2N1bWVudFZpZXcgPSBmcmFtZVZpZXcgPyBmcmFtZVZpZXctPmRvY3VtZW50VmlldygpIDogbnVs
bHB0cjsKKyAgICBpZiAoZG9jdW1lbnRWaWV3KSB7CisgICAgICAgIGNnUG9pbnQgPSBbZG9jdW1l
bnRWaWV3IGNvbnZlcnRQb2ludDpjZ1BvaW50IHRvVmlldzpuaWxdOworCisgICAgICAgIC8vIHdl
IG5lZWQgdGhlIHdlYiBkb2N1bWVudCB2aWV3IHRvIGdpdmUgdXMgb3VyIGZpbmFsIHNjcmVlbiBj
b29yZGluYXRlcworICAgICAgICAvLyBiZWNhdXNlIHRoYXQgY2FuIHRha2UgYWNjb3VudCBvZiB0
aGUgc2Nyb2xsZXIKKyAgICAgICAgaWQgd2ViRG9jdW1lbnQgPSBbc2VsZiBfYWNjZXNzaWJpbGl0
eVdlYkRvY3VtZW50Vmlld107CisgICAgICAgIGlmICh3ZWJEb2N1bWVudCkKKyAgICAgICAgICAg
IGNnUG9pbnQgPSBbd2ViRG9jdW1lbnQgY29udmVydFBvaW50OmNnUG9pbnQgdG9WaWV3Om5pbF07
CiAgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBGaW5kIHRoZSBhcHByb3ByaWF0ZSBzY3Jv
bGwgdmlldyB0byB1c2UgdG8gY29udmVydCB0aGUgY29udGVudHMgdG8gdGhlIHdpbmRvdy4KKyAg
ICAgICAgU2Nyb2xsVmlldyogc2Nyb2xsVmlldyA9IDA7CisgICAgICAgIEFjY2Vzc2liaWxpdHlP
YmplY3QqIHBhcmVudCA9IDA7CisgICAgICAgIGZvciAocGFyZW50ID0gbV9vYmplY3QtPnBhcmVu
dE9iamVjdCgpOyBwYXJlbnQ7IHBhcmVudCA9IHBhcmVudC0+cGFyZW50T2JqZWN0KCkpIHsKKyAg
ICAgICAgICAgIGlmIChwYXJlbnQtPmlzQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXcoKSkgeworICAg
ICAgICAgICAgICAgIHNjcm9sbFZpZXcgPSB0b0FjY2Vzc2liaWxpdHlTY3JvbGxWaWV3KHBhcmVu
dCktPnNjcm9sbFZpZXcoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgSW50UG9pbnQgaW50UG9pbnQgPSBmbG9vcmVk
SW50UG9pbnQocG9pbnQpOworICAgICAgICBpZiAoc2Nyb2xsVmlldykKKyAgICAgICAgICAgIGlu
dFBvaW50ID0gc2Nyb2xsVmlldy0+Y29udGVudHNUb1Jvb3RWaWV3KGludFBvaW50KTsKKyAgICAg
ICAgCisgICAgICAgIFBhZ2UqIHBhZ2UgPSBtX29iamVjdC0+cGFnZSgpOworICAgICAgICAKKyAg
ICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBlbXB0eSBjaHJvbWUgY2xpZW50IChsaWtlIFNWRykgdGhl
biB3ZSBzaG91bGQgdXNlIHRoZSBwYWdlCisgICAgICAgIC8vIG9mIHRoZSBzY3JvbGwgdmlldyBw
YXJlbnQgdG8gaGVscCB1cyBnZXQgdG8gdGhlIHNjcmVlbiByZWN0LgorICAgICAgICBpZiAocGFy
ZW50ICYmIHBhZ2UgJiYgcGFnZS0+Y2hyb21lKCkuY2xpZW50KCkuaXNFbXB0eUNocm9tZUNsaWVu
dCgpKQorICAgICAgICAgICAgcGFnZSA9IHBhcmVudC0+cGFnZSgpOworICAgICAgICAKKyAgICAg
ICAgaWYgKHBhZ2UpIHsKKyAgICAgICAgICAgIEludFJlY3QgcmVjdCA9IEludFJlY3QoaW50UG9p
bnQsIEludFNpemUoMCwgMCkpOworICAgICAgICAgICAgaW50UG9pbnQgPSBwYWdlLT5jaHJvbWUo
KS5yb290Vmlld1RvU2NyZWVuKHJlY3QpLmxvY2F0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAg
CisgICAgICAgIGNnUG9pbnQgPSAoQ0dQb2ludClpbnRQb2ludDsKKyAgICB9CiAgICAgCi0gICAg
Ly8gd2UgbmVlZCB0aGUgd2ViIGRvY3VtZW50IHZpZXcgdG8gZ2l2ZSB1cyBvdXIgZmluYWwgc2Ny
ZWVuIGNvb3JkaW5hdGVzCi0gICAgLy8gYmVjYXVzZSB0aGF0IGNhbiB0YWtlIGFjY291bnQgb2Yg
dGhlIHNjcm9sbGVyCi0gICAgaWQgd2ViRG9jdW1lbnQgPSBbc2VsZiBfYWNjZXNzaWJpbGl0eVdl
YkRvY3VtZW50Vmlld107Ci0gICAgaWYgKHdlYkRvY3VtZW50KQotICAgICAgICBjZ1BvaW50ID0g
W3dlYkRvY3VtZW50IGNvbnZlcnRQb2ludDpjZ1BvaW50IHRvVmlldzpuaWxdOwotICAgIAogICAg
IHJldHVybiBjZ1BvaW50OwogfQogCkBAIC0xMDE4LDE3ICsxMDUxLDQzIEBACiAgICAgQ0dSZWN0
IGZyYW1lID0gQ0dSZWN0TWFrZShwb2ludC54LCBwb2ludC55LCBzaXplLndpZHRoLCBzaXplLmhl
aWdodCk7CiAgICAgCiAgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBtX29iamVjdC0+ZG9jdW1l
bnRGcmFtZVZpZXcoKTsKLSAgICBpZiAoZnJhbWVWaWV3KSB7Ci0gICAgICAgIFdBS1ZpZXcqIHZp
ZXcgPSBmcmFtZVZpZXctPmRvY3VtZW50VmlldygpOwotICAgICAgICBmcmFtZSA9IFt2aWV3IGNv
bnZlcnRSZWN0OmZyYW1lIHRvVmlldzpuaWxdOworICAgIFdBS1ZpZXcqIGRvY3VtZW50VmlldyA9
IGZyYW1lVmlldyA/IGZyYW1lVmlldy0+ZG9jdW1lbnRWaWV3KCkgOiBuaWw7CisgICAgaWYgKGRv
Y3VtZW50VmlldykgeworICAgICAgICBmcmFtZSA9IFtkb2N1bWVudFZpZXcgY29udmVydFJlY3Q6
ZnJhbWUgdG9WaWV3Om5pbF07CisgICAgICAgIAorICAgICAgICAvLyB3ZSBuZWVkIHRoZSB3ZWIg
ZG9jdW1lbnQgdmlldyB0byBnaXZlIHVzIG91ciBmaW5hbCBzY3JlZW4gY29vcmRpbmF0ZXMKKyAg
ICAgICAgLy8gYmVjYXVzZSB0aGF0IGNhbiB0YWtlIGFjY291bnQgb2YgdGhlIHNjcm9sbGVyCisg
ICAgICAgIGlkIHdlYkRvY3VtZW50ID0gW3NlbGYgX2FjY2Vzc2liaWxpdHlXZWJEb2N1bWVudFZp
ZXddOworICAgICAgICBpZiAod2ViRG9jdW1lbnQpCisgICAgICAgICAgICBmcmFtZSA9IFt3ZWJE
b2N1bWVudCBjb252ZXJ0UmVjdDpmcmFtZSB0b1ZpZXc6bmlsXTsKKyAgICAgICAgCisgICAgfSBl
bHNlIHsKKyAgICAgICAgLy8gRmluZCB0aGUgYXBwcm9wcmlhdGUgc2Nyb2xsIHZpZXcgdG8gdXNl
IHRvIGNvbnZlcnQgdGhlIGNvbnRlbnRzIHRvIHRoZSB3aW5kb3cuCisgICAgICAgIFNjcm9sbFZp
ZXcqIHNjcm9sbFZpZXcgPSAwOworICAgICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBwYXJlbnQg
PSAwOworICAgICAgICBmb3IgKHBhcmVudCA9IG1fb2JqZWN0LT5wYXJlbnRPYmplY3QoKTsgcGFy
ZW50OyBwYXJlbnQgPSBwYXJlbnQtPnBhcmVudE9iamVjdCgpKSB7CisgICAgICAgICAgICBpZiAo
cGFyZW50LT5pc0FjY2Vzc2liaWxpdHlTY3JvbGxWaWV3KCkpIHsKKyAgICAgICAgICAgICAgICBz
Y3JvbGxWaWV3ID0gdG9BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldyhwYXJlbnQpLT5zY3JvbGxWaWV3
KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgCisgICAgICAgIGlmIChzY3JvbGxWaWV3KQorICAgICAgICAgICAgcmVjdCA9IHNjcm9s
bFZpZXctPmNvbnRlbnRzVG9Sb290VmlldyhyZWN0KTsKKyAgICAgICAgCisgICAgICAgIFBhZ2Uq
IHBhZ2UgPSBtX29iamVjdC0+cGFnZSgpOworICAgICAgICAKKyAgICAgICAgLy8gSWYgd2UgaGF2
ZSBhbiBlbXB0eSBjaHJvbWUgY2xpZW50IChsaWtlIFNWRykgdGhlbiB3ZSBzaG91bGQgdXNlIHRo
ZSBwYWdlCisgICAgICAgIC8vIG9mIHRoZSBzY3JvbGwgdmlldyBwYXJlbnQgdG8gaGVscCB1cyBn
ZXQgdG8gdGhlIHNjcmVlbiByZWN0LgorICAgICAgICBpZiAocGFyZW50ICYmIHBhZ2UgJiYgcGFn
ZS0+Y2hyb21lKCkuY2xpZW50KCkuaXNFbXB0eUNocm9tZUNsaWVudCgpKQorICAgICAgICAgICAg
cGFnZSA9IHBhcmVudC0+cGFnZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKHBhZ2UpCisgICAg
ICAgICAgICByZWN0ID0gcGFnZS0+Y2hyb21lKCkucm9vdFZpZXdUb1NjcmVlbihyZWN0KTsKKyAg
ICAgICAgCisgICAgICAgIGZyYW1lID0gKENHUmVjdClyZWN0OwogICAgIH0KICAgICAKLSAgICAv
LyB3ZSBuZWVkIHRoZSB3ZWIgZG9jdW1lbnQgdmlldyB0byBnaXZlIHVzIG91ciBmaW5hbCBzY3Jl
ZW4gY29vcmRpbmF0ZXMKLSAgICAvLyBiZWNhdXNlIHRoYXQgY2FuIHRha2UgYWNjb3VudCBvZiB0
aGUgc2Nyb2xsZXIKLSAgICBpZCB3ZWJEb2N1bWVudCA9IFtzZWxmIF9hY2Nlc3NpYmlsaXR5V2Vi
RG9jdW1lbnRWaWV3XTsKLSAgICBpZiAod2ViRG9jdW1lbnQpCi0gICAgICAgIGZyYW1lID0gW3dl
YkRvY3VtZW50IGNvbnZlcnRSZWN0OmZyYW1lIHRvVmlldzpuaWxdOwotICAgIAogICAgIHJldHVy
biBmcmFtZTsKIH0KIApJbmRleDogU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwkocmV2aXNpb24gMTY0OTAxKQorKysgU291cmNl
L1dlYktpdDIvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjEgQEAKKzIwMTQt
MDItMjggIENocmlzIEZsZWl6YWNoICA8Y2ZsZWl6YWNoQGFwcGxlLmNvbT4KKworICAgICAgICBB
WDogU3VwcG9ydCBJT1MgQWNjZXNzaWJpbGl0eSBpbiBXSzIKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyOTUyNworCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEltcGxlbWVudCBlbm91Z2ggQVggaG9va3Mgc28g
dGhhdCBhY2Nlc3NpYmlsaXR5IGNhbiB3b3JrIGluIFdlYktpdDIuCisKKyAgICAgICAgKiBQbGF0
Zm9ybS9JUEMvQ29ubmVjdGlvbi5oOgorICAgICAgICAqIFBsYXRmb3JtL0lQQy9tYWMvQ29ubmVj
dGlvbk1hYy5jcHA6CisgICAgICAgIChJUEM6OkNvbm5lY3Rpb246OmlkZW50aWZpZXIpOgorICAg
ICAgICAqIFVJUHJvY2Vzcy9pb3MvUGFnZUNsaWVudEltcGxJT1MubW06CisgICAgICAgIChXZWJL
aXQ6OlBhZ2VDbGllbnRJbXBsOjphY2Nlc3NpYmlsaXR5V2ViUHJvY2Vzc1Rva2VuUmVjZWl2ZWQp
OgorICAgICAgICAqIFVJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlldy5oOgorICAgICAgICAqIFVJ
UHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlldy5tbToKKyAgICAgICAgKC1bV0tDb250ZW50VmlldyBf
dXBkYXRlRm9yU2NyZWVuOl0pOgorICAgICAgICAoLVtXS0NvbnRlbnRWaWV3IF9zZXRBY2Nlc3Np
YmlsaXR5V2ViUHJvY2Vzc1Rva2VuOl0pOgorICAgICAgICAoLVtXS0NvbnRlbnRWaWV3IF9hY2Nl
c3NpYmlsaXR5UmVnaXN0ZXJVSVByb2Nlc3NUb2tlbnNdKToKKyAgICAgICAgKC1bV0tDb250ZW50
VmlldyBfZGlkUmVsYXVuY2hQcm9jZXNzXSk6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9XZWJQ
YWdlUHJveHlJT1MubW06CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6cmVnaXN0ZXJX
ZWJQcm9jZXNzQWNjZXNzaWJpbGl0eVRva2VuKToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVBy
b3h5OjpyZWdpc3RlclVJUHJvY2Vzc0FjY2Vzc2liaWxpdHlUb2tlbnMpOgorICAgICAgICAqIFdl
YktpdDIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBXZWJQcm9jZXNzL1Bs
dWdpbnMvUERGL1BERlBsdWdpbi5tbToKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV0tB
Y2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdElPUy5oOiBBZGRlZC4KKyAgICAgICAgKiBXZWJQcm9j
ZXNzL1dlYlBhZ2UvV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdElPUy5tbTogQWRkZWQuCisg
ICAgICAgICgtW1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3QgaW5pdF0pOgorICAgICAgICAo
LVtXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0IF9hY2Nlc3NpYmlsaXR5Q2F0ZWdvcnlJbnN0
YWxsZWQ6XSk6CisgICAgICAgICgtW1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3QgcGFnZVNj
YWxlXSk6CisgICAgICAgICgtW1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3QgZGVhbGxvY10p
OgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmg6CisgICAgICAgICogV2Vi
UHJvY2Vzcy9XZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1tOgorICAgICAgICAoV2ViS2l0OjpXZWJQ
YWdlOjpwbGF0Zm9ybUluaXRpYWxpemUpOgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlOjpwbGF0
Zm9ybUluaXRpYWxpemVBY2Nlc3NpYmlsaXR5KToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZTo6
YWNjZXNzaWJpbGl0eU9iamVjdEZvck1haW5GcmFtZVBsdWdpbik6CisgICAgICAgIChXZWJLaXQ6
OldlYlBhZ2U6OnJlZ2lzdGVyVUlQcm9jZXNzQWNjZXNzaWJpbGl0eVRva2Vucyk6CisgICAgICAg
ICogV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9XS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFz
ZS5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1dL
QWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3QuaC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBh
Z2UvbWFjL1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLm1tOiBDb3BpZWQgZnJvbSBT
b3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1dLQWNjZXNzaWJpbGl0eVdlYlBh
Z2VPYmplY3QubW0uCisgICAgICAgICgtW1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNl
IGFjY2Vzc2liaWxpdHlGb2N1c2VkVUlFbGVtZW50XSk6CisgICAgICAgICogV2ViUHJvY2Vzcy9X
ZWJQYWdlL21hYy9XS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0TWFjLmg6IEFkZGVkLgorICAg
ICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVj
dE1hYy5tbTogQWRkZWQuCisgICAgICAgICgtW1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3Qg
YWNjZXNzaWJpbGl0eUlzSWdub3JlZF0pOgorICAgICAgICAoLVtXS0FjY2Vzc2liaWxpdHlXZWJQ
YWdlT2JqZWN0IGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVOYW1lc10pOgorICAgICAgICAoLVtXS0Fj
Y2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0IGFjY2Vzc2liaWxpdHlQYXJhbWV0ZXJpemVkQXR0cmli
dXRlTmFtZXNdKToKKyAgICAgICAgKC1bV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdCBhY2Nl
c3NpYmlsaXR5SXNBdHRyaWJ1dGVTZXR0YWJsZTpdKToKKyAgICAgICAgKC1bV0tBY2Nlc3NpYmls
aXR5V2ViUGFnZU9iamVjdCBhY2Nlc3NpYmlsaXR5U2V0VmFsdWU6Zm9yQXR0cmlidXRlOl0pOgor
ICAgICAgICAoLVtXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0IGNvbnZlcnRTY3JlZW5Qb2lu
dFRvUm9vdFZpZXc6XSk6CisgICAgICAgICgtW1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3Qg
YWNjZXNzaWJpbGl0eUFjdGlvbk5hbWVzXSk6CisgICAgICAgICgtW1dLQWNjZXNzaWJpbGl0eVdl
YlBhZ2VPYmplY3QgYWNjZXNzaWJpbGl0eUNoaWxkcmVuXSk6CisgICAgICAgICgtW1dLQWNjZXNz
aWJpbGl0eVdlYlBhZ2VPYmplY3QgYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOl0pOgorICAg
ICAgICAoLVtXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0IGFjY2Vzc2liaWxpdHlBdHRyaWJ1
dGVWYWx1ZTpmb3JQYXJhbWV0ZXI6XSk6CisgICAgICAgICgtW1dLQWNjZXNzaWJpbGl0eVdlYlBh
Z2VPYmplY3QgYWNjZXNzaWJpbGl0eVNob3VsZFVzZVVuaXF1ZUlkXSk6CisgICAgICAgICgtW1dL
QWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3QgYWNjZXNzaWJpbGl0eUhpdFRlc3Q6XSk6CisgICAg
ICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9XZWJQYWdlTWFjLm1tOgorICAgICAgICAqIFdl
YlByb2Nlc3MvY29jb2EvV2ViUHJvY2Vzc0NvY29hLm1tOgorICAgICAgICAoV2ViS2l0OjpXZWJQ
cm9jZXNzOjpwbGF0Zm9ybUluaXRpYWxpemVQcm9jZXNzKToKKwogMjAxNC0wMi0yOCAgQmVuamFt
aW4gUG91bGFpbiAgPGJwb3VsYWluQGFwcGxlLmNvbT4KIAogICAgICAgICBbaU9TXVtXSzJdIGhp
Z2hsaWdodCByZWN0cyBzaG91bGQgbmV2ZXIgYmlnIGJpZ2dlciB0aGFuIHRoZSB2aWV3CkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybS9JUEMvQ29ubmVjdGlvbi5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL1BsYXRmb3JtL0lQQy9Db25uZWN0aW9uLmgJKHJldmlzaW9uIDE2NDkw
MSkKKysrIFNvdXJjZS9XZWJLaXQyL1BsYXRmb3JtL0lQQy9Db25uZWN0aW9uLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTE3NCw2ICsxNzQsOSBAQAogCiAgICAgYm9vbCBpblNlbmRTeW5jKCkgY29uc3Qg
eyByZXR1cm4gbV9pblNlbmRTeW5jQ291bnQ7IH0KIAorICAgIC8vIFVzZWQgYnkgYWNjZXNzaWJp
bGl0eSB0byBrbm93IHRoZSBtYWNoX3BvcnQuCisgICAgSWRlbnRpZmllciBpZGVudGlmaWVyKCkg
Y29uc3Q7CisgICAgCiBwcml2YXRlOgogICAgIENvbm5lY3Rpb24oSWRlbnRpZmllciwgYm9vbCBp
c1NlcnZlciwgQ2xpZW50KiwgV1RGOjpSdW5Mb29wKiBjbGllbnRSdW5Mb29wKTsKICAgICB2b2lk
IHBsYXRmb3JtSW5pdGlhbGl6ZShJZGVudGlmaWVyKTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1Bs
YXRmb3JtL0lQQy9tYWMvQ29ubmVjdGlvbk1hYy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YktpdDIvUGxhdGZvcm0vSVBDL21hYy9Db25uZWN0aW9uTWFjLmNwcAkocmV2aXNpb24gMTY0OTAx
KQorKysgU291cmNlL1dlYktpdDIvUGxhdGZvcm0vSVBDL21hYy9Db25uZWN0aW9uTWFjLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDk0LDQgKzQ5NCw5IEBACiAgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwogfQogCitJUEM6OkNvbm5lY3Rpb246OklkZW50aWZpZXIgQ29ubmVjdGlvbjo6aWRl
bnRpZmllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIElkZW50aWZpZXIobV9pc1NlcnZlciA/IG1f
cmVjZWl2ZVBvcnQgOiBtX3NlbmRQb3J0KTsKK30KKyAgICAKIH0gLy8gbmFtZXNwYWNlIElQQwpJ
bmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2lvcy9QYWdlQ2xpZW50SW1wbElPUy5tbQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1BhZ2VDbGllbnRJbXBs
SU9TLm1tCShyZXZpc2lvbiAxNjQ5MDEpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9z
L1BhZ2VDbGllbnRJbXBsSU9TLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsyOCw3IEBACiAK
ICNpZiBQTEFURk9STShJT1MpCiAKKyNpbXBvcnQgIkRhdGFSZWZlcmVuY2UuaCIKICNpbXBvcnQg
Ik5hdGl2ZVdlYktleWJvYXJkRXZlbnQuaCIKICNpbXBvcnQgIkludGVyYWN0aW9uSW5mb3JtYXRp
b25BdFBvc2l0aW9uLmgiCiAjaW1wb3J0ICJXS0NvbnRlbnRWaWV3LmgiCkBAIC0xODYsOSArMTg3
LDEwIEBACiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotdm9pZCBQYWdlQ2xpZW50SW1wbDo6
YWNjZXNzaWJpbGl0eVdlYlByb2Nlc3NUb2tlblJlY2VpdmVkKGNvbnN0IElQQzo6RGF0YVJlZmVy
ZW5jZSYpCit2b2lkIFBhZ2VDbGllbnRJbXBsOjphY2Nlc3NpYmlsaXR5V2ViUHJvY2Vzc1Rva2Vu
UmVjZWl2ZWQoY29uc3QgSVBDOjpEYXRhUmVmZXJlbmNlJiBkYXRhKQogewotICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgTlNEYXRhICpyZW1vdGVUb2tlbiA9IFtOU0RhdGEgZGF0YVdpdGhCeXRl
czpkYXRhLmRhdGEoKSBsZW5ndGg6ZGF0YS5zaXplKCldOworICAgIFttX2NvbnRlbnRWaWV3IF9z
ZXRBY2Nlc3NpYmlsaXR5V2ViUHJvY2Vzc1Rva2VuOnJlbW90ZVRva2VuXTsKIH0KIAogYm9vbCBQ
YWdlQ2xpZW50SW1wbDo6aW50ZXJwcmV0S2V5RXZlbnQoY29uc3QgTmF0aXZlV2ViS2V5Ym9hcmRF
dmVudCYsIFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+JikKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlldy5oCShyZXZpc2lvbiAxNjQ5MDEpCisrKyBTb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dLQ29udGVudFZpZXcuaAkod29ya2luZyBjb3B5KQpA
QCAtODUsNSArODUsNiBAQAogLSAodm9pZClfZGVjaWRlUG9saWN5Rm9yR2VvbG9jYXRpb25SZXF1
ZXN0RnJvbU9yaWdpbjooV2ViS2l0OjpXZWJTZWN1cml0eU9yaWdpbiYpb3JpZ2luIGZyYW1lOihX
ZWJLaXQ6OldlYkZyYW1lUHJveHkmKWZyYW1lIHJlcXVlc3Q6KFdlYktpdDo6R2VvbG9jYXRpb25Q
ZXJtaXNzaW9uUmVxdWVzdFByb3h5JilwZXJtaXNzaW9uUmVxdWVzdDsKIAogLSAoUmV0YWluUHRy
PENHSW1hZ2VSZWY+KV90YWtlVmlld1NuYXBzaG90OworLSAodm9pZClfc2V0QWNjZXNzaWJpbGl0
eVdlYlByb2Nlc3NUb2tlbjooTlNEYXRhICopZGF0YTsKIAogQGVuZApJbmRleDogU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3Lm1tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlldy5tbQkocmV2aXNpb24gMTY0OTAx
KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3Lm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC00Myw2ICs0Myw3IEBACiAjaW1wb3J0ICJXZWJGcmFtZVByb3h5LmgiCiAj
aW1wb3J0ICJXZWJQYWdlR3JvdXAuaCIKICNpbXBvcnQgIldlYlN5c3RlbUludGVyZmFjZS5oIgor
I2ltcG9ydCAiV2ViS2l0U3lzdGVtSW50ZXJmYWNlSU9TLmgiCiAjaW1wb3J0IDxVSUtpdC9VSVdp
bmRvd19Qcml2YXRlLmg+CiAjaW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+CiAKQEAgLTIyMiw4ICsy
MjMsMzAgQEAKIHsKICAgICBBU1NFUlQoc2NyZWVuKTsKICAgICBfcGFnZS0+c2V0SW50cmluc2lj
RGV2aWNlU2NhbGVGYWN0b3Ioc2NyZWVuLnNjYWxlKTsKKyAgICBbc2VsZiBfYWNjZXNzaWJpbGl0
eVJlZ2lzdGVyVUlQcm9jZXNzVG9rZW5zXTsKIH0KIAorLSAodm9pZClfc2V0QWNjZXNzaWJpbGl0
eVdlYlByb2Nlc3NUb2tlbjooTlNEYXRhICopZGF0YQoreworICAgIC8vIFRoaXMgbWVhbnMgdGhl
IHdlYiBwcm9jZXNzIGhhcyBjaGVja2VkIGluIGFuZCB3ZSBzaG91bGQgc2VuZCBpbmZvcm1hdGlv
biBiYWNrIHRvIHRoYXQgcHJvY2Vzcy4KKyAgICBbc2VsZiBfYWNjZXNzaWJpbGl0eVJlZ2lzdGVy
VUlQcm9jZXNzVG9rZW5zXTsKK30KKworLSAodm9pZClfYWNjZXNzaWJpbGl0eVJlZ2lzdGVyVUlQ
cm9jZXNzVG9rZW5zCit7CisgICAgQ0ZVVUlEUmVmIHV1aWQgPSBDRlVVSURDcmVhdGUoa0NGQWxs
b2NhdG9yRGVmYXVsdCk7CisgICAgTlNEYXRhICpyZW1vdGVFbGVtZW50VG9rZW4gPSBXS0FYUmVt
b3RlVG9rZW4odXVpZCk7CisgICAgSVBDOjpDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gX3BhZ2Ut
PnByb2Nlc3MoKS5jb25uZWN0aW9uKCk7CisKKyAgICAvLyBTdG9yZSBpbmZvcm1hdGlvbiBhYm91
dCB0aGUgV2ViUHJvY2VzcyB0aGF0IGNhbiBsYXRlciBiZSByZXRyaWV2ZWQgYnkgdGhlIGlPUyBB
Y2Nlc3NpYmlsaXR5IHJ1bnRpbWUuCisgICAgaWYgKGNvbm5lY3Rpb24pCisgICAgICAgIFdLQVhT
dG9yZVJlbW90ZUNvbm5lY3Rpb25JbmZvcm1hdGlvbihzZWxmLCBfcGFnZS0+cHJvY2VzcygpLnBy
b2Nlc3NJZGVudGlmaWVyKCksIGNvbm5lY3Rpb24tPmlkZW50aWZpZXIoKS5wb3J0LCB1dWlkKTsK
KyAgICBDRlJlbGVhc2UodXVpZCk7CisgICAgCisgICAgSVBDOjpEYXRhUmVmZXJlbmNlIGVsZW1l
bnRUb2tlbiA9IElQQzo6RGF0YVJlZmVyZW5jZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihbcmVtb3RlRWxlbWVudFRva2VuIGJ5dGVzXSksIFtyZW1vdGVFbGVtZW50VG9rZW4gbGVu
Z3RoXSk7CisgICAgX3BhZ2UtPnJlZ2lzdGVyVUlQcm9jZXNzQWNjZXNzaWJpbGl0eVRva2Vucyhl
bGVtZW50VG9rZW4sIGVsZW1lbnRUb2tlbik7Cit9CisKICNwcmFnbWEgbWFyayBQYWdlQ2xpZW50
SW1wbCBtZXRob2RzCiAKIC0gKHN0ZDo6dW5pcXVlX3B0cjxEcmF3aW5nQXJlYVByb3h5PilfY3Jl
YXRlRHJhd2luZ0FyZWFQcm94eQpAQCAtMjM4LDcgKzI2MSw3IEBACiAKIC0gKHZvaWQpX2RpZFJl
bGF1bmNoUHJvY2VzcwogewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgW3NlbGYgX2Fj
Y2Vzc2liaWxpdHlSZWdpc3RlclVJUHJvY2Vzc1Rva2Vuc107CiB9CiAKIC0gKHZvaWQpX2RpZENv
bW1pdExvYWRGb3JNYWluRnJhbWUKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3Mv
V2ViUGFnZVByb3h5SU9TLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9pb3MvV2ViUGFnZVByb3h5SU9TLm1tCShyZXZpc2lvbiAxNjQ5MDEpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvaW9zL1dlYlBhZ2VQcm94eUlPUy5tbQkod29ya2luZyBjb3B5KQpAQCAt
MjgsNiArMjgsNyBAQAogCiAjaWYgUExBVEZPUk0oSU9TKQogCisjaW1wb3J0ICJEYXRhUmVmZXJl
bmNlLmgiCiAjaW1wb3J0ICJOYXRpdmVXZWJLZXlib2FyZEV2ZW50LmgiCiAjaW1wb3J0ICJQYWdl
Q2xpZW50LmgiCiAjaW1wb3J0ICJWaWV3VXBkYXRlRGlzcGF0Y2hlck1lc3NhZ2VzLmgiCkBAIC00
MDksOSArNDEwLDkgQEAKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lkIFdlYlBhZ2VQ
cm94eTo6cmVnaXN0ZXJXZWJQcm9jZXNzQWNjZXNzaWJpbGl0eVRva2VuKGNvbnN0IElQQzo6RGF0
YVJlZmVyZW5jZSYpCit2b2lkIFdlYlBhZ2VQcm94eTo6cmVnaXN0ZXJXZWJQcm9jZXNzQWNjZXNz
aWJpbGl0eVRva2VuKGNvbnN0IElQQzo6RGF0YVJlZmVyZW5jZSYgZGF0YSkKIHsKLSAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIG1fcGFnZUNsaWVudC5hY2Nlc3NpYmlsaXR5V2ViUHJvY2Vzc1Rv
a2VuUmVjZWl2ZWQoZGF0YSk7CiB9ICAgIAogCiB2b2lkIFdlYlBhZ2VQcm94eTo6bWFrZUZpcnN0
UmVzcG9uZGVyKCkKQEAgLTQxOSw5ICs0MjAsMTIgQEAKICAgICBub3RJbXBsZW1lbnRlZCgpOwog
fQogCi12b2lkIFdlYlBhZ2VQcm94eTo6cmVnaXN0ZXJVSVByb2Nlc3NBY2Nlc3NpYmlsaXR5VG9r
ZW5zKGNvbnN0IElQQzo6RGF0YVJlZmVyZW5jZSYsIGNvbnN0IElQQzo6RGF0YVJlZmVyZW5jZSYp
Cit2b2lkIFdlYlBhZ2VQcm94eTo6cmVnaXN0ZXJVSVByb2Nlc3NBY2Nlc3NpYmlsaXR5VG9rZW5z
KGNvbnN0IElQQzo6RGF0YVJlZmVyZW5jZSYgZWxlbWVudFRva2VuLCBjb25zdCBJUEM6OkRhdGFS
ZWZlcmVuY2UmIHdpbmRvd1Rva2VuKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgaWYg
KCFpc1ZhbGlkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBwcm9jZXNzKCkuc2VuZChN
ZXNzYWdlczo6V2ViUGFnZTo6UmVnaXN0ZXJVSVByb2Nlc3NBY2Nlc3NpYmlsaXR5VG9rZW5zKGVs
ZW1lbnRUb2tlbiwgd2luZG93VG9rZW4pLCBtX3BhZ2VJRCk7CiB9CiAKIHZvaWQgV2ViUGFnZVBy
b3h5OjpwbHVnaW5Gb2N1c09yV2luZG93Rm9jdXNDaGFuZ2VkKHVpbnQ2NF90LCBib29sKQpJbmRl
eDogU291cmNlL1dlYktpdDIvV2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYktpdDIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkocmV2aXNpb24gMTY0OTAxKQorKysgU291cmNlL1dlYktpdDIvV2ViS2l0Mi54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC00NjAsNiArNDYwLDkgQEAKIAkJMjY4
NDA1NTMxOEI4NkVENjAwMjJDMzhCIC8qIFZpZXdVcGRhdGVEaXNwYXRjaGVyTWVzc2FnZXMuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2ODQwNTUxMThC
ODZFRDYwMDIyQzM4QiAvKiBWaWV3VXBkYXRlRGlzcGF0Y2hlck1lc3NhZ2VzLmggKi87IH07CiAJ
CTI2RjlBODNCMThBMzQ2ODEwMEFFQjg4QSAvKiBXS1dlYlZpZXdQcml2YXRlLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNkY5QTgzQTE4QTM0NjNGMDBB
RUI4OEEgLyogV0tXZWJWaWV3UHJpdmF0ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0g
KFByaXZhdGUsICk7IH07IH07CiAJCTI5MEY0MjcyMTcyQTBDNzQwMDkzOUZGMCAvKiBDaGlsZFBy
b2Nlc3NTdXBwbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAyOTBGNDI3MTE3MkEwQzc0MDA5MzlGRjAgLyogQ2hpbGRQcm9jZXNzU3VwcGxlbWVu
dC5oICovOyB9OworCQkyOTIzMkRGNDE4QjI5RDY4MDBEMDU5NkYgLyogV0tBY2Nlc3NpYmlsaXR5
V2ViUGFnZU9iamVjdE1hYy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMjkyMzJERjMxOEIyOUQ2ODAwRDA1OTZGIC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBh
Z2VPYmplY3RNYWMuaCAqLzsgfTsKKwkJMjkyMzJERjgxOEIyQTlBRTAwRDA1OTZGIC8qIFdLQWNj
ZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RJT1MubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAyOTIzMkRGNjE4QjI5RENFMDBEMDU5NkYgLyogV0tBY2Nlc3Np
YmlsaXR5V2ViUGFnZU9iamVjdElPUy5tbSAqLzsgfTsKKwkJMjkyMzJERjkxOEIyQUIzQTAwRDA1
OTZGIC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMubW0gaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyOTIzMkRGMTE4QjI5RDExMDBEMDU5NkYg
LyogV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdE1hYy5tbSAqLzsgfTsKIAkJMjkzRUJFQUIx
NjI3RDlDOTAwNUY4OUYxIC8qIFdLRE9NVGV4dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMjkzRUJFQTkxNjI3RDlDOTAwNUY4OUYxIC8qIFdLRE9NVGV4
dC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTI5
M0VCRUFDMTYyN0Q5QzkwMDVGODlGMSAvKiBXS0RPTVRleHQubW0gaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyOTNFQkVBQTE2MjdEOUM5MDA1Rjg5RjEgLyog
V0tET01UZXh0Lm1tICovOyB9OwogCQkyOTUwMTcyNDE2MkE0NTA0MDA0QTlENzEgLyogV0tXZWJQ
cm9jZXNzUGx1Z0luQnJvd3NlckNvbnRleHRDb250cm9sbGVyUHJpdmF0ZS5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjk1MDE3MjMxNjJBNDUwNDAwNEE5
RDcxIC8qIFdLV2ViUHJvY2Vzc1BsdWdJbkJyb3dzZXJDb250ZXh0Q29udHJvbGxlclByaXZhdGUu
aCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwpAQCAtNDcz
LDggKzQ3Niw4IEBACiAJCTI5ODlBNDE0MTY3RDE4NEIwMDRGOTZEMiAvKiBDdXN0b21Qcm90b2Nv
bE1hbmFnZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDI5ODlBNDEyMTY3RDE4NEIwMDRGOTZEMiAvKiBDdXN0b21Qcm90b2NvbE1hbmFnZXIuaCAqLzsg
fTsKIAkJMjlBRDMwOTMxNjRCNEM1RDAwNzJERUE5IC8qIEN1c3RvbVByb3RvY29sTWFuYWdlclBy
b3h5LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyOUFE
MzA5MjE2NEI0QzVEMDA3MkRFQTkgLyogQ3VzdG9tUHJvdG9jb2xNYW5hZ2VyUHJveHkuaCAqLzsg
fTsKIAkJMjlBRDMwOTYxNjRCNEM5MzAwNzJERUE5IC8qIEN1c3RvbVByb3RvY29sTWFuYWdlclBy
b3h5TWFjLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MjlBRDMwOTUxNjRCNEM5MzAwNzJERUE5IC8qIEN1c3RvbVByb3RvY29sTWFuYWdlclByb3h5TWFj
Lm1tICovOyB9OwotCQkyOUNENTVBQTEyOEUyOTRGMDAxMzNDODUgLyogV0tBY2Nlc3NpYmlsaXR5
V2ViUGFnZU9iamVjdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gMjlDRDU1QTgxMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VP
YmplY3QuaCAqLzsgfTsKLQkJMjlDRDU1QUIxMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNjZXNzaWJp
bGl0eVdlYlBhZ2VPYmplY3QubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAyOUNENTVBOTEyOEUyOTRGMDAxMzNDODUgLyogV0tBY2Nlc3NpYmlsaXR5V2Vi
UGFnZU9iamVjdC5tbSAqLzsgfTsKKwkJMjlDRDU1QUExMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNj
ZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAyOUNENTVBODEyOEUyOTRGMDAxMzNDODUgLyogV0tBY2Nlc3Np
YmlsaXR5V2ViUGFnZU9iamVjdEJhc2UuaCAqLzsgfTsKKwkJMjlDRDU1QUIxMjhFMjk0RjAwMTMz
Qzg1IC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLm1tIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjlDRDU1QTkxMjhFMjk0RjAwMTMzQzg1
IC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLm1tICovOyB9OwogCQkyOUQ1NURG
MTE2MUJGOUYxMDAzMUEyRTMgLyogV2ViUGFnZUdyb3VwUHJveHlNZXNzYWdlUmVjZWl2ZXIuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjlENTVERUYx
NjFCRjlGMTAwMzFBMkUzIC8qIFdlYlBhZ2VHcm91cFByb3h5TWVzc2FnZVJlY2VpdmVyLmNwcCAq
LzsgfTsKIAkJMjlENTVERjIxNjFCRjlGMTAwMzFBMkUzIC8qIFdlYlBhZ2VHcm91cFByb3h5TWVz
c2FnZXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI5
RDU1REYwMTYxQkY5RjEwMDMxQTJFMyAvKiBXZWJQYWdlR3JvdXBQcm94eU1lc3NhZ2VzLmggKi87
IH07CiAJCTJEMTI1QzVFMTg1N0VBMDUwMDNCQTNDQiAvKiBWaWV3R2VzdHVyZUNvbnRyb2xsZXIu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJEMTI1QzVD
MTg1N0VBMDUwMDNCQTNDQiAvKiBWaWV3R2VzdHVyZUNvbnRyb2xsZXIuaCAqLzsgfTsKQEAgLTIx
OTUsNiArMjE5OCwxMCBAQAogCQkyNjg0MDU1MTE4Qjg2RUQ2MDAyMkMzOEIgLyogVmlld1VwZGF0
ZURpc3BhdGNoZXJNZXNzYWdlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBW
aWV3VXBkYXRlRGlzcGF0Y2hlck1lc3NhZ2VzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTI2RjlBODNBMThBMzQ2M0YwMEFFQjg4QSAvKiBXS1dlYlZpZXdQcml2YXRlLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IFdLV2ViVmlld1ByaXZhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJMjkwRjQyNzExNzJBMEM3NDAwOTM5RkYwIC8qIENoaWxkUHJvY2Vzc1N1cHBsZW1lbnQuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ2hpbGRQcm9jZXNzU3VwcGxlbWVudC5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkyOTIzMkRGMTE4QjI5RDExMDBEMDU5NkYg
LyogV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdE1hYy5tbSAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLm9iamNwcDsgcGF0aCA9IFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMubW07
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTI5MjMyREYzMThCMjlENjgwMEQwNTk2RiAv
KiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0TWFjLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMjkyMzJERjUxOEIyOURDRTAwRDA1OTZGIC8qIFdLQWNjZXNz
aWJpbGl0eVdlYlBhZ2VPYmplY3RJT1MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdElPUy5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQkyOTIzMkRGNjE4QjI5RENFMDBEMDU5NkYgLyogV0tBY2Nlc3NpYmlsaXR5V2Vi
UGFnZU9iamVjdElPUy5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9
IFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RJT1MubW07IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTI5M0VCRUE5MTYyN0Q5QzkwMDVGODlGMSAvKiBXS0RPTVRleHQuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV0tET01UZXh0Lmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTI5M0VCRUFBMTYyN0Q5QzkwMDVGODlGMSAvKiBXS0RPTVRleHQubW0gKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBXS0RPTVRleHQubW07IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTI5NTAxNzIzMTYyQTQ1MDQwMDRBOUQ3MSAvKiBXS1dl
YlByb2Nlc3NQbHVnSW5Ccm93c2VyQ29udGV4dENvbnRyb2xsZXJQcml2YXRlLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdLV2ViUHJvY2Vzc1BsdWdJbkJyb3dzZXJDb250ZXh0
Q29udHJvbGxlclByaXZhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTIyMTAs
OCArMjIxNyw4IEBACiAJCTI5QUQzMDkyMTY0QjRDNUQwMDcyREVBOSAvKiBDdXN0b21Qcm90b2Nv
bE1hbmFnZXJQcm94eS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBDdXN0b21Q
cm90b2NvbE1hbmFnZXJQcm94eS5oOyBwYXRoID0gQ3VzdG9tUHJvdG9jb2xzL0N1c3RvbVByb3Rv
Y29sTWFuYWdlclByb3h5Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTI5QUQzMDk1
MTY0QjRDOTMwMDcyREVBOSAvKiBDdXN0b21Qcm90b2NvbE1hbmFnZXJQcm94eU1hYy5tbSAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgbmFtZSA9IEN1c3RvbVByb3RvY29sTWFuYWdl
clByb3h5TWFjLm1tOyBwYXRoID0gQ3VzdG9tUHJvdG9jb2xzL21hYy9DdXN0b21Qcm90b2NvbE1h
bmFnZXJQcm94eU1hYy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMjlBRDMwOTcx
NjRCNEUyMTAwNzJERUE5IC8qIEN1c3RvbVByb3RvY29sTWFuYWdlclByb3h5Lm1lc3NhZ2VzLmlu
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IEN1c3RvbVByb3RvY29sTWFuYWdlclByb3h5Lm1lc3Nh
Z2VzLmluOyBwYXRoID0gQ3VzdG9tUHJvdG9jb2xzL0N1c3RvbVByb3RvY29sTWFuYWdlclByb3h5
Lm1lc3NhZ2VzLmluOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQkyOUNENTVBODEyOEUy
OTRGMDAxMzNDODUgLyogV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdC5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0Lmg7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTI5Q0Q1NUE5MTI4RTI5NEYwMDEzM0M4NSAvKiBX
S0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
b2JqY3BwOyBwYXRoID0gV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdC5tbTsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMjlDRDU1QTgxMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNjZXNz
aWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCTI5Q0Q1NUE5MTI4RTI5NEYwMDEzM0M4NSAvKiBXS0FjY2Vzc2liaWxpdHlX
ZWJQYWdlT2JqZWN0QmFzZS5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0
aCA9IFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLm1tOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkyOUQ1NURFRTE2MUJGODc4MDAzMUEyRTMgLyogV2ViUGFnZUdyb3VwUHJv
eHkubWVzc2FnZXMuaW4gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmls
ZVR5cGUgPSB0ZXh0OyBwYXRoID0gV2ViUGFnZUdyb3VwUHJveHkubWVzc2FnZXMuaW47IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTI5RDU1REVGMTYxQkY5RjEwMDMxQTJFMyAvKiBXZWJQ
YWdlR3JvdXBQcm94eU1lc3NhZ2VSZWNlaXZlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBXZWJQYWdlR3JvdXBQcm94eU1lc3NhZ2VSZWNlaXZlci5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTI5RDU1REYwMTYxQkY5RjEwMDMxQTJFMyAvKiBXZWJQ
YWdlR3JvdXBQcm94eU1lc3NhZ2VzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFdlYlBhZ2VHcm91cFByb3h5TWVzc2FnZXMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
QEAgLTQzNjMsNiArNDM3MCw4IEBACiAJCQljaGlsZHJlbiA9ICgKIAkJCQkyREE5NDRCNTE4ODRF
QTM1MDBFRDg2REIgLyogV2ViQmFja0ZvcndhcmRMaXN0UHJveHlJT1MubW0gKi8sCiAJCQkJMkRB
OTQ0QjYxODg0RUEzNTAwRUQ4NkRCIC8qIFdlYlBhZ2VJT1MubW0gKi8sCisJCQkJMjkyMzJERjUx
OEIyOURDRTAwRDA1OTZGIC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RJT1MuaCAqLywK
KwkJCQkyOTIzMkRGNjE4QjI5RENFMDBEMDU5NkYgLyogV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9i
amVjdElPUy5tbSAqLywKIAkJCSk7CiAJCQluYW1lID0gaW9zOwogCQkJc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsKQEAgLTU4NzMsOCArNTg4MiwxMCBAQAogCQkJCTFBQUYyNjM2MTQ2ODdDMzkwMDRB
MUU4QSAvKiBUaWxlZENvcmVBbmltYXRpb25EcmF3aW5nQXJlYS5tbSAqLywKIAkJCQkxQzhFMkRB
RDEyNzhDNUIyMDBCQzdCRDAgLyogV2ViSW5zcGVjdG9yTWFjLm1tICovLAogCQkJCUJDOTYzRDZE
MTEzREQxQTUwMDU3NEJFMiAvKiBXZWJQYWdlTWFjLm1tICovLAotCQkJCTI5Q0Q1NUE4MTI4RTI5
NEYwMDEzM0M4NSAvKiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0LmggKi8sCi0JCQkJMjlD
RDU1QTkxMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3QubW0g
Ki8sCisJCQkJMjlDRDU1QTgxMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBh
Z2VPYmplY3RCYXNlLmggKi8sCisJCQkJMjlDRDU1QTkxMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNj
ZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLm1tICovLAorCQkJCTI5MjMyREYzMThCMjlENjgw
MEQwNTk2RiAvKiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0TWFjLmggKi8sCisJCQkJMjky
MzJERjExOEIyOUQxMTAwRDA1OTZGIC8qIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMu
bW0gKi8sCiAJCQkpOwogCQkJcGF0aCA9IG1hYzsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
CkBAIC02OTA5LDcgKzY5MjAsNyBAQAogCQkJCUJDRTIzMTVEMTIyQzMwQ0EwMEQ1QzM1QSAvKiBB
UElVUkxSZXF1ZXN0LmggaW4gSGVhZGVycyAqLywKIAkJCQlCQzkwQTFEMjEyMkRENTVFMDBDQzhD
NTAgLyogQVBJVVJMUmVzcG9uc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCUY2MTEzRTI1MTI2Q0Ux
ODIwMDU3RDBBNyAvKiBXZWJVc2VyQ29udGVudFVSTFBhdHRlcm4uaCBpbiBIZWFkZXJzICovLAot
CQkJCTI5Q0Q1NUFBMTI4RTI5NEYwMDEzM0M4NSAvKiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2Jq
ZWN0LmggaW4gSGVhZGVycyAqLywKKwkJCQkyOUNENTVBQTEyOEUyOTRGMDAxMzNDODUgLyogV0tB
Y2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdEJhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRERC
MzJEMTI0RUMyRTEwMDQ4RDEzQyAvKiBXS0FQSUNhc3QuaCBpbiBIZWFkZXJzICovLAogCQkJCTUx
MkUzNEU1MTMwQjREMDUwMEFCRDE5QSAvKiBXS0FwcGxpY2F0aW9uQ2FjaGVNYW5hZ2VyLmggaW4g
SGVhZGVycyAqLywKIAkJCQlCQzQwNzVGNDEyNEZGMDI3MDA2OEYyMEEgLyogV0tBcnJheS5oIGlu
IEhlYWRlcnMgKi8sCkBAIC02OTM3LDYgKzY5NDgsNyBAQAogCQkJCTUxRUZDMUNGMTUyNEU2MjUw
MEM5QTkzOCAvKiBXS0J1bmRsZURPTVdpbmRvd0V4dGVuc2lvbi5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJQkNEMjVGMTcxMUQ2QkRFMTAwMTY5QjBFIC8qIFdLQnVuZGxlRnJhbWUuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUJDRjA0OUU2MTFGRTIwRjYwMEY4NkE1OCAvKiBXS0J1bmRsZUZyYW1lUHJpdmF0
ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMjkyMzJERjQxOEIyOUQ2ODAwRDA1OTZGIC8qIFdLQWNj
ZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDNDk4NjJG
MTI0RDE4QzEwMEQ4MzRFMSAvKiBXS0J1bmRsZUhpdFRlc3RSZXN1bHQuaCBpbiBIZWFkZXJzICov
LAogCQkJCUJDMjA0RUYyMTFDODNFQzgwMDhGMzM3NSAvKiBXS0J1bmRsZUluaXRpYWxpemUuaCBp
biBIZWFkZXJzICovLAogCQkJCTY1Qjg2RjFFMTJGMTFERTMwMEI3REQ4QSAvKiBXS0J1bmRsZUlu
c3BlY3Rvci5oIGluIEhlYWRlcnMgKi8sCkBAIC04MTU5LDYgKzgxNzEsNyBAQAogCQkJCUJDMTEx
QTVCMTEyRjRGQkIwMDMzN0JBQiAvKiBXZWJDb250ZXh0TWVudUNsaWVudC5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQk1MTAyMUU5QzEyQjE2Nzg4MDA1QzAzM0MgLyogV2ViQ29udGV4dE1lbnVDbGll
bnRNYWMubW0gaW4gU291cmNlcyAqLywKIAkJCQk1MTI5MzVENzEyODhEMTk0MDBBNEI2OTUgLyog
V2ViQ29udGV4dE1lbnVJdGVtLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTI5MjMyREY5MThCMkFC
M0EwMEQwNTk2RiAvKiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0TWFjLm1tIGluIFNvdXJj
ZXMgKi8sCiAJCQkJNTEwRkJCOUExMjg4Qzk1RTAwQUZGREY0IC8qIFdlYkNvbnRleHRNZW51SXRl
bURhdGEuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMkQ4MTlCQTExODYyODAwRTAwMUYwM0QxIC8q
IFZpZXdHZXN0dXJlR2VvbWV0cnlDb2xsZWN0b3JNZXNzYWdlUmVjZWl2ZXIuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJNTFBODRDRTMxMjdGMzg2QjAwQ0E2RUE0IC8qIFdlYkNvbnRleHRNZW51UHJv
eHkuY3BwIGluIFNvdXJjZXMgKi8sCkBAIC04MTgwLDYgKzgxOTMsNyBAQAogCQkJCUY2QTI1RkRD
MTJBREM2Q0MwMERDNDBDQyAvKiBXZWJEYXRhYmFzZU1hbmFnZXIuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJRjYyQTc2QjYxMkIxQjI1RjAwMDVGMUI2IC8qIFdlYkRhdGFiYXNlTWFuYWdlck1lc3Nh
Z2VSZWNlaXZlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1MUUzNTIwOTE4MEY1RDZCMDBFNTNC
RTkgLyogRGF0YWJhc2VTZXJ2aWNlRW50cnlQb2ludC5tbSBpbiBTb3VyY2VzICovLAorCQkJCTI5
MjMyREY4MThCMkE5QUUwMEQwNTk2RiAvKiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0SU9T
Lm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJM0Y0MThFRjkxODg3QkQ5NzAwMjc5NUZEIC8qIFdlYlZp
ZGVvRnVsbHNjcmVlbk1hbmFnZXJNZXNzYWdlUmVjZWl2ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJRjYyQTc2NUMxMkIxQUJDMzAwMDVGMUI2IC8qIFdlYkRhdGFiYXNlTWFuYWdlclByb3h5LmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCUJDQUMxMTIwMTJDOTJDMUYwMEIwOEVFRSAvKiBXZWJEYXRh
YmFzZU1hbmFnZXJQcm94eUNsaWVudC5jcHAgaW4gU291cmNlcyAqLywKQEAgLTgzMzYsNyArODM1
MCw3IEBACiAJCQkJQkM5MEExRDMxMjJERDU1RTAwQ0M4QzUwIC8qIEFQSVVSTFJlc3BvbnNlLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCUMwMzM3REQxMTI3QTI5ODAwMDhGRjRGNCAvKiBXZWJXaGVl
bEV2ZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTUxRkNCMTg1MTdCQkZFMDMwMDM5NENEOCAv
KiBBc3luY2hyb25vdXNOZXR3b3JrTG9hZGVyQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovLAotCQkJ
CTI5Q0Q1NUFCMTI4RTI5NEYwMDEzM0M4NSAvKiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0
Lm1tIGluIFNvdXJjZXMgKi8sCisJCQkJMjlDRDU1QUIxMjhFMjk0RjAwMTMzQzg1IC8qIFdLQWNj
ZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJMUFDNzUz
N0YxODNCRTUwRjAwNzJDQjE1IC8qIERhdGFSZWZlcmVuY2UuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJMEZDQjRFNDcxOEJCRTA0NDAwMEZDRkM5IC8qIFBhZ2VDbGllbnRJbXBsSU9TLm1tIGluIFNv
dXJjZXMgKi8sCiAJCQkJNTEyRTM0RTQxMzBCNEQwNTAwQUJEMTlBIC8qIFdLQXBwbGljYXRpb25D
YWNoZU1hbmFnZXIuY3BwIGluIFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQ
cm9jZXNzL1BsdWdpbnMvUERGL1BERlBsdWdpbi5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9XZWJQcm9jZXNzL1BsdWdpbnMvUERGL1BERlBsdWdpbi5tbQkocmV2aXNpb24gMTY0OTAx
KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9QbHVnaW5zL1BERi9QREZQbHVnaW4ubW0J
KHdvcmtpbmcgY29weSkKQEAgLTM4LDcgKzM4LDcgQEAKICNpbXBvcnQgIlBERlBsdWdpbkFubm90
YXRpb24uaCIKICNpbXBvcnQgIlBERlBsdWdpblBhc3N3b3JkRmllbGQuaCIKICNpbXBvcnQgIlBs
dWdpblZpZXcuaCIKLSNpbXBvcnQgIldLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3QuaCIKKyNp
bXBvcnQgIldLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMuaCIKICNpbXBvcnQgIldLUGFn
ZUZpbmRNYXRjaGVzQ2xpZW50LmgiCiAjaW1wb3J0ICJXZWJDb250ZXh0TWVzc2FnZXMuaCIKICNp
bXBvcnQgIldlYkNvcmVBcmd1bWVudENvZGVycy5oIgpJbmRleDogU291cmNlL1dlYktpdDIvV2Vi
UHJvY2Vzcy9XZWJQYWdlL1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RJT1MuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV0tBY2Nlc3NpYmlsaXR5
V2ViUGFnZU9iamVjdElPUy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvV2ViUHJv
Y2Vzcy9XZWJQYWdlL1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RJT1MuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisg
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBXS0FjY2Vzc2liaWxp
dHlXZWJQYWdlT2JqZWN0SU9TX2gKKyNkZWZpbmUgV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVj
dElPU19oCisKKyNpbmNsdWRlICJXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFzZS5oIgor
CitAaW50ZXJmYWNlIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3QgOiBXS0FjY2Vzc2liaWxp
dHlXZWJQYWdlT2JqZWN0QmFzZQorCitAcHJvcGVydHkobm9uYXRvbWljLCByZXRhaW4pIE5TRGF0
YSAqcmVtb3RlVG9rZW5EYXRhOworCitAZW5kCisKKyNlbmRpZiAvLyBXS0FjY2Vzc2liaWxpdHlX
ZWJQYWdlT2JqZWN0SU9TX2gKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFn
ZS9XS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0SU9TLm1tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0
SU9TLm1tCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdl
L1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RJT1MubW0JKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgImNvbmZpZy5oIgorI2ltcG9ydCAiV0tB
Y2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdElPUy5oIgorCisjaW1wb3J0ICJXZWJGcmFtZS5oIgor
I2ltcG9ydCAiV2ViUGFnZS5oIgorI2ltcG9ydCA8V2ViQ29yZS9GcmFtZVZpZXcuaD4KKworLyog
CisgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3Mgd2lsbCBiZSBhdWdtZW50ZWQgYnkg
YW4gYWNjZXNpYmlsaXR5IGJ1bmRsZSB0aGF0IGlzIGxvYWRlZCBvbmx5IHdoZW4gYWNjZXNzaWJp
bGl0eSBpcyByZXF1ZXN0ZWQgdG8gYmUgZW5hYmxlZC4KKyAqLworCitAaW1wbGVtZW50YXRpb24g
V0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdAorCistIChpZClpbml0Cit7CisgICAgc2VsZiA9
IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIXNlbGYpCisgICAgICAgIHJldHVybiBuaWw7CisgICAg
CisgICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjpz
ZWxmIHNlbGVjdG9yOkBzZWxlY3RvcihfYWNjZXNzaWJpbGl0eUNhdGVnb3J5SW5zdGFsbGVkOikg
bmFtZTpAIkFjY2Vzc2liaWxpdHlDYXRlZ29yeUluc3RhbGxlZCIgb2JqZWN0Om5pbF07CisKKyAg
ICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZClfYWNjZXNzaWJpbGl0eUNhdGVnb3J5SW5zdGFs
bGVkOihpZClub3RpZmljYXRpb24KK3sKKyAgICAvLyBBY2Nlc3NpYmlsaXR5IGJ1bmRsZSB3aWxs
IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHNvIHRoYXQgaXQga25vd3Mgd2hlbiB0byBpbml0aWFsaXpl
IHRoZSBhY2Nlc3NpYmlsaXR5IHJ1bnRpbWUgd2l0aGluIHRoZSBXZWJQcm9jZXNzLgorfQorCist
IChkb3VibGUpcGFnZVNjYWxlCit7CisgICAgcmV0dXJuIG1fcGFnZS0+cGFnZVNjYWxlRmFjdG9y
KCk7Cit9CisKKy0gKHZvaWQpZGVhbGxvYworeworICAgIFtbTlNOb3RpZmljYXRpb25DZW50ZXIg
ZGVmYXVsdENlbnRlcl0gcmVtb3ZlT2JzZXJ2ZXI6c2VsZl07CisgICAgc2VsZi5yZW1vdGVUb2tl
bkRhdGEgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCitAZW5kCkluZGV4OiBTb3Vy
Y2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmgJKHJldmlzaW9uIDE2NDkw
MSkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTc1NCw3ICs3NTQsNyBAQAogICAgIFBhc3NSZWZQdHI8V2ViQ29yZTo6UmFu
Z2U+IGV4cGFuZGVkUmFuZ2VGcm9tSGFuZGxlKFdlYkNvcmU6OlJhbmdlKiwgV0tIYW5kbGVQb3Np
dGlvbik7CiAgICAgUGFzc1JlZlB0cjxXZWJDb3JlOjpSYW5nZT4gY29udHJhY3RlZFJhbmdlRnJv
bUhhbmRsZShXZWJDb3JlOjpSYW5nZSogY3VycmVudFJhbmdlLCBXS0hhbmRsZVBvc2l0aW9uLCBX
S1NlbGVjdGlvbkZsYWdzJik7CiAgICAgdm9pZCBnZXRBc3Npc3RlZE5vZGVJbmZvcm1hdGlvbihB
c3Npc3RlZE5vZGVJbmZvcm1hdGlvbiYpOwotCisgICAgdm9pZCBwbGF0Zm9ybUluaXRpYWxpemVB
Y2Nlc3NpYmlsaXR5KCk7CiAgICAgUmVmUHRyPFdlYkNvcmU6OlJhbmdlPiBtX2N1cnJlbnRCbG9j
a1NlbGVjdGlvbjsKICNlbmRpZgogI2lmICFQTEFURk9STShDT0NPQSkKSW5kZXg6IFNvdXJjZS9X
ZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5tbQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvaW9zL1dlYlBhZ2VJT1MubW0JKHJl
dmlzaW9uIDE2NDkwMSkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9pb3Mv
V2ViUGFnZUlPUy5tbQkod29ya2luZyBjb3B5KQpAQCAtMjYsMTggKzI2LDI1IEBACiAjaW1wb3J0
ICJjb25maWcuaCIKICNpbXBvcnQgIldlYlBhZ2UuaCIKIAorPDw8PDw8PCAubWluZQorI2ltcG9y
dCAiRGF0YVJlZmVyZW5jZS5oIgorPT09PT09PQogI2lmIFBMQVRGT1JNKElPUykKIAorPj4+Pj4+
PiAucjE2NDkwMQogI2ltcG9ydCAiQXNzaXN0ZWROb2RlSW5mb3JtYXRpb24uaCIKICNpbXBvcnQg
IkVkaXRvclN0YXRlLmgiCiAjaW1wb3J0ICJJbnRlcmFjdGlvbkluZm9ybWF0aW9uQXRQb3NpdGlv
bi5oIgorI2ltcG9ydCAiUGx1Z2luVmlldy5oIgogI2ltcG9ydCAiTGF5ZXJUcmVlSG9zdC5oIgog
I2ltcG9ydCAiVmlzaWJsZUNvbnRlbnRSZWN0VXBkYXRlSW5mby5oIgogI2ltcG9ydCAiV2ViQ2hy
b21lQ2xpZW50LmgiCiAjaW1wb3J0ICJXZWJDb3JlQXJndW1lbnRDb2RlcnMuaCIKKyNpbXBvcnQg
IldlYktpdFN5c3RlbUludGVyZmFjZUlPUy5oIgogI2ltcG9ydCAiV2ViRnJhbWUuaCIKICNpbXBv
cnQgIldlYlBhZ2VQcm94eU1lc3NhZ2VzLmgiCiAjaW1wb3J0ICJXZWJQcm9jZXNzLmgiCisjaW1w
b3J0ICJXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0SU9TLmgiCiAjaW1wb3J0ICJXS0dlc3R1
cmVUeXBlcy5oIgogI2ltcG9ydCA8Q29yZVRleHQvQ1RGb250Lmg+CiAjaW1wb3J0IDxXZWJDb3Jl
L0Nocm9tZS5oPgpAQCAtODAsOSArODcsMjIgQEAKIAogdm9pZCBXZWJQYWdlOjpwbGF0Zm9ybUlu
aXRpYWxpemUoKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcGxhdGZvcm1Jbml0aWFs
aXplQWNjZXNzaWJpbGl0eSgpOwogfQogCit2b2lkIFdlYlBhZ2U6OnBsYXRmb3JtSW5pdGlhbGl6
ZUFjY2Vzc2liaWxpdHkoKQoreworICAgIG1fbW9ja0FjY2Vzc2liaWxpdHlFbGVtZW50ID0gW1tb
V0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdCBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwor
ICAgIFttX21vY2tBY2Nlc3NpYmlsaXR5RWxlbWVudCBzZXRXZWJQYWdlOnRoaXNdOworICAgIAor
ICAgIENGVVVJRFJlZiB1dWlkID0gQ0ZVVUlEQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQpOwor
ICAgIE5TRGF0YSAqcmVtb3RlVG9rZW4gPSBXS0FYUmVtb3RlVG9rZW4odXVpZCk7CisgICAgQ0ZS
ZWxlYXNlKHV1aWQpOworICAgIAorICAgIElQQzo6RGF0YVJlZmVyZW5jZSBkYXRhVG9rZW4gPSBJ
UEM6OkRhdGFSZWZlcmVuY2UocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oW3JlbW90
ZVRva2VuIGJ5dGVzXSksIFtyZW1vdGVUb2tlbiBsZW5ndGhdKTsKKyAgICBzZW5kKE1lc3NhZ2Vz
OjpXZWJQYWdlUHJveHk6OlJlZ2lzdGVyV2ViUHJvY2Vzc0FjY2Vzc2liaWxpdHlUb2tlbihkYXRh
VG9rZW4pKTsKK30KKyAgICAKIHZvaWQgV2ViUGFnZTo6cGxhdGZvcm1QcmVmZXJlbmNlc0RpZENo
YW5nZShjb25zdCBXZWJQcmVmZXJlbmNlc1N0b3JlJikKIHsKICAgICBub3RJbXBsZW1lbnRlZCgp
OwpAQCAtMjU0LDEwICsyNzQsMjIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgV2Vi
UGFnZTo6cmVnaXN0ZXJVSVByb2Nlc3NBY2Nlc3NpYmlsaXR5VG9rZW5zKGNvbnN0IElQQzo6RGF0
YVJlZmVyZW5jZSYsIGNvbnN0IElQQzo6RGF0YVJlZmVyZW5jZSYpCitOU09iamVjdCAqV2ViUGFn
ZTo6YWNjZXNzaWJpbGl0eU9iamVjdEZvck1haW5GcmFtZVBsdWdpbigpCiB7Ci0gICAgbm90SW1w
bGVtZW50ZWQoKTsKKyAgICBpZiAoIW1fcGFnZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisg
ICAgaWYgKFBsdWdpblZpZXcqIHBsdWdpblZpZXcgPSBwbHVnaW5WaWV3Rm9yRnJhbWUoJm1fcGFn
ZS0+bWFpbkZyYW1lKCkpKQorICAgICAgICByZXR1cm4gcGx1Z2luVmlldy0+YWNjZXNzaWJpbGl0
eU9iamVjdCgpOworICAgIAorICAgIHJldHVybiAwOwogfQorICAgIAordm9pZCBXZWJQYWdlOjpy
ZWdpc3RlclVJUHJvY2Vzc0FjY2Vzc2liaWxpdHlUb2tlbnMoY29uc3QgSVBDOjpEYXRhUmVmZXJl
bmNlJiBlbGVtZW50VG9rZW4sIGNvbnN0IElQQzo6RGF0YVJlZmVyZW5jZSYpCit7CisgICAgTlNE
YXRhICplbGVtZW50VG9rZW5EYXRhID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOmVsZW1lbnRUb2tl
bi5kYXRhKCkgbGVuZ3RoOmVsZW1lbnRUb2tlbi5zaXplKCldOworICAgIFttX21vY2tBY2Nlc3Np
YmlsaXR5RWxlbWVudCBzZXRSZW1vdGVUb2tlbkRhdGE6ZWxlbWVudFRva2VuRGF0YV07Cit9CiAK
IHZvaWQgV2ViUGFnZTo6cmVhZFNlbGVjdGlvbkZyb21QYXN0ZWJvYXJkKGNvbnN0IFN0cmluZyYs
IGJvb2wmKQogewpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9X
S0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVj
dEJhc2UuaAkod29ya2luZyBjb3B5KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQ
YWdlL21hYy9XS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFzZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yMywyNSArMjMsMjQgQEAKICAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
ICAqLwogCi0jaWZuZGVmIFdLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RfaAotI2RlZmluZSBX
S0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0X2gKKyNpZm5kZWYgV0tBY2Nlc3NpYmlsaXR5V2Vi
UGFnZU9iamVjdEJhc2VfaAorI2RlZmluZSBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFz
ZV9oCiAKIG5hbWVzcGFjZSBXZWJLaXQgewogY2xhc3MgV2ViUGFnZTsKIH0KIAotQGludGVyZmFj
ZSBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0IDogTlNPYmplY3QgeworQGludGVyZmFjZSBX
S0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFzZSA6IE5TT2JqZWN0IHsKICAgICBXZWJLaXQ6
OldlYlBhZ2UqIG1fcGFnZTsKLSAgICAKICAgICBpZCBtX3BhcmVudDsKLSAgICBOU0FycmF5KiBt
X2F0dHJpYnV0ZU5hbWVzOwotICAgIE5TTXV0YWJsZUFycmF5KiBtX2FjY2Vzc2liaWxpdHlDaGls
ZHJlbjsKIH0KIAogLSAodm9pZClzZXRXZWJQYWdlOihXZWJLaXQ6OldlYlBhZ2UqKXBhZ2U7Ci0K
IC0gKHZvaWQpc2V0UmVtb3RlUGFyZW50OihpZClwYXJlbnQ7CiAKKy0gKGlkKWFjY2Vzc2liaWxp
dHlSb290T2JqZWN0V3JhcHBlcjsKKy0gKGlkKWFjY2Vzc2liaWxpdHlGb2N1c2VkVUlFbGVtZW50
OworCiBAZW5kCiAKLSNlbmRpZiAvLyBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0X2gKKyNl
bmRpZiAvLyBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFzZV9oCkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmpl
Y3RCYXNlLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFn
ZS9tYWMvV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdEJhc2UubW0JKHdvcmtpbmcgY29weSkK
KysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvV0tBY2Nlc3NpYmlsaXR5
V2ViUGFnZU9iamVjdEJhc2UubW0JKHdvcmtpbmcgY29weSkKQEAgLTI0LDcgKzI0LDcgQEAKICAq
LwogCiAjaW1wb3J0ICJjb25maWcuaCIKLSNpbXBvcnQgIldLQWNjZXNzaWJpbGl0eVdlYlBhZ2VP
YmplY3QuaCIKKyNpbXBvcnQgIldLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RCYXNlLmgiCiAK
ICNpbXBvcnQgIldlYkZyYW1lLmgiCiAjaW1wb3J0ICJXZWJQYWdlLmgiCkBAIC00Niw3ICs0Niw3
IEBACiB1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKIHVzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7CiAK
LUBpbXBsZW1lbnRhdGlvbiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0CitAaW1wbGVtZW50
YXRpb24gV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdEJhc2UKIAogLSAoaWQpYWNjZXNzaWJp
bGl0eVJvb3RPYmplY3RXcmFwcGVyCiB7CkBAIC04NSwxNzEgKzg1LDggQEAKICAgICB9CiB9CiAK
LS0gKHZvaWQpZGVhbGxvYworLSAoaWQpYWNjZXNzaWJpbGl0eUZvY3VzZWRVSUVsZW1lbnQKIHsK
LSAgICBXS1VucmVnaXN0ZXJVbmlxdWVJZEZvckVsZW1lbnQoc2VsZik7Ci0gICAgW21fYWNjZXNz
aWJpbGl0eUNoaWxkcmVuIHJlbGVhc2VdOwotICAgIFttX2F0dHJpYnV0ZU5hbWVzIHJlbGVhc2Vd
OwotICAgIFttX3BhcmVudCByZWxlYXNlXTsKLSAgICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0g
KEJPT0wpYWNjZXNzaWJpbGl0eUlzSWdub3JlZAotewotICAgIHJldHVybiBOTzsKLX0KLQotLSAo
TlNBcnJheSAqKWFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVOYW1lcwotewotICAgIGlmICghbV9hdHRy
aWJ1dGVOYW1lcykKLSAgICAgICAgbV9hdHRyaWJ1dGVOYW1lcyA9IFtbTlNBcnJheSBhbGxvY10g
aW5pdFdpdGhPYmplY3RzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNBY2Nlc3NpYmls
aXR5Um9sZUF0dHJpYnV0ZSwgTlNBY2Nlc3NpYmlsaXR5Um9sZURlc2NyaXB0aW9uQXR0cmlidXRl
LCBOU0FjY2Vzc2liaWxpdHlGb2N1c2VkQXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgTlNBY2Nlc3NpYmlsaXR5UGFyZW50QXR0cmlidXRlLCBOU0FjY2Vzc2liaWxpdHlXaW5k
b3dBdHRyaWJ1dGUsIE5TQWNjZXNzaWJpbGl0eVRvcExldmVsVUlFbGVtZW50QXR0cmlidXRlLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNBY2Nlc3NpYmlsaXR5UG9zaXRpb25BdHRyaWJ1
dGUsIE5TQWNjZXNzaWJpbGl0eVNpemVBdHRyaWJ1dGUsIE5TQWNjZXNzaWJpbGl0eUNoaWxkcmVu
QXR0cmlidXRlLCBuaWxdOwotCi0gICAgcmV0dXJuIG1fYXR0cmlidXRlTmFtZXM7Ci19Ci0KLS0g
KE5TQXJyYXkgKilhY2Nlc3NpYmlsaXR5UGFyYW1ldGVyaXplZEF0dHJpYnV0ZU5hbWVzCi17Ci0g
ICAgV0tSZXRhaW5QdHI8V0tBcnJheVJlZj4gcmVzdWx0ID0gYWRvcHRXSyhtX3BhZ2UtPnBhZ2VP
dmVybGF5Q29weUFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVzTmFtZXModHJ1ZSkpOwotICAgIGlmICgh
cmVzdWx0KQotICAgICAgICByZXR1cm4gbmlsOwotICAgIAotICAgIE5TTXV0YWJsZUFycmF5ICpu
YW1lcyA9IFtOU011dGFibGVBcnJheSBhcnJheV07Ci0gICAgc2l6ZV90IGNvdW50ID0gV0tBcnJh
eUdldFNpemUocmVzdWx0LmdldCgpKTsKLSAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGNvdW50
OyBrKyspIHsKLSAgICAgICAgV0tUeXBlUmVmIGl0ZW0gPSBXS0FycmF5R2V0SXRlbUF0SW5kZXgo
cmVzdWx0LmdldCgpLCBrKTsKLSAgICAgICAgaWYgKHRvSW1wbChpdGVtKS0+dHlwZSgpID09IEFQ
STo6U3RyaW5nOjpBUElUeXBlKSB7Ci0gICAgICAgICAgICBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+
IG5hbWUgPSBhZG9wdENGKFdLU3RyaW5nQ29weUNGU3RyaW5nKGtDRkFsbG9jYXRvckRlZmF1bHQs
IChXS1N0cmluZ1JlZilpdGVtKSk7Ci0gICAgICAgICAgICBbbmFtZXMgYWRkT2JqZWN0OihOU1N0
cmluZyAqKW5hbWUuZ2V0KCldOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBu
YW1lczsKLX0KLQotLSAoQk9PTClhY2Nlc3NpYmlsaXR5SXNBdHRyaWJ1dGVTZXR0YWJsZTooTlNT
dHJpbmcgKilhdHRyaWJ1dGUKLXsKLSAgICByZXR1cm4gTk87Ci19Ci0KLS0gKHZvaWQpYWNjZXNz
aWJpbGl0eVNldFZhbHVlOihpZCl2YWx1ZSBmb3JBdHRyaWJ1dGU6KE5TU3RyaW5nICopYXR0cmli
dXRlIAotewotICAgIHJldHVybjsKLX0KLQotLSAoTlNBcnJheSAqKWFjY2Vzc2liaWxpdHlBY3Rp
b25OYW1lcwotewotICAgIHJldHVybiBbTlNBcnJheSBhcnJheV07Ci19Ci0KLS0gKE5TQXJyYXkg
KilhY2Nlc3NpYmlsaXR5Q2hpbGRyZW4KLXsKLSAgICBpZCB3cmFwcGVyID0gW3NlbGYgYWNjZXNz
aWJpbGl0eVJvb3RPYmplY3RXcmFwcGVyXTsKLSAgICBpZiAoIXdyYXBwZXIpCi0gICAgICAgIHJl
dHVybiBbTlNBcnJheSBhcnJheV07Ci0KLSAgICByZXR1cm4gW05TQXJyYXkgYXJyYXlXaXRoT2Jq
ZWN0OndyYXBwZXJdOwotfQotCi0tIChpZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5T
U3RyaW5nICopYXR0cmlidXRlCi17Ci0gICAgaWYgKCFXZWJDb3JlOjpBWE9iamVjdENhY2hlOjph
Y2Nlc3NpYmlsaXR5RW5hYmxlZCgpKQotICAgICAgICBXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpl
bmFibGVBY2Nlc3NpYmlsaXR5KCk7Ci0gICAgCi0gICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRv
U3RyaW5nOk5TQWNjZXNzaWJpbGl0eVBhcmVudEF0dHJpYnV0ZV0pCi0gICAgICAgIHJldHVybiBt
X3BhcmVudDsKLSAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6TlNBY2Nlc3NpYmls
aXR5V2luZG93QXR0cmlidXRlXSkKLSAgICAgICAgcmV0dXJuIFttX3BhcmVudCBhY2Nlc3NpYmls
aXR5QXR0cmlidXRlVmFsdWU6TlNBY2Nlc3NpYmlsaXR5V2luZG93QXR0cmlidXRlXTsKLSAgICBp
ZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6TlNBY2Nlc3NpYmlsaXR5VG9wTGV2ZWxVSUVs
ZW1lbnRBdHRyaWJ1dGVdKQotICAgICAgICByZXR1cm4gW21fcGFyZW50IGFjY2Vzc2liaWxpdHlB
dHRyaWJ1dGVWYWx1ZTpOU0FjY2Vzc2liaWxpdHlUb3BMZXZlbFVJRWxlbWVudEF0dHJpYnV0ZV07
Ci0gICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOk5TQWNjZXNzaWJpbGl0eVJvbGVB
dHRyaWJ1dGVdKQotICAgICAgICByZXR1cm4gTlNBY2Nlc3NpYmlsaXR5R3JvdXBSb2xlOwotICAg
IGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpOU0FjY2Vzc2liaWxpdHlSb2xlRGVzY3Jp
cHRpb25BdHRyaWJ1dGVdKQotICAgICAgICByZXR1cm4gTlNBY2Nlc3NpYmlsaXR5Um9sZURlc2Ny
aXB0aW9uKE5TQWNjZXNzaWJpbGl0eUdyb3VwUm9sZSwgbmlsKTsKLSAgICBpZiAoW2F0dHJpYnV0
ZSBpc0VxdWFsVG9TdHJpbmc6TlNBY2Nlc3NpYmlsaXR5Rm9jdXNlZEF0dHJpYnV0ZV0pCi0gICAg
ICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6Tk9dOwotCi0gICAgaWYgKCFtX3Bh
Z2UpCi0gICAgICAgIHJldHVybiBuaWw7Ci0KLSAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9T
dHJpbmc6TlNBY2Nlc3NpYmlsaXR5UG9zaXRpb25BdHRyaWJ1dGVdKSB7Ci0gICAgICAgIGNvbnN0
IFdlYkNvcmU6OkZsb2F0UG9pbnQmIHBvaW50ID0gbV9wYWdlLT5hY2Nlc3NpYmlsaXR5UG9zaXRp
b24oKTsKLSAgICAgICAgcmV0dXJuIFtOU1ZhbHVlIHZhbHVlV2l0aFBvaW50Ok5TTWFrZVBvaW50
KHBvaW50LngoKSwgcG9pbnQueSgpKV07Ci0gICAgfQotICAgIGlmIChbYXR0cmlidXRlIGlzRXF1
YWxUb1N0cmluZzpOU0FjY2Vzc2liaWxpdHlTaXplQXR0cmlidXRlXSkgewotICAgICAgICBjb25z
dCBJbnRTaXplJiBzID0gbV9wYWdlLT5zaXplKCk7Ci0gICAgICAgIHJldHVybiBbTlNWYWx1ZSB2
YWx1ZVdpdGhTaXplOk5TTWFrZVNpemUocy53aWR0aCgpLCBzLmhlaWdodCgpKV07Ci0gICAgfQot
ICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpOU0FjY2Vzc2liaWxpdHlDaGlsZHJl
bkF0dHJpYnV0ZV0pCi0gICAgICAgIHJldHVybiBbc2VsZiBhY2Nlc3NpYmlsaXR5Q2hpbGRyZW5d
OwotCi0gICAgcmV0dXJuIG5pbDsKLX0KLQotLSAoTlNQb2ludClfY29udmVydFNjcmVlblBvaW50
VG9Sb290VmlldzooTlNQb2ludClwb2ludAotewotICAgIHJldHVybiBtX3BhZ2UtPnNjcmVlblRv
Um9vdFZpZXcoSW50UG9pbnQocG9pbnQueCwgcG9pbnQueSkpOwotfQotCi0tIChpZClhY2Nlc3Np
YmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyaW5nICopYXR0cmlidXRlIGZvclBhcmFtZXRlcjoo
aWQpcGFyYW1ldGVyCi17Ci0gICAgV0tSZXRhaW5QdHI8V0tUeXBlUmVmPiBwYWdlT3ZlcmxheVBh
cmFtZXRlciA9IDA7Ci0gICAgCi0gICAgaWYgKFtwYXJhbWV0ZXIgaXNLaW5kT2ZDbGFzczpbTlNW
YWx1ZSBjbGFzc11dICYmIHN0cmNtcChbKE5TVmFsdWUqKXBhcmFtZXRlciBvYmpDVHlwZV0sIEBl
bmNvZGUoTlNQb2ludCkpID09IDApIHsKLSAgICAgICAgTlNQb2ludCBwb2ludCA9IFtzZWxmIF9j
b252ZXJ0U2NyZWVuUG9pbnRUb1Jvb3RWaWV3OlsoTlNWYWx1ZSAqKXBhcmFtZXRlciBwb2ludFZh
bHVlXV07Ci0gICAgICAgIHBhZ2VPdmVybGF5UGFyYW1ldGVyID0gV0tQb2ludENyZWF0ZShXS1Bv
aW50TWFrZShwb2ludC54LCBwb2ludC55KSk7Ci0gICAgfQotICAgIAotICAgIFdLUmV0YWluUHRy
PFdLU3RyaW5nUmVmPiBhdHRyaWJ1dGVSZWYgPSBhZG9wdFdLKFdLU3RyaW5nQ3JlYXRlV2l0aENG
U3RyaW5nKChDRlN0cmluZ1JlZilhdHRyaWJ1dGUpKTsKLSAgICBXS1JldGFpblB0cjxXS1R5cGVS
ZWY+IHJlc3VsdCA9IGFkb3B0V0sobV9wYWdlLT5wYWdlT3ZlcmxheUNvcHlBY2Nlc3NpYmlsaXR5
QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlUmVmLmdldCgpLCBwYWdlT3ZlcmxheVBhcmFtZXRlci5n
ZXQoKSkpOwotICAgIGlmICghcmVzdWx0KQotICAgICAgICByZXR1cm4gbmlsOwotICAgIAotICAg
IGlmICh0b0ltcGwocmVzdWx0LmdldCgpKS0+dHlwZSgpID09IEFQSTo6U3RyaW5nOjpBUElUeXBl
KQotICAgICAgICByZXR1cm4gQ0ZCcmlkZ2luZ1JlbGVhc2UoV0tTdHJpbmdDb3B5Q0ZTdHJpbmco
a0NGQWxsb2NhdG9yRGVmYXVsdCwgKFdLU3RyaW5nUmVmKXJlc3VsdC5nZXQoKSkpOwotICAgIGVs
c2UgaWYgKHRvSW1wbChyZXN1bHQuZ2V0KCkpLT50eXBlKCkgPT0gQVBJOjpCb29sZWFuOjpBUElU
eXBlKQotICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldpdGhCb29sOldLQm9vbGVhbkdl
dFZhbHVlKHN0YXRpY19jYXN0PFdLQm9vbGVhblJlZj4ocmVzdWx0LmdldCgpKSldOwotCi0gICAg
cmV0dXJuIG5pbDsKLX0KLQotLSAoQk9PTClhY2Nlc3NpYmlsaXR5U2hvdWxkVXNlVW5pcXVlSWQK
LXsKLSAgICByZXR1cm4gWUVTOwotfQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAot
I3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlv
bnMiCi0tIChpZClhY2Nlc3NpYmlsaXR5SGl0VGVzdDooTlNQb2ludClwb2ludCAKLXsKLSAgICAv
LyBIaXQtdGVzdCBwb2ludCBjb21lcyBpbiBhcyBib3R0b20tc2NyZWVuIGNvb3JkaW5hdGVzLiBO
ZWVkcyB0byBiZSBub3JtYWxpemVkIHRvIHRoZSBmcmFtZSBvZiB0aGUgd2ViIHBhZ2UuCi0gICAg
TlNQb2ludCByZW1vdGVQb3NpdGlvbiA9IFtbc2VsZiBhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFs
dWU6TlNBY2Nlc3NpYmlsaXR5UG9zaXRpb25BdHRyaWJ1dGVdIHBvaW50VmFsdWVdOwotICAgIE5T
U2l6ZSByZW1vdGVTaXplID0gW1tzZWxmIGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTpOU0Fj
Y2Vzc2liaWxpdHlTaXplQXR0cmlidXRlXSBzaXplVmFsdWVdOwotICAgIAotICAgIC8vIEdldCB0
aGUgeSBwb3NpdGlvbiBvZiB0aGUgV0tWaWV3ICh3ZSBoYXZlIHRvIHNjcmVlbi1mbGlwIGFuZCBn
byBmcm9tIGJvdHRvbSBsZWZ0IHRvIHRvcCBsZWZ0KS4KLSAgICBDR0Zsb2F0IHNjcmVlbkhlaWdo
dCA9IFsoTlNTY3JlZW4gKilbW05TU2NyZWVuIHNjcmVlbnNdIG9iamVjdEF0SW5kZXg6MF0gZnJh
bWVdLnNpemUuaGVpZ2h0OwotICAgIHJlbW90ZVBvc2l0aW9uLnkgPSAoc2NyZWVuSGVpZ2h0IC0g
cmVtb3RlUG9zaXRpb24ueSkgLSByZW1vdGVTaXplLmhlaWdodDsKLSAgICAKLSAgICBwb2ludC55
ID0gc2NyZWVuSGVpZ2h0IC0gcG9pbnQueTsKLQotICAgIC8vIFJlLWNlbnRlciBwb2ludCBpbnRv
IHRoZSB3ZWIgcGFnZSdzIGZyYW1lLgotICAgIHBvaW50LnkgLT0gcmVtb3RlUG9zaXRpb24ueTsK
LSAgICBwb2ludC54IC09IHJlbW90ZVBvc2l0aW9uLng7Ci0gICAgCi0gICAgV2ViQ29yZTo6RnJh
bWVWaWV3KiBmcmFtZVZpZXcgPSBtX3BhZ2UgPyBtX3BhZ2UtPm1haW5GcmFtZVZpZXcoKSA6IDA7
Ci0gICAgaWYgKGZyYW1lVmlldykgewotICAgICAgICBwb2ludC55ICs9IGZyYW1lVmlldy0+c2Ny
b2xsUG9zaXRpb24oKS55KCk7Ci0gICAgICAgIHBvaW50LnggKz0gZnJhbWVWaWV3LT5zY3JvbGxQ
b3NpdGlvbigpLngoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFtbc2VsZiBhY2Nlc3NpYmls
aXR5Um9vdE9iamVjdFdyYXBwZXJdIGFjY2Vzc2liaWxpdHlIaXRUZXN0OnBvaW50XTsKLX0KLSNw
cmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQotLSAoaWQpYWNjZXNzaWJpbGl0eUZvY3VzZWRV
SUVsZW1lbnQgCi17CiAgICAgcmV0dXJuIFtbc2VsZiBhY2Nlc3NpYmlsaXR5Um9vdE9iamVjdFdy
YXBwZXJdIGFjY2Vzc2liaWxpdHlGb2N1c2VkVUlFbGVtZW50XTsKIH0KIApJbmRleDogU291cmNl
L1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9XS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2Jq
ZWN0TWFjLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdl
L21hYy9XS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0TWFjLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1dLQWNjZXNzaWJpbGl0eVdlYlBh
Z2VPYmplY3RNYWMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2lmbmRlZiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0TWFjX2gKKyNkZWZpbmUgV0tB
Y2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdE1hY19oCisKKyNpbmNsdWRlICJXS0FjY2Vzc2liaWxp
dHlXZWJQYWdlT2JqZWN0QmFzZS5oIgorCitAaW50ZXJmYWNlIFdLQWNjZXNzaWJpbGl0eVdlYlBh
Z2VPYmplY3QgOiBXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0QmFzZSB7CisgICAgTlNBcnJh
eSogbV9hdHRyaWJ1dGVOYW1lczsKKyAgICBOU011dGFibGVBcnJheSogbV9hY2Nlc3NpYmlsaXR5
Q2hpbGRyZW47Cit9CisKKy0gKE5TUG9pbnQpY29udmVydFNjcmVlblBvaW50VG9Sb290Vmlldzoo
TlNQb2ludClwb2ludDsKKworQGVuZAorCisjZW5kaWYgLy8gV0tBY2Nlc3NpYmlsaXR5V2ViUGFn
ZU9iamVjdE1hY19oCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFj
L1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMubW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9XS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2Jq
ZWN0TWFjLm1tCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQ
YWdlL21hYy9XS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0TWFjLm1tCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2ltcG9ydCAiY29uZmlnLmgiCisjaW1w
b3J0ICJXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2JqZWN0TWFjLmgiCisKKyNpbXBvcnQgIldlYkZy
YW1lLmgiCisjaW1wb3J0ICJXZWJQYWdlLmgiCisjaW1wb3J0ICJXS0FycmF5LmgiCisjaW1wb3J0
ICJXS051bWJlci5oIgorI2ltcG9ydCAiV0tSZXRhaW5QdHIuaCIKKyNpbXBvcnQgIldLU2hhcmVk
QVBJQ2FzdC5oIgorI2ltcG9ydCAiV0tTdHJpbmcuaCIKKyNpbXBvcnQgIldLU3RyaW5nQ0YuaCIK
KyNpbXBvcnQgPFdlYkNvcmUvQVhPYmplY3RDYWNoZS5oPgorI2ltcG9ydCA8V2ViQ29yZS9GcmFt
ZVZpZXcuaD4KKyNpbXBvcnQgPFdlYkNvcmUvTWFpbkZyYW1lLmg+CisjaW1wb3J0IDxXZWJDb3Jl
L1BhZ2UuaD4KKyNpbXBvcnQgPFdlYkNvcmUvU2Nyb2xsVmlldy5oPgorI2ltcG9ydCA8V2ViQ29y
ZS9TY3JvbGxiYXIuaD4KKyNpbXBvcnQgPFdlYktpdFN5c3RlbUludGVyZmFjZS5oPgorI2ltcG9y
dCA8d3RmL09iamNSdW50aW1lRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwor
dXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKKworQGltcGxlbWVudGF0aW9uIFdLQWNjZXNzaWJpbGl0
eVdlYlBhZ2VPYmplY3QKKworLSAodm9pZClkZWFsbG9jCit7CisgICAgV0tVbnJlZ2lzdGVyVW5p
cXVlSWRGb3JFbGVtZW50KHNlbGYpOworICAgIFttX2FjY2Vzc2liaWxpdHlDaGlsZHJlbiByZWxl
YXNlXTsKKyAgICBbbV9hdHRyaWJ1dGVOYW1lcyByZWxlYXNlXTsKKyAgICBbbV9wYXJlbnQgcmVs
ZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistIChCT09MKWFjY2Vzc2liaWxpdHlJ
c0lnbm9yZWQKK3sKKyAgICByZXR1cm4gTk87Cit9CisKKy0gKE5TQXJyYXkgKilhY2Nlc3NpYmls
aXR5QXR0cmlidXRlTmFtZXMKK3sKKyAgICBpZiAoIW1fYXR0cmlidXRlTmFtZXMpCisgICAgICAg
IG1fYXR0cmlidXRlTmFtZXMgPSBbW05TQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czoKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBOU0FjY2Vzc2liaWxpdHlSb2xlQXR0cmlidXRlLCBO
U0FjY2Vzc2liaWxpdHlSb2xlRGVzY3JpcHRpb25BdHRyaWJ1dGUsIE5TQWNjZXNzaWJpbGl0eUZv
Y3VzZWRBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNBY2Nlc3NpYmls
aXR5UGFyZW50QXR0cmlidXRlLCBOU0FjY2Vzc2liaWxpdHlXaW5kb3dBdHRyaWJ1dGUsIE5TQWNj
ZXNzaWJpbGl0eVRvcExldmVsVUlFbGVtZW50QXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIE5TQWNjZXNzaWJpbGl0eVBvc2l0aW9uQXR0cmlidXRlLCBOU0FjY2Vzc2liaWxp
dHlTaXplQXR0cmlidXRlLCBOU0FjY2Vzc2liaWxpdHlDaGlsZHJlbkF0dHJpYnV0ZSwgbmlsXTsK
KyAgICAKKyAgICByZXR1cm4gbV9hdHRyaWJ1dGVOYW1lczsKK30KKworLSAoTlNBcnJheSAqKWFj
Y2Vzc2liaWxpdHlQYXJhbWV0ZXJpemVkQXR0cmlidXRlTmFtZXMKK3sKKyAgICBXS1JldGFpblB0
cjxXS0FycmF5UmVmPiByZXN1bHQgPSBhZG9wdFdLKG1fcGFnZS0+cGFnZU92ZXJsYXlDb3B5QWNj
ZXNzaWJpbGl0eUF0dHJpYnV0ZXNOYW1lcyh0cnVlKSk7CisgICAgaWYgKCFyZXN1bHQpCisgICAg
ICAgIHJldHVybiBuaWw7CisgICAgCisgICAgTlNNdXRhYmxlQXJyYXkgKm5hbWVzID0gW05TTXV0
YWJsZUFycmF5IGFycmF5XTsKKyAgICBzaXplX3QgY291bnQgPSBXS0FycmF5R2V0U2l6ZShyZXN1
bHQuZ2V0KCkpOworICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgY291bnQ7IGsrKykgeworICAg
ICAgICBXS1R5cGVSZWYgaXRlbSA9IFdLQXJyYXlHZXRJdGVtQXRJbmRleChyZXN1bHQuZ2V0KCks
IGspOworICAgICAgICBpZiAodG9JbXBsKGl0ZW0pLT50eXBlKCkgPT0gQVBJOjpTdHJpbmc6OkFQ
SVR5cGUpIHsKKyAgICAgICAgICAgIFJldGFpblB0cjxDRlN0cmluZ1JlZj4gbmFtZSA9IGFkb3B0
Q0YoV0tTdHJpbmdDb3B5Q0ZTdHJpbmcoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKFdLU3RyaW5nUmVm
KWl0ZW0pKTsKKyAgICAgICAgICAgIFtuYW1lcyBhZGRPYmplY3Q6KE5TU3RyaW5nICopbmFtZS5n
ZXQoKV07CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIG5hbWVzOworfQorCist
IChCT09MKWFjY2Vzc2liaWxpdHlJc0F0dHJpYnV0ZVNldHRhYmxlOihOU1N0cmluZyAqKWF0dHJp
YnV0ZQoreworICAgIHJldHVybiBOTzsKK30KKworLSAodm9pZClhY2Nlc3NpYmlsaXR5U2V0VmFs
dWU6KGlkKXZhbHVlIGZvckF0dHJpYnV0ZTooTlNTdHJpbmcgKilhdHRyaWJ1dGUKK3sKKyAgICBy
ZXR1cm47Cit9CisKKy0gKE5TUG9pbnQpY29udmVydFNjcmVlblBvaW50VG9Sb290VmlldzooTlNQ
b2ludClwb2ludAoreworICAgIHJldHVybiBtX3BhZ2UtPnNjcmVlblRvUm9vdFZpZXcoSW50UG9p
bnQocG9pbnQueCwgcG9pbnQueSkpOworfQorCistIChOU0FycmF5ICopYWNjZXNzaWJpbGl0eUFj
dGlvbk5hbWVzCit7CisgICAgcmV0dXJuIFtOU0FycmF5IGFycmF5XTsKK30KKworLSAoTlNBcnJh
eSAqKWFjY2Vzc2liaWxpdHlDaGlsZHJlbgoreworICAgIGlkIHdyYXBwZXIgPSBbc2VsZiBhY2Nl
c3NpYmlsaXR5Um9vdE9iamVjdFdyYXBwZXJdOworICAgIGlmICghd3JhcHBlcikKKyAgICAgICAg
cmV0dXJuIFtOU0FycmF5IGFycmF5XTsKKyAgICAKKyAgICByZXR1cm4gW05TQXJyYXkgYXJyYXlX
aXRoT2JqZWN0OndyYXBwZXJdOworfQorCistIChpZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFs
dWU6KE5TU3RyaW5nICopYXR0cmlidXRlCit7CisgICAgaWYgKCFXZWJDb3JlOjpBWE9iamVjdENh
Y2hlOjphY2Nlc3NpYmlsaXR5RW5hYmxlZCgpKQorICAgICAgICBXZWJDb3JlOjpBWE9iamVjdENh
Y2hlOjplbmFibGVBY2Nlc3NpYmlsaXR5KCk7CisgICAgCisgICAgaWYgKFthdHRyaWJ1dGUgaXNF
cXVhbFRvU3RyaW5nOk5TQWNjZXNzaWJpbGl0eVBhcmVudEF0dHJpYnV0ZV0pCisgICAgICAgIHJl
dHVybiBtX3BhcmVudDsKKyAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6TlNBY2Nl
c3NpYmlsaXR5V2luZG93QXR0cmlidXRlXSkKKyAgICAgICAgcmV0dXJuIFttX3BhcmVudCBhY2Nl
c3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6TlNBY2Nlc3NpYmlsaXR5V2luZG93QXR0cmlidXRlXTsK
KyAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6TlNBY2Nlc3NpYmlsaXR5VG9wTGV2
ZWxVSUVsZW1lbnRBdHRyaWJ1dGVdKQorICAgICAgICByZXR1cm4gW21fcGFyZW50IGFjY2Vzc2li
aWxpdHlBdHRyaWJ1dGVWYWx1ZTpOU0FjY2Vzc2liaWxpdHlUb3BMZXZlbFVJRWxlbWVudEF0dHJp
YnV0ZV07CisgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOk5TQWNjZXNzaWJpbGl0
eVJvbGVBdHRyaWJ1dGVdKQorICAgICAgICByZXR1cm4gTlNBY2Nlc3NpYmlsaXR5R3JvdXBSb2xl
OworICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpOU0FjY2Vzc2liaWxpdHlSb2xl
RGVzY3JpcHRpb25BdHRyaWJ1dGVdKQorICAgICAgICByZXR1cm4gTlNBY2Nlc3NpYmlsaXR5Um9s
ZURlc2NyaXB0aW9uKE5TQWNjZXNzaWJpbGl0eUdyb3VwUm9sZSwgbmlsKTsKKyAgICBpZiAoW2F0
dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6TlNBY2Nlc3NpYmlsaXR5Rm9jdXNlZEF0dHJpYnV0ZV0p
CisgICAgICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6Tk9dOworICAgIAorICAg
IGlmICghbV9wYWdlKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIGlmIChbYXR0cmli
dXRlIGlzRXF1YWxUb1N0cmluZzpOU0FjY2Vzc2liaWxpdHlQb3NpdGlvbkF0dHJpYnV0ZV0pIHsK
KyAgICAgICAgY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYgcG9pbnQgPSBtX3BhZ2UtPmFjY2Vz
c2liaWxpdHlQb3NpdGlvbigpOworICAgICAgICByZXR1cm4gW05TVmFsdWUgdmFsdWVXaXRoUG9p
bnQ6TlNNYWtlUG9pbnQocG9pbnQueCgpLCBwb2ludC55KCkpXTsKKyAgICB9CisgICAgaWYgKFth
dHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOk5TQWNjZXNzaWJpbGl0eVNpemVBdHRyaWJ1dGVdKSB7
CisgICAgICAgIGNvbnN0IEludFNpemUmIHMgPSBtX3BhZ2UtPnNpemUoKTsKKyAgICAgICAgcmV0
dXJuIFtOU1ZhbHVlIHZhbHVlV2l0aFNpemU6TlNNYWtlU2l6ZShzLndpZHRoKCksIHMuaGVpZ2h0
KCkpXTsKKyAgICB9CisgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOk5TQWNjZXNz
aWJpbGl0eUNoaWxkcmVuQXR0cmlidXRlXSkKKyAgICAgICAgcmV0dXJuIFtzZWxmIGFjY2Vzc2li
aWxpdHlDaGlsZHJlbl07CisgICAgCisgICAgcmV0dXJuIG5pbDsKK30KKworLSAoaWQpYWNjZXNz
aWJpbGl0eUF0dHJpYnV0ZVZhbHVlOihOU1N0cmluZyAqKWF0dHJpYnV0ZSBmb3JQYXJhbWV0ZXI6
KGlkKXBhcmFtZXRlcgoreworICAgIFdLUmV0YWluUHRyPFdLVHlwZVJlZj4gcGFnZU92ZXJsYXlQ
YXJhbWV0ZXIgPSAwOworICAgIAorICAgIGlmIChbcGFyYW1ldGVyIGlzS2luZE9mQ2xhc3M6W05T
VmFsdWUgY2xhc3NdXSAmJiBzdHJjbXAoWyhOU1ZhbHVlKilwYXJhbWV0ZXIgb2JqQ1R5cGVdLCBA
ZW5jb2RlKE5TUG9pbnQpKSA9PSAwKSB7CisgICAgICAgIE5TUG9pbnQgcG9pbnQgPSBbc2VsZiBj
b252ZXJ0U2NyZWVuUG9pbnRUb1Jvb3RWaWV3OlsoTlNWYWx1ZSAqKXBhcmFtZXRlciBwb2ludFZh
bHVlXV07CisgICAgICAgIHBhZ2VPdmVybGF5UGFyYW1ldGVyID0gV0tQb2ludENyZWF0ZShXS1Bv
aW50TWFrZShwb2ludC54LCBwb2ludC55KSk7CisgICAgfQorICAgIAorICAgIFdLUmV0YWluUHRy
PFdLU3RyaW5nUmVmPiBhdHRyaWJ1dGVSZWYgPSBhZG9wdFdLKFdLU3RyaW5nQ3JlYXRlV2l0aENG
U3RyaW5nKChDRlN0cmluZ1JlZilhdHRyaWJ1dGUpKTsKKyAgICBXS1JldGFpblB0cjxXS1R5cGVS
ZWY+IHJlc3VsdCA9IGFkb3B0V0sobV9wYWdlLT5wYWdlT3ZlcmxheUNvcHlBY2Nlc3NpYmlsaXR5
QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlUmVmLmdldCgpLCBwYWdlT3ZlcmxheVBhcmFtZXRlci5n
ZXQoKSkpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAg
IGlmICh0b0ltcGwocmVzdWx0LmdldCgpKS0+dHlwZSgpID09IEFQSTo6U3RyaW5nOjpBUElUeXBl
KQorICAgICAgICByZXR1cm4gQ0ZCcmlkZ2luZ1JlbGVhc2UoV0tTdHJpbmdDb3B5Q0ZTdHJpbmco
a0NGQWxsb2NhdG9yRGVmYXVsdCwgKFdLU3RyaW5nUmVmKXJlc3VsdC5nZXQoKSkpOworICAgIGVs
c2UgaWYgKHRvSW1wbChyZXN1bHQuZ2V0KCkpLT50eXBlKCkgPT0gQVBJOjpCb29sZWFuOjpBUElU
eXBlKQorICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldpdGhCb29sOldLQm9vbGVhbkdl
dFZhbHVlKHN0YXRpY19jYXN0PFdLQm9vbGVhblJlZj4ocmVzdWx0LmdldCgpKSldOworICAgIAor
ICAgIHJldHVybiBuaWw7Cit9CisKKy0gKEJPT0wpYWNjZXNzaWJpbGl0eVNob3VsZFVzZVVuaXF1
ZUlkCit7CisgICAgcmV0dXJuIFlFUzsKK30KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1
c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFy
YXRpb25zIgorLSAoaWQpYWNjZXNzaWJpbGl0eUhpdFRlc3Q6KE5TUG9pbnQpcG9pbnQKK3sKKyAg
ICAvLyBIaXQtdGVzdCBwb2ludCBjb21lcyBpbiBhcyBib3R0b20tc2NyZWVuIGNvb3JkaW5hdGVz
LiBOZWVkcyB0byBiZSBub3JtYWxpemVkIHRvIHRoZSBmcmFtZSBvZiB0aGUgd2ViIHBhZ2UuCisg
ICAgTlNQb2ludCByZW1vdGVQb3NpdGlvbiA9IFtbc2VsZiBhY2Nlc3NpYmlsaXR5QXR0cmlidXRl
VmFsdWU6TlNBY2Nlc3NpYmlsaXR5UG9zaXRpb25BdHRyaWJ1dGVdIHBvaW50VmFsdWVdOworICAg
IE5TU2l6ZSByZW1vdGVTaXplID0gW1tzZWxmIGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTpO
U0FjY2Vzc2liaWxpdHlTaXplQXR0cmlidXRlXSBzaXplVmFsdWVdOworICAgIAorICAgIC8vIEdl
dCB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgV0tWaWV3ICh3ZSBoYXZlIHRvIHNjcmVlbi1mbGlwIGFu
ZCBnbyBmcm9tIGJvdHRvbSBsZWZ0IHRvIHRvcCBsZWZ0KS4KKyAgICBDR0Zsb2F0IHNjcmVlbkhl
aWdodCA9IFsoTlNTY3JlZW4gKilbW05TU2NyZWVuIHNjcmVlbnNdIG9iamVjdEF0SW5kZXg6MF0g
ZnJhbWVdLnNpemUuaGVpZ2h0OworICAgIHJlbW90ZVBvc2l0aW9uLnkgPSAoc2NyZWVuSGVpZ2h0
IC0gcmVtb3RlUG9zaXRpb24ueSkgLSByZW1vdGVTaXplLmhlaWdodDsKKyAgICAKKyAgICBwb2lu
dC55ID0gc2NyZWVuSGVpZ2h0IC0gcG9pbnQueTsKKyAgICAKKyAgICAvLyBSZS1jZW50ZXIgcG9p
bnQgaW50byB0aGUgd2ViIHBhZ2UncyBmcmFtZS4KKyAgICBwb2ludC55IC09IHJlbW90ZVBvc2l0
aW9uLnk7CisgICAgcG9pbnQueCAtPSByZW1vdGVQb3NpdGlvbi54OworICAgIAorICAgIFdlYkNv
cmU6OkZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV9wYWdlID8gbV9wYWdlLT5tYWluRnJhbWVWaWV3
KCkgOiAwOworICAgIGlmIChmcmFtZVZpZXcpIHsKKyAgICAgICAgcG9pbnQueSArPSBmcmFtZVZp
ZXctPnNjcm9sbFBvc2l0aW9uKCkueSgpOworICAgICAgICBwb2ludC54ICs9IGZyYW1lVmlldy0+
c2Nyb2xsUG9zaXRpb24oKS54KCk7CisgICAgfQorICAgIAorICAgIHJldHVybiBbW3NlbGYgYWNj
ZXNzaWJpbGl0eVJvb3RPYmplY3RXcmFwcGVyXSBhY2Nlc3NpYmlsaXR5SGl0VGVzdDpwb2ludF07
Cit9CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisKKworQGVuZApJbmRleDogU291cmNl
L1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9XZWJQYWdlTWFjLm1tCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvV2ViUGFnZU1hYy5tbQko
cmV2aXNpb24gMTY0OTAxKQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21h
Yy9XZWJQYWdlTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw3ICszNSw3IEBACiAjaW1wb3J0
ICJQYWdlQmFubmVyLmgiCiAjaW1wb3J0ICJQbHVnaW5WaWV3LmgiCiAjaW1wb3J0ICJQcmludElu
Zm8uaCIKLSNpbXBvcnQgIldLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3QuaCIKKyNpbXBvcnQg
IldLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMuaCIKICNpbXBvcnQgIldlYkNvcmVBcmd1
bWVudENvZGVycy5oIgogI2ltcG9ydCAiV2ViRXZlbnQuaCIKICNpbXBvcnQgIldlYkV2ZW50Q29u
dmVyc2lvbi5oIgpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9jb2NvYS9XZWJQcm9j
ZXNzQ29jb2EubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9jb2Nv
YS9XZWJQcm9jZXNzQ29jb2EubW0JKHJldmlzaW9uIDE2NDkwMSkKKysrIFNvdXJjZS9XZWJLaXQy
L1dlYlByb2Nlc3MvY29jb2EvV2ViUHJvY2Vzc0NvY29hLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0y
MDMsOSArMjAzLDcgQEAKIAogdm9pZCBXZWJQcm9jZXNzOjpwbGF0Zm9ybUluaXRpYWxpemVQcm9j
ZXNzKGNvbnN0IENoaWxkUHJvY2Vzc0luaXRpYWxpemF0aW9uUGFyYW1ldGVycyYpCiB7Ci0jaWYg
VVNFKEFQUEtJVCkKICAgICBXS0FYUmVnaXN0ZXJSZW1vdGVBcHAoKTsKLSNlbmRpZgogCiAjaWYg
RU5BQkxFKFNFQ19JVEVNX1NISU0pCiAgICAgU2VjSXRlbVNoaW06OnNoYXJlZCgpLmluaXRpYWxp
emUodGhpcyk7Cg==
</data>
<flag name="review"
          id="249665"
          type_id="1"
          status="+"
          setter="sam"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>225712</attachid>
            <date>2014-03-03 16:48:19 -0800</date>
            <delta_ts>2014-06-04 00:50:45 -0700</delta_ts>
            <desc>patch to avoid assertions</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>2024</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NTAyMSkKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE3IEBACisyMDE0LTAzLTAzICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFN1cHBvcnQgSU9T
IEFjY2Vzc2liaWxpdHkgaW4gV0syCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xMjk1MjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBEb24ndCBhY2Nlc3MgYSBjb25uZWN0aW9uIGlmIGl0J3Mgbm90IHZhbGlk
LgorCisgICAgICAgICogU2hhcmVkL0NoaWxkUHJvY2Vzc1Byb3h5Lmg6CisgICAgICAgIChXZWJL
aXQ6OkNoaWxkUHJvY2Vzc1Byb3h5Ojppc1ZhbGlkKToKKyAgICAgICAgKiBVSVByb2Nlc3MvaW9z
L1dLQ29udGVudFZpZXcubW06CisgICAgICAgICgtW1dLQ29udGVudFZpZXcgX2FjY2Vzc2liaWxp
dHlSZWdpc3RlclVJUHJvY2Vzc1Rva2Vuc10pOgorCiAyMDE0LTAzLTAzICBTYW0gV2VpbmlnICA8
c2FtQHdlYmtpdC5vcmc+CiAKICAgICAgICAgRml4IEFTU0VSVCBhbmQgbGVha3MgaW50cm9kdWNl
ZCBpbiByZWNlbnQgIlN1cHBvcnQgSU9TIEFjY2Vzc2liaWxpdHkgaW4gV0syIiBwYXRjaApJbmRl
eDogU291cmNlL1dlYktpdDIvU2hhcmVkL0NoaWxkUHJvY2Vzc1Byb3h5LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdDIvU2hhcmVkL0NoaWxkUHJvY2Vzc1Byb3h5LmgJKHJldmlzaW9uIDE2
NTAxMykKKysrIFNvdXJjZS9XZWJLaXQyL1NoYXJlZC9DaGlsZFByb2Nlc3NQcm94eS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgfTsKICAgICBTdGF0ZSBzdGF0ZSgpIGNv
bnN0OwogCi0vLyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2Nvbm5lY3Rpb247
IH0KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2Nvbm5lY3Rpb247IH0KICAg
ICBib29sIGNhblNlbmRNZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gc3RhdGUoKSAhPSBTdGF0ZTo6
VGVybWluYXRlZDt9CiAKICAgICBQbGF0Zm9ybVByb2Nlc3NJZGVudGlmaWVyIHByb2Nlc3NJZGVu
dGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZXNzTGF1bmNoZXItPnByb2Nlc3NJZGVudGlm
aWVyKCk7IH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmll
dy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dLQ29udGVu
dFZpZXcubW0JKHJldmlzaW9uIDE2NTAxNCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9p
b3MvV0tDb250ZW50Vmlldy5tbQkod29ya2luZyBjb3B5KQpAQCAtMjQyLDYgKzI0Miw5IEBACiB7
CiAgICAgUmV0YWluUHRyPENGVVVJRFJlZj4gdXVpZCA9IENGVVVJRENyZWF0ZShrQ0ZBbGxvY2F0
b3JEZWZhdWx0KTsKICAgICBOU0RhdGEgKnJlbW90ZUVsZW1lbnRUb2tlbiA9IFdLQVhSZW1vdGVU
b2tlbih1dWlkLmdldCgpKTsKKyAgICBpZiAoIV9wYWdlLT5wcm9jZXNzKCktPmlzVmFsaWQoKSkK
KyAgICAgICAgcmV0dXJuOworICAgIAogICAgIElQQzo6Q29ubmVjdGlvbiogY29ubmVjdGlvbiA9
IF9wYWdlLT5wcm9jZXNzKCkuY29ubmVjdGlvbigpOwogCiAgICAgLy8gU3RvcmUgaW5mb3JtYXRp
b24gYWJvdXQgdGhlIFdlYlByb2Nlc3MgdGhhdCBjYW4gbGF0ZXIgYmUgcmV0cmlldmVkIGJ5IHRo
ZSBpT1MgQWNjZXNzaWJpbGl0eSBydW50aW1lLgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>