安全分析报告: Armor v1.16.1

安全分数


安全分数 41/100

风险评级


等级

  1. A
  2. B
  3. C
  4. F

严重性分布 (%)


隐私风险

16

用户/设备跟踪器


调研结果

高危 7
中危 16
信息 1
安全 2
关注 0

高危 应用程序容易受到 Janus 漏洞的影响

应用程序使用 v1 签名方案进行签名,如果仅使用 v1 签名方案进行签名,则在 Android 5.0-8.0 上容易受到 Janus 漏洞的影响。在使用 v1 和 v2/v3 方案签名的 Android 5.0-7.0 上运行的应用程序也容易受到攻击。

高危 SSL的不安全实现。信任所有证书或接受自签名证书是一个关键的安全漏洞。此应用程序易受MITM攻击

SSL的不安全实现。信任所有证书或接受自签名证书是一个关键的安全漏洞。此应用程序易受MITM攻击
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05g-Testing-Network-Communication.md#android-network-apis

Files:
com/mopub/network/CustomSSLSocketFactory.java, line(s) 6,7,3
com/tapjoy/internal/fn.java, line(s) 21,4

高危 如果一个应用程序使用WebView.loadDataWithBaseURL方法来加载一个网页到WebView,那么这个应用程序可能会遭受跨站脚本攻击

如果一个应用程序使用WebView.loadDataWithBaseURL方法来加载一个网页到WebView,那么这个应用程序可能会遭受跨站脚本攻击
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#static-analysis-7

Files:
com/amazon/device/ads/AdContainer.java, line(s) 110,7
com/amazon/device/ads/ViewManager.java, line(s) 225,231,9,10
com/appodeal/ads/networks/spotx/SpotXVPAIDView.java, line(s) 526,27,28,398
com/appodeal/ads/networks/vpaid/VPAIDView.java, line(s) 222,20,21,93
com/chartboost/sdk/impl/as.java, line(s) 48,5,6
com/chartboost/sdk/impl/br.java, line(s) 60,8
com/chartboost/sdk/impl/bs.java, line(s) 61,6,7
com/inmobi/rendering/RenderView.java, line(s) 658,764,790,35,36
com/jirbo/adcolony/ad.java, line(s) 847,25,26
com/mopub/mobileads/BaseWebView.java, line(s) 36,9
com/mopub/mobileads/MraidActivity.java, line(s) 75,13,14
com/mopub/mraid/MraidBridge.java, line(s) 512,17,18
com/startapp/android/publish/i/x.java, line(s) 782,26,27
com/startapp/android/publish/splash/b.java, line(s) 43,4,5
com/startapp/android/publish/splash/e.java, line(s) 153,10
com/tapjoy/TJAdUnit.java, line(s) 110,124,297,14
com/tapjoy/TJAdUnitJSBridge.java, line(s) 297,26
com/tapjoy/mraid/view/MraidView.java, line(s) 845,929,1824,32,33
org/nexage/sourcekit/mraid/MRAIDVideoAddendumView.java, line(s) 416,886,941,1639,35,36,1203,1293
org/nexage/sourcekit/mraid/MRAIDView.java, line(s) 346,713,766,1467,35,36,1028,1118
org/nexage/sourcekit/vast/activity/VASTActivity.java, line(s) 239,337,23,24
org/nexage/sourcekit/vast/activity/VPAIDActivity.java, line(s) 303,21,22,332,420

高危 应用程序使用带PKCS5/PKCS7填充的加密模式CBC。此配置容易受到填充oracle攻击。

应用程序使用带PKCS5/PKCS7填充的加密模式CBC。此配置容易受到填充oracle攻击。
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x04g-Testing-Cryptography.md#identifying-insecure-andor-deprecated-cryptographic-algorithms-mstg-crypto-4

Files:
com/appodeal/ads/utils/o.java, line(s) 57

高危 已启用远程WebView调试

已启用远程WebView调试
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x04c-Tampering-and-Reverse-Engineering.md#debugging-and-tracing

Files:
com/appodeal/ads/networks/vpaid/VPAIDView.java, line(s) 125,20,21,93
com/chartboost/sdk/impl/bs.java, line(s) 59,6,7
com/inmobi/rendering/RenderView.java, line(s) 711,35,36

高危 该文件是World Readable。任何应用程序都可以读取文件

该文件是World Readable。任何应用程序都可以读取文件
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05d-Testing-Data-Storage.md#testing-local-storage-for-sensitive-data-mstg-storage-1-and-mstg-storage-2

Files:
com/yandex/metrica/impl/o.java, line(s) 164

高危 应用程序包含隐私跟踪程序

此应用程序有多个16隐私跟踪程序。跟踪器可以跟踪设备或用户,是终端用户的隐私问题。

中危 应用程序数据可以被备份

[android:allowBackup=true]
这个标志允许任何人通过adb备份你的应用程序数据。它允许已经启用了USB调试的用户从设备上复制应用程序数据。

中危 Broadcast Receiver (com.appodeal.ads.AppodealPackageAddedReceiver) 未被保护。

[android:exported=true]
发现 Broadcast Receiver与设备上的其他应用程序共享,因此可被设备上的任何其他应用程序访问。

中危 Service (com.yandex.metrica.MetricaService) 未被保护。

[android:exported=true]
发现 Service与设备上的其他应用程序共享,因此可被设备上的任何其他应用程序访问。

中危 Broadcast Receiver (com.yandex.metrica.MetricaEventHandler) 未被保护。

[android:exported=true]
发现 Broadcast Receiver与设备上的其他应用程序共享,因此可被设备上的任何其他应用程序访问。

中危 Broadcast Receiver (com.inmobi.commons.core.utilities.uid.ImIdShareBroadCastReceiver) 未被保护。

[android:exported=true]
发现 Broadcast Receiver与设备上的其他应用程序共享,因此可被设备上的任何其他应用程序访问。

中危 应用程序可以读取/写入外部存储器,任何应用程序都可以读取写入外部存储器的数据

应用程序可以读取/写入外部存储器,任何应用程序都可以读取写入外部存储器的数据
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05d-Testing-Data-Storage.md#external-storage

Files:
com/applovin/impl/sdk/z.java, line(s) 148
com/appodeal/ads/networks/spotx/SpotXVPAIDView.java, line(s) 480
com/appodeal/ads/utils/a/d.java, line(s) 28,45
com/appodeal/ads/utils/d.java, line(s) 80,130,104,121
com/appodeal/ads/utils/e.java, line(s) 55,165,169
com/chartboost/sdk/Libraries/h.java, line(s) 89,494
com/inmobi/rendering/mraid/c.java, line(s) 68
com/jirbo/adcolony/ADCImage.java, line(s) 228
com/jirbo/adcolony/ADCStorage.java, line(s) 70
com/jirbo/adcolony/m.java, line(s) 131,136,137
com/mopub/mraid/MraidNativeCommandHandler.java, line(s) 105,256
com/startapp/android/publish/i/r.java, line(s) 44
com/tapjoy/TapjoyCache.java, line(s) 42,43,44
com/tapjoy/internal/x.java, line(s) 12
com/tapjoy/mraid/controller/Assets.java, line(s) 50,50,55
com/unity3d/ads/android/UnityAdsUtils.java, line(s) 203,212
com/unity3d/ads/android2/UnityAdsUtils.java, line(s) 203,212
com/vungle/publisher/env/AndroidDevice.java, line(s) 206
com/vungle/publisher/inject/CoreModule_ProvideAdTempDirectoryFactory.java, line(s) 34
com/yandex/metrica/impl/bl.java, line(s) 264
org/nexage/sourcekit/mraid/nativefeature/MRAIDNativeFeatureProvider.java, line(s) 57,58
org/nexage/sourcekit/vast/VASTPlayer.java, line(s) 156

中危 MD5是已知存在哈希冲突的弱哈希

MD5是已知存在哈希冲突的弱哈希
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x04g-Testing-Cryptography.md#identifying-insecure-andor-deprecated-cryptographic-algorithms-mstg-crypto-4

Files:
com/appodeal/ads/networks/c.java, line(s) 16
com/avocarrot/androidsdk/Utils.java, line(s) 190
com/immersion/hapticmediasdk/utils/FileManager.java, line(s) 58
com/my/target/core/utils/f.java, line(s) 8
com/startapp/android/publish/b/i.java, line(s) 38
com/tapjoy/internal/ek.java, line(s) 27
com/unity3d/ads/android/UnityAdsUtils.java, line(s) 111
com/unity3d/ads/android2/UnityAdsUtils.java, line(s) 111

中危 SHA-1是已知存在哈希冲突的弱哈希

SHA-1是已知存在哈希冲突的弱哈希
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x04g-Testing-Cryptography.md#identifying-insecure-andor-deprecated-cryptographic-algorithms-mstg-crypto-4

Files:
com/amazon/device/ads/StringUtils.java, line(s) 81
com/avocarrot/androidsdk/Utils.java, line(s) 58
com/chartboost/sdk/Libraries/b.java, line(s) 14
com/inmobi/commons/core/utilities/a/b.java, line(s) 93,81
com/jirbo/adcolony/ah.java, line(s) 31
com/mopub/common/util/Utils.java, line(s) 31
com/my/target/core/utils/h.java, line(s) 168
com/tapjoy/internal/co.java, line(s) 9
com/unity3d/ads/android/UnityAdsUtils.java, line(s) 102
com/unity3d/ads/android2/UnityAdsUtils.java, line(s) 102

中危 应用程序使用不安全的随机数生成器

应用程序使用不安全的随机数生成器
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x04g-Testing-Cryptography.md#weak-random-number-generators

Files:
com/inmobi/commons/core/c/a.java, line(s) 17
com/inmobi/commons/core/utilities/uid/d.java, line(s) 8
com/inmobi/rendering/a/a.java, line(s) 7
com/mopub/common/event/EventSampler.java, line(s) 8
com/startapp/android/publish/b/a.java, line(s) 20
com/startapp/android/publish/b/f.java, line(s) 19
com/startapp/android/publish/banner/Banner.java, line(s) 27
com/startapp/android/publish/video/a/b.java, line(s) 9
com/tapjoy/internal/fl.java, line(s) 20
com/tapjoy/internal/hr.java, line(s) 6
com/yandex/metrica/impl/ob/bx.java, line(s) 3
com/yandex/mobile/ads/video/network/e.java, line(s) 18

中危 IP地址泄露

IP地址泄露


Files:
com/immersion/hapticmediasdk/HapticMediaSDKVersion.java, line(s) 4

中危 文件可能包含硬编码的敏感信息,如用户名、密码、密钥等

文件可能包含硬编码的敏感信息,如用户名、密码、密钥等
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05d-Testing-Data-Storage.md#checking-memory-for-sensitive-data-mstg-storage-10

Files:
com/amazon/device/ads/AdActivity.java, line(s) 9
com/amazon/device/ads/AdvertisingIdParameter.java, line(s) 6
com/amazon/device/ads/AppEventRegistrationHandler.java, line(s) 18,19
com/amazon/device/ads/Assets.java, line(s) 18
com/amazon/device/ads/DirectedIdRetriever.java, line(s) 4
com/amazon/device/ads/InterstitialAd.java, line(s) 17
com/amazon/device/ads/UserIdParameter.java, line(s) 4
com/amazon/device/ads/ViewabilityObserver.java, line(s) 12,15
com/amazon/device/ads/WebRequest.java, line(s) 23,13
com/immersion/hapticmediasdk/controllers/HapticPlaybackThread.java, line(s) 28
com/mopub/common/AdUrlGenerator.java, line(s) 12,13,14,11,15,21,18,19,20,22,23,16,26,24,17,25,27
com/mopub/common/BaseUrlGenerator.java, line(s) 12,13
com/mopub/common/DataKeys.java, line(s) 8,10,9,6,16,11,13,5,20,22,21,23
com/mopub/common/GpsHelper.java, line(s) 13,15
com/mopub/common/MoPubBrowser.java, line(s) 25
com/mopub/common/event/EventDetails.java, line(s) 11,12,13,14,15,16,17,18,19,20,21,22,23
com/mopub/mobileads/AppodealCustomEventBanner.java, line(s) 12
com/mopub/mobileads/AppodealCustomEventInterstitial.java, line(s) 11
com/mopub/mobileads/BaseVideoPlayerActivity.java, line(s) 14
com/mopub/nativeads/PositioningRequest.java, line(s) 18,19,21,22,23
com/my/target/core/utils/h.java, line(s) 162
com/tapjoy/TapjoyConstants.java, line(s) 39,42
com/tapjoy/mraid/view/MraidView.java, line(s) 63
com/unity3d/ads/android/UnityAds.java, line(s) 54,51,52,55,49
com/unity3d/ads/android/properties/UnityAdsConstants.java, line(s) 90,48,101,19,129,130,20,17,49,102,50,21,51,42,23,77,52,24,53,103,72,117,18,25,78,118,54,71,131,132,55,104,56,26,10,28,57,105,29,47,58,30,134,88,135,99,32,79,82,59,43,136,83,137,138,139,33,84,60,106,12,61,107,62,108,34,35,44,45,13,140,119,63,109,64,110,112,65,111,66,11,67,113,36,37,68,86,69,114,14,38,39,40,9,70,115,46,141,124,15,100,116,128
com/unity3d/ads/android/webapp/UnityAdsWebView.java, line(s) 112
com/unity3d/ads/android2/UnityAds.java, line(s) 54,51,52,55,49
com/unity3d/ads/android2/properties/UnityAdsConstants.java, line(s) 90,48,101,19,129,130,20,17,49,102,50,21,51,42,23,77,52,24,53,103,72,117,18,25,78,118,54,71,131,132,55,104,56,26,10,28,57,105,29,47,58,30,134,88,135,99,32,79,82,59,43,136,83,137,138,139,33,84,60,106,12,61,107,62,108,34,35,44,45,13,140,119,63,109,64,110,112,65,111,66,11,67,113,36,37,68,86,69,114,14,38,39,40,9,70,115,46,141,124,15,100,116,128
com/unity3d/ads/android2/webapp/UnityAdsWebView.java, line(s) 112
com/vungle/publisher/FullScreenAdActivity.java, line(s) 37
com/vungle/publisher/SafeBundleAdConfigFactory.java, line(s) 11

中危 应用程序使用SQLite数据库并执行原始SQL查询。原始SQL查询中不受信任的用户输入可能会导致SQL注入。敏感信息也应加密并写入数据库

应用程序使用SQLite数据库并执行原始SQL查询。原始SQL查询中不受信任的用户输入可能会导致SQL注入。敏感信息也应加密并写入数据库
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x04h-Testing-Code-Quality.md#injection-flaws-mstg-arch-2-and-mstg-platform-2

Files:
com/inmobi/commons/core/b/b.java, line(s) 6,7,84,93
com/tapjoy/internal/j.java, line(s) 5,51,122,152
com/vungle/publisher/db/DatabaseHelper.java, line(s) 6,7,42,45,48,51,54,57,60,63,66,69,89,101
com/yandex/metrica/impl/j.java, line(s) 6,7,39
com/yandex/metrica/impl/ob/bb.java, line(s) 6,132,266
com/yandex/metrica/impl/ob/bc.java, line(s) 7,8,9,142,184,192,379
org/cocos2dx/lib/Cocos2dxLocalStorage.java, line(s) 5,6,47

中危 不安全的Web视图实现。可能存在WebView任意代码执行漏洞

不安全的Web视图实现。可能存在WebView任意代码执行漏洞
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#testing-javascript-execution-in-webviews-mstg-platform-5

Files:
com/appodeal/ads/networks/i.java, line(s) 76,75
com/appodeal/ads/networks/spotx/SpotXVPAIDView.java, line(s) 429,421
com/inmobi/rendering/RenderView.java, line(s) 733,728
com/startapp/android/publish/adinformation/a.java, line(s) 142,138
com/startapp/android/publish/banner/bannerstandard/BannerStandard.java, line(s) 261,196
com/startapp/android/publish/c/d.java, line(s) 112,99
com/startapp/android/publish/splash/b.java, line(s) 32,28
com/tapjoy/TJAdUnitJSBridge.java, line(s) 108,292
com/unity3d/ads/android/webapp/UnityAdsWebView.java, line(s) 221,187
com/unity3d/ads/android2/webapp/UnityAdsWebView.java, line(s) 221,187
org/nexage/sourcekit/vast/activity/VPAIDActivity.java, line(s) 210,206

中危 可能存在跨域漏洞。在 WebView 中启用从 URL 访问文件可能会泄漏文件系统中的敏感信息

可能存在跨域漏洞。在 WebView 中启用从 URL 访问文件可能会泄漏文件系统中的敏感信息
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#static-analysis-6

Files:
com/appodeal/ads/networks/spotx/SpotXVPAIDView.java, line(s) 426,421
com/chartboost/sdk/impl/br.java, line(s) 32,24
com/startapp/android/publish/splash/b.java, line(s) 29,28

中危 应用程序创建临时文件。敏感信息永远不应该被写进临时文件

应用程序创建临时文件。敏感信息永远不应该被写进临时文件


Files:
com/avocarrot/androidsdk/VastParseAndVideoDownloadTask.java, line(s) 120

中危 此应用可能包含硬编码机密信息

