@openreplay/tracker 9.0.13 → 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 (75) hide show
  1. package/cjs/app/index.js +2 -2
  2. package/cjs/index.js +3 -2
  3. package/cjs/modules/mouse.js +1 -0
  4. package/cjs/modules/network.js +1 -0
  5. package/coverage/clover.xml +1802 -779
  6. package/coverage/coverage-final.json +27 -18
  7. package/coverage/lcov-report/index.html +60 -45
  8. package/coverage/lcov-report/main/app/canvas.ts.html +535 -0
  9. package/coverage/lcov-report/main/app/guards.ts.html +5 -2
  10. package/coverage/lcov-report/main/app/index.html +38 -23
  11. package/coverage/lcov-report/main/app/index.ts.html +1578 -108
  12. package/coverage/lcov-report/main/app/logger.ts.html +25 -91
  13. package/coverage/lcov-report/main/app/messages.gen.ts.html +263 -146
  14. package/coverage/lcov-report/main/app/nodes.ts.html +17 -5
  15. package/coverage/lcov-report/main/app/observer/iframe_observer.ts.html +2 -2
  16. package/coverage/lcov-report/main/app/observer/iframe_offsets.ts.html +1 -1
  17. package/coverage/lcov-report/main/app/observer/index.html +1 -1
  18. package/coverage/lcov-report/main/app/observer/shadow_root_observer.ts.html +2 -2
  19. package/coverage/lcov-report/main/app/observer/top_observer.ts.html +1 -1
  20. package/coverage/lcov-report/main/app/sanitizer.ts.html +1 -1
  21. package/coverage/lcov-report/main/app/session.ts.html +1 -1
  22. package/coverage/lcov-report/main/app/ticker.ts.html +1 -1
  23. package/coverage/lcov-report/main/index.html +20 -20
  24. package/coverage/lcov-report/main/index.ts.html +464 -98
  25. package/coverage/lcov-report/main/modules/Network/beaconProxy.ts.html +19 -19
  26. package/coverage/lcov-report/main/modules/Network/fetchProxy.ts.html +114 -99
  27. package/coverage/lcov-report/main/modules/Network/index.html +66 -66
  28. package/coverage/lcov-report/main/modules/Network/index.ts.html +33 -33
  29. package/coverage/lcov-report/main/modules/Network/networkMessage.ts.html +82 -73
  30. package/coverage/lcov-report/main/modules/Network/utils.ts.html +34 -34
  31. package/coverage/lcov-report/main/modules/Network/xhrProxy.ts.html +15 -15
  32. package/coverage/lcov-report/main/modules/attributeSender.ts.html +1 -1
  33. package/coverage/lcov-report/main/modules/axiosSpy.ts.html +1 -1
  34. package/coverage/lcov-report/main/modules/conditionsManager.ts.html +1399 -0
  35. package/coverage/lcov-report/main/modules/connection.ts.html +1 -1
  36. package/coverage/lcov-report/main/modules/console.ts.html +1 -1
  37. package/coverage/lcov-report/main/modules/constructedStyleSheets.ts.html +1 -1
  38. package/coverage/lcov-report/main/modules/cssrules.ts.html +1 -1
  39. package/coverage/lcov-report/main/modules/exception.ts.html +1 -1
  40. package/coverage/lcov-report/main/modules/featureFlags.ts.html +10 -7
  41. package/coverage/lcov-report/main/modules/focus.ts.html +1 -1
  42. package/coverage/lcov-report/main/modules/fonts.ts.html +1 -1
  43. package/coverage/lcov-report/main/modules/img.ts.html +1 -1
  44. package/coverage/lcov-report/main/modules/index.html +42 -12
  45. package/coverage/lcov-report/main/modules/input.ts.html +1 -1
  46. package/coverage/lcov-report/main/modules/mouse.ts.html +1 -1
  47. package/coverage/lcov-report/main/modules/network.ts.html +2 -2
  48. package/coverage/lcov-report/main/modules/performance.ts.html +1 -1
  49. package/coverage/lcov-report/main/modules/scroll.ts.html +1 -1
  50. package/coverage/lcov-report/main/modules/selection.ts.html +1 -1
  51. package/coverage/lcov-report/main/modules/tabs.ts.html +1 -1
  52. package/coverage/lcov-report/main/modules/tagWatcher.ts.html +334 -0
  53. package/coverage/lcov-report/main/modules/timing.ts.html +1 -1
  54. package/coverage/lcov-report/main/modules/userTesting/SignalManager.ts.html +370 -0
  55. package/coverage/lcov-report/main/modules/userTesting/dnd.ts.html +10 -22
  56. package/coverage/lcov-report/main/modules/userTesting/index.html +57 -27
  57. package/coverage/lcov-report/main/modules/userTesting/index.ts.html +814 -115
  58. package/coverage/lcov-report/main/modules/userTesting/recorder.ts.html +136 -67
  59. package/coverage/lcov-report/main/modules/userTesting/styles.ts.html +111 -39
  60. package/coverage/lcov-report/main/modules/userTesting/utils.ts.html +364 -0
  61. package/coverage/lcov-report/main/modules/viewport.ts.html +1 -1
  62. package/coverage/lcov-report/main/utils.ts.html +101 -59
  63. package/coverage/lcov-report/webworker/BatchWriter.ts.html +23 -5
  64. package/coverage/lcov-report/webworker/MessageEncoder.gen.ts.html +41 -5
  65. package/coverage/lcov-report/webworker/PrimitiveEncoder.ts.html +1 -1
  66. package/coverage/lcov-report/webworker/QueueSender.ts.html +18 -6
  67. package/coverage/lcov-report/webworker/index.html +17 -17
  68. package/coverage/lcov-report/webworker/index.ts.html +24 -15
  69. package/coverage/lcov.info +3267 -1349
  70. package/lib/app/index.js +2 -2
  71. package/lib/common/tsconfig.tsbuildinfo +1 -1
  72. package/lib/index.js +3 -2
  73. package/lib/modules/mouse.js +1 -0
  74. package/lib/modules/network.js +1 -0
  75. 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/290</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/158</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/57</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/282</span>
49
+ <span class='fraction'>0/476</span>
50
50
  </div>
51
51
 
52
52
 
@@ -823,7 +823,498 @@
823
823
  <a name='L758'></a><a href='#L758'>758</a>
824
824
  <a name='L759'></a><a href='#L759'>759</a>
825
825
  <a name='L760'></a><a href='#L760'>760</a>
826
- <a name='L761'></a><a href='#L761'>761</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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>
1317
+ <span class="cline-any cline-no">&nbsp;</span>
827
1318
  <span class="cline-any cline-no">&nbsp;</span>
828
1319
  <span class="cline-any cline-no">&nbsp;</span>
