@viibe/impulse-integration-js 2.4.2 → 3.0.0

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.
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">53.63% </span>
26
+ <span class="strong">43.51% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>59/110</span>
28
+ <span class='fraction'>47/108</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">35.65% </span>
33
+ <span class="strong">34.28% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>41/115</span>
35
+ <span class='fraction'>24/70</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">45.16% </span>
40
+ <span class="strong">27.27% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>14/31</span>
42
+ <span class='fraction'>6/22</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
47
+ <span class="strong">43.39% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>1/1</span>
49
+ <span class='fraction'>46/106</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,16 +61,1006 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line low'></div>
65
65
  <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">9x</span></td><td class="text"><pre class="prettyprint lang-js">(()=&gt;{var t={579:t=&gt;{function n(t,n){<span class="missing-if-branch" title="if path not taken" >I</span>if(!(t instanceof n))<span class="cstat-no" title="statement not covered" >throw new TypeError("Cannot call a class as a function")}</span>function e(t,n){for(var e=0;e&lt;n.length;e++){var o=n[e];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&amp;&amp;(o.writable=!0),Object.defineProperty(t,o.key,o)}}function o(t,n,o){return n&amp;&amp;e(t.prototype,n),o&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >e(t,o),</span>t}function i(t){return <span class="fstat-no" title="function not covered" >fu</span>nction(n){<span class="cstat-no" title="statement not covered" >return Boolean(n.isTrusted&amp;&amp;0===n.origin.indexOf(t))}</span>}function <span class="fstat-no" title="function not covered" >a(</span>t){var n=<span class="cstat-no" title="statement not covered" >new URL(t),</span>e=<span class="cstat-no" title="statement not covered" >"".concat(n.protocol,"//").concat(n.host),</span>o=<span class="cstat-no" title="statement not covered" >window.screen.width/2-240,</span>a=<span class="cstat-no" title="statement not covered" >window.screen.height/2-300,</span>r=<span class="cstat-no" title="statement not covered" >["toolbar=no","location=no","directories=no","status=no","menubar=no","scrollbars=no","resizable=no","copyhistory=no","width=".concat(480),"height=".concat(600),"top=".concat(a),"left=".concat(o)];<span class="cstat-no" title="statement not covered" ></span>return new Promise((<span class="fstat-no" title="function not covered" >fu</span>nction(n,o){var a=<span class="cstat-no" title="statement not covered" >window.open(t,"Authorization",r.join(", "));<span class="cstat-no" title="statement not covered" ></span>a||o("Failed to open window");v</span>ar c=<span class="cstat-no" title="statement not covered" >setInterval((<span class="fstat-no" title="function not covered" >fu</span>nction(){<span class="cstat-no" title="statement not covered" >a.closed&amp;&amp;(s(),o("User closed window"))}</span>),100);</span>function <span class="fstat-no" title="function not covered" >s(</span>){<span class="cstat-no" title="statement not covered" >window.removeEventListener("message",u),clearInterval(c)}</span>function <span class="fstat-no" title="function not covered" >u(</span>t){<span class="cstat-no" title="statement not covered" >if(!i(e)(t))<span class="cstat-no" title="statement not covered" >return null;<span class="cstat-no" title="statement not covered" >i</span></span>f(t.data.token&amp;&amp;(s(),n(t.data.token)),t.data.error&amp;&amp;(s(),o(t.data.error)),t.data&amp;&amp;t.data.event&amp;&amp;t.data.payload)<span class="cstat-no" title="statement not covered" >switch(t.data.event){case"authentication:success":<span class="cstat-no" title="statement not covered" >return s(),n(t.data);c</span>ase"authentication:failure":<span class="cstat-no" title="statement not covered" >return s(),o(t.data)}<span class="cstat-no" title="statement not covered" ></span>r</span></span>eturn null}<span class="cstat-no" title="statement not covered" ></span>window.addEventListener("message",u)}</span>))}</span>var r=function(){function <span class="fstat-no" title="function not covered" >t(</span>){var e=<span class="cstat-no" title="statement not covered" >arguments.length&gt;0&amp;&amp;void 0!==arguments[0]?arguments[0]:"auth.viibe.pro";<span class="cstat-no" title="statement not covered" ></span>n(this,t),this.host=e}</span>return o(t,[{key:"loginZendesk",value:<span class="fstat-no" title="function not covered" >fu</span>nction(t){var n=<span class="cstat-no" title="statement not covered" >document.location.origin;<span class="cstat-no" title="statement not covered" ></span>return a("https://".concat(this.host,"/auth/zendesk/login?subdomain=").concat(t,"&amp;origin=").concat(n))}</span>}]),t}(),c=function(){function t(e){n(this,t),this.handlers=[],this.host=e.host,this.origin=/^localhost/.test(this.host)?"http://".concat(this.host):"https://".concat(this.host),this.apiOrigin=/^localhost/.test(this.host)?"http://".concat(this.host):"https://api-".concat(this.host),this.source=e.source,this.isViibeEvent=i(this.origin),window.addEventListener("message",this.onMessage.bind(this))}return o(t,[{key:"createNotificationIframe",value:function(){if(!this.host)throw new Error("fillHost");if(!this.source)throw new Error("fillSource");var t=document.createElement("iframe");return t.name="viibe-".concat(Math.floor(1e4*Math.random())),t.style="border: 0;width: 0;",t.src="".concat(this.origin,"/integration/features/notifications"),t}},{key:"createCallIframe",value:function(){var t=this,n=arguments.length&gt;0&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >void 0!==arguments[0]?<span class="branch-0 cbranch-no" title="branch not covered" ></span>arguments[0]:</span>{};if(!this.host)throw new Error("fillHost");if(!this.source)throw new Error("fillSource");var e=this.generateIframeSrc(n),o=document.createElement("iframe");return o.name="viibe-".concat(Math.floor(1e4*Math.random())),o.style="border: 0;width: calc(100% - 1rem);margin: 0.5rem;",o.src=e,o.allow="geolocation;autoplay;microphone;camera;midi;encrypted-media;clipboard-write;",this.on(o,"document",(<span class="fstat-no" title="function not covered" >fu</span>nction(n){<span class="cstat-no" title="statement not covered" >return t.onDocument(n)}</span>)),o}},{key:"generateIframeSrc",value:function(){var t=arguments.length&gt;0&amp;&amp;void 0!==arguments[0]?arguments[0]:<span class="branch-1 cbranch-no" title="branch not covered" >{},</span>n=t.clipboard,e=void 0!==n&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >n,</span>o=t.components,i=t.links,a=t.o2m,r=void 0!==a&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >a,</span>c=t.ticket,s=t.locale,u=t.standalone,l=t.suggestions,h=t.token,d="".concat(this.origin,"/integration/features/ticket"),f=new URLSearchParams({origin:document.location.origin,resize:"true",source:this.source});<span class="missing-if-branch" title="if path not taken" >I</span>if(c&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >c.title&amp;</span>&amp;<span class="branch-2 cbranch-no" title="branch not covered" >f.set("title",c.title),</span>c&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >c.integration)</span>{<span class="cstat-no" title="statement not covered" >f.set("thirdPartyId",c.integration.id);v</span>ar v=<span class="cstat-no" title="statement not covered" >(c.integration.customData||{}).entUuid;<span class="cstat-no" title="statement not covered" ></span>v&amp;&amp;f.set("entUuid",v)}<span class="missing-if-branch" title="if path not taken" >I</span></span>if(i){var m=<span class="cstat-no" title="statement not covered" >i instanceof Array?i.map((<span class="fstat-no" title="function not covered" >fu</span>nction(t){<span class="cstat-no" title="statement not covered" >return"".concat(t.category,":").concat(t.value)}</span>)).join(","):String(i);<span class="cstat-no" title="statement not covered" ></span>f.set("links",m)}<span class="missing-if-branch" title="if path not taken" >I</span></span>if(l){var w=<span class="cstat-no" title="statement not covered" >l instanceof Array?l.map((<span class="fstat-no" title="function not covered" >fu</span>nction(t){var n=<span class="cstat-no" title="statement not covered" >t.category,</span>e=<span class="cstat-no" title="statement not covered" >t.value,</span>o=<span class="cstat-no" title="statement not covered" >t.description,</span>i=<span class="cstat-no" title="statement not covered" >"".concat(n,":").concat(e);<span class="cstat-no" title="statement not covered" ></span>return o&amp;&amp;(i+=":".concat(o)),i}</span>)).join(","):String(l);<span class="cstat-no" title="statement not covered" ></span>f.set("suggestions",w)}<span class="missing-if-branch" title="if path not taken" >I</span></span>if(h&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >f.set("token",h),</span>s&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >f.set("locale",s),</span>o){var p=<span class="cstat-no" title="statement not covered" >o instanceof Array?o.join(","):String(o);<span class="cstat-no" title="statement not covered" ></span>f.set("components",p)}</span>return u&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >f.set("standalone",Boolean(u)),</span>f.set("clipboard",Boolean(e)),f.set("o2m",Boolean(r)),d+"?".concat(f)}},{key:"dispatch",value:<span class="fstat-no" title="function not covered" >fu</span>nction(t,n,e,o){<span class="cstat-no" title="statement not covered" >return this.handlers.filter((<span class="fstat-no" title="function not covered" >fu</span>nction(n){<span class="cstat-no" title="statement not covered" >return n.eventName===t&amp;&amp;(!n.windowName||n.windowName===o)}</span>)).map((<span class="fstat-no" title="function not covered" >fu</span>nction(t){<span class="cstat-no" title="statement not covered" >return t.func(n,e)}</span>))}</span>},{key:"onMessage",value:<span class="fstat-no" title="function not covered" >fu</span>nction(t){<span class="cstat-no" title="statement not covered" >return this.isViibeEvent(t)?t.data&amp;&amp;t.data.event?this.dispatch(t.data.event,t.data.payload,t,t.data.windowName):t.data&amp;&amp;t.data.token?this.dispatch("authentication:token",t.data.token,t):t.data&amp;&amp;t.data.error?this.dispatch("authentication:error",t.data.error,t):null:null}</span>},{key:"on",value:function(t,n,e){"string"==typeof t&amp;&amp;<span class="branch-1 cbranch-no" title="branch not covered" >"function"==typeof n&amp;</span>&amp;<span class="branch-2 cbranch-no" title="branch not covered" >void 0===e&amp;</span>&amp;(<span class="branch-3 cbranch-no" title="branch not covered" >e=n,n=t,t=null)</span>;var o={eventName:n,func:e,windowName:t?t.name:<span class="branch-1 cbranch-no" title="branch not covered" >null}</span>;this.handlers.push(o)}},{key:"onDocument",value:<span class="fstat-no" title="function not covered" >fu</span>nction(t){<span class="cstat-no" title="statement not covered" >window.open(t.signed_url,"_blank")}</span>},{key:"authenticate",value:<span class="fstat-no" title="function not covered" >fu</span>nction(t){var n=<span class="cstat-no" title="statement not covered" >document.location,</span>e=<span class="cstat-no" title="statement not covered" >n.protocol,</span>o=<span class="cstat-no" title="statement not covered" >n.host;<span class="cstat-no" title="statement not covered" ></span>return a("".concat(e,"//api-").concat(o,"/auth/login/").concat(t,"?origin=").concat(origin))}</span>}]),t}();c.Auth=r,"undefined"!=typeof window&amp;&amp;(window.Viibe=c),t.exports=c}},n={},e=function e(o){var i=n[o];<span class="missing-if-branch" title="if path not taken" >I</span>if(void 0!==i)<span class="cstat-no" title="statement not covered" >return i.exports;v</span>ar a=n[o]={exports:{}};return t[o](a,a.exports,e),a.exports}(579);module.exports=e})();</pre></td></tr></table></pre>
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
397
+ <span class="cline-any cline-neutral">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
+ <span class="cline-any cline-yes">8x</span>
400
+ <span class="cline-any cline-no">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-no">&nbsp;</span>
406
+ <span class="cline-any cline-no">&nbsp;</span>
407
+ <span class="cline-any cline-neutral">&nbsp;</span>
408
+ <span class="cline-any cline-no">&nbsp;</span>
409
+ <span class="cline-any cline-no">&nbsp;</span>
410
+ <span class="cline-any cline-no">&nbsp;</span>
411
+ <span class="cline-any cline-no">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-no">&nbsp;</span>
414
+ <span class="cline-any cline-no">&nbsp;</span>
415
+ <span class="cline-any cline-no">&nbsp;</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-neutral">&nbsp;</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-no">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-no">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-neutral">&nbsp;</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-no">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-neutral">&nbsp;</span>
445
+ <span class="cline-any cline-neutral">&nbsp;</span>
446
+ <span class="cline-any cline-neutral">&nbsp;</span>
447
+ <span class="cline-any cline-neutral">&nbsp;</span>
448
+ <span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
+ <span class="cline-any cline-neutral">&nbsp;</span>
451
+ <span class="cline-any cline-no">&nbsp;</span>
452
+ <span class="cline-any cline-neutral">&nbsp;</span>
453
+ <span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-neutral">&nbsp;</span>
456
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
+ <span class="cline-any cline-no">&nbsp;</span>
458
+ <span class="cline-any cline-no">&nbsp;</span>
459
+ <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-neutral">&nbsp;</span>
461
+ <span class="cline-any cline-neutral">&nbsp;</span>
462
+ <span class="cline-any cline-neutral">&nbsp;</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
464
+ <span class="cline-any cline-no">&nbsp;</span>
465
+ <span class="cline-any cline-neutral">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-no">&nbsp;</span>
469
+ <span class="cline-any cline-no">&nbsp;</span>
470
+ <span class="cline-any cline-no">&nbsp;</span>
471
+ <span class="cline-any cline-neutral">&nbsp;</span>
472
+ <span class="cline-any cline-neutral">&nbsp;</span>
473
+ <span class="cline-any cline-no">&nbsp;</span>
474
+ <span class="cline-any cline-no">&nbsp;</span>
475
+ <span class="cline-any cline-no">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-no">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-no">&nbsp;</span>
489
+ <span class="cline-any cline-neutral">&nbsp;</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-neutral">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-neutral">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-neutral">&nbsp;</span>
497
+ <span class="cline-any cline-neutral">&nbsp;</span>
498
+ <span class="cline-any cline-no">&nbsp;</span>
499
+ <span class="cline-any cline-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-neutral">&nbsp;</span>
501
+ <span class="cline-any cline-neutral">&nbsp;</span>
502
+ <span class="cline-any cline-yes">1x</span>
503
+ <span class="cline-any cline-yes">1x</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-no">&nbsp;</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-no">&nbsp;</span>
513
+ <span class="cline-any cline-no">&nbsp;</span>
514
+ <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-no">&nbsp;</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-neutral">&nbsp;</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-neutral">&nbsp;</span>
524
+ <span class="cline-any cline-neutral">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-neutral">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-neutral">&nbsp;</span>
532
+ <span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-neutral">&nbsp;</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-neutral">&nbsp;</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-neutral">&nbsp;</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-yes">9x</span>
540
+ <span class="cline-any cline-yes">9x</span>
541
+ <span class="cline-any cline-yes">8x</span>
542
+ <span class="cline-any cline-yes">8x</span>
543
+ <span class="cline-any cline-yes">8x</span>
544
+ <span class="cline-any cline-neutral">&nbsp;</span>
545
+ <span class="cline-any cline-yes">8x</span>
546
+ <span class="cline-any cline-neutral">&nbsp;</span>
547
+ <span class="cline-any cline-yes">8x</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-neutral">&nbsp;</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-yes">3x</span>
552
+ <span class="cline-any cline-yes">1x</span>
553
+ <span class="cline-any cline-neutral">&nbsp;</span>
554
+ <span class="cline-any cline-neutral">&nbsp;</span>
555
+ <span class="cline-any cline-yes">2x</span>
556
+ <span class="cline-any cline-yes">1x</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-yes">1x</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-yes">1x</span>
562
+ <span class="cline-any cline-yes">1x</span>
563
+ <span class="cline-any cline-yes">1x</span>
564
+ <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-yes">1x</span>
566
+ <span class="cline-any cline-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-yes">3x</span>
570
+ <span class="cline-any cline-yes">1x</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-yes">2x</span>
574
+ <span class="cline-any cline-yes">1x</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-yes">1x</span>
578
+ <span class="cline-any cline-neutral">&nbsp;</span>
579
+ <span class="cline-any cline-yes">1x</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-yes">1x</span>
582
+ <span class="cline-any cline-yes">1x</span>
583
+ <span class="cline-any cline-yes">1x</span>
584
+ <span class="cline-any cline-yes">1x</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-yes">1x</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-yes">1x</span>
589
+ <span class="cline-any cline-neutral">&nbsp;</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-neutral">&nbsp;</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-neutral">&nbsp;</span>
599
+ <span class="cline-any cline-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-yes">2x</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-yes">2x</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-yes">2x</span>
606
+ <span class="cline-any cline-neutral">&nbsp;</span>
607
+ <span class="cline-any cline-neutral">&nbsp;</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-neutral">&nbsp;</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-neutral">&nbsp;</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-neutral">&nbsp;</span>
619
+ <span class="cline-any cline-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-neutral">&nbsp;</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-yes">2x</span>
624
+ <span class="cline-any cline-yes">28x</span>
625
+ <span class="cline-any cline-neutral">&nbsp;</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span>
627
+ <span class="cline-any cline-yes">2x</span>
628
+ <span class="cline-any cline-neutral">&nbsp;</span>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-neutral">&nbsp;</span>
631
+ <span class="cline-any cline-neutral">&nbsp;</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-neutral">&nbsp;</span>
636
+ <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-neutral">&nbsp;</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-no">&nbsp;</span>
655
+ <span class="cline-any cline-neutral">&nbsp;</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-no">&nbsp;</span>
658
+ <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-no">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-no">&nbsp;</span>
671
+ <span class="cline-any cline-neutral">&nbsp;</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-yes">1x</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-neutral">&nbsp;</span>
685
+ <span class="cline-any cline-no">&nbsp;</span>
686
+ <span class="cline-any cline-no">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-neutral">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-yes">1x</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-yes">1x</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-no">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-no">&nbsp;</span>
710
+ <span class="cline-any cline-no">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-no">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-yes">1x</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-yes">1x</span>
720
+ <span class="cline-any cline-yes">1x</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-yes">1x</span>
724
+ <span class="cline-any cline-yes">1x</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const qs = require('qs');
727
+ &nbsp;
728
+ function isFromOrigin(origin) {
729
+ return function <span class="fstat-no" title="function not covered" >isEventFromOrigin(</span>event) {
730
+ <span class="cstat-no" title="statement not covered" > return Boolean(event.isTrusted &amp;&amp; event.origin.indexOf(origin) === 0);</span>
731
+ };
732
+ }
733
+ &nbsp;
734
+ function <span class="fstat-no" title="function not covered" >openAuthPopup(</span>src) {
735
+ const url = <span class="cstat-no" title="statement not covered" >new URL(src);</span>
736
+ const origin = <span class="cstat-no" title="statement not covered" >`${url.protocol}//${url.host}`;</span>
737
+ &nbsp;
738
+ const width = <span class="cstat-no" title="statement not covered" >480;</span>
739
+ const height = <span class="cstat-no" title="statement not covered" >600;</span>
740
+ const TWO = <span class="cstat-no" title="statement not covered" >2;</span>
741
+ const WINDOW_CLOSE_INTERVAL = <span class="cstat-no" title="statement not covered" >100;</span>
742
+ &nbsp;
743
+ const left = <span class="cstat-no" title="statement not covered" >(window.screen.width / TWO) - (width / TWO);</span>
744
+ const top = <span class="cstat-no" title="statement not covered" >(window.screen.height / TWO) - (height / TWO);</span>
745
+ const windowParams = <span class="cstat-no" title="statement not covered" >[</span>
746
+ 'toolbar=no',
747
+ 'location=no',
748
+ 'directories=no',
749
+ 'status=no',
750
+ 'menubar=no',
751
+ 'scrollbars=no',
752
+ 'resizable=no',
753
+ 'copyhistory=no',
754
+ `width=${width}`,
755
+ `height=${height}`,
756
+ `top=${top}`,
757
+ `left=${left}`,
758
+ ];
759
+ &nbsp;
760
+ // eslint-disable-next-line promise/avoid-new
761
+ <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) =&gt; {</span>
762
+ const win = <span class="cstat-no" title="statement not covered" >window.open(src, 'Authorization', windowParams.join(', '));</span>
763
+ &nbsp;
764
+ <span class="cstat-no" title="statement not covered" > if (!win) {</span>
765
+ // eslint-disable-next-line prefer-promise-reject-errors
766
+ <span class="cstat-no" title="statement not covered" > reject('Failed to open window');</span>
767
+ }
768
+ &nbsp;
769
+ // pings the login window to check if it was closed
770
+ const closeCheck = <span class="cstat-no" title="statement not covered" >setInterval(<span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
771
+ <span class="cstat-no" title="statement not covered" > if (win.closed) {</span>
772
+ <span class="cstat-no" title="statement not covered" > destroy();</span>
773
+ <span class="cstat-no" title="statement not covered" > onClose();</span>
774
+ }
775
+ &nbsp;
776
+ }, WINDOW_CLOSE_INTERVAL);
777
+ &nbsp;
778
+ // triggered if the window was closed
779
+ function <span class="fstat-no" title="function not covered" >onClose(</span>) {
780
+ // eslint-disable-next-line prefer-promise-reject-errors
781
+ <span class="cstat-no" title="statement not covered" > reject('User closed window');</span>
782
+ }
783
+ &nbsp;
784
+ // completes the process, either because the user closes or because the authentication completed
785
+ // cleans intervals and event listeners
786
+ function <span class="fstat-no" title="function not covered" >destroy(</span>) {
787
+ <span class="cstat-no" title="statement not covered" > window.removeEventListener('message', onMessage);</span>
788
+ <span class="cstat-no" title="statement not covered" > clearInterval(closeCheck);</span>
789
+ }
790
+ &nbsp;
791
+ // triggered when a message is received on the current window
792
+ function <span class="fstat-no" title="function not covered" >onMessage(</span>event) {
793
+ <span class="cstat-no" title="statement not covered" > if (!isFromOrigin(origin)(event)) {</span>
794
+ <span class="cstat-no" title="statement not covered" > return null;</span>
795
+ }
796
+ &nbsp;
797
+ // legacy ViiBE iframe messages (oauth.html)
798
+ <span class="cstat-no" title="statement not covered" > if (event.data.token) {</span>
799
+ <span class="cstat-no" title="statement not covered" > destroy();</span>
800
+ <span class="cstat-no" title="statement not covered" > resolve(event.data.token);</span>
801
+ }
802
+ &nbsp;
803
+ <span class="cstat-no" title="statement not covered" > if (event.data.error) {</span>
804
+ <span class="cstat-no" title="statement not covered" > destroy();</span>
805
+ <span class="cstat-no" title="statement not covered" > reject(event.data.error);</span>
806
+ }
807
+ &nbsp;
808
+ // events from auth.viibe.tech
809
+ <span class="cstat-no" title="statement not covered" > if (event.data &amp;&amp; event.data.event &amp;&amp; event.data.payload) {</span>
810
+ <span class="cstat-no" title="statement not covered" > switch (event.data.event) {</span>
811
+ case 'authentication:success':
812
+ <span class="cstat-no" title="statement not covered" > destroy();</span>
813
+ &nbsp;
814
+ <span class="cstat-no" title="statement not covered" > return resolve(event.data);</span>
815
+ case 'authentication:failure':
816
+ <span class="cstat-no" title="statement not covered" > destroy();</span>
817
+ &nbsp;
818
+ <span class="cstat-no" title="statement not covered" > return reject(event.data);</span>
819
+ default:
820
+ &nbsp;
821
+ }
822
+ &nbsp;
823
+ }
824
+ &nbsp;
825
+ <span class="cstat-no" title="statement not covered" > return null;</span>
826
+ }
827
+ &nbsp;
828
+ <span class="cstat-no" title="statement not covered" > window.addEventListener('message', onMessage);</span>
829
+ });
830
+ }
831
+ &nbsp;
832
+ const DEFAULT_AUTH_HOST = 'auth.viibe.pro';
833
+ const IFRAME_NAME_RANGE = 10000;
834
+ &nbsp;
835
+ class ViibeAuth {
836
+ &nbsp;
837
+ <span class="fstat-no" title="function not covered" > co</span>nstructor(host = <span class="branch-0 cbranch-no" title="branch not covered" >DEFAULT_AUTH_HOST)</span> {
838
+ <span class="cstat-no" title="statement not covered" > this.host = host;</span>
839
+ }
840
+ &nbsp;
841
+ <span class="fstat-no" title="function not covered" > lo</span>ginZendesk(subdomain) {
842
+ const { origin } = <span class="cstat-no" title="statement not covered" >document.location;</span>
843
+ const url = <span class="cstat-no" title="statement not covered" >`https://${this.host}/auth/zendesk/login?subdomain=${subdomain}&amp;origin=${origin}`;</span>
844
+ &nbsp;
845
+ <span class="cstat-no" title="statement not covered" > return openAuthPopup(url);</span>
846
+ }
847
+ }
848
+ &nbsp;
849
+ class Viibe {
850
+ &nbsp;
851
+ /**
852
+ * @typedef Handler
853
+ * @type {object}
854
+ * @property {string} eventName The name of the event to handle
855
+ * @property {string} windowName The name of the window / iframe to listen to
856
+ * @property {Function} func The function to trigger when an event is received
857
+ */
858
+ &nbsp;
859
+ /**
860
+ *
861
+ * @param {object} options
862
+ * @param {string} options.host Target ViiBE subdomain (e.g. test.viibe.tech)
863
+ * @param {string} options.source Integration source (e.g. zendesk)
864
+ */
865
+ constructor(options) {
866
+ /**
867
+ * @type {Handler[]}
868
+ */
869
+ this.handlers = [];
870
+ this.host = options.host;
871
+ this.viibeDomain = /^localhost/.test(this.host) ? `http://${this.host}` : `https://${this.host}`;
872
+ this.apiOrigin = /^localhost/.test(this.host) ? `http://${this.host}` : `https://api-${this.host}`;
873
+ this.source = options.source;
874
+ &nbsp;
875
+ this.isViibeEvent = isFromOrigin(this.viibeDomain);
876
+ &nbsp;
877
+ window.addEventListener('message', this.onMessage.bind(this));
878
+ }
879
+ &nbsp;
880
+ createNotificationIframe() {
881
+ if (!this.host) {
882
+ throw new Error('fillHost');
883
+ }
884
+ &nbsp;
885
+ if (!this.source) {
886
+ throw new Error('fillSource');
887
+ }
888
+ &nbsp;
889
+ const iframe = document.createElement('iframe');
890
+ &nbsp;
891
+ iframe.name = `viibe-${Math.floor(Math.random() * IFRAME_NAME_RANGE)}`;
892
+ iframe.style = 'border: 0;width: 0;';
893
+ iframe.src = `${this.viibeDomain}/integration/features/notifications`;
894
+ &nbsp;
895
+ return iframe;
896
+ }
897
+ &nbsp;
898
+ createCallIframe(options = {}) {
899
+ if (!this.host) {
900
+ throw new Error('fillHost');
901
+ }
902
+ &nbsp;
903
+ if (!this.source) {
904
+ throw new Error('fillSource');
905
+ }
906
+ &nbsp;
907
+ const src = this.generateIframeSrc(options);
908
+ &nbsp;
909
+ const iframe = document.createElement('iframe');
910
+ &nbsp;
911
+ iframe.name = `viibe-${Math.floor(Math.random() * IFRAME_NAME_RANGE)}`;
912
+ iframe.style = 'border: 0;width: calc(100% - 1rem);margin: 0.5rem;';
913
+ iframe.src = src;
914
+ iframe.allow = 'geolocation;autoplay;microphone;camera;midi;encrypted-media;clipboard-write;';
915
+ &nbsp;
916
+ this.on(iframe, 'document', <span class="fstat-no" title="function not covered" >ev</span>ent =&gt; <span class="cstat-no" title="statement not covered" >this.onDocument(event))</span>;
917
+ &nbsp;
918
+ return iframe;
919
+ }
920
+ &nbsp;
921
+ generateIframeSrc(params = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
922
+ const {
923
+ components,
924
+ links,
925
+ o2m = false,
926
+ ticket,
927
+ locale,
928
+ standalone,
929
+ suggestions,
930
+ token,
931
+ } = params;
932
+ &nbsp;
933
+ const src = `${this.viibeDomain}/integration/features/ticket`;
934
+ &nbsp;
935
+ const urlParams = {
936
+ version: '2.0.0',
937
+ origin: document.location.origin,
938
+ resize: 'true',
939
+ source: this.source,
940
+ title: ticket?.title,
941
+ thirdPartyId: ticket?.integration?.id,
942
+ custom: ticket?.integration?.customData,
943
+ links: links,
944
+ suggestions: suggestions,
945
+ token: token,
946
+ locale: locale,
947
+ components: components,
948
+ standalone: [true, false].includes(standalone) ? standalone : null,
949
+ o2m: [true, false].includes(o2m) ? o2m : <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
950
+ };
951
+ &nbsp;
952
+ // Clean empty values
953
+ for (let key in urlParams) {
954
+ if ([null, undefined, ''].includes(urlParams[key])) delete urlParams[key]
955
+ }
956
+ &nbsp;
957
+ return `${src}?${qs.stringify(urlParams)}`;
958
+ }
959
+ &nbsp;
960
+ /**
961
+ * Dispatches an event ie calls handlers corresponding to that event.
962
+ * Handlers with not windowName will be triggered regardless of the origin windowName
963
+ * Otherwise, the event will be triggered only if the handler windowName and the event windowName correspond
964
+ *
965
+ * @param {string} eventName
966
+ * @param {any} payload
967
+ * @param {any} event
968
+ * @param {string} windowName
969
+ * @returns
970
+ */
971
+ <span class="fstat-no" title="function not covered" > di</span>spatch(eventName, payload, event, windowName) {
972
+ <span class="cstat-no" title="statement not covered" > return this.handlers</span>
973
+ .filter(<span class="fstat-no" title="function not covered" >ha</span>ndler =&gt; <span class="cstat-no" title="statement not covered" >handler.eventName === eventName &amp;&amp; (!handler.windowName || (handler.windowName === windowName)))</span>
974
+ .map(<span class="fstat-no" title="function not covered" >ha</span>ndler =&gt; <span class="cstat-no" title="statement not covered" >handler.func(payload, event))</span>;
975
+ }
976
+ &nbsp;
977
+ /**
978
+ * Handles postMessages / events received on the current window
979
+ * @param {any} event
980
+ * @returns
981
+ */
982
+ <span class="fstat-no" title="function not covered" > on</span>Message(event) {
983
+ <span class="cstat-no" title="statement not covered" > if (!this.isViibeEvent(event)) {</span>
984
+ <span class="cstat-no" title="statement not covered" > return null;</span>
985
+ }
986
+ &nbsp;
987
+ <span class="cstat-no" title="statement not covered" > if (event.data &amp;&amp; event.data.event) {</span>
988
+ <span class="cstat-no" title="statement not covered" > return this.dispatch(event.data.event, event.data.payload, event, event.data.windowName);</span>
989
+ }
990
+ &nbsp;
991
+ // FIXME: legacy authentication messages
992
+ <span class="cstat-no" title="statement not covered" > if (event.data &amp;&amp; event.data.token) {</span>
993
+ <span class="cstat-no" title="statement not covered" > return this.dispatch('authentication:token', event.data.token, event);</span>
994
+ }
995
+ &nbsp;
996
+ <span class="cstat-no" title="statement not covered" > if (event.data &amp;&amp; event.data.error) {</span>
997
+ <span class="cstat-no" title="statement not covered" > return this.dispatch('authentication:error', event.data.error, event);</span>
998
+ }
999
+ &nbsp;
1000
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1001
+ }
1002
+ &nbsp;
1003
+ /**
1004
+ * Registers an event handler.
1005
+ * Can be either called with 2 arguments (eventName and handler) to catch events from all iframes
1006
+ * or with 3 arguments (iframe, eventName, handler) to catch events from only that iframe
1007
+ * @param {HTMLIFrameElement} [iframe]
1008
+ * @param {string} eventName
1009
+ * @param {Function} handler
1010
+ */
1011
+ on(iframe, eventName, func) {
1012
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof iframe === 'string' &amp;&amp;
1013
+ <span class="branch-1 cbranch-no" title="branch not covered" > typeof eventName === 'function' </span>&amp;&amp;
1014
+ <span class="branch-2 cbranch-no" title="branch not covered" > typeof func === 'undefined')</span> {
1015
+ <span class="cstat-no" title="statement not covered" > func = eventName;</span>
1016
+ <span class="cstat-no" title="statement not covered" > eventName = iframe;</span>
1017
+ <span class="cstat-no" title="statement not covered" > iframe = null;</span>
1018
+ }
1019
+ &nbsp;
1020
+ const handler = {
1021
+ eventName,
1022
+ func,
1023
+ windowName: iframe ? iframe.name : <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
1024
+ };
1025
+ &nbsp;
1026
+ this.handlers.push(handler);
1027
+ }
1028
+ &nbsp;
1029
+ <span class="fstat-no" title="function not covered" > on</span>Document(document) {
1030
+ <span class="cstat-no" title="statement not covered" > window.open(document.signed_url, '_blank');</span>
1031
+ }
1032
+ &nbsp;
1033
+ /**
1034
+ * Initiates an oauth login in a popup using the passed provider
1035
+ * @param {string} provider A strategy name from the Viibe API (see /strategies API)
1036
+ * @returns
1037
+ */
1038
+ <span class="fstat-no" title="function not covered" > au</span>thenticate(provider) {
1039
+ const { protocol, host } = <span class="cstat-no" title="statement not covered" >document.location;</span>
1040
+ const src = <span class="cstat-no" title="statement not covered" >`${protocol}//api-${host}/auth/login/${provider}?origin=${origin}`;</span>
1041
+ &nbsp;
1042
+ <span class="cstat-no" title="statement not covered" > return openAuthPopup(src);</span>
1043
+ }
1044
+ &nbsp;
1045
+ }
1046
+ &nbsp;
1047
+ Viibe.Auth = ViibeAuth;
1048
+ &nbsp;
1049
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof window !== 'undefined') {
1050
+ window.Viibe = Viibe;
1051
+ }
1052
+ &nbsp;
1053
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof module !== 'undefined') {
1054
+ module.exports = Viibe;
1055
+ }
1056
+ &nbsp;</pre></td></tr></table></pre>
67
1057
 
68
1058
  <div class='push'></div><!-- for sticky footer -->
69
1059
  </div><!-- /wrapper -->
70
1060
  <div class='footer quiet pad2 space-top1 center small'>
71
1061
  Code coverage generated by
72
1062
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
73
- at Thu Oct 03 2024 14:20:43 GMT+0200 (Central European Summer Time)
1063
+ at Tue Apr 01 2025 14:10:24 GMT+0200 (Central European Summer Time)
74
1064
  </div>
75
1065
  <script src="prettify.js"></script>
76
1066
  <script>