@betarena/ad-engine 0.0.53 → 0.0.55

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.
@@ -42,23 +42,25 @@
42
42
 
43
43
  // import '@fontsource/roboto';
44
44
 
45
- import { betarenaEndpoint } from './constants/instance.js';
45
+ import { removeNull } from '@betarena/scores-lib/dist/functions/func.common.js';
46
46
  import { betarenaAdEngineStore } from './_store.js';
47
- import { postMod } from './utils/fetch.js';
47
+ import { betarenaEndpoint } from './constants/instance.js';
48
+ import { storeSession } from './store/session.js';
49
+ import { logger } from './utils/debug.js';
48
50
  import { detectDeviceType } from './utils/device.js';
51
+ import { postMod } from './utils/fetch.js';
49
52
  import { getUserLocation } from './utils/geo.js';
50
- import { removeNull } from '@betarena/scores-lib/dist/functions/func.common.js';
51
- import { storeSession } from './store/session.js';
52
53
 
53
- import WidgetAdvertSlide from './Advert-Slide-Child.svelte';
54
54
  import WidgetAdGeneral from './Advert-General-Child.svelte';
55
+ import AdvertInterScrollerChild from './Advert-InterScroller-Child.svelte';
56
+ import WidgetAdvertSlide from './Advert-Slide-Child.svelte';
55
57
  import DevInfoBox from './misc/admin/Dev-Info-Box.svelte';
56
58
 
57
59
  import '../style/app.scss';
58
60
 
61
+ import type { AdsCreativeMain } from '@betarena/scores-lib/types/_AUTO-HASURA_.js';
59
62
  import type { IAdsRequestBody, IAdsResponseBody } from '@betarena/scores-lib/types/ad-engine/index.js';
60
63
  import type { GeoJsResponse } from './types/geojs.js';
61
- import type { AdsCreativeMain } from '@betarena/scores-lib/types/_AUTO-HASURA_.js';
62
64
 
63
65
  // #endregion ➤ 📦 Package Imports
64
66
 
@@ -126,12 +128,12 @@
126
128
  * @description
127
129
  * 📝 `Map` where, `key=ZoneId` and `value=HTMLElement`
128
130
  */
129
- betarenaAdsInjectMap: Map < number, Element > = new Map(),
131
+ mapBetarenaAdvertStandardElement = new Map < number, Element > (),
130
132
  /**
131
133
  * @description
132
- * 📝 temporary data
134
+ * 📝 `Map` where, `key=CreativeId` and `value=AdvertObject` (temporary)
133
135
  */
134
- creativeDataMap: Map < number, AdsCreativeMain > = new Map()
136
+ mapCreative = new Map < number, AdsCreativeMain > ()
135
137
  ;
136
138
 
137
139
  // #endregion ➤ 📌 VARIABLES
@@ -166,13 +168,22 @@
166
168
  * @description
167
169
  * 📝 `List` of `HTMLElements` identified on `page` for a target `zone`.
168
170
  */
169
- htmlElementList = document.querySelectorAll('[data-betarena-zone-id]')
171
+ listElementTarget = document.querySelectorAll('[data-betarena-zone-id]')
170
172
  ;
171
173
 
174
+ // [🐞]
175
+ logger
176
+ (
177
+ [
178
+ '🚏 checkpoint ➤ generateElementMap(..) // START',
179
+ `🔹 [var] ➤ listElementTarget.length ${listElementTarget.length}`
180
+ ]
181
+ );
182
+
172
183
  // ╭─────
173
- // │ NOTE: |:| loop over elements detected as betarena elegible ads
184
+ // │ NOTE: |:| loop over elements detected as betarena elegible ads (global/outer)
174
185
  // ╰─────
