@openreplay/tracker 9.0.12 → 9.0.14

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 (79) hide show
  1. package/cjs/app/index.js +2 -2
  2. package/cjs/index.js +3 -2
  3. package/cjs/modules/Network/fetchProxy.d.ts +1 -1
  4. package/cjs/modules/Network/fetchProxy.js +2 -0
  5. package/cjs/modules/mouse.js +1 -0
  6. package/cjs/modules/network.js +1 -0
  7. package/coverage/clover.xml +1783 -995
  8. package/coverage/coverage-final.json +30 -25
  9. package/coverage/lcov-report/index.html +45 -45
  10. package/coverage/lcov-report/main/app/canvas.ts.html +535 -0
  11. package/coverage/lcov-report/main/app/guards.ts.html +5 -2
  12. package/coverage/lcov-report/main/app/index.html +34 -19
  13. package/coverage/lcov-report/main/app/index.ts.html +1769 -116
  14. package/coverage/lcov-report/main/app/logger.ts.html +25 -91
  15. package/coverage/lcov-report/main/app/messages.gen.ts.html +122 -5
  16. package/coverage/lcov-report/main/app/nodes.ts.html +26 -8
  17. package/coverage/lcov-report/main/app/observer/iframe_observer.ts.html +2 -2
  18. package/coverage/lcov-report/main/app/observer/iframe_offsets.ts.html +1 -1
  19. package/coverage/lcov-report/main/app/observer/index.html +1 -1
  20. package/coverage/lcov-report/main/app/observer/shadow_root_observer.ts.html +2 -2
  21. package/coverage/lcov-report/main/app/observer/top_observer.ts.html +1 -1
  22. package/coverage/lcov-report/main/app/sanitizer.ts.html +12 -3
  23. package/coverage/lcov-report/main/app/session.ts.html +30 -9
  24. package/coverage/lcov-report/main/app/ticker.ts.html +1 -1
  25. package/coverage/lcov-report/main/index.html +13 -13
  26. package/coverage/lcov-report/main/index.ts.html +468 -102
  27. package/coverage/lcov-report/main/modules/Network/beaconProxy.ts.html +1 -1
  28. package/coverage/lcov-report/main/modules/Network/fetchProxy.ts.html +27 -6
  29. package/coverage/lcov-report/main/modules/Network/index.html +13 -13
  30. package/coverage/lcov-report/main/modules/Network/index.ts.html +1 -1
  31. package/coverage/lcov-report/main/modules/Network/networkMessage.ts.html +17 -8
  32. package/coverage/lcov-report/main/modules/Network/utils.ts.html +1 -1
  33. package/coverage/lcov-report/main/modules/Network/xhrProxy.ts.html +3 -3
  34. package/coverage/lcov-report/main/modules/attributeSender.ts.html +13 -4
  35. package/coverage/lcov-report/main/modules/axiosSpy.ts.html +1 -1
  36. package/coverage/lcov-report/main/modules/conditionsManager.ts.html +1399 -0
  37. package/coverage/lcov-report/main/modules/connection.ts.html +1 -1
  38. package/coverage/lcov-report/main/modules/console.ts.html +1 -1
  39. package/coverage/lcov-report/main/modules/constructedStyleSheets.ts.html +42 -30
  40. package/coverage/lcov-report/main/modules/cssrules.ts.html +1 -1
  41. package/coverage/lcov-report/main/modules/exception.ts.html +1 -1
  42. package/coverage/lcov-report/main/modules/featureFlags.ts.html +10 -7
  43. package/coverage/lcov-report/main/modules/focus.ts.html +1 -1
  44. package/coverage/lcov-report/main/modules/fonts.ts.html +1 -1
  45. package/coverage/lcov-report/main/modules/img.ts.html +23 -20
  46. package/coverage/lcov-report/main/modules/index.html +50 -20
  47. package/coverage/lcov-report/main/modules/input.ts.html +1 -1
  48. package/coverage/lcov-report/main/modules/mouse.ts.html +1 -1
  49. package/coverage/lcov-report/main/modules/network.ts.html +3 -3
  50. package/coverage/lcov-report/main/modules/performance.ts.html +1 -1
  51. package/coverage/lcov-report/main/modules/scroll.ts.html +1 -1
  52. package/coverage/lcov-report/main/modules/selection.ts.html +1 -1
  53. package/coverage/lcov-report/main/modules/tabs.ts.html +1 -1
  54. package/coverage/lcov-report/main/modules/tagWatcher.ts.html +334 -0
  55. package/coverage/lcov-report/main/modules/timing.ts.html +42 -6
  56. package/coverage/lcov-report/main/modules/userTesting/SignalManager.ts.html +370 -0
  57. package/coverage/lcov-report/main/modules/userTesting/dnd.ts.html +10 -22
  58. package/coverage/lcov-report/main/modules/userTesting/index.html +57 -27
  59. package/coverage/lcov-report/main/modules/userTesting/index.ts.html +814 -115
  60. package/coverage/lcov-report/main/modules/userTesting/recorder.ts.html +136 -67
  61. package/coverage/lcov-report/main/modules/userTesting/styles.ts.html +111 -39
  62. package/coverage/lcov-report/main/modules/userTesting/utils.ts.html +364 -0
  63. package/coverage/lcov-report/main/modules/viewport.ts.html +1 -1
  64. package/coverage/lcov-report/main/utils.ts.html +264 -6
  65. package/coverage/lcov-report/webworker/BatchWriter.ts.html +23 -5
  66. package/coverage/lcov-report/webworker/MessageEncoder.gen.ts.html +41 -5
  67. package/coverage/lcov-report/webworker/PrimitiveEncoder.ts.html +1 -1
  68. package/coverage/lcov-report/webworker/QueueSender.ts.html +18 -6
  69. package/coverage/lcov-report/webworker/index.html +17 -17
  70. package/coverage/lcov-report/webworker/index.ts.html +24 -15
  71. package/coverage/lcov.info +3283 -1718
  72. package/lib/app/index.js +2 -2
  73. package/lib/common/tsconfig.tsbuildinfo +1 -1
  74. package/lib/index.js +3 -2
  75. package/lib/modules/Network/fetchProxy.d.ts +1 -1
  76. package/lib/modules/Network/fetchProxy.js +2 -0
  77. package/lib/modules/mouse.js +1 -0
  78. package/lib/modules/network.js +1 -0
  79. package/package.json +1 -1
@@ -25,28 +25,28 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/283</span>
28
+ <span class='fraction'>0/490</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/159</span>
35
+ <span class='fraction'>0/261</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/56</span>
42
+ <span class='fraction'>0/87</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/272</span>
49
+ <span class='fraction'>0/476</span>
50
50
  </div>
51
51
 
52
52
 
@@ -762,10 +762,579 @@
762
762
  <a name='L697'></a><a href='#L697'>697</a>
763
763
  <a name='L698'></a><a href='#L698'>698</a>
764
764
  <a name='L699'></a><a href='#L699'>699</a>
765
- <a name='L700'></a><a href='#L700'>700</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a>
1000
+ <a name='L935'></a><a href='#L935'>935</a>
1001
+ <a name='L936'></a><a href='#L936'>936</a>
1002
+ <a name='L937'></a><a href='#L937'>937</a>
1003
+ <a name='L938'></a><a href='#L938'>938</a>
1004
+ <a name='L939'></a><a href='#L939'>939</a>
1005
+ <a name='L940'></a><a href='#L940'>940</a>
1006
+ <a name='L941'></a><a href='#L941'>941</a>
1007
+ <a name='L942'></a><a href='#L942'>942</a>
1008
+ <a name='L943'></a><a href='#L943'>943</a>
1009
+ <a name='L944'></a><a href='#L944'>944</a>
1010
+ <a name='L945'></a><a href='#L945'>945</a>
1011
+ <a name='L946'></a><a href='#L946'>946</a>
1012
+ <a name='L947'></a><a href='#L947'>947</a>
1013
+ <a name='L948'></a><a href='#L948'>948</a>
1014
+ <a name='L949'></a><a href='#L949'>949</a>
1015
+ <a name='L950'></a><a href='#L950'>950</a>
1016
+ <a name='L951'></a><a href='#L951'>951</a>
1017
+ <a name='L952'></a><a href='#L952'>952</a>
1018
+ <a name='L953'></a><a href='#L953'>953</a>
1019
+ <a name='L954'></a><a href='#L954'>954</a>
1020
+ <a name='L955'></a><a href='#L955'>955</a>
1021
+ <a name='L956'></a><a href='#L956'>956</a>
1022
+ <a name='L957'></a><a href='#L957'>957</a>
1023
+ <a name='L958'></a><a href='#L958'>958</a>
1024
+ <a name='L959'></a><a href='#L959'>959</a>
1025
+ <a name='L960'></a><a href='#L960'>960</a>
1026
+ <a name='L961'></a><a href='#L961'>961</a>
1027
+ <a name='L962'></a><a href='#L962'>962</a>
1028
+ <a name='L963'></a><a href='#L963'>963</a>
1029
+ <a name='L964'></a><a href='#L964'>964</a>
1030
+ <a name='L965'></a><a href='#L965'>965</a>
1031
+ <a name='L966'></a><a href='#L966'>966</a>
1032
+ <a name='L967'></a><a href='#L967'>967</a>
1033
+ <a name='L968'></a><a href='#L968'>968</a>
1034
+ <a name='L969'></a><a href='#L969'>969</a>
1035
+ <a name='L970'></a><a href='#L970'>970</a>
1036
+ <a name='L971'></a><a href='#L971'>971</a>
1037
+ <a name='L972'></a><a href='#L972'>972</a>
1038
+ <a name='L973'></a><a href='#L973'>973</a>
1039
+ <a name='L974'></a><a href='#L974'>974</a>
1040
+ <a name='L975'></a><a href='#L975'>975</a>
1041
+ <a name='L976'></a><a href='#L976'>976</a>
1042
+ <a name='L977'></a><a href='#L977'>977</a>
1043
+ <a name='L978'></a><a href='#L978'>978</a>
1044
+ <a name='L979'></a><a href='#L979'>979</a>
1045
+ <a name='L980'></a><a href='#L980'>980</a>
1046
+ <a name='L981'></a><a href='#L981'>981</a>
1047
+ <a name='L982'></a><a href='#L982'>982</a>
1048
+ <a name='L983'></a><a href='#L983'>983</a>
1049
+ <a name='L984'></a><a href='#L984'>984</a>
1050
+ <a name='L985'></a><a href='#L985'>985</a>
1051
+ <a name='L986'></a><a href='#L986'>986</a>
1052
+ <a name='L987'></a><a href='#L987'>987</a>
1053
+ <a name='L988'></a><a href='#L988'>988</a>
1054
+ <a name='L989'></a><a href='#L989'>989</a>
1055
+ <a name='L990'></a><a href='#L990'>990</a>
1056
+ <a name='L991'></a><a href='#L991'>991</a>
1057
+ <a name='L992'></a><a href='#L992'>992</a>
1058
+ <a name='L993'></a><a href='#L993'>993</a>
1059
+ <a name='L994'></a><a href='#L994'>994</a>
1060
+ <a name='L995'></a><a href='#L995'>995</a>
1061
+ <a name='L996'></a><a href='#L996'>996</a>
1062
+ <a name='L997'></a><a href='#L997'>997</a>
1063
+ <a name='L998'></a><a href='#L998'>998</a>
1064
+ <a name='L999'></a><a href='#L999'>999</a>
1065
+ <a name='L1000'></a><a href='#L1000'>1000</a>
1066
+ <a name='L1001'></a><a href='#L1001'>1001</a>
1067
+ <a name='L1002'></a><a href='#L1002'>1002</a>
1068
+ <a name='L1003'></a><a href='#L1003'>1003</a>
1069
+ <a name='L1004'></a><a href='#L1004'>1004</a>
1070
+ <a name='L1005'></a><a href='#L1005'>1005</a>
1071
+ <a name='L1006'></a><a href='#L1006'>1006</a>
1072
+ <a name='L1007'></a><a href='#L1007'>1007</a>
1073
+ <a name='L1008'></a><a href='#L1008'>1008</a>
1074
+ <a name='L1009'></a><a href='#L1009'>1009</a>
1075
+ <a name='L1010'></a><a href='#L1010'>1010</a>
1076
+ <a name='L1011'></a><a href='#L1011'>1011</a>
1077
+ <a name='L1012'></a><a href='#L1012'>1012</a>
1078
+ <a name='L1013'></a><a href='#L1013'>1013</a>
1079
+ <a name='L1014'></a><a href='#L1014'>1014</a>
1080
+ <a name='L1015'></a><a href='#L1015'>1015</a>
1081
+ <a name='L1016'></a><a href='#L1016'>1016</a>
1082
+ <a name='L1017'></a><a href='#L1017'>1017</a>
1083
+ <a name='L1018'></a><a href='#L1018'>1018</a>
1084
+ <a name='L1019'></a><a href='#L1019'>1019</a>
1085
+ <a name='L1020'></a><a href='#L1020'>1020</a>
1086
+ <a name='L1021'></a><a href='#L1021'>1021</a>
1087
+ <a name='L1022'></a><a href='#L1022'>1022</a>
1088
+ <a name='L1023'></a><a href='#L1023'>1023</a>
1089
+ <a name='L1024'></a><a href='#L1024'>1024</a>
1090
+ <a name='L1025'></a><a href='#L1025'>1025</a>
1091
+ <a name='L1026'></a><a href='#L1026'>1026</a>
1092
+ <a name='L1027'></a><a href='#L1027'>1027</a>
1093
+ <a name='L1028'></a><a href='#L1028'>1028</a>
1094
+ <a name='L1029'></a><a href='#L1029'>1029</a>
1095
+ <a name='L1030'></a><a href='#L1030'>1030</a>
1096
+ <a name='L1031'></a><a href='#L1031'>1031</a>
1097
+ <a name='L1032'></a><a href='#L1032'>1032</a>
1098
+ <a name='L1033'></a><a href='#L1033'>1033</a>
1099
+ <a name='L1034'></a><a href='#L1034'>1034</a>
1100
+ <a name='L1035'></a><a href='#L1035'>1035</a>
1101
+ <a name='L1036'></a><a href='#L1036'>1036</a>
1102
+ <a name='L1037'></a><a href='#L1037'>1037</a>
1103
+ <a name='L1038'></a><a href='#L1038'>1038</a>
1104
+ <a name='L1039'></a><a href='#L1039'>1039</a>
1105
+ <a name='L1040'></a><a href='#L1040'>1040</a>
1106
+ <a name='L1041'></a><a href='#L1041'>1041</a>
1107
+ <a name='L1042'></a><a href='#L1042'>1042</a>
1108
+ <a name='L1043'></a><a href='#L1043'>1043</a>
1109
+ <a name='L1044'></a><a href='#L1044'>1044</a>
1110
+ <a name='L1045'></a><a href='#L1045'>1045</a>
1111
+ <a name='L1046'></a><a href='#L1046'>1046</a>
1112
+ <a name='L1047'></a><a href='#L1047'>1047</a>
1113
+ <a name='L1048'></a><a href='#L1048'>1048</a>
1114
+ <a name='L1049'></a><a href='#L1049'>1049</a>
1115
+ <a name='L1050'></a><a href='#L1050'>1050</a>
1116
+ <a name='L1051'></a><a href='#L1051'>1051</a>
1117
+ <a name='L1052'></a><a href='#L1052'>1052</a>
1118
+ <a name='L1053'></a><a href='#L1053'>1053</a>
1119
+ <a name='L1054'></a><a href='#L1054'>1054</a>
1120
+ <a name='L1055'></a><a href='#L1055'>1055</a>
1121
+ <a name='L1056'></a><a href='#L1056'>1056</a>
1122
+ <a name='L1057'></a><a href='#L1057'>1057</a>
1123
+ <a name='L1058'></a><a href='#L1058'>1058</a>
1124
+ <a name='L1059'></a><a href='#L1059'>1059</a>
1125
+ <a name='L1060'></a><a href='#L1060'>1060</a>
1126
+ <a name='L1061'></a><a href='#L1061'>1061</a>
1127
+ <a name='L1062'></a><a href='#L1062'>1062</a>
1128
+ <a name='L1063'></a><a href='#L1063'>1063</a>
1129
+ <a name='L1064'></a><a href='#L1064'>1064</a>
1130
+ <a name='L1065'></a><a href='#L1065'>1065</a>
1131
+ <a name='L1066'></a><a href='#L1066'>1066</a>
1132
+ <a name='L1067'></a><a href='#L1067'>1067</a>
1133
+ <a name='L1068'></a><a href='#L1068'>1068</a>
1134
+ <a name='L1069'></a><a href='#L1069'>1069</a>
1135
+ <a name='L1070'></a><a href='#L1070'>1070</a>
1136
+ <a name='L1071'></a><a href='#L1071'>1071</a>
1137
+ <a name='L1072'></a><a href='#L1072'>1072</a>
1138
+ <a name='L1073'></a><a href='#L1073'>1073</a>
1139
+ <a name='L1074'></a><a href='#L1074'>1074</a>
1140
+ <a name='L1075'></a><a href='#L1075'>1075</a>
1141
+ <a name='L1076'></a><a href='#L1076'>1076</a>
1142
+ <a name='L1077'></a><a href='#L1077'>1077</a>
1143
+ <a name='L1078'></a><a href='#L1078'>1078</a>
1144
+ <a name='L1079'></a><a href='#L1079'>1079</a>
1145
+ <a name='L1080'></a><a href='#L1080'>1080</a>
1146
+ <a name='L1081'></a><a href='#L1081'>1081</a>
1147
+ <a name='L1082'></a><a href='#L1082'>1082</a>
1148
+ <a name='L1083'></a><a href='#L1083'>1083</a>
1149
+ <a name='L1084'></a><a href='#L1084'>1084</a>
1150
+ <a name='L1085'></a><a href='#L1085'>1085</a>
1151
+ <a name='L1086'></a><a href='#L1086'>1086</a>
1152
+ <a name='L1087'></a><a href='#L1087'>1087</a>
1153
+ <a name='L1088'></a><a href='#L1088'>1088</a>
1154
+ <a name='L1089'></a><a href='#L1089'>1089</a>
1155
+ <a name='L1090'></a><a href='#L1090'>1090</a>
1156
+ <a name='L1091'></a><a href='#L1091'>1091</a>
1157
+ <a name='L1092'></a><a href='#L1092'>1092</a>
1158
+ <a name='L1093'></a><a href='#L1093'>1093</a>
1159
+ <a name='L1094'></a><a href='#L1094'>1094</a>
1160
+ <a name='L1095'></a><a href='#L1095'>1095</a>
1161
+ <a name='L1096'></a><a href='#L1096'>1096</a>
1162
+ <a name='L1097'></a><a href='#L1097'>1097</a>
1163
+ <a name='L1098'></a><a href='#L1098'>1098</a>
1164
+ <a name='L1099'></a><a href='#L1099'>1099</a>
1165
+ <a name='L1100'></a><a href='#L1100'>1100</a>
1166
+ <a name='L1101'></a><a href='#L1101'>1101</a>
1167
+ <a name='L1102'></a><a href='#L1102'>1102</a>
1168
+ <a name='L1103'></a><a href='#L1103'>1103</a>
1169
+ <a name='L1104'></a><a href='#L1104'>1104</a>
1170
+ <a name='L1105'></a><a href='#L1105'>1105</a>
1171
+ <a name='L1106'></a><a href='#L1106'>1106</a>
1172
+ <a name='L1107'></a><a href='#L1107'>1107</a>
1173
+ <a name='L1108'></a><a href='#L1108'>1108</a>
1174
+ <a name='L1109'></a><a href='#L1109'>1109</a>
1175
+ <a name='L1110'></a><a href='#L1110'>1110</a>
1176
+ <a name='L1111'></a><a href='#L1111'>1111</a>
1177
+ <a name='L1112'></a><a href='#L1112'>1112</a>
1178
+ <a name='L1113'></a><a href='#L1113'>1113</a>
1179
+ <a name='L1114'></a><a href='#L1114'>1114</a>
1180
+ <a name='L1115'></a><a href='#L1115'>1115</a>
1181
+ <a name='L1116'></a><a href='#L1116'>1116</a>
1182
+ <a name='L1117'></a><a href='#L1117'>1117</a>
1183
+ <a name='L1118'></a><a href='#L1118'>1118</a>
1184
+ <a name='L1119'></a><a href='#L1119'>1119</a>
1185
+ <a name='L1120'></a><a href='#L1120'>1120</a>
1186
+ <a name='L1121'></a><a href='#L1121'>1121</a>
1187
+ <a name='L1122'></a><a href='#L1122'>1122</a>
1188
+ <a name='L1123'></a><a href='#L1123'>1123</a>
1189
+ <a name='L1124'></a><a href='#L1124'>1124</a>
1190
+ <a name='L1125'></a><a href='#L1125'>1125</a>
1191
+ <a name='L1126'></a><a href='#L1126'>1126</a>
1192
+ <a name='L1127'></a><a href='#L1127'>1127</a>
1193
+ <a name='L1128'></a><a href='#L1128'>1128</a>
1194
+ <a name='L1129'></a><a href='#L1129'>1129</a>
1195
+ <a name='L1130'></a><a href='#L1130'>1130</a>
1196
+ <a name='L1131'></a><a href='#L1131'>1131</a>
1197
+ <a name='L1132'></a><a href='#L1132'>1132</a>
1198
+ <a name='L1133'></a><a href='#L1133'>1133</a>
1199
+ <a name='L1134'></a><a href='#L1134'>1134</a>
1200
+ <a name='L1135'></a><a href='#L1135'>1135</a>
1201
+ <a name='L1136'></a><a href='#L1136'>1136</a>
1202
+ <a name='L1137'></a><a href='#L1137'>1137</a>
1203
+ <a name='L1138'></a><a href='#L1138'>1138</a>
1204
+ <a name='L1139'></a><a href='#L1139'>1139</a>
1205
+ <a name='L1140'></a><a href='#L1140'>1140</a>
1206
+ <a name='L1141'></a><a href='#L1141'>1141</a>
1207
+ <a name='L1142'></a><a href='#L1142'>1142</a>
1208
+ <a name='L1143'></a><a href='#L1143'>1143</a>
1209
+ <a name='L1144'></a><a href='#L1144'>1144</a>
1210
+ <a name='L1145'></a><a href='#L1145'>1145</a>
1211
+ <a name='L1146'></a><a href='#L1146'>1146</a>
1212
+ <a name='L1147'></a><a href='#L1147'>1147</a>
1213
+ <a name='L1148'></a><a href='#L1148'>1148</a>
1214
+ <a name='L1149'></a><a href='#L1149'>1149</a>
1215
+ <a name='L1150'></a><a href='#L1150'>1150</a>
1216
+ <a name='L1151'></a><a href='#L1151'>1151</a>
1217
+ <a name='L1152'></a><a href='#L1152'>1152</a>
1218
+ <a name='L1153'></a><a href='#L1153'>1153</a>
1219
+ <a name='L1154'></a><a href='#L1154'>1154</a>
1220
+ <a name='L1155'></a><a href='#L1155'>1155</a>
1221
+ <a name='L1156'></a><a href='#L1156'>1156</a>
1222
+ <a name='L1157'></a><a href='#L1157'>1157</a>
1223
+ <a name='L1158'></a><a href='#L1158'>1158</a>
1224
+ <a name='L1159'></a><a href='#L1159'>1159</a>
1225
+ <a name='L1160'></a><a href='#L1160'>1160</a>
1226
+ <a name='L1161'></a><a href='#L1161'>1161</a>
1227
+ <a name='L1162'></a><a href='#L1162'>1162</a>
1228
+ <a name='L1163'></a><a href='#L1163'>1163</a>
1229
+ <a name='L1164'></a><a href='#L1164'>1164</a>
1230
+ <a name='L1165'></a><a href='#L1165'>1165</a>
1231
+ <a name='L1166'></a><a href='#L1166'>1166</a>
1232
+ <a name='L1167'></a><a href='#L1167'>1167</a>
1233
+ <a name='L1168'></a><a href='#L1168'>1168</a>
1234
+ <a name='L1169'></a><a href='#L1169'>1169</a>
1235
+ <a name='L1170'></a><a href='#L1170'>1170</a>
1236
+ <a name='L1171'></a><a href='#L1171'>1171</a>
1237
+ <a name='L1172'></a><a href='#L1172'>1172</a>
1238
+ <a name='L1173'></a><a href='#L1173'>1173</a>
1239
+ <a name='L1174'></a><a href='#L1174'>1174</a>
1240
+ <a name='L1175'></a><a href='#L1175'>1175</a>
1241
+ <a name='L1176'></a><a href='#L1176'>1176</a>
1242
+ <a name='L1177'></a><a href='#L1177'>1177</a>
1243
+ <a name='L1178'></a><a href='#L1178'>1178</a>
1244
+ <a name='L1179'></a><a href='#L1179'>1179</a>
1245
+ <a name='L1180'></a><a href='#L1180'>1180</a>
1246
+ <a name='L1181'></a><a href='#L1181'>1181</a>
1247
+ <a name='L1182'></a><a href='#L1182'>1182</a>
1248
+ <a name='L1183'></a><a href='#L1183'>1183</a>
1249
+ <a name='L1184'></a><a href='#L1184'>1184</a>
1250
+ <a name='L1185'></a><a href='#L1185'>1185</a>
1251
+ <a name='L1186'></a><a href='#L1186'>1186</a>
1252
+ <a name='L1187'></a><a href='#L1187'>1187</a>
1253
+ <a name='L1188'></a><a href='#L1188'>1188</a>
1254
+ <a name='L1189'></a><a href='#L1189'>1189</a>
1255
+ <a name='L1190'></a><a href='#L1190'>1190</a>
1256
+ <a name='L1191'></a><a href='#L1191'>1191</a>
1257
+ <a name='L1192'></a><a href='#L1192'>1192</a>
1258
+ <a name='L1193'></a><a href='#L1193'>1193</a>
1259
+ <a name='L1194'></a><a href='#L1194'>1194</a>
1260
+ <a name='L1195'></a><a href='#L1195'>1195</a>
1261
+ <a name='L1196'></a><a href='#L1196'>1196</a>
1262
+ <a name='L1197'></a><a href='#L1197'>1197</a>
1263
+ <a name='L1198'></a><a href='#L1198'>1198</a>
1264
+ <a name='L1199'></a><a href='#L1199'>1199</a>
1265
+ <a name='L1200'></a><a href='#L1200'>1200</a>
1266
+ <a name='L1201'></a><a href='#L1201'>1201</a>
1267
+ <a name='L1202'></a><a href='#L1202'>1202</a>
1268
+ <a name='L1203'></a><a href='#L1203'>1203</a>
1269
+ <a name='L1204'></a><a href='#L1204'>1204</a>
1270
+ <a name='L1205'></a><a href='#L1205'>1205</a>
1271
+ <a name='L1206'></a><a href='#L1206'>1206</a>
1272
+ <a name='L1207'></a><a href='#L1207'>1207</a>
1273
+ <a name='L1208'></a><a href='#L1208'>1208</a>
1274
+ <a name='L1209'></a><a href='#L1209'>1209</a>
1275
+ <a name='L1210'></a><a href='#L1210'>1210</a>
1276
+ <a name='L1211'></a><a href='#L1211'>1211</a>
1277
+ <a name='L1212'></a><a href='#L1212'>1212</a>
1278
+ <a name='L1213'></a><a href='#L1213'>1213</a>
1279
+ <a name='L1214'></a><a href='#L1214'>1214</a>
1280
+ <a name='L1215'></a><a href='#L1215'>1215</a>
1281
+ <a name='L1216'></a><a href='#L1216'>1216</a>
1282
+ <a name='L1217'></a><a href='#L1217'>1217</a>
1283
+ <a name='L1218'></a><a href='#L1218'>1218</a>
1284
+ <a name='L1219'></a><a href='#L1219'>1219</a>
1285
+ <a name='L1220'></a><a href='#L1220'>1220</a>
1286
+ <a name='L1221'></a><a href='#L1221'>1221</a>
1287
+ <a name='L1222'></a><a href='#L1222'>1222</a>
1288
+ <a name='L1223'></a><a href='#L1223'>1223</a>
1289
+ <a name='L1224'></a><a href='#L1224'>1224</a>
1290
+ <a name='L1225'></a><a href='#L1225'>1225</a>
1291
+ <a name='L1226'></a><a href='#L1226'>1226</a>
1292
+ <a name='L1227'></a><a href='#L1227'>1227</a>
1293
+ <a name='L1228'></a><a href='#L1228'>1228</a>
1294
+ <a name='L1229'></a><a href='#L1229'>1229</a>
1295
+ <a name='L1230'></a><a href='#L1230'>1230</a>
1296
+ <a name='L1231'></a><a href='#L1231'>1231</a>
1297
+ <a name='L1232'></a><a href='#L1232'>1232</a>
1298
+ <a name='L1233'></a><a href='#L1233'>1233</a>
1299
+ <a name='L1234'></a><a href='#L1234'>1234</a>
1300
+ <a name='L1235'></a><a href='#L1235'>1235</a>
1301
+ <a name='L1236'></a><a href='#L1236'>1236</a>
1302
+ <a name='L1237'></a><a href='#L1237'>1237</a>
1303
+ <a name='L1238'></a><a href='#L1238'>1238</a>
1304
+ <a name='L1239'></a><a href='#L1239'>1239</a>
1305
+ <a name='L1240'></a><a href='#L1240'>1240</a>
1306
+ <a name='L1241'></a><a href='#L1241'>1241</a>
1307
+ <a name='L1242'></a><a href='#L1242'>1242</a>
1308
+ <a name='L1243'></a><a href='#L1243'>1243</a>
1309
+ <a name='L1244'></a><a href='#L1244'>1244</a>
1310
+ <a name='L1245'></a><a href='#L1245'>1245</a>
1311
+ <a name='L1246'></a><a href='#L1246'>1246</a>
1312
+ <a name='L1247'></a><a href='#L1247'>1247</a>
1313
+ <a name='L1248'></a><a href='#L1248'>1248</a>
1314
+ <a name='L1249'></a><a href='#L1249'>1249</a>
1315
+ <a name='L1250'></a><a href='#L1250'>1250</a>
1316
+ <a name='L1251'></a><a href='#L1251'>1251</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
766
1317
  <span class="cline-any cline-no">&nbsp;</span>