829
1320
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -835,6 +1326,15 @@
835
1326
  <span class="cline-any cline-neutral">&nbsp;</span>
836
1327
  <span class="cline-any cline-neutral">&nbsp;</span>
837
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>
838
1338
  <span class="cline-any cline-no">&nbsp;</span>
839
1339
  <span class="cline-any cline-no">&nbsp;</span>
840
1340
  <span class="cline-any cline-no">&nbsp;</span>
@@ -847,6 +1347,9 @@
847
1347
  <span class="cline-any cline-neutral">&nbsp;</span>
848
1348
  <span class="cline-any cline-neutral">&nbsp;</span>
849
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>
850
1353
  <span class="cline-any cline-neutral">&nbsp;</span>
851
1354
  <span class="cline-any cline-neutral">&nbsp;</span>
852
1355
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -872,9 +1375,23 @@
872
1375
  <span class="cline-any cline-neutral">&nbsp;</span>
873
1376
  <span class="cline-any cline-neutral">&nbsp;</span>
874
1377
  <span class="cline-any cline-neutral">&nbsp;</span>
875
- <span class="cline-any cline-neutral">&nbsp;</span>
876
1378
  <span class="cline-any cline-no">&nbsp;</span>
877
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>
878
1395
  <span class="cline-any cline-neutral">&nbsp;</span>
879
1396
  <span class="cline-any cline-neutral">&nbsp;</span>
880
1397
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -898,6 +1415,7 @@
898
1415
  <span class="cline-any cline-no">&nbsp;</span>
899
1416
  <span class="cline-any cline-no">&nbsp;</span>
900
1417
  <span class="cline-any cline-no">&nbsp;</span>
1418
+ <span class="cline-any cline-no">&nbsp;</span>
901
1419
  <span class="cline-any cline-neutral">&nbsp;</span>
902
1420
  <span class="cline-any cline-neutral">&nbsp;</span>
903
1421
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -952,6 +1470,12 @@
952
1470
  <span class="cline-any cline-no">&nbsp;</span>
953
1471
  <span class="cline-any cline-neutral">&nbsp;</span>
954
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>
955
1479
  <span class="cline-any cline-no">&nbsp;</span>
956
1480
  <span class="cline-any cline-no">&nbsp;</span>
957
1481
  <span class="cline-any cline-no">&nbsp;</span>
@@ -967,15 +1491,24 @@
967
1491
  <span class="cline-any cline-no">&nbsp;</span>
968
1492
  <span class="cline-any cline-neutral">&nbsp;</span>
969
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>
970
1499
  <span class="cline-any cline-neutral">&nbsp;</span>
971
1500
  <span class="cline-any cline-neutral">&nbsp;</span>
972
1501
  <span class="cline-any cline-neutral">&nbsp;</span>
973
1502
  <span class="cline-any cline-neutral">&nbsp;</span>
974
1503
  <span class="cline-any cline-neutral">&nbsp;</span>
975
1504
  <span class="cline-any cline-no">&nbsp;</span>
1505
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
1506
  <span class="cline-any cline-no">&nbsp;</span>
977
1507
  <span class="cline-any cline-no">&nbsp;</span>
978
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>
979
1512
  <span class="cline-any cline-neutral">&nbsp;</span>
980
1513
  <span class="cline-any cline-neutral">&nbsp;</span>
981
1514
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -999,6 +1532,7 @@
999
1532
  <span class="cline-any cline-neutral">&nbsp;</span>
1000
1533
  <span class="cline-any cline-no">&nbsp;</span>
1001
1534
  <span class="cline-any cline-no">&nbsp;</span>
1535
+ <span class="cline-any cline-no">&nbsp;</span>
1002
1536
  <span class="cline-any cline-neutral">&nbsp;</span>
1003
1537
  <span class="cline-any cline-neutral">&nbsp;</span>
1004
1538
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1017,6 +1551,9 @@
1017
1551
  <span class="cline-any cline-no">&nbsp;</span>
1018
1552
  <span class="cline-any cline-neutral">&nbsp;</span>
1019
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>
1020
1557
  <span class="cline-any cline-neutral">&nbsp;</span>
1021
1558
  <span class="cline-any cline-no">&nbsp;</span>
1022
1559
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1055,14 +1592,17 @@
1055
1592
  <span class="cline-any cline-no">&nbsp;</span>
1056
1593
  <span class="cline-any cline-no">&nbsp;</span>
1057
1594
  <span class="cline-any cline-no">&nbsp;</span>
1058
- <span class="cline-any cline-neutral">&nbsp;</span>
1595
+ <span class="cline-any cline-no">&nbsp;</span>
1059
1596
  <span class="cline-any cline-neutral">&nbsp;</span>
1060
1597
  <span class="cline-any cline-neutral">&nbsp;</span>
1061
1598
  <span class="cline-any cline-no">&nbsp;</span>
1062
1599
  <span class="cline-any cline-neutral">&nbsp;</span>
1063
1600
  <span class="cline-any cline-neutral">&nbsp;</span>
1601
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
1602
  <span class="cline-any cline-no">&nbsp;</span>
1065
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>
1066
1606
  <span class="cline-any cline-neutral">&nbsp;</span>
1067
1607
  <span class="cline-any cline-neutral">&nbsp;</span>
1068
1608
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1160,6 +1700,24 @@
1160
1700
  <span class="cline-any cline-neutral">&nbsp;</span>
1161
1701
  <span class="cline-any cline-neutral">&nbsp;</span>
1162
1702
  <span class="cline-any cline-no">&nbsp;</span>
1703
+ <span class="cline-any cline-no">&nbsp;</span>
1704
+ <span class="cline-any cline-no">&nbsp;</span>
1705
+ <span class="cline-any cline-no">&nbsp;</span>
1706
+ <span class="cline-any cline-neutral">&nbsp;</span>
1707
+ <span class="cline-any cline-no">&nbsp;</span>
1708
+ <span class="cline-any cline-neutral">&nbsp;</span>
1709
+ <span class="cline-any cline-no">&nbsp;</span>
1710
+ <span class="cline-any cline-neutral">&nbsp;</span>
1711
+ <span class="cline-any cline-neutral">&nbsp;</span>
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>
1717
+ <span class="cline-any cline-no">&nbsp;</span>
1718
+ <span class="cline-any cline-neutral">&nbsp;</span>
1719
+ <span class="cline-any cline-neutral">&nbsp;</span>
1720
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
1721
  <span class="cline-any cline-neutral">&nbsp;</span>
1164
1722
  <span class="cline-any cline-neutral">&nbsp;</span>
1165
1723
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1167,23 +1725,50 @@
1167
1725
  <span class="cline-any cline-neutral">&nbsp;</span>
