cloudx-react-native 3.4.7 → 3.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/cloudxreactnative/CloudXAdEvents.kt +11 -5
  3. package/android/src/main/java/com/cloudxreactnative/CloudXAdInfo.kt +14 -0
  4. package/android/src/main/java/com/cloudxreactnative/CloudXAdView.kt +9 -15
  5. package/android/src/main/java/com/cloudxreactnative/CloudXAdViewEvent.kt +1 -1
  6. package/android/src/main/java/com/cloudxreactnative/CloudXModuleImpl.kt +202 -0
  7. package/android/src/newarch/com/cloudxreactnative/CloudXModule.kt +7 -0
  8. package/android/src/oldarch/com/cloudxreactnative/CloudXModule.kt +7 -0
  9. package/cloudx-react-native.podspec +3 -3
  10. package/ios/CloudX.h +2 -2
  11. package/ios/CloudX.mm +284 -9
  12. package/ios/CloudXAdView.h +10 -12
  13. package/ios/CloudXAdView.mm +10 -15
  14. package/ios/CloudXAdViewManager.h +6 -6
  15. package/ios/CloudXAdViewManager.mm +4 -4
  16. package/lib/commonjs/CloudX.js +5 -1
  17. package/lib/commonjs/CloudX.js.map +1 -1
  18. package/lib/commonjs/CloudXAdViewBase.js +11 -9
  19. package/lib/commonjs/CloudXAdViewBase.js.map +1 -1
  20. package/lib/commonjs/CloudXAppOpenAd.js +98 -0
  21. package/lib/commonjs/CloudXAppOpenAd.js.map +1 -0
  22. package/lib/commonjs/CloudXBannerView.js +2 -2
  23. package/lib/commonjs/CloudXMRECView.js +2 -2
  24. package/lib/commonjs/hooks.js +81 -0
  25. package/lib/commonjs/hooks.js.map +1 -1
  26. package/lib/commonjs/index.js +37 -0
  27. package/lib/commonjs/index.js.map +1 -1
  28. package/lib/commonjs/specs/CloudXAdViewNativeComponent.js +1 -1
  29. package/lib/commonjs/specs/NativeCloudX.js.map +1 -1
  30. package/lib/commonjs/types/AppOpenAd.js +6 -0
  31. package/lib/commonjs/types/AppOpenAd.js.map +1 -0
  32. package/lib/commonjs/types/Arbiter.js +6 -0
  33. package/lib/commonjs/types/Arbiter.js.map +1 -1
  34. package/lib/commonjs/types/RevenueData.js +21 -0
  35. package/lib/commonjs/types/RevenueData.js.map +1 -0
  36. package/lib/commonjs/types/index.js +17 -0
  37. package/lib/commonjs/types/index.js.map +1 -1
  38. package/lib/commonjs/version.js +1 -1
  39. package/lib/module/CloudX.js +5 -1
  40. package/lib/module/CloudX.js.map +1 -1
  41. package/lib/module/CloudXAdViewBase.js +11 -9
  42. package/lib/module/CloudXAdViewBase.js.map +1 -1
  43. package/lib/module/CloudXAppOpenAd.js +91 -0
  44. package/lib/module/CloudXAppOpenAd.js.map +1 -0
  45. package/lib/module/CloudXBannerView.js +2 -2
  46. package/lib/module/CloudXMRECView.js +2 -2
  47. package/lib/module/hooks.js +80 -0
  48. package/lib/module/hooks.js.map +1 -1
  49. package/lib/module/index.js +7 -1
  50. package/lib/module/index.js.map +1 -1
  51. package/lib/module/specs/CloudXAdViewNativeComponent.js +1 -1
  52. package/lib/module/specs/NativeCloudX.js.map +1 -1
  53. package/lib/module/types/AppOpenAd.js +2 -0
  54. package/lib/module/types/AppOpenAd.js.map +1 -0
  55. package/lib/module/types/Arbiter.js +6 -0
  56. package/lib/module/types/Arbiter.js.map +1 -1
  57. package/lib/module/types/RevenueData.js +15 -0
  58. package/lib/module/types/RevenueData.js.map +1 -0
  59. package/lib/module/types/index.js +1 -1
  60. package/lib/module/types/index.js.map +1 -1
  61. package/lib/module/version.js +1 -1
  62. package/lib/typescript/src/CloudX.d.ts.map +1 -1
  63. package/lib/typescript/src/CloudXAdViewBase.d.ts +1 -1
  64. package/lib/typescript/src/CloudXAdViewBase.d.ts.map +1 -1
  65. package/lib/typescript/src/CloudXAppOpenAd.d.ts +4 -0
  66. package/lib/typescript/src/CloudXAppOpenAd.d.ts.map +1 -0
  67. package/lib/typescript/src/CloudXBannerView.d.ts +2 -2
  68. package/lib/typescript/src/CloudXMRECView.d.ts +2 -2
  69. package/lib/typescript/src/hooks.d.ts +14 -0
  70. package/lib/typescript/src/hooks.d.ts.map +1 -1
  71. package/lib/typescript/src/index.d.ts +6 -3
  72. package/lib/typescript/src/index.d.ts.map +1 -1
  73. package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts +1 -1
  74. package/lib/typescript/src/specs/NativeCloudX.d.ts +13 -0
  75. package/lib/typescript/src/specs/NativeCloudX.d.ts.map +1 -1
  76. package/lib/typescript/src/types/AppOpenAd.d.ts +8 -0
  77. package/lib/typescript/src/types/AppOpenAd.d.ts.map +1 -0
  78. package/lib/typescript/src/types/Arbiter.d.ts +12 -2
  79. package/lib/typescript/src/types/Arbiter.d.ts.map +1 -1
  80. package/lib/typescript/src/types/CloudX.d.ts +6 -0
  81. package/lib/typescript/src/types/CloudX.d.ts.map +1 -1
  82. package/lib/typescript/src/types/RevenueData.d.ts +32 -0
  83. package/lib/typescript/src/types/RevenueData.d.ts.map +1 -0
  84. package/lib/typescript/src/types/index.d.ts +4 -1
  85. package/lib/typescript/src/types/index.d.ts.map +1 -1
  86. package/lib/typescript/src/version.d.ts +1 -1
  87. package/package.json +6 -2
  88. package/src/CloudX.ts +6 -0
  89. package/src/CloudXAdViewBase.tsx +12 -11
  90. package/src/CloudXAppOpenAd.ts +109 -0
  91. package/src/CloudXBannerView.tsx +2 -2
  92. package/src/CloudXMRECView.tsx +2 -2
  93. package/src/hooks.ts +103 -0
  94. package/src/index.ts +18 -2
  95. package/src/specs/CloudXAdViewNativeComponent.ts +1 -1
  96. package/src/specs/NativeCloudX.ts +22 -0
  97. package/src/types/AppOpenAd.ts +8 -0
  98. package/src/types/Arbiter.ts +20 -2
  99. package/src/types/CloudX.ts +7 -0
  100. package/src/types/RevenueData.ts +39 -0
  101. package/src/types/index.ts +4 -0
  102. package/src/version.ts +1 -1