767
1318
  <span class="cline-any cline-no">&nbsp;</span>
768
1319
  <span class="cline-any cline-no">&nbsp;</span>
1320
+ <span class="cline-any cline-neutral">&nbsp;</span>
1321
+ <span class="cline-any cline-neutral">&nbsp;</span>
1322
+ <span class="cline-any cline-neutral">&nbsp;</span>
1323
+ <span class="cline-any cline-neutral">&nbsp;</span>
1324
+ <span class="cline-any cline-neutral">&nbsp;</span>
1325
+ <span class="cline-any cline-neutral">&nbsp;</span>
1326
+ <span class="cline-any cline-neutral">&nbsp;</span>
1327
+ <span class="cline-any cline-neutral">&nbsp;</span>
1328
+ <span class="cline-any cline-no">&nbsp;</span>
1329
+ <span class="cline-any cline-neutral">&nbsp;</span>
1330
+ <span class="cline-any cline-neutral">&nbsp;</span>
1331
+ <span class="cline-any cline-neutral">&nbsp;</span>
1332
+ <span class="cline-any cline-neutral">&nbsp;</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-neutral">&nbsp;</span>
1335
+ <span class="cline-any cline-neutral">&nbsp;</span>
1336
+ <span class="cline-any cline-neutral">&nbsp;</span>
1337
+ <span class="cline-any cline-no">&nbsp;</span>
769
1338
  <span class="cline-any cline-no">&nbsp;</span>
770
1339
  <span class="cline-any cline-no">&nbsp;</span>
771
1340
  <span class="cline-any cline-no">&nbsp;</span>
@@ -778,6 +1347,9 @@
778
1347
  <span class="cline-any cline-neutral">&nbsp;</span>
779
1348
  <span class="cline-any cline-neutral">&nbsp;</span>
780
1349
  <span class="cline-any cline-neutral">&nbsp;</span>
1350
+ <span class="cline-any cline-no">&nbsp;</span>
1351
+ <span class="cline-any cline-no">&nbsp;</span>
1352
+ <span class="cline-any cline-no">&nbsp;</span>
781
1353
  <span class="cline-any cline-neutral">&nbsp;</span>
782
1354
  <span class="cline-any cline-neutral">&nbsp;</span>
783
1355
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -805,6 +1377,22 @@
805
1377
  <span class="cline-any cline-neutral">&nbsp;</span>
806
1378
  <span class="cline-any cline-no">&nbsp;</span>
807
1379
  <span class="cline-any cline-no">&nbsp;</span>
1380
+ <span class="cline-any cline-no">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1382
+ <span class="cline-any cline-neutral">&nbsp;</span>
1383
+ <span class="cline-any cline-neutral">&nbsp;</span>
1384
+ <span class="cline-any cline-neutral">&nbsp;</span>
1385
+ <span class="cline-any cline-neutral">&nbsp;</span>
1386
+ <span class="cline-any cline-neutral">&nbsp;</span>
1387
+ <span class="cline-any cline-neutral">&nbsp;</span>
1388
+ <span class="cline-any cline-neutral">&nbsp;</span>
1389
+ <span class="cline-any cline-neutral">&nbsp;</span>
1390
+ <span class="cline-any cline-neutral">&nbsp;</span>
1391
+ <span class="cline-any cline-neutral">&nbsp;</span>
1392
+ <span class="cline-any cline-neutral">&nbsp;</span>
1393
+ <span class="cline-any cline-neutral">&nbsp;</span>
1394
+ <span class="cline-any cline-neutral">&nbsp;</span>
1395
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
1396
  <span class="cline-any cline-neutral">&nbsp;</span>
809
1397
  <span class="cline-any cline-neutral">&nbsp;</span>
810
1398
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -822,6 +1410,8 @@
822
1410
  <span class="cline-any cline-neutral">&nbsp;</span>
823
1411
  <span class="cline-any cline-neutral">&nbsp;</span>
824
1412
  <span class="cline-any cline-neutral">&nbsp;</span>
1413
+ <span class="cline-any cline-neutral">&nbsp;</span>
1414
+ <span class="cline-any cline-no">&nbsp;</span>
825
1415
  <span class="cline-any cline-no">&nbsp;</span>
826
1416
  <span class="cline-any cline-no">&nbsp;</span>
827
1417
  <span class="cline-any cline-no">&nbsp;</span>
@@ -879,6 +1469,13 @@
879
1469
  <span class="cline-any cline-neutral">&nbsp;</span>
880
1470
  <span class="cline-any cline-no">&nbsp;</span>
881
1471
  <span class="cline-any cline-neutral">&nbsp;</span>
1472
+ <span class="cline-any cline-neutral">&nbsp;</span>
1473
+ <span class="cline-any cline-neutral">&nbsp;</span>
1474
+ <span class="cline-any cline-neutral">&nbsp;</span>
1475
+ <span class="cline-any cline-no">&nbsp;</span>
1476
+ <span class="cline-any cline-no">&nbsp;</span>
1477
+ <span class="cline-any cline-neutral">&nbsp;</span>
1478
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
1479
  <span class="cline-any cline-no">&nbsp;</span>
883
1480
  <span class="cline-any cline-no">&nbsp;</span>
884
1481
  <span class="cline-any cline-no">&nbsp;</span>
@@ -894,14 +1491,24 @@
894
1491
  <span class="cline-any cline-no">&nbsp;</span>
895
1492
  <span class="cline-any cline-neutral">&nbsp;</span>
896
1493
  <span class="cline-any cline-neutral">&nbsp;</span>
1494
+ <span class="cline-any cline-no">&nbsp;</span>
1495
+ <span class="cline-any cline-neutral">&nbsp;</span>
1496
+ <span class="cline-any cline-no">&nbsp;</span>
1497
+ <span class="cline-any cline-neutral">&nbsp;</span>
1498
+ <span class="cline-any cline-neutral">&nbsp;</span>
1499
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
1500
  <span class="cline-any cline-neutral">&nbsp;</span>
898
1501
  <span class="cline-any cline-neutral">&nbsp;</span>
899
1502
  <span class="cline-any cline-neutral">&nbsp;</span>
900
1503
  <span class="cline-any cline-neutral">&nbsp;</span>
1504
+ <span class="cline-any cline-no">&nbsp;</span>
901
1505
  <span class="cline-any cline-neutral">&nbsp;</span>
902
1506
  <span class="cline-any cline-no">&nbsp;</span>
903
1507
  <span class="cline-any cline-no">&nbsp;</span>
904
1508
  <span class="cline-any cline-no">&nbsp;</span>
1509
+ <span class="cline-any cline-no">&nbsp;</span>
1510
+ <span class="cline-any cline-neutral">&nbsp;</span>
1511
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
1512
  <span class="cline-any cline-neutral">&nbsp;</span>
906
1513
  <span class="cline-any cline-neutral">&nbsp;</span>
907
1514
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -925,6 +1532,7 @@
925
1532
  <span class="cline-any cline-neutral">&nbsp;</span>
926
1533
  <span class="cline-any cline-no">&nbsp;</span>
927
1534
  <span class="cline-any cline-no">&nbsp;</span>
1535
+ <span class="cline-any cline-no">&nbsp;</span>
928
1536
  <span class="cline-any cline-neutral">&nbsp;</span>
929
1537
  <span class="cline-any cline-neutral">&nbsp;</span>
930
1538
  <span class="cline-any cline-no">&nbsp;</span>
@@ -943,6 +1551,9 @@
943
1551
  <span class="cline-any cline-no">&nbsp;</span>
944
1552
  <span class="cline-any cline-neutral">&nbsp;</span>
945
1553
  <span class="cline-any cline-no">&nbsp;</span>
1554
+ <span class="cline-any cline-no">&nbsp;</span>
1555
+ <span class="cline-any cline-neutral">&nbsp;</span>
1556
+ <span class="cline-any cline-no">&nbsp;</span>
946
1557
  <span class="cline-any cline-neutral">&nbsp;</span>
947
1558
  <span class="cline-any cline-no">&nbsp;</span>
948
1559
  <span class="cline-any cline-no">&nbsp;</span>
@@ -981,14 +1592,17 @@
981
1592
  <span class="cline-any cline-no">&nbsp;</span>
982
1593
  <span class="cline-any cline-no">&nbsp;</span>
983
1594
  <span class="cline-any cline-no">&nbsp;</span>
984
- <span class="cline-any cline-neutral">&nbsp;</span>
1595
+ <span class="cline-any cline-no">&nbsp;</span>
985
1596
  <span class="cline-any cline-neutral">&nbsp;</span>
986
1597
  <span class="cline-any cline-neutral">&nbsp;</span>
987
1598
  <span class="cline-any cline-no">&nbsp;</span>
988
1599
  <span class="cline-any cline-neutral">&nbsp;</span>
989
1600
  <span class="cline-any cline-neutral">&nbsp;</span>
1601
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
1602
  <span class="cline-any cline-no">&nbsp;</span>
991
1603
  <span class="cline-any cline-neutral">&nbsp;</span>
1604
+ <span class="cline-any cline-no">&nbsp;</span>
1605
+ <span class="cline-any cline-no">&nbsp;</span>
992
1606
  <span class="cline-any cline-neutral">&nbsp;</span>
993
1607
  <span class="cline-any cline-neutral">&nbsp;</span>
994
1608
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1008,11 +1622,31 @@
1008
1622
  <span class="cline-any cline-no">&nbsp;</span>
1009
1623
  <span class="cline-any cline-neutral">&nbsp;</span>
1010
1624
  <span class="cline-any cline-no">&nbsp;</span>
1625
+ <span class="cline-any cline-neutral">&nbsp;</span>
1626
+ <span class="cline-any cline-neutral">&nbsp;</span>
1627
+ <span class="cline-any cline-neutral">&nbsp;</span>
1628
+ <span class="cline-any cline-neutral">&nbsp;</span>
1629
+ <span class="cline-any cline-neutral">&nbsp;</span>
1630
+ <span class="cline-any cline-neutral">&nbsp;</span>
1631
+ <span class="cline-any cline-neutral">&nbsp;</span>
1632
+ <span class="cline-any cline-neutral">&nbsp;</span>
1633
+ <span class="cline-any cline-no">&nbsp;</span>
1011
1634
  <span class="cline-any cline-no">&nbsp;</span>