从应用程序中识别出以下机密确保这些不是机密或私人信息
ZjXBpUuX2LRpEzExMVrNHlIU5b9VVe02qgFe0nuAioqKsIM/LuvWrUNRFHw+n+tmvpWaQBKDlwxp
5Yb/yOjoaK5cuWLaYXSKT2DU4TOiCdasWaOn0s1isUdKAwQPd2rqlfb2do4fN3zfg9HRUW7evMnQ
nVyAicqfTyaHhenNzc1Eo0VF5F2traz+srKwIRFtbW3xoaMjW1tZ2X9Q12WazcZfLxefn53lXV9fb
LvRiGEjRqfzurezaWuj8Wie2gyHMrW5Q06LspMnox7A=
Ew70EKy2+ZT04g+B75yAYqdFLwYvKfgEH3uYQ2SBbvoudUq0WBJP6fSAg2L1rADvwBTY7IToCxR8
bWF4UmVjdCwgY2xvc2VSZWN0KTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gZml0UmVzaXpl
YXJ0KSIpOw0KCQl9IGVsc2Ugew0KCQkJbG9nLmkoIm1yYWlkLmV4cGFuZCAiICsgdXJsKTsNCgkJ
ZXMuYWxsb3dPcmllbnRhdGlvbkNoYW5nZSA9IG9yaWVudGF0aW9uUHJvcGVydGllcy5hbGxvd09y
ZV07DQoJCQl9DQoJCX0NCgkJDQoJCXZhciBwYXJhbXMgPQ0KCQkJIndpZHRoPSIgKyByZXNpemVQ
Aggh2oAqrd6ShYxdq/bd7BhKYFMVxHhaDQCgmVYiMTExpDUBt6h9tzmGOTk5Mhtad2A7FQFUvVHy
cmVzaXplUmVjdCkpIHsNCiAgICAgICAgICAgIGxvZy5kKCJubyBhZGp1c3RtZW50IG5lY2Vzc2Fy
n6irNUuVymeHQARbA5XA4vDirbAYCBQ4NYAIuarXacDQafbK0tJRqNBr32TkIBBxKwAgsKBQKTzgc
dh0qmal1AgnMzk8mQIueQ5GTkxMRM1/vJI8dt5LDncwyJycHj0d3p78FgvkBVFUdVRRlPTDtlIuP
M0I1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDNDMxMTM3QjYxMjAxMUUzQjhCRkRDNTJC
aWdodCk7DQoJCXNjcmVlblNpemUud2lkdGggPSB3aWR0aDsNCgkJc2NyZWVuU2l6ZS5oZWlnaHQg
CeZkbOYbAL9ICPG1me+JNvuAqqpeVRSlC3hURhMY9Qlms+zcudPIjezfCyHeN/td0aE8qKqqX+tt
StK3WDUSiBZeS6DjzK9Xhp5FsasI0LS8K51OexZo8dMx1HXm12s6nbZ7lFQj+Ldk7/11IEEQwOeI
VEFURVMuSElEREVOKSB7DQoJCQkvLyBkbyBub3RoaW5nDQoJCQlyZXR1cm47DQoJCX0NCgkJY2Fs
IiwNCgkJIlRFTCIgOiAidGVsIiwNCgkJIkNBTEVOREFSIiA6ICJjYWxlbmRhciIsDQoJCSJTVE9S
cG5hbWUgPSByd1Byb3BzW2ldOw0KCQkJaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJv
IC0xKTsNCgkJCX0sDQoJCQkiYWxsb3dPZmZzY3JlZW4iIDogZnVuY3Rpb24oYWxsb3dPZmZzY3Jl
CQkiUE9SVFJBSVQiIDogInBvcnRyYWl0IiwNCgkJIkxBTkRTQ0FQRSIgOiAibGFuZHNjYXBlIiwN
DQoJfTsNCg0KCW1yYWlkLnNldEV4cGFuZFNpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7
aXplUHJvcGVydGllcyA9IGZ1bmN0aW9uKCkgew0KCQlsb2cuaSgibXJhaWQuZ2V0UmVzaXplUHJv
aWYgKGkgPT09IGxlbikgew0KCQkJCQlsb2cuaSgibGlzdGVuZXIgIiArIHN0cjEgKyAiIG5vdCBm
OiAidG9wLWNlbnRlciIsDQoJCSJUT1BfUklHSFQiIDogInRvcC1yaWdodCIsDQoJCSJDRU5URVIi
aWQub3BlbiAiICsgdXJsKTsNCgkJY2FsbE5hdGl2ZSgib3Blbj91cmw9IiArIGVuY29kZVVSSUNv
50L9XkvOIwdLz51ApwDl5AWS48ePh70crVMlJyeHoqIiI2l5y4HCYHKPmSdAkARxwHFZEgDU1tZy
bih4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7DQoJCWxvZy5pKCJtcmFpZC5zZXREZWZhdWx0UG9zaXRp
iZEDYF5LpvyxpOX9+x3+qDBXhdByZOUFatBA3JgW7sY=
b3JFdmVudCgibXJhaWQucmVzaXplIGlzIG5vdCByZWFkeSB0byBiZSBjYWxsZWQiLCAibXJhaWQu
IDogImNlbnRlciIsDQoJCSJCT1RUT01fTEVGVCIgOiAiYm90dG9tLWxlZnQiLA0KCQkiQk9UVE9N
ZWN0KTsNCiAgICAgICAgcHJpbnRSZWN0KCJjb250YWluZWRSZWN0IiwgY29udGFpbmVkUmVjdCk7
V2gD8FE3AqgAfj0J+vv78fjxY1SrVd0I8FG742C/1nwdfQKW42CtEkJUBV9VErAmhGiREqY6+CqS
ICAgICAgICBsb2cuZCgiYWRqdXN0bWVudHMueSAiICsgYWRqdXN0bWVudHMueSk7DQoNCiAgICAg
KSB7DQoJCQkvLyBkbyBub3RoaW5nDQoJCQlyZXR1cm47DQoJCX0NCgkJaWYgKHN0YXRlID09PSBT
8b2824c2cb184ce0ac78b82dba46b78a
dmUoInVzZUN1c3RvbUNsb3NlP3VzZUN1c3RvbUNsb3NlPSIJKyBleHBhbmRQcm9wZXJ0aWVzLnVz
vaDO2J17VOrNdi+J04px1GM3Cu2ENj7l+3r1JrM9Vvhyq6GXYCVafJjEhfBBEzBLoVcZkyl0+zT7
nr98Hoij993E5jgPoAvSjI1A8ngPT0B+JMGIwV263G2RZhulU8lNle/vdyBAWc4XCdijgv7deKr1n
ZnVuY3Rpb24obmV3SXNWaWV3YWJsZSkgew0KCQlsb2cuaSgibXJhaWQuZmlyZVZpZXdhYmxlQ2hh
Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGQkU5MjA4OTBDMjA2ODExODA4M0YyQ0E4QjA4
8RYBOll+iTdvkJcEOnXmYCWBE7PPYfqJiDpF9RCYYvk13gghKwl0Ap+VBE7BZ4z4sUX9OEmwYfeL
ZVJlY3QueSArIHJlc2l6ZVJlY3QuaGVpZ2h0KSA+IChtYXhSZWN0LnkgKyBtYXhSZWN0LmhlaWdo
RQdAL5gAOxwQG0uQS+Yr2OyUaC87fQ/KHBZssgg85qCUOSH6OpgGG1wSbFIABkAILNQRfZhr+KDL
IQBnNBEiFuhj+8x6X8XLgh01V9Ic5/V3IRQLNFFc7v4=
0BA+n4958+ZZ8uLCGR3oxfmhSH19PTU1NYYnSFtbG+vXrychIUEvIviDqqrDehpAscP2j0sgEOD8
YW5nZSBpcyB0cnVlIGJ1dCBmb3JjZU9yaWVudGF0aW9uIGlzICINCgkJCQkJKyBuZXdPcmllbnRh
8/MdF+rV19eHJRuXUx1DSUzuwPYOg6Gq6rCiKP3AI9ONkpCQQFtbG21tbYZmvt25d+26ETSVtLW1
ICAgcmVzaXplUmVjdC54ID0gZGVmYXVsdFBvc2l0aW9uLnggKyBwcm9wZXJ0aWVzLm9mZnNldFgg
aGVpZ2h0KTsNCgkJfQ0KCX07DQoNCgltcmFpZC5zZXREZWZhdWx0UG9zaXRpb24gPSBmdW5jdGlv
CQlzdGF0ZSA9IG5ld1N0YXRlOw0KCQkJZmlyZUV2ZW50KG1yYWlkLkVWRU5UUy5TVEFURUNIQU5H
dmFyIHJldHZhbCA9IHRydWU7DQoJCXZhciB2YWxpZGF0b3JzID0gYWxsVmFsaWRhdG9yc1thY3Rp
0dvb64jFoqysLB588EG9Zi8KIf5PRgMA/FVvtIKCAukHTEpKYvPmzRGRhDEcjuGzzz5rSBNIYjEl
CgkJCQkJCSJyZXF1aXJlZCBwcm9wZXJ0eSAiICsgcHJvcG5hbWUgKyAiIGlzIG1pc3NpbmciLA0K
DQogICAgICAgICAgICBjbG9zZVJlY3QueCA9IHJlc2l6ZVJlY3QueDsNCiAgICAgICAgfSBlbHNl
MzMrWc20D63NaPvf+g8syyYz584oxV74McvOnHv+c++dueecMaLRaMq/1oyk6KRod0Xng7WgAqwB
nPDs7K3Ldm5ubhP9UKBS4vFuzlqtUqnPo+7i0tGTFpeMfqALXjSEijHdF+13BV/MzNjamWVhYyM7P
xEqlEqXTaTJNUzjYrGqaJqXTaSqVSiJIsBH47aMVMHEsZ2dnlMlkKBaL+Qb6dRqLxSiTydDZ2Zlb
ZXR1cm4gcmV0dmFsOw0KCX07DQoNCgltcmFpZC51c2VDdXN0b21DbG9zZSA9IGZ1bmN0aW9uKGlz
ciBjb25kaXRpb24uDQoJCWlmIChuZXdPcmllbnRhdGlvblByb3BlcnRpZXMuYWxsb3dPcmllbnRh
IDogcmVzaXplUHJvcGVydGllcy5jdXN0b21DbG9zZVBvc2l0aW9uOw0KICAgICAgICBsb2cuZCgi
cy53aWR0aCA+IG1heFNpemUud2lkdGggfHwgcHJvcGVydGllcy5oZWlnaHQgPiBtYXhTaXplLmhl
aWRWYWx1ZXMuaW5kZXhPZihmb3JjZU9yaWVudGF0aW9uKSAhPT0gLTEpOw0KCQkJfQ0KCQl9LA0K
ny3QBsSyPMqbcUFX1UrPRqJimyUAOgw2F9GzhOsLQFXNHiBmMRCeXg8FgfG939wtmtLnszMwuJ4gR
dExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7DQoJCWxvZy5pKCJtcmFpZC5h
dmFyIHJ3UHJvcHMgPSBbICJ3aWR0aCIsICJoZWlnaHQiLCAidXNlQ3VzdG9tQ2xvc2UiIF07DQoJ
ZW5lcnNbZXZlbnRdOw0KCQkJCS8vIHRyeSB0byBmaW5kIHRoZSBnaXZlbiBsaXN0ZW5lcg0KCQkJ
xmrpTSudnZ2Oesl2OYZudvhCwO4eD2NFFaeV9vZ2R6ras2fPWr5i6Ha1bwK7lR7GKmq6jgBOIYFT
GE32CYxGB7NRdu/eLevwwdhGzyuhfJ8VqWKfQ+d6+bgsX76cffv2yVxcmHUSFxfHvn37ZJd4Cb7z
KioqKioqKioqKioqKioqLw0KDQoJLy8gc2V0dGVycyB0byBjaGFuZ2Ugc3RhdGUNCgltcmFpZC5z
IngiIDogMCwNCgkJInkiIDogMCwNCgkJIndpZHRoIiA6IDAsDQoJCSJoZWlnaHQiIDogMA0KCX07
KioqKioqKioqKioqKioqKioqKi8NCg0KCXZhciBtcmFpZCA9IHdpbmRvdy5tcmFpZCA9IHt9Ow0K
ayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGlzdGVuZXIgaXNuJ3QgYWxyZWFkeSByZWdpc3RlcmVk
CgkJfSwNCgkJInNldE9yaWVudGF0aW9uUHJvcGVydGllcyIgOiB7DQoJCQkiYWxsb3dPcmllbnRh
KSB7DQoJCQljYWxsTmF0aXZlKCJjcmVhdGVDYWxlbmRhckV2ZW50P2V2ZW50SlNPTj0iCSsgSlNP
njckH6fkL0/f3NwMPHz8jKxsbAw0AQIABAGYHPKslk98oAAAAAElFTkSuQmCC
dXJyZW50UG9zaXRpb24iKTsNCgkJcmV0dXJuIGN1cnJlbnRQb3NpdGlvbjsNCgl9Ow0KDQoJbXJh
JysSWO36hQkIplz/m1YPVVVpbW0lHNLS0kJvb6+l0UFqaiqJiYma5sBNDp+M5tP6b0VRXldVdXRc
aYwSyk8tkPPpfHAY7ODvftAE2sAA82FxJp0AUnngnk7bHnAF1IEvs/ElIJ3CxcH6WhBnYDMFekEj
nbWFnZVJlYWR5ccllPAAAAq5JREFUeNqUlN9LmmEUx4++/ihKy6yZGEMjlExdEjgqQmm78ioGu41g
+fN8+eWXlmuCkpISW30C2TjfLPgVFRXcuHHDVH9JTBQZE6C55NvT0xPyaV67SGDn3oFVDp8d4ANc
dHMueCA9IG1heFJlY3QueCAtIHJlc2l6ZVJlY3QueDsNCiAgICAgICAgfSBlbHNlIGlmICgocmVz
G0Sw+AGyW8SoWKKt63LgtEWMb02iVG3OoKNj6LhJlEUCz9vEyQRfVOq2TpbAcZs4iwCeNorUpS2L
ZGRFdmVudExpc3RlbmVyICIgKyBldmVudCArICI6ICIgKyBTdHJpbmcobGlzdGVuZXIpKTsNCgkJ
dGlvbkNoYW5nZQ0KCQkJCSYmIG5ld09yaWVudGF0aW9uUHJvcGVydGllcy5mb3JjZU9yaWVudGF0
dGluZw0KCS8vIGZ1bmN0aW9ucyBmcm9tIHRoZSBhbGxWYWxpZGF0b3JzIG9iamVjdA0KCS8vIGFz
fQ0KCQkNCgkJdmFyIHJ3UHJvcHMgPSBbICJ3aWR0aCIsICJoZWlnaHQiLCAib2Zmc2V0WCIsICJv
bZFPoY2B4JM+ONOh32MEm3x6NDZrXWnp8TA6wiu9YJLdSjRytNp5I97BTh8ekaNasT+zGzqs1Xay
wDKbvu4H4AhQDpwHWoQQw3MECD/oKcAWYFcQ8JmUI8D7wBkhxI9zBLAP9FTgCeBl4F6HPuY14HXg
CiAgICAgICAgICAgIChjb250YWluZWRSZWN0LnggKyBjb250YWluZWRSZWN0LndpZHRoKSA8PSAo
n3nMsiI6GneUNHXjheC5Rh8z+o8XbU5nrobDHE5rSKMPc4QnrYj+xAuLNRwuA2ngpUYf5loOWxE9
nIVgcHx9/TSaTMfAxkLsx2ywge40J8zV8bP8VYACAQuluULZPjQAAAABJRU5ErkJggg==
ZUN1c3RvbUNsb3NlKTsNCgkJfQ0KCQkNCgkJaXNFeHBhbmRQcm9wZXJ0aWVzU2V0ID0gdHJ1ZTsN
WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3goHFBQe/AkWfQAADBBJREFUeNrtXUFIW1kUPT9VqyKM
ew0KCQkJdmFyIHByb3BuYW1lID0gcmVxdWlyZWRQcm9wc1tpXTsNCgkJCWlmICghcHJvcGVydGll
dDs7DQoJCX0NCgl9Ow0KDQoJbXJhaWQuc2V0U3VwcG9ydHMgPSBmdW5jdGlvbihmZWF0dXJlLCBz
nbWFnZVJlYWR5ccllPAAAAqNJREFUeNqUlEtrE1EUx8+8EjNT27zTaMw0k6RJGpu+VqIi4k7rQtyK
M0I1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2MzBFQTlFNjYxMjAxMUUzQjhCRkRDNTJC
KSB7DQoJCQljb25zb2xlLmxvZygiKEktbXJhaWQuanMpICIgKyBtc2cpOw0KCQl9DQoJfTsNCg0K
dGlvblByb3BlcnRpZXMuZm9yY2VPcmllbnRhdGlvbiwNCgkJCQkJInNldE9yaWVudGF0aW9uUHJv
DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzRm9yRXZlbnQubGVuZ3RoOyBpKyspIHsN
aWYgKCF2YWxpZGF0ZShwcm9wZXJ0aWVzLCAic2V0T3JpZW50YXRpb25Qcm9wZXJ0aWVzIikpIHsN
CX07DQoNCglsb2cuZSA9IGZ1bmN0aW9uKG1zZykgew0KCQlpZiAobG9nTGV2ZWwgPD0gTG9nTGV2
ZW5lcikpOw0KCQlpZiAoIWV2ZW50KSB7DQoJCQltcmFpZC5maXJlRXJyb3JFdmVudCgiRXZlbnQg
ZnVuY3Rpb24od2lkdGgpIHsNCgkJCQlyZXR1cm4gIWlzTmFOKHdpZHRoKTsNCgkJCX0sDQoJCQki
dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw
RVBJQ1RVUkUiIDogInN0b3JlUGljdHVyZSIsDQoJCSJJTkxJTkVWSURFTyIgOiAiaW5saW5lVmlk
CWxvZy53ID0gZnVuY3Rpb24obXNnKSB7DQoJCWlmIChsb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0u
U2NyZWVuU2l6ZSA9IGZ1bmN0aW9uKCkgew0KCQlsb2cuaSgibXJhaWQuZ2V0U2NyZWVuU2l6ZSIp
YW1lKSkgew0KCQkJCWV4cGFuZFByb3BlcnRpZXNbcHJvcG5hbWVdID0gcHJvcGVydGllc1twcm9w
ID0gew0KCQkiTE9BRElORyIgOiAibG9hZGluZyIsDQoJCSJERUZBVUxUIiA6ICJkZWZhdWx0IiwN
ICAgaWYgKHJlc2l6ZVJlY3QueCA8IG1heFJlY3QueCkgew0KICAgICAgICAgICAgYWRqdXN0bWVu
TElORQ0KCQkJCXx8IChzdGF0ZSAhPT0gU1RBVEVTLkRFRkFVTFQgJiYgc3RhdGUgIT09IFNUQVRF
nkmw287xcKj2eKczZqqZBs97AthKg2N5B48zjvLOnCzJO6LWrV95g330bG6/XtPS0zeo+aLeBoH3n
VGhlIG9ubHkgdGltZSBpdCBpcyB2YWxpZCB0byBjYWxsIHJlc2l6ZSBpcyB3aGVuIHRoZSBhZCBp
nu7Ftt+5mBF0Go8sIBvsTtggqGgODboK66aIwNi0lJ7p+2TT89b7Pvo/LaKucHTj4+LzP+bzne855
eSIpOw0KICAgICAgICAgICAgcmV0dXJuIGFkanVzdG1lbnRzOw0KICAgICAgICB9DQoNCiAgICAg
aWVzLmFsbG93T3JpZW50YXRpb25DaGFuZ2UNCgkJCQkrICImZm9yY2VPcmllbnRhdGlvbj0iICsg
EULEAslAGnAPsBLICH5OB3yAF4gPdukHOoFWoBm4DnwLfBf83AJ0CCECkfauoiIA7Ogg0PcDBcBT
6c5f504e-8928-47b5-bfb5-73af8d8bf4b4
fXV1daZI0NHRwZkzZ1wP/mQStLa20tLSQkNDg+EM7Dt37iQjI0Om6XtCiD8ZGTva6B+jKMpJ4N8B
U2NyZWVuKHByb3BlcnRpZXMpOw0KICAgICAgICB9IGVsc2UgaWYgKCFpc0Nsb3NlUmVnaW9uT25T
N3hs1m5l8jHVRki0jIbXqcByVfEGuKx4xLMcZOMkeMQCTq86Kx4xit6vmXWzOFTdVBCi33nDFsIF
b25dOw0KCQlmb3IgKHZhciBwcm9wIGluIHByb3BlcnRpZXMpIHsNCgkJCXZhciB2YWxpZGF0b3Ig
CQlyZXR1cm47DQoJCX0NCgkJaWYgKCFpc1Jlc2l6ZVJlYWR5KSB7DQoJCQltcmFpZC5maXJlRXJy
OiAwLA0KCQkiaGVpZ2h0IiA6IDANCgl9Ow0KDQoJdmFyIGRlZmF1bHRQb3NpdGlvbiA9IHsNCgkJ
Ly8gYWxsb3dPcmllbnRhdGlvbkNoYW5nZSBhbmQgZm9yY2VPcmllbnRhdGlvbg0KCQl2YXIgcndQ
VGbD54QQ4j9lxjSSIqZUr0FsbCx79+419KK0HEO3gq/lGJoFH2Dv3r2yGVtKZceMlm0YdAhrgKe1
smVSh5sfVRTlnKqqV8NGgODyrtRqzblz5zh27NgcqgaloaGBxMRE0tLSZJr/WlGUv6mqavjIWZQJ
8OcD3TL+Q3V1NUePHp1DMwTZvn07ubm5Mk1HgCSjG0hmnMAymX719fVz4FsgR48epb6+XhbLMltN
RXhwYW5kUHJvcGVydGllcyIpOw0KCQlyZXR1cm4gZXhwYW5kUHJvcGVydGllczsNCgl9Ow0KDQoJ
dGlvbkNoYW5nZSIgOiBmdW5jdGlvbihhbGxvd09yaWVudGF0aW9uQ2hhbmdlKSB7DQoJCQkJcmV0
Qdls9qt3WV9fdx0sYowYbogGnymB0214txF8XUlQP/Mbxa0lME3T20RTIur04mDnOvB1I8FVM79R
Rm9yRXZlbnQuc3BsaWNlKGksIDEpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQkJ
ZXNpemVSZWN0KTsNCg0KICAgICAgICB2YXIgbWF4UmVjdCA9IHsgIngiOiAwLCAieSI6IDAgfTsN
ew0KCQkJY2FsbE5hdGl2ZSgiZXhwYW5kIik7DQoJCX0gZWxzZSB7DQoJCQljYWxsTmF0aXZlKCJl
c3RvbUNsb3NlUG9zaXRpb24iKSA/DQoJCQkJcHJvcGVydGllcy5jdXN0b21DbG9zZVBvc2l0aW9u
63zvDVq4pJyL3wYrphfCLFwDn0NYNxFjsqK1q0y2SewQuAFqw9iuRDqfEdnp0Q98IEex2HHQAEo5
IGFkanVzdG1lbnRzID0geyAieCI6IDAsICJ5IjogMCB9Ow0KCQkNCgkJdmFyIGFsbG93T2Zmc2Ny
3KRZ38wacMqmcieM1sxnBr9cLmvt3cvYLZTLZV4StKu05qd4PPyenp4W8A3a09PDu1NIKeET8Dh8
Ow0KCQkJcmV0dXJuOw0KCQl9DQoJCWlmIChsaXN0ZW5lcnMuaGFzT3duUHJvcGVydHkoZXZlbnQp
DQoJCQkJcmV0dXJuICh0eXBlb2YgZm9yY2VPcmllbnRhdGlvbiA9PT0gInN0cmluZyIgJiYgdmFs
ZXNpemVQcm9wZXJ0aWVzID0gZnVuY3Rpb24ocHJvcGVydGllcykgew0KCQlsb2cuaSgibXJhaWQu
aXRpb24gPT09ICJjZW50ZXIiKSB7DQogICAgICAgICAgICBjbG9zZVJlY3QueSA9IHJlc2l6ZVJl
B7qAX1OG/gRPmxGgaRPGTCYjZW1VdTnQwew3aiaTsfvpHcd7f5mdOVSzBLrNfNR1KnEUE7BL9yqV
aGlsZChpZnJhbWUpOw0KCQlpZnJhbWUgPSBudWxsOw0KCX07DQoNCglmdW5jdGlvbiBmaXJlRXZl
aXN0ZW5lcnMgZm91bmQiKTsNCgkJfQ0KCX07DQoNCglmdW5jdGlvbiBjb250YWlucyh2YWx1ZSwg
ZXRlIGxpc3RlbmVyc1tldmVudF07DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlsb2cuaSgibm8gbGlz
IHdlbGwgYXMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgb2YgYW55IGVycm9yIGV2ZW50IHRoYXQgbWF5
dGllcykgew0KCQlsb2cuaSgibXJhaWQuc2V0T3JpZW50YXRpb25Qcm9wZXJ0aWVzIik7DQoNCgkJ
bE5hdGl2ZSgiY2xvc2UiKTsNCgl9Ow0KDQoJbXJhaWQuZXhwYW5kID0gZnVuY3Rpb24odXJsKSB7
ICIpIik7DQogICAgfQ0KCQ0KCW1yYWlkLmR1bXBMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHsNCgkJ
nbW3U1dWlxr6rp6dnJJVKldLpdBEx8kuJYrVeNyAcwE0QBGpubqb29nbq7u7WDgwMjABs39/fz+Ry
Fvj9rPt8Ny86Pj5Oq6url1YkEoloDX5t9q6urromAUecoF8GATZYInxugzzr6+tffWc2m9XSEhiG
ID0gcndQcm9wc1tpXTsNCgkJCWlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3BuYW1l
VEFURVMuRVhQQU5ERUQpIHsNCgkJCW1yYWlkLmZpcmVFcnJvckV2ZW50KCJtcmFpZC5yZXNpemUg
PSBtcmFpZC5TVEFURVMuTE9BRElORykgew0KCQkJZmlyZUV2ZW50KG1yYWlkLkVWRU5UUy5TSVpF
CQl2YXIgY3VzdG9tQ2xvc2VQb3NpdGlvbiA9IHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoImN1
ZXZlbnRdOw0KCQkJbG9nLmkoIiAgIiArIGV2ZW50ICsgIiBjb250YWlucyAiICsgZXZlbnRMaXN0
ICAgICAgICB2YXIgY2xvc2VSZWN0ID0geyAid2lkdGgiOiA1MCwgImhlaWdodCI6IDUwIH07DQoN
dGF0ZS4NCgkJLy8gVHJpZ2dlciBhbiBlcnJvciBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBleHBh
URTHnU1NzI9Wi1y31jCiNfMjwhL6sqSHSOwhInoq+vA1qtdAeq8ee4p6KKynCvIhsEwLEgrKfFA3
nLdoEA21azN6NzG9oIGE2bdwERYggrdqI2SLb5G5o0VwYRZGZ0a/zig5WNo4PHF4+5DnvOed9Htnq
nYRg/7e7uvh0eHo7wwsrvE5zP53cQPIr6PMcV+T41NVUZvrog6MTPeDz+BoXn1yI0MzMjLS8v09bW
zptUU4nH45FZCOrwBGvP/aDVKtSUbk51+Orr6zl27BinT592bH4CsyKB2Q9CiMD4XsARrZarV6+O
CgkJCWNvbnNvbGUubG9nKCIoRC1tcmFpZC5qcykgIiArIG1zZyk7DQoJCX0NCgl9Ow0KDQoJbG9n
dFkiIF07DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgcmVxdWlyZWRQcm9wcy5sZW5ndGg7IGkrKykg
cmlidXRlKCJzcmMiLCAibXJhaWQ6Ly8iICsgY29tbWFuZCk7DQoJCWRvY3VtZW50LmRvY3VtZW50
CWxvZy5pKCJtcmFpZC5zZXRFeHBhbmRQcm9wZXJ0aWVzIik7DQoNCgkJaWYgKCF2YWxpZGF0ZShw
cyBjb250YWlucyAzIHJlYWQtd3JpdGUgcHJvcGVydGllczogd2lkdGgsIGhlaWdodCwgYW5kIHVz
E72409364B865B757E1D6B8DB73011BBB1D20C1A9F931ADD3C4C09E2794CE102F8AA7F2D50EB88F9880A576E6C7B0E95712CAE9416F7BACB798564627846E93B
Pc4bLrEjuo5GWxxYp4bwoYxwqVgWfQEMC3a7WHL4xkkX2t8BT/523hMXiswDG0EHAxxpqwftjAAl
T04gPSBtcmFpZC5PUklFTlRBVElPTl9QUk9QRVJUSUVTX0ZPUkNFX09SSUVOVEFUSU9OID0gew0K
nFzsSJB6L6ZnMdHFtZeVFbrbgxBMa/Pi+BaeCeL1eZ3529tWT8vr9iwsLdiKVhka9BqZBuvtDIRJ2
KSB7DQoJCQlpZiAobGlzdGVuZXIpIHsNCgkJCQl2YXIgbGlzdGVuZXJzRm9yRXZlbnQgPSBsaXN0
bG9nLmkoIm1yYWlkLmNyZWF0ZUNhbGVuZGFyRXZlbnQgd2l0aCAiICsgcGFyYW1ldGVycyk7DQoJ
aXplUmVjdC54ICsgcmVzaXplUmVjdC53aWR0aCkgPiAobWF4UmVjdC54ICsgbWF4UmVjdC53aWR0
bigpIHsNCgkJbG9nLmkoIm1yYWlkLmdldFN0YXRlIik7DQoJCXJldHVybiBzdGF0ZTsNCgl9Ow0K
TqBTA2qvtKenh2efT9aYq9Hqly66jGyyPnm5XFbiLkJV1DRN1ghfTTap1t1DFbGSSTd53sLvG0lV
IHByb3BlcnR5IHRoYXQgdGhlIG5hdGl2ZSBzaWRlIGhhcyB0byBrbm93IGFib3V0IGlzIHVzZUN1
VFRIHy5xm+Tl5ZGfny9zkGOqUO8vdjyTrRfVhRCFQb/AkHR0dFBeXh4x6wZZWVkUFBToVfGcToqE
322a737a-a0ca-44e0-bc85-649b1c7c1db6
bXJhaWQuZ2V0TWF4U2l6ZSA9IGZ1bmN0aW9uKCkgew0KCQlsb2cuaSgibXJhaWQuZ2V0TWF4U2l6
CQkJCXZhciB2YWxpZFBvc2l0aW9ucyA9IFsgInRvcC1sZWZ0IiwgInRvcC1jZW50ZXIiLCAidG9w
ZXJ0aWVzID0gZnVuY3Rpb24oKSB7DQoJCWxvZy5pKCJtcmFpZC5nZXRPcmllbnRhdGlvblByb3Bl
aW9uLnkgKyBwcm9wZXJ0aWVzLm9mZnNldFk7DQogICAgICAgIHJlc2l6ZVJlY3Qud2lkdGggPSBw
c2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDI4MDEx
dXBwb3J0ZWQpIHsNCgkJbG9nLmkoIm1yYWlkLnNldFN1cHBvcnRzICIgKyBmZWF0dXJlICsgIiAi
Zm9yY2VPcmllbnRhdGlvbiIgOiBPUklFTlRBVElPTl9QUk9QRVJUSUVTX0ZPUkNFX09SSUVOVEFU
Z2VFdmVudCA9IGZ1bmN0aW9uKG5ld1N0YXRlKSB7DQoJCWxvZy5pKCJtcmFpZC5maXJlU3RhdGVD
LnkgPSBtYXhSZWN0LnkgLSByZXNpemVSZWN0Lnk7DQogICAgICAgIH0gZWxzZSBpZiAoKHJlc2l6
iVBORw0KGgoAAAANSUhEUgAAAGAAAABgBAMAAAAQtmoLAAAAGFBMVEUAAAAzMzMzMzMzMzMzMzMzMzMzMzMzMzOW6p+xAAAACHRSTlMAmTkdj2BzVg1F16EAAABtSURBVHhe7dexCcAwDAVRow0+RHatDbJDFsj+02SAQMIVqvyvFw9jDPL4yzkXNwQqISAxoqSEACNKkhYEdEHgODcDDBgw8N18AXAgBIVqHwg1HJoRE18cfz17ESZMmFh8DWVE8lUaVdnwHXDOPfezMoezhMEMAAAAAElFTkSuQmCC
JiA1MCA8PSBoZWlnaHQ7DQoJCQl9LA0KCQkJIm9mZnNldFgiIDogZnVuY3Rpb24ob2Zmc2V0WCkg
eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0
VkVOVFMuRVJST1IsIG1lc3NhZ2UsIGFjdGlvbik7DQoJfTsNCg0KCW1yYWlkLmZpcmVSZWFkeUV2
67bb016b-be40-4c08-a190-96a3f3b503d3
CQlpZiAoIWNvbnRhaW5zKGV2ZW50LCBFVkVOVFMpKSB7DQoJCQltcmFpZC5maXJlRXJyb3JFdmVu
nWbHLrMTbYBVIb2/vhMvlMttsNurs7CSj0Si32+0W7D0BRMthOKuAS5cw6brEvyCQQk1NTdTY2Eht
RXZlbnRMaXN0ZW5lciIpOw0KCQkJcmV0dXJuOw0KCQl9DQoJCXZhciBsaXN0ZW5lcnNGb3JFdmVu
RSwgc3RhdGUpOw0KCQl9DQoJfTsNCg0KCW1yYWlkLmZpcmVWaWV3YWJsZUNoYW5nZUV2ZW50ID0g
a2n41TCMLzdx1k+Jmk6VSoUKhQIlk0kyTZPa2toIgFBta2sj0zQpmUxSoVCgSqUi0iJM3TRzv+F2
eCI6IDAsICJ5IjogMCB9Ow0KDQogICAgICAgIGlmIChpc1JlY3RDb250YWluZWQobWF4UmVjdCwg
KRYCvLMr1BQxmLpZAlVnfr0yFKS+cx34EV2l++zZMykDKtISqDzz0VCV7CowRBc97prW54ueWaov
YW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVI=
Z2h0KSB7DQoJCWxvZy5pKCJtcmFpZC5zZXRTY3JlZW5TaXplICIgKyB3aWR0aCArICJ4IiArIGhl
NjI0NTY5OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDNDMxMTM3NjYxMjAxMUUzQjhCRkRD
aWQuZ2V0Q3VycmVudFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7DQoJCWxvZy5pKCJtcmFpZC5nZXRD
+PDhWQ1+cXGxzIme28EvEkJYEipZei0lqAk+QqcS6WTp6uri0KFDM1aedqbE7/dTUlJiNPfCEeBp
AZQG1XXPKFo8LYu/gTPgz65IOcmcwYFb3yREhyWefNI=
BykSfu+BL2CRrGixnkcVkhmPJtfa/UQiPWfZZ52s6BYOEK4QY8UgMxaC34CVCv72s99vL2y4ScYq
MikgLSAyNTsNCiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21DbG9zZVBvc2l0aW9uLnNlYXJjaCgi
ZmZzZXRZIiwgImN1c3RvbUNsb3NlUG9zaXRpb24iLCAiYWxsb3dPZmZzY3JlZW4iIF07DQoJCWZv
ZW1lbnRUeXBlID09PSBQTEFDRU1FTlRfVFlQRVMuSU5MSU5FKQ0KCQkJCXx8IHN0YXRlID09PSBT
ICsgc3VwcG9ydGVkKTsNCgkJc3VwcG9ydGVkRmVhdHVyZXNbZmVhdHVyZV0gPSBzdXBwb3J0ZWQ7
wZfELiNGzwQ4mQAz7Rg6GXxJ7O6JYayWrmt8AKc4hk5z+Exil+5hrJDytNLd3e34uDvcjqETHT6T
KioqKioqKioqKioqKioqKioNCgkgKiBoZWxwZXIgbWV0aG9kcyBjYWxsZWQgYnkgU0RLDQoJICoq
c2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDM4MDEx
d7R8AAcmHsCPAF4HhMuzAH4zDOOf1rRuDnyYiBYpuLJIROEW0lev70EG/ioiKOEnGD4D3wngJxmm
blNjcmVlbiIpOw0KICAgICAgICBsb2cuZCgiZGVmYXVsdFBvc2l0aW9uICIgKyBkZWZhdWx0UG9z
Z2V0UGxhY2VtZW50VHlwZSA9IGZ1bmN0aW9uKCkgew0KCQlsb2cuaSgibXJhaWQuZ2V0UGxhY2Vt
KB9++KHsA5kC3w2aYNzhk1DPE+1DcQwbGxvJzc3VmxCP6DmEehrgVZkQxcxhjpSUFHbs2CENvpM1
M0I1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2MzBFQTlFQTYxMjAxMUUzQjhCRkRDNTJC
X+wupr62RM8Hr5mUZwRZsKjwH3CSigItbN0suXoUkh07VFPwZafOPXbS4XujrMsBztP/fb6Ijp0w
dXNTaXplLndpZHRoID0gY3VycmVudFBvc2l0aW9uLndpZHRoOw0KCQlwcmV2aW91c1NpemUuaGVp
Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGNEU5MjA4OTBDMjA2ODExODA4M0YyQ0E4QjA4
ZXJ0aWVzLndpZHRoID0gd2lkdGg7DQoJCQlleHBhbmRQcm9wZXJ0aWVzLmhlaWdodCA9IGhlaWdo
cm9wZXJ0aWVzLndpZHRoICsNCgkJCSImaGVpZ2h0PSIgKyByZXNpemVQcm9wZXJ0aWVzLmhlaWdo
ZW50Lmxlbmd0aCA9PT0gMCkgew0KCQkJCQlkZWxldGUgbGlzdGVuZXJzW2V2ZW50XTsNCgkJCQl9
IHNvIHJlbW92ZSBhbGwgbGlzdGVuZXJzDQoJCQkJLy8gZm9yIGdpdmVuIGV2ZW50DQoJCQkJZGVs
YXIgcmVxdWlyZWRQcm9wcyA9IFsgIndpZHRoIiwgImhlaWdodCIsICJvZmZzZXRYIiwgIm9mZnNl
ZWlnaHQ7DQoJfTsNCg0KCW1yYWlkLnNldFBsYWNlbWVudFR5cGUgPSBmdW5jdGlvbihwdCkgew0K
CgkJIk5PTkUiIDogIm5vbmUiDQoJfTsNCg0KCXZhciBFVkVOVFMgPSBtcmFpZC5FVkVOVFMgPSB7
aXRpb24ueCArICIgIiArIGRlZmF1bHRQb3NpdGlvbi55KTsNCiAgICAgICAgbG9nLmQoIm9mZnNl
IGlmIChjdXN0b21DbG9zZVBvc2l0aW9uLnNlYXJjaCgiY2VudGVyIikgIT09IC0xKSB7DQogICAg
OTIwODkwQzIwNjgxMTgwODNGMkNBOEIwODNCNTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRm
dsQRIEiCeOB54I9Wjx0IBOjt7aWzs5P29vaJn87OTrq7u+nr65s4nBEbG0tCQgJJSUl4vV4WLVo0
fQ0KCQkvLyBUaGUgb25seSB0aW1lIGl0IGlzIHZhbGlkIHRvIGNhbGwgZXhwYW5kIGlzIHdoZW4g
dGhlIGFkIGlzDQoJCS8vIGEgYmFubmVyIGN1cnJlbnRseSBpbiBlaXRoZXIgZGVmYXVsdCBvciBy
aWdodCINCgl9Ow0KDQoJdmFyIE9SSUVOVEFUSU9OX1BST1BFUlRJRVNfRk9SQ0VfT1JJRU5UQVRJ
cJ/EmvYoLI8j7JMlu6avMeNKkHDuNonDwybCqyRFXwWTRkWGWYdyDpAnMcNGgt+CVeBUADP+CnQZ
KSkgew0KCQkJCXJlc2l6ZVByb3BlcnRpZXNbcHJvcG5hbWVdID0gcHJvcGVydGllc1twcm9wbmFt
T01fQ0xPU0VfUE9TSVRJT04gPSBtcmFpZC5SRVNJWkVfUFJPUEVSVElFU19DVVNUT01fQ0xPU0Vf
SUFMIiA6ICJpbnRlcnN0aXRpYWwiDQoJfTsNCg0KCXZhciBSRVNJWkVfUFJPUEVSVElFU19DVVNU
c2VDdXN0b21DbG9zZS4NCgkJCS8vIFN0aWxsLCB3ZSdsbCBkbyBhIGJhc2ljIHNhbml0eSBjaGVj
Ow0KDQoJCWlmICh3aWR0aCAhPT0gcHJldmlvdXNTaXplLndpZHRoIHx8IGhlaWdodCAhPT0gcHJl
aGFuZ2VFdmVudCAiICsgbmV3U3RhdGUpOw0KCQlpZiAoc3RhdGUgIT09IG5ld1N0YXRlKSB7DQoJ
aXplQ2hhbmdlRXZlbnQgIiArIHdpZHRoICsgIngiICsgaGVpZ2h0KTsNCgkJaWYgKHN0YXRlICE9
ICAgICAgICB9DQoNCiAgICAgICAgdmFyIG1heFJlY3QgPSB7ICJ4IjogMCwgInkiOiAwIH07DQog
cmFpZC5maXJlRXJyb3JFdmVudCgiVW5rbm93biBNUkFJRCBldmVudDogIiArIGV2ZW50LCAiYWRk
YW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4=
ImN1c3RvbUNsb3NlUG9zaXRpb24iIDogZnVuY3Rpb24oY3VzdG9tQ2xvc2VQb3NpdGlvbikgew0K
PSByZWdpc3RlcmVkTGlzdGVuZXIgfHwgc3RyMSA9PT0gc3RyMikgew0KCQkJCQkJbGlzdGVuZXJz
NzQwNzIwNjgxMTgwODNBRjJCNzQzNDlDQ0IiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjRF
PSB2YWxpZGF0b3JzW3Byb3BdOw0KCQkJdmFyIHZhbHVlID0gcHJvcGVydGllc1twcm9wXTsNCgkJ
bjsNCgkJCX0NCgkJfQ0KCQlsaXN0ZW5lcnNGb3JFdmVudC5wdXNoKGxpc3RlbmVyKTsNCgl9Ow0K
dWU7DQoJfTsNCg0KCW1yYWlkLnN0b3JlUGljdHVyZSA9IGZ1bmN0aW9uKHVybCkgew0KCQlsb2cu
HsiRFRCFECnAHjtMwwzJi8BfJ6dnmyOAHBHiAAXYD/zKZaBXMZaTR7Vq527WEWAKP+EJxu4p3uvQ
dGllcy51c2VDdXN0b21DbG9zZSAhPT0gb2xkVXNlQ3VzdG9tQ2xvc2UpIHsNCgkJCWNhbGxOYXRp
Cg0KCW1yYWlkLnN1cHBvcnRzID0gZnVuY3Rpb24oZmVhdHVyZSkgew0KCQlsb2cuaSgibXJhaWQu
Ow0KCQlyZXR1cm4gc2NyZWVuU2l6ZTsNCgl9Ow0KDQoJbXJhaWQuZ2V0U3RhdGUgPSBmdW5jdGlv
ZWlnaHQgPSBoZWlnaHQ7DQoJfTsNCg0KCW1yYWlkLnNldE1heFNpemUgPSBmdW5jdGlvbih3aWR0
Ki8NCg0KCXZhciBWRVJTSU9OID0gIjIuMCI7DQoNCgl2YXIgU1RBVEVTID0gbXJhaWQuU1RBVEVT
KTsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCgkJCQlldmVudExpc3RlbmVy
c2lvbiIpOw0KCQlyZXR1cm4gVkVSU0lPTjsNCgl9Ow0KDQoJbXJhaWQuaXNWaWV3YWJsZSA9IGZ1
bnQoZXZlbnQpIHsNCgkJdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1
87gToILv2ETXq/LvCnAItNAuDI4lKA1bQlpUT+XO1cAt12BEFmLQNcW42suUqYh26mvAJXCZxfc5
MkiCvaSBIdAPkgMRnUvBj4Is2Esxx7ttV7QIW81gjI/PzE6ErF2SorLBRj82Nyg8147oAnY+bWET
CQkJdmFyIHZhbGlkVmFsdWVzID0gWyAicG9ydHJhaXQiLCAibGFuZHNjYXBlIiwgIm5vbmUiIF07
CWlmIChzdXBwb3J0ZWRGZWF0dXJlc1ttcmFpZC5TVVBQT1JURURfRkVBVFVSRVMuQ0FMRU5EQVJd
cm9wZXJ0aWVzLndpZHRoOw0KICAgICAgICByZXNpemVSZWN0LmhlaWdodCA9IHByb3BlcnRpZXMu
YWlkLnNldFJlc2l6ZVByb3BlcnRpZXMiKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAg
CdyqJ8Bws7+sVCqex9q99gmCAn5NGfoYDjOv/24zfVXfHchc87PZLBmG4fnYMRwQxZiPfv1u5CBj
cw0KCQkvLyBhIGJhbm5lciBjdXJyZW50bHkgaW4gZWl0aGVyIGRlZmF1bHQgb3IgcmVzaXplZCBz
dHJpbmciICYmIHZhbGlkUG9zaXRpb25zLmluZGV4T2YoY3VzdG9tQ2xvc2VQb3NpdGlvbikgIT09
YW1lID0gcndQcm9wc1tpXTsNCgkJCWlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3Bu
RWxlbWVudC5hcHBlbmRDaGlsZChpZnJhbWUpOw0KCQlpZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVD
nbWFnZVJlYWR5ccllPAAAA2NJREFUeNqMVF1Ik1EYPm7TpsIca84pGs6VrboYaeRPpFgXKUzBH4S8
y+WyMrl3snyCoIFfU4Yikn4Q0YSKDqCOJPDL4XPhCE7Y7gBkxf+DthyoNPM5zgViIVxcqnit5PN5
Lm9mZnNldFkgKyBhZGp1c3RtZW50cy55KSArDQoJCQkiJmN1c3RvbUNsb3NlUG9zaXRpb249IiAr
InNldFJlc2l6ZVByb3BlcnRpZXM/IiArIHBhcmFtcyk7DQoNCgkJaXNSZXNpemVSZWFkeSA9IHRy
IGJlIHRocm93bi4NCglmdW5jdGlvbiB2YWxpZGF0ZShwcm9wZXJ0aWVzLCBhY3Rpb24pIHsNCgkJ
bmFtZV07DQoJCQl9DQoJCX0NCg0KCQkvLyBJbiBNUkFJRCB2Mi4wLCBhbGwgZXhwYW5kZWQgYWRz
nOPakmwovMTMz81JZWZm+oKDAkJiYGENk3o2NjSVYgsXFxbHc3NxCMXX5KYRkFRU2XzEajQZUxSQS
aW9uICE9PSBtcmFpZC5PUklFTlRBVElPTl9QUk9QRVJUSUVTX0ZPUkNFX09SSUVOVEFUSU9OLk5P
n1p961QpmjJWOj48/rKysvBsfHz+bm5tji4uLBBBls1nCzaeamUD3F1Tf3dHR8RoFPQ0GgywUCtHe
zcXq1NRUvF4vDQ0NhkjQ0tLC9evXHZ+i1gwJurq6DKfd2759u+zVvBFgi6qqAVsJoKpqQFGUj4B/
IkhJRERFTiIgOiAiaGlkZGVuIg0KCX07DQoNCgl2YXIgUExBQ0VNRU5UX1RZUEVTID0gbXJhaWQu
0Is1LgSOVaPgZ90MbTyPrQhhmcuBo04r+BG3QtfpgGUeBY66hhEUOw1dauHWGRdVjuWTdLxd+ltu
WWVmeoia2gmaJRLlBP7HM1BmUXgja/gco6LXU8ROSdH+IOF+VpsVJkWXRJrboU68AjyStXOiaC0G
CPGz6wkghFgD1AOGDWZ7ezsVFRUzpuKtMBH5+fksWrTIlGsDrBNCXHEtAYQQhcBxo/06OjooLy+n
CgkJZm9yICh2YXIgaSA9IDA7IGkgPCByd1Byb3BzLmxlbmd0aDsgaSsrKSB7DQoJCQl2YXIgcHJv
nsLoIMVCpRERCAgfSZXpR2ZVJCEIgaIQm+MdCIkXRTTTnQG0qorCFm21zp+f9+IQ5NHvh4eP7vnOe
IGRlZmF1bHRQb3NpdGlvbi55KTsNCiAgICAgICAgbG9nLmQoIm9mZnNldCAiICsgcHJvcGVydGll
aWVudGF0aW9uUHJvcGVydGllcyBjb250YWlucyAyIHJlYWQtd3JpdGUgcHJvcGVydGllczoNCgkJ
Xl4efr9f5sSOljwphDgarucOe45zIUQq8C5QGMo4g4ODNDc3U1NTM2MmIicnhw0bNpCenm7F6uYJ
DQoNCgl2YXIgc2NyZWVuU2l6ZSA9IHsNCgkJIndpZHRoIiA6IDAsDQoJCSJoZWlnaHQiIDogMA0K
ds0e4LpWC5M17yLC5rudBBLYXfcA37qNAE4AfzIJnOoYSmD3rQf4zk0ECKfD53bHUAK773RNgJN8
OIdvfFevubnZthtIM0kCCcyOwD9vBmnmGfP7/TMy88N1S9fOa2gzRQIJzMonE+C8VstwH7Waibt6
x7zGWB6+Y06w7xFFgClMxBZgFwa2nm2SI4zl3j3jRBUfkQS4jQzRQBpwP2OHUZ4Cltn0dT8EAS9n
ciBjdXJyZW50UG9zaXRpb24gPSB7DQoJCSJ4IiA6IDAsDQoJCSJ5IiA6IDAsDQoJCSJ3aWR0aCIg
c2l0aW9uLndpZHRoID0gd2lkdGg7DQoJCWRlZmF1bHRQb3NpdGlvbi5oZWlnaHQgPSBoZWlnaHQ7
276d662d73a69f74945dc78427b1e845a8f31dc7de267fd8
IChyZWN0LnggKyByZWN0LndpZHRoKSArICIsIiArIChyZWN0LnkgKyByZWN0LmhlaWdodCkgKyAi
KioqKioqKioqKiovDQoNCglmdW5jdGlvbiBjYWxsTmF0aXZlKGNvbW1hbmQpIHsNCgkJdmFyIGlm
UE9TSVRJT04gPSB7DQoJCSJUT1BfTEVGVCIgOiAidG9wLWxlZnQiLA0KCQkiVE9QX0NFTlRFUiIg
bXBpbmcgbGlzdGVuZXJzICgiICsgbkV2ZW50cyArICIgZXZlbnRzKSIpOw0KCQlmb3IgKCB2YXIg
bG93T3JpZW50YXRpb25DaGFuZ2UgPSBuZXdPcmllbnRhdGlvblByb3BlcnRpZXMuYWxsb3dPcmll
ZW50ID0gZnVuY3Rpb24oKSB7DQoJCWxvZy5pKCJtcmFpZC5maXJlUmVhZHlFdmVudCIpOw0KCQlm
DQoJbXJhaWQuY3JlYXRlQ2FsZW5kYXJFdmVudCA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHsNCgkJ
nhgTMAXauAs13gXsgmOMEUEQul4sMBgMx9q8RNnxOPWDlBHa7/TpufQobbn47J0GoZDKZCApJEISJ
BqQgPWjjUHyWmhDr4m6riNeSC5gl0RoHQQ8Tt4JKJk8MMWfFlDrKWq6tmCcM+kbp6hFpY303nYiL
Z2VFdmVudCA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsNCgkJbG9nLmkoIm1yYWlkLmZpcmVT
aSgibXJhaWQuc3RvcmVQaWN0dXJlICIgKyB1cmwpOw0KCQlpZiAoc3VwcG9ydGVkRmVhdHVyZXNb
bG9zZSBldmVudCByZWdpb24gd2lsbCBub3QgYXBwZWFyIGVudGlyZWx5IG9uc2NyZWVuIiwgIm1y
Gi5cuDAjJM7JyWHDhg2kp6cTFxcX6nAngNJwm4WoMIO/Hfi72f7Dw8M0NTVRWVnJ5cuXHWXUMzMz
Wi5OoDHecBsvtNF7r6BKtytRm6Ft5sQyBWaZLA5Va9+rTipMl3WrGkyEfoeOmJEn2kbVPzrUV6Zq
ZUN1c3RvbUNsb3NlOw0KCQkvLyB0aGUgaXNNb2RhbCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkNCgkJ
dCkpIHsNCiAgICAgICAgICAgIGFkanVzdG1lbnRzLnkgPSAobWF4UmVjdC55ICsgbWF4UmVjdC5o
ZW50VHlwZSIpOw0KCQlyZXR1cm4gcGxhY2VtZW50VHlwZTsNCgl9Ow0KDQoJbXJhaWQuZ2V0UmVz
fTsNCgl2YXIgaXNWaWV3YWJsZSA9IGZhbHNlOw0KCXZhciBpc0V4cGFuZFByb3BlcnRpZXNTZXQg
IHByb3BlcnR5IGluIGV4cGFuZFByb3BlcnRpZXMgd2UgYWN0dWFsbHkgY2FyZSBhYm91dCBpcyB1
OB84k4abNNzWpMVBdhI+TSgQmCqTKdPPQrwq6j4YdMU=
ZXZlbnQgaW4gbGlzdGVuZXJzKSB7DQoJCQl2YXIgZXZlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnNb
blByb3BlcnRpZXMsIG9yDQoJLy8gc2V0UmVzaXplUHJvcGVydGllcykuDQoJLy8gSXQgc2VydmVz
eXzsMn0Ee1sjiDTxnUObShXRJRJxM5ozayXcDT4aXG9jtDDzPYc3+lxF9Dk6T5N4ucyE1+o2DX1r
ypWGeV2rFzQS8JaGKVUc6metnqwyNK8PkHiLQ5UpD/e7Slf3PoaM6z9RfXm4RQLfG0SoUqKtOwm4
Rm9yRXZlbnRbaV07DQoJCQkJCXZhciBzdHIxID0gU3RyaW5nKGxpc3RlbmVyKTsNCgkJCQkJdmFy
dFkuDQoJCS8vIFRoZSByZW1haW5pbmcgdHdvIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsLg0KCQl2
ciAodmFyIGkgPSAwOyBpIDwgcndQcm9wcy5sZW5ndGg7IGkrKykgew0KCQkJdmFyIHByb3BuYW1l
nzzOMcSXw5OSESqUS1ft5/C3AAL39YeI2ufApAAAAAElFTkSuQmCC
fTsNCg0KCS8vIFRoZSBhY3Rpb24gcGFyYW1ldGVyIGlzIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSBu
DQogICAgICAgIHJldHVybiAoY29udGFpbmVkUmVjdC54ID49IGNvbnRhaW5pbmdSZWN0LnggJiYN
XSIgKw0KICAgICAgICAgICAgIiAoIiArIHJlY3Qud2lkdGggKyAieCIgKyByZWN0LmhlaWdodCAr
M1o94uLiLEvy7DS1H25zYOeycWZmJnFxcXrNztxBACHEj4BmBsi8vDxXqf1QkzO40TGUwOhaEOs7
Cgl9Ow0KDQoJbXJhaWQuc2V0T3JpZW50YXRpb25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24ocHJvcGVy
dmlvdXNTaXplLmhlaWdodCkgew0KCQkJbXJhaWQuZmlyZVNpemVDaGFuZ2VFdmVudCh3aWR0aCwg
NjI0NTY5OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2MzBFQTlFNTYxMjAxMUUzQjhCRkRD
HCsOpIMlIIH/84I+0A1+TxXR88EWsAuUgWTgnHCMHwyDVvAINIFBK0mjTVaPRHAMVIJF4At4AdrB
7roDYTsCK7nTtmLH6eB1dXVpTQKRZv+qJW1iYsLRczFWIHWwEMA26uc24ieLBLJ9Apkz3w34HBHC
b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N
n877Ped5Xyv4dEYAMSK2rq/tkt9tlXq83Cu9BwC8+zyQ4B5wHLgAG4M7IyAgfHR31FhcXv8F7EXAZ
R0UiIDogInNpemVDaGFuZ2UiLA0KCQkiU1RBVEVDSEFOR0UiIDogInN0YXRlQ2hhbmdlIiwNCgkJ
cmlnaHQiKSAhPT0gLTEpIHsNCiAgICAgICAgICAgIGNsb3NlUmVjdC54ID0gcmVzaXplUmVjdC54
Y2FsbGVkIHdoZW4gYWQgaXMgaW4gZXhwYW5kZWQgc3RhdGUiLCAibXJhaWQucmVzaXplIik7DQoJ
dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu
cm9wZXJ0aWVzLCAic2V0RXhwYW5kUHJvcGVydGllcyIpKSB7DQoJCQlsb2cuZSgiZmFpbGVkIHZh
Vmlld09uU2NyZWVuKHByb3BlcnRpZXMpIHsNCiAgICAgICAgbG9nLmQoImZpdFJlc2l6ZVZpZXdP
ndBAdSC2HG7SVlJRoT7ssaXt7e+3k5KSLiIiQJgRFMBgUmpzIqE97enq+lJaWhrbciYwRKE+NW32G
wHIwF3xU3LtvZid4E+RFOLaLn5myopNEywp6bTAdDnAYtIBzbF31QmtZU2RFxwe5DrtCTMFq8BYU
b3VuZCBmb3IgZXZlbnQgIiArIGV2ZW50KTsNCgkJCQl9DQoJCQkJaWYgKGxpc3RlbmVyc0ZvckV2
ykqpBw9FEzg9OYNZTfDVV19x8uRJQ9+1Z88evWqh457/SdMEAFAU5Rt0agnNmzdP2hSYJYFbMnMY
ZGp1c3RtZW50czsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gaXNSZWN0Q29udGFpbmVkKGNv
cGVydGllcyIpOw0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJb3JpZW50YXRpb25Qcm9wZXJ0aWVzLmFs
IGJ5IGRlZmluaXRpb24gY292ZXIgdGhlIGVudGlyZSBzY3JlZW4sDQoJCS8vIHNvIHRoZSBvbmx5
CiAgICAgICAgbWF4UmVjdC53aWR0aCA9IG1heFNpemUud2lkdGg7DQogICAgICAgIG1heFJlY3Qu
Be7QrsqPmAw+/mGKt1rfE4xUyqIbwDhIMrm+gI9R36osBPfr7AZBjsXYdbRbryI6ifGz3sLxbs24
bnRhdGlvbkNoYW5nZTsNCgkJb3JpZW50YXRpb25Qcm9wZXJ0aWVzLmZvcmNlT3JpZW50YXRpb24g
ZW4pIHsNCgkJCQlyZXR1cm4gKHR5cGVvZiBhbGxvd09mZnNjcmVlbiA9PT0gImJvb2xlYW4iKTsN
CXZhciBsZW4gPSBsaXN0ZW5lcnNGb3JFdmVudC5sZW5ndGg7DQoJCQkJZm9yICh2YXIgaSA9IDA7
bGlkYXRpb24iKTsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCXZhciBvbGRVc2VDdXN0b21DbG9zZSA9
cm9wcyA9IFsgImFsbG93T3JpZW50YXRpb25DaGFuZ2UiLCAiZm9yY2VPcmllbnRhdGlvbiIgXTsN
TEKyEjRxrFsg3g7RTtDAJBck76wMxznmE5CgWvRtDn5IkdhgdoBx3nmnKtGnKfiIDYI1KpjjugrR
IGlmIChyZXNpemVSZWN0LnkgPCBtYXhSZWN0LnkpIHsNCiAgICAgICAgICAgIGFkanVzdG1lbnRz
IG5ld09yaWVudGF0aW9uUHJvcGVydGllcyA9IHt9Ow0KCQluZXdPcmllbnRhdGlvblByb3BlcnRp
dCA9IGxpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnNbZXZlbnRdIHx8IFtdOw0KCQkvLyBjaGVj
cQhUgxQTvcdS4ANnjC7jqcDLHkRG9BjFCtt0FxRY6PJOcqxcM86lDvziBYQ7Lo9JRBtbbrEtFe1o
gk2q6O+8VLSasjFwS1PEaps2pym8SiK6kcarhIJLaT8O8m3YZYM3oNmu6CwwApo0RtnPDaSV/dmx
bnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsNCgkJCQlsb2cuaSgiICAgICIgKyBldmVudExpc3Rl
39GluvWwGycKpL6SS4VOhU6FttX+CjAAgpoINtDHo/4AAAAASUVORK5CYII=
cmVudFBvc2l0aW9uLnggPSB4Ow0KCQljdXJyZW50UG9zaXRpb24ueSA9IHk7DQoJCWN1cnJlbnRQ
yoegUsOhuuEpMKbRh0qQf4I+K6J/gEegmompVLSarWEN0bWgN+YtMqPoFGbKAY3RDlKwdHPKA9tA
ICAgICAgICBpZiAoIWFsbG93T2Zmc2NyZWVuKSB7DQogICAgICAgICAgICBpZiAocHJvcGVydGll
bmRlZC4NCgkJaWYgKHBsYWNlbWVudFR5cGUgPT09IFBMQUNFTUVOVF9UWVBFUy5JTlRFUlNUSVRJ
aWdodCkgew0KICAgICAgICAgICAgICAgIG1yYWlkLmZpcmVFcnJvckV2ZW50KCJyZXNpemUgd2lk
CEWGLRSoWG5Cptt36Le0iO7OdQdhD3wY0XHmNztzzpzz30AkEkmbbi09bRq2VOhU6Dgtw6XjrMdW
UL94q7CdKlraOn/A4RdFBajAYZRpJT6i2VlEQ2qW5ufGIvkpbuDJVDM4r+vTk60rjbG2WFPLDI3L
niooKjZjIsVAkJSXdIw1IFyqvt7d3pLy8PCFksXJgYIAPDg5aGxsbs8OzCY2E+vr692tra4LIFovl
OlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7tuMs8AAADCElEQVR42uzZW0gU
7d962ba4-a392-449a-a02d-6c5be5613928
DQoJCWxvZy5pKCJtcmFpZC5wbGF5VmlkZW8gIiArIHVybCk7DQoJCWNhbGxOYXRpdmUoInBsYXlW
ZW50TGlzdGVuZXJzLmxlbmd0aDsNCgkJCWxvZy5pKGxlbiArICIgbGlzdGVuZXIocykgZm91bmQi
Zy5pKCJtcmFpZC5zZXRDdXJyZW50UG9zaXRpb24gIiArIHggKyAiLCIgKyB5ICsgIiwiICsgd2lk
KioqKioqKi8NCg0KCXZhciBzdGF0ZSA9IFNUQVRFUy5MT0FESU5HOw0KCXZhciBwbGFjZW1lbnRU
Tj6B20aRnrWK1a0njw4kcN0q1iKB9GbROph9HZcD182iLQJIbRevezcuVR1Dke3ipV0YITu272Wt
dXJuICh0eXBlb2YgYWxsb3dPcmllbnRhdGlvbkNoYW5nZSA9PT0gImJvb2xlYW4iKTsNCgkJCX0s
q1e5ePEiIyMjlj6vx+MhOzub1atX4/f7WbhwIR6Px6rhHxVCnJwVBAiq+3eBwlDGGRwcpLm5mZqa
UmVjdC55ID0gcmVzaXplUmVjdC55Ow0KICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUNsb3NlUG9z
NzQwNzIwNjgxMTgwODNBRjJCNzQzNDlDQ0IiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RkJF
bG9zZSIgOiBmYWxzZSwNCgkJImlzTW9kYWwiIDogdHJ1ZQ0KCX07DQoNCgl2YXIgb3JpZW50YXRp
eSArIHByb3BlcnRpZXMub2Zmc2V0WSArIGFkanVzdG1lbnRzLnk7DQogICAgICAgIHByaW50UmVj
dWx0UG9zaXRpb24ueCArIHByb3BlcnRpZXMub2Zmc2V0WDsNCiAgICAgICAgcmVzaXplUmVjdC55
ID0gZnVuY3Rpb24oKSB7DQoJCWxvZy5pKCJtcmFpZC5jbG9zZSIpOw0KCQlpZiAoc3RhdGUgPT09
nCQ6HY8Lr9Tr8fv9ji8Xy6PDw8CKTyUh4LoNzUBkg9l/I4OCg2ePxkNPpfOB2u0cbGhoeQuJZsVjk
n67MixouMFLFY7AeOnCuoTsMYkV6vJ41GwxugR1cnNzY2POvr66/qhlzPChlRS0tLHuuv6F74XpCq
ZWVuID0gcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgiYWxsb3dPZmZzY3JlZW4iKSA/IHByb3Bl
Ti5zdHJpbmdpZnkocGFyYW1ldGVycykpOw0KCQl9IGVsc2Ugew0KCQkJbG9nLmUoImNyZWF0ZUNh
b25Qcm9wZXJ0aWVzID0gew0KCQkiYWxsb3dPcmllbnRhdGlvbkNoYW5nZSIgOiB0cnVlLA0KCQki
BXH2z0QJatAT+dduocjO+a3+Qw4addLbWGfjpFk4jq8YxEEvQ+fjDYZwyOYdijUP1/UBVHsReiG6
bg0KCS8vIChpbiBvdGhlciB3b3Jkcywgc2V0RXhwYW5kUHJvcGV0aWVzLCBzZXRPcmllbnRhdGlv
iaibbFrL1SSRSHC/bG9vLw0NDQUKfDeaSCRYwT8nom5PGg8Q0TjrUy0tLbWAdKhLS0s8YZJxT7tP
bXJhaWQuRVZFTlRTLlZJRVdBQkxFQ0hBTkdFLCBpc1ZpZXdhYmxlKTsNCgkJfQ0KCX07DQoNCgkv
nB29AZrS2tibX6/XvqVTqdqFQuPUNBcuDC8+09ndxq7wR+yRD6Q+o28IDHMDuCmyr+UOM2+XWJhKN
dCgiVW5rbm93biBNUkFJRCBldmVudDogIiArIGV2ZW50LCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIp
CX07DQoNCgl2YXIgY3VycmVudE9yaWVudGF0aW9uID0gMDsNCg0KCXZhciBsaXN0ZW5lcnMgPSB7
bUNsb3NlUG9zaXRpb24uc2VhcmNoKCJ0b3AiKSAhPT0gLTEpIHsNCiAgICAgICAgICAgIGNsb3Nl
NjI0NTY5OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2MzBFQTlFOTYxMjAxMUUzQjhCRkRD
cyBpbnZhbGlkIiwgIm1yYWlkLiIgKyBhY3Rpb24pOw0KCQkJCXJldHZhbCA9IGZhbHNlOw0KCQkJ
ICAgICAgICB2YXIgcmVzaXplUmVjdCA9IHt9Ow0KICAgICAgICByZXNpemVSZWN0LnggPSBkZWZh
c3RlbmVyc0ZvckV2ZW50W2ldKTsNCgkJCWlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzRm9yRXZl
dGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGV2ZW50ICIgKyBldmVudCk7DQoJCX0NCgl9Ow0KDQoJbXJh
DQoJCSJvZmZzZXRZIiA6IDAsDQoJCSJhbGxvd09mZnNjcmVlbiIgOiB0cnVlDQoJfTsNCg0KCXZh
ayBvbiB0aGUgd2lkdGggYW5kIGhlaWdodCBwcm9wZXJ0aWVzLCB0b28uDQoJCQkid2lkdGgiIDog
IsSCCHw3ES07HZGDgwOan59XDvTrdH5+ng4ODtyQYJmIuoMC/jgRnTsZhXw+76uJF7FE5PN5pyQ4
IHJlc2l6ZVByb3BlcnRpZXMuY3VzdG9tQ2xvc2VQb3NpdGlvbiArDQoJCQkiJmFsbG93T2Zmc2Ny
DQoNCgl2YXIgbWF4U2l6ZSA9IHsNCgkJIndpZHRoIiA6IDAsDQoJCSJoZWlnaHQiIDogMA0KCX07
dy/Myn0WRtYGKBNP8ubn9boJWJi+WWmLzp0V+W9pqfM=
IGV4cGFuZFByb3BlcnRpZXMudXNlQ3VzdG9tQ2xvc2U7DQoNCgkJLy8gZXhwYW5kUHJvcGVydGll
dCAiICsgcHJvcGVydGllcy5vZmZzZXRYICsgIiAiICsgcHJvcGVydGllcy5vZmZzZXRZKTsNCg0K
CQlsb2cuaSgibXJhaWQuc2V0UGxhY2VtZW50VHlwZSAiICsgcHQpOw0KCQlwbGFjZW1lbnRUeXBl
Y3QueSArIChyZXNpemVSZWN0LmhlaWdodCAvIDIpIC0gMjU7DQogICAgICAgIH0gZWxzZSBpZiAo
9zxfARL0s6SX2UmpVKJ0Ou3rEmGaJqXTaZaePExpXNIyeRQlwhQJkkqlQoVCgZLJJJmmKaW3cVtb
Cg0KCW1yYWlkLnNldEV4cGFuZFByb3BlcnRpZXMgPSBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7DQoJ
CQkJCQkJIm1yYWlkLnNldFJlc2l6ZVByb3BlcnRpZXMiKTsNCgkJCQlyZXR1cm47DQoJCQl9DQoJ
fQ0KCQl9DQoJCXJldHVybiByZXR2YWw7DQoJfTsNCg0KCXZhciBhbGxWYWxpZGF0b3JzID0gew0K
nCdvb2/tJZAfLy8uDyI4pFApmMpkKNRpNJr7rxEaWiaS0NhrQAuk1NTVPoDWDiRmS2RweHrYK9aO0
dCA9IHByb3BlcnRpZXMuaGVpZ2h0Ow0KICAgICAgICBwcmludFJlY3QoInJlc2l6ZVJlY3QiLCBy
Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRUU5MjA4OTBDMjA2ODExODA4M0YyQ0E4QjA4
ZSIpOw0KCQlyZXR1cm4gbWF4U2l6ZTsNCgl9Ow0KDQoJbXJhaWQuZ2V0T3JpZW50YXRpb25Qcm9w
cnRpZXNbcHJvcG5hbWVdOw0KCQkJfQ0KCQl9DQoNCgkJLy8gU2V0dGluZyBhbGxvd09yaWVudGF0
ID0gZGVmYXVsdFBvc2l0aW9uLnkgKyBwcm9wZXJ0aWVzLm9mZnNldFk7DQogICAgICAgIHJlc2l6
ICAgY2xvc2VSZWN0LnkgPSByZXNpemVSZWN0LnkgKyByZXNpemVSZWN0LmhlaWdodCAtIDUwOw0K
nUADSo43SMCLKQimS0GKDTqfLys7OvlldXZ2Vnp4uy8nJuZGWlmacnp52ejyeANZ4AB/AQ4kigSQg
ZGp1c3RtZW50cy54KSArDQoJICAgICAgICAiJm9mZnNldFk9IiArIChyZXNpemVQcm9wZXJ0aWVz
dWx0UG9zaXRpb24ueCA9IHg7DQoJCWRlZmF1bHRQb3NpdGlvbi55ID0geTsNCgkJZGVmYXVsdFBv
bWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp
J+ABYuAFIBusBW6QD0ZAHajhUzAeQrRBtoOuwL94ANwgVuI8B9gA6nnud7DXRH5DosVTucyELaDY
ZXRDdXJyZW50UG9zaXRpb24gPSBmdW5jdGlvbih4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7DQoJCWxv
bXBvbmVudCh1cmwpKTsNCgl9Ow0KDQoJbXJhaWQucGxheVZpZGVvID0gZnVuY3Rpb24odXJsKSB7
ZWxFbnVtLkVSUk9SKSB7DQoJCQljb25zb2xlLmxvZygiKEUtbXJhaWQuanMpICIgKyBtc2cpOw0K
Q3VzdG9tQ2xvc2UpIHsNCgkJbG9nLmkoIm1yYWlkLnVzZUN1c3RvbUNsb3NlICIgKyBpc0N1c3Rv
b24gIiArIHggKyAiLCIgKyB5ICsgIiwiICsgd2lkdGggKyAiLCIJKyBoZWlnaHQpOw0KCQlkZWZh
cGVydGllcyIpOw0KCQlyZXR1cm4gcmVzaXplUHJvcGVydGllczsNCgl9Ow0KDQoJbXJhaWQuZ2V0
b3NpdGlvbi53aWR0aCA9IHdpZHRoOw0KCQljdXJyZW50UG9zaXRpb24uaGVpZ2h0ID0gaGVpZ2h0
M0I1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDNDMxMTM3NzYxMjAxMUUzQjhCRkRDNTJC
Y29udGFpbmVkUmVjdC55ID49IGNvbnRhaW5pbmdSZWN0LnkgJiYNCiAgICAgICAgICAgIChjb250
YW1lIG9mIHRoZSBzZXR0ZXIgZnVuY3Rpb24NCgkvLyB3aGljaCBjYWxsZWQgdGhpcyBmdW5jdGlv
IGJvdGggYXMgdGhlIGtleSB0byBnZXQgdGhlIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2YgdmFsaWRh
URzHcddVu4hlFwvTsKToZhZRPlVQgdFDQReyQui1XgLBSirwQXqLwvC1EKIgrMgKgkIfoqALimFa
dmFsdWUpIHsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJ
ICIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBldmVudCAiICsgZXZlbnQpOw0KCQkJCXJldHVy
bUBWYjSWU2Y2m8Ank40jRSIc1uhqSV/E7E5zO5feXMTddbAIjbIQPSK5cRhtQBctQupB2hSoJkxH
ZW5lcnMubGVuZ3RoICsgIiBsaXN0ZW5lcnMiKTsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgZXZl
npBw3LkqubDqdvs1xQNqt1iHucygGshBEh0LQQREBY2fHx8F2HLfkcl1OJKaut1vtCiEGy6M9V/Yg
bnRhaW5pbmdSZWN0LCBjb250YWluZWRSZWN0KSB7DQogICAgICAgIGxvZy5kKCJpc1JlY3RDb250
LA0KCQkiaGVpZ2h0IiA6IDAsDQoJCSJjdXN0b21DbG9zZVBvc2l0aW9uIiA6IFJFU0laRV9QUk9Q
aCwgaGVpZ2h0KSB7DQoJCWxvZy5pKCJtcmFpZC5zZXRNYXhTaXplICIgKyB3aWR0aCArICJ4IiAr
AN3d3ejr60M4HMbIyAjGxsYudXR0FAMDA+jq6pIxBLMAfjUM4wtusljLwiLdHFm8UeaegwjhgBNh
CgkJCXJldHVybjsNCgkJfQ0KCQlpZiAoIWNvbnRhaW5zKGV2ZW50LCBFVkVOVFMpKSB7DQoJCQlt
CgkJCX0sDQoJCQkidXNlQ3VzdG9tQ2xvc2UiIDogZnVuY3Rpb24odXNlQ3VzdG9tQ2xvc2UpIHsN
bEOJ1dCLFTrkU+hezQrTrYTOVuiwT6GNeXgOglZCj2sb9Cl0MN7wOFXoIY2vc30KPR8DWliYDt2n
K2a+LQQIksADvAX8TrbP6OgodXV1s0YbFBcXk5WVZfQI+EHgOSGEpdm6bLunLIR4AfizkT79/f1U
IHRoaXMgZnVuY3Rpb24gbXVzdCBjb250YWluIHdpZHRoLCBoZWlnaHQsIG9mZnNldFgsIG9mZnNl
4e610cd2-753f-4bfc-9b05-772ce8905c5e
aGVpZ2h0IiA6IGZ1bmN0aW9uKGhlaWdodCkgew0KCQkJCXJldHVybiAhaXNOYU4oaGVpZ2h0KTsN
ID0gcHQ7DQoJfTsNCg0KCW1yYWlkLnNldFNjcmVlblNpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVp
YWluZWQiKTsNCiAgICAgICAgcHJpbnRSZWN0KCJjb250YWluaW5nUmVjdCIsIGNvbnRhaW5pbmdS
InN0b3JlUGljdHVyZT91cmw9IiArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpKTsNCgkJfSBlbHNl
478cb909-6ad1-4e12-84cc-b3629a789f93
Y3VzdG9tQ2xvc2VQb3NpdGlvbiAiICsgY3VzdG9tQ2xvc2VQb3NpdGlvbik7DQogICAgICAgIA0K
wB8AioZhnKMlnoN+h4hiRJQi/yVlPcudFjJyQe8noqdEtEPqyo71jP0txMSA3kFEU0T0jvSTd9az
Z2h0ID0gY3VycmVudFBvc2l0aW9uLmhlaWdodDsNCgkJbG9nLmkoInByZXZpb3VzU2l6ZSAiICsg
cmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIklGUkFNRSIpOw0KCQlpZnJhbWUuc2V0QXR0
LmkgPSBmdW5jdGlvbihtc2cpIHsNCgkJaWYgKGxvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5JTkZP
QEC6Na0FJvF61DU06zt0Vm12qn68n9ufvSLcKYc
b3JpZW50YXRpb25Qcm9wZXJ0aWVzLmZvcmNlT3JpZW50YXRpb247DQoNCgkJY2FsbE5hdGl2ZSgi
bUNsb3NlKTsNCgkJaWYgKGV4cGFuZFByb3BlcnRpZXMudXNlQ3VzdG9tQ2xvc2UgIT09IGlzQ3Vz
aGVpZ2h0IiA6IGZ1bmN0aW9uKGhlaWdodCkgew0KCQkJCXJldHVybiAhaXNOYU4oaGVpZ2h0KSAm
PrAAfAOjoAd0kqG5Fl0DjoA6kEuRA2Ccv9P5fyDmfBu4CG6CabFqJdomW0Fb9E97Dc6CWrAYpMVd
20799a27-fa80-4b36-b2db-0f8141f24180
aWQuZ2V0RGVmYXVsdFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7DQoJCWxvZy5pKCJtcmFpZC5nZXRE
CgkJCQlyZXR1cm4gKHR5cGVvZiB1c2VDdXN0b21DbG9zZSA9PT0gImJvb2xlYW4iKTsNCgkJCX0N
bnRbaV0gfHwgc3RyMSA9PT0gc3RyMikgew0KCQkJCWxvZy5pKCJsaXN0ZW5lciAiICsgc3RyMSAr
aWYgKCFldmVudCB8fCAhbGlzdGVuZXIpIHsNCgkJCW1yYWlkLmZpcmVFcnJvckV2ZW50KCJCb3Ro
IHsNCgkJCQlyZXR1cm4gIWlzTmFOKHdpZHRoKSAmJiA1MCA8PSB3aWR0aDsNCgkJCX0sDQoJCQki
nCnnR4eEhYdd62Wz2MxRtYaYMWI9LyE8YjcZUIl789brdLmFVuLXOxsbGe6vV+g7CglDokSSJqtXq
Y29udGFpbmluZ1JlY3QueCArIGNvbnRhaW5pbmdSZWN0LndpZHRoKSAmJg0KICAgICAgICAgICAg
ycvLw+/3Ex0dHcpQTwohjkYUAYQQ84Ey4Ldm+vf09FBdXc2pU6dc4eFt3bqV3NxcEhMTzQ7xHrBX
IHsNCgkJCWxvZy5lKCJzdG9yZVBpY3R1cmUgaXMgbm90IHN1cHBvcnRlZCIpOw0KCQl9DQoJfTsN
MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz
YW1zID0gImFsbG93T3JpZW50YXRpb25DaGFuZ2U9Ig0KCQkJCSsgb3JpZW50YXRpb25Qcm9wZXJ0
dGlvbiA9IG9yaWVudGF0aW9uUHJvcGVydGllcy5mb3JjZU9yaWVudGF0aW9uOw0KDQoJCS8vIG9y
DQoJCSJFUlJPUiIgOiAiZXJyb3IiLA0KCQkiUkVBRFkiIDogInJlYWR5IiwNCgkJIlNJWkVDSEFO
DQoJCWxvZy5pKCJtcmFpZC5zZXRFeHBhbmRTaXplICIgKyB3aWR0aCArICJ4IiArIGhlaWdodCk7
n8P5xAz+rr7J3ukeerw1CgW/BBfBcwNl0scpJCXaR+fsViBWzNdLoJHjykY5TbLHSJd3gKtZockV
aWQuZ2V0RXhwYW5kUHJvcGVydGllcyA9IGZ1bmN0aW9uKCkgew0KCQlsb2cuaSgibXJhaWQuZ2V0
YWJsZTsNCgl9Ow0KDQoJbXJhaWQub3BlbiA9IGZ1bmN0aW9uKHVybCkgew0KCQlsb2cuaSgibXJh
ICAgICAgICBjbG9zZVJlY3QueCA9IHJlc2l6ZVJlY3QueCArIChyZXNpemVSZWN0LndpZHRoIC8g
Y3JlZW4ocHJvcGVydGllcykpIHsNCiAgICAgICAgICAgIG1yYWlkLmZpcmVFcnJvckV2ZW50KCJj
WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3goHFBQxV9grJAAAEwRJREFUeNrtnXtsVVW+xz89fdBC
V0FSTklORykgew0KCQkJY29uc29sZS5sb2coIihXLW1yYWlkLmpzKSAiICsgbXNnKTsNCgkJfQ0K
CgkJIkVYUEFOREVEIiA6ICJleHBhbmRlZCIsDQoJCSJSRVNJWkVEIiA6ICJyZXNpemVkIiwNCgkJ
Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGOUU5MjA4OTBDMjA2ODExODA4M0YyQ0E4QjA4
nmbKhEpter78GGy+gYgUklEgkiOdhs9lIo9H8l+CUCDcJaHjsdDpf+nw+3cgGvgnkgyDPU2xvb6+L
cmVzaXplIik7DQoJCQlyZXR1cm47DQoJCX0NCgkJY2FsbE5hdGl2ZSgicmVzaXplIik7DQoJfTsN
1yQIAviNJPjw4YNj8HO5HCv4Maklx0S0zOq0OSXByspKYMCvaWdnJz18+JDu3r3L/b8cZyjL0mvO
aXMgcmVxdWlyZWQuIiwgInJlbW92ZUV2ZW50TGlzdGVuZXIiKTsNCgkJCXJldHVybjsNCgkJfQ0K
c3VwcG9ydHMgIiArIGZlYXR1cmUgKyAiICIgKyBzdXBwb3J0ZWRGZWF0dXJlc1tmZWF0dXJlXSk7
Ly8NCi8vICBtcmFpZC5qcw0KLy8NCg0KKGZ1bmN0aW9uKCkgew0KCQ0KCWNvbnNvbGUubG9nKCJN
dCArDQoJICAgICAgICAiJm9mZnNldFg9IiArIChyZXNpemVQcm9wZXJ0aWVzLm9mZnNldFggKyBh
aWQucmVzaXplID0gZnVuY3Rpb24oKSB7DQoJCWxvZy5pKCJtcmFpZC5yZXNpemUiKTsNCgkJLy8g
QUwgfHwgc3RhdGUgPT09IFNUQVRFUy5MT0FESU5HIHx8IHN0YXRlID09PSBTVEFURVMuSElEREVO
dGggKyAiLCIJKyBoZWlnaHQpOw0KDQoJCXZhciBwcmV2aW91c1NpemUgPSB7fTsNCgkJcHJldmlv
bmdlRXZlbnQgIiArIG5ld0lzVmlld2FibGUpOw0KCQlpZiAoaXNWaWV3YWJsZSAhPT0gbmV3SXNW
n+3w+4RkIBPhRHB4e8u3tbd7f38+rqqpM2CcJ1YhKu4Vsvq2urnKIzN1uN3c4HHxqaso1Pj7+Y3d3
b3JFdmVudCgiVmFsdWUgb2YgcHJvcGVydHkgIiArIHByb3AgKyAiICgiICsgdmFsdWUJKyAiKSBp
Rm3kPC7ii9O6xx5NzKs8XGrNQTfazCw4zB70goJXehA4Gy3oxwq36x71Cn7KxcAFeIEfVhbOVk9S
NADA6+EMB+22+VYd3XaTYyiB0S8wvp0AmlWeo6Oj2bp1a8Q4fEY0gV0Jrq0kwdatW4mO1i0Ed2xa
GATwDYBO61++ADgB8DeAzwAKAD4C2LE+FwEcG4bxX9DGyggA2LcsoL8D8D2AHwAMSfq5vwCsAfgd
dmFyIG5FdmVudHMgPSBPYmplY3Qua2V5cyhsaXN0ZW5lcnMpLmxlbmd0aDsNCgkJbG9nLmkoImR1
NjI0NTY5OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDNDMxMTM3QTYxMjAxMUUzQjhCRkRD
PSBmYWxzZTsNCgl2YXIgaXNSZXNpemVSZWFkeSA9IGZhbHNlOw0KDQoJdmFyIGV4cGFuZFByb3Bl
uHCBnp4evWb7NU1AcOHnTa0RqqqqLNmmHRkZobm5maGhIdasWWPZy7QjRLTa4bMa/HFJSEjg7rvv
CQkic2V0UmVzaXplUHJvcGVydGllcyIgOiB7DQoJCQkid2lkdGgiIDogZnVuY3Rpb24od2lkdGgp
ICAgICAgbG9nLmQoImFkanVzdG1lbnRzLnggIiArIGFkanVzdG1lbnRzLngpOw0KDQogICAgICAg
YXJyYXkpIHsNCgkJZm9yICggdmFyIGkgaW4gYXJyYXkpIHsNCgkJCWlmIChhcnJheVtpXSA9PT0g
8uVLfPr0qQU+P3b3QER/NlskdGjj6odjqJrDd135mI38aRsEGh4e1qYs2yvHUEWH7yodHh62DwYR
DQoJCQl9IGVsc2Ugew0KCQkJCS8vIG5vIGxpc3RlbmVyIHRvIHJlbW92ZSB3YXMgcHJvdmlkZWQs
c3RvbUNsb3NlLg0KCQkvLyAoVGhhdCBpcywgdGhlIHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGll
LCAibXJhaWQuc2V0UmVzaXplUHJvcGVydGllcyIpOw0KICAgICAgICAgICAgICAgIHJldHVybjsN
PSBoZWlnaHQ7DQoJCWlmICghaXNFeHBhbmRQcm9wZXJ0aWVzU2V0KSB7DQoJCQlleHBhbmRQcm9w
G5mmSclkkgqFAksfPh6Z8gsHw2cSdAL4CcBr0d99enqKw8ND7O7uIp/PX+re3h6KxSKOjo5QLpcB
C10F7968CFE2C76AC6F0650C877806D4514DE58FC239592D2385BCE5609A84B2A0FBDAF29B05505EAD1FDFEF3D7209ACBF34B5D0A806DF18147EA9C0337D6B5B
bmVyc1tpXSk7DQoJCQl9DQoJCX0NCgl9Ow0KCQ0KCWNvbnNvbGUubG9nKCJNUkFJRCBvYmplY3Qg
Vq/BwUFb07JM1gRWihlN4MaZPy6XL1+WuXizZSoTsEurR3Nzs+0xdiAQoKqqihMnrM2HYCREdHKo
ICsgcmVzaXplUmVjdC53aWR0aCAtIDUwOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGN1c3Rv
IHN0cjIgPSBTdHJpbmcocmVnaXN0ZXJlZExpc3RlbmVyKTsNCgkJCQkJaWYgKGxpc3RlbmVyID09
CgkJCX0NCgkJfQ0KCX07DQoJDQogICAgZnVuY3Rpb24gaXNDbG9zZVJlZ2lvbk9uU2NyZWVuKHBy
sogoEqhYou2WBE7Al3p1LGtgiPfyaLckULk+3w0JfvnlF/Uuj2bdEfBeH++UBDo0Z3BCAl7w4dX1
nTMLGs2AwGIeSAUEoFCKLxUJqtZpEUfyTaJiDapiDU6lUBmKx2CM03YAKiRNAESFg0ul0BJunvWzM
OlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6uekVTAAADwElEQVR42uyZXUgV
bnRSZWN0KGxhYmVsLCByZWN0KSB7DQogICAgICAgIGxvZy5kKGxhYmVsICsNCiAgICAgICAgICAg
IGVpdGhlciBwb3J0cmFpdCBvciBsYW5kc2NhcGUNCgkJLy8gaXMgY29uc2lkZXJlZCBhbiBlcnJv
KyBhZGp1c3RtZW50cy54Ow0KICAgICAgICByZXNpemVSZWN0LnkgPSBkZWZhdWx0UG9zaXRpb24u
ZnVuY3Rpb24obXNnKSB7DQoJCWlmIChsb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uREVCVUcpIHsN
ZIMNYAmIBZNgFHSCFtAMWsHMbIl2gW2gDGwHUfz/CBgE4yASxIMkEMHr7eAmuAU+2BpZiLZBPmjS
URiG1dW1H0szrazwF9O0ItmEDBOW8qKopC66qKiIgiDKLkKCfgiJIArSLuyiQsoMIugiMAgqCylE
bmN0aW9uKCkgew0KCQlsb2cuaSgibXJhaWQuaXNWaWV3YWJsZSIpOw0KCQlyZXR1cm4gaXNWaWV3
CWZvciAodmFyIGkgPSAwOyBpIDwgcndQcm9wcy5sZW5ndGg7IGkrKykgew0KCQkJdmFyIHByb3Bu
frUf4C7YA9aAuSCCdmJSokEi2Ao8oJP9PoNjtFcaX1VsDKjhoBPgDFiu6EPcRBF4QT+tIDNYouPB
yJLAjM2HsRU/ScfvUSFEg16jaJmRVFX9VlGUjYBmCY9Vq1ZRVVUlU7pMmgRuA1+GBGbBj4uLo7S0
cG5hbWUpKSB7DQoJCQkJbmV3T3JpZW50YXRpb25Qcm9wZXJ0aWVzW3Byb3BuYW1lXSA9IHByb3Bl
mBCibY4AoYMeByjAfuBXLptcVcArgCqEGJwjgHEVvwf4Y4T4Wi8Cf3WiiYhyGPBpwEvA74hMOQi8
bXJhaWQuU1VQUE9SVEVEX0ZFQVRVUkVTLlNUT1JFUElDVFVSRV0pIHsNCgkJCWNhbGxOYXRpdmUo
PSBuZXdPcmllbnRhdGlvblByb3BlcnRpZXMuZm9yY2VPcmllbnRhdGlvbjsNCg0KCQl2YXIgcGFy
nOV4rVoXx9a0QbjKZjJRKJWm1WjIYDIRRMKJeT/ECQzQazZTLZZ4Vb0D5Tsh1mFqtJp1ORyaTSejr
we0On6xkZ2ejKIopTdDU1CR7ZvJVUxogeFHzI63O/f39vPPOO6bAVxRlwts3Kl6v1zEh4nQOn5H+
aGVpZ2h0ID0gbWF4U2l6ZS5oZWlnaHQ7DQoNCiAgICAgICAgdmFyIGFkanVzdG1lbnRzID0geyAi
CgkJCWxvZy5lKCJmYWlsZWQgdmFsaWRhdGlvbiIpOw0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJdmFy
b2dMZXZlbCA9IExvZ0xldmVsRW51bS5OT05FOw0KCXZhciBsb2cgPSB7fTsNCg0KCWxvZy5kID0g
ZiByZXR2YWwgPT09ICJ1bmRlZmluZWQiKSB7DQoJCQlyZXR2YWwgPSBmYWxzZTsNCgkJfQ0KCQly
IYRomSPAnfb91QgGfioivOYEPyFqhoGPB563Q9UHAgF6e3vp7Oykvb194qezs5Pu7m76+voIBMbC
eHBhbmQ/dXJsPSIgKyBlbmNvZGVVUklDb21wb25lbnQodXJsKSk7DQoJCX0NCgl9Ow0KDQoJbXJh
b3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikgew0KCQlsb2cuaSgi
c2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDY4MDEx
bWVudHMpOw0KCQlhcmdzLnNoaWZ0KCk7DQoJCWxvZy5pKCJmaXJlRXZlbnQgIiArIGV2ZW50ICsg
ZWVuPSIgKyByZXNpemVQcm9wZXJ0aWVzLmFsbG93T2Zmc2NyZWVuOw0KDQoJCWNhbGxOYXRpdmUo
IGV2ZW50IGFuZCBsaXN0ZW5lciBhcmUgcmVxdWlyZWQuIiwgImFkZEV2ZW50TGlzdGVuZXIiKTsN
RyIgOiAyLA0KCQkiRVJST1IiICAgOiAzLA0KCQkiTk9ORSIgICAgOiA0DQoJfTsNCg0KCXZhciBs
aXplUmVjdCA9IHt9Ow0KICAgICAgICByZXNpemVSZWN0LnggPSBkZWZhdWx0UG9zaXRpb24ueCAr
c2V0T3JpZW50YXRpb25Qcm9wZXJ0aWVzPyIgKyBwYXJhbXMpOw0KCX07DQoNCgltcmFpZC5zZXRS
b3JFdmVudCAiICsgbWVzc2FnZSArICIgIiArIGFjdGlvbik7DQoJCWZpcmVFdmVudChtcmFpZC5F
IGkgPCBsZW47IGkrKykgew0KCQkJCQl2YXIgcmVnaXN0ZXJlZExpc3RlbmVyID0gbGlzdGVuZXJz
dG9tQ2xvc2UpIHsNCgkJCWV4cGFuZFByb3BlcnRpZXMudXNlQ3VzdG9tQ2xvc2UgPSBpc0N1c3Rv
UExBQ0VNRU5UX1RZUEVTID0gew0KCQkiSU5MSU5FIiA6ICJpbmxpbmUiLA0KCQkiSU5URVJTVElU
DQoJfTsNCg0KCS8vIG1ldGhvZHMgdG8gZmlyZSBldmVudHMNCg0KCW1yYWlkLmZpcmVFcnJvckV2
X0NFTlRFUiIgOiAiYm90dG9tLWNlbnRlciIsDQoJCSJCT1RUT01fUklHSFQiIDogImJvdHRvbS1y
YWluZWRSZWN0LnkgKyBjb250YWluZWRSZWN0LmhlaWdodCkgPD0gKGNvbnRhaW5pbmdSZWN0Lnkg
gDUlTPmkUJlBnu3tbeFnByqQgDkp1IoGKpsWLrtiZ3JyUst2NXbKnBZuEUDJwhCvqnR17VkEgYUh
IHByb3BlcnRpZXMub2Zmc2V0WDsNCiAgICAgICAgcmVzaXplUmVjdC55ID0gZGVmYXVsdFBvc2l0
cy5oYXNPd25Qcm9wZXJ0eShwcm9wbmFtZSkpIHsNCgkJCQltcmFpZC5maXJlRXJyb3JFdmVudCgN
Q0hBTkdFLCB3aWR0aCwgaGVpZ2h0KTsNCgkJfQ0KCX07DQoNCgltcmFpZC5maXJlU3RhdGVDaGFu
nmqWQNiFERYJhF8ZE7Q+fCr5BEKvjGGNCfAcEA0NDdHKykpgwJdNgu3tbS5rJvzSKJYjYiL2a+N6
s9UHUbW7XNtHhU5V/WNQY5T3gExwzW4J4Qz4zvzQboDUwIxbEnOojL8PtEviaRVaToIrs5S1xIel
Y3Rpb24ob2Zmc2V0WSkgew0KCQkJCXJldHVybiAhaXNOYU4ob2Zmc2V0WSk7DQoJCQl9LA0KCQkJ
cnRpZXMuYWxsb3dPZmZzY3JlZW4gOiByZXNpemVQcm9wZXJ0aWVzLmFsbG93T2Zmc2NyZWVuOw0K
NNWwE8Afdww9Hg+bN282mlxpVoE/7rgHAgG9tDPJMXoRgJOuZY07hoAjSTDu8M2EzZ8OO52UM2ke
dCgiYWRqdXN0ZWQgcmVzaXplUmVjdCIsIHJlc2l6ZVJlY3QpOw0KDQogICAgICAgIHJldHVybiBh
DQoJCQkiZm9yY2VPcmllbnRhdGlvbiIgOiBmdW5jdGlvbihmb3JjZU9yaWVudGF0aW9uKSB7DQoJ
02u7bNkyEhMTuXLlivT4Q0NDhkKiSJaioiIeeOAB2eaZQgjDKjPazIOpqvqjoijngF/rtU1LSzOs
c3RlbmVyc1tldmVudF07DQoJCWlmIChldmVudExpc3RlbmVycykgew0KCQkJdmFyIGxlbiA9IGV2
bUNsb3NlOw0KCQkJY2FsbE5hdGl2ZSgidXNlQ3VzdG9tQ2xvc2U/dXNlQ3VzdG9tQ2xvc2U9Ig0K
CiAgICAgICAgaWYgKGN1c3RvbUNsb3NlUG9zaXRpb24uc2VhcmNoKCJsZWZ0IikgIT09IC0xKSB7
pIMDOCiE+HhKbDQ6vWGVL9Df309lZSXnzp1jYGAgIsC3QxMMDAxw7tw5Kisr6e/vt9L2T4vltEGj
bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6
aGVpZ2h0Ow0KICAgICAgICBwcmludFJlY3QoInJlc2l6ZVJlY3QiLCByZXNpemVSZWN0KTsNCg0K
cnRpZXMiKTsNCgkJcmV0dXJuIG9yaWVudGF0aW9uUHJvcGVydGllczsNCgl9Ow0KDQoJbXJhaWQu
EvgxxWS9Elw3uTYECkG3gr+v/Bvje8FMtMak3qUwiBvkmFxbCPYqpvreomJGtggQb20vNw+ZRyni
3FoCjgOkThEE+JnlSFcm+LqQoNnMF20JGI+Sf5bu+FWrVVfn+azgq04CHvBFkCAajbImlfS7IcCi
cy5vZmZzZXRYICsgIiAiICsgcHJvcGVydGllcy5vZmZzZXRZKTsNCg0KICAgICAgICB2YXIgcmVz
IcHAwABVVVVUVlbKVPn4hepfvny5TNMnVFUdCokAqqoOKYpSCfxGq92SJUv46aefpI9CGyGBm9Ky
TkUpIHsNCgkJCW1yYWlkLmZpcmVFcnJvckV2ZW50KA0KCQkJCQkiYWxsb3dPcmllbnRhdGlvbkNo
CgkJCXZhciBzdHIxID0gU3RyaW5nKGxpc3RlbmVyKTsNCgkJCXZhciBzdHIyID0gU3RyaW5nKGxp
bGVuZGFyRXZlbnQgaXMgbm90IHN1cHBvcnRlZCIpOw0KCQl9DQoJfTsNCg0KCW1yYWlkLmNsb3Nl
DQoJCXZhciByZXR2YWwgPSBzdXBwb3J0ZWRGZWF0dXJlc1tmZWF0dXJlXTsNCgkJaWYgKHR5cGVv
MTgxMDIwNjgxMTgwODNGMkNBOEIwODNCNTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RkVF
e3tpYWGBTk5OAgO+LBKcnJzQwsIC9fb2+ndtnEUAoRdHDg4OCiWBSlW6okhQA39wcND/iyNZrQBP
8eP1elmwYIFd1dNeBN4UQvTPFAaOKHMRNAuvYmDxyOVyEHgt3OresQSYRIQ04KUIJsJB4A0hRItT
FHw3kiAqKoqSkpI7wJ9MjuTkZGpra02N39rayuLFi1myZIle098oivInVVWHQjUBz+s16OrqCmlX
com/Vo9wbFH89BbDbWFhUezQZOGPKmfkJSAtIbVWk3QxPbvJwcR8I79EVuI0aB41a
aXJlRXZlbnQobXJhaWQuRVZFTlRTLlJFQURZKTsNCgl9Ow0KDQoJbXJhaWQuZmlyZVNpemVDaGFu
NTJCNjI0NTY5OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRv
DQoJCWlmICh1cmwgPT09IHVuZGVmaW5lZCkgew0KCQkJbG9nLmkoIm1yYWlkLmV4cGFuZCAoMS1w
SU9OLk5PTkUNCgl9Ow0KDQoJdmFyIHJlc2l6ZVByb3BlcnRpZXMgPSB7DQoJCSJ3aWR0aCIgOiAw
aW9uQ2hhbmdlIHRvIHRydWUgd2hpbGUgc2V0dGluZyBmb3JjZU9yaWVudGF0aW9uDQoJCS8vIHRv
q+A3VbxxEnifyhLGYnajl2Wx6OLzGwZwzkb4bXiki2/CIq9rebEr7EsIq0zWpOe9VOWuoPabiULs
bMFq5CETP9GHdrzGc/Q7PVnAwegxG8dwEhvwB53owSBGkY18lGIpwmhGA17aTm2EtqECHzGGuziA
e4250327-8d3c-4d35-b9e8-3c1720a64b91
cnRpZXMgPSB7DQoJCSJ3aWR0aCIgOiAwLA0KCQkiaGVpZ2h0IiA6IDAsDQoJCSJ1c2VDdXN0b21D
Y3VzdG9tQ2xvc2VQb3NpdGlvbi5zZWFyY2goImJvdHRvbSIpICE9PSAtMSkgew0KICAgICAgICAg
QRTHvX5lGZVCWkpUWlhU+HD9qAcRNIoyQaV6sYfoQYKw8qUgK4LqWmJU9JhW0AfkQ4UFERFCL2Jh
ZWlnaHQpIC0gKHJlc2l6ZVJlY3QueSArIHJlc2l6ZVJlY3QuaGVpZ2h0KTsNCiAgICAgICAgfQ0K
KyBjb250YWluaW5nUmVjdC5oZWlnaHQpKTsNCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gcHJp
NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo
CX0NCgkJDQoJCWlmICghdmFsaWRhdGUocHJvcGVydGllcywgInNldFJlc2l6ZVByb3BlcnRpZXMi
rHNYsC+mRFbvdFksyCpThG8HwwHBO5nEqtLYLrcKkCqrvspRuQ+2C8WW82FTrYMz6VrV1GQvM+0o
DQoJCWV4cGFuZFByb3BlcnRpZXMud2lkdGggPSB3aWR0aDsNCgkJZXhwYW5kUHJvcGVydGllcy5o
vRDiL64ggBDCA7xlZFFndHSUuro6Dh8+PCtWgYqLi8nKyiIqytDrPwg8J4QYcSwBggcxPsLAFm1X
LnNldFJlc2l6ZVByb3BlcnRpZXMiKTsNCgkJCXJldHVybjsNCgkJfQ0KCQkNCiAgICAgICAgdmFy
CAMtgpJAS/JvLY2ldpXtPfQOLTK7e2bmjCj4wcOiO3O+d2bOfud7z0QHAoGo6RYxUdMwZkRPVsQq
Uy5SRVNJWkVEKSkgew0KCQkJcmV0dXJuOw0KCQl9DQoJCWlmICh1cmwgPT09IHVuZGVmaW5lZCkg
y6mUcqA9oFIeJbWUqjg0YLoTLBpbg5HeopMMkwYSE+ZexfnLa7y65Bpn5p8ZNJeaeCcxPpLxcpEM
RVJUSUVTX0NVU1RPTV9DTE9TRV9QT1NJVElPTi5UT1BfUklHSFQsDQoJCSJvZmZzZXRYIiA6IDAs
NzQwNzIwNjgxMTgwODNBRjJCNzQzNDlDQ0IiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjlF
ZWxFbnVtID0gew0KCQkiREVCVUciICAgOiAwLA0KCQkiSU5GTyIgICAgOiAxLA0KCQkiV0FSTklO
ICAgICBsb2cuZCgiZGVmYXVsdFBvc2l0aW9uICIgKyBkZWZhdWx0UG9zaXRpb24ueCArICIgIiAr
CQkJCQkrIGV4cGFuZFByb3BlcnRpZXMudXNlQ3VzdG9tQ2xvc2UpOw0KCQl9DQoJfTsNCg0KCS8q
c1tpXS5hcHBseShudWxsLCBhcmdzKTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCWxvZy5pKCJubyBs
aCkpIHsNCiAgICAgICAgICAgIGFkanVzdG1lbnRzLnggPSAobWF4UmVjdC54ICsgbWF4UmVjdC53
CS8vIHdpZHRoLCBoZWlnaHQsIG9mZnNldFgsIG9mZnNldFksIGN1c3RvbUNsb3NlUG9zaXRpb24s
aWRlbz91cmw9IiArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpKTsNCgl9Ow0KDQoJbXJhaWQucmVt
b3BlcnRpZXMpIHsNCiAgICAgICAgbG9nLmQoImlzQ2xvc2VSZWdpb25PblNjcmVlbiIpOw0KICAg
wHmQZFC0gyvufaOixdR4KJkklGgtOjnfYwwIrwF9IE7ve71+OhVksHKoiEJwBzxlJygTbWzEsmVN
01528cc0-dd34-494d-9218-24af1317e1ee
aWVudGF0aW9uQ2hhbmdlLA0KCQluZXdPcmllbnRhdGlvblByb3BlcnRpZXMuZm9yY2VPcmllbnRh
CWlmICh2YWxpZGF0b3IgJiYgIXZhbGlkYXRvcih2YWx1ZSkpIHsNCgkJCQltcmFpZC5maXJlRXJy
KSkgew0KCQkJbXJhaWQuZmlyZUVycm9yRXZlbnQoImZhaWxlZCB2YWxpZGF0aW9uIiwgIm1yYWlk
0qqYQS2tuIwwCwOl0NW46SI44PJvymxaaIesxqXdSGVWA0JdTMCFSDaxCK4cswiB0NWM3XSVStQ2
bXJhaWQucmVtb3ZlRXZlbnRMaXN0ZW5lciAiICsgZXZlbnQgKyAiIDogIiArIFN0cmluZyhsaXN0
aWV3YWJsZSkgew0KCQkJaXNWaWV3YWJsZSA9IG5ld0lzVmlld2FibGU7DQoJCQlmaXJlRXZlbnQo
LXJpZ2h0IiBdOw0KCQkJCXJldHVybiAodHlwZW9mIGN1c3RvbUNsb3NlUG9zaXRpb24gPT09ICJz
2PliGKuiPa2YzWgxk+bg4YcfDqVah6vVvkHsvB7+WUJ92tnlFgkEAjQ1NcmcjjUl165dcw34ktjF
uVyuBbaN5nI5LsdQm63e2tpaC2BGXVtbU3+LyBPkSSQSLWA5NZFIqBssssK7TLK0tNQC1KEuLS3x
aADPWGT8Fd9c4vgpI44VhxD7jTPfF+hni9CHopDo/1X0TwEGAMn4kfWfS4oUAAAAAElFTkSuQmCC
eXBlID0gUExBQ0VNRU5UX1RZUEVTLklOTElORTsNCgl2YXIgc3VwcG9ydGVkRmVhdHVyZXMgPSB7
ZXNpemVkIHN0YXRlLg0KCQlpZiAocGxhY2VtZW50VHlwZSAhPT0gUExBQ0VNRU5UX1RZUEVTLklO
ZW50ID0gZnVuY3Rpb24obWVzc2FnZSwgYWN0aW9uKSB7DQoJCWxvZy5pKCJtcmFpZC5maXJlRXJy
CS8vIHJlc2l6ZVByb3BlcnRpZXMgY29udGFpbnMgNiByZWFkLXdyaXRlIHByb3BlcnRpZXM6DQoJ
bJDZSHpaUZQyVVV/llUbsvKuXoNAIEBZWVlIL23btm1kZ2cDsG7dOgoLC41umjhCoqKiKCwsZN26
IGFsbG93T2Zmc2NyZWVuDQoNCgkJLy8gVGhlIHByb3BlcnRpZXMgb2JqZWN0IHBhc3NlZCBpbnRv
cHJldmlvdXNTaXplLndpZHRoICsgIiwiICsgcHJldmlvdXNTaXplLmhlaWdodCk7DQoNCgkJY3Vy
aWdodCA9IG1heFNpemUuaGVpZ2h0Ow0KDQogICAgICAgIHJldHVybiBpc1JlY3RDb250YWluZWQo
IlZJRVdBQkxFQ0hBTkdFIiA6ICJ2aWV3YWJsZUNoYW5nZSINCgl9Ow0KDQoJdmFyIFNVUFBPUlRF
DQoJbXJhaWQuZ2V0VmVyc2lvbiA9IGZ1bmN0aW9uKCkgew0KCQlsb2cuaSgibXJhaWQuZ2V0VmVy
dGggb3IgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4U2l6ZSB3aWR0aCBvciBoZWlnaHQi
IiBbIiArIGFyZ3MudG9TdHJpbmcoKSArICJdIik7DQoJCXZhciBldmVudExpc3RlbmVycyA9IGxp
ZWZhdWx0UG9zaXRpb24iKTsNCgkJcmV0dXJuIGRlZmF1bHRQb3NpdGlvbjsNCgl9Ow0KDQoJbXJh
nXpnVan0ZiUSSoiimiCgBP4UXfD4fozpsbW2NhP7+/vdDQ0MvFLBkMnmBfQEuHhwclOHMbDbXhOAM
nd15eXmrYqbKmpiZzuNAnRXJ3d7eVStjc3OQo7ZXos7OC5ImjZAA1EE0nSbRarUYulzNoxeCfb/gW
c2V0UmVzaXplUHJvcGVydGllcyIpOw0KCQkNCgkJaXNSZXNpemVSZWFkeSA9IGZhbHNlOw0KDQoJ
ICAgICAgIG1heFJlY3Qud2lkdGggPSBtYXhTaXplLndpZHRoOw0KICAgICAgICBtYXhSZWN0Lmhl
CQkic2V0RXhwYW5kUHJvcGVydGllcyIgOiB7DQoJCQkvLyBJbiBNUkFJRCAyLjAsIHRoZSBvbmx5
cyBhcmUgbm90IG5lZWRlZCBieSB0aGUgbmF0aXZlIGNvZGUuKQ0KCQlpZiAoZXhwYW5kUHJvcGVy
ZVJlY3Qud2lkdGggPSBwcm9wZXJ0aWVzLndpZHRoOw0KICAgICAgICByZXNpemVSZWN0LmhlaWdo
ew0KCQkJCXJldHVybiAhaXNOYU4ob2Zmc2V0WCk7DQoJCQl9LA0KCQkJIm9mZnNldFkiIDogZnVu
IGhlaWdodCk7DQoJCW1heFNpemUud2lkdGggPSB3aWR0aDsNCgkJbWF4U2l6ZS5oZWlnaHQgPSBo
VxeHDh2iqamJ2SR+v5+SkhIWLlxopNsR4GkrD6ZEWQh+XNDeF8j2qa2tnTWzXksb3HfffUa6lAf9
IFNUQVRFUy5MT0FESU5HDQoJCQkJfHwgKHN0YXRlID09PSBTVEFURVMuREVGQVVMVCAmJiBwbGFj
aWR0aCkgLSAocmVzaXplUmVjdC54ICsgcmVzaXplUmVjdC53aWR0aCk7DQogICAgICAgIH0NCiAg
c2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTlBRDI1
j7f9irgTrmjbma4mXMksH3vsMe666y5N+y+E+GiyBgB4X6tHenp6xKn96cTuW8l2awIJrCawnkyA
OlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz77Lxw7AAADm0lEQVR42uyZXUgU

