正在查看: 万能钥匙 v1.1.23 应用的 OfflineWebManager.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: 万能钥匙 v1.1.23 应用的 OfflineWebManager.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package com.finogeeks.lib.applet.main.offlineweb;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import androidx.core.view.a0;
import androidx.core.view.d1;
import androidx.core.view.n0;
import com.finogeeks.lib.applet.R;
import com.finogeeks.lib.applet.client.FinAppProcessClient;
import com.finogeeks.lib.applet.config.AppConfig;
import com.finogeeks.lib.applet.main.FinAppHomeActivity;
import com.finogeeks.lib.applet.main.host.AppHost;
import com.finogeeks.lib.applet.modules.ext.ContextKt;
import com.finogeeks.lib.applet.modules.log.FLog;
import com.finogeeks.lib.applet.modules.report.model.EventKt;
import com.finogeeks.lib.applet.page.view.CapsuleView;
import com.finogeeks.lib.applet.page.view.NavigationBar;
import com.finogeeks.lib.applet.page.view.moremenu.AbsMoreMenu;
import com.finogeeks.lib.applet.page.view.webview.FinHTMLWebLayout;
import com.finogeeks.lib.applet.sdk.api.CapsuleHandler;
import com.finogeeks.lib.applet.utils.b1;
import com.finogeeks.lib.applet.widget.OrientationListenLayout;
import hh0.l;
import java.io.File;
import java.net.URL;
import java.nio.charset.Charset;
import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.g0;
import kotlin.jvm.internal.n;
import kotlin.jvm.internal.p;
import kotlin.jvm.internal.y;
import lg0.t;
import org.json.JSONObject;
@Metadata(d1 = {"\u0000r\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0010\b\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u000b\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0015\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\b\u0006\n\u0002\u0018\u0002\n\u0002\b\u0007\n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0010\u000e\n\u0002\b\f\n\u0002\u0018\u0002\n\u0002\b\u0006\u0018\u00002\u00020\u0001:\u0001XB\u0017\u0012\u0006\u0010\u0003\u001a\u00020\u0002\u0012\u0006\u0010\u0005\u001a\u00020\u0004¢\u0006\u0004\b\u0006\u0010\u0007J\u0017\u0010\u000b\u001a\u00020\n2\u0006\u0010\t\u001a\u00020\bH\u0016¢\u0006\u0004\b\u000b\u0010\fJ\u0019\u0010\u0012\u001a\u0004\u0018\u00010\u000f2\u0006\u0010\u000e\u001a\u00020\rH\u0000¢\u0006\u0004\b\u0010\u0010\u0011J\u0017\u0010\u0013\u001a\u00020\n2\u0006\u0010\t\u001a\u00020\bH\u0002¢\u0006\u0004\b\u0013\u0010\fJ\u000f\u0010\u0016\u001a\u00020\nH\u0000¢\u0006\u0004\b\u0014\u0010\u0015J\u000f\u0010\u0018\u001a\u00020\nH\u0000¢\u0006\u0004\b\u0017\u0010\u0015J\u000f\u0010\u0019\u001a\u00020\nH\u0002¢\u0006\u0004\b\u0019\u0010\u0015J\u000f\u0010\u001b\u001a\u00020\nH\u0000¢\u0006\u0004\b\u001a\u0010\u0015J\u000f\u0010\u001d\u001a\u00020\nH\u0000¢\u0006\u0004\b\u001c\u0010\u0015J\u0017\u0010\u001f\u001a\u00020\n2\u0006\u0010\u001e\u001a\u00020\bH\u0002¢\u0006\u0004\b\u001f\u0010\fJ\u0017\u0010 \u001a\u00020\n2\u0006\u0010\u001e\u001a\u00020\bH\u0002¢\u0006\u0004\b \u0010\fJ\u000f\u0010\"\u001a\u00020\nH\u0000¢\u0006\u0004\b!\u0010\u0015J\u0017\u0010\"\u001a\u00020\n2\u0006\u0010\u001e\u001a\u00020\bH\u0002¢\u0006\u0004\b\"\u0010\fJ\u000f\u0010#\u001a\u00020\nH\u0002¢\u0006\u0004\b#\u0010\u0015J\u000f\u0010$\u001a\u00020\nH\u0002¢\u0006\u0004\b$\u0010\u0015R\u0014\u0010&\u001a\u00020%8\u0002X\u0082\u0004¢\u0006\u0006\n\u0004\b&\u0010'R\u0014\u0010\u0005\u001a\u00020\u00048\u0002X\u0082\u0004¢\u0006\u0006\n\u0004\b\u0005\u0010(R\u0014\u0010*\u001a\u00020)8\u0002X\u0082\u0004¢\u0006\u0006\n\u0004\b*\u0010+R\u0014\u0010\u0003\u001a\u00020\u00028\u0002X\u0082\u0004¢\u0006\u0006\n\u0004\b\u0003\u0010,R#\u00103\u001a\n .*\u0004\u0018\u00010-0-8BX\u0082\u0084\u0002¢\u0006\f\n\u0004\b/\u00100\u001a\u0004\b1\u00102R\u001b\u00108\u001a\u0002048@X\u0080\u0084\u0002¢\u0006\f\n\u0004\b5\u00100\u001a\u0004\b6\u00107R\u0016\u00109\u001a\u00020\r8\u0002@\u0002X\u0082\u000e¢\u0006\u0006\n\u0004\b9\u0010:R\u0016\u0010;\u001a\u00020\r8\u0002@\u0002X\u0082\u000e¢\u0006\u0006\n\u0004\b;\u0010:R\u001b\u0010@\u001a\u00020<8BX\u0082\u0084\u0002¢\u0006\f\n\u0004\b=\u00100\u001a\u0004\b>\u0010?R#\u0010E\u001a\n .*\u0004\u0018\u00010A0A8BX\u0082\u0084\u0002¢\u0006\f\n\u0004\bB\u00100\u001a\u0004\bC\u0010DR\"\u0010G\u001a\u00020F8\u0006@\u0006X\u0086\u000e¢\u0006\u0012\n\u0004\bG\u0010H\u001a\u0004\bI\u0010J\"\u0004\bK\u0010LR$\u0010M\u001a\u0004\u0018\u00010F8\u0006@\u0006X\u0086\u000e¢\u0006\u0012\n\u0004\bM\u0010H\u001a\u0004\bN\u0010J\"\u0004\bO\u0010LR#\u0010R\u001a\n .*\u0004\u0018\u00010F0F8BX\u0082\u0084\u0002¢\u0006\f\n\u0004\bP\u00100\u001a\u0004\bQ\u0010JR\u001b\u0010W\u001a\u00020S8@X\u0080\u0084\u0002¢\u0006\f\n\u0004\bT\u00100\u001a\u0004\bU\u0010V¨\u0006Y"}, d2 = {"Lcom/finogeeks/lib/applet/main/offlineweb/OfflineWebManager;", "Lcom/finogeeks/lib/applet/widget/OrientationListenLayout$OnOrientationChangedListener;", "Lcom/finogeeks/lib/applet/main/host/AppHost;", "appHost", "Lcom/finogeeks/lib/applet/api/ApisManager;", "apisManager", "<init>", "(Lcom/finogeeks/lib/applet/main/host/AppHost;Lcom/finogeeks/lib/applet/api/ApisManager;)V", "", "orientation", "Llg0/e0;", "onOrientationChanged", "(I)V", "", "wholePage", "Landroid/graphics/Bitmap;", "captureContentAsBitmap$finapplet_release", "(Z)Landroid/graphics/Bitmap;", "captureContentAsBitmap", "changeMoreMenuLayoutByOrientation", "changeMoreMenuVisibility$finapplet_release", "()V", "changeMoreMenuVisibility", "destroy$finapplet_release", "destroy", "initMoreMenu", "initView$finapplet_release", "initView", "loadContent$finapplet_release", "loadContent", "frontColor", "refreshCapsuleView", "refreshNavigationBar", "refreshStatusBar$finapplet_release", "refreshStatusBar", "setNavigationBarLayout", "updateNavigationBackBtn", "Lcom/finogeeks/lib/applet/main/FinAppHomeActivity;", "activity", "Lcom/finogeeks/lib/applet/main/FinAppHomeActivity;", "Lcom/finogeeks/lib/applet/api/ApisManager;", "Lcom/finogeeks/lib/applet/config/AppConfig;", "appConfig", "Lcom/finogeeks/lib/applet/config/AppConfig;", "Lcom/finogeeks/lib/applet/main/host/AppHost;", "Lcom/finogeeks/lib/applet/page/view/CapsuleView;", "kotlin.jvm.PlatformType", "capsuleView$delegate", "Llg0/h;", "getCapsuleView", "()Lcom/finogeeks/lib/applet/page/view/CapsuleView;", "capsuleView", "Landroid/view/ViewGroup;", "container$delegate", "getContainer$finapplet_release", "()Landroid/view/ViewGroup;", "container", "isMoreMenuInitialized", "Z", "isPageLoaded", "Lcom/finogeeks/lib/applet/page/view/moremenu/AbsMoreMenu;", "moreMenu$delegate", "getMoreMenu", "()Lcom/finogeeks/lib/applet/page/view/moremenu/AbsMoreMenu;", "moreMenu", "Lcom/finogeeks/lib/applet/page/view/NavigationBar;", "navigationBar$delegate", "getNavigationBar", "()Lcom/finogeeks/lib/applet/page/view/NavigationBar;", "navigationBar", "", "originUrl", "Ljava/lang/String;", "getOriginUrl", "()Ljava/lang/String;", "setOriginUrl", "(Ljava/lang/String;)V", "startUrl", "getStartUrl", "setStartUrl", "title$delegate", "getTitle", "title", "Lcom/finogeeks/lib/applet/page/view/webview/FinHTMLWebLayout;", "webLayout$delegate", "getWebLayout$finapplet_release", "()Lcom/finogeeks/lib/applet/page/view/webview/FinHTMLWebLayout;", "webLayout", "Companion", "finapplet_release"}, k = 1, mv = {1, 4, 0})
public final class OfflineWebManager implements OrientationListenLayout.a {
static final l[] o = {g0.j(new y(g0.b(OfflineWebManager.class), "title", "getTitle()Ljava/lang/String;")), g0.j(new y(g0.b(OfflineWebManager.class), "container", "getContainer$finapplet_release()Landroid/view/ViewGroup;")), g0.j(new y(g0.b(OfflineWebManager.class), "navigationBar", "getNavigationBar()Lcom/finogeeks/lib/applet/page/view/NavigationBar;")), g0.j(new y(g0.b(OfflineWebManager.class), "webLayout", "getWebLayout$finapplet_release()Lcom/finogeeks/lib/applet/page/view/webview/FinHTMLWebLayout;")), g0.j(new y(g0.b(OfflineWebManager.class), "capsuleView", "getCapsuleView()Lcom/finogeeks/lib/applet/page/view/CapsuleView;")), g0.j(new y(g0.b(OfflineWebManager.class), "moreMenu", "getMoreMenu()Lcom/finogeeks/lib/applet/page/view/moremenu/AbsMoreMenu;"))};
private final FinAppHomeActivity a;
private final AppConfig b;
private final lg0.h c;
private final lg0.h d;
private final lg0.h e;
private final lg0.h f;
private final lg0.h g;
private final lg0.h h;
private boolean i;
private boolean j;
private String k;
private String l;
private final AppHost m;
private final com.finogeeks.lib.applet.api.d n;
public static final class a {
private a() {
}
public a(DefaultConstructorMarker defaultConstructorMarker) {
this();
}
}
public static final class b extends p implements ah0.a<CapsuleView> {
public b() {
super(0);
}
public final CapsuleView m466invoke() {
return (CapsuleView) OfflineWebManager.this.a.findViewById(R.id.capsuleView);
}
}
public static final class c extends p implements ah0.a<ViewGroup> {
public c() {
super(0);
}
public final ViewGroup m467invoke() {
View inflate = OfflineWebManager.this.a.getLayoutInflater().inflate(R.layout.fin_applet_offline_web, (ViewGroup) OfflineWebManager.this.m.l(), false);
if (inflate == null) {
throw new t("null cannot be cast to non-null type android.view.ViewGroup");
}
ViewGroup viewGroup = (ViewGroup) inflate;
int i = R.id.navigationBar;
((NavigationBar) viewGroup.findViewById(i)).setAdaptToCapsule(true);
((NavigationBar) viewGroup.findViewById(i)).setLeftButtonVisible(false);
return viewGroup;
}
}
public static final class d implements AbsMoreMenu.b {
@Override
public String a() {
return "";
}
@Override
public int b() {
return 0;
}
@Override
public String c() {
return "";
}
}
public static final class e implements View.OnClickListener {
public e() {
}
@Override
public final void onClick(View view) {
CapsuleHandler capsuleHandler = FinAppProcessClient.INSTANCE.getCapsuleHandler();
if (capsuleHandler != null) {
capsuleHandler.onMoreButtonClick(OfflineWebManager.this.a, OfflineWebManager.this.m.getAppId(), new CapsuleHandler.MoreButtonClickHandler(OfflineWebManager.this.m));
} else {
OfflineWebManager.this.a();
}
}
}
public static final class f implements View.OnClickListener {
public f() {
}
@Override
public final void onClick(View view) {
OfflineWebManager.this.f().g();
}
}
public static final class g implements a0 {
public g() {
}
public final d1 onApplyWindowInsets(View view, d1 d1Var) {
n.e(d1Var, "insets");
int l = d1Var.l();
if (ContextKt.isHideLandscapeStatusBar(OfflineWebManager.this.a, OfflineWebManager.this.m.getFinAppConfig().getUiConfig())) {
l = 0;
}
n.e(view, "v");
view.setPadding(view.getPaddingLeft(), l, view.getPaddingRight(), view.getPaddingBottom());
return d1Var;
}
}
public static final class h extends p implements ah0.a<AbsMoreMenu> {
public h() {
super(0);
}
public final AbsMoreMenu m468invoke() {
return AbsMoreMenu.v.a(OfflineWebManager.this.m);
}
}
public static final class i extends p implements ah0.a<NavigationBar> {
public i() {
super(0);
}
public final NavigationBar m469invoke() {
return (NavigationBar) OfflineWebManager.this.c().findViewById(R.id.navigationBar);
}
}
public static final class j extends p implements ah0.a<String> {
public j() {
super(0);
}
public final String invoke() {
return OfflineWebManager.this.b.getNavigationBarTitleText(null);
}
}
@Metadata(bv = {1, 0, 3}, d1 = {"\u0000\b\n\u0000\n\u0002\u0018\u0002\n\u0000\u0010\u0000\u001a\u00020\u0001H\n¢\u0006\u0002\b\u0002"}, d2 = {"<anonymous>", "Lcom/finogeeks/lib/applet/page/view/webview/FinHTMLWebLayout;", "invoke"}, k = 3, mv = {1, 1, 16})
public static final class k extends p implements ah0.a<FinHTMLWebLayout> {
public static final class a implements FinHTMLWebLayout.a {
public a() {
}
@Override
public void a() {
OfflineWebManager.this.p();
}
@Override
public void a(String str) {
n.j(str, "title");
String m = OfflineWebManager.this.m();
n.e(m, "[email protected]");
if (m.length() == 0) {
OfflineWebManager.this.l().setTitle(str);
}
}
}
public k() {
super(0);
}
public final FinHTMLWebLayout m471invoke() {
return new FinHTMLWebLayout(OfflineWebManager.this.m, OfflineWebManager.this.n, (com.finogeeks.lib.applet.api.g) null, (com.finogeeks.lib.applet.page.view.webview.h) null, new a());
}
}
static {
new a(null);
}
public OfflineWebManager(AppHost appHost, com.finogeeks.lib.applet.api.d dVar) {
n.j(appHost, "appHost");
n.j(dVar, "apisManager");
this.m = appHost;
this.n = dVar;
this.a = appHost.getK();
this.b = appHost.getAppConfig();
this.c = lg0.i.a(new j());
this.d = lg0.i.a(new c());
this.e = lg0.i.a(new i());
this.f = lg0.i.a(new k());
this.g = lg0.i.a(new b());
this.h = lg0.i.a(new h());
this.l = "https://finofflineweb.com";
}
private final void a(int i2) {
if (this.i) {
k().b(i2);
ViewGroup.LayoutParams layoutParams = k().getLayoutParams();
if (layoutParams == null) {
throw new t("null cannot be cast to non-null type android.widget.RelativeLayout.LayoutParams");
}
RelativeLayout.LayoutParams layoutParams2 = (RelativeLayout.LayoutParams) layoutParams;
boolean isFloatModel = this.m.getFinAppConfig().isFloatModel();
if (i2 == 1 || isFloatModel) {
layoutParams2.addRule(6, R.id.webContainer);
} else {
layoutParams2.removeRule(6);
}
k().setLayoutParams(layoutParams2);
}
}
private final void b(int i2) {
com.finogeeks.lib.applet.page.b.a(j(), i2);
j().a(!this.b.isHideNavigationBarMoreButton(null), !this.b.isHideNavigationBarCloseButton(null));
l().a(j(), (ImageButton) null);
}
private final void c(int i2) {
com.finogeeks.lib.applet.page.b.a(this.m.getFinAppConfig(), l(), i2);
l().setBackgroundColor(com.finogeeks.lib.applet.page.b.a(this.b, (String) null));
l().setTitle(m());
}
private final void d(int i2) {
com.finogeeks.lib.applet.page.b.a(this.m, this.b.getWindowNavigationStyle(), this.b.getWindowFullscreen(), i2);
}
private final CapsuleView j() {
lg0.h hVar = this.g;
l lVar = o[4];
return (CapsuleView) hVar.getValue();
}
private final AbsMoreMenu k() {
lg0.h hVar = this.h;
l lVar = o[5];
return (AbsMoreMenu) hVar.getValue();
}
public final NavigationBar l() {
lg0.h hVar = this.e;
l lVar = o[2];
return (NavigationBar) hVar.getValue();
}
public final String m() {
lg0.h hVar = this.c;
l lVar = o[0];
return (String) hVar.getValue();
}
private final void n() {
if (this.i) {
return;
}
this.i = true;
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(-1, -1);
layoutParams.addRule(12, -1);
c().addView(k(), layoutParams);
k().setMoreMenuListener(new d());
a(ContextKt.screenOrientation(this.a));
}
private final void o() {
boolean windowFullscreen = this.b.getWindowFullscreen();
String windowNavigationStyle = this.b.getWindowNavigationStyle();
if (windowFullscreen || n.d(AppConfig.NAVIGATION_STYLE_CUSTOM, windowNavigationStyle) || n.d(AppConfig.NAVIGATION_STYLE_CUSTOM_V2, windowNavigationStyle)) {
l().setNavigationStyle(windowNavigationStyle);
NavigationBar l = l();
n.e(l, "navigationBar");
l.setVisibility(8);
return;
}
if (n.d(AppConfig.NAVIGATION_STYLE_DEFAULT, windowNavigationStyle)) {
l().setNavigationStyle(AppConfig.NAVIGATION_STYLE_DEFAULT);
NavigationBar l2 = l();
n.e(l2, "navigationBar");
l2.setVisibility(0);
return;
}
l().setNavigationStyle(AppConfig.NAVIGATION_STYLE_HIDE);
NavigationBar l3 = l();
n.e(l3, "navigationBar");
l3.setVisibility(8);
CapsuleView j2 = j();
n.e(j2, "capsuleView");
j2.setVisibility(8);
}
public final void p() {
if (f().d()) {
l().setLeftButtonVisible(true);
} else {
l().setLeftButtonVisible(false);
}
}
public final Bitmap a(boolean z10) {
return com.finogeeks.lib.applet.modules.ext.g.a(f().getWebView(), z10);
}
public final void a() {
n();
k().a();
}
public final void b() {
f().getWebView().destroy();
}
public final ViewGroup c() {
lg0.h hVar = this.d;
l lVar = o[1];
return (ViewGroup) hVar.getValue();
}
public final String getL() {
return this.l;
}
public final String getK() {
return this.k;
}
public final FinHTMLWebLayout f() {
lg0.h hVar = this.f;
l lVar = o[3];
return (FinHTMLWebLayout) hVar.getValue();
}
public final void g() {
j().setOnMoreButtonClickListener(new e());
l().setOnLeftButtonClickListener(new f());
n0.J0(l(), new g());
n0.p0(l());
ViewGroup c2 = c();
int i2 = R.id.webContainer;
((OrientationListenLayout) c2.findViewById(i2)).setOnOrientationChangedListener(this);
((OrientationListenLayout) c().findViewById(i2)).addView(f(), -1, -1);
}
public final void h() {
boolean z10;
String miniAppSourcePath = this.b.getMiniAppSourcePath(this.a);
boolean a2 = com.finogeeks.lib.applet.m.a.a.a(this.m.getAppId());
if (a2) {
b1.c(this.m, "web.json");
}
File file = new File(miniAppSourcePath + "/web.json");
if (file.exists()) {
this.b.initConfig(this.a, this.m, yg0.l.l(file, (Charset) null, 1, (Object) null));
z10 = true;
} else {
z10 = false;
}
int b2 = com.finogeeks.lib.applet.page.b.b(this.b, (String) null);
d(b2);
if (z10) {
o();
c(b2);
}
b(b2);
if (a2) {
b1.c(this.m, "packageExtConfig.json");
}
File file2 = new File(miniAppSourcePath + "/packageExtConfig.json");
if (!file2.exists()) {
FLog.e$default("OfflineWebManager", "loadContent config file not exists", null, 4, null);
return;
}
JSONObject jSONObject = new JSONObject(yg0.l.l(file2, (Charset) null, 1, (Object) null));
String optString = jSONObject.optString("miniprogramRoot");
String optString2 = jSONObject.optString("entryFile");
String optString3 = jSONObject.optString("queryParams");
try {
String optString4 = jSONObject.optString("originUrl", "https://finofflineweb.com");
n.e(optString4, "oriUrl");
if (optString4.length() > 0) {
URL url = new URL(optString4);
String protocol = url.getProtocol();
if (!n.d(protocol, "https") && !n.d(protocol, "http")) {
FLog.e$default("OfflineWebManager", "originUrl protocol is not http/https", null, 4, null);
}
this.l = protocol + "://" + url.getAuthority();
}
} catch (Exception e2) {
FLog.e("OfflineWebManager", "originUrl format error", e2);
}
FLog.d$default("OfflineWebManager", "loadContent miniprogramRoot:" + optString + " entryFile:" + optString2 + " queryParams:" + optString3 + " originUrl:" + this.l, null, 4, null);
StringBuilder sb = new StringBuilder();
sb.append(miniAppSourcePath);
sb.append('/');
sb.append(optString);
File file3 = new File(sb.toString(), optString2);
StringBuilder sb2 = new StringBuilder();
sb2.append(this.l);
sb2.append("/finofflineweb");
sb2.append(file3.getAbsolutePath());
String sb3 = sb2.toString();
n.e(optString3, "queryParams");
if (optString3.length() > 0) {
sb3 = sb3 + '?' + optString3;
}
f().getWebView().loadUrl(sb3);
this.k = sb3;
if (this.j) {
return;
}
FLog.d$default("OfflineWebManager", "transitionToSuccessState, cold start", null, 4, null);
this.j = true;
this.m.I();
this.m.q().h().a(EventKt.APPLET_START_TYPE_COLD, "", null);
}
public final void i() {
d(com.finogeeks.lib.applet.page.b.b(this.b, (String) null));
}
@Override
public void onOrientationChanged(int orientation) {
a(orientation);
}
}