1012
1635
  <span class="cline-any cline-neutral">&nbsp;</span>
1013
1636
  <span class="cline-any cline-neutral">&nbsp;</span>
1637
+ <span class="cline-any cline-neutral">&nbsp;</span>
1638
+ <span class="cline-any cline-neutral">&nbsp;</span>
1639
+ <span class="cline-any cline-neutral">&nbsp;</span>
1640
+ <span class="cline-any cline-neutral">&nbsp;</span>
1641
+ <span class="cline-any cline-no">&nbsp;</span>
1642
+ <span class="cline-any cline-no">&nbsp;</span>
1643
+ <span class="cline-any cline-no">&nbsp;</span>
1644
+ <span class="cline-any cline-no">&nbsp;</span>
1645
+ <span class="cline-any cline-neutral">&nbsp;</span>
1646
+ <span class="cline-any cline-no">&nbsp;</span>
1014
1647
  <span class="cline-any cline-no">&nbsp;</span>
1015
1648
  <span class="cline-any cline-no">&nbsp;</span>
1649
+ <span class="cline-any cline-neutral">&nbsp;</span>
1016
1650
  <span class="cline-any cline-no">&nbsp;</span>
1017
1651
  <span class="cline-any cline-no">&nbsp;</span>
1018
1652
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1033,6 +1667,7 @@
1033
1667
  <span class="cline-any cline-neutral">&nbsp;</span>
1034
1668
  <span class="cline-any cline-neutral">&nbsp;</span>
1035
1669
  <span class="cline-any cline-neutral">&nbsp;</span>
1670
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
1671
  <span class="cline-any cline-no">&nbsp;</span>
1037
1672
  <span class="cline-any cline-no">&nbsp;</span>
1038
1673
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1049,42 +1684,93 @@
1049
1684
  <span class="cline-any cline-neutral">&nbsp;</span>
1050
1685
  <span class="cline-any cline-no">&nbsp;</span>
1051
1686
  <span class="cline-any cline-neutral">&nbsp;</span>
1687
+ <span class="cline-any cline-neutral">&nbsp;</span>
1688
+ <span class="cline-any cline-no">&nbsp;</span>
1689
+ <span class="cline-any cline-no">&nbsp;</span>
1690
+ <span class="cline-any cline-neutral">&nbsp;</span>
1691
+ <span class="cline-any cline-neutral">&nbsp;</span>
1692
+ <span class="cline-any cline-no">&nbsp;</span>
1693
+ <span class="cline-any cline-no">&nbsp;</span>
1694
+ <span class="cline-any cline-no">&nbsp;</span>
1695
+ <span class="cline-any cline-no">&nbsp;</span>
1696
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
1697
  <span class="cline-any cline-no">&nbsp;</span>
1053
1698
  <span class="cline-any cline-no">&nbsp;</span>
1054
1699
  <span class="cline-any cline-neutral">&nbsp;</span>
1055
1700
  <span class="cline-any cline-neutral">&nbsp;</span>
1701
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
1702
  <span class="cline-any cline-no">&nbsp;</span>
1057
1703
  <span class="cline-any cline-no">&nbsp;</span>
1058
1704
  <span class="cline-any cline-no">&nbsp;</span>
1059
1705
  <span class="cline-any cline-no">&nbsp;</span>
1060
1706
  <span class="cline-any cline-neutral">&nbsp;</span>
1061
1707
  <span class="cline-any cline-no">&nbsp;</span>
1708
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
1709
  <span class="cline-any cline-no">&nbsp;</span>
1063
1710
  <span class="cline-any cline-neutral">&nbsp;</span>
1064
1711
  <span class="cline-any cline-neutral">&nbsp;</span>
1065
1712
  <span class="cline-any cline-neutral">&nbsp;</span>
1713
+ <span class="cline-any cline-neutral">&nbsp;</span>
1714
+ <span class="cline-any cline-neutral">&nbsp;</span>
1715
+ <span class="cline-any cline-neutral">&nbsp;</span>
1716
+ <span class="cline-any cline-no">&nbsp;</span>
1066
1717
  <span class="cline-any cline-no">&nbsp;</span>
1067
1718
  <span class="cline-any cline-neutral">&nbsp;</span>
1068
1719
  <span class="cline-any cline-neutral">&nbsp;</span>
1069
1720
  <span class="cline-any cline-neutral">&nbsp;</span>
1070
1721
  <span class="cline-any cline-neutral">&nbsp;</span>
1071
1722
  <span class="cline-any cline-neutral">&nbsp;</span>
1723
+ <span class="cline-any cline-neutral">&nbsp;</span>
1724
+ <span class="cline-any cline-neutral">&nbsp;</span>
1725
+ <span class="cline-any cline-neutral">&nbsp;</span>
1726
+ <span class="cline-any cline-no">&nbsp;</span>
1727
+ <span class="cline-any cline-no">&nbsp;</span>
1728
+ <span class="cline-any cline-no">&nbsp;</span>
1729
+ <span class="cline-any cline-no">&nbsp;</span>
1730
+ <span class="cline-any cline-neutral">&nbsp;</span>
1731
+ <span class="cline-any cline-no">&nbsp;</span>
1732
+ <span class="cline-any cline-no">&nbsp;</span>
1072
1733
  <span class="cline-any cline-no">&nbsp;</span>
1734
+ <span class="cline-any cline-neutral">&nbsp;</span>
1735
+ <span class="cline-any cline-neutral">&nbsp;</span>
1736
+ <span class="cline-any cline-neutral">&nbsp;</span>
1737
+ <span class="cline-any cline-neutral">&nbsp;</span>
1073
1738
  <span class="cline-any cline-no">&nbsp;</span>
1074
1739
  <span class="cline-any cline-neutral">&nbsp;</span>
1075
1740
  <span class="cline-any cline-neutral">&nbsp;</span>
1076
1741
  <span class="cline-any cline-neutral">&nbsp;</span>
1742
+ <span class="cline-any cline-neutral">&nbsp;</span>
1743
+ <span class="cline-any cline-neutral">&nbsp;</span>
1744
+ <span class="cline-any cline-neutral">&nbsp;</span>
1745
+ <span class="cline-any cline-neutral">&nbsp;</span>
1746
+ <span class="cline-any cline-neutral">&nbsp;</span>
1747
+ <span class="cline-any cline-no">&nbsp;</span>
1748
+ <span class="cline-any cline-no">&nbsp;</span>
1749
+ <span class="cline-any cline-no">&nbsp;</span>
1077
1750
  <span class="cline-any cline-no">&nbsp;</span>
1078
1751
  <span class="cline-any cline-no">&nbsp;</span>
1079
1752
  <span class="cline-any cline-no">&nbsp;</span>
1080
1753
  <span class="cline-any cline-no">&nbsp;</span>
1754
+ <span class="cline-any cline-neutral">&nbsp;</span>
1755
+ <span class="cline-any cline-neutral">&nbsp;</span>
1756
+ <span class="cline-any cline-neutral">&nbsp;</span>
1757
+ <span class="cline-any cline-neutral">&nbsp;</span>
1758
+ <span class="cline-any cline-no">&nbsp;</span>
1081
1759
  <span class="cline-any cline-no">&nbsp;</span>
1760
+ <span class="cline-any cline-neutral">&nbsp;</span>
1082
1761
  <span class="cline-any cline-no">&nbsp;</span>
1083
1762
  <span class="cline-any cline-neutral">&nbsp;</span>
1084
1763
  <span class="cline-any cline-neutral">&nbsp;</span>
1085
1764
  <span class="cline-any cline-neutral">&nbsp;</span>
1765
+ <span class="cline-any cline-neutral">&nbsp;</span>
1766
+ <span class="cline-any cline-no">&nbsp;</span>
1767
+ <span class="cline-any cline-no">&nbsp;</span>
1768
+ <span class="cline-any cline-no">&nbsp;</span>
1769
+ <span class="cline-any cline-neutral">&nbsp;</span>
1770
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
1771
  <span class="cline-any cline-no">&nbsp;</span>
1087
1772
  <span class="cline-any cline-neutral">&nbsp;</span>
1773
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
1774
  <span class="cline-any cline-no">&nbsp;</span>
1089
1775
  <span class="cline-any cline-neutral">&nbsp;</span>
1090
1776
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1107,12 +1793,14 @@
1107
1793
  <span class="cline-any cline-no">&nbsp;</span>
1108
1794
  <span class="cline-any cline-neutral">&nbsp;</span>
1109
1795
  <span class="cline-any cline-neutral">&nbsp;</span>
1796
+ <span class="cline-any cline-neutral">&nbsp;</span>
1110
1797
  <span class="cline-any cline-no">&nbsp;</span>
1111
1798
  <span class="cline-any cline-no">&nbsp;</span>
1112
1799
  <span class="cline-any cline-neutral">&nbsp;</span>
1113
1800
  <span class="cline-any cline-no">&nbsp;</span>
1114
1801
  <span class="cline-any cline-neutral">&nbsp;</span>
1115
1802
  <span class="cline-any cline-neutral">&nbsp;</span>
1803
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
1804
  <span class="cline-any cline-no">&nbsp;</span>
1117
1805
  <span class="cline-any cline-no">&nbsp;</span>
1118
1806
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1126,6 +1814,7 @@
1126
1814
  <span class="cline-any cline-neutral">&nbsp;</span>
1127
1815
  <span class="cline-any cline-neutral">&nbsp;</span>
1128
1816
  <span class="cline-any cline-neutral">&nbsp;</span>
1817
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
1818
  <span class="cline-any cline-no">&nbsp;</span>
1130
1819
  <span class="cline-any cline-no">&nbsp;</span>
1131
1820
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1133,6 +1822,12 @@
1133
1822
  <span class="cline-any cline-no">&nbsp;</span>
1134
1823
  <span class="cline-any cline-neutral">&nbsp;</span>
1135
1824
  <span class="cline-any cline-neutral">&nbsp;</span>
1825
+ <span class="cline-any cline-no">&nbsp;</span>
1826
+ <span class="cline-any cline-no">&nbsp;</span>
1827
+ <span class="cline-any cline-neutral">&nbsp;</span>
1828
+ <span class="cline-any cline-neutral">&nbsp;</span>
1829
+ <span class="cline-any cline-neutral">&nbsp;</span>
1830
+ <span class="cline-any cline-neutral">&nbsp;</span>
1136
1831
  <span class="cline-any cline-neutral">&nbsp;</span>
1137
1832
  <span class="cline-any cline-neutral">&nbsp;</span>
1138
1833
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1161,15 +1856,18 @@
1161
1856
  <span class="cline-any cline-neutral">&nbsp;</span>
1162
1857
  <span class="cline-any cline-neutral">&nbsp;</span>
1163
1858
  <span class="cline-any cline-neutral">&nbsp;</span>
1859
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
1860
  <span class="cline-any cline-no">&nbsp;</span>
1165
1861
  <span class="cline-any cline-neutral">&nbsp;</span>
1166
1862
  <span class="cline-any cline-neutral">&nbsp;</span>
1167
1863
  <span class="cline-any cline-neutral">&nbsp;</span>
1168
1864
  <span class="cline-any cline-neutral">&nbsp;</span>
1169
1865
  <span class="cline-any cline-neutral">&nbsp;</span>
1866
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
1867
  <span class="cline-any cline-no">&nbsp;</span>
1171
1868
  <span class="cline-any cline-neutral">&nbsp;</span>
1172
1869
  <span class="cline-any cline-neutral">&nbsp;</span>
1870
+ <span class="cline-any cline-neutral">&nbsp;</span>
1173
1871
  <span class="cline-any cline-no">&nbsp;</span>
1174
1872
  <span class="cline-any cline-neutral">&nbsp;</span>
1175
1873
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1198,9 +1896,11 @@
1198
1896
  <span class="cline-any cline-no">&nbsp;</span>
1199
1897
  <span class="cline-any cline-neutral">&nbsp;</span>
1200
1898
  <span class="cline-any cline-neutral">&nbsp;</span>
1899
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
1900
  <span class="cline-any cline-no">&nbsp;</span>
1202
1901
  <span class="cline-any cline-neutral">&nbsp;</span>
1203
1902
  <span class="cline-any cline-neutral">&nbsp;</span>
1903
+ <span class="cline-any cline-neutral">&nbsp;</span>
1204
1904
  <span class="cline-any cline-no">&nbsp;</span>
1205
1905
  <span class="cline-any cline-no">&nbsp;</span>
1206
1906
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1216,6 +1916,7 @@
1216
1916
  <span class="cline-any cline-neutral">&nbsp;</span>
1217
1917
  <span class="cline-any cline-neutral">&nbsp;</span>
1218
1918
  <span class="cline-any cline-neutral">&nbsp;</span>
1919
+ <span class="cline-any cline-neutral">&nbsp;</span>
1219
1920
  <span class="cline-any cline-no">&nbsp;</span>
1220
1921
  <span class="cline-any cline-no">&nbsp;</span>
1221
1922
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1238,12 +1939,20 @@
1238
1939
  <span class="cline-any cline-neutral">&nbsp;</span>
1239
1940
  <span class="cline-any cline-neutral">&nbsp;</span>
1240
1941
  <span class="cline-any cline-neutral">&nbsp;</span>
1241
- <span class="cline-any cline-neutral">&nbsp;</span>
1242
1942
  <span class="cline-any cline-no">&nbsp;</span>
1243
1943
  <span class="cline-any cline-no">&nbsp;</span>
1944
+ <span class="cline-any cline-no">&nbsp;</span>
1945
+ <span class="cline-any cline-no">&nbsp;</span>
1946
+ <span class="cline-any cline-neutral">&nbsp;</span>
1244
1947
  <span class="cline-any cline-neutral">&nbsp;</span>
1245
1948
  <span class="cline-any cline-no">&nbsp;</span>
1246
1949
  <span class="cline-any cline-no">&nbsp;</span>
1950
+ <span class="cline-any cline-no">&nbsp;</span>
1951
+ <span class="cline-any cline-neutral">&nbsp;</span>
1952
+ <span class="cline-any cline-no">&nbsp;</span>
1953
+ <span class="cline-any cline-neutral">&nbsp;</span>
1954
+ <span class="cline-any cline-neutral">&nbsp;</span>
1955
+ <span class="cline-any cline-neutral">&nbsp;</span>
1247
1956
  <span class="cline-any cline-neutral">&nbsp;</span>
1248
1957
  <span class="cline-any cline-neutral">&nbsp;</span>
1249
1958
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1251,20 +1960,40 @@
1251
1960
  <span class="cline-any cline-neutral">&nbsp;</span>
1252
1961
  <span class="cline-any cline-no">&nbsp;</span>
1253
1962
  <span class="cline-any cline-no">&nbsp;</span>
1254
- <span class="cline-any cline-neutral">&nbsp;</span>
1255
1963
  <span class="cline-any cline-no">&nbsp;</span>
1256
1964
  <span class="cline-any cline-no">&nbsp;</span>
1257
1965
  <span class="cline-any cline-neutral">&nbsp;</span>
1258
1966
  <span class="cline-any cline-no">&nbsp;</span>
1259
- <span class="cline-any cline-neutral">&nbsp;</span>
1260
1967
  <span class="cline-any cline-no">&nbsp;</span>
1261
- <span class="cline-any cline-neutral">&nbsp;</span>
1262
1968
  <span class="cline-any cline-no">&nbsp;</span>
1263
1969
  <span class="cline-any cline-neutral">&nbsp;</span>
1264
1970
  <span class="cline-any cline-neutral">&nbsp;</span>
1265
1971
  <span class="cline-any cline-neutral">&nbsp;</span>
1266
1972
  <span class="cline-any cline-neutral">&nbsp;</span>
1267
1973
  <span class="cline-any cline-neutral">&nbsp;</span>
1974
+ <span class="cline-any cline-neutral">&nbsp;</span>
1975
+ <span class="cline-any cline-neutral">&nbsp;</span>
1976
+ <span class="cline-any cline-neutral">&nbsp;</span>
1977
+ <span class="cline-any cline-neutral">&nbsp;</span>
1978
+ <span class="cline-any cline-neutral">&nbsp;</span>
1979
+ <span class="cline-any cline-neutral">&nbsp;</span>
1980
+ <span class="cline-any cline-neutral">&nbsp;</span>
1981
+ <span class="cline-any cline-neutral">&nbsp;</span>
1982
+ <span class="cline-any cline-neutral">&nbsp;</span>
1983
+ <span class="cline-any cline-neutral">&nbsp;</span>
1984
+ <span class="cline-any cline-neutral">&nbsp;</span>
1985
+ <span class="cline-any cline-neutral">&nbsp;</span>
1986
+ <span class="cline-any cline-neutral">&nbsp;</span>
1987
+ <span class="cline-any cline-neutral">&nbsp;</span>
1988
+ <span class="cline-any cline-neutral">&nbsp;</span>
1989
+ <span class="cline-any cline-neutral">&nbsp;</span>
1990
+ <span class="cline-any cline-neutral">&nbsp;</span>
1991
+ <span class="cline-any cline-neutral">&nbsp;</span>
1992
+ <span class="cline-any cline-neutral">&nbsp;</span>
1993
+ <span class="cline-any cline-neutral">&nbsp;</span>
1994
+ <span class="cline-any cline-neutral">&nbsp;</span>
1995
+ <span class="cline-any cline-neutral">&nbsp;</span>
1996
+ <span class="cline-any cline-no">&nbsp;</span>
1268
1997
  <span class="cline-any cline-no">&nbsp;</span>
1269
1998
  <span class="cline-any cline-no">&nbsp;</span>
1270
1999
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1274,25 +2003,54 @@
1274
2003
  <span class="cline-any cline-neutral">&nbsp;</span>
1275
2004
  <span class="cline-any cline-neutral">&nbsp;</span>
1276
2005
  <span class="cline-any cline-neutral">&nbsp;</span>
2006
+ <span class="cline-any cline-no">&nbsp;</span>
2007
+ <span class="cline-any cline-no">&nbsp;</span>
2008
+ <span class="cline-any cline-no">&nbsp;</span>
2009
+ <span class="cline-any cline-no">&nbsp;</span>
2010
+ <span class="cline-any cline-no">&nbsp;</span>
2011
+ <span class="cline-any cline-no">&nbsp;</span>
1277
2012
  <span class="cline-any cline-neutral">&nbsp;</span>
2013
+ <span class="cline-any cline-no">&nbsp;</span>
2014
+ <span class="cline-any cline-no">&nbsp;</span>
2015
+ <span class="cline-any cline-no">&nbsp;</span>
2016
+ <span class="cline-any cline-no">&nbsp;</span>
2017
+ <span class="cline-any cline-no">&nbsp;</span>
2018
+ <span class="cline-any cline-no">&nbsp;</span>
2019
+ <span class="cline-any cline-no">&nbsp;</span>
2020
+ <span class="cline-any cline-no">&nbsp;</span>
1278
2021
  <span class="cline-any cline-neutral">&nbsp;</span>
1279
- <span class="cline-any cline-neutral">&nbsp;</span>
1280
2022
  <span class="cline-any cline-no">&nbsp;</span>
1281
2023
  <span class="cline-any cline-no">&nbsp;</span>
1282
2024
  <span class="cline-any cline-no">&nbsp;</span>
2025
+ <span class="cline-any cline-neutral">&nbsp;</span>
2026
+ <span class="cline-any cline-no">&nbsp;</span>
2027
+ <span class="cline-any cline-no">&nbsp;</span>
1283
2028
  <span class="cline-any cline-no">&nbsp;</span>
1284
2029
  <span class="cline-any cline-no">&nbsp;</span>
1285
2030
  <span class="cline-any cline-neutral">&nbsp;</span>
1286
2031
  <span class="cline-any cline-no">&nbsp;</span>
1287
2032
  <span class="cline-any cline-no">&nbsp;</span>
1288
2033
  <span class="cline-any cline-neutral">&nbsp;</span>
2034
+ <span class="cline-any cline-no">&nbsp;</span>
2035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1289
2036
  <span class="cline-any cline-neutral">&nbsp;</span>
1290
2037
  <span class="cline-any cline-neutral">&nbsp;</span>