package/ios/CloudX.mm CHANGED
@@ -6,6 +6,7 @@
6
6
  #import "CloudX.h"
7
7
  #import "CloudXExtraParameters.h"
8
8
  #import <React/RCTUtils.h>
9
+ #import <math.h>
9
10
 
10
11
 
11
12
  @interface UIColor (CLXUtils)
@@ -58,6 +59,7 @@
58
59
 
59
60
  // Fullscreen ad storage — lazily created on first load/show, keyed by ad unit ID.
60
61
  @property (nonatomic, strong) NSMutableDictionary<NSString *, CLXInterstitial *> *interstitials;
62
+ @property (nonatomic, strong) NSMutableDictionary<NSString *, CLXAppOpen *> *appOpenAds;
61
63
  @property (nonatomic, strong) NSMutableDictionary<NSString *, CLXRewarded *> *rewardedAds;
62
64
 
63
65
  // Overlay banner/MREC state — each ad unit ID owns exactly one CLXBannerAdView,
@@ -108,6 +110,14 @@ static NSString *const ON_INTERSTITIAL_DISPLAY_FAILED_EVENT = @"OnInterstitialD
108
110
  static NSString *const ON_INTERSTITIAL_HIDDEN_EVENT = @"OnInterstitialHiddenEvent";
109
111
  static NSString *const ON_INTERSTITIAL_AD_REVENUE_PAID = @"OnInterstitialAdRevenuePaid";
110
112
 
113
+ static NSString *const ON_APPOPEN_LOADED_EVENT = @"OnAppOpenLoadedEvent";
114
+ static NSString *const ON_APPOPEN_LOAD_FAILED_EVENT = @"OnAppOpenLoadFailedEvent";
115
+ static NSString *const ON_APPOPEN_CLICKED_EVENT = @"OnAppOpenClickedEvent";
116
+ static NSString *const ON_APPOPEN_DISPLAYED_EVENT = @"OnAppOpenDisplayedEvent";
117
+ static NSString *const ON_APPOPEN_DISPLAY_FAILED_EVENT = @"OnAppOpenDisplayFailedEvent";
118
+ static NSString *const ON_APPOPEN_HIDDEN_EVENT = @"OnAppOpenHiddenEvent";
119
+ static NSString *const ON_APPOPEN_AD_REVENUE_PAID = @"OnAppOpenAdRevenuePaid";
120
+
111
121
  static NSString *const ON_REWARDED_AD_LOADED_EVENT = @"OnRewardedAdLoadedEvent";
112
122
  static NSString *const ON_REWARDED_AD_LOAD_FAILED_EVENT = @"OnRewardedAdLoadFailedEvent";
113
123
  static NSString *const ON_REWARDED_AD_CLICKED_EVENT = @"OnRewardedAdClickedEvent";
@@ -130,6 +140,7 @@ static NSString *const BOTTOM_RIGHT = @"bottom_right";
130
140
  static NSString *const ARBITER_PLATFORM_CLOUDX = @"CLOUDX";
131
141
  static NSString *const ARBITER_PLATFORM_LEVELPLAY = @"LEVELPLAY";
132
142
  static NSString *const ARBITER_PLATFORM_PUBMATIC = @"PUBMATIC";
143
+ static NSString *const ARBITER_PLATFORM_CUSTOM = @"CUSTOM";
133
144
 
134
145
  static CloudX *CloudXShared;
135
146
 
@@ -158,6 +169,7 @@ RCT_EXPORT_MODULE(CloudX)
158
169
  CloudXShared = self;
159
170
 
160
171
  self.interstitials = [NSMutableDictionary dictionaryWithCapacity: 2];
172
+ self.appOpenAds = [NSMutableDictionary dictionaryWithCapacity: 2];
161
173
  self.rewardedAds = [NSMutableDictionary dictionaryWithCapacity: 2];
162
174
 
163
175
  self.adViews = [NSMutableDictionary dictionaryWithCapacity: 2];
@@ -284,6 +296,20 @@ RCT_EXPORT_METHOD(arbiter:(NSDictionary<NSString *, id> *)configuration resolve:
284
296
  }];
285
297
  }
286
298
 
299
+ #pragma mark - Publisher-reported Revenue
300
+
301
+ RCT_EXPORT_METHOD(reportRevenueData:(NSDictionary<NSString *, id> *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
302
+ {
303
+ CLXRevenueData *revenueData = [self revenueDataFromDictionary: data];
304
+ if ( !revenueData )
305
+ {
306
+ resolve(@(NO));
307
+ return;
308
+ }
309
+
310
+ resolve(@([[CloudXCore shared] reportRevenueData: revenueData]));
311
+ }
312
+
287
313
  #pragma mark - Banners
288
314
 
289
315
  RCT_EXPORT_METHOD(createBanner:(NSString *)adUnitIdentifier position:(NSString *)bannerPosition)
@@ -474,6 +500,60 @@ RCT_EXPORT_METHOD(destroyInterstitial:(NSString *)adUnitIdentifier)
474
500
  }
475
501
  }
476
502
 