175
- for (const elem of htmlElementList)
186
+ for (const elem of listElementTarget)
176
187
  {
177
188
  const
178
189
  /**
@@ -184,7 +195,7 @@
184
195
 
185
196
  if (!value) continue;
186
197
 
187
- betarenaAdsInjectMap.set(parseInt(value), elem);
198
+ mapBetarenaAdvertStandardElement.set(parseInt(value), elem);
188
199
  }
189
200
 
190
201
  return
@@ -226,39 +237,47 @@
226
237
  ;
227
238
 
228
239
  // [🐞]
229
- console.log('response', response);
240
+ logger
241
+ (
242
+ [
243
+ '🚏 checkpoint ➤ injectBetarenaAds(..) // START',
244
+ `🔹 [var] ➤ response ${JSON.stringify(response)}`
245
+ ]
246
+ );
230
247
 
231
- creativeDataMap = new Map((response as IAdsResponseBody).ads ?? []);
248
+ mapCreative = new Map((response as IAdsResponseBody).ads ?? []);
232
249
 
233
250
  const
234
251
  /**
235
252
  * @description
236
- * 📝 `Map`
253
+ * 📝 `Map` where, `key=ZoneId` and `value=listCampaignId`
237
254
  */
238
255
  mapZoneIdToCampaignId = new Map ((response as IAdsResponseBody).mapZoneIdToCampaignId),
239
256
  /**
240
257
  * @description
241
- * 📝 `Map`
258
+ * 📝 `Map` where, `key=CampaignId` and `value=listCreativeId`
242
259
  */
243
260
  mapCampaignIdToCreativeId = new Map ((response as IAdsResponseBody).mapCampaignIdToCreativeId),
244
261
  /**
245
262
  * @description
246
- * 📝 `Map`
263
+ * 📝 `Map` where, `key=ZoneId` and `value=listAuthorId`
247
264
  */
248
265
  mapZoneToAuthorIds = new Map ((response as IAdsResponseBody).mapZoneIdToAuthorIds),
249
266
  /**
250
267
  * @description
251
- * 📝 `Map`
268
+ * 📝 `Map` where, `key=ZoneId` and `value=listTagId`
252
269
  */
253
270
  mapZoneToTagIds = new Map ((response as IAdsResponseBody).mapZoneIdToTagIds)
254
271
  ;
255
272
 
256
273
  // ╭─────
257
274
  // │ NOTE:
258
- // │ ➤ [1] loop over retrieved/fetched elements, and
259
- // │ ➤ [2] inject target `ads` in specific locations
275
+ // │ ➤ [1] loop over retrieved/fetched elements identified in 'document',
276
+ // │ ➤ [2] and inject target 'ADVERTS' in target specific locations.
277
+ // ┣─────
278
+ // ┃ ZONE-ID :: 1,2,3
260
279
  // ╰─────
261
- for (const [zoneId, element] of betarenaAdsInjectMap)
280
+ for (const [zoneId, element] of mapBetarenaAdvertStandardElement)
262
281
  {
263
282
  if (!geoLocation) continue;
264
283
 
@@ -276,55 +295,100 @@
276
295
  creativeAdData
277
296
  = removeNull
278
297
  (
279
- campaignIds.map
280
- (
281
- x =>
282
- {
283
- if (mapCampaignIdToCreativeId.has(x))
298
+ campaignIds
299
+ // ╭─────
300
+ // │ NOTE:
301
+ // │ |: Filter out `campaign ids` that have no `creative ids`
302
+ // ╰─────
303
+ .filter
304
+ (
305
+ x =>
284
306
  {
285
- const
286
- /**
287
- * @description
288
- * 📝 **creative ids**
289
- */
290
- creativeIds = mapCampaignIdToCreativeId.get(x)!
307
+ if (mapCampaignIdToCreativeId.has(x))
308
+ return true;
291
309
  ;
292
-
293
- for (const creativeId of creativeIds)
310
+ return false;
311
+ }
312
+ )
313
+ // ╭─────
314
+ // │ NOTE:
315
+ // │ |: Map over `campaign ids` and return `creative data`
316
+ // ╰─────
317
+ .map
318
+ (
319
+ x =>
320
+ {
321
+ // ╭─────
322
+ // │ NOTE:
323
+ // │ |: Loop over creative data and inject adverts
324
+ // ╰─────
325
+ for (const creativeId of mapCampaignIdToCreativeId.get(x)!)
294
326
  {
295
- if (creativeDataMap.has(creativeId))
296
- return creativeDataMap.get(creativeId);
327
+ if (mapCreative.has(creativeId))
328
+ return mapCreative.get(creativeId);
297
329
  ;
298
330
  }
299
331
  }
300
- }
301
- )
332
+ )
302
333
  ) as AdsCreativeMain[]
303
334
  ;
304
335
 
305
336
  // [🐞]
306
- // console.log('creativeAdData', creativeAdData);
307
-
308
- for (const adData of (creativeAdData ?? []))
337
+ logger
338
+ (
339
+ [
340
+ `🔹 [var] ➤ creativeAdData.length ${creativeAdData.length}`
341
+ ]
342
+ );
343
+
344
+ // ╭─────
345
+ // │ NOTE:
346
+ // │ |: Loop over creative data and inject adverts
347
+ // ╰─────
348
+ if (zoneId == 1)
309
349
  {
310
- new WidgetAdGeneral
311
- (
312
- {
313
- target: element,
314
- props:
350
+ for (const adData of (creativeAdData ?? []))
351
+ new WidgetAdGeneral
352
+ (
315
353
  {
316
- adData
354
+ target: element,
355
+ props:
356
+ {
357
+ adData
358
+ }
317
359
  }
318
- }
319
- );
360
+ );
361
+ ;
362
+ }
363
+ else if (zoneId == 2 || zoneId == 3)
364
+ {
365
+ for (const adData of (creativeAdData ?? []))
366
+ new AdvertInterScrollerChild
367
+ (
368
+ {
369
+ target: element,
370
+ props:
371
+ {
372
+ instanceNode: element,
373
+ objectAdverData: adData
374
+ }
375
+ }
376
+ );
377
+ ;
320
378
  }
321
379
  }
322
380
 
323
381
  // ╭─────
324
- // │ CHECK |:| for injection of 'global' placements ads (based on global page data)
382
+ // │ CHECK
383
+ // │ |: for case of injection of 'GLOBAL' placements for adverts,
384
+ // │ |: (a.k.a slider / popup ads)
325
385
  // ╰─────
326
386
  if (authorId || authorArticleTagIds.length > 0)
327
387
  {
388
+ // ╭─────
389
+ // │ NOTE:
390
+ // │ |: Loop over creative data and inject adverts
391
+ // ╰─────
328
392
  for (const [zoneId, authorIds] of mapZoneToAuthorIds)
329
393
  {
330
394
  if (!authorId || (authorIds.length > 0 && !authorIds.includes(authorId)))
@@ -361,8 +425,8 @@
361
425
 
362
426
  for (const creativeId of creativeIds)
363
427
  {
364
- if (creativeDataMap.has(creativeId))
365
- return creativeDataMap.get(creativeId);
428
+ if (mapCreative.has(creativeId))
429
+ return mapCreative.get(creativeId);
366
430
  ;
367
431
  }
368
432
  }
@@ -372,10 +436,19 @@
372
436
  ;
373
437
 
374
438
  // [🐞]
375
- console.log('creativeAdData-HERE1', creativeAdData);
439
+ logger
440
+ (
441
+ [
442
+ '🚏 checkpoint ➤ injectBetarenaAds(..) // CHECKPOINT-1',
443
+ `🔹 [var] ➤ creativeAdData ${creativeAdData.length}`
444
+ ]
445
+ );
376
446
 
447
+ // ╭─────
448
+ // │ NOTE:
449
+ // │ |: Loop over creative data and inject adverts
450
+ // ╰─────
377
451
  for (const adData of creativeAdData)
378
- {
379
452
  new WidgetAdvertSlide
380
453
  (
381
454
  {
@@ -386,9 +459,13 @@
386
459
  }
387
460
  }
388
461
  );
389
- }
462
+ ;
390
463
  }
