@usercentrics/react-native-sdk 2.7.9 → 2.7.12

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 (27) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/android/build.gradle +3 -3
  3. package/android/src/androidTest/java/com/usercentrics/reactnativemodule/RNUsercentricsModuleTest.kt +82 -33
  4. package/android/src/androidTest/java/com/usercentrics/reactnativemodule/mock/GetCMPDataMock.kt +0 -131
  5. package/android/src/androidTest/java/com/usercentrics/reactnativemodule/mock/ReactContextProviderMock.kt +20 -0
  6. package/android/src/androidTest/res/drawable-hdpi/some_local_image.png +0 -0
  7. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsModule.kt +16 -23
  8. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsPackage.kt +5 -6
  9. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/ReactContextProvider.kt +10 -0
  10. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/ReactContextProviderImpl.kt +18 -0
  11. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/BannerFontExtensions.kt +9 -9
  12. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/BannerSettingsExtensions.kt +42 -41
  13. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/UsercentricsCMPDataExtensions.kt +0 -42
  14. package/ios/Extensions/UsercentricsCMPData+Dict.swift +0 -42
  15. package/lib/models/CCPASettings.d.ts +1 -4
  16. package/lib/models/CCPASettings.js +1 -4
  17. package/lib/models/CCPASettings.js.map +1 -1
  18. package/lib/models/TCF2Settings.d.ts +1 -5
  19. package/lib/models/TCF2Settings.js +1 -5
  20. package/lib/models/TCF2Settings.js.map +1 -1
  21. package/lib/models/UsercentricsService.d.ts +1 -13
  22. package/lib/models/UsercentricsService.js +1 -13
  23. package/lib/models/UsercentricsService.js.map +1 -1
  24. package/lib/models/UsercentricsSettings.d.ts +3 -24
  25. package/lib/models/UsercentricsSettings.js +3 -24
  26. package/lib/models/UsercentricsSettings.js.map +1 -1
  27. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,4 +1,26 @@