1168
1726
  <span class="cline-any cline-no">&nbsp;</span>
1169
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>
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>
1738
+ <span class="cline-any cline-no">&nbsp;</span>
1170
1739
  <span class="cline-any cline-neutral">&nbsp;</span>
1171
1740
  <span class="cline-any cline-neutral">&nbsp;</span>
1172
1741
  <span class="cline-any cline-neutral">&nbsp;</span>
1173
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>
1174
1750
  <span class="cline-any cline-no">&nbsp;</span>
1175
1751
  <span class="cline-any cline-no">&nbsp;</span>
1176
1752
  <span class="cline-any cline-no">&nbsp;</span>
1177
1753
  <span class="cline-any cline-no">&nbsp;</span>
1178
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>
1179
1758
  <span class="cline-any cline-no">&nbsp;</span>
1180
1759
  <span class="cline-any cline-no">&nbsp;</span>
1760
+ <span class="cline-any cline-neutral">&nbsp;</span>
1181
1761
  <span class="cline-any cline-no">&nbsp;</span>
1182
1762
  <span class="cline-any cline-neutral">&nbsp;</span>
1183
1763
  <span class="cline-any cline-neutral">&nbsp;</span>
1184
1764
  <span class="cline-any cline-neutral">&nbsp;</span>
1185
1765
  <span class="cline-any cline-neutral">&nbsp;</span>
1186
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>
1771
+ <span class="cline-any cline-no">&nbsp;</span>
1187
1772
  <span class="cline-any cline-neutral">&nbsp;</span>
1188
1773
  <span class="cline-any cline-neutral">&nbsp;</span>
1189
1774
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1354,38 +1939,119 @@
1354
1939
  <span class="cline-any cline-neutral">&nbsp;</span>
1355
1940
  <span class="cline-any cline-neutral">&nbsp;</span>
1356
1941
  <span class="cline-any cline-neutral">&nbsp;</span>
1942
+ <span class="cline-any cline-no">&nbsp;</span>
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>
1947
+ <span class="cline-any cline-neutral">&nbsp;</span>
1948
+ <span class="cline-any cline-no">&nbsp;</span>
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>
1956
+ <span class="cline-any cline-neutral">&nbsp;</span>
1957
+ <span class="cline-any cline-neutral">&nbsp;</span>
1958
+ <span class="cline-any cline-neutral">&nbsp;</span>
1959
+ <span class="cline-any cline-neutral">&nbsp;</span>
1357
1960
  <span class="cline-any cline-neutral">&nbsp;</span>
1358
1961
  <span class="cline-any cline-no">&nbsp;</span>
1359
1962
  <span class="cline-any cline-no">&nbsp;</span>
1963
+ <span class="cline-any cline-no">&nbsp;</span>
1964
+ <span class="cline-any cline-no">&nbsp;</span>
1360
1965
  <span class="cline-any cline-neutral">&nbsp;</span>
1361
1966
  <span class="cline-any cline-no">&nbsp;</span>
1362
1967
  <span class="cline-any cline-no">&nbsp;</span>
1968
+ <span class="cline-any cline-no">&nbsp;</span>
1363
1969
  <span class="cline-any cline-neutral">&nbsp;</span>
1364
1970
  <span class="cline-any cline-neutral">&nbsp;</span>
1365
1971
  <span class="cline-any cline-neutral">&nbsp;</span>
1366
1972
  <span class="cline-any cline-neutral">&nbsp;</span>
1367
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>
1997
+ <span class="cline-any cline-no">&nbsp;</span>
1998
+ <span class="cline-any cline-no">&nbsp;</span>
1999
+ <span class="cline-any cline-neutral">&nbsp;</span>
2000
+ <span class="cline-any cline-neutral">&nbsp;</span>
2001
+ <span class="cline-any cline-neutral">&nbsp;</span>
2002
+ <span class="cline-any cline-neutral">&nbsp;</span>
2003
+ <span class="cline-any cline-neutral">&nbsp;</span>
2004
+ <span class="cline-any cline-neutral">&nbsp;</span>
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>
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>
1368
2019
  <span class="cline-any cline-no">&nbsp;</span>
1369
2020
  <span class="cline-any cline-no">&nbsp;</span>
1370
2021
  <span class="cline-any cline-neutral">&nbsp;</span>
1371
2022
  <span class="cline-any cline-no">&nbsp;</span>
1372
2023
  <span class="cline-any cline-no">&nbsp;</span>
2024
+ <span class="cline-any cline-no">&nbsp;</span>
1373
2025
  <span class="cline-any cline-neutral">&nbsp;</span>
1374
2026
  <span class="cline-any cline-no">&nbsp;</span>
2027
+ <span class="cline-any cline-no">&nbsp;</span>
2028
+ <span class="cline-any cline-no">&nbsp;</span>
2029
+ <span class="cline-any cline-no">&nbsp;</span>
1375
2030
  <span class="cline-any cline-neutral">&nbsp;</span>
1376
2031
  <span class="cline-any cline-no">&nbsp;</span>
2032
+ <span class="cline-any cline-no">&nbsp;</span>
1377
2033
  <span class="cline-any cline-neutral">&nbsp;</span>
1378
2034
  <span class="cline-any cline-no">&nbsp;</span>
1379
2035
  <span class="cline-any cline-neutral">&nbsp;</span>
1380
2036
  <span class="cline-any cline-neutral">&nbsp;</span>
1381
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>
1382
2040
  <span class="cline-any cline-neutral">&nbsp;</span>
2041
+ <span class="cline-any cline-no">&nbsp;</span>
1383
2042
  <span class="cline-any cline-neutral">&nbsp;</span>
1384
2043
  <span class="cline-any cline-no">&nbsp;</span>
1385
2044
  <span class="cline-any cline-no">&nbsp;</span>
1386
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>
2048
+ <span class="cline-any cline-neutral">&nbsp;</span>
2049
+ <span class="cline-any cline-no">&nbsp;</span>
1387
2050
  <span class="cline-any cline-neutral">&nbsp;</span>
1388
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>
2054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1389
2055
  <span class="cline-any cline-neutral">&nbsp;</span>
1390
2056
  <span class="cline-any cline-neutral">&nbsp;</span>
1391
2057
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1398,12 +2064,33 @@
1398
2064
  <span class="cline-any cline-no">&nbsp;</span>
1399
2065
  <span class="cline-any cline-no">&nbsp;</span>
1400
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>
2071
+ <span class="cline-any cline-no">&nbsp;</span>
1401
2072
  <span class="cline-any cline-neutral">&nbsp;</span>