391
464
 
465
+ // ╭─────
466
+ // │ NOTE:
467
+ // │ |: Loop over creative data and inject adverts
468
+ // ╰─────
392
469
  for (const [zoneId, tagIds] of mapZoneToTagIds)
393
470
  {
394
471
  if (tagIds.length > 0 && authorArticleTagIds.filter(x => { return tagIds.includes(x) } ).length == 0)
@@ -425,8 +502,8 @@
425
502
 
426
503
  for (const creativeId of creativeIds)
427
504
  {
428
- if (creativeDataMap.has(creativeId))
429
- return creativeDataMap.get(creativeId);
505
+ if (mapCreative.has(creativeId))
506
+ return mapCreative.get(creativeId);
430
507
  ;
431
508
  }
432
509
  }
@@ -436,10 +513,19 @@
436
513
  ;
437
514
 
438
515
  // [🐞]
439
- console.log('creativeAdData-HERE2', creativeAdData);
516
+ logger
517
+ (
518
+ [
519
+ '🚏 checkpoint ➤ injectBetarenaAds(..) // CHECKPOINT-2',
520
+ `🔹 [var] ➤ creativeAdData ${creativeAdData.length}`
521
+ ]
522
+ );
440
523
 
524
+ // ╭─────
525
+ // │ NOTE:
526
+ // │ |: Loop over creative data and inject adverts
527
+ // ╰─────
441
528
  for (const adData of creativeAdData)
