漏洞分析

0

高危漏洞

9

中危漏洞

3

低危漏洞

8

警告

文件名 ofoapkpure.com.apk
上传者 jkwolf18
文件大小 11.066108703613MB
MD5 3ee78e496761731b016d29bede6a2cb8
包名 so.ofo.abroad
Main Activity so.ofo.abroad.ui.splash.SplashActivity
Min SDK 16
Target SDK 22

权限列表

# 名称 说明 提示
0 android.permission.ACCESS_COARSE_LOCATION 访问大概的位置源(例如蜂窝网络数据库)以确定手机的大概位置(如果可以)。恶意应用程序可借此确定您所处的大概位置。 注意
1 android.permission.ACCESS_FINE_LOCATION 访问精准的位置源,例如手机上的全球定位系统(如果有)。恶意应用程序可能会借此确定您所处的位置,并可能消耗额外的电池电量。 注意
2 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 访问额外的位置信息提供程序命令。恶意应用程序可借此干扰GPS或其他位置源的正常工作。 注意
3 android.permission.BLUETOOTH 允许应用程序查看本地蓝牙手机的配置,以及建立或接受与配对设备的连接。 注意
4 android.permission.READ_CONTACTS 允许应用程序读取您手机上存储的所有联系人(地址)数据。恶意应用程序可借此将您的数据发送给其他人。 注意
5 android.permission.READ_PHONE_STATE 允许应用程序访问设备的手机功能。有此权限的应用程序可确定此手机的号码和序列号,是否正在通话,以及对方的号码等。 注意
6 android.permission.ACCESS_NETWORK_STATE 允许应用程序查看所有网络的状态。 提示
7 android.permission.ACCESS_WIFI_STATE 允许应用程序查看有关WLAN状态的信息。 提示
8 android.permission.BLUETOOTH_ADMIN 允许应用程序配置本地蓝牙手机,以及发现远程设备并与其配对。 提示
9 android.permission.CAMERA 允许应用程序使用相机拍照,这样应用程序可随时收集进入相机镜头的图像。 提示
10 android.permission.CHANGE_WIFI_STATE 允许应用程序连接到WLAN接入点以及与WLAN接入点断开连接,并对配置的WLAN网络进行更改。 提示
11 android.permission.FLASHLIGHT 允许应用程序控制闪光灯。 提示
12 android.permission.INTERNET 允许程序访问网络. 提示
13 android.permission.WAKE_LOCK 允许应用程序防止手机进入休眠状态。 提示
14 android.permission.WRITE_EXTERNAL_STORAGE 允许应用程序写入SD卡。 提示

四大组件

组件名称

so.ofo.abroad.ui.contactlist.ContactListActivity
so.ofo.abroad.ui.splash.SplashActivity
so.ofo.abroad.pagejump.ExternalJumpInActivity
so.ofo.abroad.ui.home.OfoHomeActivity
so.ofo.abroad.ui.login.LoginSignupActivity
so.ofo.abroad.ui.login.LoginProtocolActivity
so.ofo.abroad.ui.tutorial.TutorialActivity
so.ofo.abroad.ui.proifle.ProfileActivity
so.ofo.abroad.ui.wallet.topUpDetail.WalletDetailListActivity
so.ofo.abroad.ui.countrylist.CountryListActivity
so.ofo.abroad.ui.repair.RepairNewActivity
so.ofo.abroad.ui.illegalparking.IllegalParkingActivity
so.ofo.abroad.ui.feedback.FeedbackActivity
so.ofo.abroad.ui.base.CommonWebviewActivity
so.ofo.abroad.ui.report.ReportActivity
so.ofo.abroad.ui.payment.addPayment.AddCreditCardActivity
so.ofo.abroad.ui.payment.addpayselect.AddPayMethodSelActivity
so.ofo.abroad.ui.wallet.coupons.CouponListActivity
so.ofo.abroad.ui.wallet.pass.PurchasePassActivity
so.ofo.abroad.ui.userbike.scan.ScanQrCodeActivity
so.ofo.abroad.ui.userbike.ble.BleUnlockActivity
so.ofo.abroad.ui.trips.TripsListActivity
so.ofo.abroad.ui.trips.TripsDetailActivity
so.ofo.abroad.ui.trips.RiddingEndActivity
so.ofo.abroad.ui.settings.SettingsActivity
so.ofo.abroad.ui.invitation.InvitationActivity
so.ofo.abroad.ui.about.AboutOfoActivity
so.ofo.abroad.ui.promotions.PromotionActivity
so.ofo.abroad.ui.payment.paymentList.PaymentActivity
so.ofo.abroad.ui.wallet.mywallet.MyWalletActivity
so.ofo.abroad.ui.wallet.deposit.DepositOrRefundActivity
so.ofo.abroad.ui.wallet.topup.WalletTopUpActivity
so.ofo.abroad.ui.inbox.InboxListActivity
so.ofo.abroad.ui.inbox.InboxDetailActivity
so.ofo.abroad.ui.userbike.fence.FenceDetailActivity
so.ofo.abroad.ui.proifle.credit.CreditActivity
so.ofo.abroad.ui.userbike.home.UseBikeHomeActivity
so.ofo.abroad.ui.testset.TestSetActivity
so.ofo.abroad.ui.reserve.ReserveActivity
com.google.android.gms.common.api.GoogleApiActivity
com.facebook.FacebookActivity
com.facebook.CustomTabMainActivity
com.ofo.ofopay.activities.AuthForAddPaymentActivity
asia.bluepay.paysdk.BluePayWebActivity
com.ofo.pay.OfoPayActivity
asia.bluepay.paysdk.result.PayResultActivity

so.ofo.abroad.service.LocationReordService
so.ofo.abroad.service.MyFirebaseMessagingService
so.ofo.abroad.ui.userbike.usebikebase.OrderRefreshService
so.ofo.abroad.leanplum.OfoLeanPlumPushListenerService
com.leanplum.LeanplumLocalPushListenerService
com.leanplum.LeanplumPushListenerService
com.leanplum.LeanplumPushInstanceIDService
com.leanplum.LeanplumPushRegistrationService
com.leanplum.LeanplumPushFirebaseMessagingService
com.leanplum.LeanplumPushFcmListenerService
com.leanplum.LeanplumFcmServiceHelper
com.leanplum.ReceiveTransitionsIntentService
com.google.firebase.messaging.FirebaseMessagingService
com.google.android.gms.measurement.AppMeasurementService
com.google.firebase.iid.FirebaseInstanceIdService
so.ofo.bluetooth.service.BLEService

com.leanplum.LeanplumPushReceiver
com.google.android.gms.gcm.GcmReceiver
com.google.android.gms.measurement.AppMeasurementReceiver
com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver
com.google.firebase.iid.FirebaseInstanceIdReceiver
com.google.firebase.iid.FirebaseInstanceIdInternalReceiver
so.ofo.bluetooth.BLEController$BleStatusReceiver
so.ofo.bluetooth.operation.orderhand.BaseOrderHandler$BleDataChangeReceiver

com.google.firebase.provider.FirebaseInitProvider
com.facebook.FacebookContentProvider
com.facebook.internal.FacebookInitProvider

第三方库

# 库名 介绍
0 com.google.android.gms.maps 谷歌地图是 Google 公司提供的电子地图服务,包括局部详细的卫星照片。此款服务可以提供含有政区和交通以及商业信息的矢量地图、不同分辨率的卫星照片和可以用来显示地形和等高线地形视图。在各类平台均有应用,操作简单方便。
1 android.support.transition A backport of the new Transitions API for Android.
2 retrofit2 Type-safe REST client for Android and Java by Square, Inc.
3 com.squareup.picasso A powerful image downloading and caching library for Android.
4 com.bigkoo.pickerview 仿iOS的PickerView控件,有时间选择和选项选择并支持一二三级联动效果
5 com.networkbench.com 听云是公司全新的APM服务平台,为客户提供从移动客户端到服务器端再到网络层面的全方位解决方案。帮助客户实时监控定位从崩溃报错、慢交互到网络环境出错等多维度复杂的性能问题。听云致力于用户视角的IT管理创新服务,为不同行业提供最终用户端到端的完整应用链的性能管理解决方案,帮助客户不断优化系统性能及用户体验,提高用户满意度和企业竞争力。
6 com.google.zxing Official ZXing ("Zebra Crossing") project home
7 com.google.gson A Java serialization library that can convert Java Objects into JSON and back.
8 me.relex.circleindicator a lightweight viewpager indicator like in nexus 5 launcher
9 android.support.multidex DEPRECATED
10 com.google.maps.android This open-source library contains classes that are useful for a wide range of applications using the Google Maps Android API.
11 me.relex.circleindicator a lightweight viewpager indicator like in nexus 5 launcher
12 retrofit2 Type-safe REST client for Android and Java by Square, Inc.
13 okhttp3 An HTTP+SPDY client for Android and Java applications.
14 me.grantland.widget A TextView that automatically resizes text to fit perfectly within its bounds.
15 jp.wasabeef.picasso.transformations An Android transformation library providing a variety of image transformations for Picasso.

静态扫描发现风险点

风险等级 风险名称

中危

检测到当前标志被设置成true或没设置,这会导致adb调试备份允许恶意攻击者复制应用程序数据,造成数据泄露。

中危

检测到1个暴露的provider组件实现了openFile函数。

位置: classes.dex
Lcom/facebook/FacebookContentProvider; openFile


对外暴露的Content Provider实现了openFile()接口,会导致其他有相应调用该Content Provider权限的应用即可调用Content Provider的openFile()接口进行文件数据访问。如果没有进行Content Provider访问权限控制和对访问的目标文件的Uri进行有效判断,攻击者利用文件目录遍历访问任意可读文件。
(1)将不必要导出的Content Provider设置为不导出
(2)去除没有必要的openFile()接口
(3)过滤限制跨域访问,对访问的目标文件的路径进行有效判断
(4)使用签名验证来控制Content Provider共享数据的访问权限,如设置protectionLevel="signature"或"signatureOrSystem"
(5)公开的content provider确保不存储敏感数据
(6)提供asset文件时注意权限保护

参考案例:
www.wooyun.org/bugs/wooyun-2013-047098
www.wooyun.org/bugs/wooyun-2013-044407
www.wooyun.org/bugs/wooyun-2013-044411

参考资料:
https://jaq.alibaba.com/blog.htm?id=61
http://wolfeye.baidu.com/blog/content-provider-file-traversal
http://drops.wooyun.org/tips/4314

中危

检测到1个未移除的敏感Test或Debug组件

so.ofo.abroad.ui.testset.TestSetActivity

建议:
在正式发布app前移除敏感的Test或Debug组件

中危

检测到1处中间人攻击漏洞。

位置: classes.dex
com.networkbench.agent.impl.m.z;->b()Lorg.apache.http.client.HttpClient;

setHostnameVerifier方法设置ALLOW_ALL_HOSTNAME_VERIFIER,直接接受任意域名,可能造成中间人攻击漏洞。建议:
对SSL证书进行强校验,包括签名CA是否合法、证书是否是自签名、主机域名是否匹配、证书是否过期等。

参考案例:
http://www.wooyun.org/bugs/wooyun-2010-042710
http://www.wooyun.org/bugs/wooyun-2010-052339
http://www.wooyun.org/bugs/wooyun-2016-0190773

参考资料:
http://wolfeye.baidu.com/blog/webview-ignore-ssl-error/
https://jaq.alibaba.com/blog.htm?id=60

中危

该app需要移除大部分日志打印代码。
经扫描该包仍存在大量打日志代码,共发现226处打日志代码.(此处扫描的日志打印代码,是指调用android.util.Log.* 打印的.)
详情如下:

位置: classes.dex
com.facebook.internal.b;->a(Landroid/content/Context;)Lcom/facebook/internal/b;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.ofopay.utils.LogUtils;->logD(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.f;->d(Ljava/lang/String;)Ljava/security/KeyPair;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.circle.h$1;->b(Ljava/io/File; Z)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.MergePaths;->a(Lcom/airbnb/lottie/bf; Lcom/airbnb/lottie/q;)Lcom/airbnb/lottie/z;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.harvest.HarvestConnection;->sendNew(Lorg/apache/http/client/methods/HttpPost;)Lcom/networkbench/agent/impl/harvest/HarvestResponse;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.internal.w;->b(Lcom/facebook/internal/w$e;)Ljava/util/TreeSet;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdInternalReceiver;->a(Landroid/content/Context; Ljava/lang/String; Landroid/content/Intent;)I==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.internal.ac;->a(Landroid/content/Context; Z)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.appsflyer.a;->c(Ljava/lang/String;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.c$b;->a(Ljava/lang/Object; F)Lcom/airbnb/lottie/ao;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->d(Landroid/content/Intent;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdInternalReceiver;->d(Landroid/content/Context; Landroid/content/Intent;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.b;->e(Landroid/content/Context; Landroid/content/Intent;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.crash.internal.a;->a()V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->d(Ljava/lang/String;)I==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.f$a;->a(Ljava/lang/String;)Lcom/google/firebase/iid/f$a;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.a.d;->a(Ljava/lang/String; Ljava/lang/String; [B)Landroid/util/Pair;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdService;->zzd(Landroid/content/Intent; Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.internal.ac;->b(Landroid/content/Context; Z)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.appsflyer.a.a;->a(Lcom/appsflyer/a/b; Landroid/content/Context;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.b.a;->a(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.appsflyer.a.a;->b(Landroid/content/Context;)Ljava/util/List;==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.instrumentation.NBSOkHttpInstrumentation;->openWithProxy(Ljava/net/HttpURLConnection;)Ljava/net/HttpURLConnection;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.ce;->a(Lorg/json/JSONObject; Lcom/airbnb/lottie/be;)Lcom/airbnb/lottie/ab;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.h.b;->()V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.aa;->a(Landroid/content/Context;)Z==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.a;->b(Z)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.appsflyer.a;->b(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->e(Ljava/lang/String; Ljava/lang/String;)I==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.l$1;->checkClientTrusted([Ljava/security/cert/X509Certificate; Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdInternalReceiver;->c(Landroid/content/Context; Landroid/content/Intent;)I==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.crash.FirebaseCrash;->(Lcom/google/firebase/a; Z)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.appsflyer.a;->d(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.e.e;->a(Ljava/lang/String; I)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.RemoteMessage;->getTtl()I==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.appsflyer.a.a;->a(Landroid/content/Context;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->c(Ljava/lang/Object; Ljava/lang/String;)I==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
asia.bluepay.paysdk.BluePayApi;->payOrder(Lasia/bluepay/paysdk/a;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.g;->onPreExecute()V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.GrowingIO;->(Lcom/growingio/android/sdk/collection/Configuration;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.LottieAnimationView;->setComposition(Lcom/airbnb/lottie/be;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.b.a;->a(Ljava/util/Observer;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.aw;->(Landroid/graphics/drawable/Drawable$Callback; Ljava/lang/String; Lcom/airbnb/lottie/av; Ljava/util/Map;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.a.e;->a(Ljava/lang/String;)Landroid/util/Pair;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.messagetemplates.a;->a(Lcom/leanplum/ActionContext; Ljava/lang/String;)Ljava/lang/String;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.share.model.ShareLinkContent$a;->a(Ljava/lang/String;)Lcom/facebook/share/model/ShareLinkContent$a;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.a;->a(Ljava/lang/Class; Ljava/lang/Object; Ljava/lang/Iterable;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->c(Ljava/lang/String; [Ljava/lang/Object;)I==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->a(Landroid/os/Bundle; Ljava/security/KeyPair; Ljava/lang/String;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.internal.ab;->a(Ljava/lang/String; Ljava/lang/Exception;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.ofopay.utils.LogUtils;->logE(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.a.ao;->a(Lcom/leanplum/a/ap; Ljava/lang/String;)V==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.appevents.internal.a;->d(Landroid/app/Activity;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.a.ao;->a(Lcom/leanplum/a/ap; Ljava/lang/String;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.a;->d(Landroid/os/Bundle; Ljava/lang/String;)Ljava/lang/String;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdService;->zzag(Landroid/content/Intent;)Z==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdInternalReceiver;->d(Landroid/content/Context; Landroid/content/Intent;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.crash.FirebaseCrash;->(Lcom/google/firebase/a; Z)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.crash.internal.d;->uncaughtException(Ljava/lang/Thread; Ljava/lang/Throwable;)V==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.f;->e(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.CustomEvent;->a(Lorg/json/JSONObject; Ljava/util/Map$Entry;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.scan.d.b.a;->a(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
asia.bluepay.paysdk.b.u;->c(Ljava/lang/String; [Ljava/lang/Object;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdService;->zza(Landroid/content/Intent; Z)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceId;->a(Ljava/security/KeyPair;)Ljava/lang/String;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->b(Ljava/lang/String; Ljava/lang/String;)I==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.provider.FirebaseInitProvider;->onCreate()Z==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.crash.FirebaseCrash;->(Lcom/google/firebase/a; Z)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.FirebaseMessagingService;->zzn(Landroid/content/Intent;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
asia.bluepay.paysdk.BluePayApi;->init(Landroid/content/Context; Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
asia.bluepay.paysdk.webview.a.c;->b(Ljava/lang/String;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.widget.residemenu.ResideMenu;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.share.internal.d$a$1;->b()Landroid/os/Bundle;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.FacebookActivity;->onCreate(Landroid/os/Bundle;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.utils.LogUtil;->e(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.internal.ab;->b(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.b;->a(Landroid/content/Context; Ljava/lang/String; Landroid/content/Intent;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.a.e;->a(Ljava/lang/String;)Landroid/util/Pair;==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.appevents.internal.c;->a()V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.a;->c(Landroid/os/Bundle; Ljava/lang/String;)[Ljava/lang/Object;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.e.e;->e(Ljava/lang/String;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.circle.h$a;->a(Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.circle.c;->a(Landroid/content/Intent; Landroid/app/Activity;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.FacebookContentProvider;->openFile(Landroid/net/Uri; Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.t;->c()F==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.e.e;->a(Ljava/lang/String; I)V==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.VdsJsHelper;->update(Lcom/growingio/android/sdk/models/i; Z)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.utils.LogUtil;->v(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.be;->a(Ljava/lang/String;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->b(Ljava/lang/String;)I==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->d(Landroid/content/Intent;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.messagetemplates.f$1$1;->run()V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.b.a;->b(Ljava/util/Observer;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.share.model.ShareLinkContent$a;->b(Landroid/net/Uri;)Lcom/facebook/share/model/ShareLinkContent$a;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->a(Landroid/content/Intent; Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.GrowingIO;->startWithConfiguration(Landroid/app/Application; Lcom/growingio/android/sdk/collection/Configuration;)Lcom/growingio/android/sdk/collection/GrowingIO;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.circle.a.a$3;->b(Lcom/growingio/android/sdk/models/i;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.instrumentation.NBSOkHttpInstrumentation;->open(Ljava/net/HttpURLConnection;)Ljava/net/HttpURLConnection;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
asia.bluepay.paysdk.b.u;->a(Ljava/lang/String; [Ljava/lang/Object;)V==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->a(Landroid/content/Context;)Ljava/lang/String;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.utils.HttpService;->a(Lcom/growingio/android/sdk/utils/DNSService$HostInformation;)Landroid/util/Pair;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceId;->a(Landroid/content/Context; Ljava/lang/String;)I==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.messagetemplates.b;->a(Lcom/leanplum/ActionContext; Ljava/lang/String;)Ljava/lang/String;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
android.arch.lifecycle.h;->d()V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.l$1;->getAcceptedIssuers()[Ljava/security/cert/X509Certificate;==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.scan.d.a.c;->a(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.aa;->a()Ljava/lang/String;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.ofopay.utils.LogUtils;->logI(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.GrowingIO;->startTracing(Landroid/content/Context; Ljava/lang/String; D)Lcom/growingio/android/sdk/collection/GrowingIO;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.a.a.l;->b(Ljava/lang/Object;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.crash.internal.a;->(Landroid/content/Context;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.a.ao;->a(Lcom/leanplum/a/ap; Ljava/lang/String;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->a(Ljava/lang/String; Ljava/lang/String;)I==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.aa;->b(Landroid/content/Context;)Z==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.a.a.l;->a(Ljava/lang/Class; Ljava/lang/String; Ljava/lang/Class;)Ljava/lang/reflect/Method;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->a(Landroid/os/Message;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.a.a.l$b;->b(Ljava/lang/Object;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceId;->c(Landroid/content/Context;)Ljava/lang/String;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.a;->a(Ljava/lang/String; Landroid/app/Notification;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.crash.FirebaseCrash;->getInstance(Lcom/google/firebase/a;)Lcom/google/firebase/crash/FirebaseCrash;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.internal.v;->a(Ljava/util/Collection;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.DBAdapter;->a(Ljava/lang/String; Z Ljava/lang/String;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.GrowingIO;->trackX5WebView(Lcom/tencent/smtt/sdk/WebView; Lcom/tencent/smtt/sdk/WebChromeClient;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.appevents.a;->b()Ljava/lang/String;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.a;->b(Ljava/lang/String;)I==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.utils.LogUtil;->d(Ljava/lang/String; [Ljava/lang/Object;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->e(Ljava/lang/Object; Ljava/lang/String;)I==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->b(Landroid/os/Bundle; Ljava/security/KeyPair;)Landroid/content/Intent;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.crash.FirebaseCrash;->a(Ljava/lang/String; J Landroid/os/Bundle;)V==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->a(Ljava/lang/Object; Ljava/lang/Object;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.b;->e(Landroid/content/Context; Landroid/content/Intent;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.appsflyer.a;->a(Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.instrumentation.okhttp2.NBSOkHttp2Instrumentation;->newCall(Lcom/squareup/okhttp/OkHttpClient; Lcom/squareup/okhttp/Request;)Lcom/squareup/okhttp/Call;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.f;->e(Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.messagetemplates.f$1;->onResponse(Lcom/leanplum/ActionContext;)Z==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.squareup.picasso.ab;->a(Ljava/lang/String; Ljava/lang/String; Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.login.LoginMethodHandler;->a(Ljava/lang/String;)Ljava/lang/String;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->a(Ljava/lang/String; [Ljava/lang/Object;)I==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->b(Ljava/lang/Object; Ljava/lang/String;)I==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdReceiver;->onReceive(Landroid/content/Context; Landroid/content/Intent;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdInternalReceiver;->c(Landroid/content/Context; Landroid/content/Intent;)I==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.ofopay.utils.LogUtils;->logW(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.e.e;->a(Ljava/lang/String; I)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.a.ao;->a(Lcom/leanplum/a/ap; Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.bigkoo.pickerview.lib.WheelView;->onDraw(Landroid/graphics/Canvas;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.FirebaseMessagingService;->zzaj(Landroid/content/Intent;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.agent.VdsAgent;->a(Landroid/app/Fragment;)Ljava/util/List;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.instrumentation.NBSWebChromeClient;->parselogNetwork(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.internal.g;->b(Ljava/lang/Object; Ljava/lang/Object;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.g;->a(Ljava/util/List;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.utils.LogUtil;->i(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->e(Ljava/lang/String; [Ljava/lang/Object;)I==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->c(Ljava/lang/String; Ljava/lang/String;)I==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
me.drakeet.multitype.MultiTypeAdapter;->a(Ljava/lang/Class;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->c(Landroid/content/Intent;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.scan.a.d;->a(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.messagetemplates.b;->a(Lcom/leanplum/ActionContext;)Ljava/lang/String;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.f$a;->a(Ljava/lang/String; Ljava/lang/String; J)Ljava/lang/String;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->a(Ljava/lang/Object; Ljava/lang/String;)I==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->a(Ljava/lang/Object;)I==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.instrumentation.NBSWebChromeClient;->parsejavascriptError(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.GrowingIO;->getInstance()Lcom/growingio/android/sdk/collection/GrowingIO;==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->b(Ljava/lang/String; [Ljava/lang/Object;)I==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.login.LoginFragment;->onResume()V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.a;->e(Landroid/os/Bundle;)Landroid/app/PendingIntent;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.GrowingIO;->setChannel(Ljava/lang/String;)Lcom/growingio/android/sdk/collection/GrowingIO;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.share.model.ShareLinkContent$a;->b(Ljava/lang/String;)Lcom/facebook/share/model/ShareLinkContent$a;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.scan.h.c;->b(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.growingio.android.sdk.collection.GrowingIO;->trackWebView(Landroid/webkit/WebView; Landroid/webkit/WebChromeClient;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.l$1;->checkServerTrusted([Ljava/security/cert/X509Certificate; Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.GraphRequest;->m()V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdService$1;->onReceive(Landroid/content/Context; Landroid/content/Intent;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.l$a;->a(Lorg/json/JSONObject; Lcom/airbnb/lottie/be;)Lcom/airbnb/lottie/l;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdService;->zza(Lcom/google/firebase/iid/e; Landroid/os/Bundle;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.zzb$1;->handleMessage(Landroid/os/Message;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.instrumentation.NBSWebChromeClient;->parselogView(Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.t;->d()Ljava/lang/String;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.b.a;->a(Ljava/lang/Object;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.a.a.l;->a(Ljava/lang/Object;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.bf;->a(Z)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.b$2;->a(Lcom/facebook/i;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
asia.bluepay.paysdk.b.u;->b(Ljava/lang/String; [Ljava/lang/Object;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->c(Ljava/lang/String;)I==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.messagetemplates.b;->a(Lcom/leanplum/ActionContext; Ljava/lang/String;)Ljava/lang/String;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.e.e;->a(Ljava/lang/String; I)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.instrumentation.NBSOkHttpInstrumentation;->urlFactoryOpen(Ljava/net/HttpURLConnection;)Ljava/net/HttpURLConnection;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.FirebaseMessagingService;->zzm(Landroid/content/Intent;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.facebook.internal.b;->a(Landroid/content/Context;)Lcom/facebook/internal/b;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->a(Ljava/lang/String;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.aa;->b(Landroid/content/Context;)Z==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.appsflyer.a.a;->a(Ljava/lang/String; Landroid/content/Context;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.al;->(Landroid/graphics/drawable/Drawable$Callback; Lcom/airbnb/lottie/ak;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
asia.bluepay.paysdk.webview.a.a;->a(Ljava/lang/String;)V==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->d(Ljava/lang/Object; Ljava/lang/String;)I==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.messagetemplates.a;->a(Lcom/leanplum/ActionContext; Ljava/lang/String;)Ljava/lang/String;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdService;->zzah(Landroid/content/Intent;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.a.a.l$a;->b(Ljava/lang/Object;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.ofo.ofopay.utils.LogUtils;->logV(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->v(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.b;->a(Landroid/content/Context; Ljava/lang/String; Landroid/content/Intent;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.e;->c(Landroid/content/Intent;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.messaging.a;->c(Ljava/lang/String;)Ljava/lang/Integer;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->d(Ljava/lang/String; Ljava/lang/String;)I==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.leanplum.messagetemplates.a;->a(Lcom/leanplum/ActionContext;)Ljava/lang/String;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.google.firebase.iid.FirebaseInstanceIdInternalReceiver;->onReceive(Landroid/content/Context; Landroid/content/Intent;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.networkbench.agent.impl.m.f;->d(Ljava/lang/String; [Ljava/lang/Object;)I==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.airbnb.lottie.q;->a(Lcom/airbnb/lottie/Layer; Lcom/airbnb/lottie/bf; Lcom/airbnb/lottie/be;)Lcom/airbnb/lottie/q;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I

位置: classes2.dex
so.ofo.abroad.ui.userbike.usebikeRidding.b;->a(Ljava/lang/Object;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.utils.v;->b(Landroid/content/Context;)Landroid/net/ConnectivityManager;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.ui.login.LoginSignupActivity$2;->b(I)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.utils.t;->a(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.widget.SlidingButtonView;->onLayout(Z I I I I)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.b.b;->setChanged()V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.b.b;->notifyObservers(Ljava/lang/Object;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.b.b;->notifyObservers()V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.ui.login.LoginSignupActivity$2;->a(I)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.service.LocationReordService;->onLocationChanged(Landroid/location/Location;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.utils.t;->b(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.widget.SwipeLayout;->onMeasure(I I)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.ui.login.LoginSignupActivity$1;->a(I)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.share.a;->a(Ljava/lang/String; Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.ui.countrylist.Sidebar;->setHeaderTextAndscroll(Landroid/view/MotionEvent;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.share.a$1;->a(Lcom/facebook/share/b$a;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.share.a;->a(Lso/ofo/abroad/share/a/a;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.utils.v;->a(Landroid/content/Context;)Z==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
so.ofo.abroad.utils.t;->c(Ljava/lang/String; Ljava/lang/String;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I

中危

检测到9个WebView远程执行漏洞。

位置: classes.dex
asia.bluepay.paysdk.webview.a.c;->c()V
com.growingio.android.sdk.circle.HybridEventEditDialog;->a(Landroid.content.Context;)V
com.growingio.android.sdk.collection.VdsJsHelper;->a(Landroid.view.View;)V
com.networkbench.agent.impl.instrumentation.NBSWebViewClient;->onPageStarted(Landroid.webkit.WebView; Ljava.lang.String; Landroid.graphics.Bitmap;)V
com.networkbench.agent.impl.instrumentation.NBSWebViewClient;->onPageStarted(Landroid.webkit.WebView; Ljava.lang.String; Landroid.graphics.Bitmap;)V
com.ofo.ofopay.views.WebViewContainer;->setJsHandler(Lcom.ofo.ofopay.views.JsNativeHandler;)V
com.growingio.android.sdk.collection.VdsJsHelper;->a(Landroid.view.View;)V

位置: classes2.dex
so.ofo.abroad.widget.WebViewWithProgressBar$1;->loadUrl(Ljava.lang.String;)V
so.ofo.abroad.widget.WebViewWithProgressBar$1;->loadUrl(Ljava.lang.String;)V

Android API < 17之前版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用addJavaScriptInterface方法,攻击者可以通过Java反射利用该漏洞执行任意Java对象的方法,导致远程代码执行安全漏洞。
(1)API等于高于17的Android系统。出于安全考虑,为了防止Java层的函数被随意调用,Google在4.2版本之后,规定允许被调用的函数必须以@JavascriptInterface进行注解。
(2)API等于高于17的Android系统。建议不要使用addJavascriptInterface接口,以免带来不必要的安全隐患,如果一定要使用该接口,建议使用证书校验。
(3)使用removeJavascriptInterface移除Android系统内部的默认内置接口:searchBoxJavaBridge_、accessibility、accessibilityTraversal。

参考案例:
www.wooyun.org/bugs/wooyun-2015-0140708
www.wooyun.org/bugs/wooyun-2016-0188252
http://drops.wooyun.org/papers/548

参考资料:
http://jaq.alibaba.com/blog.htm?id=48
http://blog.nsfocus.net/android-webview-remote-code-execution-vulnerability-analysis
https://developer.android.com/reference/android/webkit/WebView.html

中危

检测到83条敏感明文信息,建议移除。

位置: classes.dex
'10.0.0.172' used in: Lcom/networkbench/agent/impl/m/z;->a(Landroid/content/Context;)Lcom/networkbench/agent/impl/m/z;
'10.0.0.172' used in: Lcom/networkbench/agent/impl/m/aa;->a(Landroid/content/Context; Lorg/apache/http/client/HttpClient;)V
'10.0.0.200' used in: Lcom/networkbench/agent/impl/m/z;->a(Landroid/content/Context;)Lcom/networkbench/agent/impl/m/z;
'cs@ofo.com' used in: Lso/ofo/abroad/b/a;->c()Ljava/lang/String;
'data:image/jpeg;base64,' used in: Lcom/growingio/android/sdk/circle/j;->a()Lorg/json/JSONObject;
'data:image/jpeg;base64,' used in: Lcom/growingio/android/sdk/circle/HybridEventEditDialog$HybridCircleContent;->(Ljava/util/List; Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V
'file:///android_asset/' used in: Lcom/ofo/ofopay/views/WebViewContainer;->displayErrorPage(Landroid/webkit/WebView; Ljava/lang/String;)V
'file:///android_asset/' used in: Lcom/squareup/picasso/b;->()V
'http://fir.im/GIOAndroidApp' used in: Lcom/growingio/android/sdk/circle/c$9;->onClick(Landroid/content/DialogInterface; I)V
'http://leanplum:close' used in: Lcom/leanplum/messagetemplates/b;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:close' used in: Lcom/leanplum/messagetemplates/WebInterstitialOptions;->toArgs()Lcom/leanplum/ActionArgs;
'http://leanplum:close' used in: Lcom/leanplum/messagetemplates/a;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:close' used in: Lcom/leanplum/messagetemplates/HTMLTemplate;->register()V
'http://leanplum:loadFinished' used in: Lcom/leanplum/messagetemplates/b;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:loadFinished' used in: Lcom/leanplum/messagetemplates/a;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:loadFinished' used in: Lcom/leanplum/messagetemplates/HTMLTemplate;->register()V
'http://leanplum:runAction' used in: Lcom/leanplum/messagetemplates/b;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:runAction' used in: Lcom/leanplum/messagetemplates/a;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:runAction' used in: Lcom/leanplum/messagetemplates/HTMLTemplate;->register()V
'http://leanplum:runTrackedAction' used in: Lcom/leanplum/messagetemplates/b;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:runTrackedAction' used in: Lcom/leanplum/messagetemplates/a;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:runTrackedAction' used in: Lcom/leanplum/messagetemplates/HTMLTemplate;->register()V
'http://leanplum:track' used in: Lcom/leanplum/messagetemplates/b;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:track' used in: Lcom/leanplum/messagetemplates/a;->m()Lcom/leanplum/ActionArgs;
'http://leanplum:track' used in: Lcom/leanplum/messagetemplates/HTMLTemplate;->register()V
'http://plus.google.com/' used in: Lcom/google/android/gms/common/internal/u;->()V
'http://s.tb.cn' used in: Lcom/taobao/ma/a/a/a;->()V
'http://schemas.android.com/apk/res/android' used in: Landroid/support/v4/content/res/TypedArrayUtils;->hasAttribute(Lorg/xmlpull/v1/XmlPullParser; Ljava/lang/String;)Z
'http://www.example.com' used in: Lcom/leanplum/messagetemplates/f;->a()V
'http://www.example.com' used in: Lcom/leanplum/messagetemplates/WebInterstitialOptions;->toArgs()Lcom/leanplum/ActionArgs;
'http://www.example.com' used in: Lcom/leanplum/messagetemplates/MessageTemplates;->register(Landroid/content/Context;)V
'http://www.ofo.com' used in: Lcom/ofo/a/b;->a(Landroid/content/Context;)Z
'https://.facebook.com' used in: Lcom/facebook/internal/ab;->b(Landroid/content/Context;)V
'https://203.107.1.1/144428/d?host=' used in: Lcom/growingio/android/sdk/utils/DNSService$HttpDNSTask;->a()Lcom/growingio/android/sdk/utils/DNSService$HostInformation;
'https://api%s.growingio.com/custom' used in: Lcom/growingio/android/sdk/collection/NetworkConfig;->d()Ljava/lang/String;
'https://api%s.growingio.com/v2' used in: Lcom/growingio/android/sdk/collection/NetworkConfig;->c()Ljava/lang/String;
'https://api.appsflyer.com/install_data/v3/' used in: Lcom/appsflyer/e$d;->a()Ljava/lang/String;
'https://app-measurement.com/a' used in: Lcom/google/android/gms/measurement/internal/x;->()V
'https://assets.growingio.com' used in: Lcom/growingio/android/sdk/circle/h$1;->a(Ljava/io/File; Z)V
'https://assets.growingio.com/android/sdk/vds-plugin-v2.zip' used in: Lcom/growingio/android/sdk/circle/h$1;->a(Ljava/io/File; Z)V
'https://assets.growingio.com/sdk/hybrid/1.0/vds_hybrid.min.js?sdkVer=%s&platform=Android' used in: Lcom/growingio/android/sdk/collection/VdsJsHelper;->b()Ljava/lang/String;
'https://assets.growingio.com/sdk/hybrid/1.0/vds_hybrid_circle_plugin.min.js?sdkVer=%s&platform=Android' used in: Lcom/growingio/android/sdk/collection/VdsJsBridgeManager;->getCirclePluginSrc()Ljava/lang/String;
'https://crashapi%s.growingio.com/v2' used in: Lcom/growingio/android/sdk/collection/NetworkConfig;->e()Ljava/lang/String;
'https://events.appsflyer.com/api/v' used in: Lcom/appsflyer/e;->()V
'https://facebook.com' used in: Lcom/facebook/internal/ab;->b(Landroid/content/Context;)V
'https://facebook.com/device?user_code=%1$s&qr=1' used in: Lcom/facebook/login/DeviceAuthDialog$RequestState;->setUserCode(Ljava/lang/String;)V
'https://goo.gl/FZRIUV' used in: Lcom/google/android/gms/measurement/internal/m;->g(Ljava/lang/String;)Z
'https://graph-video.%s' used in: Lcom/facebook/internal/z;->c()Ljava/lang/String;
'https://graph.%s' used in: Lcom/facebook/internal/z;->b()Ljava/lang/String;
'https://mobilecrashreporting.googleapis.com/v1/crashes:batchCreate?key=' used in: Lcom/google/android/gms/internal/a;->()V
'https://pagead2.googlesyndication.com/pagead/gen_204?id=gmob-apps' used in: Lcom/google/android/gms/a/a/a;->a(Lcom/google/android/gms/a/a/a$a; Z Ljava/lang/Throwable;)Landroid/net/Uri;
'https://plus.bluepay.asia/codepay/sdkInit' used in: Lasia/bluepay/paysdk/BluePayApi;->a(Lasia/bluepay/paysdk/b/o$b; Lasia/bluepay/paysdk/b/o$a;)V
'https://register.appsflyer.com/api/v' used in: Lcom/appsflyer/e;->()V
'https://s.tb.cn' used in: Lcom/taobao/ma/a/a/a;->()V
'https://stats.appsflyer.com/stats' used in: Lcom/appsflyer/e;->f(Landroid/content/Context;)V
'https://t%s.growingio.com/app' used in: Lcom/growingio/android/sdk/collection/NetworkConfig;->h()Ljava/lang/String;
'https://t.appsflyer.com/api/v' used in: Lcom/appsflyer/e;->()V
'https://tags%s.growingio.com' used in: Lcom/growingio/android/sdk/collection/NetworkConfig;->f()Ljava/lang/String;
'https://www.growingio.com' used in: Lcom/growingio/android/sdk/collection/NetworkConfig;->i()Ljava/lang/String;
'https://www.growingio.com/apps/%s/circle/embedded' used in: Lcom/growingio/android/sdk/circle/HybridEventEditDialog;->a(Landroid/content/Context;)V
'javascript:(function () { ' used in: Lcom/ofo/ofopay/views/WebViewContainer;->callJsApi(Ljava/lang/String; [Ljava/lang/Object;)V
"javascript:(function() { var parent =document.getElementsByTagName('head').item(0);var script =document.createElement('script');script.type ='text/javascript';script.innerHTML = window.atob('" used in: Lcom/networkbench/agent/impl/instrumentation/NBSWebViewClient;->onPageFinished(Landroid/webkit/WebView; Ljava/lang/String;)V
"javascript:(function() {var parent = document.getElementsByTagName('head').item(0);var script = document.createElement('script');script.type = 'text/javascript';script.innerHTML = window.atob('dmFyIE1pbnQgPSBmdW5jdGlvbiAod2luZG93KSB7CgogICAgdmFyIF94aHIgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3Q7CiAgICB2YXIgZG9jID0gZG9jdW1lbnQ7CiAgICB2YXIgRVQgPSB3aW5kb3cuRXZlbnRUYXJnZXQ7CiAgICB2YXIgRk9MTE9XX1VQID0gMDsKICAgIHZhciBVUkxfUkVHID0gbmV3IFJlZ0V4cCgnKFthLXpdKzovezIsM30uKik6KFxcZCspOihcXGQrKScpOwogICAgdmFyIGVuY29kZVVSSUNvbXBvbmVudCA9IHdpbmRvdy5lbmNvZGVVUklDb21wb25lbnQ7Ly/ovazkuYnpmaTkuoblrZfmr43jgIHmlbDlrZfjgIEo44CBKeOAgS7jgIEh44CBfuOAgSrjgIEn44CBLeWSjF/kuYvlpJbnmoTmiYDmnInlrZfnrKYKICAgIHZhciBjdXJyZW50RXhlY3V0aW5nTW9kdWxlTmFtZTsKICAgIHZhciBQRl9TVEFSVCA9IG51bGw7CgogICAgbXlGbGFnID0gMDsKCiAgICB2YXIgbG9nRmxhZyA9IHRydWU7CgogICAgdmFyIHR5X3J1bSA9IHdpbmRvdy5fdHlfcnVtID0gewogICAgICAgIC8vc3RhcnRfdGltZQogICAgICAgIHN0OiBub3coKSwKICAgICAgICAvL3JjX2FycmF5CiAgICAgICAgcmE6IFtdLAogICAgICAgIC8vY3Jvc3NfcmNfYXJyYXkKICAgICAgICBjX3JhOiBbXSwKICAgICAgICAvL2FqYXhfYXJyYXkKICAgICAgICBhYTogW10KICAgIH07CgogICAgdmFyIHRyaW0gPSBTdHJpbmcucHJvdG90eXBlLnRyaW07CiAgICBpZiAoIVN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCkgewogICAgICAgIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIChzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKSB7CiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gfHwgMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhPZihzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKSA9PT0gcG9zaXRpb247CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUpIHsKICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICAgICAgICBjYXNlICdvYmplY3QnOgogICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuICdudWxsJzsKCiAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnWyc7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKChpID4gMCkgPyAnLCcgOiAnJykgKyBzdHJpbmdpZnkodmFsdWVbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ10nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICd7JzsKICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWVba2V5XSA9PT0gJ2Z1bmN0aW9uJykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHN0cmluZ2lmeSh2YWx1ZVtrZXldKTsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKChpID4gMCkgPyAnLCcgOiAnJykgKyBzdHJpbmdpZnkoa2V5KSArICc6JyArIHZhbDsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ30nOwogICAgICAgICAgICBjYXNlICdzdHJpbmcnOgogICAgICAgICAgICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZS5yZXBsYWNlKC8oW1wiXFxdKS9nLCAnXFwkMScpLnJlcGxhY2UoL1xuL2csICdcXG4nKSArICdcIic7CiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnOwogICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5naWZ5KHZhbHVlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAvLyByZXR1cm4gJ1tmdW5jdGlvbl0nOwogICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuICdcInVuZGVmaW5lZFwiJzsKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGVuYyhkYXRhKSB7CiAgICAgICAgLy8gc2hvcnRlciBhZnRlciBjb21wcmVzc2VkIHRoaXMgd2F5LgogICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQgPyBlbmNvZGVVUklDb21wb25lbnQoZGF0YSkgOiBkYXRhOwogICAgfQoKICAgIHZhciBkb2NfY2FjaGUgPSAnJzsKCiAgICBmdW5jdGlvbiBub3coKSB7CiAgICAgICAgcmV0dXJuIERhdGUubm93ID8gRGF0ZS5ub3coKSA6IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICB9OwogICAgdmFyIHV0aWwgPSB7CiAgICAgICAgd3JhcDogZnVuY3Rpb24gKGZvcmNlLCBvYmosIG5hbWUsIHdwciwgb25hbWUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciByYXcgPSBvYmpbbmFtZV07CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGlmICghZm9yY2UpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXJhdyAmJiAhZm9yY2UpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKHJhdyAmJiByYXcuX3R5X3dyYXApIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIG9ialtuYW1lXSA9IHdwcihyYXcsIG9uYW1lKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDsKICAgICAgICAgICAgb2JqW25hbWVdLl90eV93cmFwID0gW3Jhd107CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCiAgICAgICAgdW53cmFwOiBmdW5jdGlvbiAob2JqLCBuYW1lKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgcmF3ID0gb2JqW25hbWVdLl90eV93cmFwOwogICAgICAgICAgICAgICAgaWYgKHJhdykgewogICAgICAgICAgICAgICAgICAgIG9ialtuYW1lXSA9IHJhd1swXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBlYWNoOiBmdW5jdGlvbiBlYWNoKGFyeSwgZnVuYykgewogICAgICAgICAgICBpZiAoYXJ5KSB7CiAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLy9zZXRFdmVudEhhbmRsZXIKICAgICAgICBzaDogZnVuY3Rpb24gKG9iaiwgZXZ0LCBoYW5kbGVyLCBmKSB7CiAgICAgICAgICAgIGlmIChvYmouYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5hZGRFdmVudExpc3RlbmVyKGV2dCwgaGFuZGxlciwgZik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqLmF0dGFjaEV2ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLmF0dGFjaEV2ZW50KCdvbicgKyBldnQsIGhhbmRsZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAogICAgICAgIGFyZ3M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHBhcmFtID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJhbS5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwogICAgICAgIH0sCiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnksCiAgICAgICAgcGFyc2VKU09OOiBmdW5jdGlvbiAoanNvblN0cikgewogICAgICAgICAgICBpZiAoanNvblN0ciAmJiB0eXBlb2YganNvblN0ciA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHZhciBqc29uID0gd2luZG93LkpTT04gPyB3aW5kb3cuSlNPTi5wYXJzZSA6IGZ1bmN0aW9uIChhcmcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBGdW5jdGlvbigicmV0dXJuICIgKyBhcmcpKSgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBqc29uKGpzb25TdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCiAgICAgICAgdHJpbTogdHJpbSA/CiAgICAgICAgICAgIGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dCA9PSBudWxsID8KICAgICAgICAgICAgICAgICAgICAiIiA6CiAgICAgICAgICAgICAgICAgICAgdHJpbS5jYWxsKHRleHQpOwogICAgICAgICAgICB9IDogZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQgPT0gbnVsbCA/CiAgICAgICAgICAgICAgICAiIiA6CiAgICAgICAgICAgICAgICB0ZXh0LnRvU3RyaW5nKCkucmVwbGFjZSgvXlxzKy8sICIiKS5yZXBsYWNlKC9ccyskLywgIiIpOwogICAgICAgIH0sCiAgICAgICAgYmluZDogZnVuY3Rpb24gKGZ1bmMsIGNvbnRleHQpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gd3JhcEVycm9yKGUsIG1vZHVsZU5hbWUpIHsKICAgICAgICBpZiAoZSAmJiBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgIGUubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlOwogICAgfTsKCiAgICBmdW5jdGlvbiBlbnZlbG9wQ2FsbGJhY2soY2FsbGJhY2ssIG1vZHVsZU5hbWUsIGRlZXApIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY3VycmVudEV4ZWN1dGluZ01vZHVsZU5hbWUgPSBtb2R1bGVOYW1lOwogICAgICAgICAgICAgICAgZGVlcCAmJiB3cmFwVGltZXIobW9kdWxlTmFtZSk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgZGVlcCAmJiB1bndyYXBUaW1lcigpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBkZWVwICYmIHVud3JhcFRpbWVyKCk7CiAgICAgICAgICAgICAgICB0aHJvdyB3cmFwRXJyb3IoZSwgbW9kdWxlTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHdyYXBUaW1lcihtb2R1bGVOYW1lKSB7CiAgICAgICAgLy9zZXRUaW1lb3V0OuWcqOaMh+WumueahOavq+enkuaVsOWQjuiwg+eUqOWHveaVsOaIluiuoeeul+ihqOi+vuW8jwogICAgICAgIC8vc2V0SW50ZXJ2YWw65oyJ54Wn5oyH5a6a55qE5ZGo5pyf77yI5Lul5q+r56eS6K6h77yJ5p2l6LCD55So5Ye95pWw5oiW6K6h566X6KGo6L6+5byP44CCLy/mtYvor5Xov4fnqIvkuK1zZXRJbnRlcnZhbOS4gOeCueS9nOeUqOmDveayoeaciQogICAgICAgIC8v5omA5Lul5Zyo5q2k5Y675o6JCiAgICAgICAgLy91dGlsLmVhY2goWydzZXRUaW1lb3V0JywgJ3NldEludGVydmFsJ10sIGZ1bmN0aW9uIChmdW5jKSB7CiAgICAgICAgdXRpbC5lYWNoKFsnc2V0VGltZW91dCddLCBmdW5jdGlvbiAoZnVuYykgewogICAgICAgICAgICB1dGlsLndyYXAodHJ1ZSwgd2luZG93LCBmdW5jLCBmdW5jdGlvbiAocHJlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gdXRpbC5hcmdzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICB2YXIgd3JhcDsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXAgPSBlbnZlbG9wQ2FsbGJhY2soY2FsbGJhY2ssIG1vZHVsZU5hbWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHdyYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSA9IHdyYXA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH07CgogICAgZnVuY3Rpb24gdW53cmFwVGltZXIoKSB7CiAgICAgICAgLy/lnKjmraToiI3lvINzZXRJbnRlcnZhbAogICAgICAgIHV0aWwuZWFjaChbJ3NldFRpbWVvdXQnXSwgZnVuY3Rpb24gKGZ1bmMpIHsKICAgICAgICAgICAgdXRpbC51bndyYXAod2luZG93LCBmdW5jKTsKICAgICAgICB9KTsKICAgIH07CgogICAgdmFyIHBlcmZvcm1hbmNlID0gd2luZG93LnBlcmZvcm1hbmNlID8gd2luZG93LnBlcmZvcm1hbmNlIDogd2luZG93LlBlcmZvcm1hbmNlOwoKICAgIGlmIChwZXJmb3JtYW5jZSkgewogICAgICAgIHV0aWwuc2gocGVyZm9ybWFuY2UsICdyZXNvdXJjZXRpbWluZ2J1ZmZlcmZ1bGwnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCJjbGVhciByZXNvdXJjZSB0aW1pbmdzIik7CiAgICAgICAgICAgIG1ldHJpYy5zZW5kKCk7CiAgICAgICAgICAgIHZhciByY3MgPSBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlKCJyZXNvdXJjZSIpOwogICAgICAgICAgICBpZiAoIXJjcykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5X3J1bS5yYSA9IHR5X3J1bS5yYS5jb25jYXQocmNzKTsKICAgICAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJSZXNvdXJjZVRpbWluZ3MoKTsKICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgdXRpbC5zaChwZXJmb3JtYW5jZSwgJ3dlYmtpdHJlc291cmNldGltaW5nYnVmZmVyZnVsbCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbmJzSnNCcmlkZ2UubG9nRGVidWcoIndlYmtpdCBjbGVhciByZXNvdXJjZSB0aW1pbmdzIik7CiAgICAgICAgICAgIG1ldHJpYy5zZW5kKCk7CiAgICAgICAgICAgIHZhciByY3MgPSBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlKCJyZXNvdXJjZSIpOwogICAgICAgICAgICBpZiAoIXJjcykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5X3J1bS5yYSA9IHR5X3J1bS5yYS5jb25jYXQocmNzKTsKICAgICAgICAgICAgcGVyZm9ybWFuY2Uud2Via2l0Q2xlYXJSZXNvdXJjZVRpbWluZ3MoKTsKICAgICAgICB9LCBmYWxzZSk7CiAgICB9CgogICAgdmFyIG1ldHJpYyA9IHR5X3J1bS5tZXRyaWMgPSB7CiAgICAgICAgcmVhZHk6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHR5X3J1bS5sb2FkX3RpbWU7CiAgICAgICAgfSwKICAgICAgICBpbml0ZW5kOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghdHlfcnVtLmVuZF90aW1lKSB7CiAgICAgICAgICAgICAgICB0eV9ydW0uZW5kX3RpbWUgPSBub3coKTsKCiAgICAgICAgICAgICAgICAvL+ayoeacieeUqCzov5vooYzkuoboiI3lvIMKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIG9uX3RpbWUoKSB7CiAgICAgICAgICAgICAgICAvLyAgICAgLy9tZXRyaWMuc2EoKTsKICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyB0aGlzLl9oID0gc2V0SW50ZXJ2YWwob25fdGltZSwgMjAwMCk7CiAgICAgICAgICAgICAgICBuYnNKc0JyaWRnZS5sb2dEZWJ1Zygnb25faW5pdGVuZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBzZW5kOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCdjYWxsIHNlbmQnKTsKCiAgICAgICAgICAgIC8qICAgICAgICAgICAgaWYgKCF0aGlzLnJlYWR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0qLwogICAgICAgICAgICB2YXIgcyA9IHR5X3J1bS5zdDsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldF9tZXRyaWMoKSB7CiAgICAgICAgICAgICAgICBuYnNKc0JyaWRnZS5sb2dEZWJ1ZygiZ2V0IG1ldHJpYyIpOwogICAgICAgICAgICAgICAgdmFyIHIgPSB7fTsKICAgICAgICAgICAgICAgIGlmIChwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZS50aW1pbmcpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHBlcmZvcm1hbmNlLnRpbWluZzsKICAgICAgICAgICAgICAgICAgICBzID0gdC5uYXZpZ2F0aW9uU3RhcnQ7CgogICAgICAgICAgICAgICAgICAgIC8v5LiL6Z2i55qE6L+Z5Lqb5YC86YO95piv5YeP5Y67bmF0aXZlc3RhcnTkuYvlkI7nmoTlgLwuCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdihuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodFtuXSA+IDApID8gdFtuXSAtIHMgOiAwOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIGRzID0gdigiZG9tYWluTG9va3VwU3RhcnQiKSwvL+i/lOWbnuWfn+WQjeafpeivouW8gOWni+aXtueahFVuaXjmr6vnp5Lml7bpl7TmiLPjgILlpoLmnpzkvb/nlKjmjIHkuYXov57mjqXvvIzmiJbogIXkv6Hmga/mmK/ku47mnKzlnLDnvJPlrZjojrflj5bnmoTvvIzliJnov5Tlm57lgLznrYnlkIzkuo5mZXRjaFN0YXJ05bGe5oCn55qE5YC844CCCiAgICAgICAgICAgICAgICAgICAgICAgIGRlID0gdigiZG9tYWluTG9va3VwRW5kIiksLy/ov5Tlm57ln5/lkI3mn6Xor6Lnu5PmnZ/ml7bnmoRVbml45q+r56eS5pe26Ze05oiz44CC5aaC5p6c5L2/55So5oyB5LmF6L+e5o6l77yM5oiW6ICF5L+h5oGv5piv5LuO5pys5Zyw57yT5a2Y6I635Y+W55qE77yM5YiZ6L+U5Zue5YC8562J5ZCM5LqOZmV0Y2hTdGFydOWxnuaAp+eahOWAvOOAggoKICAgICAgICAgICAgICAgICAgICAvL+i/lOWbnuesrOS4gOS4qkhUVFDot7PovazlvIDlp4vml7bnmoRVbml45q+r56eS5pe26Ze05oiz44CC5aaC5p6c5rKh5pyJ6Lez6L2s77yM5oiW6ICF5LiN5piv5ZCM5LiA5Liq5Z+f5ZCN5YaF6YOo55qE6Lez6L2s77yM5YiZ6L+U5Zue5YC85Li6MOOAggogICAgICAgICAgICAgICAgICAgICAgICBlcyA9IHYoInJlZGlyZWN0U3RhcnQiKSwKICAgICAgICAgICAgICAgICAgICAvL+i/lOWbnuacgOWQjuS4gOS4qkhUVFDot7Povaznu5PmnZ/ml7bvvIjljbPot7Povazlm57lupTnmoTmnIDlkI7kuIDkuKrlrZfoioLmjqXlj5flrozmiJDml7bvvInnmoRVbml45q+r56eS5pe26Ze05oiz44CC5aaC5p6c5rKh5pyJ6Lez6L2s77yM5oiW6ICF5LiN5piv5ZCM5LiA5Liq5Z+f5ZCN5YaF6YOo55qE6Lez6L2s77yM5YiZ6L+U5Zue5YC85Li6MOOAggogICAgICAgICAgICAgICAgICAgICAgICBlZSA9IHYoInJlZGlyZWN0RW5kIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGNzID0gdigiY29ubmVjdFN0YXJ0IiksLy/ov5Tlm55IVFRQ6K+35rGC5byA5aeL5ZCR5pyN5Yqh5Zmo5Y+R6YCB5pe255qEVW5peOavq+enkuaXtumXtOaIs+OAguWmguaenOS9v+eUqOaMgeS5hei/nuaOpe+8iHBlcnNpc3RlbnQgY29ubmVjdGlvbu+8ie+8jOWImei/lOWbnuWAvOetieWQjOS6jmZldGNoU3RhcnTlsZ7mgKfnmoTlgLzjgIIKICAgICAgICAgICAgICAgICAgICAgICAgY2UgPSB2KCJjb25uZWN0RW5kIik7Ly/ov5Tlm57mtY/op4jlmajkuI7mnI3liqHlmajkuYvpl7TnmoTov57mjqXlu7rnq4vml7bnmoRVbml45q+r56eS5pe26Ze05oiz44CC5aaC5p6c5bu656uL55qE5piv5oyB5LmF6L+e5o6l77yM5YiZ6L+U5Zue5YC8562J5ZCM5LqOZmV0Y2hTdGFydOWxnuaAp+eahOWAvOOAgui/nuaOpeW7uueri+aMh+eahOaYr+aJgOacieaPoeaJi+WSjOiupOivgei/h+eoi+WFqOmDqOe7k+adn+OAggoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVxdWVzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgICAgIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5b2T5YmN5rWP6KeI5Zmo56qX5Y+j55qE5YmN5LiA5Liq572R6aG15YWz6Zet77yM5Y+R55SfdW5sb2Fk5LqL5Lu25pe255qEVW5peOavq+enkuaXtumXtOaIs+OAguWmguaenOayoeacieWJjeS4gOS4que9kemhte+8jOWImeetieS6jmZldGNoU3RhcnTlsZ7mgKfjgIIKICAgICAgICAgICAgICAgICAgICAgICAgbnM6IHYoIm5hdmlnYXRpb25TdGFydCIpLAoKICAgICAgICAgICAgICAgICAgICAgICAgdWw6IHJlcXVlc3RVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgIC8v6L+U5Zue5rWP6KeI5Zmo5YeG5aSH5L2/55SoSFRUUOivt+axguivu+WPluaWh+aho+aXtueahFVuaXjmr6vnp5Lml7bpl7TmiLPjgILor6Xkuovku7blnKjnvZHpobXmn6Xor6LmnKzlnLDnvJPlrZjkuYvliY3lj5HnlJ/jgIIKICAgICAgICAgICAgICAgICAgICAgICAgZjogdigiZmV0Y2hTdGFydCIpLAogICAgICAgICAgICAgICAgICAgICAgICBxczogdigicmVxdWVzdFN0YXJ0IiksLy/ov5Tlm57mtY/op4jlmajlkJHmnI3liqHlmajlj5Hlh7pIVFRQ6K+35rGC5pe277yI5oiW5byA5aeL6K+75Y+W5pys5Zyw57yT5a2Y5pe277yJ55qEVW5peOavq+enkuaXtumXtOaIs+OAggogICAgICAgICAgICAgICAgICAgICAgICByczogdigicmVzcG9uc2VTdGFydCIpLC8v6L+U5Zue5rWP6KeI5Zmo5LuO5pyN5Yqh5Zmo5pS25Yiw77yI5oiW5LuO5pys5Zyw57yT5a2Y6K+75Y+W77yJ56ys5LiA5Liq5a2X6IqC5pe255qEVW5peOavq+enkuaXtumXtOaIs+OAggogICAgICAgICAgICAgICAgICAgICAgICByZTogdigicmVzcG9uc2VFbmQiKSwvL+i/lOWbnua1j+iniOWZqOS7juacjeWKoeWZqOaUtuWIsO+8iOaIluS7juacrOWcsOe8k+WtmOivu+WPlu+8ieacgOWQjuS4gOS4quWtl+iKguaXtu+8iOWmguaenOWcqOatpOS5i+WJjUhUVFDov57mjqXlt7Lnu4/lhbPpl63vvIzliJnov5Tlm57lhbPpl63ml7bvvInnmoRVbml45q+r56eS5pe26Ze05oiz44CCCgogICAgICAgICAgICAgICAgICAgICAgICAvL+WmguaenOWJjeS4gOS4que9kemhteS4juW9k+WJjee9kemhteWxnuS6juWQjOS4gOS4quWfn+WQje+8jOWImei/lOWbnuWJjeS4gOS4que9kemhteeahHVubG9hZOS6i+S7tuWPkeeUn+aXtueahFVuaXjmr6vnp5Lml7bpl7TmiLPjgIIKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5rKh5pyJ5YmN5LiA5Liq572R6aG177yM5oiW6ICF5LmL5YmN55qE572R6aG16Lez6L2s5LiN5piv5Zyo5ZCM5LiA5Liq5Z+f5ZCN5YaF77yM5YiZ6L+U5Zue5YC85Li6MOOAggogICAgICAgICAgICAgICAgICAgICAgICB1bHM6IHYoInVubG9hZEV2ZW50U3RhcnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgdWxlOiB2KCJ1bmxvYWRFdmVudEVuZCIpLAoKICAgICAgICAgICAgICAgICAgICAgICAgLy/moIforrAgRE9NIOWHhuWkh+Wwsee7quW5tuS4lOayoeacieagt+W8j+ihqOmYu+eijSBKYXZhU2NyaXB0IOaJp+ihjOeahOaXtumXtOeCuSAtIOaEj+WRs+edgOaIkeS7rOWPr+S7peW8gOWni+aehOW7uuWRiOeOsOagkeS6huOAggogICAgICAgICAgICAgICAgICAgICAgICAvL+W+iOWkmiBKYXZhU2NyaXB0IOahhuaetuetieW+heatpOS6i+S7tuWPkeeUn+WQju+8jOaJjeW8gOWni+aJp+ihjOWug+S7rOiHquW3seeahOmAu+i+keOAguWboOatpO+8jAogICAgICAgICAgICAgICAgICAgICAgICAvLyDmtY/op4jlmajkvJrpgJrov4fmjZXojrcgRXZlbnRTdGFydCDlkowgRXZlbnRFbmQg5pe26Ze05oiz77yM6Lef6Liq5omn6KGM6YC76L6R5omA6ZyA55qE5pe26Ze044CCCiAgICAgICAgICAgICAgICAgICAgICAgIG9zOiB2KCJkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCIpLAogICAgICAgICAgICAgICAgICAgICAgICBvZTogdigiZG9tQ29udGVudExvYWRlZEV2ZW50RW5kIiksCiAgICAgICAgICAgICAgICAgICAgICAgIG9pOiB2KCJkb21JbnRlcmFjdGl2ZSIpLC8v5qCH6K6w5rWP6KeI5Zmo5a6M5oiQ6Kej5p6Q5bm25LiU5omA5pyJIEhUTUwg5ZKMIERPTSDmnoTlu7rlrozmr5XnmoTml7bpl7TngrkKICAgICAgICAgICAgICAgICAgICAgICAgb2M6IHYoImRvbUNvbXBsZXRlIiksIC8v5omA5pyJ55qE5aSE55CG5a6M5oiQ77yM572R6aG15LiK5omA5pyJ6LWE5rqQ77yI5Zu+54mH562J77yJIOS4i+i9veWujOaIkCAtIOWNs+WKoOi9veaXi+i9rOWbvuagh+WBnOatouaXi+i9rOOAggogICAgICAgICAgICAgICAgICAgICAgICBsczogdigibG9hZEV2ZW50U3RhcnQiKSwvL+S9nOS4uuavj+S4que9kemhteWKoOi9veeahOacgOWQjuS4gOatpe+8jOa1j+iniOWZqOS8muinpuWPkW9uTG9hZOS6i+S7tu+8jOS7peS+v+inpuWPkemZhOWKoOeahOW6lOeUqOmAu+i+keOAgui/meS4quaYr+W8gOWni+aXtumXtC4KICAgICAgICAgICAgICAgICAgICAgICAgbGU6IHYoImxvYWRFdmVudEVuZCIpLC8v6L+Z5Liq5piv57uT5p2f5pe26Ze0LgogICAgICAgICAgICAgICAgICAgICAgICBkb21sOiB2KCJkb21Mb2FkaW5nIiksLy/ov5nmmK/mlbTkuKrov4fnqIvlvIDlp4vnmoTml7bpl7TmiLPvvIzmtY/op4jlmajlvIDlp4vop6PmnpAgSFRNTCDmlofmoaPnrKzkuIDmibnmlLbliLDnmoTlrZfoioIgZG9jdW1lbnQuCgogICAgICAgICAgICAgICAgICAgICAgICB0cDogcGVyZm9ybWFuY2UubmF2aWdhdGlvbi50eXBlLC8v6K+l5bGe5oCn6L+U5Zue5LiA5Liq5pW05pWw5YC877yM6KGo56S6572R6aG155qE5Yqg6L295p2l5rqQCiAgICAgICAgICAgICAgICAgICAgICAgIHJkYzogcGVyZm9ybWFuY2UubmF2aWdhdGlvbi5yZWRpcmVjdENvdW50LC8v6K+l5bGe5oCn6KGo56S65b2T5YmN572R6aG157uP6L+H5LqG5aSa5bCR5qyh6YeN5a6a5ZCR6Lez6L2s44CCCiAgICAgICAgICAgICAgICAgICAgICAgIGNzOjAsLy/liqDkuIrkuIvpnaLov5nlh6DpobnkuLvopoHmmK/kuLrkuobnoa7kv51qYXZh6YOo5YiG6L+Z5LqbanNvbuaVsOaNruS4jeS4uuepui4KICAgICAgICAgICAgICAgICAgICAgICAgY2U6MCwKICAgICAgICAgICAgICAgICAgICAgICAgZHM6MCwKICAgICAgICAgICAgICAgICAgICAgICAgZGU6MCwKICAgICAgICAgICAgICAgICAgICAgICAgc2w6MAogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8v5pyJ5pe25YCZci5m55qE5YC85bCP5LqOMCzov5nkuKrlnKjlkK/liqhhcHDnmoTnrKzkuozmrKHkuYvlkI7kvJrlh7rnjrAsCiAgICAgICAgICAgICAgICAgICAgLy8g5piv55Sx5LqOZmV0Y2hTdGFydCA8IG5hdmlnYXRpb25TdGFydOWvvOiHtOeahCzlnKjov5nph4zlgZrkuIDkuKrliKTmlq0KICAgICAgICAgICAgICAgICAgICByLmYgPSByLmYgPiAwID8gci5mIDogMDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNlIC0gY3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuY3MgPSBjczsKICAgICAgICAgICAgICAgICAgICAgICAgci5jZSA9IGNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZGUgLSBkcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgci5kcyA9IGRzOwogICAgICAgICAgICAgICAgICAgICAgICByLmRlID0gZGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChlZSAtIGVzID4gMCB8fCBlZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgci5lcyA9IGVzOwogICAgICAgICAgICAgICAgICAgICAgICByLmVlID0gZWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyLmxlID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgci51ZSA9IHR5X3J1bS5sb2FkX3RpbWUgLSBzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZnA7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQubXNGaXJzdFBhaW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCJnZXQgZmlyc3QgcGFpbnQgZnJvbSB0aW1pbmciKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnAgPSB0Lm1zRmlyc3RQYWludDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvd1snY2hyb21lJ10gJiYgY2hyb21lLmxvYWRUaW1lcykgewogICAgICAgICAgICAgICAgICAgICAgICBuYnNKc0JyaWRnZS5sb2dEZWJ1ZygiSXQncyBjaHJvbWUgZXhwbG9yZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtID0gY2hyb21lLmxvYWRUaW1lcygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG0gJiYgdG0uZmlyc3RQYWludFRpbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwID0gdG0uZmlyc3RQYWludFRpbWUgKiAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eV9ydW0uZmlyc3RQYWludCkgewogICAgICAgICAgICAgICAgICAgICAgICBuYnNKc0JyaWRnZS5sb2dEZWJ1ZygiZ2V0IGZpcnN0IHBhaW50IGZyb20gdHlfcnVtIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGZwID0gdHlfcnVtLmZpcnN0UGFpbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChmcCkgewogICAgICAgICAgICAgICAgICAgICAgICByLmZwID0gTWF0aC5yb3VuZChmcCAtIHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodC5zZWN1cmVDb25uZWN0aW9uU3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/ov5Tlm57mtY/op4jlmajkuI7mnI3liqHlmajlvIDlp4vlronlhajpk77mjqXnmoTmj6HmiYvml7bnmoRVbml45q+r56eS5pe26Ze05oiz44CC5aaC5p6c5b2T5YmN572R6aG15LiN6KaB5rGC5a6J5YWo6L+e5o6l77yM5YiZ6L+U5ZueMOOAggogICAgICAgICAgICAgICAgICAgICAgICByLnNsID0gdigic2VjdXJlQ29ubmVjdGlvblN0YXJ0Iik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByID0gewogICAgICAgICAgICAgICAgICAgICAgICB0OiBzLAogICAgICAgICAgICAgICAgICAgICAgICBvczogdHlfcnVtLmVuZF90aW1lIC0gcywKICAgICAgICAgICAgICAgICAgICAgICAgbHM6IHR5X3J1bS5sb2FkX3RpbWUgLSBzCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIuamUgPSBtZXRyaWMuZXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmIChtZXRyaWMuY3QpIHsKICAgICAgICAgICAgICAgICAgICByLmN0ID0gbWV0cmljLmN0IC0gczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtZXRyaWMudG91Y2gpIHsKICAgICAgICAgICAgICAgICAgICByLmZpID0gbWV0cmljLnRvdWNoIC0gczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBhZyA9IHR5X3J1bS5hZ2VudDsKICAgICAgICAgICAgICAgIGlmIChhZykgewogICAgICAgICAgICAgICAgICAgIHIuaWQgPSBlbmMoYWcuaWQpOwogICAgICAgICAgICAgICAgICAgIHIuYSA9IGFnLmE7CiAgICAgICAgICAgICAgICAgICAgci5xID0gYWcucTsKICAgICAgICAgICAgICAgICAgICByLnRpZCA9IGVuYyhhZy50aWQpOwogICAgICAgICAgICAgICAgICAgIHIubiA9IGVuYyhhZy5uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIuc2ggPSB3aW5kb3cuc2NyZWVuICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0OwogICAgICAgICAgICAgICAgci5zdyA9IHdpbmRvdy5zY3JlZW4gJiYgd2luZG93LnNjcmVlbi53aWR0aDsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBnZXRfcmNfYXJyYXkobG9hZFRpbWUpIHsKICAgICAgICAgICAgICAgIHZhciBwZiA9IHBlcmZvcm1hbmNlOwogICAgICAgICAgICAgICAgaWYgKHBmICYmIHBmLmdldEVudHJpZXNCeVR5cGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHR0OiBlbmMoZG9jLnRpdGxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldDogZG9jLmNoYXJhY3RlclNldAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIHJjID0gdHlfcnVtLnJhOwogICAgICAgICAgICAgICAgICAgIHZhciByY3MgPSBwZi5nZXRFbnRyaWVzQnlUeXBlKCJyZXNvdXJjZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChyY3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSByYy5jb25jYXQocmNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBmLndlYmtpdENsZWFyUmVzb3VyY2VUaW1pbmdzKSBwZi53ZWJraXRDbGVhclJlc291cmNlVGltaW5ncygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGYuY2xlYXJSZXNvdXJjZVRpbWluZ3MpIHBmLmNsZWFyUmVzb3VyY2VUaW1pbmdzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHIucmVzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHJjW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdihuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRbbl0gPiAwKSA/IHRbbl0gOiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG86IHYoInN0YXJ0VGltZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQ6IHQuaW5pdGlhdG9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG46IHQubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0OiB0LmVudHJ5VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyOiB2KCJkdXJhdGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZjogdigiZmV0Y2hTdGFydCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHM6IHYoImRvbWFpbkxvb2t1cFN0YXJ0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZTogdigiZG9tYWluTG9va3VwRW5kIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczogdigiY29ubmVjdFN0YXJ0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZTogdigiY29ubmVjdEVuZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2w6IHYoInNlY3VyZUNvbm5lY3Rpb25TdGFydCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXM6IHYoInJlcXVlc3RTdGFydCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnM6IHYoInJlc3BvbnNlU3RhcnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlOiB2KCJyZXNwb25zZUVuZCIpLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJkczogdigicmVkaXJlY3RTdGFydCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmRlOiB2KCJyZWRpcmVjdEVuZCIpLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByLnJlcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobWV0cmljLmVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgci5lcnIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGUgPSBtZXRyaWMuZXJyb3JzLCBfbGVuZ3RoID0gZS5sZW5ndGg7IGkgPCBfbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZXJyLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG86IE1hdGgucm91bmQoZVtpXVswXSAtIHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IGVbaV1bMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDogZVtpXVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBlW2ldWzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6IGVbaV1bNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWM6IF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczogZVtpXVs1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtOiBlW2ldWzZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwOiBlW2ldWzddCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgd2luZG93Ll90eV9ydW0ucmEgPSB3aW5kb3cuX3R5X3J1bS5yYS5jb25jYXQocmNzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmNfYXJyYXkgPSB7fTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCJ0cnkgdG8gZ2V0IG1ldHJpYyIpOwogICAgICAgICAgICAgICAgcGYgPSBnZXRfbWV0cmljKCk7CiAgICAgICAgICAgICAgICByY19hcnJheSA9IGdldF9yY19hcnJheSgocGYubHMgPiAwKSA/IHBmLmxzIDogdHlfcnVtLmxvYWRfdGltZSAtIHMpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBuYnNKc0JyaWRnZS5sb2dEZWJ1ZygiZXJyb3IgZm91bmQ6IiArIGUubWVzc2FnZSArICIsIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgOwogICAgICAgICAgICB2YXIgcmNfYXJyYXlfc3RyID0gcmNfYXJyYXkgPyB1dGlsLnN0cmluZ2lmeShyY19hcnJheSkgOiAnJzsKCiAgICAgICAgICAgIC8vIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCJuYXZpZ2F0ZSA9ICIgKyAocGYgPyB1dGlsLnN0cmluZ2lmeShwZikgOiAnJykpOwogICAgICAgICAgICAvLyBuYnNKc0JyaWRnZS5sb2dEZWJ1ZygicmVzb3VyZSAgPSAiICsgcmNfYXJyYXlfc3RyKTsKCgogICAgICAgICAgICAvL3VybOS4umh0dHDlvIDlpLTnmoTor50s6K+05piOdXJs5bey57uP6I635Y+WKGh0dHBz5Lmf5piv6L+Z5qC355qE5byA5aS0KQogICAgICAgICAgICBpZiAocGYub2MgPiAwICYmIHBmLnVsLnN0YXJ0c1dpdGgoImh0dHAiKSAmJiBteUZsYWcgPT09IDApIHsKICAgICAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0pzUmVzdWx0KCJjdXJyZW50X3BnX21ldHJpYyIsIHBmID8gdXRpbC5zdHJpbmdpZnkocGYpIDogJycpOwogICAgICAgICAgICAgICAgbXlGbGFnID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy/lpoLmnpzmnInotYTmupDnmoTor53lsLHmlL7liLDph4zpnaIKICAgICAgICAgICAgaWYgKHJjX2FycmF5LnJlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBuYnNKc0JyaWRnZS5sb2dKc1Jlc3VsdCgicmVzb3VyY2VfbWV0cmljIiwgcmNfYXJyYXlfc3RyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLy9zZW5kX2FqYXgKICAgICAgICBzYTogZnVuY3Rpb24gKGYpIHsKICAgICAgICAgICAgbmJzSnNCcmlkZ2UubG9nRGVidWcoInNlbmQgYWpheCIpOwogICAgICAgICAgICBpZiAoIXRoaXMucmVhZHkoKSAmJiAhZikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vL+iyjOS8vOi/meihjOeahGbkuZ/msqHmnInku4DkuYjkvZznlKgs6ICM5LiUdHlfcnVtLnNuZF9kdeWSjHR5X3J1bS5jY+S5n+WcqOaWh+S7tuS4reS4jeWtmOWcqCwKICAgICAgICAgICAgLy8v5Lya5Ye6546wanPnmoTplJnor68uCiAgICAgICAgICAgIC8vIGlmICghZikgewogICAgICAgICAgICAvLyAgICAgZiA9ICF0aGlzLl9sYXN0X3NlbmQgfHwgbm93KCkgLSB0aGlzLl9sYXN0X3NlbmQgPiB0eV9ydW0uc25kX2R1KCkgfHwgdHlfcnVtLmFhLmxlbmd0aCA+PSB0eV9ydW0uY2MoKTsKICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAvLyBpZiAodHlfcnVtLmFhLmxlbmd0aCA+IDAgJiYgZikgewogICAgICAgICAgICBpZih0eV9ydW0uYWEubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fbGFzdF9zZW5kID0gbm93KCk7CiAgICAgICAgICAgICAgICBhYV9hcnJheSA9IHV0aWwuc3RyaW5naWZ5KHR5X3J1bS5hYSk7CiAgICAgICAgICAgICAgICAvL25ic0pzQnJpZGdlLmxvZ0RlYnVnKCJhamF4IGRhdGEgPSAiICsgYWFfYXJyYXkpOwoKICAgICAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0pzUmVzdWx0KCJhamF4X21ldHJpYyIsIGFhX2FycmF5KTsKCiAgICAgICAgICAgICAgICAvL2FqYXhJdGVtID0gW3QubWV0aG9kLCB3aW5kb3cubG9jYXRpb24uaHJlZiwgdC51cmwsICh0LnMgPiAwKSA/ICh0LmVuZCAtIHQuc3RhcnQpIDogMCwKICAgICAgICAgICAgICAgIC8vY2JfdGltZSwgdC5zLCAodC5zID4gMCkgPyAwIDogZXJyLCB0LnJlcywgdC5yZXEsIHQuc3RhcnQsIHQuZW5kXTsKCiAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICB1dGlsLlBPU1QodXRpbC5ta3VybCh0eV9ydW0uc2VydmVyLmJlYWNvbiwgInhociIpLCB1dGlsLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgInhociI6IHR5X3J1bS5hYQogICAgICAgICAgICAgICAgIH0pLCB7fSwgaGFuZGxlX3JlcygnUE9TVCcpKTsKICAgICAgICAgICAgICAgICB0eV9ydW0uYWEgPSBbXTsqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZXJyb3JzOiBbXSAvKuWtmOaUvumUmeivr+S/oeaBryovCiAgICB9OwoKICAgIC8vIGZ1bmN0aW9uIHNlbmRFcnJvcigpIHsKICAgIC8vICAgICBuYnNKc0JyaWRnZS5sb2dEZWJ1Zygic2VuZEVycm9yIik7CiAgICAvLyAgICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCkgewogICAgLy8gICAgICAgICB2YXIgZXJyb3JzID0gZnVuY3Rpb24gKGVycm9ycykgewogICAgLy8gICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgLy8gICAgICAgICAgICAgdmFyIGR1cGxpY2F0aW9uID0ge307CiAgICAvLyAgICAgICAgICAgICB1dGlsLmVhY2goZXJyb3JzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAvLyAgICAgICAgICAgICAgICAgdmFyIGVycm9yS2V5ID0gZXJyb3JJZChlcnJbMV0sIGVyclsyXSwgZXJyWzNdLCBlcnJbNl0pOwogICAgLy8gICAgICAgICAgICAgICAgIGlmICghZHVwbGljYXRpb25bZXJyb3JLZXldKSB7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0aW9uW2Vycm9yS2V5XSA9IFtlcnJbMV0sIGVyclsyXSwgZXJyWzNdLCAoKGVycls0XSA9PSAnIycpID8gZG9jLlVSTCA6IGVycls0XSksIDEsIGVycls1XSwgZXJyWzZdLCBlcnJbN11dOwogICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0aW9uW2Vycm9yS2V5XVs0XSArPSAxOwogICAgLy8gICAgICAgICAgICAgICAgIH0KICAgIC8vICAgICAgICAgICAgIH0pOwogICAgLy8gICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGR1cGxpY2F0aW9uKSB7CiAgICAvLyAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZHVwbGljYXRpb25ba2V5XSk7CiAgICAvLyAgICAgICAgICAgICB9CiAgICAvLyAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgLy8gICAgICAgICB9KHRoaXMuZXJyb3JzKTsKICAgIC8vICAgICB9CiAgICAvLyB9CgogICAgZnVuY3Rpb24gb25XaW5kb3dMb2FkKGEpIHsKICAgICAgICAvL2FWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KGEpOwogICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCdlbnRlciBvbiBXaW5kb3cgbG9hZCwgYTonICsgYS50eXBlKTsKICAgICAgICBtZXRyaWMuaW5pdGVuZCgpOwogICAgICAgIHR5X3J1bS5sb2FkX3RpbWUgPSBub3coKTsKCiAgICAgICAgZnVuY3Rpb24gY2IoKSB7CiAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCdzZXRUaW1lb3V0IGNiISAxMDAwJyk7CiAgICAgICAgICAgIG1ldHJpYy5zZW5kKCk7CiAgICAgICAgfTsKICAgICAgICBpZiAoYSA9PT0gOSkgewogICAgICAgICAgICBjYigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8v5LiN5pivOeeahOaXtuWAmeivtOaYjuaYr2xvYWTkuovku7YuCiAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCdzZXRUaW1lb3V0IGNiIScpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGNiLCAwKTsvL+ihqOekuueri+WIu+iwg+eUqGNi5Ye95pWwCiAgICAgICAgfQogICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCdsZWF2ZSBvbiBXaW5kb3cgbG9hZCcpOwogICAgfTsKCiAgICB2YXIgdWwgPSBudWxsOwoKICAgIGZ1bmN0aW9uIG9uV2luZG93VW5sb2FkKCkgewogICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCdlbnRlciBvbiBXaW5kb3cgdW5sb2FkOicgKyBldmVudC50eXBlKTsKICAgICAgICBpZiAoIXVsKSB7CiAgICAgICAgICAgIG9uV2luZG93TG9hZCg5KTsKICAgICAgICB9CiAgICAgICAgLy/nlLHkuo5icm93c2Xkuqflk4HlkoxhcHDnmoTkuqflk4HkuI3kuIDmoLcs5LiL6Z2i5pyJ5LiA5Liqb0Vycm9yRXZlbnTlnKjpgqPph4zkuIrkvKBlcnJvcuS5n+aYr+S4gOagt+eahAogICAgICAgIC8vb25XaW5kb3dVbmxvYWTmmK/lnKjkuIvkuKrpobXpnaLmiZPlvIDkuYvliY3miafooYwuCiAgICAgICAgLy91dGlsLmJpbmQoc2VuZEVycm9yLCBtZXRyaWMpKCk7CiAgICAgICAgdWwgPSAxOwogICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCdsZWF2ZSBvbiBXaW5kb3cgdW5sb2FkJyk7CiAgICB9CgogICAgZnVuY3Rpb24gZml4SW5mbyhwKSB7CiAgICAgICAgLy8gb25seSBmaXggc3RhY2sgaW5mbyB3aGVuIHRoZXJlIGlzIGEgbW9kdWxlIG5hbWUuCiAgICAgICAgaWYgKHBbNl0pIHsKICAgICAgICAgICAgdmFyIGZpbGVuYW1lID0gcFs0XTsKICAgICAgICAgICAgdmFyIHN0YWNrID0gcFs1XTsKICAgICAgICAgICAgaWYgKHN0YWNrICYmIHR5cGVvZiBzdGFjayA9PT0gJ3N0cmluZycgJiYgZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc3BsaXQoL1xuLyk7CiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVVJMX1JFRy5leGVjKHN0YWNrWzBdKTsKICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVVJMX1JFRy5leGVjKHN0YWNrWzFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0WzFdICE9IGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgcFs0XSA9IHJlc3VsdFsxXSB8fCBmaWxlbmFtZTsKICAgICAgICAgICAgICAgICAgICBwWzJdID0gcmVzdWx0WzJdIHx8IHBbMl07CiAgICAgICAgICAgICAgICAgICAgcFszXSA9IHJlc3VsdFszXSB8fCBwWzNdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGVycm9ySWQobXNnLCBsaW5lbm8sIGNvbG5vLCBtb2R1bGUpIHsKICAgICAgICByZXR1cm4gbXNnICsgbGluZW5vICsgY29sbm8gKyAobW9kdWxlID8gbW9kdWxlIDogJycpOwogICAgfQoKICAgIHZhciBlcnJvclR5cGVDYWNoZSA9IHt9OwoKICAgIGZ1bmN0aW9uIG9uRXJyb3JFdmVudChvYmopIHsKCiAgICAgICAgbmJzSnNCcmlkZ2UubG9nRGVidWcoIm9uRXJyb3JFdmVudCIpOwoKICAgICAgICB2YXIgYSA9IGFyZ3VtZW50cywKICAgICAgICAgICAgdWQgPSAidW5rbm93biIsCiAgICAgICAgICAgIHAgPSBbbm93KCldOwogICAgICAgIGlmIChhLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHZhciBsID0gKGEubGVuZ3RoIDwgNCkgPyBhLmxlbmd0aCA6IDQ7CiAgICAgICAgICAgIHBbMV0gPSBhWzBdOwogICAgICAgICAgICBpZiAobCA+IDIpIHsKICAgICAgICAgICAgICAgIHBbMl0gPSBhWzJdOwogICAgICAgICAgICAgICAgcFszXSA9IDA7CiAgICAgICAgICAgICAgICBwWzRdID0gYVsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobCA+IDMgJiYgYVszXSkgewogICAgICAgICAgICAgICAgcFszXSA9IGFbM107CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEV2ZW50IHx8ICh3aW5kb3cuRXJyb3JFdmVudCAmJiBvYmogaW5zdGFuY2VvZiBFcnJvckV2ZW50KSkgewogICAgICAgICAgICBwWzFdID0gb2JqLm1lc3NhZ2UgfHwgKChvYmouZXJyb3IgJiYgb2JqLmVycm9yWyJjb25zdHJ1Y3RvciJdLm5hbWUpICsgKG9iai5lcnJvciAmJiBvYmouZXJyb3IubWVzc2FnZSkpIHx8ICIiOwogICAgICAgICAgICBwWzJdID0gb2JqLmxpbmVubyA/IG9iai5saW5lbm8gOiAwOwogICAgICAgICAgICBwWzNdID0gb2JqLmNvbG5vID8gb2JqLmNvbG5vIDogMDsKICAgICAgICAgICAgcFs0XSA9IG9iai5maWxlbmFtZSB8fCAob2JqLmVycm9yICYmIG9iai5lcnJvci5maWxlTmFtZSkgfHwgKG9iai50YXJnZXQgJiYgb2JqLnRhcmdldC5iYXNlVVJJKSB8fCAiIjsKICAgICAgICAgICAgaWYgKHBbNF0gPT0gZG9jLlVSTCkgewogICAgICAgICAgICAgICAgLy9wWzRdID0gJyMnOy8v5Li65LuA5LmI6KaB6K6+572u5oiQ6L+Z5qC35ZGiP+W6lOivpeS4jeeUqCzov5nmoLforr7nva7nmoTnm67nmoTmmK/kuLrkuobooajnpLrmmK/lvZPliY3nmoR1cmzkuYg/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9iai5lcnJvcikgewogICAgICAgICAgICAgICAgcFs1XSA9IG9iai5lcnJvci5zdGFjazsKICAgICAgICAgICAgICAgIHBbNl0gPSBvYmouZXJyb3IubW9kdWxlTmFtZTsKICAgICAgICAgICAgICAgIHZhciBlcnJvcktleSA9IGVycm9ySWQocFsxXSwgcFsyXSwgcFszXSwgcFs2XSk7CiAgICAgICAgICAgICAgICBwWzddID0gZXJyb3JUeXBlQ2FjaGVbZXJyb3JLZXldID8gMCA6IDE7CiAgICAgICAgICAgICAgICBlcnJvclR5cGVDYWNoZVtlcnJvcktleV0gPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcFs1XSA9IG51bGw7CiAgICAgICAgICAgICAgICBwWzZdID0gbnVsbDsKICAgICAgICAgICAgICAgIHBbN10gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwWzFdID09PSB1ZCAmJiBwWzRdID09PSB1ZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpeEluZm8ocCk7CiAgICAgICAgfQogICAgICAgIDsKCiAgICAgICAgbmJzSnNCcmlkZ2UubG9nRGVidWcodXRpbC5zdHJpbmdpZnkocCkpOwogICAgICAgIG5ic0pzQnJpZGdlLmxvZ0pzRXJyb3IocFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgcFs2XSwgcFs3XSxkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKICAgICAgICBtZXRyaWMuZXJyb3JzLnB1c2gocCk7CiAgICB9OwoKICAgIHZhciB3X2V2dHMgPSBbCiAgICAgICAgWydsb2FkJywgb25XaW5kb3dMb2FkXSwKICAgICAgICAvL+aEn+iniei/meS4pOS4quayoeWVpeS9nOeUqCznu4/ov4fpqozor4Es5peg6K665piv5ZCm5Y+R55SfYmVmb3JldW5sb2FkLHBhZ2VoaWRlLOmDveS8muWPkeeUn3VubG9hZC4KICAgICAgICAvLyDov5nph4zlj6rmipPkuIDkuKrkuovku7blupTor6XlsLHlj6/ku6XkuoYKICAgICAgICAvLyBbJ2JlZm9yZXVubG9hZCcsIG9uV2luZG93VW5sb2FkXSwKICAgICAgICAvLyBbJ3BhZ2VoaWRlJywgb25XaW5kb3dVbmxvYWRdLAogICAgICAgIFsndW5sb2FkJywgb25XaW5kb3dVbmxvYWRdCiAgICBdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd19ldnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdXRpbC5zaCh3aW5kb3csIHdfZXZ0c1tpXVswXSwgd19ldnRzW2ldWzFdLCBmYWxzZSk7CiAgICB9CiAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICB1dGlsLnNoKHdpbmRvdywgJ2Vycm9yJywgb25FcnJvckV2ZW50LCBmYWxzZSk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIFNvbWUgYnJvd3NlciBvbmx5IGltcGxlbWVudCB3aW5kb3cub25lcnJvcgogICAgICAgIHdpbmRvdy5vbmVycm9yID0gZnVuY3Rpb24gKG1zZywgZmlsZW5hbWUsIGxpbmVubywgY29sbm8sIGVycm9yKSB7CiAgICAgICAgICAgIHZhciBwID0gW25vdygpLCBtc2csIGxpbmVubywgY29sbm8sIGZpbGVuYW1lXTsKICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyb3JLZXkgPSBlcnJvcklkKG1zZywgbGluZW5vLCBjb2xubywgZXJyb3IubW9kdWxlTmFtZSk7CiAgICAgICAgICAgICAgICBwID0gcC5jb25jYXQoWzEsIGVycm9yLnN0YWNrLCBlcnJvci5tb2R1bGVOYW1lLCBlcnJvclR5cGVDYWNoZVtlcnJvcktleV0gPyAwIDogMV0pOwogICAgICAgICAgICAgICAgZXJyb3JUeXBlQ2FjaGVbZXJyb3JLZXldID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaXhJbmZvKHApOwoKICAgICAgICAgICAgbmJzSnNCcmlkZ2UubG9nRGVidWcodXRpbC5zdHJpbmdpZnkocCkpOwoKICAgICAgICAgICAgbmJzSnNCcmlkZ2UubG9nSnNFcnJvcihwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdLCBwWzddLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgbWV0cmljLmVycm9ycy5wdXNoKHApOwogICAgICAgIH07CiAgICB9CgogICAgZG9jdW1lbnQucmVhZHlTdGF0ZTsKICAgIC8v5LqL5Lu25rKh5pyJ5Y+R55SfCiAgICAvLyB2YXIgZF9ldnRzID0gWwogICAgLy8gICAgIFsnc2Nyb2xsJywgb25Ub3VjaF0sCiAgICAvLyAgICAgWydrZXlwcmVzcycsIG9uVG91Y2hdLAogICAgLy8gICAgIFsnY2xpY2snLCBvblRvdWNoXSwKICAgIC8vICAgICBbJ0RPTUNvbnRlbnRMb2FkZWQnLCBvbkRvY0xvYWRlZF0sCiAgICAvLyAgICAgWydyZWFkeXN0YXRlY2hhbmdlJywgb25SZWFkeVN0YXRlQ2hhbmdlXQogICAgLy8gXTsKICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgZF9ldnRzLmxlbmd0aDsgaSsrKSB7CiAgICAvLyAgICAgdXRpbC5zaChkb2MsIGRfZXZ0c1tpXVswXSwgZF9ldnRzW2ldWzFdLCBmYWxzZSkKICAgIC8vIH0KICAgIHV0aWwud3JhcChmYWxzZSwgd2luZG93LCAicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwgZnVuY3Rpb24gKHByZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHR5X3J1bS5maXJzdFBhaW50ID0gbm93KCk7CiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBwcmU7CiAgICAgICAgICAgIHJldHVybiBwcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9KTsKCiAgICBmdW5jdGlvbiB0aGlzY2FsbChvLCBtLCBhKSB7CiAgICAgICAgdmFyIGYgPSAnby4nICsgbSArICcoJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgZiArPSAoaSA+IDAgPyAnLCcgOiAnJykgKyAnYVsnICsgaSArICddJzsKICAgICAgICB9CiAgICAgICAgZiArPSAnKTsnOwogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oZikoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB3cF9vcGVuKHByZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCJ3cCBvcGVuIik7CiAgICAgICAgICAgIHZhciBhID0gYXJndW1lbnRzOwogICAgICAgICAgICBpZiAoIXRoaXMuX3R5X3dyYXApIHsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gdXRpbC5hcmdzLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgICAgICAgdGhpcy5fdHlfcnVtID0gewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogYXJnc1swXSwKICAgICAgICAgICAgICAgICAgICB1cmw6IGFyZ3NbMV0sCiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG5vdygpCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJlLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wZW4gPSBwcmU7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc2NhbGwodGhpcywgJ29wZW4nLCBhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvYmpfc2l6ZSh0KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0ID09PSAnc3RyaW5nJykgewogICAgICAgICAgICByZXR1cm4gdC5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGlmICh3aW5kb3cuQXJyYXlCdWZmZXIgJiYgdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7CiAgICAgICAgICAgIHJldHVybiB0LmJ5dGVMZW5ndGg7CiAgICAgICAgfQogICAgICAgIGlmICh3aW5kb3cuQmxvYiAmJiB0IGluc3RhbmNlb2YgQmxvYikgewogICAgICAgICAgICByZXR1cm4gdC5zaXplOwogICAgICAgIH0KICAgICAgICBpZiAodCAmJiB0Lmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gdC5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgfTsKCiAgICBmdW5jdGlvbiB3cF9zZW5kKHByZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCJ3cCBzZW5kIik7CiAgICAgICAgICAgIGlmICghdGhpcy5fdHlfd3JhcCkgewogICAgICAgICAgICAgICAgdGhpcy5fdHlfcnVtLnN0YXJ0ID0gbm93KCk7CiAgICAgICAgICAgICAgICB0aGlzLl90eV9ydW0ucmVxID0gYXJndW1lbnRzWzBdID8gb2JqX3NpemUoYXJndW1lbnRzWzBdKSA6IDA7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgY2JfdGltZSA9IDA7CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gX2FwcGVuZF9hamF4KGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gc2VsZi5fdHlfcnVtLAogICAgICAgICAgICAgICAgICAgICAgICBhamF4SXRlbSwgcGFyc2VkOwogICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIT09NOi/memHjOS4jeiuvue9ruS4uj09PTTmmK/lm6DkuLpfYXBwZW5kX2FqYXjmnInlpb3lh6DkuKrlnLDmlrnosIPnlKgs5b2T6LWw55qE5piv5q2j5bi455qE5pe25YCZLAogICAgICAgICAgICAgICAgICAgICAgICAvL+WNs+WcqG9jYuS4reiwg+eUqOeahOaXtuWAmSzlt7Lnu4/moLnmja49PT0055qE5oOF5Ya15YGa5LqGZW5k5pe26Ze055qE6K6+572uLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5yZWFkeVN0YXRlICE9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmVuZCA9IG5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHQucyA9IHNlbGYuc3RhdHVzOy8v55u45b2T5LqO54q25oCB56CBLjIwMDpvaywgNDA0OumhtemdouacquaJvuWIsAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5yZXNwb25zZVR5cGUgPT0gJycgfHwgc2VsZi5yZXNwb25zZVR5cGUgPT0gJ3RleHQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZhaWxlZCB0byByZWFkIHRoZSAncmVzcG9uc2VUZXh0JyBwcm9wZXJ0eSBmcm9tICdYTUxIdHRwUmVxdWVzdCc6IFRoZSB2YWx1ZSBpcyBvbmx5IGFjY2Vzc2libGUgaWYgdGhlIG9iamVjdCdzICdyZXNwb25zZVR5cGUnIGlzICcnIG9yICd0ZXh0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5yZXMgPSBvYmpfc2l6ZShzZWxmLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5yZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVzID0gb2JqX3NpemUoc2VsZi5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVzID0gb2JqX3NpemUoc2VsZi5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5yZXMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0LnJlYWR5U3RhdGUgPSBzZWxmLnJlYWR5U3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuY2JfdGltZSA9IGNiX3RpbWU7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBhamF4SXRlbSA9IFt0Lm1ldGhvZCwgd2luZG93LmxvY2F0aW9uLmhyZWYsIHQudXJsLCAodC5zID4gMCkgPyAodC5lbmQgLSB0LnN0YXJ0KSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjYl90aW1lLCB0LnMsICh0LnMgPiAwKSA/IDAgOiBlcnIsIHQucmVzLCB0LnJlcSwgdC5zdGFydCwgdC5lbmRdOwogICAgICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodC5yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwYXJzZWQgPSBwYXJzZVJlc0hlYWRlcihzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmIChwYXJzZWQgJiYgKHBhcnNlZCA9IHBhcnNlZC54RGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBhamF4SXRlbS5wdXNoKHBhcnNlZFsnaWQnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgYWpheEl0ZW0ucHVzaChwYXJzZWRbJ2FjdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBhamF4SXRlbS5wdXNoKHBhcnNlZC50aW1lICYmIHBhcnNlZC50aW1lWydkdXJhdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBhamF4SXRlbS5wdXNoKHBhcnNlZC50aW1lICYmIHBhcnNlZC50aW1lWydxdSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gfQoKICAgICAgICAgICAgICAgICAgICAgICAgYWpheEl0ZW0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZDogdC5tZXRob2QsLy/lnKh3cF9vcGVu5Lit6K6+572u5LqGCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZjogd2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bDogdC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcjogKHQucyA+IDApID8gKHQuZW5kIC0gdC5zdGFydCkgOiAwLC8vc3RhcnTlgLzlnKjlvIDlp4vmiafooYx3cF9zZW5k55qE5pe25YCZ6K6+572u5LqGLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQ6IGNiX3RpbWUsLy/lvZPnirbmgIHkuLo055qE5pe25YCZLG9ucmVhZHlzdGF0ZWNoYW5nZeWbnuiwg+WHveaVsOaJp+ihjOeahOaXtumXtAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2M6IHQucywvL+eKtuaAgeeggQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWM6ICh0LnMgPiAwKSA/IDAgOiBlcnIsLy/plJnor6/noIEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzejogdC5yZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBycXo6IHQucmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Q6IHQuc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZDogdC5lbmQKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VSZXNIZWFkZXIoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkICYmIChwYXJzZWQgPSBwYXJzZWQueERhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWpheEl0ZW0ucHVzaChwYXJzZWRbJ2lkJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFqYXhJdGVtLnB1c2gocGFyc2VkWydhY3Rpb24nXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWpheEl0ZW0ucHVzaChwYXJzZWQudGltZSAmJiBwYXJzZWQudGltZVsnZHVyYXRpb24nXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWpheEl0ZW0ucHVzaChwYXJzZWQudGltZSAmJiBwYXJzZWQudGltZVsncXUnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWpheEl0ZW0uaWQgPSBwYXJzZWRbJ2lkJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWpheEl0ZW0uYXQgPSBwYXJzZWRbJ2FjdGlvbiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFqYXhJdGVtLmRydCA9IChwYXJzZWQudGltZSAmJiBwYXJzZWQudGltZVsnZHVyYXRpb24nXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWpheEl0ZW0ucXUgPSAocGFyc2VkLnRpbWUgJiYgcGFyc2VkLnRpbWVbJ3F1J10pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0eV9ydW0uYWEucHVzaChhamF4SXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpYy5zYSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90eV9ydW0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvbmNoKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnJlYWR5U3RhdGUgPT0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICBfYXBwZW5kX2FqYXgoMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYXJzZVJlc0hlYWRlcihjdHgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIGlmIChjdHguZ2V0UmVzcG9uc2VIZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhEYXRhID0gdXRpbC5wYXJzZUpTT04oY3R4LmdldFJlc3BvbnNlSGVhZGVyKCdYLVRpbmd5dW4tVHgtRGF0YScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhEYXRhICYmIHhEYXRhLnIgJiYgY3R4Ll90eV9ydW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeERhdGEuciArICcnKSA9PT0gKGN0eC5fdHlfcnVtLnIgKyAnJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGN0eC5fdHlfcnVtLnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeERhdGE6IHhEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSAmJiB3aW5kb3cuX3R5X3J1bS5jX3JhLnB1c2gocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vaGFzIGNhbGxiYWNrPwogICAgICAgICAgICAgICAgZnVuY3Rpb24gb2NiKHByZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ic0pzQnJpZGdlLmxvZ0RlYnVnKCJjYWxsIG9jYiwgc3RhdGU6IiArIHNlbGYucmVhZHlTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCByZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnJlYWR5U3RhdGUgPT0gNCAmJiBzZWxmLl90eV9ydW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3R5X3J1bS5lbmQgPSBzID0gbm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90eV9ydW0ucmVhZHlTdGF0ZSA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFeGVjdXRpbmdNb2R1bGVOYW1lICYmIHdyYXBUaW1lcihjdXJyZW50RXhlY3V0aW5nTW9kdWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFeGVjdXRpbmdNb2R1bGVOYW1lICYmIHVud3JhcFRpbWVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB3cmFwRXJyb3IoZSwgY3VycmVudEV4ZWN1dGluZ01vZHVsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEV4ZWN1dGluZ01vZHVsZU5hbWUgJiYgdW53cmFwVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFeGVjdXRpbmdNb2R1bGVOYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucmVhZHlTdGF0ZSA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl90aW1lID0gbm93KCkgLSBzOy8v55u45b2T5LqO5Zyo54q25oCBNOeahOaDheWGteS4iyzmiafooYxvbnJlYWR5c3RhdGVjaGFuZ2Xlm57osIPlh73mlbDnmoTml7bpl7QKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvbmNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBiY2IgPSB1dGlsLndyYXAoZmFsc2UsIHRoaXMsICdvbnJlYWR5c3RhdGVjaGFuZ2UnLCBvY2IpOwogICAgICAgICAgICAgICAgaWYgKCFiY2IpIHsKICAgICAgICAgICAgICAgICAgICB1dGlsLnNoKHRoaXMsICdyZWFkeXN0YXRlY2hhbmdlJywgb25jaCwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyp1dGlsLnNldEV2ZW50SGFuZGxlcihzZWxmLCAnbG9hZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHNlbGYucmVhZHlTdGF0ZSA9IDQsIG9uY2goKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7Ki8KCiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3X2V2dChldnQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gb25fZXZ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHNlbGYuX3R5X3J1bTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0ID09ICdwcm9ncmVzcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2dCA9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYXBwZW5kX2FqYXgoOTA1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldnQgPT0gJ2xvYWRzdGFydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuc3RhcnQgPSBub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldnQgPT0gJ2Vycm9yJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FwcGVuZF9hamF4KDk5MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZ0ID09ICd0aW1lb3V0JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FwcGVuZF9hamF4KDkwMyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRfZXZ0KG9iaiwgZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBBcnJheSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFtlXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldiA9IGVbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuc2gob2JqLCBldiwgd19ldnQoZXYpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGhhbmRfZXZ0KHRoaXMsIFsnZXJyb3InLCAncHJvZ3Jlc3MnLCAnYWJvcnQnLCAnbG9hZCcsICdsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICd0aW1lb3V0J10pOwogICAgICAgICAgICAgICAgaWYgKCFiY2IpIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHV0aWwud3JhcChmYWxzZSwgc2VsZiwgJ29ucmVhZHlzdGF0ZWNoYW5nZScsIG9jYik7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2FtZURvbWFpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBhcnNlVXJsKHVybCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2VkID0gL14oPzooW0EtWmEtel0rKTopPyhcL3swLDN9KShbMC05LlwtQS1aYS16XSspKD86OihcZCspKT8vLmV4ZWModXJsKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm90b2NvbCA9IHBhcnNlZFsxXSA/IChwYXJzZWRbMV0gKyAnOicpIDogJ2h0dHA6JzsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gcGFyc2VkWzNdOwogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucG9ydCA9IHBhcnNlZFs0XSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2MgPSBsb2NhdGlvbjsKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1dGlsLnRyaW0odXJsKTsKICAgICAgICAgICAgICAgICAgICBpZiAodXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8vJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGxvYy5wcm90b2NvbCArIHVybDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByc2wgPSBwYXJzZVVybCh1cmwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJzbC5wcm90b2NvbCA9PT0gbG9jLnByb3RvY29sICYmIHJzbC5ob3N0bmFtZSA9PT0gbG9jLmhvc3RuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcnNsLnBvcnQgPT09IGxvYy5wb3J0ID8gdHJ1ZSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbG9jLnBvcnQgJiYgKChsb2MucHJvdG9jb2wgPT09ICdodHRwOicgJiYgcnNsLnBvcnQgPT09ICc4MCcpIHx8IChsb2MucHJvdG9jb2wgPT09ICdodHRwczonICYmIHJzbC5wb3J0ID09PSAnNDQzJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIHZhciBhID0gYXJndW1lbnRzOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VydmVyID0gdHlfcnVtLnNlcnZlcjsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyICYmIHNlcnZlci5pZCAmJiB0aGlzLl90eV9ydW0gJiYgc2FtZURvbWFpbih0aGlzLl90eV9ydW0udXJsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90eV9ydW0uciA9IChuZXcgRGF0ZSgpLmdldFRpbWUoKSkgJSAxMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldFJlcXVlc3RIZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVxdWVzdEhlYWRlcignWC1UaW5neXVuLUlkJywgc2VydmVyLmlkICsgJztyPScgKyB0aGlzLl90eV9ydW0ucik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcHJlLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlbmQgPSBwcmU7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc2NhbGwodGhpcywgJ3NlbmQnLCBhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgoKICAgIGlmIChfeGhyKSB7CgogICAgICAgIGlmIChfeGhyLnByb3RvdHlwZSkgewogICAgICAgICAgICBuYnNKc0JyaWRnZS5sb2dEZWJ1ZygicmVwbGFjZSBvcGVuIGFuZCBzZW5kIG1ldGhvZHMiKTsKICAgICAgICAgICAgdXRpbC53cmFwKGZhbHNlLCBfeGhyLnByb3RvdHlwZSwgJ29wZW4nLCB3cF9vcGVuKTsKICAgICAgICAgICAgdXRpbC53cmFwKGZhbHNlLCBfeGhyLnByb3RvdHlwZSwgJ3NlbmQnLCB3cF9zZW5kKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1dGlsLmllID0gNzsKICAgICAgICAgICAgdmFyIHggPSBfeGhyOwogICAgICAgICAgICB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG5ldyB4KCk7CiAgICAgICAgICAgICAgICB1dGlsLndyYXAoZmFsc2UsIHIsICdvcGVuJywgd3Bfb3Blbik7CiAgICAgICAgICAgICAgICB1dGlsLndyYXAoZmFsc2UsIHIsICdzZW5kJywgd3Bfc2VuZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAod2luZG93LkFjdGl2ZVhPYmplY3QpIHV0aWwuaWUgPSA2OwoKfSh3aW5kb3cpOw==');parent.appendChild(script)})()" used in: Lcom/networkbench/agent/impl/instrumentation/NBSWebViewClient;->injectScriptFile(Landroid/webkit/WebView;)V
'javascript:(function(){try{%s}catch(e){}})()' used in: Lcom/growingio/android/sdk/collection/VdsJsHelper;->a()Ljava/lang/String;
"javascript:(function(){try{var p=document.createElement('script');p.src='%s';document.head.appendChild(p);}catch(e){}})()" used in: Lcom/growingio/android/sdk/collection/VdsJsBridgeManager;->getCirclePluginSrc()Ljava/lang/String;
"javascript:(function(){try{var p=document.createElement('script');p.src='%s';document.head.appendChild(p);}catch(e){}})()" used in: Lcom/growingio/android/sdk/collection/VdsJsHelper;->b()Ljava/lang/String;
'javascript:hideBody();' used in: Lcom/growingio/android/sdk/circle/HybridEventEditDialog;->c()V
'javascript:tingyunClass()' used in: Lcom/networkbench/agent/impl/instrumentation/NBSWebViewClient;->onPageFinished(Landroid/webkit/WebView; Ljava/lang/String;)V
'javascript:try{(function(){' used in: Lcom/growingio/android/sdk/utils/Util;->a(Landroid/view/View; Ljava/lang/String; [Ljava/lang/Object;)V
'javascript:window.WebViewJavascriptBridgeInterface.onResultForScript(' used in: Lasia/bluepay/paysdk/webview/a/c$4;->run()V

位置: classes2.dex
'cs@ofo.com' used in: Lso/ofo/abroad/bean/CountryConfig;->getEmail()Ljava/lang/String;
'data:image/jpeg;base64,' used in: Lso/ofo/abroad/ui/report/ReportActivity;->h()V
'file:///android_asset/webview_error.html' used in: Lso/ofo/abroad/widget/WebViewWithProgressBar$2;->onReceivedError(Landroid/webkit/WebView; I Ljava/lang/String; Ljava/lang/String;)V
'http://localhost/' used in: Lretrofit2/Response;->success(Ljava/lang/Object;)Lretrofit2/Response;
'http://localhost/' used in: Lretrofit2/Response;->success(Ljava/lang/Object; Lokhttp3/Headers;)Lretrofit2/Response;
'http://localhost/' used in: Lretrofit2/Response;->error(I Lokhttp3/ResponseBody;)Lretrofit2/Response;
'http://weixin.qq.com/r/GEjh_Q7E6VOWrUqa9x0K' used in: Lso/ofo/abroad/ui/userbike/scan/b;->d(Ljava/lang/String;)Z
'http://www.ofo.so/bikeplate' used in: Lso/ofo/abroad/ui/userbike/scan/b;->d(Ljava/lang/String;)Z
'https://maps.googleapis.com/maps/api/' used in: Lso/ofo/abroad/map/route/GoogleMapDirectionKit$Request;->(Ljava/lang/String;)V
'https://play.google.com/store/apps/details?id=' used in: Lso/ofo/abroad/pagejump/f;->b(Landroid/content/Context; Ljava/lang/String;)V
'https://play.google.com/store/apps/details?id=' used in: Lso/ofo/abroad/pagejump/f;->a(Landroid/content/Context;)V
'javascript:(function () { ' used in: Lso/ofo/abroad/widget/WebViewWithProgressBar;->a(Ljava/lang/String; [Ljava/lang/Object;)V
"javascript:window.baseInfo = { 'country':'" used in: Lso/ofo/abroad/widget/WebViewWithProgressBar$1;->loadUrl(Ljava/lang/String;)V

中危

检测到9处setSavePassword密码明文存储漏洞。

位置: classes.dex
asia.bluepay.paysdk.BluePayWebActivity;
com.growingio.android.sdk.collection.VdsJsHelper;
asia.bluepay.paysdk.webview.a.c;
com.networkbench.agent.impl.instrumentation.NBSWebViewClient;
com.leanplum.messagetemplates.BaseMessageDialog;
asia.bluepay.paysdk.webview.Html5MerWebView;
com.growingio.android.sdk.circle.HybridEventEditDialog;
com.ofo.ofopay.views.WebViewContainer;

位置: classes2.dex
so.ofo.abroad.widget.WebViewWithProgressBar;

webview的保存密码功能默认设置为true。Webview会明文保存网站上的密码到本地私有文件”databases/webview.db”中。对于可以被root的系统环境或者配合其他漏洞(如webview的同源绕过漏洞),攻击者可以获取到用户密码。
建议:显示设置webView.getSetting().setSavePassword(false)。

参考案例:
www.wooyun.org/bugs/wooyun-2010-021420
www.wooyun.org/bugs/wooyun-2013-020246

参考资料:
http://wolfeye.baidu.com/blog/
www.claudxiao.net/2013/03/android-webview-cache/

中危

检测到2使用全局可读写操作文件。

位置: classes.dex
com.google.android.gms.flags.impl.b$1;->a()Landroid.content.SharedPreferences;===>getSharedPreferences
com.google.android.gms.a.a.a;->b(Landroid.content.Context;)Lcom.google.android.gms.a.a.a$a;===>getSharedPreferences

在使用getDir、getSharedPreferences(SharedPreference)或openFileOutput时,如果设置了全局的可读权限,攻击者恶意读取文件内容,获取敏感信息。在设置文件属性时如果设置全局可写,攻击者可能会篡改、伪造内容,可以能会进行诈骗等行为,造成用户财产损失。建议:
(1)使用MODE_PRIVATE模式创建内部存储文件。
(2)加密存储敏感数据。
(3)避免在文件中存储明文和敏感信息。

参考案例:
http://wooyun.org/bugs/wooyun-2010-047172
http://wooyun.org/bugs/wooyun-2010-054438
http://wooyun.org/bugs/wooyun-2010-0151270

参考资料:
https://jaq.alibaba.com/blog.htm?id=56
https://jaq.alibaba.com/blog.htm?id=58
http://wolfeye.baidu.com/blog/global-rw-of-file
http://wolfeye.baidu.com/blog/global-rw-of-sharepreference/

低危

检测到11个WebView系统隐藏接口未移除。

位置: classes.dex
com.networkbench.agent.impl.instrumentation.NBSWebViewClient;->onPageFinished(Landroid.webkit.WebView; Ljava.lang.String;)V
com.networkbench.agent.impl.instrumentation.NBSWebViewClient;->onPageStarted(Landroid.webkit.WebView; Ljava.lang.String; Landroid.graphics.Bitmap;)V
com.leanplum.messagetemplates.BaseMessageDialog;->(Landroid.app.Activity; Z Lcom.leanplum.messagetemplates.BaseMessageOptions; Lcom.leanplum.messagetemplates.WebInterstitialOptions; Lcom.leanplum.messagetemplates.a;)V
com.leanplum.messagetemplates.BaseMessageDialog;->d(Landroid.content.Context;)Landroid.webkit.WebView;
com.growingio.android.sdk.collection.VdsJsHelper;->a(Landroid.view.View;)V
com.growingio.android.sdk.circle.HybridEventEditDialog;->a(Landroid.content.Context;)V
com.ofo.ofopay.views.WebViewContainer;->onDestroy()V
com.ofo.ofopay.views.WebViewContainer;->initSettings()V
com.facebook.internal.ad;->b(I)V
com.leanplum.messagetemplates.BaseMessageDialog;->a(Landroid.app.Activity; Z)Landroid.widget.RelativeLayout;

位置: classes2.dex
so.ofo.abroad.widget.WebViewWithProgressBar;->(Landroid.content.Context; Landroid.util.AttributeSet;)V

android webview组件包含3个隐藏的系统接口:searchBoxJavaBridge_,accessibilityTraversal以及accessibility,恶意程序可以利用它们实现远程代码执行。
如果使用了WebView,那么使用WebView.removeJavascriptInterface(String name) API,显示的移除searchBoxJavaBridge_、accessibility、accessibilityTraversal这三个接口。

参考资料:
http://wolfeye.baidu.com/blog/android-webview/
http://blog.csdn.net/u013107656/article/details/51729398
http://wolfeye.baidu.com/blog/android-webview-cve-2014-7224/

低危

检测到8处AES/DES弱加密风险。

位置: classes2.dex
Lso/ofo/bluetooth/operation/orderhand/a/d;->a([B)Z
Lso/ofo/bluetooth/d/e;->a([B Ljava/lang/String;)[B
Lso/ofo/bluetooth/operation/orderhand/a/d;->d()Ljava/util/List;
Lso/ofo/bluetooth/operation/orderhand/a/a;->a([B)Z
Lso/ofo/bluetooth/operation/orderhand/a/e;->c()[B
Lso/ofo/bluetooth/d/e;->a([B [B)[B
Lso/ofo/bluetooth/d/e;->b([B [B)[B
Lso/ofo/bluetooth/d/e;->a([B Ljava/lang/String; Ljava/lang/String;)[B

使用AES/DES/DESede加密算法时,如果使用ECB模式,容易受到攻击风险,造成信息泄露。建议在使用AES/DES/DESede加密算法时,应显示指定使用CBC或CFB加密模式

参考资料:
http://blog.csdn.net/u013107656/article/details/51997957
https://developer.android.com/reference/javax/crypto/Cipher.html
http://drops.wooyun.org/tips/15870
https://developer.android.com/training/articles/keystore.html
http://wolfeye.baidu.com/blog/weak-encryption/
http://www.freebuf.com/articles/terminal/99868.html

低危

非debug包,需要通过打包平台proguard脚本,移除大部分系统输出代码。
经扫描该包仍存在大量系统输出代码,共发现5处系统输出代码.(此处扫描的系统输出代码,是指调用System.out.print*输出的,本应在打包平台移除的系统输出代码.)
各个bundle系统输出代码详情如下:

位置: classes.dex
com.networkbench.agent.impl.e.b;
com.fasterxml.jackson.databind.util.ISO8601Utils;
io.reactivex.exceptions.CompositeException$WrappedPrintStream;
com.fasterxml.jackson.core.util.VersionUtil;
com.fasterxml.jackson.databind.ext.OptionalHandlerFactory;

警告

检测到6处addFlags使用Intent.FLAG_ACTIVITY_NEW_TASK。

位置: classes.dex
com.leanplum.messagetemplates.f$1;->onResponse
asia.bluepay.paysdk.BluePayWebActivity;->a
com.ofo.ofopay.activities.BaseAuthActivity;->getIntentForAddPayment
asia.bluepay.paysdk.BluePayApi;->b

位置: classes2.dex
so.ofo.abroad.pagejump.f;->c
so.ofo.abroad.network.a;->a

APP创建Intent传递数据到其他Activity,如果创建的Activity不是在同一个Task中打开,就很可能被其他的Activity劫持读取到Intent内容,跨Task的Activity通过Intent传递敏感信息是不安全的。建议:
尽量避免使用包含FLAG_ACTIVITY_NEW_TASK标志的Intent来传递敏感信息。

参考资料:
http://wolfeye.baidu.com/blog/intent-data-leak

警告

检测到8个导出的组件接收其他app的消息,这些组件会被其他app引用并导致dos攻击。

activity so.ofo.abroad.pagejump.ExternalJumpInActivity
activity com.ofo.pay.OfoPayActivity
activity asia.bluepay.paysdk.result.PayResultActivity
service so.ofo.abroad.service.MyFirebaseMessagingService
service so.ofo.abroad.ui.userbike.usebikebase.OrderRefreshService
service com.google.firebase.messaging.FirebaseMessagingService
service com.google.firebase.iid.FirebaseInstanceIdService
service so.ofo.bluetooth.service.BLEService

建议:
(1)最小化组件暴露。对不会参与跨应用调用的组件建议显示添加android:exported="false"属性。
(2)设置组件访问权限。对provider设置权限,同时将权限的protectionLevel设置为"signature"或"signatureOrSystem"。
(3)组件传输数据验证。对组件之间,特别是跨应用的组件之间的数据传入与返回做验证和增加异常处理,防止恶意调试数据传入,更要防止敏感数据返回。

参考案例:
http://www.wooyun.org/bugs/wooyun-2010-0169746
http://www.wooyun.org/bugs/wooyun-2010-0104965

参考资料:
http://jaq.alibaba.com/blog.htm?spm=0.0.0.0.Wz4OeC&id=55
《Android安全技术解密与防范》

警告

检测到3个导出的隐式Service组件。
service so.ofo.abroad.service.MyFirebaseMessagingService
service com.google.firebase.messaging.FirebaseMessagingService
service com.google.firebase.iid.FirebaseInstanceIdService

建议:为了确保应用的安全性,启动Service时,请始终使用显式Intent,且不要为服务声明Intent过滤器。使用隐式Intent启动服务存在安全隐患,因为您无法确定哪些服务将响应Intent,且用户无法看到哪些服务已启动。从Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService(),系统会抛出异常。

参考资料:
https://developer.android.com/guide/components/intents-filters.html#Types

警告

检测3处組件設置了android.intent.category.BROWSABLE属性。
so.ofo.abroad.ui.splash.SplashActivity
so.ofo.abroad.pagejump.ExternalJumpInActivity
com.ofo.pay.OfoPayActivity


在AndroidManifest文件中定义了android.intent.category.BROWSABLE属性的组件,可以通过浏览器唤起,这会导致远程命令执行漏洞攻击。建议:
(1)APP中任何接收外部输入数据的地方都是潜在的攻击点,过滤检查来自网页的参数。
(2)不要通过网页传输敏感信息,有的网站为了引导已经登录的用户到APP上使用,会使用脚本动态的生成URL Scheme的参数,其中包括了用户名、密码或者登录态token等敏感信息,让用户打开APP直接就登录了。恶意应用也可以注册相同的URL Sechme来截取这些敏感信息。Android系统会让用户选择使用哪个应用打开链接,但是如果用户不注意,就会使用恶意应用打开,导致敏感信息泄露或者其他风险。

參考案例:
http://www.wooyun.org/bugs/wooyun-2014-073875
http://www.wooyun.org/bugs/wooyun-2014-067798

参考资料:
http://wolfeye.baidu.com/blog/intent-scheme-url/
http://www.jssec.org/dl/android_securecoding_en.pdf
http://drops.wooyun.org/mobile/15202
http://blog.csdn.net/l173864930/article/details/36951805
http://drops.wooyun.org/papers/2893

警告

检测到9潜在的XSS漏洞。

位置: classes.dex
asia.bluepay.paysdk.webview.a.c;->c()V
com.facebook.internal.ad;->b(I)V
com.growingio.android.sdk.circle.HybridEventEditDialog;->a(Landroid.content.Context;)V
com.growingio.android.sdk.collection.VdsJsHelper;->a(Landroid.view.View;)V
com.leanplum.messagetemplates.BaseMessageDialog;->(Landroid.app.Activity; Z Lcom.leanplum.messagetemplates.BaseMessageOptions; Lcom.leanplum.messagetemplates.WebInterstitialOptions; Lcom.leanplum.messagetemplates.a;)V
com.leanplum.messagetemplates.BaseMessageDialog;->a(Landroid.app.Activity; Z)Landroid.widget.RelativeLayout;
com.leanplum.messagetemplates.BaseMessageDialog;->d(Landroid.content.Context;)Landroid.webkit.WebView;
com.ofo.ofopay.views.WebViewContainer;->initSettings()V

位置: classes2.dex
so.ofo.abroad.widget.WebViewWithProgressBar;->(Landroid.content.Context; Landroid.util.AttributeSet;)V

允许WebView执行JavaScript(setJavaScriptEnabled),有可能导致XSS攻击。建议尽量避免使用。
(1)API等于高高于17的Android系统。出于安全考虑,为了防止Java层的函数被随意调用,Google在4.2版本之后,规定允许被调用的函数必须以@JavascriptInterface进行注解。
(2)API等于高高于17的Android系统。建议不要使用addJavascriptInterface接口,以免带来不必要的安全隐患,如果一定要使用该接口,建议使用证书校验。
u(3)使用removeJavascriptInterface移除Android系统内部的默认内置接口:searchBoxJavaBridge_、accessibility、accessibilityTraversal。

参考案例:
www.wooyun.org/bugs/wooyun-2015-0140708
www.wooyun.org/bugs/wooyun-2016-0188252

参考资料:
http://jaq.alibaba.com/blog.htm?id=48
http://blog.nsfocus.net/android-webview-remote-code-execution-vulnerability-analysis

警告

检测到4处IvParameterSpec的使用。

位置: classes.dex
com.leanplum.a.a;->a(I Ljava.lang.String; [B)[B

位置: classes2.dex
so.ofo.abroad.ui.payment.aydenEncrypt.b;->a(Ljava.lang.String;)Ljava.lang.String;
so.ofo.bluetooth.d.e;->a([B [B [B)[B
so.ofo.bluetooth.d.e;->b([B Ljava.lang.String;)[B

使用IVParameterSpec函数,如果使用了固定的初始化向量,那么密码文本可预测性高得多,容易受到字典攻击等。建议禁止使用常量初始化矢量构造IVParameterSpec,使用聚安全提供的安全组件。

参考资料:
http://drops.wooyun.org/tips/15870
https://developer.android.com/training/articles/keystore.html
http://wolfeye.baidu.com/blog/weak-encryption/
http://www.freebuf.com/articles/terminal/99868.html

警告

检测到1处使用空Intent构造PendingIntent。

位置: classes.dex
com.leanplum.Leanplum$13$2;->run()V

使用pendingIntent时候,如果使用了一个空Intent,会导致恶意用户劫持Intent的内容。禁止使用空intent去构造pendingIntent。建议:
禁止使用空intent去构造pendingIntent。

参考资料:
http://wolfeye.baidu.com/blog/pendingintent-leak-information
http://bbs.mob.com/thread-5249-1-1.html

警告

检测到9处使用了加解密算法。密钥处理不当可能会导致信息泄露。

位置: classes.dex
com.leanplum.a.a;->a(I Ljava.lang.String; [B)[B

位置: classes2.dex
so.ofo.bluetooth.d.e;->a([B [B)[B
so.ofo.bluetooth.d.e;->a([B Ljava.lang.String;)[B
okio.ByteString;->hmac(Ljava.lang.String; Lokio.ByteString;)Lokio.ByteString;
so.ofo.bluetooth.d.e;->a(Ljava.lang.String; Ljava.lang.String;)Ljava.lang.String;
so.ofo.bluetooth.d.e;->a([B [B [B)[B
so.ofo.bluetooth.d.e;->b([B [B)[B
so.ofo.bluetooth.d.e;->b([B Ljava.lang.String;)[B
so.ofo.bluetooth.d.e;->a([B [B Ljava.lang.String;)[B

参考案例:
http://www.wooyun.org/bugs/wooyun-2010-0105766
http://www.wooyun.org/bugs/wooyun-2015-0162907
http://www.wooyun.org/bugs/wooyun-2010-0187287

参考资料:
http://drops.wooyun.org/tips/15870
https://developer.android.com/training/articles/keystore.html


动态扫描发现风险点

风险等级 风险名称

服务端分析

风险等级 风险名称

警告

检测到?处XSS漏洞。
开发中...

警告

检测到?处XSS跨站漏洞。
开发中...

应用证书