1402
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>
2078
+ <span class="cline-any cline-neutral">&nbsp;</span>
2079
+ <span class="cline-any cline-no">&nbsp;</span>
2080
+ <span class="cline-any cline-no">&nbsp;</span>
2081
+ <span class="cline-any cline-neutral">&nbsp;</span>
2082
+ <span class="cline-any cline-no">&nbsp;</span>
2083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1403
2084
  <span class="cline-any cline-neutral">&nbsp;</span>
1404
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>
1405
2089
  <span class="cline-any cline-neutral">&nbsp;</span>
2090
+ <span class="cline-any cline-no">&nbsp;</span>
1406
2091
  <span class="cline-any cline-neutral">&nbsp;</span>
2092
+ <span class="cline-any cline-no">&nbsp;</span>
2093
+ <span class="cline-any cline-no">&nbsp;</span>
1407
2094
  <span class="cline-any cline-neutral">&nbsp;</span>
1408
2095
  <span class="cline-any cline-no">&nbsp;</span>
1409
2096
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1420,18 +2107,296 @@
1420
2107
  <span class="cline-any cline-neutral">&nbsp;</span>
1421
2108
  <span class="cline-any cline-neutral">&nbsp;</span>
1422
2109
  <span class="cline-any cline-neutral">&nbsp;</span>
2110
+ <span class="cline-any cline-no">&nbsp;</span>
2111
+ <span class="cline-any cline-neutral">&nbsp;</span>
2112
+ <span class="cline-any cline-neutral">&nbsp;</span>
2113
+ <span class="cline-any cline-neutral">&nbsp;</span>
2114
+ <span class="cline-any cline-neutral">&nbsp;</span>
2115
+ <span class="cline-any cline-neutral">&nbsp;</span>
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>
2119
+ <span class="cline-any cline-neutral">&nbsp;</span>
2120
+ <span class="cline-any cline-neutral">&nbsp;</span>
2121
+ <span class="cline-any cline-neutral">&nbsp;</span>
2122
+ <span class="cline-any cline-neutral">&nbsp;</span>
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>
2126
+ <span class="cline-any cline-neutral">&nbsp;</span>
2127
+ <span class="cline-any cline-neutral">&nbsp;</span>
2128
+ <span class="cline-any cline-neutral">&nbsp;</span>
2129
+ <span class="cline-any cline-neutral">&nbsp;</span>
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>
1423
2389
  <span class="cline-any cline-neutral">&nbsp;</span>
1424
2390
  <span class="cline-any cline-neutral">&nbsp;</span>
1425
2391
  <span class="cline-any cline-no">&nbsp;</span>
1426
2392
  <span class="cline-any cline-no">&nbsp;</span>
1427
2393
  <span class="cline-any cline-neutral">&nbsp;</span>
1428
2394
  <span class="cline-any cline-no">&nbsp;</span>
1429
- <span class="cline-any cline-neutral">&nbsp;</span>
1430
- <span class="cline-any cline-neutral">&nbsp;</span>
1431
2395
  <span class="cline-any cline-no">&nbsp;</span>
1432
2396
  <span class="cline-any cline-neutral">&nbsp;</span>
1433
2397
  <span class="cline-any cline-neutral">&nbsp;</span>
1434
- <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>
1435
2400
  <span class="cline-any cline-neutral">&nbsp;</span>
1436
2401
  <span class="cline-any cline-neutral">&nbsp;</span>
1437
2402
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1439,69 +2404,88 @@
1439
2404
  <span class="cline-any cline-no">&nbsp;</span>
1440
2405
  <span class="cline-any cline-neutral">&nbsp;</span>
1441
2406
  <span class="cline-any cline-no">&nbsp;</span>
2407
+ <span class="cline-any cline-neutral">&nbsp;</span>
1442
2408
  <span class="cline-any cline-no">&nbsp;</span>
1443
2409
  <span class="cline-any cline-neutral">&nbsp;</span>
1444
2410
  <span class="cline-any cline-neutral">&nbsp;</span>
1445
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>
1446
2421
  <span class="cline-any cline-neutral">&nbsp;</span>
1447
2422
  <span class="cline-any cline-neutral">&nbsp;</span>
1448
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>
1449
2426
  <span class="cline-any cline-neutral">&nbsp;</span>
2427
+ <span class="cline-any cline-no">&nbsp;</span>
2428
+ <span class="cline-any cline-no">&nbsp;</span>
2429
+ <span class="cline-any cline-no">&nbsp;</span>
1450
2430
  <span class="cline-any cline-neutral">&nbsp;</span>
1451
2431
  <span class="cline-any cline-neutral">&nbsp;</span>
1452
2432
  <span class="cline-any cline-neutral">&nbsp;</span>
1453
2433
  <span class="cline-any cline-neutral">&nbsp;</span>
2434
+ <span class="cline-any cline-no">&nbsp;</span>
1454
2435
  <span class="cline-any cline-neutral">&nbsp;</span>
1455
2436
  <span class="cline-any cline-neutral">&nbsp;</span>
1456
2437
  <span class="cline-any cline-neutral">&nbsp;</span>
2438
+ <span class="cline-any cline-no">&nbsp;</span>
1457
2439
  <span class="cline-any cline-neutral">&nbsp;</span>
1458
2440
  <span class="cline-any cline-neutral">&nbsp;</span>
1459
2441
  <span class="cline-any cline-no">&nbsp;</span>
1460
2442
  <span class="cline-any cline-no">&nbsp;</span>
2443
+ <span class="cline-any cline-no">&nbsp;</span>
2444
+ <span class="cline-any cline-no">&nbsp;</span>
2445
+ <span class="cline-any cline-no">&nbsp;</span>
1461
2446
  <span class="cline-any cline-neutral">&nbsp;</span>
1462
2447
  <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>
1463
2451
  <span class="cline-any cline-neutral">&nbsp;</span>
1464
2452
  <span class="cline-any cline-neutral">&nbsp;</span>
1465
2453
  <span class="cline-any cline-neutral">&nbsp;</span>
2454
+ <span class="cline-any cline-no">&nbsp;</span>
2455
+ <span class="cline-any cline-no">&nbsp;</span>
1466
2456
  <span class="cline-any cline-neutral">&nbsp;</span>
1467
2457
  <span class="cline-any cline-neutral">&nbsp;</span>
1468
2458
  <span class="cline-any cline-no">&nbsp;</span>
1469
- <span class="cline-any cline-neutral">&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>
1470
2463
  <span class="cline-any cline-no">&nbsp;</span>
1471
2464
  <span class="cline-any cline-no">&nbsp;</span>
1472
2465
  <span class="cline-any cline-no">&nbsp;</span>
1473
2466
  <span class="cline-any cline-neutral">&nbsp;</span>