442
- {
443
529
  new WidgetAdvertSlide
444
530
  (
445
531
  {
@@ -450,16 +536,26 @@
450
536
  }
451
537
  }
452
538
  );
453
- }
539
+ ;
454
540
  }
455
541
  }
456
542
  // ╭─────
457
- // │ CHECK |:| for case where no author or tag ids are present (global ads), but the ads are still fetched
543
+ // │ CHECK
544
+ // │ |: otherwise, case where (1) no authorId or (2) tagIds are present (global ads),
545
+ // │ |: but data for ads was still fetched (a.k.a Data was RETRIVED/HIT)
458
546
  // ╰─────
459
547
  else
460
548
  {
461
- for (const [adId, adData] of creativeDataMap)
462
- {
549
+ // [🐞]
550
+ logger
551
+ (
552
+ [
553
+ '🚏 checkpoint ➤ injectBetarenaAds(..) // CHECKPOINT-3',
554
+ `🔹 [var] ➤ mapCreative.length ${mapCreative.size}`
555
+ ]
556
+ );
557
+
558
+ for (const [, adData] of mapCreative)
463
559
  new WidgetAdvertSlide
464
560
  (
465
561
  {
@@ -470,7 +566,7 @@
470
566
  }
471
567
  }
472
568
  );
473
- }
569
+ ;
474
570
  }
475
571
 
476
572
  return;
@@ -494,17 +590,25 @@
494
590
  generateElementMap();
495
591
 
496
592
  // [🐞]
497
- // console.log('elements', betarenaAdsInjectMap);
498
- // console.log('elements', zoneIds);
593
+ logger
594
+ (
595
+ [
596
+ '🚏 checkpoint ➤ initialize(..) // START',
597
+ `🔹 [var] ➤ mapBetarenaAdvertStandardElement.size ${mapBetarenaAdvertStandardElement.size}`
598
+ // `🔹 [var] ➤ zoneIds ${JSON.stringify(zoneIds)}`
599
+ ]
600
+ );
499
601
 
500
602
  injectBetarenaAds
501
603
  (
502
604
  {
503
605
  deviceType,
504
- isoCountryCode: geoLocation?.country_code ?? 'EN',
606
+ // deviceType: 'mobile',
607
+ isoCountryCode: geoLocation.country_code ?? 'EN',
608
+ // isoCountryCode: 'BR',
505
609
  authorId,
506
610
  tagIds: authorArticleTagIds,
507
- zoneIds: [...betarenaAdsInjectMap.keys()]
611
+ zoneIds: [...mapBetarenaAdvertStandardElement.keys()]
508
612
  }
509
613
  );
510
614
 
@@ -527,7 +631,11 @@
527
631
  async () =>
528
632
  {
529
633
  betarenaAdEngineStore.useLocalStorage();
530
- await initialize();
634
+ // ╭─────
635
+ // │ NOTE:
636
+ // │ |: Delay initialization to ensure all elements are loaded on page
637
+ // ╰─────
638
+ setTimeout(() => { initialize(); return; }, 1000);
531
639
  return;
532
640
  }
533
641
  );
@@ -542,7 +650,6 @@
542
650
  () =>
543
651
  {
544
652
  detectDeviceType();
545
- console.log(detectDeviceType());
546
653
  return;
547
654
  }
548
655
  }
@@ -565,14 +672,14 @@
565
672
  ╰──────────────────────────────────────────────────────────────────────────────────╯
566
673
  -->
567
674
 