2038
+ <span class="cline-any cline-no">&nbsp;</span>
2039
+ <span class="cline-any cline-no">&nbsp;</span>
2040
+ <span class="cline-any cline-neutral">&nbsp;</span>
2041
+ <span class="cline-any cline-no">&nbsp;</span>
1291
2042
  <span class="cline-any cline-neutral">&nbsp;</span>
2043
+ <span class="cline-any cline-no">&nbsp;</span>
2044
+ <span class="cline-any cline-no">&nbsp;</span>
1292
2045
  <span class="cline-any cline-neutral">&nbsp;</span>
2046
+ <span class="cline-any cline-no">&nbsp;</span>
2047
+ <span class="cline-any cline-no">&nbsp;</span>
1293
2048
  <span class="cline-any cline-neutral">&nbsp;</span>
2049
+ <span class="cline-any cline-no">&nbsp;</span>
1294
2050
  <span class="cline-any cline-neutral">&nbsp;</span>
1295
2051
  <span class="cline-any cline-neutral">&nbsp;</span>
2052
+ <span class="cline-any cline-no">&nbsp;</span>
2053
+ <span class="cline-any cline-no">&nbsp;</span>
1296
2054
  <span class="cline-any cline-neutral">&nbsp;</span>
1297
2055
  <span class="cline-any cline-neutral">&nbsp;</span>
1298
2056
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1303,21 +2061,52 @@
1303
2061
  <span class="cline-any cline-neutral">&nbsp;</span>
1304
2062
  <span class="cline-any cline-no">&nbsp;</span>
1305
2063
  <span class="cline-any cline-no">&nbsp;</span>
1306
- <span class="cline-any cline-neutral">&nbsp;</span>
2064
+ <span class="cline-any cline-no">&nbsp;</span>
2065
+ <span class="cline-any cline-no">&nbsp;</span>
2066
+ <span class="cline-any cline-no">&nbsp;</span>
2067
+ <span class="cline-any cline-no">&nbsp;</span>
2068
+ <span class="cline-any cline-no">&nbsp;</span>
2069
+ <span class="cline-any cline-no">&nbsp;</span>
2070
+ <span class="cline-any cline-no">&nbsp;</span>
1307
2071
  <span class="cline-any cline-no">&nbsp;</span>
1308
2072
  <span class="cline-any cline-neutral">&nbsp;</span>
2073
+ <span class="cline-any cline-no">&nbsp;</span>
2074
+ <span class="cline-any cline-no">&nbsp;</span>
2075
+ <span class="cline-any cline-no">&nbsp;</span>
2076
+ <span class="cline-any cline-no">&nbsp;</span>
2077
+ <span class="cline-any cline-no">&nbsp;</span>
1309
2078
  <span class="cline-any cline-neutral">&nbsp;</span>
1310
2079
  <span class="cline-any cline-no">&nbsp;</span>
2080
+ <span class="cline-any cline-no">&nbsp;</span>
1311
2081
  <span class="cline-any cline-neutral">&nbsp;</span>
2082
+ <span class="cline-any cline-no">&nbsp;</span>
1312
2083
  <span class="cline-any cline-neutral">&nbsp;</span>
1313
2084
  <span class="cline-any cline-neutral">&nbsp;</span>
1314
2085
  <span class="cline-any cline-neutral">&nbsp;</span>
2086
+ <span class="cline-any cline-no">&nbsp;</span>
2087
+ <span class="cline-any cline-no">&nbsp;</span>
2088
+ <span class="cline-any cline-no">&nbsp;</span>
1315
2089
  <span class="cline-any cline-neutral">&nbsp;</span>
2090
+ <span class="cline-any cline-no">&nbsp;</span>
1316
2091
  <span class="cline-any cline-neutral">&nbsp;</span>
1317
2092
  <span class="cline-any cline-no">&nbsp;</span>
1318
2093
  <span class="cline-any cline-no">&nbsp;</span>
1319
2094
  <span class="cline-any cline-neutral">&nbsp;</span>
1320
2095
  <span class="cline-any cline-no">&nbsp;</span>
2096
+ <span class="cline-any cline-neutral">&nbsp;</span>
2097
+ <span class="cline-any cline-neutral">&nbsp;</span>
2098
+ <span class="cline-any cline-neutral">&nbsp;</span>
2099
+ <span class="cline-any cline-neutral">&nbsp;</span>
2100
+ <span class="cline-any cline-neutral">&nbsp;</span>
2101
+ <span class="cline-any cline-neutral">&nbsp;</span>
2102
+ <span class="cline-any cline-neutral">&nbsp;</span>
2103
+ <span class="cline-any cline-neutral">&nbsp;</span>
2104
+ <span class="cline-any cline-neutral">&nbsp;</span>
2105
+ <span class="cline-any cline-neutral">&nbsp;</span>
2106
+ <span class="cline-any cline-neutral">&nbsp;</span>
2107
+ <span class="cline-any cline-neutral">&nbsp;</span>
2108
+ <span class="cline-any cline-neutral">&nbsp;</span>
2109
+ <span class="cline-any cline-neutral">&nbsp;</span>
1321
2110
  <span class="cline-any cline-no">&nbsp;</span>
1322
2111
  <span class="cline-any cline-neutral">&nbsp;</span>
1323
2112
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1325,42 +2114,353 @@
1325
2114
  <span class="cline-any cline-neutral">&nbsp;</span>
1326
2115
  <span class="cline-any cline-neutral">&nbsp;</span>
1327
2116
  <span class="cline-any cline-neutral">&nbsp;</span>
2117
+ <span class="cline-any cline-no">&nbsp;</span>
2118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1328
2119
  <span class="cline-any cline-neutral">&nbsp;</span>
1329
2120
  <span class="cline-any cline-neutral">&nbsp;</span>
1330
2121
  <span class="cline-any cline-neutral">&nbsp;</span>
1331
2122
  <span class="cline-any cline-neutral">&nbsp;</span>
1332
2123
  <span class="cline-any cline-neutral">&nbsp;</span>
2124
+ <span class="cline-any cline-no">&nbsp;</span>
2125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1333
2126
  <span class="cline-any cline-neutral">&nbsp;</span>
1334
2127
  <span class="cline-any cline-neutral">&nbsp;</span>
1335
2128
  <span class="cline-any cline-neutral">&nbsp;</span>
1336
2129
  <span class="cline-any cline-neutral">&nbsp;</span>
1337
2130
  <span class="cline-any cline-neutral">&nbsp;</span>
2131
+ <span class="cline-any cline-neutral">&nbsp;</span>
2132
+ <span class="cline-any cline-neutral">&nbsp;</span>
2133
+ <span class="cline-any cline-neutral">&nbsp;</span>
2134
+ <span class="cline-any cline-neutral">&nbsp;</span>
2135
+ <span class="cline-any cline-no">&nbsp;</span>
2136
+ <span class="cline-any cline-no">&nbsp;</span>
2137
+ <span class="cline-any cline-no">&nbsp;</span>
2138
+ <span class="cline-any cline-neutral">&nbsp;</span>
2139
+ <span class="cline-any cline-neutral">&nbsp;</span>
2140
+ <span class="cline-any cline-neutral">&nbsp;</span>
2141
+ <span class="cline-any cline-neutral">&nbsp;</span>
2142
+ <span class="cline-any cline-neutral">&nbsp;</span>
2143
+ <span class="cline-any cline-neutral">&nbsp;</span>
2144
+ <span class="cline-any cline-neutral">&nbsp;</span>
2145
+ <span class="cline-any cline-neutral">&nbsp;</span>
2146
+ <span class="cline-any cline-neutral">&nbsp;</span>
2147
+ <span class="cline-any cline-no">&nbsp;</span>
2148
+ <span class="cline-any cline-neutral">&nbsp;</span>
2149
+ <span class="cline-any cline-neutral">&nbsp;</span>
2150
+ <span class="cline-any cline-neutral">&nbsp;</span>
2151
+ <span class="cline-any cline-neutral">&nbsp;</span>
2152
+ <span class="cline-any cline-neutral">&nbsp;</span>
2153
+ <span class="cline-any cline-neutral">&nbsp;</span>
2154
+ <span class="cline-any cline-neutral">&nbsp;</span>
2155
+ <span class="cline-any cline-neutral">&nbsp;</span>
2156
+ <span class="cline-any cline-neutral">&nbsp;</span>
2157
+ <span class="cline-any cline-neutral">&nbsp;</span>
2158
+ <span class="cline-any cline-neutral">&nbsp;</span>
2159
+ <span class="cline-any cline-neutral">&nbsp;</span>
2160
+ <span class="cline-any cline-neutral">&nbsp;</span>
2161
+ <span class="cline-any cline-neutral">&nbsp;</span>
2162
+ <span class="cline-any cline-neutral">&nbsp;</span>
2163
+ <span class="cline-any cline-neutral">&nbsp;</span>
2164
+ <span class="cline-any cline-neutral">&nbsp;</span>
2165
+ <span class="cline-any cline-neutral">&nbsp;</span>
2166
+ <span class="cline-any cline-neutral">&nbsp;</span>
2167
+ <span class="cline-any cline-neutral">&nbsp;</span>
2168
+ <span class="cline-any cline-neutral">&nbsp;</span>
2169
+ <span class="cline-any cline-neutral">&nbsp;</span>
2170
+ <span class="cline-any cline-neutral">&nbsp;</span>
2171
+ <span class="cline-any cline-neutral">&nbsp;</span>
2172
+ <span class="cline-any cline-neutral">&nbsp;</span>
2173
+ <span class="cline-any cline-neutral">&nbsp;</span>
2174
+ <span class="cline-any cline-no">&nbsp;</span>
2175
+ <span class="cline-any cline-no">&nbsp;</span>
2176
+ <span class="cline-any cline-neutral">&nbsp;</span>
2177
+ <span class="cline-any cline-neutral">&nbsp;</span>
2178
+ <span class="cline-any cline-neutral">&nbsp;</span>
2179
+ <span class="cline-any cline-neutral">&nbsp;</span>
2180
+ <span class="cline-any cline-no">&nbsp;</span>
2181
+ <span class="cline-any cline-no">&nbsp;</span>
2182
+ <span class="cline-any cline-neutral">&nbsp;</span>
2183
+ <span class="cline-any cline-neutral">&nbsp;</span>
2184
+ <span class="cline-any cline-neutral">&nbsp;</span>
2185
+ <span class="cline-any cline-neutral">&nbsp;</span>
2186
+ <span class="cline-any cline-neutral">&nbsp;</span>
2187
+ <span class="cline-any cline-neutral">&nbsp;</span>
2188
+ <span class="cline-any cline-neutral">&nbsp;</span>
2189
+ <span class="cline-any cline-no">&nbsp;</span>
2190
+ <span class="cline-any cline-no">&nbsp;</span>
2191
+ <span class="cline-any cline-neutral">&nbsp;</span>
2192
+ <span class="cline-any cline-no">&nbsp;</span>
2193
+ <span class="cline-any cline-no">&nbsp;</span>
2194
+ <span class="cline-any cline-neutral">&nbsp;</span>
2195
+ <span class="cline-any cline-neutral">&nbsp;</span>
2196
+ <span class="cline-any cline-neutral">&nbsp;</span>
2197
+ <span class="cline-any cline-neutral">&nbsp;</span>
2198
+ <span class="cline-any cline-neutral">&nbsp;</span>
2199
+ <span class="cline-any cline-neutral">&nbsp;</span>
2200
+ <span class="cline-any cline-neutral">&nbsp;</span>
2201
+ <span class="cline-any cline-no">&nbsp;</span>
2202
+ <span class="cline-any cline-no">&nbsp;</span>
2203
+ <span class="cline-any cline-no">&nbsp;</span>
2204
+ <span class="cline-any cline-neutral">&nbsp;</span>
2205
+ <span class="cline-any cline-no">&nbsp;</span>
2206
+ <span class="cline-any cline-no">&nbsp;</span>
2207
+ <span class="cline-any cline-no">&nbsp;</span>
2208
+ <span class="cline-any cline-no">&nbsp;</span>
2209
+ <span class="cline-any cline-neutral">&nbsp;</span>
2210
+ <span class="cline-any cline-no">&nbsp;</span>
2211
+ <span class="cline-any cline-neutral">&nbsp;</span>
2212
+ <span class="cline-any cline-neutral">&nbsp;</span>
2213
+ <span class="cline-any cline-neutral">&nbsp;</span>
2214
+ <span class="cline-any cline-neutral">&nbsp;</span>
2215
+ <span class="cline-any cline-no">&nbsp;</span>
2216
+ <span class="cline-any cline-no">&nbsp;</span>
2217
+ <span class="cline-any cline-neutral">&nbsp;</span>
2218
+ <span class="cline-any cline-no">&nbsp;</span>
2219
+ <span class="cline-any cline-no">&nbsp;</span>
2220
+ <span class="cline-any cline-no">&nbsp;</span>
2221
+ <span class="cline-any cline-neutral">&nbsp;</span>
2222
+ <span class="cline-any cline-neutral">&nbsp;</span>
2223
+ <span class="cline-any cline-no">&nbsp;</span>
2224
+ <span class="cline-any cline-no">&nbsp;</span>
2225
+ <span class="cline-any cline-neutral">&nbsp;</span>
2226
+ <span class="cline-any cline-no">&nbsp;</span>
2227
+ <span class="cline-any cline-neutral">&nbsp;</span>
2228
+ <span class="cline-any cline-no">&nbsp;</span>
2229
+ <span class="cline-any cline-neutral">&nbsp;</span>
2230
+ <span class="cline-any cline-no">&nbsp;</span>
2231
+ <span class="cline-any cline-neutral">&nbsp;</span>
2232
+ <span class="cline-any cline-neutral">&nbsp;</span>
2233
+ <span class="cline-any cline-neutral">&nbsp;</span>
2234
+ <span class="cline-any cline-neutral">&nbsp;</span>
2235
+ <span class="cline-any cline-neutral">&nbsp;</span>
2236
+ <span class="cline-any cline-no">&nbsp;</span>
2237
+ <span class="cline-any cline-no">&nbsp;</span>
2238
+ <span class="cline-any cline-neutral">&nbsp;</span>
2239
+ <span class="cline-any cline-neutral">&nbsp;</span>
2240
+ <span class="cline-any cline-neutral">&nbsp;</span>
2241
+ <span class="cline-any cline-neutral">&nbsp;</span>
2242
+ <span class="cline-any cline-neutral">&nbsp;</span>
2243
+ <span class="cline-any cline-neutral">&nbsp;</span>
2244
+ <span class="cline-any cline-neutral">&nbsp;</span>
2245
+ <span class="cline-any cline-neutral">&nbsp;</span>
2246
+ <span class="cline-any cline-neutral">&nbsp;</span>
2247
+ <span class="cline-any cline-neutral">&nbsp;</span>
2248
+ <span class="cline-any cline-no">&nbsp;</span>
2249
+ <span class="cline-any cline-no">&nbsp;</span>
2250
+ <span class="cline-any cline-no">&nbsp;</span>
2251
+ <span class="cline-any cline-neutral">&nbsp;</span>
2252
+ <span class="cline-any cline-no">&nbsp;</span>
2253
+ <span class="cline-any cline-neutral">&nbsp;</span>
2254
+ <span class="cline-any cline-neutral">&nbsp;</span>
2255
+ <span class="cline-any cline-neutral">&nbsp;</span>
2256
+ <span class="cline-any cline-neutral">&nbsp;</span>
2257
+ <span class="cline-any cline-neutral">&nbsp;</span>
2258
+ <span class="cline-any cline-no">&nbsp;</span>
2259
+ <span class="cline-any cline-neutral">&nbsp;</span>
2260
+ <span class="cline-any cline-neutral">&nbsp;</span>
2261
+ <span class="cline-any cline-neutral">&nbsp;</span>
2262
+ <span class="cline-any cline-neutral">&nbsp;</span>
2263
+ <span class="cline-any cline-neutral">&nbsp;</span>
2264
+ <span class="cline-any cline-neutral">&nbsp;</span>
2265
+ <span class="cline-any cline-neutral">&nbsp;</span>
2266
+ <span class="cline-any cline-neutral">&nbsp;</span>
2267
+ <span class="cline-any cline-neutral">&nbsp;</span>
2268
+ <span class="cline-any cline-neutral">&nbsp;</span>
2269
+ <span class="cline-any cline-neutral">&nbsp;</span>
2270
+ <span class="cline-any cline-neutral">&nbsp;</span>
2271
+ <span class="cline-any cline-neutral">&nbsp;</span>
2272
+ <span class="cline-any cline-neutral">&nbsp;</span>
2273
+ <span class="cline-any cline-neutral">&nbsp;</span>
2274
+ <span class="cline-any cline-neutral">&nbsp;</span>
2275
+ <span class="cline-any cline-neutral">&nbsp;</span>
2276
+ <span class="cline-any cline-neutral">&nbsp;</span>
2277
+ <span class="cline-any cline-neutral">&nbsp;</span>
2278
+ <span class="cline-any cline-no">&nbsp;</span>
2279
+ <span class="cline-any cline-no">&nbsp;</span>
2280
+ <span class="cline-any cline-neutral">&nbsp;</span>
2281
+ <span class="cline-any cline-no">&nbsp;</span>
2282
+ <span class="cline-any cline-neutral">&nbsp;</span>
2283
+ <span class="cline-any cline-neutral">&nbsp;</span>
2284
+ <span class="cline-any cline-no">&nbsp;</span>
2285
+ <span class="cline-any cline-neutral">&nbsp;</span>
2286
+ <span class="cline-any cline-neutral">&nbsp;</span>
2287
+ <span class="cline-any cline-neutral">&nbsp;</span>
2288
+ <span class="cline-any cline-neutral">&nbsp;</span>
2289
+ <span class="cline-any cline-neutral">&nbsp;</span>
2290
+ <span class="cline-any cline-no">&nbsp;</span>
2291
+ <span class="cline-any cline-no">&nbsp;</span>
2292
+ <span class="cline-any cline-no">&nbsp;</span>
2293
+ <span class="cline-any cline-no">&nbsp;</span>
2294
+ <span class="cline-any cline-no">&nbsp;</span>
2295
+ <span class="cline-any cline-neutral">&nbsp;</span>
2296
+ <span class="cline-any cline-no">&nbsp;</span>
2297
+ <span class="cline-any cline-no">&nbsp;</span>
2298
+ <span class="cline-any cline-no">&nbsp;</span>
2299
+ <span class="cline-any cline-no">&nbsp;</span>
2300
+ <span class="cline-any cline-neutral">&nbsp;</span>
2301
+ <span class="cline-any cline-neutral">&nbsp;</span>
2302
+ <span class="cline-any cline-neutral">&nbsp;</span>
2303
+ <span class="cline-any cline-neutral">&nbsp;</span>
2304
+ <span class="cline-any cline-neutral">&nbsp;</span>
2305
+ <span class="cline-any cline-neutral">&nbsp;</span>
2306
+ <span class="cline-any cline-neutral">&nbsp;</span>
2307
+ <span class="cline-any cline-neutral">&nbsp;</span>
2308
+ <span class="cline-any cline-neutral">&nbsp;</span>
2309
+ <span class="cline-any cline-neutral">&nbsp;</span>
2310
+ <span class="cline-any cline-neutral">&nbsp;</span>
2311
+ <span class="cline-any cline-neutral">&nbsp;</span>
2312
+ <span class="cline-any cline-neutral">&nbsp;</span>
2313
+ <span class="cline-any cline-neutral">&nbsp;</span>
2314
+ <span class="cline-any cline-neutral">&nbsp;</span>
2315
+ <span class="cline-any cline-neutral">&nbsp;</span>
2316
+ <span class="cline-any cline-neutral">&nbsp;</span>
2317
+ <span class="cline-any cline-neutral">&nbsp;</span>
2318
+ <span class="cline-any cline-neutral">&nbsp;</span>
2319
+ <span class="cline-any cline-no">&nbsp;</span>
2320
+ <span class="cline-any cline-no">&nbsp;</span>
2321
+ <span class="cline-any cline-neutral">&nbsp;</span>
2322
+ <span class="cline-any cline-neutral">&nbsp;</span>
2323
+ <span class="cline-any cline-neutral">&nbsp;</span>
2324
+ <span class="cline-any cline-neutral">&nbsp;</span>
2325
+ <span class="cline-any cline-neutral">&nbsp;</span>
2326
+ <span class="cline-any cline-neutral">&nbsp;</span>
2327
+ <span class="cline-any cline-neutral">&nbsp;</span>
2328
+ <span class="cline-any cline-no">&nbsp;</span>
2329
+ <span class="cline-any cline-no">&nbsp;</span>
2330
+ <span class="cline-any cline-no">&nbsp;</span>
2331
+ <span class="cline-any cline-neutral">&nbsp;</span>
2332
+ <span class="cline-any cline-no">&nbsp;</span>
2333
+ <span class="cline-any cline-no">&nbsp;</span>
2334
+ <span class="cline-any cline-no">&nbsp;</span>
2335
+ <span class="cline-any cline-neutral">&nbsp;</span>
2336
+ <span class="cline-any cline-neutral">&nbsp;</span>
2337
+ <span class="cline-any cline-neutral">&nbsp;</span>
2338
+ <span class="cline-any cline-neutral">&nbsp;</span>
2339
+ <span class="cline-any cline-neutral">&nbsp;</span>
2340
+ <span class="cline-any cline-neutral">&nbsp;</span>
2341
+ <span class="cline-any cline-neutral">&nbsp;</span>
2342
+ <span class="cline-any cline-no">&nbsp;</span>
2343
+ <span class="cline-any cline-neutral">&nbsp;</span>
2344
+ <span class="cline-any cline-neutral">&nbsp;</span>
2345
+ <span class="cline-any cline-neutral">&nbsp;</span>
2346
+ <span class="cline-any cline-neutral">&nbsp;</span>
2347
+ <span class="cline-any cline-neutral">&nbsp;</span>
2348
+ <span class="cline-any cline-no">&nbsp;</span>
2349
+ <span class="cline-any cline-neutral">&nbsp;</span>
2350
+ <span class="cline-any cline-neutral">&nbsp;</span>
2351
+ <span class="cline-any cline-neutral">&nbsp;</span>
2352
+ <span class="cline-any cline-neutral">&nbsp;</span>
2353
+ <span class="cline-any cline-neutral">&nbsp;</span>
2354
+ <span class="cline-any cline-no">&nbsp;</span>
2355
+ <span class="cline-any cline-no">&nbsp;</span>
2356
+ <span class="cline-any cline-neutral">&nbsp;</span>
2357
+ <span class="cline-any cline-no">&nbsp;</span>
2358
+ <span class="cline-any cline-neutral">&nbsp;</span>
2359
+ <span class="cline-any cline-neutral">&nbsp;</span>
2360
+ <span class="cline-any cline-no">&nbsp;</span>
2361
+ <span class="cline-any cline-no">&nbsp;</span>
2362
+ <span class="cline-any cline-neutral">&nbsp;</span>
2363
+ <span class="cline-any cline-no">&nbsp;</span>
2364
+ <span class="cline-any cline-neutral">&nbsp;</span>
2365
+ <span class="cline-any cline-no">&nbsp;</span>
2366
+ <span class="cline-any cline-no">&nbsp;</span>
2367
+ <span class="cline-any cline-neutral">&nbsp;</span>
2368
+ <span class="cline-any cline-neutral">&nbsp;</span>
2369
+ <span class="cline-any cline-no">&nbsp;</span>
2370
+ <span class="cline-any cline-no">&nbsp;</span>
2371
+ <span class="cline-any cline-no">&nbsp;</span>
2372
+ <span class="cline-any cline-no">&nbsp;</span>
2373
+ <span class="cline-any cline-neutral">&nbsp;</span>
2374
+ <span class="cline-any cline-no">&nbsp;</span>
2375
+ <span class="cline-any cline-no">&nbsp;</span>
2376
+ <span class="cline-any cline-neutral">&nbsp;</span>
2377
+ <span class="cline-any cline-neutral">&nbsp;</span>
2378
+ <span class="cline-any cline-neutral">&nbsp;</span>
2379
+ <span class="cline-any cline-neutral">&nbsp;</span>
2380
+ <span class="cline-any cline-neutral">&nbsp;</span>
2381
+ <span class="cline-any cline-neutral">&nbsp;</span>
2382
+ <span class="cline-any cline-no">&nbsp;</span>
2383
+ <span class="cline-any cline-neutral">&nbsp;</span>
2384
+ <span class="cline-any cline-neutral">&nbsp;</span>
2385
+ <span class="cline-any cline-neutral">&nbsp;</span>
2386
+ <span class="cline-any cline-no">&nbsp;</span>
2387
+ <span class="cline-any cline-neutral">&nbsp;</span>
2388
+ <span class="cline-any cline-no">&nbsp;</span>
2389
+ <span class="cline-any cline-neutral">&nbsp;</span>
2390
+ <span class="cline-any cline-neutral">&nbsp;</span>
2391
+ <span class="cline-any cline-no">&nbsp;</span>
2392
+ <span class="cline-any cline-no">&nbsp;</span>
2393
+ <span class="cline-any cline-neutral">&nbsp;</span>
2394
+ <span class="cline-any cline-no">&nbsp;</span>
2395
+ <span class="cline-any cline-no">&nbsp;</span>
2396
+ <span class="cline-any cline-neutral">&nbsp;</span>
2397
+ <span class="cline-any cline-neutral">&nbsp;</span>
2398
+ <span class="cline-any cline-no">&nbsp;</span>
2399
+ <span class="cline-any cline-no">&nbsp;</span>
2400
+ <span class="cline-any cline-neutral">&nbsp;</span>
2401
+ <span class="cline-any cline-neutral">&nbsp;</span>
2402
+ <span class="cline-any cline-neutral">&nbsp;</span>
2403
+ <span class="cline-any cline-no">&nbsp;</span>
2404
+ <span class="cline-any cline-no">&nbsp;</span>
2405
+ <span class="cline-any cline-neutral">&nbsp;</span>
2406
+ <span class="cline-any cline-no">&nbsp;</span>
2407
+ <span class="cline-any cline-neutral">&nbsp;</span>
2408
+ <span class="cline-any cline-no">&nbsp;</span>
2409
+ <span class="cline-any cline-neutral">&nbsp;</span>
2410
+ <span class="cline-any cline-neutral">&nbsp;</span>
2411
+ <span class="cline-any cline-neutral">&nbsp;</span>
2412
+ <span class="cline-any cline-no">&nbsp;</span>
2413
+ <span class="cline-any cline-no">&nbsp;</span>
2414
+ <span class="cline-any cline-no">&nbsp;</span>
2415
+ <span class="cline-any cline-neutral">&nbsp;</span>
2416
+ <span class="cline-any cline-no">&nbsp;</span>
2417
+ <span class="cline-any cline-no">&nbsp;</span>
2418
+ <span class="cline-any cline-no">&nbsp;</span>
2419
+ <span class="cline-any cline-no">&nbsp;</span>
2420
+ <span class="cline-any cline-no">&nbsp;</span>
2421
+ <span class="cline-any cline-neutral">&nbsp;</span>
2422
+ <span class="cline-any cline-neutral">&nbsp;</span>
2423
+ <span class="cline-any cline-neutral">&nbsp;</span>
2424
+ <span class="cline-any cline-no">&nbsp;</span>
2425
+ <span class="cline-any cline-no">&nbsp;</span>
2426
+ <span class="cline-any cline-neutral">&nbsp;</span>
2427
+ <span class="cline-any cline-no">&nbsp;</span>
1338
2428
  <span class="cline-any cline-no">&nbsp;</span>