1474
- <span class="cline-any cline-neutral">&nbsp;</span>
1475
- <span class="cline-any cline-neutral">&nbsp;</span>
1476
- <span class="cline-any cline-neutral">&nbsp;</span>
1477
- <span class="cline-any cline-neutral">&nbsp;</span>
2467
+ <span class="cline-any cline-no">&nbsp;</span>
1478
2468
  <span class="cline-any cline-neutral">&nbsp;</span>
1479
2469
  <span class="cline-any cline-neutral">&nbsp;</span>
1480
2470
  <span class="cline-any cline-no">&nbsp;</span>
2471
+ <span class="cline-any cline-no">&nbsp;</span>
1481
2472
  <span class="cline-any cline-neutral">&nbsp;</span>
1482
2473
  <span class="cline-any cline-neutral">&nbsp;</span>
1483
2474
  <span class="cline-any cline-neutral">&nbsp;</span>
1484
- <span class="cline-any cline-neutral">&nbsp;</span>
1485
- <span class="cline-any cline-no">&nbsp;</span>
1486
2475
  <span class="cline-any cline-no">&nbsp;</span>
1487
2476
  <span class="cline-any cline-neutral">&nbsp;</span>
1488
- <span class="cline-any cline-no">&nbsp;</span>
1489
2477
  <span class="cline-any cline-neutral">&nbsp;</span>
1490
2478
  <span class="cline-any cline-neutral">&nbsp;</span>
1491
2479
  <span class="cline-any cline-no">&nbsp;</span>
1492
- <span class="cline-any cline-no">&nbsp;</span>
1493
2480
  <span class="cline-any cline-neutral">&nbsp;</span>
1494
- <span class="cline-any cline-no">&nbsp;</span>
1495
2481
  <span class="cline-any cline-neutral">&nbsp;</span>
1496
- <span class="cline-any cline-no">&nbsp;</span>
1497
2482
  <span class="cline-any cline-neutral">&nbsp;</span>
2483
+ <span class="cline-any cline-no">&nbsp;</span>
1498
2484
  <span class="cline-any cline-neutral">&nbsp;</span>
1499
2485
  <span class="cline-any cline-neutral">&nbsp;</span>
1500
2486
  <span class="cline-any cline-neutral">&nbsp;</span>
1501
2487
  <span class="cline-any cline-neutral">&nbsp;</span>
1502
- <span class="cline-any cline-no">&nbsp;</span>
1503
2488
  <span class="cline-any cline-neutral">&nbsp;</span>
1504
- <span class="cline-any cline-no">&nbsp;</span>
1505
2489
  <span class="cline-any cline-neutral">&nbsp;</span>
1506
2490
  <span class="cline-any cline-neutral">&nbsp;</span>
1507
2491
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1509,62 +2493,57 @@
1509
2493
  <span class="cline-any cline-no">&nbsp;</span>
1510
2494
  <span class="cline-any cline-no">&nbsp;</span>
1511
2495
  <span class="cline-any cline-neutral">&nbsp;</span>
1512
- <span class="cline-any cline-no">&nbsp;</span>
1513
2496
  <span class="cline-any cline-neutral">&nbsp;</span>
1514
- <span class="cline-any cline-no">&nbsp;</span>
1515
- <span class="cline-any cline-no">&nbsp;</span>
1516
2497
  <span class="cline-any cline-neutral">&nbsp;</span>
1517
2498
  <span class="cline-any cline-no">&nbsp;</span>
1518
2499
  <span class="cline-any cline-no">&nbsp;</span>
1519
- <span class="cline-any cline-neutral">&nbsp;</span>
1520
- <span class="cline-any cline-neutral">&nbsp;</span>
1521
2500
  <span class="cline-any cline-no">&nbsp;</span>
1522
2501
  <span class="cline-any cline-no">&nbsp;</span>
1523
2502
  <span class="cline-any cline-no">&nbsp;</span>
1524
2503
  <span class="cline-any cline-no">&nbsp;</span>
1525
2504
  <span class="cline-any cline-neutral">&nbsp;</span>
1526
2505
  <span class="cline-any cline-neutral">&nbsp;</span>
1527
- <span class="cline-any cline-no">&nbsp;</span>
1528
- <span class="cline-any cline-no">&nbsp;</span>
2506
+ <span class="cline-any cline-neutral">&nbsp;</span>
1529
2507
  <span class="cline-any cline-no">&nbsp;</span>
1530
2508
  <span class="cline-any cline-neutral">&nbsp;</span>
1531
2509
  <span class="cline-any cline-neutral">&nbsp;</span>
1532
2510
  <span class="cline-any cline-neutral">&nbsp;</span>
1533
2511
  <span class="cline-any cline-neutral">&nbsp;</span>
1534
2512
  <span class="cline-any cline-neutral">&nbsp;</span>
2513
+ <span class="cline-any cline-no">&nbsp;</span>
1535
2514
  <span class="cline-any cline-neutral">&nbsp;</span>
1536
2515
  <span class="cline-any cline-neutral">&nbsp;</span>
1537
2516
  <span class="cline-any cline-neutral">&nbsp;</span>
1538
2517
  <span class="cline-any cline-no">&nbsp;</span>
1539
- <span class="cline-any cline-no">&nbsp;</span>
1540
- <span class="cline-any cline-no">&nbsp;</span>
1541
- <span class="cline-any cline-no">&nbsp;</span>
1542
2518
  <span class="cline-any cline-neutral">&nbsp;</span>
1543
2519
  <span class="cline-any cline-neutral">&nbsp;</span>
1544
2520
  <span class="cline-any cline-neutral">&nbsp;</span>
1545
2521
  <span class="cline-any cline-no">&nbsp;</span>
1546
2522
  <span class="cline-any cline-no">&nbsp;</span>
1547
- <span class="cline-any cline-no">&nbsp;</span>
1548
- <span class="cline-any cline-no">&nbsp;</span>
1549
- <span class="cline-any cline-no">&nbsp;</span>
1550
- <span class="cline-any cline-no">&nbsp;</span>
1551
2523
  <span class="cline-any cline-neutral">&nbsp;</span>
1552
2524
  <span class="cline-any cline-neutral">&nbsp;</span>
1553
2525
  <span class="cline-any cline-neutral">&nbsp;</span>
1554
- <span class="cline-any cline-no">&nbsp;</span>
1555
2526
  <span class="cline-any cline-neutral">&nbsp;</span>
1556
2527
  <span class="cline-any cline-neutral">&nbsp;</span>
1557
2528
  <span class="cline-any cline-neutral">&nbsp;</span>
1558
2529
  <span class="cline-any cline-neutral">&nbsp;</span>
1559
2530
  <span class="cline-any cline-neutral">&nbsp;</span>
1560
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>
1561
2534
  <span class="cline-any cline-neutral">&nbsp;</span>
1562
2535
  <span class="cline-any cline-neutral">&nbsp;</span>