503
+ #pragma mark - App Open
504
+
505
+ RCT_EXPORT_METHOD(loadAppOpen:(NSString *)adUnitIdentifier)
506
+ {
507
+ [self log: @"loadAppOpen called from JS — adUnitId: %@", adUnitIdentifier];
508
+ CLXAppOpen *appOpen = [self retrieveAppOpenForAdUnitIdentifier: adUnitIdentifier];
509
+ [appOpen load];
510
+ }
511
+
512
+ RCT_EXPORT_METHOD(setAppOpenExtraParameters:(NSString *)adUnitIdentifier extraParameters:(NSDictionary<NSString *, id> *)extraParameters)
513
+ {
514
+ CLXAppOpen *appOpen = [self retrieveAppOpenForAdUnitIdentifier: adUnitIdentifier];
515
+ [CloudXExtraParameters applyExtraParameters: extraParameters toFullscreenAd: appOpen logBlock:^(NSString *message) {
516
+ [self log: @"%@", message];
517
+ }];
518
+ }
519
+
520
+ RCT_EXPORT_METHOD(isAppOpenReady:(NSString *)adUnitIdentifier resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
521
+ {
522
+ CLXAppOpen *appOpen = [self retrieveAppOpenForAdUnitIdentifier: adUnitIdentifier];
523
+ resolve(@([appOpen isReady]));
524
+ }
525
+
526
+ RCT_EXPORT_METHOD(showAppOpen:(NSString *)adUnitIdentifier placement:(nullable NSString *)placement customData:(nullable NSString *)customData)
527
+ {
528
+ UIViewController *vc = [self topViewController];
529
+ if ( !vc )
530
+ {
531
+ [self log: @"showAppOpen: no visible view controller — emitting display failure"];
532
+ NSDictionary *body = @{@"adUnitId": adUnitIdentifier ?: @"",
533
+ @"code": @(-1),
534
+ @"message": @"No visible view controller to present app open ad from"};
535
+ [self sendReactNativeEventWithName: ON_APPOPEN_DISPLAY_FAILED_EVENT body: body];
536
+ return;
537
+ }
538
+
539
+ CLXAppOpen *appOpen = [self retrieveAppOpenForAdUnitIdentifier: adUnitIdentifier];
540
+ [appOpen showFromViewController: vc placement: placement customData: customData];
541
+ }
542
+
543
+ RCT_EXPORT_METHOD(destroyAppOpen:(NSString *)adUnitIdentifier)
544
+ {
545
+ [self log: @"Destroying app open ad with ad unit identifier \"%@\"", adUnitIdentifier];
546
+
547
+ CLXAppOpen *appOpen = self.appOpenAds[adUnitIdentifier];
548
+ if ( appOpen )
549
+ {
550
+ appOpen.delegate = nil;
551
+ appOpen.revenueDelegate = nil;
552
+ [appOpen destroy];
553
+ [self.appOpenAds removeObjectForKey: adUnitIdentifier];
554
+ }
555
+ }
556
+
477
557
  #pragma mark - Rewarded
478
558
 
479
559
  RCT_EXPORT_METHOD(loadRewarded:(NSString *)adUnitIdentifier)
@@ -553,6 +633,10 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
553
633
  {
554
634
  name = ON_INTERSTITIAL_LOADED_EVENT;
555
635
  }
636
+ else if ( adFormat == CLXAdFormatAppOpen )
637
+ {
638
+ name = ON_APPOPEN_LOADED_EVENT;
639
+ }
556
640
  else if ( adFormat == CLXAdFormatRewarded )
557
641
  {
558
642
  name = ON_REWARDED_AD_LOADED_EVENT;
@@ -580,6 +664,11 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
580
664
  [self sendReactNativeEventWithName: ON_INTERSTITIAL_LOAD_FAILED_EVENT
581
665
  body: [self adLoadFailedInfoForAd: key withError: error]];
582
666
  }
667
+ for ( NSString *key in self.appOpenAds )
668
+ {
669
+ [self sendReactNativeEventWithName: ON_APPOPEN_LOAD_FAILED_EVENT
670
+ body: [self adLoadFailedInfoForAd: key withError: error]];
671
+ }
583
672
  for ( NSString *key in self.rewardedAds )
584
673
  {
585
674
  [self sendReactNativeEventWithName: ON_REWARDED_AD_LOAD_FAILED_EVENT
@@ -598,14 +687,18 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
598
687
  {
599
688
  name = ON_INTERSTITIAL_LOAD_FAILED_EVENT;
600
689
  }
690
+ else if ( self.appOpenAds[adUnitId] )
691
+ {
692
+ name = ON_APPOPEN_LOAD_FAILED_EVENT;
693
+ }
601
694
  else if ( self.rewardedAds[adUnitId] )
602
695
  {
603
696
  name = ON_REWARDED_AD_LOAD_FAILED_EVENT;
604
697
  }
605
698
  else
606
699
  {
607
- [self log: @"didFailToLoadAd — adUnitId '%@' not found in any dictionary (keys: adViews=%@, interstitials=%@, rewardedAds=%@)",
608
- adUnitId, self.adViews.allKeys, self.interstitials.allKeys, self.rewardedAds.allKeys];
700
+ [self log: @"didFailToLoadAd — adUnitId '%@' not found in any dictionary (keys: adViews=%@, interstitials=%@, appOpenAds=%@, rewardedAds=%@)",
701
+ adUnitId, self.adViews.allKeys, self.interstitials.allKeys, self.appOpenAds.allKeys, self.rewardedAds.allKeys];
609
702
  return;
610
703
  }
611
704
 
@@ -630,6 +723,10 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
630
723
  {
631
724
  name = ON_INTERSTITIAL_CLICKED_EVENT;
632
725
  }
726
+ else if ( adFormat == CLXAdFormatAppOpen )
727
+ {
728
+ name = ON_APPOPEN_CLICKED_EVENT;
729
+ }
633
730
  else if ( adFormat == CLXAdFormatRewarded )
634
731
  {
635
732
  name = ON_REWARDED_AD_CLICKED_EVENT;
@@ -648,13 +745,17 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
648
745
  {
649
746
  dispatch_async(dispatch_get_main_queue(), ^{
650
747
  CLXAdFormat adFormat = ad.adFormat;
651
- if ( adFormat != CLXAdFormatInterstitial && adFormat != CLXAdFormatRewarded ) return;
748
+ if ( adFormat != CLXAdFormatInterstitial && adFormat != CLXAdFormatAppOpen && adFormat != CLXAdFormatRewarded ) return;
652
749
 
653
750
  NSString *name;
654
751
  if ( adFormat == CLXAdFormatInterstitial )
655
752
  {
656
753
  name = ON_INTERSTITIAL_DISPLAYED_EVENT;
657
754
  }
755
+ else if ( adFormat == CLXAdFormatAppOpen )
756
+ {
757
+ name = ON_APPOPEN_DISPLAYED_EVENT;
758
+ }
658
759
  else
659
760
  {
660
761
  name = ON_REWARDED_AD_DISPLAYED_EVENT;
@@ -668,13 +769,17 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
668
769
  {
669
770
  dispatch_async(dispatch_get_main_queue(), ^{
670
771
  CLXAdFormat adFormat = ad.adFormat;
671
- if ( adFormat != CLXAdFormatInterstitial && adFormat != CLXAdFormatRewarded ) return;
772
+ if ( adFormat != CLXAdFormatInterstitial && adFormat != CLXAdFormatAppOpen && adFormat != CLXAdFormatRewarded ) return;
672
773
 
673
774
  NSString *name;
674
775
  if ( adFormat == CLXAdFormatInterstitial )
675
776
  {
676
777
  name = ON_INTERSTITIAL_DISPLAY_FAILED_EVENT;
677
778
  }
779
+ else if ( adFormat == CLXAdFormatAppOpen )
780
+ {
781
+ name = ON_APPOPEN_DISPLAY_FAILED_EVENT;
782
+ }
678
783
  else
679
784
  {
680
785
  name = ON_REWARDED_AD_DISPLAY_FAILED_EVENT;
@@ -688,13 +793,17 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
688
793
  {
689
794
  dispatch_async(dispatch_get_main_queue(), ^{
690
795
  CLXAdFormat adFormat = ad.adFormat;
691
- if ( adFormat != CLXAdFormatInterstitial && adFormat != CLXAdFormatRewarded ) return;
796
+ if ( adFormat != CLXAdFormatInterstitial && adFormat != CLXAdFormatAppOpen && adFormat != CLXAdFormatRewarded ) return;
692
797
 
693
798
  NSString *name;
694
799
  if ( adFormat == CLXAdFormatInterstitial )
695
800
  {
696
801
  name = ON_INTERSTITIAL_HIDDEN_EVENT;
697
802
  }
803
+ else if ( adFormat == CLXAdFormatAppOpen )
804
+ {
805
+ name = ON_APPOPEN_HIDDEN_EVENT;
806
+ }
698
807
  else
699
808
  {
700
809
  name = ON_REWARDED_AD_HIDDEN_EVENT;
@@ -751,6 +860,10 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
751
860
  {
752
861
  name = ON_INTERSTITIAL_AD_REVENUE_PAID;
753
862
  }
863
+ else if ( adFormat == CLXAdFormatAppOpen )
864
+ {
865
+ name = ON_APPOPEN_AD_REVENUE_PAID;
866
+ }
754
867
  else if ( adFormat == CLXAdFormatRewarded )
755
868
  {
756
869
  name = ON_REWARDED_AD_REVENUE_PAID;
@@ -1108,6 +1221,21 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
1108
1221
  return result;
1109
1222
  }
1110
1223
 
1224
+ - (CLXAppOpen *)retrieveAppOpenForAdUnitIdentifier:(NSString *)adUnitIdentifier
1225
+ {
1226
+ CLXAppOpen *result = self.appOpenAds[adUnitIdentifier];
1227
+ if ( !result )
1228
+ {
1229
+ result = [[CloudXCore shared] createAppOpenWithAdUnitId: adUnitIdentifier];
1230
+ result.delegate = self;
1231
+ result.revenueDelegate = self;
1232
+
1233
+ self.appOpenAds[adUnitIdentifier] = result;
1234
+ }
1235
+
1236
+ return result;
1237
+ }
1238
+
1111
1239
  - (CLXRewarded *)retrieveRewardedAdForAdUnitIdentifier:(NSString *)adUnitIdentifier
1112
1240
  {
1113
1241
  CLXRewarded *result = self.rewardedAds[adUnitIdentifier];
@@ -1457,6 +1585,107 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
1457
1585
  return vc;
1458
1586
  }
1459
1587
 
1588
+ - (nullable CLXRevenueData *)revenueDataFromDictionary:(NSDictionary<NSString *, id> *)dictionary
1589
+ {
1590
+ if ( ![dictionary isKindOfClass: [NSDictionary class]] )
1591
+ {
1592
+ [self log: @"reportRevenueData: ignoring data with missing or invalid required fields"];
1593
+ return nil;
1594
+ }
1595
+
1596
+ NSString *platform = [self stringValueFromDictionary: dictionary key: @"platform"];
1597
+ NSNumber *revenueNumber = [self revenueNumberValueFromDictionary: dictionary key: @"revenue"];
1598
+ NSString *adFormat = [self stringValueFromDictionary: dictionary key: @"adFormat"];
1599
+ CLXRevenuePlatform revenuePlatform = [self revenuePlatformFromString: platform];
1600
+ if ( !revenuePlatform || !revenueNumber || [self isBlankString: adFormat] )
1601
+ {
1602
+ [self log: @"reportRevenueData: ignoring data with missing or invalid required fields"];
1603
+ return nil;
1604
+ }
1605
+
1606
+ double revenue = revenueNumber.doubleValue;
1607
+ if ( !isfinite(revenue) )
1608
+ {
1609
+ [self log: @"reportRevenueData: ignoring data with non-finite revenue=%@", revenueNumber];
1610
+ return nil;
1611
+ }
1612
+
1613
+ return [CLXRevenueData revenueDataWithPlatform: revenuePlatform
1614
+ revenue: revenue
1615
+ adFormat: adFormat
1616
+ builderBlock:^(CLXRevenueDataBuilder *builder) {
1617
+ builder.currencyCode = [self nonBlankStringValueFromDictionary: dictionary key: @"currencyCode"];
1618
+ builder.precision = [self revenuePrecisionFromString: [self stringValueFromDictionary: dictionary key: @"precision"]];
1619
+ builder.networkName = [self nonBlankStringValueFromDictionary: dictionary key: @"networkName"];
1620
+ builder.adUnitId = [self nonBlankStringValueFromDictionary: dictionary key: @"adUnitId"];
1621
+ builder.thirdPartyAdPlacementId = [self nonBlankStringValueFromDictionary: dictionary key: @"thirdPartyAdPlacementId"];
1622
+ builder.creativeId = [self nonBlankStringValueFromDictionary: dictionary key: @"creativeId"];
1623
+ builder.networkPlacement = [self nonBlankStringValueFromDictionary: dictionary key: @"networkPlacement"];
1624
+ builder.countryCode = [self nonBlankStringValueFromDictionary: dictionary key: @"countryCode"];
1625
+ builder.userSegment = [self nonBlankStringValueFromDictionary: dictionary key: @"userSegment"];
1626
+ }];
1627
+ }
1628
+
1629
+ - (nullable CLXRevenuePlatform)revenuePlatformFromString:(nullable NSString *)platform
1630
+ {
1631
+ if ( !platform )
1632
+ {
1633
+ return nil;
1634
+ }
1635
+
1636
+ NSString *trimmedPlatform = [platform stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
1637
+ if ( trimmedPlatform.length == 0 )
1638
+ {
1639
+ return nil;
1640
+ }
1641
+
1642
+ if ( [trimmedPlatform caseInsensitiveCompare: CLXRevenuePlatformAdMob] == NSOrderedSame )
1643
+ {
1644
+ return CLXRevenuePlatformAdMob;
1645
+ }
1646
+
1647
+ if ( [trimmedPlatform caseInsensitiveCompare: CLXRevenuePlatformInMobi] == NSOrderedSame )
1648
+ {
1649
+ return CLXRevenuePlatformInMobi;
1650
+ }
1651
+
1652
+ return CLXRevenuePlatformCustom(trimmedPlatform);
1653
+ }
1654
+
1655
+ - (nullable NSString *)nonBlankStringValueFromDictionary:(NSDictionary<NSString *, id> *)dictionary key:(NSString *)key
1656
+ {
1657
+ NSString *value = [self stringValueFromDictionary: dictionary key: key];
1658
+ return [self isBlankString: value] ? nil : value;
1659
+ }
1660
+
1661
+ - (nullable NSNumber *)revenueNumberValueFromDictionary:(NSDictionary<NSString *, id> *)dictionary key:(NSString *)key
1662
+ {
1663
+ id value = dictionary[key];
1664
+ if ( ![value isKindOfClass: [NSNumber class]] ) return nil;
1665
+ if ( CFGetTypeID((__bridge CFTypeRef)value) == CFBooleanGetTypeID() ) return nil;
1666
+ return value;
1667
+ }
1668
+
1669
+ - (BOOL)isBlankString:(nullable NSString *)value
1670
+ {
1671
+ if ( ![value isKindOfClass: [NSString class]] ) return YES;
1672
+ return [value stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]].length == 0;
1673
+ }
1674
+
1675
+ - (nullable CLXRevenuePrecision *)revenuePrecisionFromString:(nullable NSString *)value
1676
+ {
1677
+ if ( !value ) return nil;
1678
+
1679
+ NSString *lower = [value lowercaseString];
1680
+ if ( [lower isEqualToString: @"exact"] ) return CLXRevenuePrecision.exact;
1681
+ if ( [lower isEqualToString: @"estimated"] ) return CLXRevenuePrecision.estimated;
1682
+ if ( [lower isEqualToString: @"publisher_defined"] ) return CLXRevenuePrecision.publisherDefined;
1683
+ if ( [lower isEqualToString: @"undefined"] ) return CLXRevenuePrecision.undefined;
1684
+
1685
+ [self log: @"reportRevenueData: ignoring unknown precision=%@", value];
1686
+ return nil;
1687
+ }
1688
+
1460
1689
  - (CLXLogLevel)logLevelFromString:(NSString *)level
1461
1690
  {
1462
1691
  NSString *lower = [level lowercaseString];
@@ -1559,6 +1788,10 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
1559
1788
  {
1560
1789
  return [self pubMaticArbiterBidFromDictionary: dictionary];
1561
1790
  }
1791
+ if ( [platform isEqualToString: ARBITER_PLATFORM_CUSTOM] )
1792
+ {
1793
+ return [self customArbiterBidFromDictionary: dictionary];
1794
+ }
1562
1795
  return nil;
1563
1796
  }
1564
1797
 
@@ -1622,12 +1855,32 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
1622
1855
  extras: [self stringMapFromDictionaryValue: dictionary[@"extras"]]];
1623
1856
  }
1624
1857
 
1858
+ - (nullable CLXArbiterBid *)customArbiterBidFromDictionary:(NSDictionary<NSString *, id> *)dictionary
1859
+ {
1860
+ NSString *platformName = [self stringValueFromDictionary: dictionary key: @"platformName"];
1861
+ NSNumber *revenuePerImpressionUSD = [self numberValueFromDictionary: dictionary key: @"revenuePerImpressionUSD"];
1862
+ NSString *precision = [self stringValueFromDictionary: dictionary key: @"precision"];
1863
+ if ( platformName.length == 0 || !revenuePerImpressionUSD || precision.length == 0 )
1864
+ {
1865
+ [self log: @"arbiter: ignoring CUSTOM bid with missing required fields"];
1866
+ return nil;
1867
+ }
1868
+
1869
+ NSString *networkName = [self optionalStringValueFromDictionary: dictionary key: @"networkName"] ?: @"";
1870
+ return [CLXArbiterBid customBidWithPlatformName: platformName
1871
+ networkName: networkName
1872
+ revenuePerImpressionUSD: revenuePerImpressionUSD.doubleValue
1873
+ precision: [CLXArbiterPrecision precisionWithName: precision]
1874
+ extras: [self stringMapFromDictionaryValue: dictionary[@"extras"]]];
1875
+ }
1876
+
1625
1877
  - (NSDictionary<NSString *, id> *)arbiterResultInfoForResult:(CLXArbiterResult *)result
1626
1878
  {
1627
- return @{@"id": result.identifier ?: @"",
1628
- @"platform": result.platform.name ?: @"NONE",
1629
- @"bidId": result.bidId ?: [NSNull null],
1630
- @"extras": result.extras ?: @{}};
1879
+ return @{@"id": result.identifier ?: @"",
1880
+ @"platform": result.platform.name ?: @"NONE",
1881
+ @"platformName": result.platformName ?: @"NONE",
1882
+ @"bidId": result.bidId ?: [NSNull null],
1883
+ @"extras": result.extras ?: @{}};
1631
1884
  }
1632
1885
 
1633
1886
  - (nullable NSString *)stringValueFromDictionary:(NSDictionary<NSString *, id> *)dictionary key:(NSString *)key
@@ -1691,6 +1944,11 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
1691
1944
  *result = CLXAdFormatInterstitial;
1692
1945
  return YES;
1693
1946
  }
1947
+ if ( [upper isEqualToString: @"APP_OPEN"] )
1948
+ {
1949
+ *result = CLXAdFormatAppOpen;
1950
+ return YES;
1951
+ }
1694
1952
  if ( [upper isEqualToString: @"REWARDED"] )
1695
1953
  {
1696
1954
  *result = CLXAdFormatRewarded;
@@ -1711,6 +1969,7 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
1711
1969
  case CLXAdFormatBanner: return @"BANNER";
1712
1970
  case CLXAdFormatMREC: return @"MREC";
1713
1971
  case CLXAdFormatInterstitial: return @"INTERSTITIAL";
1972
+ case CLXAdFormatAppOpen: return @"APP_OPEN";
1714
1973
  case CLXAdFormatRewarded: return @"REWARDED";
1715
1974
  default: return @"";
1716
1975
  }
@@ -1747,6 +2006,14 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
1747
2006
  ON_INTERSTITIAL_HIDDEN_EVENT,
1748
2007
  ON_INTERSTITIAL_AD_REVENUE_PAID,
1749
2008
 
2009
+ ON_APPOPEN_LOADED_EVENT,
2010
+ ON_APPOPEN_LOAD_FAILED_EVENT,
2011
+ ON_APPOPEN_CLICKED_EVENT,
2012
+ ON_APPOPEN_DISPLAYED_EVENT,
2013
+ ON_APPOPEN_DISPLAY_FAILED_EVENT,
2014
+ ON_APPOPEN_HIDDEN_EVENT,
2015
+ ON_APPOPEN_AD_REVENUE_PAID,
2016
+
1750
2017
  ON_REWARDED_AD_LOADED_EVENT,
1751
2018
  ON_REWARDED_AD_LOAD_FAILED_EVENT,
1752
2019
  ON_REWARDED_AD_CLICKED_EVENT,
@@ -1781,6 +2048,14 @@ RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitIdentifier)
1781
2048
  @"ON_INTERSTITIAL_HIDDEN_EVENT": ON_INTERSTITIAL_HIDDEN_EVENT,
1782
2049
  @"ON_INTERSTITIAL_AD_REVENUE_PAID": ON_INTERSTITIAL_AD_REVENUE_PAID,
1783
2050
 
2051
+ @"ON_APPOPEN_LOADED_EVENT": ON_APPOPEN_LOADED_EVENT,
2052
+ @"ON_APPOPEN_LOAD_FAILED_EVENT": ON_APPOPEN_LOAD_FAILED_EVENT,
2053
+ @"ON_APPOPEN_CLICKED_EVENT": ON_APPOPEN_CLICKED_EVENT,
2054
+ @"ON_APPOPEN_DISPLAYED_EVENT": ON_APPOPEN_DISPLAYED_EVENT,
2055
+ @"ON_APPOPEN_DISPLAY_FAILED_EVENT": ON_APPOPEN_DISPLAY_FAILED_EVENT,
2056
+ @"ON_APPOPEN_HIDDEN_EVENT": ON_APPOPEN_HIDDEN_EVENT,
2057
+ @"ON_APPOPEN_AD_REVENUE_PAID": ON_APPOPEN_AD_REVENUE_PAID,
2058
+
1784
2059
  @"ON_REWARDED_AD_LOADED_EVENT": ON_REWARDED_AD_LOADED_EVENT,
1785
2060
  @"ON_REWARDED_AD_LOAD_FAILED_EVENT": ON_REWARDED_AD_LOAD_FAILED_EVENT,
1786
2061
  @"ON_REWARDED_AD_CLICKED_EVENT": ON_REWARDED_AD_CLICKED_EVENT,
@@ -1,11 +1,11 @@
1
- /*
2
- * CloudXAdView.h
3
- * cloudx-react-native
4
- *
5
- * In-tree banner/MREC view component. Unlike the imperative overlay banner in
6
- * CloudX.mm (attached above the whole RN view tree), this hosts a
7
- * CLXBannerAdView as an ordinary RN view so app overlays layer above it.
8
- */
1
+ //
2
+ // CloudXAdView.h
3
+ // cloudx-react-native
4
+ //
5
+ // In-tree banner/MREC view component. Unlike the imperative overlay banner in
6
+ // CloudX.mm (attached above the whole RN view tree), this hosts a
7
+ // CLXBannerAdView as an ordinary RN view so app overlays layer above it.
8
+ //
9
9
 
10
10
  #import <React/RCTUIManager.h>
11
11
  #import <CloudXCore/CloudXCore.h>
@@ -19,10 +19,8 @@
19
19
 
20
20
  NS_ASSUME_NONNULL_BEGIN
21
21
 
22
- /*
23
- * Nil by default on the Old Architecture (only set when the publisher passes
24
- * the corresponding callback); delegate call sites guard with `if (self.onX)`.
25
- */
22
+ // Nil by default on the Old Architecture (only set when the publisher passes
23
+ // the corresponding callback); delegate call sites guard with `if (self.onX)`.
26
24
  @property (nonatomic, copy, nullable) RCTDirectEventBlock onAdLoadedEvent;
27
25
  @property (nonatomic, copy, nullable) RCTDirectEventBlock onAdLoadFailedEvent;
28
26
  @property (nonatomic, copy, nullable) RCTDirectEventBlock onAdClickedEvent;
@@ -1,7 +1,7 @@
1
- /*
2
- * CloudXAdView.mm
3
- * cloudx-react-native
4
- */
1
+ //
2
+ // CloudXAdView.mm
3
+ // cloudx-react-native
4
+ //
5
5
 
6
6
  #import "CloudXAdView.h"
7
7
  #import "CloudXExtraParameters.h"
@@ -174,7 +174,6 @@ static id CLXIdFromFollyDynamic(const folly::dynamic &dynamicValue)
174
174
  if ( oldViewProps.adFormat != newViewProps.adFormat )
175
175
  {
176
176
  [self setAdFormat: RCTNSStringFromString(newViewProps.adFormat)];
177
- shouldAttach = YES;
178
177
  }
179
178
  if ( oldViewProps.placement != newViewProps.placement )
180
179
  {
@@ -248,10 +247,8 @@ static id CLXIdFromFollyDynamic(const folly::dynamic &dynamicValue)
248
247
  {
249
248
  if ( self.adView )
250
249
  {
251
- /*
252
- * Ad unit ID is immutable once the ad view is created. Warn only on an
253
- * actual change; unchanged re-sets on re-render stay quiet.
254
- */
250
+ // Ad unit ID is immutable once the ad view is created. Warn only on an
251
+ // actual change; unchanged re-sets on re-render stay quiet.
255
252
  if ( ![adUnitId isEqualToString: _adUnitId] )
256
253
  {
257
254
  RCTLogWarn(@"CloudXAdView: adUnitId cannot change after the ad view is created; remount the component (e.g. via a React key).");
@@ -326,7 +323,7 @@ static id CLXIdFromFollyDynamic(const folly::dynamic &dynamicValue)
326
323
  /*
327
324
  * createBanner/createMRECWithAdUnitId: returned nil. The JS layer
328
325
  * gates mounting on SDK initialization, so a nil here post-init is
329
- * an invalid/expired ad unit - surface it as a load failure instead
326
+ * an invalid/expired ad unit — surface it as a load failure instead
330
327
  * of leaving a permanently-dead, silent view (self.adView stays nil
331
328
  * and props don't re-land, so there is no retry).
332
329
  */
@@ -390,11 +387,9 @@ static id CLXIdFromFollyDynamic(const folly::dynamic &dynamicValue)
390
387
  return;
391
388
  }
392
389
 
393
- /*
394
- * Superview nil could be a real unmount or brief reparenting (react-native-screens).
395
- * Defer one main-queue turn; destroy only if it is still detached. Strong ref so the
396
- * ad is always torn down on a genuine unmount.
397
- */
390
+ // Superview nil could be a real unmount or brief reparenting (react-native-screens).
391
+ // Defer one main-queue turn; destroy only if it is still detached. Strong ref so the
392
+ // ad is always torn down on a genuine unmount.
398
393
  CloudXAdView *viewRef = self;
399
394
  dispatch_async(dispatch_get_main_queue(), ^{
400
395
  if ( viewRef.superview != nil )
@@ -1,9 +1,9 @@
1
- /*
2
- * CloudXAdViewManager.h
3
- * cloudx-react-native
4
- *
5
- * Old-Architecture (Paper) view manager for the in-tree CloudXAdView.
6
- */
1
+ //
2
+ // CloudXAdViewManager.h
3
+ // cloudx-react-native
4
+ //
5
+ // Old-Architecture (Paper) view manager for the in-tree CloudXAdView.
6
+ //
7
7
 
8
8
  #import <React/RCTViewManager.h>
9
9
 
@@ -1,7 +1,7 @@
1
- /*
2
- * CloudXAdViewManager.mm
3
- * cloudx-react-native
4
- */
1
+ //
2
+ // CloudXAdViewManager.mm
3
+ // cloudx-react-native
4
+ //
5
5
 
6
6
  #import "CloudXAdViewManager.h"
7
7
  #import "CloudXAdView.h"
@@ -46,6 +46,9 @@ const setDoNotSell = isDoNotSell => {
46
46
  const arbiter = configuration => {
47
47
  return _NativeCloudX.default.arbiter(configuration);
48
48
  };
49
+ const reportRevenueData = data => {
50
+ return _NativeCloudX.default.reportRevenueData(data);
51
+ };
49
52
  const CloudX = exports.CloudX = {
50
53
  isInitialized,
51
54
  initialize,
@@ -59,7 +62,8 @@ const CloudX = exports.CloudX = {
59
62
  setVisualDebuggingEnabled,
60
63
  setHasUserConsent,
61
64
  setDoNotSell,
62
- arbiter
65
+ arbiter,
66
+ reportRevenueData
63
67
  };
64
68
  var _default = exports.default = CloudX;
65
69
  //# sourceMappingURL=CloudX.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_NativeCloudX","_interopRequireDefault","require","_version","e","__esModule","default","isInitialized","NativeCloudX","initialize","appKey","PLUGIN_VERSION","isTablet","getVersion","setMinLogLevel","level","setHashedUserID","hashedUserID","setUserKeyValue","key","value","setAppKeyValue","clearAllKeyValues","setVisualDebuggingEnabled","enabled","setHasUserConsent","hasUserConsent","setDoNotSell","isDoNotSell","arbiter","configuration","CloudX","exports","_default"],"sourceRoot":"../../src","sources":["CloudX.ts"],"mappings":";;;;;;AAGA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAA2C,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE3C,MAAMG,aAAa,GAAGA,CAAA,KAAwB;EAC1C,OAAOC,qBAAY,CAACD,aAAa,CAAC,CAAC;AACvC,CAAC;AAED,MAAME,UAAU,GAAIC,MAAc,IAA0C;EACxE,OAAOF,qBAAY,CAACC,UAAU,CAACE,uBAAc,EAAED,MAAM,CAAC;AAC1D,CAAC;AAED,MAAME,QAAQ,GAAGA,CAAA,KAAwB;EACrC,OAAOJ,qBAAY,CAACI,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAMC,UAAU,GAAGA,CAAA,KAAuB;EACtC,OAAOL,qBAAY,CAACK,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,MAAMC,cAAc,GAAIC,KAA0B,IAAW;EACzDP,qBAAY,CAACM,cAAc,CAACC,KAAK,CAAC;AACtC,CAAC;AAED,MAAMC,eAAe,GAAIC,YAAoB,IAAW;EACpDT,qBAAY,CAACQ,eAAe,CAACC,YAAY,CAAC;AAC9C,CAAC;AAED,MAAMC,eAAe,GAAGA,CAACC,GAAW,EAAEC,KAAa,KAAW;EAC1DZ,qBAAY,CAACU,eAAe,CAACC,GAAG,EAAEC,KAAK,CAAC;AAC5C,CAAC;AAED,MAAMC,cAAc,GAAGA,CAACF,GAAW,EAAEC,KAAa,KAAW;EACzDZ,qBAAY,CAACa,cAAc,CAACF,GAAG,EAAEC,KAAK,CAAC;AAC3C,CAAC;AAED,MAAME,iBAAiB,GAAGA,CAAA,KAAY;EAClCd,qBAAY,CAACc,iBAAiB,CAAC,CAAC;AACpC,CAAC;AAED,MAAMC,yBAAyB,GAAIC,OAAgB,IAAW;EAC1DhB,qBAAY,CAACe,yBAAyB,CAACC,OAAO,CAAC;AACnD,CAAC;AAED,MAAMC,iBAAiB,GAAIC,cAA8B,IAAW;EAChElB,qBAAY,CAACiB,iBAAiB,CAACC,cAAc,CAAC;AAClD,CAAC;AAED,MAAMC,YAAY,GAAIC,WAA2B,IAAW;EACxDpB,qBAAY,CAACmB,YAAY,CAACC,WAAW,CAAC;AAC1C,CAAC;AAED,MAAMC,OAAO,GAAIC,aAAyC,IAAmC;EACzF,OAAOtB,qBAAY,CAACqB,OAAO,CAACC,aAAa,CAAC;AAC9C,CAAC;AAEM,MAAMC,MAAkB,GAAAC,OAAA,CAAAD,MAAA,GAAG;EAC9BxB,aAAa;EACbE,UAAU;EACVG,QAAQ;EACRC,UAAU;EACVC,cAAc;EACdE,eAAe;EACfE,eAAe;EACfG,cAAc;EACdC,iBAAiB;EACjBC,yBAAyB;EACzBE,iBAAiB;EACjBE,YAAY;EACZE;AACJ,CAAC;AAAC,IAAAI,QAAA,GAAAD,OAAA,CAAA1B,OAAA,GAEayB,MAAM","ignoreList":[]}
1
+ {"version":3,"names":["_NativeCloudX","_interopRequireDefault","require","_version","e","__esModule","default","isInitialized","NativeCloudX","initialize","appKey","PLUGIN_VERSION","isTablet","getVersion","setMinLogLevel","level","setHashedUserID","hashedUserID","setUserKeyValue","key","value","setAppKeyValue","clearAllKeyValues","setVisualDebuggingEnabled","enabled","setHasUserConsent","hasUserConsent","setDoNotSell","isDoNotSell","arbiter","configuration","reportRevenueData","data","CloudX","exports","_default"],"sourceRoot":"../../src","sources":["CloudX.ts"],"mappings":";;;;;;AAIA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAA2C,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE3C,MAAMG,aAAa,GAAGA,CAAA,KAAwB;EAC1C,OAAOC,qBAAY,CAACD,aAAa,CAAC,CAAC;AACvC,CAAC;AAED,MAAME,UAAU,GAAIC,MAAc,IAA0C;EACxE,OAAOF,qBAAY,CAACC,UAAU,CAACE,uBAAc,EAAED,MAAM,CAAC;AAC1D,CAAC;AAED,MAAME,QAAQ,GAAGA,CAAA,KAAwB;EACrC,OAAOJ,qBAAY,CAACI,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAMC,UAAU,GAAGA,CAAA,KAAuB;EACtC,OAAOL,qBAAY,CAACK,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,MAAMC,cAAc,GAAIC,KAA0B,IAAW;EACzDP,qBAAY,CAACM,cAAc,CAACC,KAAK,CAAC;AACtC,CAAC;AAED,MAAMC,eAAe,GAAIC,YAAoB,IAAW;EACpDT,qBAAY,CAACQ,eAAe,CAACC,YAAY,CAAC;AAC9C,CAAC;AAED,MAAMC,eAAe,GAAGA,CAACC,GAAW,EAAEC,KAAa,KAAW;EAC1DZ,qBAAY,CAACU,eAAe,CAACC,GAAG,EAAEC,KAAK,CAAC;AAC5C,CAAC;AAED,MAAMC,cAAc,GAAGA,CAACF,GAAW,EAAEC,KAAa,KAAW;EACzDZ,qBAAY,CAACa,cAAc,CAACF,GAAG,EAAEC,KAAK,CAAC;AAC3C,CAAC;AAED,MAAME,iBAAiB,GAAGA,CAAA,KAAY;EAClCd,qBAAY,CAACc,iBAAiB,CAAC,CAAC;AACpC,CAAC;AAED,MAAMC,yBAAyB,GAAIC,OAAgB,IAAW;EAC1DhB,qBAAY,CAACe,yBAAyB,CAACC,OAAO,CAAC;AACnD,CAAC;AAED,MAAMC,iBAAiB,GAAIC,cAA8B,IAAW;EAChElB,qBAAY,CAACiB,iBAAiB,CAACC,cAAc,CAAC;AAClD,CAAC;AAED,MAAMC,YAAY,GAAIC,WAA2B,IAAW;EACxDpB,qBAAY,CAACmB,YAAY,CAACC,WAAW,CAAC;AAC1C,CAAC;AAED,MAAMC,OAAO,GAAIC,aAAyC,IAAmC;EACzF,OAAOtB,qBAAY,CAACqB,OAAO,CAACC,aAAa,CAAC;AAC9C,CAAC;AAED,MAAMC,iBAAiB,GAAIC,IAAuB,IAAuB;EACrE,OAAOxB,qBAAY,CAACuB,iBAAiB,CAACC,IAAI,CAAC;AAC/C,CAAC;AAEM,MAAMC,MAAkB,GAAAC,OAAA,CAAAD,MAAA,GAAG;EAC9B1B,aAAa;EACbE,UAAU;EACVG,QAAQ;EACRC,UAAU;EACVC,cAAc;EACdE,eAAe;EACfE,eAAe;EACfG,cAAc;EACdC,iBAAiB;EACjBC,yBAAyB;EACzBE,iBAAiB;EACjBE,YAAY;EACZE,OAAO;EACPE;AACJ,CAAC;AAAC,IAAAI,QAAA,GAAAD,OAAA,CAAA5B,OAAA,GAEa2B,MAAM","ignoreList":[]}