1339
2429
  <span class="cline-any cline-no">&nbsp;</span>
1340
2430
  <span class="cline-any cline-neutral">&nbsp;</span>
1341
2431
  <span class="cline-any cline-neutral">&nbsp;</span>
1342
2432
  <span class="cline-any cline-neutral">&nbsp;</span>
1343
2433
  <span class="cline-any cline-neutral">&nbsp;</span>
2434
+ <span class="cline-any cline-no">&nbsp;</span>
1344
2435
  <span class="cline-any cline-neutral">&nbsp;</span>
1345
2436
  <span class="cline-any cline-neutral">&nbsp;</span>
1346
2437
  <span class="cline-any cline-neutral">&nbsp;</span>
1347
2438
  <span class="cline-any cline-no">&nbsp;</span>
1348
2439
  <span class="cline-any cline-neutral">&nbsp;</span>
2440
+ <span class="cline-any cline-neutral">&nbsp;</span>
2441
+ <span class="cline-any cline-no">&nbsp;</span>
2442
+ <span class="cline-any cline-no">&nbsp;</span>
1349
2443
  <span class="cline-any cline-no">&nbsp;</span>
1350
2444
  <span class="cline-any cline-no">&nbsp;</span>
1351
2445
  <span class="cline-any cline-no">&nbsp;</span>
1352
2446
  <span class="cline-any cline-neutral">&nbsp;</span>
1353
2447
  <span class="cline-any cline-neutral">&nbsp;</span>
1354
- <span class="cline-any cline-neutral">&nbsp;</span>
1355
- <span class="cline-any cline-neutral">&nbsp;</span>
2448
+ <span class="cline-any cline-no">&nbsp;</span>
2449
+ <span class="cline-any cline-no">&nbsp;</span>
2450
+ <span class="cline-any cline-no">&nbsp;</span>
1356
2451
  <span class="cline-any cline-neutral">&nbsp;</span>
1357
2452
  <span class="cline-any cline-neutral">&nbsp;</span>
1358
2453
  <span class="cline-any cline-neutral">&nbsp;</span>
1359
2454
  <span class="cline-any cline-no">&nbsp;</span>
2455
+ <span class="cline-any cline-no">&nbsp;</span>
1360
2456
  <span class="cline-any cline-neutral">&nbsp;</span>
1361
2457
  <span class="cline-any cline-neutral">&nbsp;</span>
1362
- <span class="cline-any cline-neutral">&nbsp;</span>
1363
- <span class="cline-any cline-neutral">&nbsp;</span>
2458
+ <span class="cline-any cline-no">&nbsp;</span>
2459
+ <span class="cline-any cline-no">&nbsp;</span>
2460
+ <span class="cline-any cline-no">&nbsp;</span>
2461
+ <span class="cline-any cline-no">&nbsp;</span>
2462
+ <span class="cline-any cline-no">&nbsp;</span>
2463
+ <span class="cline-any cline-no">&nbsp;</span>
1364
2464
  <span class="cline-any cline-no">&nbsp;</span>
1365
2465
  <span class="cline-any cline-no">&nbsp;</span>
1366
2466
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1370,17 +2470,22 @@
1370
2470
  <span class="cline-any cline-no">&nbsp;</span>
1371
2471
  <span class="cline-any cline-no">&nbsp;</span>
1372
2472
  <span class="cline-any cline-neutral">&nbsp;</span>
1373
- <span class="cline-any cline-no">&nbsp;</span>
2473
+ <span class="cline-any cline-neutral">&nbsp;</span>
1374
2474
  <span class="cline-any cline-neutral">&nbsp;</span>
1375
2475
  <span class="cline-any cline-no">&nbsp;</span>
1376
2476
  <span class="cline-any cline-neutral">&nbsp;</span>
1377
2477
  <span class="cline-any cline-neutral">&nbsp;</span>
1378
2478
  <span class="cline-any cline-neutral">&nbsp;</span>
2479
+ <span class="cline-any cline-no">&nbsp;</span>
2480
+ <span class="cline-any cline-neutral">&nbsp;</span>
1379
2481
  <span class="cline-any cline-neutral">&nbsp;</span>
1380
2482
  <span class="cline-any cline-neutral">&nbsp;</span>
1381
2483
  <span class="cline-any cline-no">&nbsp;</span>
1382
2484
  <span class="cline-any cline-neutral">&nbsp;</span>
1383
- <span class="cline-any cline-no">&nbsp;</span>
2485
+ <span class="cline-any cline-neutral">&nbsp;</span>
2486
+ <span class="cline-any cline-neutral">&nbsp;</span>
2487
+ <span class="cline-any cline-neutral">&nbsp;</span>
2488
+ <span class="cline-any cline-neutral">&nbsp;</span>
1384
2489
  <span class="cline-any cline-neutral">&nbsp;</span>
1385
2490
  <span class="cline-any cline-neutral">&nbsp;</span>
1386
2491
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1388,61 +2493,57 @@
1388
2493
  <span class="cline-any cline-no">&nbsp;</span>
1389
2494
  <span class="cline-any cline-no">&nbsp;</span>
1390
2495
  <span class="cline-any cline-neutral">&nbsp;</span>
1391
- <span class="cline-any cline-no">&nbsp;</span>
1392
2496
  <span class="cline-any cline-neutral">&nbsp;</span>
1393
- <span class="cline-any cline-no">&nbsp;</span>
1394
- <span class="cline-any cline-no">&nbsp;</span>
1395
2497
  <span class="cline-any cline-neutral">&nbsp;</span>
1396
2498
  <span class="cline-any cline-no">&nbsp;</span>
1397
2499
  <span class="cline-any cline-no">&nbsp;</span>
1398
- <span class="cline-any cline-neutral">&nbsp;</span>
1399
- <span class="cline-any cline-neutral">&nbsp;</span>
1400
2500
  <span class="cline-any cline-no">&nbsp;</span>
1401
2501
  <span class="cline-any cline-no">&nbsp;</span>
1402
2502
  <span class="cline-any cline-no">&nbsp;</span>
1403
2503
  <span class="cline-any cline-no">&nbsp;</span>
1404
2504
  <span class="cline-any cline-neutral">&nbsp;</span>
1405
2505
  <span class="cline-any cline-neutral">&nbsp;</span>
1406
- <span class="cline-any cline-no">&nbsp;</span>
1407
- <span class="cline-any cline-no">&nbsp;</span>
2506
+ <span class="cline-any cline-neutral">&nbsp;</span>
1408
2507
  <span class="cline-any cline-no">&nbsp;</span>
1409
2508
  <span class="cline-any cline-neutral">&nbsp;</span>
1410
2509
  <span class="cline-any cline-neutral">&nbsp;</span>
1411
2510
  <span class="cline-any cline-neutral">&nbsp;</span>
1412
2511
  <span class="cline-any cline-neutral">&nbsp;</span>
1413
2512
  <span class="cline-any cline-neutral">&nbsp;</span>
2513
+ <span class="cline-any cline-no">&nbsp;</span>
1414
2514
  <span class="cline-any cline-neutral">&nbsp;</span>
1415
2515
  <span class="cline-any cline-neutral">&nbsp;</span>
1416
2516
  <span class="cline-any cline-neutral">&nbsp;</span>
1417
2517
  <span class="cline-any cline-no">&nbsp;</span>
1418
- <span class="cline-any cline-no">&nbsp;</span>
1419
- <span class="cline-any cline-no">&nbsp;</span>
1420
- <span class="cline-any cline-no">&nbsp;</span>
1421
2518
  <span class="cline-any cline-neutral">&nbsp;</span>
1422
2519
  <span class="cline-any cline-neutral">&nbsp;</span>
1423
2520
  <span class="cline-any cline-neutral">&nbsp;</span>
1424
2521
  <span class="cline-any cline-no">&nbsp;</span>
1425
2522
  <span class="cline-any cline-no">&nbsp;</span>
1426
- <span class="cline-any cline-no">&nbsp;</span>
1427
- <span class="cline-any cline-no">&nbsp;</span>
1428
- <span class="cline-any cline-no">&nbsp;</span>
1429
- <span class="cline-any cline-no">&nbsp;</span>
1430
2523
  <span class="cline-any cline-neutral">&nbsp;</span>
1431
2524
  <span class="cline-any cline-neutral">&nbsp;</span>
1432
2525
  <span class="cline-any cline-neutral">&nbsp;</span>
1433
- <span class="cline-any cline-no">&nbsp;</span>
1434
2526
  <span class="cline-any cline-neutral">&nbsp;</span>
1435
2527
  <span class="cline-any cline-neutral">&nbsp;</span>
1436
2528
  <span class="cline-any cline-neutral">&nbsp;</span>
1437
2529
  <span class="cline-any cline-neutral">&nbsp;</span>
1438
2530
  <span class="cline-any cline-neutral">&nbsp;</span>
1439
2531
  <span class="cline-any cline-no">&nbsp;</span>
2532
+ <span class="cline-any cline-no">&nbsp;</span>
2533
+ <span class="cline-any cline-no">&nbsp;</span>
2534
+ <span class="cline-any cline-neutral">&nbsp;</span>
1440
2535
  <span class="cline-any cline-neutral">&nbsp;</span>
1441
2536
  <span class="cline-any cline-neutral">&nbsp;</span>
1442
2537
  <span class="cline-any cline-neutral">&nbsp;</span>
2538
+ <span class="cline-any cline-neutral">&nbsp;</span>
2539
+ <span class="cline-any cline-no">&nbsp;</span>
2540
+ <span class="cline-any cline-neutral">&nbsp;</span>
1443
2541
  <span class="cline-any cline-no">&nbsp;</span>
1444
2542
  <span class="cline-any cline-neutral">&nbsp;</span>
1445
2543
  <span class="cline-any cline-neutral">&nbsp;</span>
2544
+ <span class="cline-any cline-neutral">&nbsp;</span>
2545
+ <span class="cline-any cline-neutral">&nbsp;</span>
2546
+ <span class="cline-any cline-no">&nbsp;</span>
1446
2547
  <span class="cline-any cline-no">&nbsp;</span>
1447
2548
  <span class="cline-any cline-no">&nbsp;</span>
1448
2549
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1455,29 +2556,50 @@
1455
2556
  <span class="cline-any cline-no">&nbsp;</span>
1456
2557
  <span class="cline-any cline-no">&nbsp;</span>
1457
2558
  <span class="cline-any cline-neutral">&nbsp;</span>
2559
+ <span class="cline-any cline-no">&nbsp;</span>
1458
2560
  <span class="cline-any cline-neutral">&nbsp;</span>
1459
2561
  <span class="cline-any cline-no">&nbsp;</span>
1460
2562
  <span class="cline-any cline-neutral">&nbsp;</span>
1461
2563
  <span class="cline-any cline-neutral">&nbsp;</span>
1462
2564
  <span class="cline-any cline-neutral">&nbsp;</span>
1463
2565
  <span class="cline-any cline-neutral">&nbsp;</span>
1464
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type Message from './messages.gen.js'
1465
- <span class="cstat-no" title="statement not covered" >import { Timestamp, Metadata, UserID, Type as MType, TabChange, TabData } from './messages.gen.js'</span>
1466
- <span class="cstat-no" title="statement not covered" >import { now, adjustTimeOrigin, deprecationWarn } from '../utils.js'</span>
2566
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import ConditionsManager from '../modules/conditionsManager.js'</span>
2567
+ <span class="cstat-no" title="statement not covered" >import FeatureFlags from '../modules/featureFlags.js'</span>
2568
+ <span class="cstat-no" title="statement not covered" >import Message, { TagTrigger } from './messages.gen.js'</span>
2569
+ <span class="cstat-no" title="statement not covered" >import {</span>
2570
+ Timestamp,
2571
+ Metadata,
2572
+ UserID,
2573
+ Type as MType,
2574
+ TabChange,
2575
+ TabData,
2576
+ WSChannel,
2577
+ } from './messages.gen.js'
2578
+ <span class="cstat-no" title="statement not covered" >import {</span>
2579
+ now,
2580
+ adjustTimeOrigin,
2581
+ deprecationWarn,
2582
+ inIframe,
2583
+ createEventListener,
2584
+ deleteEventListener,
2585
+ requestIdleCb,
2586
+ } from '../utils.js'
1467
2587
  <span class="cstat-no" title="statement not covered" >import Nodes from './nodes.js'</span>
1468
2588
  <span class="cstat-no" title="statement not covered" >import Observer from './observer/top_observer.js'</span>
1469
2589
  <span class="cstat-no" title="statement not covered" >import Sanitizer from './sanitizer.js'</span>
1470
2590
  <span class="cstat-no" title="statement not covered" >import Ticker from './ticker.js'</span>
1471
- <span class="cstat-no" title="statement not covered" >import Logger, { LogLevel } from './logger.js'</span>
2591
+ <span class="cstat-no" title="statement not covered" >import Logger, { LogLevel, ILogLevel } from './logger.js'</span>
1472
2592
  <span class="cstat-no" title="statement not covered" >import Session from './session.js'</span>
1473
2593
  <span class="cstat-no" title="statement not covered" >import { gzip } from 'fflate'</span>