1563
2536
  <span class="cline-any cline-neutral">&nbsp;</span>
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>
1564
2541
  <span class="cline-any cline-no">&nbsp;</span>
1565
2542
  <span class="cline-any cline-neutral">&nbsp;</span>
1566
2543
  <span class="cline-any cline-neutral">&nbsp;</span>
1567
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>
1568
2547
  <span class="cline-any cline-no">&nbsp;</span>
1569
2548
  <span class="cline-any cline-no">&nbsp;</span>
1570
2549
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1577,14 +2556,25 @@
1577
2556
  <span class="cline-any cline-no">&nbsp;</span>
1578
2557
  <span class="cline-any cline-no">&nbsp;</span>
1579
2558
  <span class="cline-any cline-neutral">&nbsp;</span>
2559
+ <span class="cline-any cline-no">&nbsp;</span>
1580
2560
  <span class="cline-any cline-neutral">&nbsp;</span>
1581
2561
  <span class="cline-any cline-no">&nbsp;</span>
1582
2562
  <span class="cline-any cline-neutral">&nbsp;</span>
1583
2563
  <span class="cline-any cline-neutral">&nbsp;</span>
1584
2564
  <span class="cline-any cline-neutral">&nbsp;</span>
1585
2565
  <span class="cline-any cline-neutral">&nbsp;</span>
1586
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type Message from './messages.gen.js'
1587
- <span class="cstat-no" title="statement not covered" >import { Timestamp, Metadata, UserID, Type as MType, TabChange, TabData } from './messages.gen.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'
1588
2578
  <span class="cstat-no" title="statement not covered" >import {</span>
1589
2579
  now,
1590
2580
  adjustTimeOrigin,
@@ -1598,16 +2588,18 @@
1598
2588
  <span class="cstat-no" title="statement not covered" >import Observer from './observer/top_observer.js'</span>
1599
2589
  <span class="cstat-no" title="statement not covered" >import Sanitizer from './sanitizer.js'</span>
1600
2590
  <span class="cstat-no" title="statement not covered" >import Ticker from './ticker.js'</span>
1601
- <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>
1602
2592
  <span class="cstat-no" title="statement not covered" >import Session from './session.js'</span>
1603
2593
  <span class="cstat-no" title="statement not covered" >import { gzip } from 'fflate'</span>
1604
2594
  <span class="cstat-no" title="statement not covered" >import { deviceMemory, jsHeapSizeLimit } from '../modules/performance.js'</span>
1605
2595
  <span class="cstat-no" title="statement not covered" >import AttributeSender from '../modules/attributeSender.js'</span>
1606
2596
  import type { Options as ObserverOptions } from './observer/top_observer.js'
1607
2597
  import type { Options as SanitizerOptions } from './sanitizer.js'
1608
- import type { Options as LoggerOptions } from './logger.js'
1609
2598
  import type { Options as SessOptions } from './session.js'
1610
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>
1611
2603
  &nbsp;
1612
2604
  import type {
1613
2605
  Options as WebworkerOptions,
@@ -1634,17 +2626,32 @@ interface OnStartInfo {
1634
2626
  }
1635
2627
  &nbsp;
1636
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>
1637
2631
  const START_ERROR = <span class="cstat-no" title="statement not covered" >':(' as const</span>
1638
- type SuccessfulStart = OnStartInfo &amp; { success: true }
2632
+ type SuccessfulStart = OnStartInfo &amp; {
2633
+ success: true
2634
+ }
1639
2635
  type UnsuccessfulStart = {
1640
2636
  reason: typeof CANCELED | string
1641
2637
  success: false
1642
2638
  }
1643
2639
  &nbsp;
1644
- type RickRoll = { source: string; context: string } &amp; (
1645
- | { line: 'never-gonna-give-you-up' }
1646
- | { line: 'never-gonna-let-you-down'; token: string }
1647
- | { line: 'never-gonna-run-around-and-desert-you'; 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
+ }
1648
2655
  )
1649
2656
  &nbsp;
1650
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>
@@ -1658,6 +2665,7 @@ type CommitCallback = (messages: Array&lt;Message&gt;) =&gt; void
1658
2665
  <span class="cstat-no" title="statement not covered" > NotActive,</span>
1659
2666
  <span class="cstat-no" title="statement not covered" > Starting,</span>
1660
2667
  <span class="cstat-no" title="statement not covered" > Active,</span>
2668
+ <span class="cstat-no" title="statement not covered" > ColdStart,</span>
1661
2669
  }
1662
2670
  &nbsp;
1663
2671
  type AppOptions = {
@@ -1670,17 +2678,17 @@ type AppOptions = {
1670
2678
  local_uuid_key: string
1671
2679
  ingestPoint: string
1672
2680
  resourceBaseHref: string | null // resourceHref?
1673
- //resourceURLRewriter: (url: string) =&gt; string | boolean,
1674
- verbose: boolean
1675
2681
  __is_snippet: boolean
1676
2682
  __debug_report_edp: string | null
1677
- __debug__?: LoggerOptions
2683
+ __debug__?: ILogLevel
2684
+ __save_canvas_locally?: boolean
1678
2685
  localStorage: Storage | null
1679
2686
  sessionStorage: Storage | null
1680
2687
  forceSingleTab?: boolean
1681
2688
  disableStringDict?: boolean
2689
+ assistSocketHost?: string
1682
2690
  &nbsp;
1683
- // @deprecated
2691
+ /** @deprecated */
1684
2692
  onStart?: StartCallback
1685
2693
  network?: NetworkOptions
1686
2694
  } &amp; WebworkerOptions &amp;
@@ -1710,8 +2718,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1710
2718
  readonly localStorage: Storage
1711
2719
  readonly sessionStorage: Storage
1712
2720
  private readonly <span class="cstat-no" title="statement not covered" >messages: Array&lt;Message&gt; = []</span>
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>
1713
2727
  /* private */
1714
- readonly observer: Observer // non-privat for attachContextCallback
2728
+ readonly observer: Observer // non-private for attachContextCallback
1715
2729
  private readonly <span class="cstat-no" title="statement not covered" >startCallbacks: Array&lt;StartCallback&gt; = []</span>
1716
2730
  private readonly <span class="cstat-no" title="statement not covered" >stopCallbacks: Array&lt;() =&gt; any&gt; = []</span>
1717
2731
  private readonly <span class="cstat-no" title="statement not covered" >commitCallbacks: Array&lt;CommitCallback&gt; = []</span>
@@ -1727,11 +2741,18 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1727
2741
  private readonly <span class="cstat-no" title="statement not covered" >bc: BroadcastChannel | null = null</span>
1728
2742
  private readonly contextId
1729
2743
  public attributeSender: AttributeSender
1730
- &nbsp;
1731
- <span class="fstat-no" title="function not covered" > constructor(p</span>rojectKey: string, sessionToken: string | undefined, options: Partial&lt;Options&gt;) {
1732
- // if (options.onStart !== undefined) {
1733
- // deprecationWarn("'onStart' option", "tracker.start().then(/* handle session info */)")
1734
- // } ?? maybe onStart is good
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
2749
+ &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
+ ) {
1735
2756
  <span class="cstat-no" title="statement not covered" > this.contextId = Math.random().toString(36).slice(2)</span>
1736
2757
  <span class="cstat-no" title="statement not covered" > this.projectKey = projectKey</span>
1737
2758
  <span class="cstat-no" title="statement not covered" > this.networkOptions = options.network</span>
@@ -1746,19 +2767,22 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1746
2767
  local_uuid_key: '__openreplay_uuid',
1747
2768
  ingestPoint: DEFAULT_INGEST_POINT,
1748
2769
  resourceBaseHref: null,
1749
- verbose: false,
1750
2770
  __is_snippet: false,
1751
2771
  __debug_report_edp: null,
2772
+ __debug__: LogLevel.Silent,
2773
+ __save_canvas_locally: false,
1752
2774
  localStorage: null,
1753
2775
  sessionStorage: null,
1754
2776
  disableStringDict: false,
1755
2777
  forceSingleTab: false,
2778
+ assistSocketHost: '',
1756
2779
  },
1757
2780
  options,
1758
2781
  )
1759
2782
  &nbsp;
1760
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>
1761
- <span class="cstat-no" title="statement not covered" > this.bc = inIframe() ? null : 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>
1762
2786
  }