1
1
  [Release Notes](https://docs.usercentrics.com/cmp_in_app_sdk/latest/about/history/)
2
+ ### 2.7.12
3
+
4
+ ## Improvements
5
+
6
+ * Several improvements on Consent Mediation
7
+ * Add support for Adjust and Crashlytics.
8
+ * Add support for Custom DPSs.
9
+
10
+ ## Resolved Issues
11
+
12
+ * Stability improvements and bug fixes.
13
+
14
+ ### 2.7.10
15
+
16
+ ## Improvements
17
+
18
+ * [TCF] Performance improvement.
19
+
20
+ ## Features
21
+
22
+ * Stability improvements and bug fixes.
23
+
2
24
  ### 2.7.9
3
25
 
4
26
  ## Features
@@ -1,8 +1,8 @@
1
- def usercentrics_version = "2.7.9"
1
+ def usercentrics_version = "2.7.10"
2
2
  version usercentrics_version
3
3
 
4
4
  buildscript {
5
- ext.kotlin_version = '1.7.10'
5
+ ext.kotlin_version = '1.8.0'
6
6
 
7
7
  ext.safeExtGet = { prop, fallback ->
8
8
  return rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
@@ -27,7 +27,7 @@ apply plugin: 'com.android.library'
27
27
  apply plugin: 'kotlin-android'
28
28
 
29
29
  android {
30
- compileSdkVersion 31
30
+ compileSdkVersion 32
31
31
 
32
32
  compileOptions {
33
33
  sourceCompatibility JavaVersion.VERSION_1_8
@@ -1,5 +1,7 @@
1
1
  package com.usercentrics.reactnativemodule
2
2
 
3
+ import android.app.Activity
4
+ import android.content.Context
3
5
  import androidx.test.ext.junit.runners.AndroidJUnit4
4
6
  import androidx.test.platform.app.InstrumentationRegistry
5
7
  import com.facebook.react.bridge.*
@@ -8,6 +10,7 @@ import com.usercentrics.reactnativemodule.api.FakeUsercentricsProxy
8
10
  import com.usercentrics.reactnativemodule.fake.FakePromise
9
11
  import com.usercentrics.reactnativemodule.mock.*
10
12
  import com.usercentrics.reactnativeusercentrics.RNUsercentricsModule
13
+ import com.usercentrics.reactnativeusercentrics.ReactContextProvider
11
14
  import com.usercentrics.reactnativeusercentrics.extensions.serialize
12
15
  import com.usercentrics.reactnativeusercentrics.extensions.toWritableMap
13
16
  import com.usercentrics.sdk.*
@@ -30,6 +33,7 @@ import org.junit.runner.RunWith
30
33
  class RNUsercentricsModuleTest {
31
34
 
32
35
  companion object {
36
+
33
37
  private val usercentricsOptions = JavaOnlyMap().apply {
34
38
  putString("settingsId", "AAAAA")
35
39
  putString("ruleSetId", "BBBBB")
@@ -95,7 +99,7 @@ class RNUsercentricsModuleTest {
95
99
  fun testModuleName() {
96
100
  assertEquals(
97
101
  "RNUsercentricsModule",
98
- RNUsercentricsModule(mockk(relaxed = true), mockk()).name
102
+ RNUsercentricsModule(mockk(relaxed = true), mockk(), ReactContextProviderMock()).name
99
103
  )
100
104
  }
101
105
 
@@ -103,17 +107,14 @@ class RNUsercentricsModuleTest {
103
107
  fun testConfigure() {
104
108
  val usercentricsProxy = FakeUsercentricsProxy()
105
109
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
106
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
110
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
107
111
 
108
112
  module.configure(usercentricsOptions)
109
113
 
110
114
  assertEquals(1, usercentricsProxy.initializeCount)
111
115
  assertEquals("AAAAA", usercentricsProxy.initializeOptionsArgument?.settingsId)
112
116
  assertEquals("BBBBB", usercentricsProxy.initializeOptionsArgument?.ruleSetId)
113
- assertEquals(
114
- UsercentricsLoggerLevel.NONE,
115
- usercentricsProxy.initializeOptionsArgument?.loggerLevel
116
- )
117
+ assertEquals(UsercentricsLoggerLevel.NONE, usercentricsProxy.initializeOptionsArgument?.loggerLevel)
117
118
  assertEquals(1000L, usercentricsProxy.initializeOptionsArgument?.timeoutMillis)
118
119
  assertEquals("1.2.3", usercentricsProxy.initializeOptionsArgument?.version)
119
120
  assertEquals(NetworkMode.EU, usercentricsProxy.initializeOptionsArgument?.networkMode)
@@ -123,7 +124,7 @@ class RNUsercentricsModuleTest {
123
124
  fun testConfigureWithWrongValues() {
124
125
  val usercentricsProxy = FakeUsercentricsProxy()
125
126
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
126
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
127
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
127
128
 
128
129
  module.configure(JavaOnlyMap())
129
130
  assertEquals(UsercentricsOptions(), usercentricsProxy.initializeOptionsArgument)
@@ -133,7 +134,7 @@ class RNUsercentricsModuleTest {
133
134
  fun testIsReady() {
134
135
  val usercentricsProxy = FakeUsercentricsProxy(isReadyAnswer = usercentricsReadyStatus)
135
136
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
136
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
137
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
137
138
 
138
139
  val promise = FakePromise()
139
140
  module.isReady(promise)
@@ -156,7 +157,7 @@ class RNUsercentricsModuleTest {
156
157
 
157
158
  val usercentricsProxy = FakeUsercentricsProxy(isReadyAnswer = error)
158
159
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
159
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
160
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
160
161
 
161
162
  val promise = FakePromise()
162
163
  module.isReady(promise)
@@ -175,7 +176,7 @@ class RNUsercentricsModuleTest {
175
176
 
176
177
  val usercentricsProxy = FakeUsercentricsProxy(instanceAnswer = usercentricsSDK)
177
178
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
178
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
179
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
179
180
 
180
181
  val promise = FakePromise()
181
182
  module.restoreUserSession("abc", promise)
@@ -203,7 +204,7 @@ class RNUsercentricsModuleTest {
203
204
  }
204
205
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
205
206
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
206
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
207
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
207
208
 
208
209
  val promise = FakePromise()
209
210
  module.restoreUserSession("abc", promise)
@@ -218,7 +219,7 @@ class RNUsercentricsModuleTest {
218
219
  every { usercentricsSDK.getControllerId() }.returns("abc")
219
220
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
220
221
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
221
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
222
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
222
223
  val promise = FakePromise()
223
224
 
224
225
  module.getControllerId(promise)
@@ -233,7 +234,7 @@ class RNUsercentricsModuleTest {
233
234
  every { usercentricsSDK.getABTestingVariant() }.returns("variantA")
234
235
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
235
236
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
236
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
237
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
237
238
  val promise = FakePromise()
238
239
 
239
240
  module.getABTestingVariant(promise)
@@ -249,7 +250,7 @@ class RNUsercentricsModuleTest {
249
250
 
250
251
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
251
252
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
252
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
253
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
253
254
 
254
255
  val promise = FakePromise()
255
256
 
@@ -281,7 +282,7 @@ class RNUsercentricsModuleTest {
281
282
 
282
283
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
283
284
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
284
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
285
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
285
286
 
286
287
  val promise = FakePromise()
287
288
 
@@ -309,7 +310,7 @@ class RNUsercentricsModuleTest {
309
310
  resultMap.getMap("userLocation")
310
311
  )
311
312
 
312
- assertEquals(GetCMPDataMock.expectedServices.serialize(), resultMap.getArray("services"))
313
+ assertEquals(GetCMPDataMock.expectedServices.serialize(), resultMap.getArray("services")!!)
313
314
  }
314
315
 
315
316
  @Test
@@ -319,7 +320,7 @@ class RNUsercentricsModuleTest {
319
320
 
320
321
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
321
322
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
322
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
323
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
323
324
 
324
325
  module.setCMPId(123)
325
326
 
@@ -333,7 +334,7 @@ class RNUsercentricsModuleTest {
333
334
 
334
335
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
335
336
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
336
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
337
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
337
338
 
338
339
  module.setABTestingVariant("variantA")
339
340
 
@@ -349,7 +350,7 @@ class RNUsercentricsModuleTest {
349
350
 
350
351
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
351
352
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
352
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
353
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
353
354
  val promise = FakePromise()
354
355
 
355
356
  module.getTCFData(promise)
@@ -366,7 +367,7 @@ class RNUsercentricsModuleTest {
366
367
  every { usercentricsSDK.getUserSessionData() }.returns(GetUserSessionDataMock.fake)
367
368
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
368
369
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
369
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
370
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
370
371
  val promise = FakePromise()
371
372
 
372
373
  module.getUserSessionData(promise)
@@ -381,7 +382,7 @@ class RNUsercentricsModuleTest {
381
382
 
382
383
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
383
384
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
384
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
385
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
385
386
  val promise = FakePromise()
386
387
 
387
388
  module.getUSPData(promise)
@@ -400,7 +401,7 @@ class RNUsercentricsModuleTest {
400
401
  }
401
402
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
402
403
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
403
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
404
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
404
405
  val promise = FakePromise()
405
406
 
406
407
  module.changeLanguage("abc", promise)
@@ -427,7 +428,7 @@ class RNUsercentricsModuleTest {
427
428
 
428
429
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
429
430
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
430
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
431
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
431
432
  val promise = FakePromise()
432
433
 
433
434
  module.changeLanguage("abc", promise)
@@ -455,7 +456,7 @@ class RNUsercentricsModuleTest {
455
456
 
456
457
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
457
458
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
458
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
459
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
459
460
 
460
461
  val promise = FakePromise()
461
462
  module.acceptAllForTCF(0, 0, promise)
@@ -483,7 +484,7 @@ class RNUsercentricsModuleTest {
483
484
 
484
485
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
485
486
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
486
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
487
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
487
488
 
488
489
  val promise = FakePromise()
489
490
  module.denyAllForTCF(0, 0, promise)
@@ -510,7 +511,7 @@ class RNUsercentricsModuleTest {
510
511
 
511
512
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
512
513
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
513
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
514
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
514
515
 
515
516
  val promise = FakePromise()
516
517
  module.acceptAll(0, promise)
@@ -531,7 +532,7 @@ class RNUsercentricsModuleTest {
531
532
 
532
533
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
533
534
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
534
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
535
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
535
536
 
536
537
  val promise = FakePromise()
537
538
  module.denyAll(0, promise)
@@ -553,7 +554,7 @@ class RNUsercentricsModuleTest {
553
554
 
554
555
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
555
556
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
556
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
557
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
557
558
 
558
559
  val promise = FakePromise()
559
560
  module.saveDecisions(SaveDecisionsMock.callDecisions.serialize(), 0, promise)
@@ -577,7 +578,7 @@ class RNUsercentricsModuleTest {
577
578
 
578
579
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
579
580
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
580
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
581
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
581
582
 
582
583
  val promise = FakePromise()
583
584
  module.saveDecisionsForTCF(
@@ -604,7 +605,7 @@ class RNUsercentricsModuleTest {
604
605
 
605
606
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
606
607
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
607
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
608
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
608
609
 
609
610
  val promise = FakePromise()
610
611
  module.saveOptOutForCCPA(
@@ -622,7 +623,7 @@ class RNUsercentricsModuleTest {
622
623
  fun testResetMethod() {
623
624
  val usercentricsProxy = FakeUsercentricsProxy()
624
625
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
625
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
626
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
626
627
 
627
628
  module.reset()
628
629
 
@@ -633,7 +634,7 @@ class RNUsercentricsModuleTest {
633
634
  fun testShowFirstLayer() {
634
635
  val usercentricsProxy = FakeUsercentricsProxy()
635
636
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
636
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
637
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
637
638
  val promise = FakePromise()
638
639
  module.showFirstLayer(bannerSettingsMap.toWritableMap(), promise)
639
640
  promise.await()
@@ -644,10 +645,58 @@ class RNUsercentricsModuleTest {
644
645
  fun testShowSecondLayer() {
645
646
  val usercentricsProxy = FakeUsercentricsProxy()
646
647
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
647
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
648
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
648
649
  val promise = FakePromise()
649
650
  module.showSecondLayer(bannerSettingsMap.toWritableMap(), promise)
650
651
  promise.await()
651
652
  assertEquals(expectedBannerSettings, usercentricsProxy.showSecondLayerBannerSettings)
652
653
  }
654
+
655
+ @Test
656
+ fun testShowFirstLayerWithCustomLocalLogo() {
657
+ val context = InstrumentationRegistry.getInstrumentation().context
658
+ val reactContextProviderMock = object: ReactContextProviderMock() {
659
+
660
+ override fun context(): Context {
661
+ return context
662
+ }
663
+ }
664
+
665
+ val usercentricsProxy = FakeUsercentricsProxy()
666
+ val reactApplicationContext = mockk<ReactApplicationContext>(relaxed = true)
667
+ val module = RNUsercentricsModule(reactApplicationContext, usercentricsProxy, reactContextProviderMock)
668
+
669
+ val bannerSettingsMap = mapOf(
670
+ "variant" to null,
671
+ "firstLayerStyleSettings" to mapOf(
672
+ "layout" to "POPUP_CENTER",
673
+ ),
674
+ "secondLayerStyleSettings" to mapOf(
675
+ "showCloseButton" to true,
676
+ ),
677
+ "generalStyleSettings" to mapOf(
678
+ "logo" to mapOf(
679
+ "logoPath" to "some_local_image"
680
+ )
681
+ )
682
+ )
683
+
684
+ val promise = FakePromise()
685
+ module.showFirstLayer(bannerSettingsMap.toWritableMap(), promise)
686
+ promise.await()
687
+
688
+ val someLocalImageDrawableId = context.resources.getIdentifier("some_local_image", "drawable", context.packageName)
689
+ val expectedBannerSettings = BannerSettings(
690
+ firstLayerStyleSettings = FirstLayerStyleSettings(
691
+ layout = UsercentricsLayout.Popup(
692
+ PopupPosition.CENTER
693
+ )
694
+ ),
695
+ secondLayerStyleSettings = SecondLayerStyleSettings(showCloseButton = true),
696
+ generalStyleSettings = GeneralStyleSettings(
697
+ logo = UsercentricsImage.ImageDrawableId(someLocalImageDrawableId)
698
+ )
699
+ )
700
+ assertEquals(expectedBannerSettings, usercentricsProxy.showFirstLayerBannerSettings)
701
+ }
653
702
  }