1474
2594
  <span class="cstat-no" title="statement not covered" >import { deviceMemory, jsHeapSizeLimit } from '../modules/performance.js'</span>
1475
2595
  <span class="cstat-no" title="statement not covered" >import AttributeSender from '../modules/attributeSender.js'</span>
1476
2596
  import type { Options as ObserverOptions } from './observer/top_observer.js'
1477
2597
  import type { Options as SanitizerOptions } from './sanitizer.js'
1478
- import type { Options as LoggerOptions } from './logger.js'
1479
2598
  import type { Options as SessOptions } from './session.js'
1480
2599
  import type { Options as NetworkOptions } from '../modules/network.js'
2600
+ <span class="cstat-no" title="statement not covered" >import CanvasRecorder from './canvas.js'</span>
2601
+ <span class="cstat-no" title="statement not covered" >import UserTestManager from '../modules/userTesting/index.js'</span>
2602
+ <span class="cstat-no" title="statement not covered" >import TagWatcher from '../modules/tagWatcher.js'</span>
1481
2603
  &nbsp;
1482
2604
  import type {
1483
2605
  Options as WebworkerOptions,
@@ -1502,17 +2624,34 @@ interface OnStartInfo {
1502
2624
  sessionToken: string
1503
2625
  userUUID: string
1504
2626
  }
2627
+ &nbsp;
1505
2628
  const CANCELED = <span class="cstat-no" title="statement not covered" >'canceled' as const</span>
2629
+ const uxtStorageKey = <span class="cstat-no" title="statement not covered" >'or_uxt_active'</span>
2630
+ const bufferStorageKey = <span class="cstat-no" title="statement not covered" >'or_buffer_1'</span>
1506
2631
  const START_ERROR = <span class="cstat-no" title="statement not covered" >':(' as const</span>
1507
- type SuccessfulStart = OnStartInfo &amp; { success: true }
2632
+ type SuccessfulStart = OnStartInfo &amp; {
2633
+ success: true
2634
+ }
1508
2635
  type UnsuccessfulStart = {
1509
2636
  reason: typeof CANCELED | string
1510
2637
  success: false
1511
2638
  }
1512
2639
  &nbsp;
1513
- type RickRoll = { source: string } &amp; (
1514
- | { line: 'never-gonna-give-you-up' }
1515
- | { line: 'never-gonna-let-you-down'; token: string }
2640
+ type RickRoll = {
2641
+ source: string
2642
+ context: string
2643
+ } &amp; (
2644
+ | {
2645
+ line: 'never-gonna-give-you-up'
2646
+ }
2647
+ | {
2648
+ line: 'never-gonna-let-you-down'
2649
+ token: string
2650
+ }
2651
+ | {
2652
+ line: 'never-gonna-run-around-and-desert-you'
2653
+ token: string
2654
+ }
1516
2655
  )
1517
2656
  &nbsp;
1518
2657
  const UnsuccessfulStart = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(r</span>eason: string): UnsuccessfulStart =&gt; (<span class="cstat-no" title="statement not covered" >{ reason, success: false })</span></span>
@@ -1521,10 +2660,12 @@ export type StartPromiseReturn = SuccessfulStart | UnsuccessfulStart
1521
2660
  &nbsp;
1522
2661
  type StartCallback = (i: OnStartInfo) =&gt; void
1523
2662
  type CommitCallback = (messages: Array&lt;Message&gt;) =&gt; void
2663
+ &nbsp;
1524
2664
  <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >enum A</span>ctivityState {</span>
1525
2665
  <span class="cstat-no" title="statement not covered" > NotActive,</span>
1526
2666
  <span class="cstat-no" title="statement not covered" > Starting,</span>
1527
2667
  <span class="cstat-no" title="statement not covered" > Active,</span>
2668
+ <span class="cstat-no" title="statement not covered" > ColdStart,</span>
1528
2669
  }
1529
2670
  &nbsp;
1530
2671
  type AppOptions = {
@@ -1537,17 +2678,17 @@ type AppOptions = {
1537
2678
  local_uuid_key: string
1538
2679
  ingestPoint: string
1539
2680
  resourceBaseHref: string | null // resourceHref?
1540
- //resourceURLRewriter: (url: string) =&gt; string | boolean,
1541
- verbose: boolean
1542
2681
  __is_snippet: boolean
1543
2682
  __debug_report_edp: string | null
1544
- __debug__?: LoggerOptions
2683
+ __debug__?: ILogLevel
2684
+ __save_canvas_locally?: boolean
1545
2685
  localStorage: Storage | null
1546
2686
  sessionStorage: Storage | null
1547
2687
  forceSingleTab?: boolean
1548
2688
  disableStringDict?: boolean
2689
+ assistSocketHost?: string
1549
2690
  &nbsp;
1550
- // @deprecated
2691
+ /** @deprecated */
1551
2692
  onStart?: StartCallback
1552
2693
  network?: NetworkOptions
1553
2694
  } &amp; WebworkerOptions &amp;
@@ -1577,7 +2718,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1577
2718
  readonly localStorage: Storage
1578
2719
  readonly sessionStorage: Storage
1579
2720
  private readonly <span class="cstat-no" title="statement not covered" >messages: Array&lt;Message&gt; = []</span>
1580
- /* private */ readonly observer: Observer // non-privat for attachContextCallback
2721
+ /**
2722
+ * we need 2 buffers, so we don't lose anything
2723
+ * @read coldStart implementation
2724
+ * */
2725
+ private <span class="cstat-no" title="statement not covered" >bufferedMessages1: Array&lt;Message&gt; = []</span>
2726
+ private readonly <span class="cstat-no" title="statement not covered" >bufferedMessages2: Array&lt;Message&gt; = []</span>
2727
+ /* private */
2728
+ readonly observer: Observer // non-private for attachContextCallback
1581
2729
  private readonly <span class="cstat-no" title="statement not covered" >startCallbacks: Array&lt;StartCallback&gt; = []</span>
1582
2730
  private readonly <span class="cstat-no" title="statement not covered" >stopCallbacks: Array&lt;() =&gt; any&gt; = []</span>
1583
2731
  private readonly <span class="cstat-no" title="statement not covered" >commitCallbacks: Array&lt;CommitCallback&gt; = []</span>
@@ -1591,13 +2739,21 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1591
2739
  private <span class="cstat-no" title="statement not covered" >compressionThreshold = 24 * 1000</span>
1592
2740
  private <span class="cstat-no" title="statement not covered" >restartAttempts = 0</span>
1593
2741
  private readonly <span class="cstat-no" title="statement not covered" >bc: BroadcastChannel | null = null</span>
2742
+ private readonly contextId
1594
2743
  public attributeSender: AttributeSender
2744
+ private <span class="cstat-no" title="statement not covered" >canvasRecorder: CanvasRecorder | null = null</span>
2745
+ private uxtManager: UserTestManager
2746
+ private <span class="cstat-no" title="statement not covered" >conditionsManager: ConditionsManager | null = null</span>
2747
+ public featureFlags: FeatureFlags
2748
+ private tagWatcher: TagWatcher
1595
2749
  &nbsp;
1596
- <span class="fstat-no" title="function not covered" > constructor(p</span>rojectKey: string, sessionToken: string | undefined, options: Partial&lt;Options&gt;) {
1597
- // if (options.onStart !== undefined) {
1598
- // deprecationWarn("'onStart' option", "tracker.start().then(/* handle session info */)")
1599
- // } ?? maybe onStart is good
1600
- &nbsp;
2750
+ <span class="fstat-no" title="function not covered" > constructor(</span>
2751
+ projectKey: string,
2752
+ sessionToken: string | undefined,
2753
+ options: Partial&lt;Options&gt;,
2754
+ private readonly <span class="cstat-no" title="statement not covered" >signalError: (error: string, apis: string[]) =&gt; void,</span>
2755
+ ) {
2756
+ <span class="cstat-no" title="statement not covered" > this.contextId = Math.random().toString(36).slice(2)</span>
1601
2757
  <span class="cstat-no" title="statement not covered" > this.projectKey = projectKey</span>
1602
2758
  <span class="cstat-no" title="statement not covered" > this.networkOptions = options.network</span>
1603
2759
  <span class="cstat-no" title="statement not covered" > this.options = Object.assign(</span>
@@ -1611,19 +2767,22 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1611
2767
  local_uuid_key: '__openreplay_uuid',
1612
2768
  ingestPoint: DEFAULT_INGEST_POINT,
1613
2769
  resourceBaseHref: null,
1614
- verbose: false,
1615
2770
  __is_snippet: false,
1616
2771
  __debug_report_edp: null,
2772
+ __debug__: LogLevel.Silent,
2773
+ __save_canvas_locally: false,
1617
2774
  localStorage: null,
1618
2775
  sessionStorage: null,
1619
2776
  disableStringDict: false,
1620
2777
  forceSingleTab: false,
2778
+ assistSocketHost: '',
1621
2779
  },
1622
2780
  options,
1623
2781
  )
1624
2782
  &nbsp;
1625
2783
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.options.forceSingleTab &amp;&amp; globalThis &amp;&amp; 'BroadcastChannel' in globalThis) {</span>
1626
- <span class="cstat-no" title="statement not covered" > this.bc = new BroadcastChannel('rick')</span>
2784
+ const host = <span class="cstat-no" title="statement not covered" >location.hostname.split('.').slice(-2).join('_')</span>
2785
+ <span class="cstat-no" title="statement not covered" > this.bc = inIframe() ? null : new BroadcastChannel(`rick_${host}`)</span>
1627
2786
  }
1628
2787
  &nbsp;
1629
2788
  <span class="cstat-no" title="statement not covered" > this.revID = this.options.revID</span>
@@ -1635,9 +2794,12 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1635
2794
  <span class="cstat-no" title="statement not covered" > this.ticker = new Ticker(this)</span>
1636
2795
  <span class="cstat-no" title="statement not covered" > this.ticker.attach(<span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >this.commit())</span></span>
1637
2796
  <span class="cstat-no" title="statement not covered" > this.debug = new Logger(this.options.__debug__)</span>
1638
- <span class="cstat-no" title="statement not covered" > this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent)</span>
1639
2797
  <span class="cstat-no" title="statement not covered" > this.session = new Session(this, this.options)</span>
1640
2798
  <span class="cstat-no" title="statement not covered" > this.attributeSender = new AttributeSender(this, Boolean(this.options.disableStringDict))</span>
2799
+ <span class="cstat-no" title="statement not covered" > this.featureFlags = new FeatureFlags(this)</span>
2800
+ <span class="cstat-no" title="statement not covered" > this.tagWatcher = new TagWatcher(this.sessionStorage, this.debug.error, <span class="fstat-no" title="function not covered" >(t</span>ag) =&gt; {</span>
2801
+ <span class="cstat-no" title="statement not covered" > this.send(TagTrigger(tag) as Message)</span>
2802
+ })
1641
2803
  <span class="cstat-no" title="statement not covered" > this.session.attachUpdateCallback(<span class="fstat-no" title="function not covered" >({</span> userID, metadata }) =&gt; {</span>
1642
2804
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (userID != null) {</span>
1643
2805
  // TODO: nullable userID
@@ -1665,29 +2827,32 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1665
2827
  <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
1666
2828
  <span class="cstat-no" title="statement not covered" > void this.start({}, true)</span>
1667
2829
  } else <span class="cstat-no" title="statement not covered" >if (data === 'not_init') {</span>
1668
- <span class="cstat-no" title="statement not covered" > console.warn('WebWorker: writer not initialised. Restarting tracker')</span>
2830
+ <span class="cstat-no" title="statement not covered" > this.debug.warn('OR WebWorker: writer not initialised. Restarting tracker')</span>
1669
2831
  } else <span class="cstat-no" title="statement not covered" >if (data.type === 'failure') {</span>
1670
2832
  <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
2833
+ <span class="cstat-no" title="statement not covered" > this.debug.error('worker_failed', data.reason)</span>
1671
2834
  <span class="cstat-no" title="statement not covered" > this._debug('worker_failed', data.reason)</span>
1672
- } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (data.type === 'compress') {</span>
2835
+ } else <span class="cstat-no" title="statement not covered" >if (data.type === 'compress') {</span>
1673
2836
  const batch = <span class="cstat-no" title="statement not covered" >data.batch</span>
1674
2837
  const batchSize = <span class="cstat-no" title="statement not covered" >batch.byteLength</span>
1675
2838
  <span class="cstat-no" title="statement not covered" > if (batchSize &gt; this.compressionThreshold) {</span>
1676
2839
  <span class="cstat-no" title="statement not covered" > gzip(data.batch, { mtime: 0 }, <span class="fstat-no" title="function not covered" >(e</span>rr, result) =&gt; {</span>
1677
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (err) {</span>
1678
- <span class="cstat-no" title="statement not covered" > console.error('Openreplay compression error:', err)</span>
2840
+ <span class="cstat-no" title="statement not covered" > if (err) {</span>
2841
+ <span class="cstat-no" title="statement not covered" > this.debug.error('Openreplay compression error:', err)</span>
1679
2842
  <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
1680
2843
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.restartAttempts &lt; 3) {</span>
1681
2844
  <span class="cstat-no" title="statement not covered" > this.restartAttempts += 1</span>
1682
2845
  <span class="cstat-no" title="statement not covered" > void this.start({}, true)</span>
1683
2846
  }
2847
+ } else {
2848
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({ type: 'compressed', batch: result })</span>
1684
2849
  }
1685
- // @ts-ignore
1686
- <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({ type: 'compressed', batch: result })</span>
1687
2850
  })
1688
2851
  } else {
1689
2852
  <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({ type: 'uncompressed', batch: batch })</span>
1690
2853
  }
2854
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (data.type === 'queue_empty') {</span>
2855
+ <span class="cstat-no" title="statement not covered" > this.onSessionSent()</span>
1691
2856
  }
1692
2857
  }
1693
2858
  const alertWorker = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
@@ -1706,24 +2871,45 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1706
2871
  &nbsp;
1707
2872
  const thisTab = <span class="cstat-no" title="statement not covered" >this.session.getTabId()</span>
1708
2873
  &nbsp;
1709
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.session.getSessionToken() &amp;&amp; this.bc) {</span>
1710
- <span class="cstat-no" title="statement not covered" > this.bc.postMessage({ line: 'never-gonna-give-you-up', source: thisTab })</span>
1711
- }
2874
+ const proto = <span class="cstat-no" title="statement not covered" >{</span>
2875
+ // ask if there are any tabs alive
2876
+ ask: 'never-gonna-give-you-up',
2877
+ // yes, there are someone out there
2878
+ resp: 'never-gonna-let-you-down',
2879
+ // you stole someone's identity
2880
+ reg: 'never-gonna-run-around-and-desert-you',
2881
+ } as const
1712
2882
  &nbsp;
1713
2883
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.bc) {</span>
2884
+ <span class="cstat-no" title="statement not covered" > this.bc.postMessage({</span>
2885
+ line: proto.ask,
2886
+ source: thisTab,
2887
+ context: this.contextId,
2888
+ })
2889
+ }
2890
+ &nbsp;
2891
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.bc !== null) {</span>
1714
2892
  <span class="cstat-no" title="statement not covered" > this.bc.onmessage = <span class="fstat-no" title="function not covered" >(e</span>v: MessageEvent&lt;RickRoll&gt;) =&gt; {</span>
1715
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.source === thisTab) <span class="cstat-no" title="statement not covered" >return</span></span>
1716
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.line === 'never-gonna-let-you-down') {</span>
2893
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.context === this.contextId) {</span>
2894
+ <span class="cstat-no" title="statement not covered" > return</span>
2895
+ }
2896
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.line === proto.resp) {</span>
2897
+ const sessionToken = <span class="cstat-no" title="statement not covered" >ev.data.token</span>
2898
+ <span class="cstat-no" title="statement not covered" > this.session.setSessionToken(sessionToken)</span>
2899
+ }
2900
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.line === proto.reg) {</span>
1717
2901
  const sessionToken = <span class="cstat-no" title="statement not covered" >ev.data.token</span>
2902
+ <span class="cstat-no" title="statement not covered" > this.session.regenerateTabId()</span>
1718
2903
  <span class="cstat-no" title="statement not covered" > this.session.setSessionToken(sessionToken)</span>
1719
2904
  }
1720
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.line === 'never-gonna-give-you-up') {</span>
2905
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.line === proto.ask) {</span>
1721
2906
  const token = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
1722
2907
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (token &amp;&amp; this.bc) {</span>
1723
2908
  <span class="cstat-no" title="statement not covered" > this.bc.postMessage({</span>
1724
- line: 'never-gonna-let-you-down',
2909
+ line: ev.data.source === thisTab ? proto.reg : proto.resp,
1725
2910
  token,
1726
2911
  source: thisTab,
2912
+ context: this.contextId,
1727
2913
  })
1728
2914
  }
1729
2915
  }
@@ -1739,7 +2925,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1739
2925
  body: JSON.stringify({
1740
2926
  context,
1741
2927
  // @ts-ignore
1742
- error: `${e}`,
2928
+ error: `${e as unknown as string}`,
1743
2929
  }),
1744
2930
  })
1745
2931
  }
@@ -1747,6 +2933,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1747
2933
  }
1748
2934
  &nbsp;
1749
2935
  private <span class="cstat-no" title="statement not covered" >_usingOldFetchPlugin = false</span>
2936
+ &nbsp;
1750
2937
  <span class="fstat-no" title="function not covered" > send(</span>message: Message, urgent = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: void {
1751
2938
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState === ActivityState.NotActive) {</span>
1752
2939
  <span class="cstat-no" title="statement not covered" > return</span>
@@ -1760,29 +2947,79 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1760
2947
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this._usingOldFetchPlugin &amp;&amp; message[0] === MType.NetworkRequest) {</span>
1761
2948
  <span class="cstat-no" title="statement not covered" > return</span>
1762
2949
  }
1763
- // ====================================================
1764
2950
  &nbsp;
1765
- <span class="cstat-no" title="statement not covered" > this.messages.push(message)</span>
2951
+ // ====================================================
2952
+ <span class="cstat-no" title="statement not covered" > if (this.activityState === ActivityState.ColdStart) {</span>
2953
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(message)</span>
2954
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.singleBuffer) {</span>
2955
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(message)</span>
2956
+ }
2957
+ <span class="cstat-no" title="statement not covered" > this.conditionsManager?.processMessage(message)</span>
2958
+ } else {
2959
+ <span class="cstat-no" title="statement not covered" > this.messages.push(message)</span>
2960
+ }
1766
2961
  // TODO: commit on start if there were `urgent` sends;
1767
2962
  // Clarify where urgent can be used for;
1768
2963
  // Clarify workflow for each type of message in case it was sent before start
1769
2964
  // (like Fetch before start; maybe add an option "preCapture: boolean" or sth alike)
1770
- // Careful: `this.delay` is equal to zero before start hense all Timestamp-s will have to be updated on start
2965
+ // Careful: `this.delay` is equal to zero before start so all Timestamp-s will have to be updated on start
1771
2966
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState === ActivityState.Active &amp;&amp; urgent) {</span>
1772
2967
  <span class="cstat-no" title="statement not covered" > this.commit()</span>
1773
2968
  }
1774
2969
  }