1763
2787
  &nbsp;
1764
2788
  <span class="cstat-no" title="statement not covered" > this.revID = this.options.revID</span>
@@ -1770,9 +2794,12 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1770
2794
  <span class="cstat-no" title="statement not covered" > this.ticker = new Ticker(this)</span>
1771
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>
1772
2796
  <span class="cstat-no" title="statement not covered" > this.debug = new Logger(this.options.__debug__)</span>
1773
- <span class="cstat-no" title="statement not covered" > this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent)</span>
1774
2797
  <span class="cstat-no" title="statement not covered" > this.session = new Session(this, this.options)</span>
1775
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
+ })
1776
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>
1777
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>
1778
2805
  // TODO: nullable userID
@@ -1800,29 +2827,32 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1800
2827
  <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
1801
2828
  <span class="cstat-no" title="statement not covered" > void this.start({}, true)</span>
1802
2829
  } else <span class="cstat-no" title="statement not covered" >if (data === 'not_init') {</span>
1803
- <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>
1804
2831
  } else <span class="cstat-no" title="statement not covered" >if (data.type === 'failure') {</span>
1805
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>
1806
2834
  <span class="cstat-no" title="statement not covered" > this._debug('worker_failed', data.reason)</span>
1807
- } 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>
1808
2836
  const batch = <span class="cstat-no" title="statement not covered" >data.batch</span>
1809
2837
  const batchSize = <span class="cstat-no" title="statement not covered" >batch.byteLength</span>
1810
2838
  <span class="cstat-no" title="statement not covered" > if (batchSize &gt; this.compressionThreshold) {</span>
1811
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>
1812
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (err) {</span>
1813
- <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>
1814
2842
  <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
1815
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>
1816
2844
  <span class="cstat-no" title="statement not covered" > this.restartAttempts += 1</span>
1817
2845
  <span class="cstat-no" title="statement not covered" > void this.start({}, true)</span>
1818
2846
  }
2847
+ } else {
2848
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({ type: 'compressed', batch: result })</span>
1819
2849
  }
1820
- // @ts-ignore
1821
- <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({ type: 'compressed', batch: result })</span>
1822
2850
  })
1823
2851
  } else {
1824
2852
  <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({ type: 'uncompressed', batch: batch })</span>
1825
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>
1826
2856
  }
1827
2857
  }
1828
2858
  const alertWorker = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
@@ -1895,7 +2925,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1895
2925
  body: JSON.stringify({
1896
2926
  context,
1897
2927
  // @ts-ignore
1898
- error: `${e}`,
2928
+ error: `${e as unknown as string}`,
1899
2929
  }),
1900
2930
  })
1901
2931
  }
@@ -1917,31 +2947,76 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1917
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>
1918
2948
  <span class="cstat-no" title="statement not covered" > return</span>
1919
2949
  }
1920
- // ====================================================
1921
2950
  &nbsp;
1922
- <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
+ }
1923
2961
  // TODO: commit on start if there were `urgent` sends;
1924
2962
  // Clarify where urgent can be used for;
1925
2963
  // Clarify workflow for each type of message in case it was sent before start
1926
2964
  // (like Fetch before start; maybe add an option "preCapture: boolean" or sth alike)
1927
- // 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
1928
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>
1929
2967
  <span class="cstat-no" title="statement not covered" > this.commit()</span>
1930
2968
  }
1931
2969
  }
1932
2970
  &nbsp;
1933
- private <span class="fstat-no" title="function not covered" >commit(</span>): void {
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 {
1934
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>
1935
2977
  <span class="cstat-no" title="statement not covered" > requestIdleCb(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1936
2978
  <span class="cstat-no" title="statement not covered" > this.messages.unshift(TabData(this.session.getTabId()))</span>
1937
2979
  <span class="cstat-no" title="statement not covered" > this.messages.unshift(Timestamp(this.timestamp()))</span>
1938
- // ? why I need to do this?
1939
- <span class="cstat-no" title="statement not covered" > this.worker!.postMessage(this.messages)</span>
2980
+ // why I need to add opt chaining?
2981
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage(this.messages)</span>
1940
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>
1941
2983
  <span class="cstat-no" title="statement not covered" > this.messages.length = 0</span>
1942
2984
  })
1943
2985
  }
1944
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;
3007
+ private <span class="fstat-no" title="function not covered" >commit(</span>): void {
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>
3012
+ }
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
+ }
1945
3020
  &nbsp;
1946
3021
  private <span class="cstat-no" title="statement not covered" >delay = 0</span>
1947
3022
  &nbsp;
@@ -2114,19 +3189,286 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2114
3189
  }
2115
3190
  }
2116
3191
  &nbsp;
2117
- 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
+ }
2118
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>
2119
- <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>
2120
3459
  }
2121
- <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>
2122
- <span class="cstat-no" title="statement not covered" > return Promise.resolve(</span>
2123
- UnsuccessfulStart(
2124
- 'OpenReplay: trying to call `start()` on the instance that has been started already.',
2125
- ),
2126
- )
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>
2127
3467
  }
2128
3468
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Starting</span>
2129
- <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
+ }
2130
3472
  &nbsp;