568
- {#if import.meta.env.DEV}
675
+ {#if false}
569
676
  <!--
570
677
  ╭─────
571
678
  │ [🐞]
572
679
  │ ➤ Testing Configuration(s)
573
680
  ╰─────
574
681
  -->
575
- <!-- <DevInfoBox>
682
+ <DevInfoBox>
576
683
  <p>
577
684
  [detected] Device Type :|: {deviceType}
578
685
  </p>
@@ -580,7 +687,7 @@
580
687
  [detected] Geo-Location :|: {geoLocation?.country_code}
581
688
  </p>
582
689
  <p>
583
- [detected] Page Advert Snippets Number :|: {betarenaAdsInjectMap.size}
690
+ [detected] Page Advert Snippets Number :|: {mapBetarenaAdvertStandardElement.size}
584
691
  </p>
585
692
  <p>
586
693
  [properties] AuthorId :|: {authorId}
@@ -589,9 +696,9 @@
589
696
  [properties] AuthorArticleTagIds :|: [{authorArticleTagIds}]
590
697
  </p>
591
698
  <p>
592
- [data] Adverts Fetched Number :|: {creativeDataMap.size}
699
+ [data] Adverts Fetched Number :|: {mapCreative.size}
593
700
  </p>
594
- </DevInfoBox> -->
701
+ </DevInfoBox>
595
702
 
596
703
  <!--
597
704
  ╭─────
@@ -599,17 +706,247 @@
599
706
  │ ➤ Testing Advert(s)
600
707
  ╰─────
601
708
  -->
602
- <!--
603
- <div
709
+ <!-- <div
604
710
  data-betarena-zone-id=1
605
711
  >
606
- </div>
712
+ </div> -->
607
713
 
608
714
  <hr>
609
715
 
610
716
  <div
611
717
  data-betarena-zone-id=2
612
718
  >
719
+ <p>
720
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
721
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
722
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
723
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
724
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
725
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
726
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
727
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
728
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
729
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
730
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
731
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
732
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
733
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
734
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
735
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
736
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
737
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
738
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
739
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
740
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
741
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
742
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
743
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
744
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
745
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
746
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
747
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
748
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
749
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
750
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
751
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
752
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
753
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
754
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
755
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
756
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
757
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
758
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
759
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
760
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
761
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
762
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
763
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
764
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
765
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
766
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
767
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
768
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
769
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
770
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
771
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
772
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
773
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
774
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
775
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
776
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
777
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
778
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
779
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
780
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
781
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
782
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
783
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
784
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
785
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
786
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
787
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
788
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
789
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
790
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
791
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
792
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
793
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
794
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
795
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
796
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
797
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
798
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
799
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
800
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
801
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
802
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
803
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
804
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
805
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
806
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
807
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
808
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
809
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
810
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
811
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
812
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
813
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
814
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
815
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
816
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
817
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
818
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
819
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
820
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
821
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
822
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
823
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
824
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
825
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
826
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
827
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
828
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
829
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
830
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
831
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
832
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
833
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
834
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
835
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
836
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
837
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
838
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
839
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
840
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
841
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
842
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
843
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
844
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
845
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
846
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
847
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
848
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
849
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
850
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
851
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
852
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
853
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
854
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
855
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
856
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
857
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
858
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
859
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
860
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
861
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
862
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
863
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
864
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
865
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
866
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
867
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
868
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
869
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
870
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
871
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
872
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
873
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
874
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
875
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
876
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
877
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
878
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
879
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
880
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
881
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
882
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
883
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
884
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
885
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
886
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
887
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
888
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
889
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
890
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
891
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
892
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
893
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
894
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
895
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
896
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
897
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
898
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
899
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
900
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
901
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
902
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
903
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
904
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
905
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
906
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
907
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
908
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
909
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
910
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
911
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
912
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
913
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
914
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
915
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
916
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
917
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
918
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
919
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
920
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
921
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
922
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
923
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
924
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
925
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
926
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
927
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
928
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
929
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
930
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
931
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
932
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
933
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
934
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
935
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
936
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
937
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
938
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
939
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
940
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
941
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
942
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
943
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
944
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
945
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
946
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
947
+ </p>
948
+ <p>
949
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
950
+ </p>
613
951
  </div>
614
- -->
615
952
  {/if}