2970
+ &nbsp;
2971
+ /**
2972
+ * Normal workflow: add timestamp and tab data to batch, then commit it
2973
+ * every ~30ms
2974
+ * */
2975
+ private <span class="fstat-no" title="function not covered" >_nCommit(</span>): void {
2976
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.worker !== undefined &amp;&amp; this.messages.length) {</span>
2977
+ <span class="cstat-no" title="statement not covered" > requestIdleCb(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2978
+ <span class="cstat-no" title="statement not covered" > this.messages.unshift(TabData(this.session.getTabId()))</span>
2979
+ <span class="cstat-no" title="statement not covered" > this.messages.unshift(Timestamp(this.timestamp()))</span>
2980
+ // why I need to add opt chaining?
2981
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage(this.messages)</span>
2982
+ <span class="cstat-no" title="statement not covered" > this.commitCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(this.messages))</span></span>
2983
+ <span class="cstat-no" title="statement not covered" > this.messages.length = 0</span>
2984
+ })
2985
+ }
2986
+ }
2987
+ &nbsp;
2988
+ <span class="cstat-no" title="statement not covered" > coldStartCommitN = 0</span>
2989
+ &nbsp;
2990
+ /**
2991
+ * Cold start: add timestamp and tab data to both batches
2992
+ * every 2nd tick, ~60ms
2993
+ * this will make batches a bit larger and replay will work with bigger jumps every frame
2994
+ * but in turn we don't overload batch writer on session start with 1000 batches
2995
+ * */
2996
+ private <span class="fstat-no" title="function not covered" >_cStartCommit(</span>): void {
2997
+ <span class="cstat-no" title="statement not covered" > this.coldStartCommitN += 1</span>
2998
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.coldStartCommitN === 2) {</span>
2999
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(Timestamp(this.timestamp()))</span>
3000
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(TabData(this.session.getTabId()))</span>
3001
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(Timestamp(this.timestamp()))</span>
3002
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(TabData(this.session.getTabId()))</span>
3003
+ <span class="cstat-no" title="statement not covered" > this.coldStartCommitN = 0</span>
3004
+ }
3005
+ }
3006
+ &nbsp;
1775
3007
  private <span class="fstat-no" title="function not covered" >commit(</span>): void {
1776
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.worker &amp;&amp; this.messages.length) {</span>
1777
- <span class="cstat-no" title="statement not covered" > this.messages.unshift(TabData(this.session.getTabId()))</span>
1778
- <span class="cstat-no" title="statement not covered" > this.messages.unshift(Timestamp(this.timestamp()))</span>
1779
- <span class="cstat-no" title="statement not covered" > this.worker.postMessage(this.messages)</span>
1780
- <span class="cstat-no" title="statement not covered" > this.commitCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(this.messages))</span></span>
1781
- <span class="cstat-no" title="statement not covered" > this.messages.length = 0</span>
3008
+ <span class="cstat-no" title="statement not covered" > if (this.activityState === ActivityState.ColdStart) {</span>
3009
+ <span class="cstat-no" title="statement not covered" > this._cStartCommit()</span>
3010
+ } else {
3011
+ <span class="cstat-no" title="statement not covered" > this._nCommit()</span>
1782
3012
  }
1783
3013
  }
3014
+ &nbsp;
3015
+ private <span class="fstat-no" title="function not covered" >postToWorker(</span>messages: Array&lt;Message&gt;) {
3016
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage(messages)</span>
3017
+ <span class="cstat-no" title="statement not covered" > this.commitCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(messages))</span></span>
3018
+ <span class="cstat-no" title="statement not covered" > messages.length = 0</span>
3019
+ }
1784
3020
  &nbsp;
1785
3021
  private <span class="cstat-no" title="statement not covered" >delay = 0</span>
3022
+ &nbsp;
1786
3023
  <span class="fstat-no" title="function not covered" > timestamp(</span>): number {
1787
3024
  <span class="cstat-no" title="statement not covered" > return now() + this.delay</span>
1788
3025
  }
@@ -1805,18 +3042,21 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1805
3042
  <span class="fstat-no" title="function not covered" > attachCommitCallback(</span>cb: CommitCallback): void {
1806
3043
  <span class="cstat-no" title="statement not covered" > this.commitCallbacks.push(cb)</span>
1807
3044
  }
3045
+ &nbsp;
1808
3046
  <span class="fstat-no" title="function not covered" > attachStartCallback(</span>cb: StartCallback, useSafe = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: void {
1809
3047
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (useSafe) {</span>
1810
3048
  <span class="cstat-no" title="statement not covered" > cb = this.safe(cb)</span>
1811
3049
  }
1812
3050
  <span class="cstat-no" title="statement not covered" > this.startCallbacks.push(cb)</span>
1813
3051
  }
3052
+ &nbsp;
1814
3053
  <span class="fstat-no" title="function not covered" > attachStopCallback(</span>cb: () =&gt; any, useSafe = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: void {
1815
3054
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (useSafe) {</span>
1816
3055
  <span class="cstat-no" title="statement not covered" > cb = this.safe(cb)</span>
1817
3056
  }
1818
3057
  <span class="cstat-no" title="statement not covered" > this.stopCallbacks.push(cb)</span>
1819
3058
  }
3059
+ &nbsp;
1820
3060
  // Use app.nodes.attachNodeListener for registered nodes instead
1821
3061
  <span class="fstat-no" title="function not covered" > attachEventListener(</span>
1822
3062
  target: EventTarget,
@@ -1828,8 +3068,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1828
3068
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (useSafe) {</span>
1829
3069
  <span class="cstat-no" title="statement not covered" > listener = this.safe(listener)</span>
1830
3070
  }
1831
- <span class="cstat-no" title="statement not covered" > this.attachStartCallback(<span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >target?.addEventListener(type, listener, useCapture),</span> useSafe)</span>
1832
- <span class="cstat-no" title="statement not covered" > this.attachStopCallback(<span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >target?.removeEventListener(type, listener, useCapture),</span> useSafe)</span>
3071
+ <span class="cstat-no" title="statement not covered" > this.attachStartCallback(</span>
3072
+ <span class="fstat-no" title="function not covered" > () =</span>&gt; (<span class="cstat-no" title="statement not covered" >target ? createEventListener(target, type, listener, useCapture) : null)</span>,
3073
+ useSafe,
3074
+ )
3075
+ <span class="cstat-no" title="statement not covered" > this.attachStopCallback(</span>
3076
+ <span class="fstat-no" title="function not covered" > () =</span>&gt; (<span class="cstat-no" title="statement not covered" >target ? deleteEventListener(target, type, listener, useCapture) : null)</span>,
3077
+ useSafe,
3078
+ )
1833
3079
  }
1834
3080
  &nbsp;
1835
3081
  // TODO: full correct semantic
@@ -1859,15 +3105,18 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1859
3105
  isSnippet: this.options.__is_snippet,
1860
3106
  }
1861
3107
  }
3108
+ &nbsp;
1862
3109
  <span class="fstat-no" title="function not covered" > getSessionInfo(</span>) {
1863
3110
  <span class="cstat-no" title="statement not covered" > return {</span>
1864
3111
  ...this.session.getInfo(),
1865
3112
  ...this.getTrackerInfo(),
1866
3113
  }
1867
3114
  }
3115
+ &nbsp;
1868
3116
  <span class="fstat-no" title="function not covered" > getSessionToken(</span>): string | undefined {
1869
3117
  <span class="cstat-no" title="statement not covered" > return this.session.getSessionToken()</span>
1870
3118
  }
3119
+ &nbsp;
1871
3120
  <span class="fstat-no" title="function not covered" > getSessionID(</span>): string | undefined {
1872
3121
  <span class="cstat-no" title="statement not covered" > return this.session.getInfo().sessionID || undefined</span>
1873
3122
  }
@@ -1896,9 +3145,11 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1896
3145
  <span class="fstat-no" title="function not covered" > getHost(</span>): string {
1897
3146
  <span class="cstat-no" title="statement not covered" > return new URL(this.options.ingestPoint).host</span>
1898
3147
  }
3148
+ &nbsp;
1899
3149
  <span class="fstat-no" title="function not covered" > getProjectKey(</span>): string {
1900
3150
  <span class="cstat-no" title="statement not covered" > return this.projectKey</span>
1901
3151
  }
3152
+ &nbsp;
1902
3153
  <span class="fstat-no" title="function not covered" > getBaseHref(</span>): string {
1903
3154
  <span class="cstat-no" title="statement not covered" > if (typeof this.options.resourceBaseHref === 'string') {</span>
1904
3155
  <span class="cstat-no" title="statement not covered" > return this.options.resourceBaseHref</span>
@@ -1914,6 +3165,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1914
3165
  location.origin + location.pathname
1915
3166
  )
1916
3167
  }
3168
+ &nbsp;
1917
3169
  <span class="fstat-no" title="function not covered" > resolveResourceURL(</span>resourceURL: string): string {
1918
3170
  const base = <span class="cstat-no" title="statement not covered" >new URL(this.getBaseHref())</span>
1919
3171
  <span class="cstat-no" title="statement not covered" > base.pathname += '/' + new URL(resourceURL).pathname</span>
@@ -1937,19 +3189,286 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1937
3189
  }
1938
3190
  }
1939
3191
  &nbsp;
1940
- private <span class="fstat-no" title="function not covered" >_start(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span> resetByWorker = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: Promise&lt;StartPromiseReturn&gt; {
3192
+ <span class="cstat-no" title="statement not covered" > coldInterval: ReturnType&lt;typeof setInterval&gt; | null = null</span>
3193
+ <span class="cstat-no" title="statement not covered" > orderNumber = 0</span>
3194
+ <span class="cstat-no" title="statement not covered" > coldStartTs = 0</span>
3195
+ <span class="cstat-no" title="statement not covered" > singleBuffer = false</span>
3196
+ &nbsp;
3197
+ private <span class="fstat-no" title="function not covered" >checkSessionToken(</span>forceNew?: boolean) {
3198
+ const lsReset = <span class="cstat-no" title="statement not covered" >this.sessionStorage.getItem(this.options.session_reset_key) !== null</span>
3199
+ const needNewSessionID = <span class="cstat-no" title="statement not covered" >forceNew || lsReset</span>
3200
+ const sessionToken = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
3201
+ &nbsp;
3202
+ <span class="cstat-no" title="statement not covered" > return needNewSessionID || !sessionToken</span>
3203
+ }
3204
+ &nbsp;
3205
+ /**
3206
+ * start buffering messages without starting the actual session, which gives
3207
+ * user 30 seconds to "activate" and record session by calling `start()` on conditional trigger
3208
+ * and we will then send buffered batch, so it won't get lost
3209
+ * */
3210
+ public async <span class="fstat-no" title="function not covered" >coldStart(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span> conditional?: boolean) {
3211
+ <span class="cstat-no" title="statement not covered" > this.singleBuffer = false</span>
3212
+ const second = <span class="cstat-no" title="statement not covered" >1000</span>
3213
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (conditional) {</span>
3214
+ <span class="cstat-no" title="statement not covered" > this.conditionsManager = new ConditionsManager(this, startOpts)</span>
3215
+ }
3216
+ const isNewSession = <span class="cstat-no" title="statement not covered" >this.checkSessionToken(startOpts.forceNew)</span>
3217
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (conditional) {</span>
3218
+ const r = <span class="cstat-no" title="statement not covered" >await fetch(this.options.ingestPoint + '/v1/web/start', {</span>
3219
+ method: 'POST',
3220
+ headers: {
3221
+ 'Content-Type': 'application/json',
3222
+ },
3223
+ body: JSON.stringify({
3224
+ ...this.getTrackerInfo(),
3225
+ timestamp: now(),
3226
+ doNotRecord: true,
3227
+ bufferDiff: 0,
3228
+ userID: this.session.getInfo().userID,
3229
+ token: undefined,
3230
+ deviceMemory,
3231
+ jsHeapSizeLimit,
3232
+ timezone: getTimezone(),
3233
+ }),
3234
+ })
3235
+ const {
3236
+ // this token is needed to fetch conditions and flags,
3237
+ // but it can't be used to record a session
3238
+ token,
3239
+ userBrowser,
3240
+ userCity,
3241
+ userCountry,
3242
+ userDevice,
3243
+ userOS,
3244
+ userState,
3245
+ projectID,
3246
+ } = <span class="cstat-no" title="statement not covered" >await r.json()</span>
3247
+ <span class="cstat-no" title="statement not covered" > this.session.assign({ projectID })</span>
3248
+ <span class="cstat-no" title="statement not covered" > this.session.setUserInfo({</span>
3249
+ userBrowser,
3250
+ userCity,
3251
+ userCountry,
3252
+ userDevice,
3253
+ userOS,
3254
+ userState,
3255
+ })
3256
+ const onStartInfo = <span class="cstat-no" title="statement not covered" >{ sessionToken: token, userUUID: '', sessionID: '' }</span>
3257
+ <span class="cstat-no" title="statement not covered" > this.startCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(onStartInfo))</span></span>
3258
+ <span class="cstat-no" title="statement not covered" > await this.conditionsManager?.fetchConditions(projectID as string, token as string)</span>
3259
+ <span class="cstat-no" title="statement not covered" > await this.featureFlags.reloadFlags(token as string)</span>
3260
+ <span class="cstat-no" title="statement not covered" > await this.tagWatcher.fetchTags(this.options.ingestPoint, token as string)</span>
3261
+ <span class="cstat-no" title="statement not covered" > this.conditionsManager?.processFlags(this.featureFlags.flags)</span>
3262
+ }
3263
+ const cycle = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
3264
+ <span class="cstat-no" title="statement not covered" > this.orderNumber += 1</span>
3265
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3266
+ <span class="cstat-no" title="statement not covered" > this.coldStartTs = now()</span>
3267
+ <span class="cstat-no" title="statement not covered" > if (this.orderNumber % 2 === 0) {</span>
3268
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length = 0</span>
3269
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(Timestamp(this.timestamp()))</span>
3270
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(TabData(this.session.getTabId()))</span>
3271
+ } else {
3272
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.length = 0</span>
3273
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(Timestamp(this.timestamp()))</span>
3274
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(TabData(this.session.getTabId()))</span>
3275
+ }
3276
+ <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
3277
+ <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.ColdStart</span>
3278
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
3279
+ <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
3280
+ }
3281
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.forceNew) {</span>
3282
+ <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
3283
+ }
3284
+ <span class="cstat-no" title="statement not covered" > this.session.assign({</span>
3285
+ userID: startOpts.userID,
3286
+ metadata: startOpts.metadata,
3287
+ })
3288
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession) {</span>
3289
+ <span class="cstat-no" title="statement not covered" > this.debug.log('continuing session on new tab', this.session.getTabId())</span>
3290
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
3291
+ <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
3292
+ }
3293
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
3294
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
3295
+ }
3296
+ <span class="cstat-no" title="statement not covered" > this.coldInterval = setInterval(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
3297
+ <span class="cstat-no" title="statement not covered" > cycle()</span>
3298
+ }, 30 * second)
3299
+ <span class="cstat-no" title="statement not covered" > cycle()</span>
3300
+ }
3301
+ &nbsp;
3302
+ <span class="cstat-no" title="statement not covered" > onSessionSent = <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
3303
+ <span class="cstat-no" title="statement not covered" > return</span>
3304
+ }
3305
+ &nbsp;
3306
+ /**
3307
+ * Starts offline session recording
3308
+ * @param {Object} startOpts - options for session start, same as .start()
3309
+ * @param {Function} onSessionSent - callback that will be called once session is fully sent
3310
+ * */
3311
+ public <span class="fstat-no" title="function not covered" >offlineRecording(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span> onSessionSent: () =&gt; void) {
3312
+ <span class="cstat-no" title="statement not covered" > this.onSessionSent = onSessionSent</span>
3313
+ <span class="cstat-no" title="statement not covered" > this.singleBuffer = true</span>
3314
+ const isNewSession = <span class="cstat-no" title="statement not covered" >this.checkSessionToken(startOpts.forceNew)</span>
3315
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3316
+ <span class="cstat-no" title="statement not covered" > this.coldStartTs = now()</span>
3317
+ const saverBuffer = <span class="cstat-no" title="statement not covered" >this.localStorage.getItem(bufferStorageKey)</span>
3318
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (saverBuffer) {</span>
3319
+ const data = <span class="cstat-no" title="statement not covered" >JSON.parse(saverBuffer)</span>
3320
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1 = Array.isArray(data) ? data : this.bufferedMessages1</span>
3321
+ <span class="cstat-no" title="statement not covered" > this.localStorage.removeItem(bufferStorageKey)</span>
3322
+ }
3323
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(Timestamp(this.timestamp()))</span>
3324
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(TabData(this.session.getTabId()))</span>
3325
+ <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.ColdStart</span>
3326
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
3327
+ <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
3328
+ }
3329
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.forceNew) {</span>
3330
+ <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
3331
+ }
3332
+ <span class="cstat-no" title="statement not covered" > this.session.assign({</span>
3333
+ userID: startOpts.userID,
3334
+ metadata: startOpts.metadata,
3335
+ })
3336
+ const onStartInfo = <span class="cstat-no" title="statement not covered" >{ sessionToken: '', userUUID: '', sessionID: '' }</span>
3337
+ <span class="cstat-no" title="statement not covered" > this.startCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(onStartInfo))</span></span>
3338
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession) {</span>
3339
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
3340
+ <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
3341
+ }
3342
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
3343
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
3344
+ &nbsp;
3345
+ <span class="cstat-no" title="statement not covered" > return {</span>
3346
+ saveBuffer: this.saveBuffer,
3347
+ getBuffer: this.getBuffer,
3348
+ setBuffer: this.setBuffer,
3349
+ }
3350
+ }
3351
+ &nbsp;
3352
+ /**
3353
+ * Saves the captured messages in localStorage (or whatever is used in its place)
3354
+ *
3355
+ * Then when this.offlineRecording is called, it will preload this messages and clear the storage item
3356
+ *
3357
+ * Keeping the size of local storage reasonable is up to the end users of this library
3358
+ * */
3359
+ public <span class="fstat-no" title="function not covered" >saveBuffer(</span>) {
3360
+ <span class="cstat-no" title="statement not covered" > this.localStorage.setItem(bufferStorageKey, JSON.stringify(this.bufferedMessages1))</span>
3361
+ }
3362
+ &nbsp;
3363
+ /**
3364
+ * @returns buffer with stored messages for offline recording
3365
+ * */
3366
+ public <span class="fstat-no" title="function not covered" >getBuffer(</span>) {
3367
+ <span class="cstat-no" title="statement not covered" > return this.bufferedMessages1</span>
3368
+ }
3369
+ &nbsp;
3370
+ /**
3371
+ * Used to set a buffer with messages array
3372
+ * */
3373
+ public <span class="fstat-no" title="function not covered" >setBuffer(</span>buffer: Message[]) {
3374
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1 = buffer</span>
3375
+ }
3376
+ &nbsp;
3377
+ /**
3378
+ * Uploads the stored session buffer to backend
3379
+ * @returns promise that resolves once messages are loaded, it has to be awaited
3380
+ * so the session can be uploaded properly
3381
+ * @resolve {boolean} - if messages were loaded successfully
3382
+ * @reject {string} - error message
3383
+ * */
3384
+ public async <span class="fstat-no" title="function not covered" >uploadOfflineRecording(</span>) {
3385
+ <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
3386
+ const timestamp = <span class="cstat-no" title="statement not covered" >now()</span>
3387
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({</span>
3388
+ type: 'start',
3389
+ pageNo: this.session.incPageNo(),
3390
+ ingestPoint: this.options.ingestPoint,
3391
+ timestamp: this.coldStartTs,
3392
+ url: document.URL,
3393
+ connAttemptCount: this.options.connAttemptCount,
3394
+ connAttemptGap: this.options.connAttemptGap,
3395
+ tabId: this.session.getTabId(),
3396
+ })
3397
+ const r = <span class="cstat-no" title="statement not covered" >await fetch(this.options.ingestPoint + '/v1/web/start', {</span>
3398
+ method: 'POST',
3399
+ headers: {
3400
+ 'Content-Type': 'application/json',
3401
+ },
3402
+ body: JSON.stringify({
3403
+ ...this.getTrackerInfo(),
3404
+ timestamp: timestamp,
3405
+ doNotRecord: false,
3406
+ bufferDiff: timestamp - this.coldStartTs,
3407
+ userID: this.session.getInfo().userID,
3408
+ token: undefined,
3409
+ deviceMemory,
3410
+ jsHeapSizeLimit,
3411
+ timezone: getTimezone(),
3412
+ }),
3413
+ })
3414
+ const {
3415
+ token,
3416
+ userBrowser,
3417
+ userCity,
3418
+ userCountry,
3419
+ userDevice,
3420
+ userOS,
3421
+ userState,
3422
+ beaconSizeLimit,
3423
+ projectID,
3424
+ } = <span class="cstat-no" title="statement not covered" >await r.json()</span>
3425
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({</span>
3426
+ type: 'auth',
3427
+ token,
3428
+ beaconSizeLimit,
3429
+ })
3430
+ <span class="cstat-no" title="statement not covered" > this.session.assign({ projectID })</span>
3431
+ <span class="cstat-no" title="statement not covered" > this.session.setUserInfo({</span>
3432
+ userBrowser,
3433
+ userCity,
3434
+ userCountry,
3435
+ userDevice,
3436
+ userOS,
3437
+ userState,
3438
+ })
3439
+ <span class="cstat-no" title="statement not covered" > while (this.bufferedMessages1.length &gt; 0) {</span>
3440
+ <span class="cstat-no" title="statement not covered" > await this.flushBuffer(this.bufferedMessages1)</span>
3441
+ }
3442
+ <span class="cstat-no" title="statement not covered" > this.postToWorker([['q_end']] as unknown as Message[])</span>
3443
+ <span class="cstat-no" title="statement not covered" > this.clearBuffers()</span>
3444
+ }
3445
+ &nbsp;
3446
+ private <span class="fstat-no" title="function not covered" >_start(</span>
3447
+ startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
3448
+ resetByWorker = <span class="branch-0 cbranch-no" title="branch not covered" >false,</span>
3449
+ conditionName?: string,
3450
+ ): Promise&lt;StartPromiseReturn&gt; {
3451
+ const isColdStart = <span class="cstat-no" title="statement not covered" >this.activityState === ActivityState.ColdStart</span>
3452
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isColdStart &amp;&amp; this.coldInterval) {</span>
3453
+ <span class="cstat-no" title="statement not covered" > clearInterval(this.coldInterval)</span>
3454
+ }
1941
3455
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.worker) {</span>
1942
- <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart('No worker found: perhaps, CSP is not set.'))</span>
3456
+ const reason = <span class="cstat-no" title="statement not covered" >'No worker found: perhaps, CSP is not set.'</span>
3457
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3458
+ <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart(reason))</span>
1943
3459
  }