2131
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>
2132
3474
  <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
@@ -2146,22 +3488,20 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2146
3488
  type: 'start',
2147
3489
  pageNo: this.session.incPageNo(),
2148
3490
  ingestPoint: this.options.ingestPoint,
2149
- timestamp,
3491
+ timestamp: isColdStart ? this.coldStartTs : timestamp,
2150
3492
  url: document.URL,
2151
3493
  connAttemptCount: this.options.connAttemptCount,
2152
3494
  connAttemptGap: this.options.connAttemptGap,
2153
3495
  tabId: this.session.getTabId(),
2154
3496
  })
2155
3497
  &nbsp;
2156
- const lsReset = <span class="cstat-no" title="statement not covered" >this.sessionStorage.getItem(this.options.session_reset_key) !== null</span>
2157
- <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
2158
- const needNewSessionID = <span class="cstat-no" title="statement not covered" >startOpts.forceNew || lsReset || resetByWorker</span>
2159
3498
  const sessionToken = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
2160
- 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>
2161
3501
  &nbsp;
2162
- <span class="cstat-no" title="statement not covered" > console.log(</span>
3502
+ <span class="cstat-no" title="statement not covered" > this.debug.log(</span>
2163
3503
  'OpenReplay: starting session; need new session id?',
2164
- needNewSessionID,
3504
+ isNewSession,
2165
3505
  'session token: ',
2166
3506
  sessionToken,
2167
3507
  )
@@ -2174,11 +3514,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2174
3514
  body: JSON.stringify({
2175
3515
  ...this.getTrackerInfo(),
2176
3516
  timestamp,
3517
+ doNotRecord: false,
3518
+ bufferDiff: timestamp - this.coldStartTs,
2177
3519
  userID: this.session.getInfo().userID,
2178
3520
  token: isNewSession ? undefined : sessionToken,
2179
3521
  deviceMemory,
2180
3522
  jsHeapSizeLimit,
2181
3523
  timezone: getTimezone(),
3524
+ condition: conditionName,
2182
3525
  }),
2183
3526
  })
2184
3527
  .then(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; {
@@ -2194,12 +3537,16 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2194
3537
  )
2195
3538
  }
2196
3539
  })
2197
- .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>
2198
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>
2199
- <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>
2200
3545
  }
2201
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>
2202
- <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>
2203
3550
  }
2204
3551
  const {
2205
3552
  token,
@@ -2216,6 +3563,9 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2216
3563
  userDevice,
2217
3564
  userOS,
2218
3565
  userState,
3566
+ canvasEnabled,
3567
+ canvasQuality,
3568
+ canvasFPS,
2219
3569
  } = <span class="cstat-no" title="statement not covered" >r</span>
2220
3570
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
2221
3571
  typeof token !== 'string' ||
@@ -2225,7 +3575,9 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2225
3575
  typeof delay !== 'number' ||
2226
3576
  (typeof beaconSizeLimit !== 'number' &amp;&amp; typeof beaconSizeLimit !== 'undefined')
2227
3577
  ) {
2228
- <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>
2229
3581
  }
2230
3582
  <span class="cstat-no" title="statement not covered" > this.delay = delay</span>
2231
3583
  <span class="cstat-no" title="statement not covered" > this.session.setSessionToken(token)</span>
@@ -2242,8 +3594,15 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2242
3594
  timestamp: startTimestamp || timestamp,
2243
3595
  projectID,
2244
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;
2245
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>
2246
- <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>
2247
3606
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
2248
3607
  <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
2249
3608
  }
@@ -2253,42 +3612,126 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2253
3612
  )
2254
3613
  <span class="cstat-no" title="statement not covered" > this.localStorage.setItem(this.options.local_uuid_key, userUUID)</span>
2255
3614
  &nbsp;
2256
- <span class="cstat-no" title="statement not covered" > this.worker.postMessage({</span>
2257
- type: 'auth',
2258
- token,
2259
- beaconSizeLimit,
2260
- })
2261
- &nbsp;
2262
3615
  <span class="cstat-no" title="statement not covered" > this.compressionThreshold = compressionThreshold</span>
2263
- &nbsp;
2264
3616
  const onStartInfo = <span class="cstat-no" title="statement not covered" >{ sessionToken: token, userUUID, sessionID }</span>
2265
- &nbsp;
2266
3617
  // TODO: start as early as possible (before receiving the token)
3618
+ /** after start */
2267
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)
2268
- <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
2269
- <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>
2270
3622
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Active</span>
2271
3623
  &nbsp;
2272
- <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;
2273
3652
  // get rid of onStart ?
2274
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>
2275
3654
  <span class="cstat-no" title="statement not covered" > this.options.onStart(onStartInfo)</span>
2276
3655
  }
2277
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;
2278
3688
  <span class="cstat-no" title="statement not covered" > return SuccessfulStart(onStartInfo)</span>
2279
3689
  })
2280
3690
  .catch(<span class="fstat-no" title="function not covered" >(r</span>eason) =&gt; {
2281
3691
  <span class="cstat-no" title="statement not covered" > this.stop()</span>
2282
3692
  <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
2283
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>
2284
3695
  <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(CANCELED)</span>
2285
3696
  }
2286
3697
  &nbsp;
2287
- <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay was unable to start. ', reason)</span>
2288
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>
2289
3700
  <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(START_ERROR)</span>
2290
3701
  })
2291
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
+ }
2292
3735
  &nbsp;
2293
3736
  /**
2294
3737
  * basically we ask other tabs during constructor
@@ -2324,6 +3767,31 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2324
3767
  <span class="cstat-no" title="statement not covered" > return this.session.getTabId()</span>
2325
3768
  }
2326
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;
2327
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 {
2328
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>
2329
3797
  <span class="cstat-no" title="statement not covered" > try {</span>
@@ -2333,10 +3801,12 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2333
3801
  <span class="cstat-no" title="statement not covered" > this.nodes.clear()</span>
2334
3802
  <span class="cstat-no" title="statement not covered" > this.ticker.stop()</span>
2335
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>
2336
- <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>
2337
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>
2338
3807
  <span class="cstat-no" title="statement not covered" > this.worker.postMessage('stop')</span>
2339
3808
  }
3809
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder?.clear()</span>
2340
3810
  } finally {
2341
3811
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.NotActive</span>
2342
3812
  }
@@ -2350,7 +3820,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2350
3820
  <div class='footer quiet pad2 space-top1 center small'>
2351
3821
  Code coverage generated by
2352
3822
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2353
- at 2023-11-03T09:39:08.430Z
3823
+ at 2024-01-23T12:19:37.435Z
2354
3824
  </div>
2355
3825
  <script src="../../prettify.js"></script>
2356
3826
  <script>