信息 应用程序记录日志信息,不得记录敏感信息

应用程序记录日志信息,不得记录敏感信息
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05d-Testing-Data-Storage.md#logs

Files:
com/amazon/device/ads/LogcatLogger.java, line(s) 13,18,23,28,33
com/applovin/adview/AppLovinAdView.java, line(s) 38,90
com/applovin/adview/AppLovinIncentivizedInterstitial.java, line(s) 50
com/applovin/adview/AppLovinInterstitialActivity.java, line(s) 461,464
com/applovin/impl/adview/AdViewControllerImpl.java, line(s) 133,136,139,142,145,266,301,378
com/applovin/impl/adview/q.java, line(s) 15
com/applovin/impl/sdk/AppLovinSdkImpl.java, line(s) 56,233,237,240,258,52
com/applovin/impl/sdk/NativeAdImpl.java, line(s) 189
com/applovin/impl/sdk/cz.java, line(s) 34
com/applovin/impl/sdk/k.java, line(s) 31,46,70,56,84
com/applovin/sdk/AppLovinSdk.java, line(s) 42
com/applovin/sdk/AppLovinSdkUtils.java, line(s) 53
com/appodeal/ads/k.java, line(s) 48,69,97,141,168,184
com/appodeal/ads/networks/SpotXActivity.java, line(s) 26
com/appodeal/ads/networks/spotx/SpotXVPAIDView.java, line(s) 100,111,125,138,157,175,187,197,211,225,235,355,375,383,392,435,454,460,504,509,527,581,607,638
com/appodeal/ads/networks/vpaid/c.java, line(s) 40,28,46,34
com/appodeal/ads/utils/b/b.java, line(s) 60,86
com/appodeal/ads/utils/e.java, line(s) 93,94,97
com/appodeal/ads/utils/i.java, line(s) 11,18,27,33
com/appodeal/ads/utils/j.java, line(s) 338,340
com/avocarrot/androidsdk/logging/AvocarrotLogger.java, line(s) 108,97,103,100
com/chartboost/sdk/Libraries/CBLogging.java, line(s) 21,27,33,39,69,45,51,57,63
com/chartboost/sdk/impl/bq.java, line(s) 56,75,78,81,84,87,92,95,98,101,104,107,122,136,147,161,167,178,184
com/chartboost/sdk/impl/t.java, line(s) 20,24,28,11,15
com/immersion/content/EndpointWarp.java, line(s) 35
com/immersion/content/Log.java, line(s) 10,14,21
com/immersion/hapticmediasdk/HapticContentSDK.java, line(s) 57
com/immersion/hapticmediasdk/HapticContentSDKFactory.java, line(s) 15,26,30,23
com/immersion/hapticmediasdk/MediaPlaybackSDK.java, line(s) 39,46,51,58,79,86
com/immersion/hapticmediasdk/MediaTaskManager.java, line(s) 36,229,233
com/immersion/hapticmediasdk/controllers/FileReaderFactory.java, line(s) 81,77
com/immersion/hapticmediasdk/controllers/HapticDownloadThread.java, line(s) 74,87,91,114,134,164,181,198,172
com/immersion/hapticmediasdk/controllers/HapticPlaybackThread.java, line(s) 119,114,125,206
com/immersion/hapticmediasdk/controllers/MediaController.java, line(s) 49,51,123
com/immersion/hapticmediasdk/controllers/MemoryAlignedFileReader.java, line(s) 217,219,220,221,222,223,225,227,229,230,231,232,233,235,237,93
com/immersion/hapticmediasdk/controllers/MemoryMappedFileReader.java, line(s) 187,189,190,191,192,193,195,197,199,200,201,202,203,205,207,64,237
com/immersion/hapticmediasdk/utils/Log.java, line(s) 10,14,21
com/inmobi/commons/core/utilities/Logger.java, line(s) 22,25,38,41,19,35
com/jirbo/adcolony/ADCData.java, line(s) 667,675,677,678,679,680,681,682,683,684,685,686,687,688,689,690
com/jirbo/adcolony/a.java, line(s) 180,186,183
com/jirbo/adcolony/ae.java, line(s) 152
com/jirbo/adcolony/e.java, line(s) 145,301,463,646,648,656,658
com/jirbo/adcolony/k.java, line(s) 339
com/jirbo/adcolony/p.java, line(s) 176
com/jirbo/adcolony/y.java, line(s) 54
com/mopub/common/BrowserWebViewClient.java, line(s) 38
com/mopub/common/CacheService.java, line(s) 151,205,230
com/mopub/common/ClientMetadata.java, line(s) 138
com/mopub/common/DiskLruCache.java, line(s) 435
com/mopub/common/DoubleTimeTracker.java, line(s) 56,66
com/mopub/common/GpsHelper.java, line(s) 47,88,104
com/mopub/common/LocationService.java, line(s) 86,89,92
com/mopub/common/MoPubHttpUrlConnection.java, line(s) 28,54
com/mopub/common/Preconditions.java, line(s) 89,113,137,161,170
com/mopub/common/UrlAction.java, line(s) 45,197
com/mopub/common/UrlHandler.java, line(s) 134,179
com/mopub/common/event/Event.java, line(s) 35
com/mopub/common/event/EventDispatcher.java, line(s) 16
com/mopub/common/event/EventSerializer.java, line(s) 23
com/mopub/common/event/LogCatEventRecorder.java, line(s) 11
com/mopub/common/event/ScribeEventRecorder.java, line(s) 79
com/mopub/common/util/DeviceUtils.java, line(s) 75,154,207,101
com/mopub/common/util/Intents.java, line(s) 130,33,72,97
com/mopub/common/util/Json.java, line(s) 20,26
com/mopub/common/util/ManifestUtils.java, line(s) 163,173
com/mopub/mobileads/AdAlertReporter.java, line(s) 90,123
com/mopub/mobileads/AdViewController.java, line(s) 147,151,169,216,321,334,343,395,187,348,329
com/mopub/mobileads/BaseHtmlWebView.java, line(s) 61
com/mopub/mobileads/BaseVideoPlayerActivity.java, line(s) 38,46
com/mopub/mobileads/BaseVideoViewController.java, line(s) 96,49
com/mopub/mobileads/CustomEventBannerAdapter.java, line(s) 37,42,55,76,98
com/mopub/mobileads/CustomEventInterstitialAdapter.java, line(s) 50,55,66,87,110,191
com/mopub/mobileads/CustomEventRewardedVideo.java, line(s) 40
com/mopub/mobileads/HtmlBanner.java, line(s) 33
com/mopub/mobileads/HtmlWebViewClient.java, line(s) 43,49
com/mopub/mobileads/MoPubActivity.java, line(s) 102
com/mopub/mobileads/MoPubConversionTracker.java, line(s) 52
com/mopub/mobileads/MoPubInterstitial.java, line(s) 70,77,84
com/mopub/mobileads/MoPubRewardedVideo.java, line(s) 78,135,143,147,151,178,180
com/mopub/mobileads/MoPubRewardedVideoManager.java, line(s) 253,308,314,229,261,289,325
com/mopub/mobileads/MoPubView.java, line(s) 99,122,200,240,255,262,346,58
com/mopub/mobileads/MraidActivity.java, line(s) 82,109,90
com/mopub/mobileads/MraidVideoPlayerActivity.java, line(s) 140
com/mopub/mobileads/ResponseBodyInterstitial.java, line(s) 34,43
com/mopub/mobileads/VastCompanionAdConfig.java, line(s) 110
com/mopub/mobileads/VastIconConfig.java, line(s) 113
com/mopub/mobileads/VastIconXmlManager.java, line(s) 68,84
com/mopub/mobileads/VastLinearXmlManager.java, line(s) 113,169
com/mopub/mobileads/VastMacroHelper.java, line(s) 68
com/mopub/mobileads/VastManager.java, line(s) 105,123
com/mopub/mobileads/VastVideoBlurLastVideoFrameTask.java, line(s) 57,70
com/mopub/mobileads/VastVideoCloseButtonWidget.java, line(s) 109,118
com/mopub/mobileads/VastVideoConfig.java, line(s) 129,131,289,299
com/mopub/mobileads/VastVideoCtaButtonWidget.java, line(s) 67,77,81
com/mopub/mobileads/VastVideoGradientStripWidget.java, line(s) 53,63,67
com/mopub/mobileads/VastVideoView.java, line(s) 76
com/mopub/mobileads/VastXmlManagerAggregator.java, line(s) 105,233,301
com/mopub/mobileads/VideoDownloader.java, line(s) 45,71
com/mopub/mobileads/VideoViewabilityTrackerXmlManager.java, line(s) 31,56,63
com/mopub/mobileads/ViewGestureDetector.java, line(s) 58
com/mopub/mobileads/resource/ProgressBarDrawable.java, line(s) 82
com/mopub/mobileads/util/WebViews.java, line(s) 46,53,60,67
com/mopub/mraid/MraidBanner.java, line(s) 77
com/mopub/mraid/MraidBridge.java, line(s) 137,383,391,403,509,518,405,395
com/mopub/mraid/MraidController.java, line(s) 448
com/mopub/mraid/MraidNativeCommandHandler.java, line(s) 400,419,422,425,435,441,475
com/mopub/nativeads/AdapterHelper.java, line(s) 65
com/mopub/nativeads/BaseNativeAd.java, line(s) 48,68
com/mopub/nativeads/CustomEventNativeAdapter.java, line(s) 19,33,37
com/mopub/nativeads/MediaLayout.java, line(s) 283
com/mopub/nativeads/MediaViewHolder.java, line(s) 53
com/mopub/nativeads/MoPubCustomEventNative.java, line(s) 129,136
com/mopub/nativeads/MoPubNative.java, line(s) 106,152,186,119
com/mopub/nativeads/MoPubRecyclerAdapter.java, line(s) 270,318,323,327
com/mopub/nativeads/MoPubStreamAdPlacer.java, line(s) 298,288
com/mopub/nativeads/NativeAdViewHelper.java, line(s) 50
com/mopub/nativeads/NativeImageHelper.java, line(s) 31,38,56
com/mopub/nativeads/NativeRendererHelper.java, line(s) 58,63,89,71
com/mopub/nativeads/PlacementData.java, line(s) 232
com/mopub/nativeads/ServerPositioningSource.java, line(s) 77,94,58
com/mopub/nativeads/StaticNativeAd.java, line(s) 184
com/mopub/nativeads/StaticNativeViewHolder.java, line(s) 53
com/mopub/nativeads/VisibilityTracker.java, line(s) 136
com/mopub/network/AdRequest.java, line(s) 107
com/mopub/network/RequestManager.java, line(s) 76
com/mopub/network/ScribeRequestManager.java, line(s) 30,39
com/mopub/network/TrackingRequest.java, line(s) 58,66
com/mopub/volley/CacheDispatcher.java, line(s) 30
com/mopub/volley/NetworkDispatcher.java, line(s) 72
com/mopub/volley/Request.java, line(s) 130,141,146
com/mopub/volley/RequestQueue.java, line(s) 69,114
com/mopub/volley/VolleyLog.java, line(s) 61,65,96,53,100,104,11,110,115,120,124
com/mopub/volley/toolbox/BasicNetwork.java, line(s) 125,172,100,109,130
com/mopub/volley/toolbox/DiskBasedCache.java, line(s) 93,163,287,319,432,437,450,405,148,174
com/mopub/volley/toolbox/ImageRequest.java, line(s) 98
com/mopub/volley/toolbox/JsonRequest.java, line(s) 38
com/my/target/Tracer.java, line(s) 14,23,31
com/my/target/core/net/cookie/c.java, line(s) 102,105,36,77
com/startapp/android/publish/b/i.java, line(s) 40,67
com/startapp/android/publish/g.java, line(s) 78
com/startapp/android/publish/i/l.java, line(s) 147,152,159,163,171,195
com/startapp/android/publish/i/n.java, line(s) 54,63,57,51,60
com/startapp/android/publish/i/x.java, line(s) 681,975
com/startapp/android/publish/splash/a.java, line(s) 231
com/startapp/android/publish/video/b.java, line(s) 83
com/tapjoy/HmacSignature.java, line(s) 32,61
com/tapjoy/TJAdUnit.java, line(s) 128,214,442,96,139,280,284,296,300,340,353,388,421,480,572,606,616,643,654
com/tapjoy/TJAdUnitActivity.java, line(s) 123,40,56,152,158,169,186,212,237
com/tapjoy/TJAdUnitJSBridge.java, line(s) 86,918,81,118,434,472,580,626,711,768,800,806,343,355,372,396,466,486,696
com/tapjoy/TJCurrency.java, line(s) 44,61,106,109,112,116,139,145,149,172,178,182,98,143,176
com/tapjoy/TJEventOptimizer.java, line(s) 36,68,83,63
com/tapjoy/TJPlacement.java, line(s) 124,132,140,258,262,307,312,316,44,57,148,168,183,195,211,223,228,232,237,256,178,266
com/tapjoy/TJPlacementManager.java, line(s) 93,97
com/tapjoy/TJWebViewJSInterface.java, line(s) 55,79,111,118,28,32
com/tapjoy/TapjoyAdIdClient.java, line(s) 34
com/tapjoy/TapjoyCache.java, line(s) 48,68,106,238,239,240,241
com/tapjoy/TapjoyCachedAssetData.java, line(s) 101,113
com/tapjoy/TapjoyConnectCore.java, line(s) 500,511,754,760,788,847,873,892,942,972,980,989,998,1244,162,166,231,275,472,473,475,477,478,479,490,494,497,569,631,636,638,734,781,795,844,867,868,888,935,1017,1021,1025,1108,1111,1120,1124,1130,1133,1136,1149,1157,1167,1170,1189,1217,695,706,752,758,241,244,539,605,607,1163
com/tapjoy/TapjoyGpsHelper.java, line(s) 20,22,23,28,30,35,36,39,42
com/tapjoy/TapjoyLog.java, line(s) 81,63,13,50,53,90,72
com/tapjoy/TapjoyURLConnection.java, line(s) 93,109,176,207,62,112,113,114,118,120,134,135,136,185,186,187,191,193,201,210,115,116,188,189
com/tapjoy/TapjoyUtil.java, line(s) 68,99,100,101,143,151
com/tapjoy/internal/eg.java, line(s) 86,92,45,347,355
com/tapjoy/internal/ek.java, line(s) 43,47,54,60,64
com/tapjoy/internal/em.java, line(s) 44,135,148,152
com/tapjoy/internal/ep.java, line(s) 29,43
com/tapjoy/internal/eq.java, line(s) 30
com/tapjoy/internal/er.java, line(s) 70
com/tapjoy/internal/es.java, line(s) 43,53
com/tapjoy/internal/et.java, line(s) 87,293
com/tapjoy/internal/ev.java, line(s) 38,43,48,53,58,148,157,195,246,249,252,274,130
com/tapjoy/internal/ew.java, line(s) 75
com/tapjoy/internal/fd.java, line(s) 21
com/tapjoy/internal/ff.java, line(s) 39
com/tapjoy/internal/fg.java, line(s) 89
com/tapjoy/internal/fk.java, line(s) 269,286,290,431,452,478,504,551,577,639,670,700,731,113,196,536,607
com/tapjoy/internal/fl.java, line(s) 128,135
com/tapjoy/internal/fn.java, line(s) 106,108
com/tapjoy/internal/fp.java, line(s) 35,38,41,44,47,64
com/tapjoy/internal/hx.java, line(s) 16
com/tapjoy/mraid/controller/Assets.java, line(s) 50,57,58,59,70,75,147,154
com/tapjoy/mraid/controller/Display.java, line(s) 120,126,132,142,188,212,218,224,252,278,283,87,89,270
com/tapjoy/mraid/controller/MraidLocation.java, line(s) 55,63,96,101
com/tapjoy/mraid/controller/MraidSensor.java, line(s) 57,63,69,74
com/tapjoy/mraid/controller/Network.java, line(s) 55,95
com/tapjoy/mraid/controller/Utility.java, line(s) 72,74,90,101,114,202,289,313,353
com/tapjoy/mraid/util/MraidPlayer.java, line(s) 57,105
com/tapjoy/mraid/view/Browser.java, line(s) 125,144
com/tapjoy/mraid/view/MraidView.java, line(s) 174,309,394,601,686,773,789,794,800,894,925,1066,1151,1261,1291,1452,1547,1577,835,1819,158,279,330,406,436,437,446,453,571,622,698,728,729,738,745,1036,1087,1163,1193,1194,1203,1210,1485,1530,1826,1830
com/threatmetrix/TrustDefenderMobile/NativeGatherer.java, line(s) 59
com/unity3d/ads/android/UnityAds.java, line(s) 126,129,136,382,391,397,467,530,610,621,647,655,665,669,680,697,715,717,745,769,773,833,836,838,842,206,208,403,409,449,455,492,497,529,534,540,549,598,604,615,626,649,652,730,750,757,787,789,197,271,336,366,375,641,643,89,91
com/unity3d/ads/android/UnityAdsDeviceLog.java, line(s) 142
com/unity3d/ads/android/UnityAdsUtils.java, line(s) 166,182,186,145,151,155,169,179
com/unity3d/ads/android/cache/UnityAdsCacheManager.java, line(s) 22,24,49,53,61,26
com/unity3d/ads/android/cache/UnityAdsDownloader.java, line(s) 125,140,49,148
com/unity3d/ads/android/cache/b.java, line(s) 69,138,47,53,75,83,91,129
com/unity3d/ads/android/campaign/UnityAdsCampaign.java, line(s) 56,109,120,131,142,153,164,175,186,197,213,217,227,238,245,66,77,98
com/unity3d/ads/android/campaign/UnityAdsCampaignHandler.java, line(s) 43,50,107,117
com/unity3d/ads/android/d.java, line(s) 29
com/unity3d/ads/android/data/UnityAdsAdvertisingId.java, line(s) 49,54
com/unity3d/ads/android/data/UnityAdsDevice.java, line(s) 118,136,43
com/unity3d/ads/android/data/UnityAdsGraphicsBundle.java, line(s) 24,31,36
com/unity3d/ads/android/e.java, line(s) 13
com/unity3d/ads/android/h.java, line(s) 14,17
com/unity3d/ads/android/item/UnityAdsRewardItem.java, line(s) 58
com/unity3d/ads/android/item/UnityAdsRewardItemManager.java, line(s) 32
com/unity3d/ads/android/l.java, line(s) 20,34,18,38,42
com/unity3d/ads/android/properties/UnityAdsProperties.java, line(s) 92,99
com/unity3d/ads/android/unity3d/UnityAdsUnityEngineWrapper.java, line(s) 35,75
com/unity3d/ads/android/unity3d/UnityAdsUnityWrapper.java, line(s) 139,144,146,206,30,55,202,209,156
com/unity3d/ads/android/unity3d/a.java, line(s) 29
com/unity3d/ads/android/unity3d/b.java, line(s) 26
com/unity3d/ads/android/video/UnityAdsVideoPlayView.java, line(s) 147,223,255,157,175,438
com/unity3d/ads/android/video/a.java, line(s) 15
com/unity3d/ads/android/video/h.java, line(s) 17
com/unity3d/ads/android/video/q.java, line(s) 14
com/unity3d/ads/android/view/UnityAdsFullscreenActivity.java, line(s) 12,19,25,31,39,45,51
com/unity3d/ads/android/view/UnityAdsMainView.java, line(s) 230,232,237,102,176,182,243,250,279,286,295,305,326,348
com/unity3d/ads/android/webapp/UnityAdsWebBridge.java, line(s) 32,42,84,88
com/unity3d/ads/android/webapp/UnityAdsWebData.java, line(s) 157,175,306,328,392,394,420,431,474,532,577,580,604,620,634,154,160,171,177,230,325,347,376,437,504,509,536,181,197,494
com/unity3d/ads/android/webapp/UnityAdsWebView.java, line(s) 63,105,112,113,114,115,116,118,133,164,167,190,220,228,236
com/unity3d/ads/android/webapp/h.java, line(s) 20
com/unity3d/ads/android/webapp/j.java, line(s) 54,47,93,154
com/unity3d/ads/android/webapp/k.java, line(s) 35
com/unity3d/ads/android/webapp/m.java, line(s) 29,36,40
com/unity3d/ads/android/webapp/n.java, line(s) 31,25
com/unity3d/ads/android/webapp/o.java, line(s) 24,38,44
com/unity3d/ads/android/zone/UnityAdsZone.java, line(s) 102
com/unity3d/ads/android/zone/UnityAdsZoneManager.java, line(s) 42
com/unity3d/ads/android2/UnityAds.java, line(s) 126,129,136,382,391,397,467,530,610,621,647,655,665,669,680,697,715,717,745,769,773,833,836,838,842,206,208,403,409,449,455,492,497,529,534,540,549,598,604,615,626,649,652,730,750,757,787,789,197,271,336,366,375,641,643,89,91
com/unity3d/ads/android2/UnityAdsDeviceLog.java, line(s) 142
com/unity3d/ads/android2/UnityAdsUtils.java, line(s) 166,182,186,145,151,155,169,179
com/unity3d/ads/android2/cache/UnityAdsCacheManager.java, line(s) 22,24,49,53,61,26
com/unity3d/ads/android2/cache/UnityAdsDownloader.java, line(s) 125,140,49,148
com/unity3d/ads/android2/cache/b.java, line(s) 69,138,47,53,75,83,91,129
com/unity3d/ads/android2/campaign/UnityAdsCampaign.java, line(s) 56,109,120,131,142,153,164,175,186,197,213,217,227,238,245,66,77,98
com/unity3d/ads/android2/campaign/UnityAdsCampaignHandler.java, line(s) 43,50,107,117
com/unity3d/ads/android2/d.java, line(s) 29
com/unity3d/ads/android2/data/UnityAdsAdvertisingId.java, line(s) 49,54
com/unity3d/ads/android2/data/UnityAdsDevice.java, line(s) 118,136,43
com/unity3d/ads/android2/data/UnityAdsGraphicsBundle.java, line(s) 24,31,36
com/unity3d/ads/android2/e.java, line(s) 13
com/unity3d/ads/android2/h.java, line(s) 14,17
com/unity3d/ads/android2/item/UnityAdsRewardItem.java, line(s) 58
com/unity3d/ads/android2/item/UnityAdsRewardItemManager.java, line(s) 32
com/unity3d/ads/android2/l.java, line(s) 20,34,18,38,42
com/unity3d/ads/android2/properties/UnityAdsProperties.java, line(s) 92,99
com/unity3d/ads/android2/unity3d/UnityAdsUnityEngineWrapper.java, line(s) 35,75
com/unity3d/ads/android2/unity3d/UnityAdsUnityWrapper.java, line(s) 139,144,146,206,30,55,202,209,156
com/unity3d/ads/android2/unity3d/a.java, line(s) 29
com/unity3d/ads/android2/unity3d/b.java, line(s) 26
com/unity3d/ads/android2/video/UnityAdsVideoPlayView.java, line(s) 147,223,255,157,175,438
com/unity3d/ads/android2/video/a.java, line(s) 15
com/unity3d/ads/android2/video/h.java, line(s) 17
com/unity3d/ads/android2/video/q.java, line(s) 14
com/unity3d/ads/android2/view/UnityAdsFullscreenActivity.java, line(s) 12,19,25,31,39,45,51
com/unity3d/ads/android2/view/UnityAdsMainView.java, line(s) 230,232,237,102,176,182,243,250,279,286,295,305,326,348
com/unity3d/ads/android2/webapp/UnityAdsWebBridge.java, line(s) 32,42,84,88
com/unity3d/ads/android2/webapp/UnityAdsWebData.java, line(s) 157,175,306,328,392,394,420,431,474,532,577,580,604,620,634,154,160,171,177,230,325,347,376,437,504,509,536,181,197,494
com/unity3d/ads/android2/webapp/UnityAdsWebView.java, line(s) 63,105,112,113,114,115,116,118,133,164,167,190,220,228,236
com/unity3d/ads/android2/webapp/h.java, line(s) 20
com/unity3d/ads/android2/webapp/j.java, line(s) 54,47,93,154
com/unity3d/ads/android2/webapp/k.java, line(s) 35
com/unity3d/ads/android2/webapp/m.java, line(s) 29,36,40
com/unity3d/ads/android2/webapp/n.java, line(s) 31,25
com/unity3d/ads/android2/webapp/o.java, line(s) 24,38,44
com/unity3d/ads/android2/zone/UnityAdsZone.java, line(s) 102
com/unity3d/ads/android2/zone/UnityAdsZoneManager.java, line(s) 42
com/vungle/log/Logger.java, line(s) 90,109
com/yandex/metrica/impl/bp.java, line(s) 50
com/yandex/metrica/impl/ob/ck.java, line(s) 97,105
com/yandex/metrica/impl/ob/cr.java, line(s) 37
com/yandex/metrica/impl/ob/de.java, line(s) 50,64,75,101,110,113
com/yandex/mobile/ads/bf.java, line(s) 34
com/yandex/mobile/ads/utils/logger/b.java, line(s) 21,15
org/cocos2dx/cpp/POFCross.java, line(s) 124,128,142,184,186,194,200,237,269,274,288,300
org/cocos2dx/cpp/inappbilling/util/IabHelper.java, line(s) 656,661,665
org/cocos2dx/cpp/inappbilling/util/Security.java, line(s) 21,36,39,50,55,58,61,64
org/cocos2dx/lib/Cocos2dxActivity.java, line(s) 215,222,237,299,301,306,161,158
org/cocos2dx/lib/Cocos2dxBitmap.java, line(s) 106
org/cocos2dx/lib/Cocos2dxEditBoxHelper.java, line(s) 129,140,185
org/cocos2dx/lib/Cocos2dxGLSurfaceView.java, line(s) 65,75,336
org/cocos2dx/lib/Cocos2dxHttpURLConnection.java, line(s) 41,58,90,104,105,123,206,223,233,243,323,77
org/cocos2dx/lib/Cocos2dxLocalStorage.java, line(s) 53,95
org/cocos2dx/lib/Cocos2dxMusic.java, line(s) 48,64,175
org/cocos2dx/lib/Cocos2dxSound.java, line(s) 203
org/cocos2dx/lib/Cocos2dxVideoView.java, line(s) 150,214,217,369,374
org/cocos2dx/lib/Cocos2dxWebView.java, line(s) 35,65
org/nexage/sourcekit/mraid/MRAIDBrowser.java, line(s) 60,75,77,146
org/nexage/sourcekit/mraid/MRAIDInterstitial.java, line(s) 30,39,47,56,76
org/nexage/sourcekit/mraid/MRAIDVideoAddendumInterstitial.java, line(s) 103,112,123,131,139,147,155,164,172,180,188,201,216,224,232,240,248,256,268
org/nexage/sourcekit/mraid/MRAIDVideoAddendumView.java, line(s) 225,231,242,277,290,296,350,420,443,450,457,464,471,478,486,493,500,507,514,521,528,535,542,565,568,586,590,591,592,595,613,614,618,638,641,653,740,792,807,817,859,957,963,968,976,1000,1001,1002,1003,1068,1075,1092,1109,1113,1135,1155,1173,1198,1213,1240,1263,1288,1348,1357,1362,1365,1372,1390,1400,1429,1432,1437,1440,1445,1500,1510,1550,1557,1563,1573,1618,1626,873,1024,1040,218,322,1107,1571
org/nexage/sourcekit/mraid/MRAIDView.java, line(s) 148,154,165,200,213,219,280,350,389,394,412,416,417,418,421,439,440,444,464,467,479,566,618,633,643,686,782,788,793,801,825,826,827,828,893,900,915,929,939,943,965,986,989,1002,1023,1038,1065,1088,1113,1173,1182,1187,1190,1197,1215,1225,1254,1257,1262,1265,1270,1321,1331,1349,1378,1385,1391,1401,1446,1454,700,849,865,141,937,1399
org/nexage/sourcekit/mraid/internal/MRAIDLog.java, line(s) 30,36,42,48,58,64,69,75,81,87,93
org/nexage/sourcekit/mraid/internal/MRAIDNativeFeatureManager.java, line(s) 24,30,36,42,48
org/nexage/sourcekit/mraid/internal/MRAIDParser.java, line(s) 38,53,57
org/nexage/sourcekit/mraid/nativefeature/MRAIDNativeFeatureProvider.java, line(s) 80,85,87,145,180,51,60,64,73,83
org/nexage/sourcekit/util/DefaultMediaPicker.java, line(s) 53,82,87,92,97,102,105,35
org/nexage/sourcekit/util/HttpTools.java, line(s) 21,35,12,45
org/nexage/sourcekit/util/NetworkTools.java, line(s) 11,15,20,25,28
org/nexage/sourcekit/util/VASTLog.java, line(s) 30,36,42,52,57,63,69
org/nexage/sourcekit/util/XmlTools.java, line(s) 41,51,58,71,84,102,53,78,96,114,31
org/nexage/sourcekit/vast/VASTPlayer.java, line(s) 164,176,232,245,292,308,151,225,238,251,273,203,310
org/nexage/sourcekit/vast/activity/VASTActivity.java, line(s) 125,130,140,141,142,143,144,155,179,189,220,317,538,540,555,571,572,596,612,736,739,789,835,893,901,919,931,950,959,961,964,1011,1028,1038,1048,1053,1055,1058,1071,1081,1091,1097,1107,1113,1119,1122,1139,1144,1155,1169,602,848,858,977,990,1017,1019,1163,527,565,590,607,765,768,771,774,544,836,854,871,127,781
org/nexage/sourcekit/vast/activity/VPAIDActivity.java, line(s) 110,121,132,143,158,216,252,315,325,334,359,422
org/nexage/sourcekit/vast/model/VASTCompanion.java, line(s) 34,76
org/nexage/sourcekit/vast/model/VASTModel.java, line(s) 59,76,79,81,95,98,102,127,176,197,202,207,255,277,312,342,70,117,134,142,158,162,166,170,191,240,271,302,334,348,296
org/nexage/sourcekit/vast/processor/VASTModelPostValidator.java, line(s) 14,31,43,45,51,56,22,37,61,41
org/nexage/sourcekit/vast/processor/VASTProcessor.java, line(s) 29,33,42,44,48,69,71,95,108,36,50,56,82,88,127,99
rrrrrr/rrccrr.java, line(s) 39

安全 此应用程序可能具有Root检测功能

此应用程序可能具有Root检测功能
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05j-Testing-Resiliency-Against-Reverse-Engineering.md#testing-root-detection-mstg-resilience-1

Files:
com/appodeal/ads/al.java, line(s) 191,191,191,191,191
com/chartboost/sdk/Libraries/CBUtility.java, line(s) 183,191,187,191,191,191,191
com/yandex/metrica/impl/aj.java, line(s) 18

安全 此应用程序使用SSL Pinning 来检测或防止安全通信通道中的MITM攻击

此应用程序使用SSL Pinning 来检测或防止安全通信通道中的MITM攻击
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05g-Testing-Network-Communication.md#testing-custom-certificate-stores-and-certificate-pinning-mstg-network-4

Files:
com/appodeal/ads/utils/c.java, line(s) 59,58,57,57
com/yandex/metrica/impl/ob/cz.java, line(s) 22,21,20,20
com/yandex/metrica/impl/ob/dd.java, line(s) 52,51,55,47,50,50
org/cocos2dx/lib/Cocos2dxHttpURLConnection.java, line(s) 87,85,87,82,83,84

安全评分: ( Armor 1.16.1)