- 28,932 files - Full Java source code - Smali files - Resources Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
473 lines
21 KiB
Java
473 lines
21 KiB
Java
package com.vungle.ads.internal.ui;
|
|
|
|
import android.R;
|
|
import android.app.Activity;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.IntentFilter;
|
|
import android.content.res.Configuration;
|
|
import android.os.Bundle;
|
|
import android.view.MotionEvent;
|
|
import android.widget.FrameLayout;
|
|
import androidx.annotation.VisibleForTesting;
|
|
import androidx.core.view.ViewCompat;
|
|
import androidx.core.view.WindowCompat;
|
|
import androidx.core.view.WindowInsetsCompat;
|
|
import androidx.core.view.WindowInsetsControllerCompat;
|
|
import com.google.android.gms.drive.DriveFile;
|
|
import com.vungle.ads.AdCantPlayWithoutWebView;
|
|
import com.vungle.ads.AdConfig;
|
|
import com.vungle.ads.AdNotLoadedCantPlay;
|
|
import com.vungle.ads.ConcurrentPlaybackUnsupported;
|
|
import com.vungle.ads.ServiceLocator;
|
|
import com.vungle.ads.internal.ConfigManager;
|
|
import com.vungle.ads.internal.executor.Executors;
|
|
import com.vungle.ads.internal.executor.VungleThreadPoolExecutor;
|
|
import com.vungle.ads.internal.model.AdPayload;
|
|
import com.vungle.ads.internal.model.BidPayload;
|
|
import com.vungle.ads.internal.model.Placement;
|
|
import com.vungle.ads.internal.model.UnclosedAd;
|
|
import com.vungle.ads.internal.omsdk.OMTracker;
|
|
import com.vungle.ads.internal.platform.Platform;
|
|
import com.vungle.ads.internal.presenter.AdEventListener;
|
|
import com.vungle.ads.internal.presenter.MRAIDPresenter;
|
|
import com.vungle.ads.internal.presenter.PresenterDelegate;
|
|
import com.vungle.ads.internal.signals.SignalManager;
|
|
import com.vungle.ads.internal.ui.view.MRAIDAdWidget;
|
|
import com.vungle.ads.internal.util.Logger;
|
|
import com.vungle.ads.internal.util.RingerModeReceiver;
|
|
import kotlin.Lazy;
|
|
import kotlin.LazyKt__LazyJVMKt;
|
|
import kotlin.LazyThreadSafetyMode;
|
|
import kotlin.jvm.functions.Function0;
|
|
import kotlin.jvm.internal.DefaultConstructorMarker;
|
|
import kotlin.jvm.internal.Intrinsics;
|
|
|
|
/* loaded from: classes4.dex */
|
|
public abstract class AdActivity extends Activity {
|
|
public static final Companion Companion = new Companion(null);
|
|
public static final String REQUEST_KEY_EVENT_ID_EXTRA = "request_eventId";
|
|
public static final String REQUEST_KEY_EXTRA = "request";
|
|
private static final String TAG = "AdActivity";
|
|
private static AdPayload advertisement;
|
|
private static BidPayload bidPayload;
|
|
private static AdEventListener eventListener;
|
|
private static PresenterDelegate presenterDelegate;
|
|
private MRAIDAdWidget mraidAdWidget;
|
|
private MRAIDPresenter mraidPresenter;
|
|
private String placementRefId = "";
|
|
private final RingerModeReceiver ringerModeReceiver = new RingerModeReceiver();
|
|
private UnclosedAd unclosedAd;
|
|
|
|
@VisibleForTesting
|
|
public static /* synthetic */ void getMraidAdWidget$vungle_ads_release$annotations() {
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public static /* synthetic */ void getMraidPresenter$vungle_ads_release$annotations() {
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public static /* synthetic */ void getPlacementRefId$vungle_ads_release$annotations() {
|
|
}
|
|
|
|
@VisibleForTesting(otherwise = 4)
|
|
public boolean canRotate$vungle_ads_release() {
|
|
return false;
|
|
}
|
|
|
|
public final MRAIDAdWidget getMraidAdWidget$vungle_ads_release() {
|
|
return this.mraidAdWidget;
|
|
}
|
|
|
|
public final MRAIDPresenter getMraidPresenter$vungle_ads_release() {
|
|
return this.mraidPresenter;
|
|
}
|
|
|
|
public final String getPlacementRefId$vungle_ads_release() {
|
|
return this.placementRefId;
|
|
}
|
|
|
|
public final void setMraidAdWidget$vungle_ads_release(MRAIDAdWidget mRAIDAdWidget) {
|
|
this.mraidAdWidget = mRAIDAdWidget;
|
|
}
|
|
|
|
public final void setMraidPresenter$vungle_ads_release(MRAIDPresenter mRAIDPresenter) {
|
|
this.mraidPresenter = mRAIDPresenter;
|
|
}
|
|
|
|
public final void setPlacementRefId$vungle_ads_release(String str) {
|
|
Intrinsics.checkNotNullParameter(str, "<set-?>");
|
|
this.placementRefId = str;
|
|
}
|
|
|
|
@Override // android.app.Activity
|
|
public void onCreate(Bundle bundle) {
|
|
final Lazy lazy;
|
|
Lazy lazy2;
|
|
Lazy lazy3;
|
|
Lazy lazy4;
|
|
String watermark$vungle_ads_release;
|
|
super.onCreate(bundle);
|
|
requestWindowFeature(1);
|
|
getWindow().setFlags(16777216, 16777216);
|
|
Companion companion = Companion;
|
|
Intent intent = getIntent();
|
|
Intrinsics.checkNotNullExpressionValue(intent, "intent");
|
|
String valueOf = String.valueOf(companion.getPlacement(intent));
|
|
this.placementRefId = valueOf;
|
|
AdPayload adPayload = advertisement;
|
|
ConfigManager configManager = ConfigManager.INSTANCE;
|
|
Placement placement = configManager.getPlacement(valueOf);
|
|
if (placement == null || adPayload == null) {
|
|
AdEventListener adEventListener = eventListener;
|
|
if (adEventListener != null) {
|
|
adEventListener.onError(new AdNotLoadedCantPlay(), this.placementRefId);
|
|
}
|
|
finish();
|
|
return;
|
|
}
|
|
getWindow().getDecorView().setBackgroundColor(ViewCompat.MEASURED_STATE_MASK);
|
|
try {
|
|
MRAIDAdWidget mRAIDAdWidget = new MRAIDAdWidget(this);
|
|
ServiceLocator.Companion companion2 = ServiceLocator.Companion;
|
|
LazyThreadSafetyMode lazyThreadSafetyMode = LazyThreadSafetyMode.SYNCHRONIZED;
|
|
lazy = LazyKt__LazyJVMKt.lazy(lazyThreadSafetyMode, new Function0() { // from class: com.vungle.ads.internal.ui.AdActivity$onCreate$$inlined$inject$1
|
|
/* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
|
|
{
|
|
super(0);
|
|
}
|
|
|
|
/* JADX WARN: Type inference failed for: r0v2, types: [com.vungle.ads.internal.signals.SignalManager, java.lang.Object] */
|
|
@Override // kotlin.jvm.functions.Function0
|
|
public final SignalManager invoke() {
|
|
return ServiceLocator.Companion.getInstance(this).getService(SignalManager.class);
|
|
}
|
|
});
|
|
Intent intent2 = getIntent();
|
|
Intrinsics.checkNotNullExpressionValue(intent2, "intent");
|
|
String eventId = companion.getEventId(intent2);
|
|
UnclosedAd unclosedAd = eventId != null ? new UnclosedAd(eventId, (String) null, 2, (DefaultConstructorMarker) null) : null;
|
|
this.unclosedAd = unclosedAd;
|
|
if (unclosedAd != null) {
|
|
m3977onCreate$lambda2(lazy).recordUnclosedAd(unclosedAd);
|
|
}
|
|
mRAIDAdWidget.setCloseDelegate(new MRAIDAdWidget.CloseDelegate() { // from class: com.vungle.ads.internal.ui.AdActivity$onCreate$5$1
|
|
@Override // com.vungle.ads.internal.ui.view.MRAIDAdWidget.CloseDelegate
|
|
public void close() {
|
|
UnclosedAd unclosedAd2;
|
|
SignalManager m3977onCreate$lambda2;
|
|
unclosedAd2 = AdActivity.this.unclosedAd;
|
|
if (unclosedAd2 != null) {
|
|
m3977onCreate$lambda2 = AdActivity.m3977onCreate$lambda2(lazy);
|
|
m3977onCreate$lambda2.removeUnclosedAd(unclosedAd2);
|
|
}
|
|
AdActivity.this.finish();
|
|
}
|
|
});
|
|
mRAIDAdWidget.setOnViewTouchListener(new MRAIDAdWidget.OnViewTouchListener() { // from class: com.vungle.ads.internal.ui.AdActivity$onCreate$5$2
|
|
@Override // com.vungle.ads.internal.ui.view.MRAIDAdWidget.OnViewTouchListener
|
|
public boolean onTouch(MotionEvent motionEvent) {
|
|
MRAIDPresenter mraidPresenter$vungle_ads_release = AdActivity.this.getMraidPresenter$vungle_ads_release();
|
|
if (mraidPresenter$vungle_ads_release == null) {
|
|
return false;
|
|
}
|
|
mraidPresenter$vungle_ads_release.onViewTouched(motionEvent);
|
|
return false;
|
|
}
|
|
});
|
|
mRAIDAdWidget.setOrientationDelegate(new MRAIDAdWidget.OrientationDelegate() { // from class: com.vungle.ads.internal.ui.AdActivity$onCreate$5$3
|
|
@Override // com.vungle.ads.internal.ui.view.MRAIDAdWidget.OrientationDelegate
|
|
public void setOrientation(int i) {
|
|
AdActivity.this.setRequestedOrientation(i);
|
|
}
|
|
});
|
|
lazy2 = LazyKt__LazyJVMKt.lazy(lazyThreadSafetyMode, new Function0() { // from class: com.vungle.ads.internal.ui.AdActivity$onCreate$$inlined$inject$2
|
|
/* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
|
|
{
|
|
super(0);
|
|
}
|
|
|
|
/* JADX WARN: Type inference failed for: r0v2, types: [com.vungle.ads.internal.executor.Executors, java.lang.Object] */
|
|
@Override // kotlin.jvm.functions.Function0
|
|
public final Executors invoke() {
|
|
return ServiceLocator.Companion.getInstance(this).getService(Executors.class);
|
|
}
|
|
});
|
|
lazy3 = LazyKt__LazyJVMKt.lazy(lazyThreadSafetyMode, new Function0() { // from class: com.vungle.ads.internal.ui.AdActivity$onCreate$$inlined$inject$3
|
|
/* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
|
|
{
|
|
super(0);
|
|
}
|
|
|
|
/* JADX WARN: Type inference failed for: r0v2, types: [com.vungle.ads.internal.platform.Platform, java.lang.Object] */
|
|
@Override // kotlin.jvm.functions.Function0
|
|
public final Platform invoke() {
|
|
return ServiceLocator.Companion.getInstance(this).getService(Platform.class);
|
|
}
|
|
});
|
|
VungleWebClient vungleWebClient = new VungleWebClient(adPayload, placement, m3978onCreate$lambda6(lazy2).getOffloadExecutor(), m3977onCreate$lambda2(lazy), m3979onCreate$lambda7(lazy3));
|
|
lazy4 = LazyKt__LazyJVMKt.lazy(lazyThreadSafetyMode, new Function0() { // from class: com.vungle.ads.internal.ui.AdActivity$onCreate$$inlined$inject$4
|
|
/* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
|
|
{
|
|
super(0);
|
|
}
|
|
|
|
/* JADX WARN: Type inference failed for: r0v2, types: [com.vungle.ads.internal.omsdk.OMTracker$Factory, java.lang.Object] */
|
|
@Override // kotlin.jvm.functions.Function0
|
|
public final OMTracker.Factory invoke() {
|
|
return ServiceLocator.Companion.getInstance(this).getService(OMTracker.Factory.class);
|
|
}
|
|
});
|
|
OMTracker make = m3980onCreate$lambda8(lazy4).make(configManager.omEnabled() && adPayload.omEnabled());
|
|
VungleThreadPoolExecutor jobExecutor = m3978onCreate$lambda6(lazy2).getJobExecutor();
|
|
vungleWebClient.setWebViewObserver(make);
|
|
this.ringerModeReceiver.setWebClient(vungleWebClient);
|
|
MRAIDPresenter mRAIDPresenter = new MRAIDPresenter(mRAIDAdWidget, adPayload, placement, vungleWebClient, jobExecutor, make, bidPayload, m3979onCreate$lambda7(lazy3));
|
|
mRAIDPresenter.setEventListener(eventListener);
|
|
mRAIDPresenter.setPresenterDelegate$vungle_ads_release(presenterDelegate);
|
|
mRAIDPresenter.prepare();
|
|
setContentView(mRAIDAdWidget, mRAIDAdWidget.getLayoutParams());
|
|
AdConfig adConfig = adPayload.getAdConfig();
|
|
if (adConfig != null && (watermark$vungle_ads_release = adConfig.getWatermark$vungle_ads_release()) != null) {
|
|
WatermarkView watermarkView = new WatermarkView(this, watermark$vungle_ads_release);
|
|
((FrameLayout) getWindow().getDecorView().findViewById(R.id.content)).addView(watermarkView);
|
|
watermarkView.bringToFront();
|
|
}
|
|
this.mraidAdWidget = mRAIDAdWidget;
|
|
this.mraidPresenter = mRAIDPresenter;
|
|
} catch (InstantiationException unused) {
|
|
AdEventListener adEventListener2 = eventListener;
|
|
if (adEventListener2 != null) {
|
|
AdCantPlayWithoutWebView adCantPlayWithoutWebView = new AdCantPlayWithoutWebView();
|
|
adCantPlayWithoutWebView.setPlacementId$vungle_ads_release(this.placementRefId);
|
|
AdPayload adPayload2 = advertisement;
|
|
adCantPlayWithoutWebView.setEventId$vungle_ads_release(adPayload2 != null ? adPayload2.eventId() : null);
|
|
AdPayload adPayload3 = advertisement;
|
|
adCantPlayWithoutWebView.setCreativeId$vungle_ads_release(adPayload3 != null ? adPayload3.getCreativeId() : null);
|
|
adEventListener2.onError(adCantPlayWithoutWebView.logError$vungle_ads_release(), this.placementRefId);
|
|
}
|
|
finish();
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
/* renamed from: onCreate$lambda-2, reason: not valid java name */
|
|
public static final SignalManager m3977onCreate$lambda2(Lazy lazy) {
|
|
return (SignalManager) lazy.getValue();
|
|
}
|
|
|
|
/* renamed from: onCreate$lambda-6, reason: not valid java name */
|
|
private static final Executors m3978onCreate$lambda6(Lazy lazy) {
|
|
return (Executors) lazy.getValue();
|
|
}
|
|
|
|
/* renamed from: onCreate$lambda-7, reason: not valid java name */
|
|
private static final Platform m3979onCreate$lambda7(Lazy lazy) {
|
|
return (Platform) lazy.getValue();
|
|
}
|
|
|
|
/* renamed from: onCreate$lambda-8, reason: not valid java name */
|
|
private static final OMTracker.Factory m3980onCreate$lambda8(Lazy lazy) {
|
|
return (OMTracker.Factory) lazy.getValue();
|
|
}
|
|
|
|
@Override // android.app.Activity
|
|
public void onNewIntent(Intent intent) {
|
|
Intrinsics.checkNotNullParameter(intent, "intent");
|
|
super.onNewIntent(intent);
|
|
Companion companion = Companion;
|
|
Intent intent2 = getIntent();
|
|
Intrinsics.checkNotNullExpressionValue(intent2, "getIntent()");
|
|
String placement = companion.getPlacement(intent2);
|
|
String placement2 = companion.getPlacement(intent);
|
|
Intent intent3 = getIntent();
|
|
Intrinsics.checkNotNullExpressionValue(intent3, "getIntent()");
|
|
String eventId = companion.getEventId(intent3);
|
|
String eventId2 = companion.getEventId(intent);
|
|
if ((placement == null || placement2 == null || Intrinsics.areEqual(placement, placement2)) && (eventId == null || eventId2 == null || Intrinsics.areEqual(eventId, eventId2))) {
|
|
return;
|
|
}
|
|
Logger.Companion.d(TAG, "Tried to play another placement " + placement2 + " while playing " + placement);
|
|
onConcurrentPlaybackError(placement2);
|
|
}
|
|
|
|
private final void onConcurrentPlaybackError(String str) {
|
|
ConcurrentPlaybackUnsupported concurrentPlaybackUnsupported = new ConcurrentPlaybackUnsupported();
|
|
AdEventListener adEventListener = eventListener;
|
|
if (adEventListener != null) {
|
|
adEventListener.onError(concurrentPlaybackUnsupported, str);
|
|
}
|
|
concurrentPlaybackUnsupported.setPlacementId(this.placementRefId);
|
|
AdPayload adPayload = advertisement;
|
|
concurrentPlaybackUnsupported.setCreativeId(adPayload != null ? adPayload.getCreativeId() : null);
|
|
AdPayload adPayload2 = advertisement;
|
|
concurrentPlaybackUnsupported.setEventId(adPayload2 != null ? adPayload2.eventId() : null);
|
|
concurrentPlaybackUnsupported.logErrorNoReturnValue$vungle_ads_release();
|
|
Logger.Companion.e(TAG, "onConcurrentPlaybackError: " + concurrentPlaybackUnsupported.getLocalizedMessage());
|
|
}
|
|
|
|
@Override // android.app.Activity
|
|
public void onResume() {
|
|
super.onResume();
|
|
hideSystemUi();
|
|
registerReceiver(this.ringerModeReceiver, new IntentFilter("android.media.RINGER_MODE_CHANGED"));
|
|
Logger.Companion.d(TAG, "registerReceiver(): " + this.ringerModeReceiver.hashCode());
|
|
MRAIDPresenter mRAIDPresenter = this.mraidPresenter;
|
|
if (mRAIDPresenter != null) {
|
|
mRAIDPresenter.start();
|
|
}
|
|
}
|
|
|
|
@Override // android.app.Activity
|
|
public void onPause() {
|
|
super.onPause();
|
|
unregisterReceiver(this.ringerModeReceiver);
|
|
Logger.Companion.d(TAG, "unregisterReceiver(): " + this.ringerModeReceiver.hashCode());
|
|
MRAIDPresenter mRAIDPresenter = this.mraidPresenter;
|
|
if (mRAIDPresenter != null) {
|
|
mRAIDPresenter.stop();
|
|
}
|
|
}
|
|
|
|
@Override // android.app.Activity, android.content.ComponentCallbacks
|
|
public void onConfigurationChanged(Configuration newConfig) {
|
|
Intrinsics.checkNotNullParameter(newConfig, "newConfig");
|
|
try {
|
|
super.onConfigurationChanged(newConfig);
|
|
int i = newConfig.orientation;
|
|
if (i == 2) {
|
|
Logger.Companion.d(TAG, "landscape");
|
|
} else if (i == 1) {
|
|
Logger.Companion.d(TAG, "portrait");
|
|
}
|
|
MRAIDPresenter mRAIDPresenter = this.mraidPresenter;
|
|
if (mRAIDPresenter != null) {
|
|
mRAIDPresenter.onViewConfigurationChanged();
|
|
}
|
|
} catch (Exception e) {
|
|
Logger.Companion.e(TAG, "onConfigurationChanged: " + e.getLocalizedMessage());
|
|
}
|
|
}
|
|
|
|
@Override // android.app.Activity
|
|
public void onBackPressed() {
|
|
MRAIDPresenter mRAIDPresenter = this.mraidPresenter;
|
|
if (mRAIDPresenter != null) {
|
|
mRAIDPresenter.handleExit();
|
|
}
|
|
}
|
|
|
|
@Override // android.app.Activity
|
|
public void setRequestedOrientation(int i) {
|
|
if (canRotate$vungle_ads_release()) {
|
|
super.setRequestedOrientation(i);
|
|
}
|
|
}
|
|
|
|
@Override // android.app.Activity
|
|
public void onDestroy() {
|
|
MRAIDPresenter mRAIDPresenter = this.mraidPresenter;
|
|
if (mRAIDPresenter != null) {
|
|
mRAIDPresenter.detach((isChangingConfigurations() ? 1 : 0) | 2);
|
|
}
|
|
super.onDestroy();
|
|
}
|
|
|
|
private final void hideSystemUi() {
|
|
WindowInsetsControllerCompat insetsController = WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());
|
|
Intrinsics.checkNotNullExpressionValue(insetsController, "getInsetsController(window, window.decorView)");
|
|
insetsController.setSystemBarsBehavior(2);
|
|
insetsController.hide(WindowInsetsCompat.Type.systemBars());
|
|
}
|
|
|
|
public static final class Companion {
|
|
public /* synthetic */ Companion(DefaultConstructorMarker defaultConstructorMarker) {
|
|
this();
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public static /* synthetic */ void getREQUEST_KEY_EVENT_ID_EXTRA$vungle_ads_release$annotations() {
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public static /* synthetic */ void getREQUEST_KEY_EXTRA$vungle_ads_release$annotations() {
|
|
}
|
|
|
|
private Companion() {
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public final AdEventListener getEventListener$vungle_ads_release() {
|
|
return AdActivity.eventListener;
|
|
}
|
|
|
|
public final void setEventListener$vungle_ads_release(AdEventListener adEventListener) {
|
|
AdActivity.eventListener = adEventListener;
|
|
}
|
|
|
|
public final PresenterDelegate getPresenterDelegate$vungle_ads_release() {
|
|
return AdActivity.presenterDelegate;
|
|
}
|
|
|
|
public final void setPresenterDelegate$vungle_ads_release(PresenterDelegate presenterDelegate) {
|
|
AdActivity.presenterDelegate = presenterDelegate;
|
|
}
|
|
|
|
public final AdPayload getAdvertisement$vungle_ads_release() {
|
|
return AdActivity.advertisement;
|
|
}
|
|
|
|
public final void setAdvertisement$vungle_ads_release(AdPayload adPayload) {
|
|
AdActivity.advertisement = adPayload;
|
|
}
|
|
|
|
public final BidPayload getBidPayload$vungle_ads_release() {
|
|
return AdActivity.bidPayload;
|
|
}
|
|
|
|
public final void setBidPayload$vungle_ads_release(BidPayload bidPayload) {
|
|
AdActivity.bidPayload = bidPayload;
|
|
}
|
|
|
|
public final Intent createIntent(Context context, String placement, String str) {
|
|
Intrinsics.checkNotNullParameter(placement, "placement");
|
|
Intent intent = new Intent(context, (Class<?>) VungleActivity.class);
|
|
if (!(context instanceof Activity)) {
|
|
intent.addFlags(DriveFile.MODE_READ_ONLY);
|
|
}
|
|
Bundle bundle = new Bundle();
|
|
bundle.putString("request", placement);
|
|
bundle.putString(AdActivity.REQUEST_KEY_EVENT_ID_EXTRA, str);
|
|
intent.putExtras(bundle);
|
|
return intent;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public final String getPlacement(Intent intent) {
|
|
try {
|
|
Bundle extras = intent.getExtras();
|
|
if (extras != null) {
|
|
return extras.getString("request");
|
|
}
|
|
return null;
|
|
} catch (Exception unused) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public final String getEventId(Intent intent) {
|
|
try {
|
|
Bundle extras = intent.getExtras();
|
|
if (extras != null) {
|
|
return extras.getString(AdActivity.REQUEST_KEY_EVENT_ID_EXTRA);
|
|
}
|
|
return null;
|
|
} catch (Exception unused) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|