1944
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState !== ActivityState.NotActive) {</span>
1945
- <span class="cstat-no" title="statement not covered" > return Promise.resolve(</span>
1946
- UnsuccessfulStart(
1947
- 'OpenReplay: trying to call `start()` on the instance that has been started already.',
1948
- ),
1949
- )
3460
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
3461
+ this.activityState === ActivityState.Active ||
3462
+ this.activityState === ActivityState.Starting
3463
+ ) {
3464
+ const reason =
3465
+ <span class="cstat-no" title="statement not covered" > 'OpenReplay: trying to call `start()` on the instance that has been started already.'</span>
3466
+ <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart(reason))</span>
1950
3467
  }
1951
3468
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Starting</span>
1952
- <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3469
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isColdStart) {</span>
3470
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3471
+ }
1953
3472
  &nbsp;
1954
3473
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
1955
3474
  <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
@@ -1969,20 +3488,23 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1969
3488
  type: 'start',
1970
3489
  pageNo: this.session.incPageNo(),
1971
3490
  ingestPoint: this.options.ingestPoint,
1972
- timestamp,
3491
+ timestamp: isColdStart ? this.coldStartTs : timestamp,
1973
3492
  url: document.URL,
1974
3493
  connAttemptCount: this.options.connAttemptCount,
1975
3494
  connAttemptGap: this.options.connAttemptGap,
1976
3495
  tabId: this.session.getTabId(),
1977
3496
  })
1978
3497
  &nbsp;
1979
- const lsReset = <span class="cstat-no" title="statement not covered" >this.sessionStorage.getItem(this.options.session_reset_key) !== null</span>
1980
- <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
1981
- const needNewSessionID = <span class="cstat-no" title="statement not covered" >startOpts.forceNew || lsReset || resetByWorker</span>
1982
3498
  const sessionToken = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
1983
- const isNewSession = <span class="cstat-no" title="statement not covered" >needNewSessionID || !sessionToken</span>
3499
+ const isNewSession = <span class="cstat-no" title="statement not covered" >this.checkSessionToken(startOpts.forceNew)</span>
3500
+ <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
1984
3501
  &nbsp;
1985
- <span class="cstat-no" title="statement not covered" > console.log('OpenReplay: starting session', needNewSessionID, sessionToken)</span>
3502
+ <span class="cstat-no" title="statement not covered" > this.debug.log(</span>
3503
+ 'OpenReplay: starting session; need new session id?',
3504
+ isNewSession,
3505
+ 'session token: ',
3506
+ sessionToken,
3507
+ )
1986
3508
  <span class="cstat-no" title="statement not covered" > return window</span>
1987
3509
  .fetch(this.options.ingestPoint + '/v1/web/start', {
1988
3510
  method: 'POST',
@@ -1992,11 +3514,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1992
3514
  body: JSON.stringify({
1993
3515
  ...this.getTrackerInfo(),
1994
3516
  timestamp,
3517
+ doNotRecord: false,
3518
+ bufferDiff: timestamp - this.coldStartTs,
1995
3519
  userID: this.session.getInfo().userID,
1996
3520
  token: isNewSession ? undefined : sessionToken,
1997
3521
  deviceMemory,
1998
3522
  jsHeapSizeLimit,
1999
3523
  timezone: getTimezone(),
3524
+ condition: conditionName,
2000
3525
  }),
2001
3526
  })
2002
3527
  .then(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; {
@@ -2012,12 +3537,16 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2012
3537
  )
2013
3538
  }
2014
3539
  })
2015
- .then(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; {
3540
+ .then(<span class="fstat-no" title="function not covered" >async (r</span>) =&gt;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" > {</span></span>
2016
3541
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.worker) {</span>
2017
- <span class="cstat-no" title="statement not covered" > return Promise.reject('no worker found after start request (this might not happen)')</span>
3542
+ const reason = <span class="cstat-no" title="statement not covered" >'no worker found after start request (this might not happen)'</span>
3543
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3544
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(reason)</span>
2018
3545
  }
2019
3546
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState === ActivityState.NotActive) {</span>
2020
- <span class="cstat-no" title="statement not covered" > return Promise.reject('Tracker stopped during authorization')</span>
3547
+ const reason = <span class="cstat-no" title="statement not covered" >'Tracker stopped during authorization'</span>
3548
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3549
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(reason)</span>
2021
3550
  }
2022
3551
  const {
2023
3552
  token,
@@ -2034,6 +3563,9 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2034
3563
  userDevice,
2035
3564
  userOS,
2036
3565
  userState,
3566
+ canvasEnabled,
3567
+ canvasQuality,
3568
+ canvasFPS,
2037
3569
  } = <span class="cstat-no" title="statement not covered" >r</span>
2038
3570
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
2039
3571
  typeof token !== 'string' ||
@@ -2043,7 +3575,9 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2043
3575
  typeof delay !== 'number' ||
2044
3576
  (typeof beaconSizeLimit !== 'number' &amp;&amp; typeof beaconSizeLimit !== 'undefined')
2045
3577
  ) {
2046
- <span class="cstat-no" title="statement not covered" > return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`)</span>
3578
+ const reason = <span class="cstat-no" title="statement not covered" >`Incorrect server response: ${JSON.stringify(r)}`</span>
3579
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3580
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(reason)</span>
2047
3581
  }
2048
3582
  <span class="cstat-no" title="statement not covered" > this.delay = delay</span>
2049
3583
  <span class="cstat-no" title="statement not covered" > this.session.setSessionToken(token)</span>
@@ -2060,8 +3594,15 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2060
3594
  timestamp: startTimestamp || timestamp,
2061
3595
  projectID,
2062
3596
  })
3597
+ &nbsp;
3598
+ <span class="cstat-no" title="statement not covered" > this.worker.postMessage({</span>
3599
+ type: 'auth',
3600
+ token,
3601
+ beaconSizeLimit,
3602
+ })
3603
+ &nbsp;
2063
3604
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession &amp;&amp; token === sessionToken) {</span>
2064
- <span class="cstat-no" title="statement not covered" > console.log('continuing session on new tab', this.session.getTabId())</span>
3605
+ <span class="cstat-no" title="statement not covered" > this.debug.log('continuing session on new tab', this.session.getTabId())</span>
2065
3606
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
2066
3607
  <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
2067
3608
  }
@@ -2071,42 +3612,126 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2071
3612
  )
2072
3613
  <span class="cstat-no" title="statement not covered" > this.localStorage.setItem(this.options.local_uuid_key, userUUID)</span>
2073
3614
  &nbsp;
2074
- <span class="cstat-no" title="statement not covered" > this.worker.postMessage({</span>
2075
- type: 'auth',
2076
- token,
2077
- beaconSizeLimit,
2078
- })
2079
- &nbsp;
2080
3615
  <span class="cstat-no" title="statement not covered" > this.compressionThreshold = compressionThreshold</span>
2081
- &nbsp;
2082
3616
  const onStartInfo = <span class="cstat-no" title="statement not covered" >{ sessionToken: token, userUUID, sessionID }</span>
2083
- &nbsp;
2084
3617
  // TODO: start as early as possible (before receiving the token)
3618
+ /** after start */
2085
3619
  <span class="cstat-no" title="statement not covered" > this.startCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(onStartInfo))</span> /</span>/ MBTODO: callbacks after DOM "mounted" (observed)
2086
- <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
2087
- <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
3620
+ <span class="cstat-no" title="statement not covered" > void this.featureFlags.reloadFlags()</span>
3621
+ <span class="cstat-no" title="statement not covered" > await this.tagWatcher.fetchTags(this.options.ingestPoint, token)</span>
2088
3622
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Active</span>
2089
3623
  &nbsp;
2090
- <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay tracking started.')</span>
3624
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (canvasEnabled) {</span>
3625
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder =</span>
3626
+ this.canvasRecorder ??
3627
+ new CanvasRecorder(this, {
3628
+ fps: canvasFPS,
3629
+ quality: canvasQuality,
3630
+ isDebug: this.options.__save_canvas_locally,
3631
+ })
3632
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder.startTracking()</span>
3633
+ }
3634
+ &nbsp;
3635
+ /** --------------- COLD START BUFFER ------------------*/
3636
+ <span class="cstat-no" title="statement not covered" > if (isColdStart) {</span>
3637
+ const biggestBuffer =
3638
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length &gt; this.bufferedMessages2.length</span>
3639
+ ? this.bufferedMessages1
3640
+ : this.bufferedMessages2
3641
+ <span class="cstat-no" title="statement not covered" > while (biggestBuffer.length &gt; 0) {</span>
3642
+ <span class="cstat-no" title="statement not covered" > await this.flushBuffer(biggestBuffer)</span>
3643
+ }
3644
+ <span class="cstat-no" title="statement not covered" > this.clearBuffers()</span>
3645
+ <span class="cstat-no" title="statement not covered" > this.commit()</span>
3646
+ /** --------------- COLD START BUFFER ------------------*/
3647
+ } else {
3648
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
3649
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
3650
+ }
3651
+ &nbsp;
2091
3652
  // get rid of onStart ?
2092
3653
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof this.options.onStart === 'function') {</span>
2093
3654
  <span class="cstat-no" title="statement not covered" > this.options.onStart(onStartInfo)</span>
2094
3655
  }
2095
3656
  <span class="cstat-no" title="statement not covered" > this.restartAttempts = 0</span>
3657
+ &nbsp;
3658
+ <span class="cstat-no" title="statement not covered" > this.uxtManager = this.uxtManager</span>
3659
+ ? this.uxtManager
3660
+ : new UserTestManager(this, uxtStorageKey)
3661
+ let uxtId: number | undefined
3662
+ const savedUxtTag = <span class="cstat-no" title="statement not covered" >this.localStorage.getItem(uxtStorageKey)</span>
3663
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (savedUxtTag) {</span>
3664
+ <span class="cstat-no" title="statement not covered" > uxtId = parseInt(savedUxtTag, 10)</span>
3665
+ }
3666
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (location?.search) {</span>
3667
+ const query = <span class="cstat-no" title="statement not covered" >new URLSearchParams(location.search)</span>
3668
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (query.has('oruxt')) {</span>
3669
+ const qId = <span class="cstat-no" title="statement not covered" >query.get('oruxt')</span>
3670
+ <span class="cstat-no" title="statement not covered" > uxtId = qId ? parseInt(qId, 10) : undefined</span>
3671
+ }
3672
+ }
3673
+ &nbsp;
3674
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (uxtId) {</span>
3675
+ <span class="cstat-no" title="statement not covered" > if (!this.uxtManager.isActive) {</span>
3676
+ // eslint-disable-next-line
3677
+ <span class="cstat-no" title="statement not covered" > this.uxtManager.getTest(uxtId, token, Boolean(savedUxtTag)).then(<span class="fstat-no" title="function not covered" >(i</span>d) =&gt; {</span>
3678
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (id) {</span>
3679
+ <span class="cstat-no" title="statement not covered" > this.onUxtCb.forEach(<span class="fstat-no" title="function not covered" >(c</span>b: (id: number) =&gt; void) =&gt; <span class="cstat-no" title="statement not covered" >cb(id))</span></span>
3680
+ }
3681
+ })
3682
+ } else {
3683
+ // @ts-ignore
3684
+ <span class="cstat-no" title="statement not covered" > this.onUxtCb.forEach(<span class="fstat-no" title="function not covered" >(c</span>b: (id: number) =&gt; void) =&gt; <span class="cstat-no" title="statement not covered" >cb(uxtId))</span></span>
3685
+ }
3686
+ }
3687
+ &nbsp;
2096
3688
  <span class="cstat-no" title="statement not covered" > return SuccessfulStart(onStartInfo)</span>
2097
3689
  })
2098
3690
  .catch(<span class="fstat-no" title="function not covered" >(r</span>eason) =&gt; {
2099
3691
  <span class="cstat-no" title="statement not covered" > this.stop()</span>
2100
3692
  <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
2101
3693
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (reason === CANCELED) {</span>
3694
+ <span class="cstat-no" title="statement not covered" > this.signalError(CANCELED, [])</span>
2102
3695
  <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(CANCELED)</span>
2103
3696
  }
2104
3697
  &nbsp;
2105
- <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay was unable to start. ', reason)</span>
2106
3698
  <span class="cstat-no" title="statement not covered" > this._debug('session_start', reason)</span>
3699
+ <span class="cstat-no" title="statement not covered" > this.signalError(START_ERROR, [])</span>
2107
3700
  <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(START_ERROR)</span>
2108
3701
  })
2109
3702
  }
3703
+ &nbsp;
3704
+ <span class="cstat-no" title="statement not covered" > restartCanvasTracking = <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
3705
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder?.restartTracking()</span>
3706
+ }
3707
+ &nbsp;
3708
+ <span class="cstat-no" title="statement not covered" > flushBuffer = <span class="fstat-no" title="function not covered" >async (b</span>uffer: Message[]) =&gt;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" > {</span></span></span>
3709
+ <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>es) =&gt; {</span>
3710
+ let ended = <span class="cstat-no" title="statement not covered" >false</span>
3711
+ const messagesBatch: Message[] = <span class="cstat-no" title="statement not covered" >[buffer.shift() as unknown as Message]</span>
3712
+ <span class="cstat-no" title="statement not covered" > while (!ended) {</span>
3713
+ const nextMsg = <span class="cstat-no" title="statement not covered" >buffer[0]</span>
3714
+ <span class="cstat-no" title="statement not covered" > if (!nextMsg || nextMsg[0] === MType.Timestamp) {</span>
3715
+ <span class="cstat-no" title="statement not covered" > ended = true</span>
3716
+ } else {
3717
+ <span class="cstat-no" title="statement not covered" > messagesBatch.push(buffer.shift() as unknown as Message)</span>
3718
+ }
3719
+ }
3720
+ <span class="cstat-no" title="statement not covered" > this.postToWorker(messagesBatch)</span>
3721
+ <span class="cstat-no" title="statement not covered" > res(null)</span>
3722
+ })
3723
+ }
3724
+ &nbsp;
3725
+ <span class="cstat-no" title="statement not covered" > onUxtCb = []</span>
3726
+ &nbsp;
3727
+ <span class="fstat-no" title="function not covered" > addOnUxtCb(</span>cb: (id: number) =&gt; void) {
3728
+ // @ts-ignore
3729
+ <span class="cstat-no" title="statement not covered" > this.onUxtCb.push(cb)</span>
3730
+ }
3731
+ &nbsp;
3732
+ <span class="fstat-no" title="function not covered" > getUxtId(</span>): number | null {
3733
+ <span class="cstat-no" title="statement not covered" > return this.uxtManager?.getTestId()</span>
3734
+ }
2110
3735
  &nbsp;
2111
3736
  /**
2112
3737
  * basically we ask other tabs during constructor
@@ -2117,7 +3742,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2117
3742
  <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve) =&gt; {</span>
2118
3743
  <span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2119
3744
  <span class="cstat-no" title="statement not covered" > resolve(this._start(...args))</span>
2120
- }, 10)
3745
+ }, 25)
2121
3746
  })
2122
3747
  } else {
2123
3748
  <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve) =&gt; {</span>
@@ -2126,7 +3751,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2126
3751
  <span class="cstat-no" title="statement not covered" > document.removeEventListener('visibilitychange', onVisibilityChange)</span>
2127
3752
  <span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2128
3753
  <span class="cstat-no" title="statement not covered" > resolve(this._start(...args))</span>
2129
- }, 10)
3754
+ }, 25)
2130
3755
  }
2131
3756
  }
2132
3757
  <span class="cstat-no" title="statement not covered" > document.addEventListener('visibilitychange', onVisibilityChange)</span>
@@ -2141,6 +3766,32 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2141
3766
  <span class="fstat-no" title="function not covered" > getTabId(</span>) {
2142
3767
  <span class="cstat-no" title="statement not covered" > return this.session.getTabId()</span>
2143
3768
  }
3769
+ &nbsp;
3770
+ <span class="fstat-no" title="function not covered" > clearBuffers(</span>) {
3771
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length = 0</span>
3772
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.length = 0</span>
3773
+ }
3774
+ &nbsp;
3775
+ /**
3776
+ * Creates a named hook that expects event name, data string and msg direction (up/down),
3777
+ * it will skip any message bigger than 5 mb or event name bigger than 255 symbols
3778
+ * @returns {(msgType: string, data: string, dir: "up" | "down") =&gt; void}
3779
+ * */
3780
+ <span class="fstat-no" title="function not covered" > trackWs(</span>channelName: string): (msgType: string, data: string, dir: 'up' | 'down') =&gt; void {
3781
+ const channel = <span class="cstat-no" title="statement not covered" >channelName</span>
3782
+ <span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >(m</span>sgType: string, data: string, dir: 'up' | 'down' = <span class="branch-0 cbranch-no" title="branch not covered" >'down')</span> =&gt; {</span>
3783
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
3784
+ typeof msgType !== 'string' ||
3785
+ typeof data !== 'string' ||
3786
+ data.length &gt; 5 * 1024 * 1024 ||
3787
+ msgType.length &gt; 255
3788
+ ) {
3789
+ <span class="cstat-no" title="statement not covered" > return</span>
3790
+ }
3791
+ <span class="cstat-no" title="statement not covered" > this.send(WSChannel('websocket', channel, data, this.timestamp(), dir, msgType))</span>
3792
+ }
3793
+ }
3794
+ &nbsp;
2144
3795
  <span class="fstat-no" title="function not covered" > stop(</span>stopWorker = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: void {
2145
3796
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState !== ActivityState.NotActive) {</span>
2146
3797
  <span class="cstat-no" title="statement not covered" > try {</span>
@@ -2150,10 +3801,12 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2150
3801
  <span class="cstat-no" title="statement not covered" > this.nodes.clear()</span>
2151
3802
  <span class="cstat-no" title="statement not covered" > this.ticker.stop()</span>
2152
3803
  <span class="cstat-no" title="statement not covered" > this.stopCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb())</span></span>
2153
- <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay tracking stopped.')</span>
3804
+ <span class="cstat-no" title="statement not covered" > this.debug.log('OpenReplay tracking stopped.')</span>
3805
+ <span class="cstat-no" title="statement not covered" > this.tagWatcher.clear()</span>
2154
3806
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.worker &amp;&amp; stopWorker) {</span>
2155
3807
  <span class="cstat-no" title="statement not covered" > this.worker.postMessage('stop')</span>
2156
3808
  }
3809
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder?.clear()</span>
2157
3810
  } finally {
2158
3811
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.NotActive</span>
2159
3812
  }
@@ -2167,7 +3820,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2167
3820
  <div class='footer quiet pad2 space-top1 center small'>
2168
3821
  Code coverage generated by
2169
3822
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2170
- at 2023-10-17T13:37:58.420Z
3823
+ at 2024-01-23T12:19:37.435Z
2171
3824
  </div>
2172
3825
  <script src="../../prettify.js"></script>
2173
3826
  <script>