bsv-bap 0.0.1
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.
- package/.babelrc +20 -0
- package/.eslintrc +46 -0
- package/LICENSE +25 -0
- package/README.md +819 -0
- package/babel.config.js +6 -0
- package/bun.lockb +0 -0
- package/coverage/clover.xml +6 -0
- package/coverage/coverage-final.json +1 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +101 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/src/constants.ts.html +113 -0
- package/coverage/lcov-report/src/id.ts.html +2207 -0
- package/coverage/lcov-report/src/index.html +156 -0
- package/coverage/lcov-report/src/index.ts.html +1877 -0
- package/coverage/lcov-report/src/utils.ts.html +404 -0
- package/coverage/lcov-report/tests/data/index.html +111 -0
- package/coverage/lcov-report/tests/data/keys.js.html +86 -0
- package/coverage/lcov.info +0 -0
- package/dist/jest.config.d.ts +8 -0
- package/dist/src/constants.d.ts +8 -0
- package/dist/src/id.d.ts +295 -0
- package/dist/src/index.d.ts +238 -0
- package/dist/src/interface.d.ts +23 -0
- package/dist/src/poa.d.ts +6 -0
- package/dist/src/utils.d.ts +54 -0
- package/dist/typescript-npm-package.cjs.d.ts +554 -0
- package/dist/typescript-npm-package.cjs.js +1320 -0
- package/dist/typescript-npm-package.cjs.js.map +1 -0
- package/dist/typescript-npm-package.esm.d.ts +554 -0
- package/dist/typescript-npm-package.esm.js +1312 -0
- package/dist/typescript-npm-package.esm.js.map +1 -0
- package/dist/typescript-npm-package.umd.d.ts +554 -0
- package/dist/typescript-npm-package.umd.js +110193 -0
- package/dist/typescript-npm-package.umd.js.map +1 -0
- package/jest.config.ts +196 -0
- package/jsdoc.json +16 -0
- package/package.json +80 -0
- package/rollup.config.js +64 -0
- package/setup-jest.js +1 -0
- package/src/README.md +80 -0
- package/src/attributes.json +119 -0
- package/src/constants.ts +11 -0
- package/src/id.ts +783 -0
- package/src/index.ts +631 -0
- package/src/interface.ts +26 -0
- package/src/poa.ts +9 -0
- package/src/utils.ts +111 -0
- package/tests/data/ids.json +30 -0
- package/tests/data/keys.js +2 -0
- package/tests/data/old-ids.json +25 -0
- package/tests/data/test-vectors.json +122 -0
- package/tests/id.test.js +286 -0
- package/tests/index.test.js +335 -0
- package/tests/regression.test.js +28 -0
- package/tests/utils.test.js +27 -0
- package/tsconfig.json +17 -0
@@ -0,0 +1,1877 @@
|
|
1
|
+
|
2
|
+
<!doctype html>
|
3
|
+
<html lang="en">
|
4
|
+
|
5
|
+
<head>
|
6
|
+
<title>Code coverage report for src/index.ts</title>
|
7
|
+
<meta charset="utf-8" />
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
12
|
+
<style type='text/css'>
|
13
|
+
.coverage-summary .sorter {
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
15
|
+
}
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<div class='wrapper'>
|
21
|
+
<div class='pad1'>
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">src</a> index.ts</h1>
|
23
|
+
<div class='clearfix'>
|
24
|
+
|
25
|
+
<div class='fl pad1y space-right2'>
|
26
|
+
<span class="strong">21.53% </span>
|
27
|
+
<span class="quiet">Statements</span>
|
28
|
+
<span class='fraction'>31/144</span>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
|
32
|
+
<div class='fl pad1y space-right2'>
|
33
|
+
<span class="strong">37.31% </span>
|
34
|
+
<span class="quiet">Branches</span>
|
35
|
+
<span class='fraction'>25/67</span>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
|
39
|
+
<div class='fl pad1y space-right2'>
|
40
|
+
<span class="strong">26.47% </span>
|
41
|
+
<span class="quiet">Functions</span>
|
42
|
+
<span class='fraction'>9/34</span>
|
43
|
+
</div>
|
44
|
+
|
45
|
+
|
46
|
+
<div class='fl pad1y space-right2'>
|
47
|
+
<span class="strong">21.68% </span>
|
48
|
+
<span class="quiet">Lines</span>
|
49
|
+
<span class='fraction'>31/143</span>
|
50
|
+
</div>
|
51
|
+
|
52
|
+
|
53
|
+
</div>
|
54
|
+
<p class="quiet">
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
56
|
+
</p>
|
57
|
+
</div>
|
58
|
+
<div class='status-line low'></div>
|
59
|
+
<pre><table class="coverage">
|
60
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
61
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
62
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
63
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
64
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
65
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
66
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
67
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
68
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
69
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
70
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
71
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
72
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
73
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
74
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
75
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
76
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
77
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
78
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
79
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
80
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
81
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
82
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
83
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
84
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
85
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
86
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
87
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
88
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
89
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
90
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
91
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
92
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
93
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
94
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
95
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
96
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
97
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
98
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
99
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
100
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
101
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
102
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
103
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
104
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
105
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
106
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
107
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
108
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
109
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
110
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
111
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
112
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
113
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
114
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
115
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
116
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
117
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
118
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
119
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
120
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
121
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
122
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
123
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
124
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
125
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
126
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
127
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
128
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
129
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
130
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
131
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
132
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
133
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
134
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
135
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
136
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
137
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
138
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
139
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
140
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
141
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
142
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
143
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
144
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
145
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
146
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
147
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
148
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
149
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
150
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
151
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
152
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
153
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
154
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
155
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
156
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
157
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
158
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
159
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
160
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
161
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
162
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
163
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
164
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
165
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
166
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
167
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
168
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
169
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
170
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
171
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
172
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
173
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
174
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
175
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
176
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
177
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
178
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
179
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
180
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
181
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
182
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
183
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
184
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
185
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
186
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
187
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
188
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
189
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
190
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
191
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
192
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
193
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
194
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
195
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
196
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
197
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
198
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
199
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
200
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
201
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
202
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
203
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
204
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
205
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
206
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
207
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
208
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
209
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
210
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
211
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
212
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
213
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
214
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
215
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
216
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
217
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
218
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
219
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
220
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
221
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
222
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
223
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
224
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
225
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
226
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
227
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
228
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
229
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
230
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
231
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
232
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
233
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
234
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
235
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
236
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
237
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
238
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
239
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
240
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
241
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
242
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
243
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
244
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
245
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
246
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
247
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
248
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
249
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
250
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
251
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
252
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
253
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
254
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
255
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
256
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
257
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
258
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
259
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
260
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
261
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
262
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
263
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
264
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
265
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
266
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
267
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
268
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
269
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
270
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
271
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
272
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
273
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
274
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
275
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
276
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
277
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
278
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
279
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
280
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
281
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
282
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
283
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
284
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
285
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
286
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
287
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
288
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
289
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
290
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
291
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
292
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
293
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
294
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
295
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
296
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
297
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
298
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
299
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
300
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
301
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
302
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
303
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
304
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
305
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
306
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
307
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
308
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
309
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
310
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
311
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
312
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
313
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
314
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
315
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
316
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
317
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
318
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
319
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
320
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
321
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
322
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
323
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
324
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
325
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
326
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
327
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
328
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
329
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
330
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
331
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
332
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
333
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
334
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
335
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
336
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
337
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
338
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
339
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
340
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
341
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
342
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
343
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
344
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
345
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
346
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
347
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
348
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
349
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
350
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
351
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
352
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
353
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
354
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
355
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
356
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
357
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
358
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
359
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
360
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
361
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
362
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
363
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
364
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
365
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
366
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
367
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
368
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
369
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
370
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
371
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
372
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
373
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
374
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
375
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
376
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
377
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
378
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
379
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
380
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
381
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
382
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
383
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
384
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
385
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
386
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
387
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
388
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
389
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
390
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
391
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
392
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
393
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
394
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
395
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
396
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
397
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
398
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
399
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
400
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
401
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
402
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
403
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
404
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
405
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
406
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
407
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
408
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
409
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
410
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
411
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
412
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
413
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
414
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
415
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
416
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
417
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
418
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
419
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
420
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
421
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
422
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
423
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
424
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
425
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
426
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
427
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
428
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
429
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
430
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
431
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
432
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
433
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
434
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
435
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
436
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
437
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
438
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
439
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
440
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
441
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
442
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
443
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
444
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
445
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
446
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
447
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
448
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
449
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
450
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
451
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
452
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
453
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
454
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
455
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
456
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
457
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
458
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
459
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
460
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
461
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
462
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
463
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
464
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
465
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
466
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
467
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
468
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
469
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
470
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
471
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
472
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
473
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
474
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
475
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
476
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
477
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
478
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
479
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
480
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
481
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
482
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
483
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
484
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
485
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
486
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
487
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
488
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
489
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
490
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
491
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
492
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
493
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
494
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
495
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
496
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
497
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
498
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
499
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
500
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
501
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
502
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
503
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
504
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
505
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
506
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
507
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
508
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
509
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
510
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
511
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
512
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
513
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
514
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
515
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
516
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
517
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
518
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
519
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
520
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
521
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
522
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
523
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
524
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
525
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
526
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
527
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
528
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
529
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
530
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
531
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
532
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
533
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
534
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
535
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
536
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
537
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
538
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
539
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
540
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
541
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
542
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
543
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
544
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
545
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
546
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
547
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
548
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
549
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
550
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
551
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
552
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
553
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
554
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
555
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
556
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
557
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
558
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
559
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
560
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
561
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
562
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
563
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
564
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
565
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
566
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
567
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
568
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
569
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
570
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
571
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
572
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
573
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
574
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
575
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
576
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
577
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
578
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
579
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
580
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
581
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
582
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
583
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
584
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
585
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
586
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
587
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
588
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
589
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
590
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
591
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
592
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
593
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
594
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
595
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
596
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
597
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
598
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
599
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
600
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
601
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
602
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
603
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
604
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
605
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
606
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
607
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
608
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
609
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
610
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
611
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
612
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
613
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
614
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
615
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
616
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
617
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
618
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
619
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
620
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
621
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
622
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
623
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
624
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
625
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
626
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
627
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
628
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
629
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
630
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
631
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
632
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
633
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
634
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
635
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
636
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
637
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
638
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
639
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
640
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
641
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
642
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
643
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
644
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
645
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
646
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
647
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
648
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
649
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
650
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
651
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
652
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
653
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
654
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
655
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
656
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
657
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
658
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
659
|
+
<a name='L600'></a><a href='#L600'>600</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
660
|
+
<span class="cline-any cline-neutral"> </span>
|
661
|
+
<span class="cline-any cline-neutral"> </span>
|
662
|
+
<span class="cline-any cline-neutral"> </span>
|
663
|
+
<span class="cline-any cline-neutral"> </span>
|
664
|
+
<span class="cline-any cline-neutral"> </span>
|
665
|
+
<span class="cline-any cline-neutral"> </span>
|
666
|
+
<span class="cline-any cline-neutral"> </span>
|
667
|
+
<span class="cline-any cline-neutral"> </span>
|
668
|
+
<span class="cline-any cline-neutral"> </span>
|
669
|
+
<span class="cline-any cline-neutral"> </span>
|
670
|
+
<span class="cline-any cline-neutral"> </span>
|
671
|
+
<span class="cline-any cline-neutral"> </span>
|
672
|
+
<span class="cline-any cline-neutral"> </span>
|
673
|
+
<span class="cline-any cline-neutral"> </span>
|
674
|
+
<span class="cline-any cline-neutral"> </span>
|
675
|
+
<span class="cline-any cline-neutral"> </span>
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
677
|
+
<span class="cline-any cline-neutral"> </span>
|
678
|
+
<span class="cline-any cline-neutral"> </span>
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
680
|
+
<span class="cline-any cline-neutral"> </span>
|
681
|
+
<span class="cline-any cline-neutral"> </span>
|
682
|
+
<span class="cline-any cline-neutral"> </span>
|
683
|
+
<span class="cline-any cline-neutral"> </span>
|
684
|
+
<span class="cline-any cline-yes">3x</span>
|
685
|
+
<span class="cline-any cline-neutral"> </span>
|
686
|
+
<span class="cline-any cline-yes">38x</span>
|
687
|
+
<span class="cline-any cline-yes">38x</span>
|
688
|
+
<span class="cline-any cline-yes">38x</span>
|
689
|
+
<span class="cline-any cline-yes">38x</span>
|
690
|
+
<span class="cline-any cline-neutral"> </span>
|
691
|
+
<span class="cline-any cline-neutral"> </span>
|
692
|
+
<span class="cline-any cline-yes">38x</span>
|
693
|
+
<span class="cline-any cline-yes">1x</span>
|
694
|
+
<span class="cline-any cline-neutral"> </span>
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
696
|
+
<span class="cline-any cline-yes">37x</span>
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
698
|
+
<span class="cline-any cline-neutral"> </span>
|
699
|
+
<span class="cline-any cline-yes">37x</span>
|
700
|
+
<span class="cline-any cline-no"> </span>
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
702
|
+
<span class="cline-any cline-neutral"> </span>
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
705
|
+
<span class="cline-any cline-no"> </span>
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
708
|
+
<span class="cline-any cline-neutral"> </span>
|
709
|
+
<span class="cline-any cline-neutral"> </span>
|
710
|
+
<span class="cline-any cline-neutral"> </span>
|
711
|
+
<span class="cline-any cline-neutral"> </span>
|
712
|
+
<span class="cline-any cline-neutral"> </span>
|
713
|
+
<span class="cline-any cline-neutral"> </span>
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
715
|
+
<span class="cline-any cline-yes">2x</span>
|
716
|
+
<span class="cline-any cline-yes">1x</span>
|
717
|
+
<span class="cline-any cline-neutral"> </span>
|
718
|
+
<span class="cline-any cline-neutral"> </span>
|
719
|
+
<span class="cline-any cline-yes">1x</span>
|
720
|
+
<span class="cline-any cline-neutral"> </span>
|
721
|
+
<span class="cline-any cline-neutral"> </span>
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
723
|
+
<span class="cline-any cline-neutral"> </span>
|
724
|
+
<span class="cline-any cline-neutral"> </span>
|
725
|
+
<span class="cline-any cline-neutral"> </span>
|
726
|
+
<span class="cline-any cline-neutral"> </span>
|
727
|
+
<span class="cline-any cline-neutral"> </span>
|
728
|
+
<span class="cline-any cline-neutral"> </span>
|
729
|
+
<span class="cline-any cline-yes">4x</span>
|
730
|
+
<span class="cline-any cline-yes">1x</span>
|
731
|
+
<span class="cline-any cline-neutral"> </span>
|
732
|
+
<span class="cline-any cline-neutral"> </span>
|
733
|
+
<span class="cline-any cline-yes">3x</span>
|
734
|
+
<span class="cline-any cline-neutral"> </span>
|
735
|
+
<span class="cline-any cline-neutral"> </span>
|
736
|
+
<span class="cline-any cline-neutral"> </span>
|
737
|
+
<span class="cline-any cline-no"> </span>
|
738
|
+
<span class="cline-any cline-no"> </span>
|
739
|
+
<span class="cline-any cline-neutral"> </span>
|
740
|
+
<span class="cline-any cline-no"> </span>
|
741
|
+
<span class="cline-any cline-neutral"> </span>
|
742
|
+
<span class="cline-any cline-neutral"> </span>
|
743
|
+
<span class="cline-any cline-neutral"> </span>
|
744
|
+
<span class="cline-any cline-neutral"> </span>
|
745
|
+
<span class="cline-any cline-no"> </span>
|
746
|
+
<span class="cline-any cline-neutral"> </span>
|
747
|
+
<span class="cline-any cline-neutral"> </span>
|
748
|
+
<span class="cline-any cline-neutral"> </span>
|
749
|
+
<span class="cline-any cline-no"> </span>
|
750
|
+
<span class="cline-any cline-no"> </span>
|
751
|
+
<span class="cline-any cline-neutral"> </span>
|
752
|
+
<span class="cline-any cline-no"> </span>
|
753
|
+
<span class="cline-any cline-neutral"> </span>
|
754
|
+
<span class="cline-any cline-neutral"> </span>
|
755
|
+
<span class="cline-any cline-neutral"> </span>
|
756
|
+
<span class="cline-any cline-neutral"> </span>
|
757
|
+
<span class="cline-any cline-no"> </span>
|
758
|
+
<span class="cline-any cline-neutral"> </span>
|
759
|
+
<span class="cline-any cline-neutral"> </span>
|
760
|
+
<span class="cline-any cline-neutral"> </span>
|
761
|
+
<span class="cline-any cline-neutral"> </span>
|
762
|
+
<span class="cline-any cline-neutral"> </span>
|
763
|
+
<span class="cline-any cline-neutral"> </span>
|
764
|
+
<span class="cline-any cline-neutral"> </span>
|
765
|
+
<span class="cline-any cline-neutral"> </span>
|
766
|
+
<span class="cline-any cline-neutral"> </span>
|
767
|
+
<span class="cline-any cline-no"> </span>
|
768
|
+
<span class="cline-any cline-no"> </span>
|
769
|
+
<span class="cline-any cline-no"> </span>
|
770
|
+
<span class="cline-any cline-no"> </span>
|
771
|
+
<span class="cline-any cline-neutral"> </span>
|
772
|
+
<span class="cline-any cline-neutral"> </span>
|
773
|
+
<span class="cline-any cline-no"> </span>
|
774
|
+
<span class="cline-any cline-neutral"> </span>
|
775
|
+
<span class="cline-any cline-neutral"> </span>
|
776
|
+
<span class="cline-any cline-neutral"> </span>
|
777
|
+
<span class="cline-any cline-neutral"> </span>
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
779
|
+
<span class="cline-any cline-neutral"> </span>
|
780
|
+
<span class="cline-any cline-neutral"> </span>
|
781
|
+
<span class="cline-any cline-neutral"> </span>
|
782
|
+
<span class="cline-any cline-yes">1x</span>
|
783
|
+
<span class="cline-any cline-neutral"> </span>
|
784
|
+
<span class="cline-any cline-neutral"> </span>
|
785
|
+
<span class="cline-any cline-neutral"> </span>
|
786
|
+
<span class="cline-any cline-neutral"> </span>
|
787
|
+
<span class="cline-any cline-neutral"> </span>
|
788
|
+
<span class="cline-any cline-neutral"> </span>
|
789
|
+
<span class="cline-any cline-neutral"> </span>
|
790
|
+
<span class="cline-any cline-neutral"> </span>
|
791
|
+
<span class="cline-any cline-neutral"> </span>
|
792
|
+
<span class="cline-any cline-neutral"> </span>
|
793
|
+
<span class="cline-any cline-neutral"> </span>
|
794
|
+
<span class="cline-any cline-neutral"> </span>
|
795
|
+
<span class="cline-any cline-neutral"> </span>
|
796
|
+
<span class="cline-any cline-neutral"> </span>
|
797
|
+
<span class="cline-any cline-neutral"> </span>
|
798
|
+
<span class="cline-any cline-yes">21x</span>
|
799
|
+
<span class="cline-any cline-neutral"> </span>
|
800
|
+
<span class="cline-any cline-yes">21x</span>
|
801
|
+
<span class="cline-any cline-neutral"> </span>
|
802
|
+
<span class="cline-any cline-neutral"> </span>
|
803
|
+
<span class="cline-any cline-yes">21x</span>
|
804
|
+
<span class="cline-any cline-no"> </span>
|
805
|
+
<span class="cline-any cline-no"> </span>
|
806
|
+
<span class="cline-any cline-neutral"> </span>
|
807
|
+
<span class="cline-any cline-no"> </span>
|
808
|
+
<span class="cline-any cline-no"> </span>
|
809
|
+
<span class="cline-any cline-neutral"> </span>
|
810
|
+
<span class="cline-any cline-no"> </span>
|
811
|
+
<span class="cline-any cline-no"> </span>
|
812
|
+
<span class="cline-any cline-no"> </span>
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
814
|
+
<span class="cline-any cline-no"> </span>
|
815
|
+
<span class="cline-any cline-neutral"> </span>
|
816
|
+
<span class="cline-any cline-neutral"> </span>
|
817
|
+
<span class="cline-any cline-neutral"> </span>
|
818
|
+
<span class="cline-any cline-neutral"> </span>
|
819
|
+
<span class="cline-any cline-neutral"> </span>
|
820
|
+
<span class="cline-any cline-neutral"> </span>
|
821
|
+
<span class="cline-any cline-neutral"> </span>
|
822
|
+
<span class="cline-any cline-neutral"> </span>
|
823
|
+
<span class="cline-any cline-neutral"> </span>
|
824
|
+
<span class="cline-any cline-no"> </span>
|
825
|
+
<span class="cline-any cline-neutral"> </span>
|
826
|
+
<span class="cline-any cline-neutral"> </span>
|
827
|
+
<span class="cline-any cline-neutral"> </span>
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
829
|
+
<span class="cline-any cline-neutral"> </span>
|
830
|
+
<span class="cline-any cline-neutral"> </span>
|
831
|
+
<span class="cline-any cline-neutral"> </span>
|
832
|
+
<span class="cline-any cline-neutral"> </span>
|
833
|
+
<span class="cline-any cline-neutral"> </span>
|
834
|
+
<span class="cline-any cline-yes">21x</span>
|
835
|
+
<span class="cline-any cline-no"> </span>
|
836
|
+
<span class="cline-any cline-neutral"> </span>
|
837
|
+
<span class="cline-any cline-neutral"> </span>
|
838
|
+
<span class="cline-any cline-yes">21x</span>
|
839
|
+
<span class="cline-any cline-neutral"> </span>
|
840
|
+
<span class="cline-any cline-neutral"> </span>
|
841
|
+
<span class="cline-any cline-neutral"> </span>
|
842
|
+
<span class="cline-any cline-neutral"> </span>
|
843
|
+
<span class="cline-any cline-neutral"> </span>
|
844
|
+
<span class="cline-any cline-neutral"> </span>
|
845
|
+
<span class="cline-any cline-neutral"> </span>
|
846
|
+
<span class="cline-any cline-neutral"> </span>
|
847
|
+
<span class="cline-any cline-neutral"> </span>
|
848
|
+
<span class="cline-any cline-no"> </span>
|
849
|
+
<span class="cline-any cline-neutral"> </span>
|
850
|
+
<span class="cline-any cline-neutral"> </span>
|
851
|
+
<span class="cline-any cline-neutral"> </span>
|
852
|
+
<span class="cline-any cline-neutral"> </span>
|
853
|
+
<span class="cline-any cline-neutral"> </span>
|
854
|
+
<span class="cline-any cline-neutral"> </span>
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
856
|
+
<span class="cline-any cline-neutral"> </span>
|
857
|
+
<span class="cline-any cline-neutral"> </span>
|
858
|
+
<span class="cline-any cline-neutral"> </span>
|
859
|
+
<span class="cline-any cline-neutral"> </span>
|
860
|
+
<span class="cline-any cline-neutral"> </span>
|
861
|
+
<span class="cline-any cline-neutral"> </span>
|
862
|
+
<span class="cline-any cline-neutral"> </span>
|
863
|
+
<span class="cline-any cline-no"> </span>
|
864
|
+
<span class="cline-any cline-no"> </span>
|
865
|
+
<span class="cline-any cline-neutral"> </span>
|
866
|
+
<span class="cline-any cline-neutral"> </span>
|
867
|
+
<span class="cline-any cline-neutral"> </span>
|
868
|
+
<span class="cline-any cline-neutral"> </span>
|
869
|
+
<span class="cline-any cline-neutral"> </span>
|
870
|
+
<span class="cline-any cline-neutral"> </span>
|
871
|
+
<span class="cline-any cline-neutral"> </span>
|
872
|
+
<span class="cline-any cline-neutral"> </span>
|
873
|
+
<span class="cline-any cline-neutral"> </span>
|
874
|
+
<span class="cline-any cline-neutral"> </span>
|
875
|
+
<span class="cline-any cline-neutral"> </span>
|
876
|
+
<span class="cline-any cline-yes">8x</span>
|
877
|
+
<span class="cline-any cline-neutral"> </span>
|
878
|
+
<span class="cline-any cline-no"> </span>
|
879
|
+
<span class="cline-any cline-no"> </span>
|
880
|
+
<span class="cline-any cline-no"> </span>
|
881
|
+
<span class="cline-any cline-no"> </span>
|
882
|
+
<span class="cline-any cline-neutral"> </span>
|
883
|
+
<span class="cline-any cline-neutral"> </span>
|
884
|
+
<span class="cline-any cline-no"> </span>
|
885
|
+
<span class="cline-any cline-neutral"> </span>
|
886
|
+
<span class="cline-any cline-neutral"> </span>
|
887
|
+
<span class="cline-any cline-yes">8x</span>
|
888
|
+
<span class="cline-any cline-yes">8x</span>
|
889
|
+
<span class="cline-any cline-neutral"> </span>
|
890
|
+
<span class="cline-any cline-yes">1x</span>
|
891
|
+
<span class="cline-any cline-yes">1x</span>
|
892
|
+
<span class="cline-any cline-neutral"> </span>
|
893
|
+
<span class="cline-any cline-neutral"> </span>
|
894
|
+
<span class="cline-any cline-neutral"> </span>
|
895
|
+
<span class="cline-any cline-neutral"> </span>
|
896
|
+
<span class="cline-any cline-neutral"> </span>
|
897
|
+
<span class="cline-any cline-yes">8x</span>
|
898
|
+
<span class="cline-any cline-yes">8x</span>
|
899
|
+
<span class="cline-any cline-no"> </span>
|
900
|
+
<span class="cline-any cline-neutral"> </span>
|
901
|
+
<span class="cline-any cline-yes">8x</span>
|
902
|
+
<span class="cline-any cline-no"> </span>
|
903
|
+
<span class="cline-any cline-no"> </span>
|
904
|
+
<span class="cline-any cline-no"> </span>
|
905
|
+
<span class="cline-any cline-neutral"> </span>
|
906
|
+
<span class="cline-any cline-no"> </span>
|
907
|
+
<span class="cline-any cline-neutral"> </span>
|
908
|
+
<span class="cline-any cline-no"> </span>
|
909
|
+
<span class="cline-any cline-neutral"> </span>
|
910
|
+
<span class="cline-any cline-no"> </span>
|
911
|
+
<span class="cline-any cline-neutral"> </span>
|
912
|
+
<span class="cline-any cline-no"> </span>
|
913
|
+
<span class="cline-any cline-neutral"> </span>
|
914
|
+
<span class="cline-any cline-neutral"> </span>
|
915
|
+
<span class="cline-any cline-neutral"> </span>
|
916
|
+
<span class="cline-any cline-no"> </span>
|
917
|
+
<span class="cline-any cline-neutral"> </span>
|
918
|
+
<span class="cline-any cline-neutral"> </span>
|
919
|
+
<span class="cline-any cline-neutral"> </span>
|
920
|
+
<span class="cline-any cline-neutral"> </span>
|
921
|
+
<span class="cline-any cline-neutral"> </span>
|
922
|
+
<span class="cline-any cline-neutral"> </span>
|
923
|
+
<span class="cline-any cline-neutral"> </span>
|
924
|
+
<span class="cline-any cline-neutral"> </span>
|
925
|
+
<span class="cline-any cline-neutral"> </span>
|
926
|
+
<span class="cline-any cline-neutral"> </span>
|
927
|
+
<span class="cline-any cline-neutral"> </span>
|
928
|
+
<span class="cline-any cline-no"> </span>
|
929
|
+
<span class="cline-any cline-neutral"> </span>
|
930
|
+
<span class="cline-any cline-neutral"> </span>
|
931
|
+
<span class="cline-any cline-neutral"> </span>
|
932
|
+
<span class="cline-any cline-neutral"> </span>
|
933
|
+
<span class="cline-any cline-no"> </span>
|
934
|
+
<span class="cline-any cline-neutral"> </span>
|
935
|
+
<span class="cline-any cline-no"> </span>
|
936
|
+
<span class="cline-any cline-neutral"> </span>
|
937
|
+
<span class="cline-any cline-neutral"> </span>
|
938
|
+
<span class="cline-any cline-no"> </span>
|
939
|
+
<span class="cline-any cline-no"> </span>
|
940
|
+
<span class="cline-any cline-no"> </span>
|
941
|
+
<span class="cline-any cline-no"> </span>
|
942
|
+
<span class="cline-any cline-no"> </span>
|
943
|
+
<span class="cline-any cline-neutral"> </span>
|
944
|
+
<span class="cline-any cline-neutral"> </span>
|
945
|
+
<span class="cline-any cline-no"> </span>
|
946
|
+
<span class="cline-any cline-neutral"> </span>
|
947
|
+
<span class="cline-any cline-neutral"> </span>
|
948
|
+
<span class="cline-any cline-neutral"> </span>
|
949
|
+
<span class="cline-any cline-neutral"> </span>
|
950
|
+
<span class="cline-any cline-neutral"> </span>
|
951
|
+
<span class="cline-any cline-neutral"> </span>
|
952
|
+
<span class="cline-any cline-neutral"> </span>
|
953
|
+
<span class="cline-any cline-neutral"> </span>
|
954
|
+
<span class="cline-any cline-neutral"> </span>
|
955
|
+
<span class="cline-any cline-no"> </span>
|
956
|
+
<span class="cline-any cline-no"> </span>
|
957
|
+
<span class="cline-any cline-no"> </span>
|
958
|
+
<span class="cline-any cline-no"> </span>
|
959
|
+
<span class="cline-any cline-neutral"> </span>
|
960
|
+
<span class="cline-any cline-neutral"> </span>
|
961
|
+
<span class="cline-any cline-neutral"> </span>
|
962
|
+
<span class="cline-any cline-neutral"> </span>
|
963
|
+
<span class="cline-any cline-neutral"> </span>
|
964
|
+
<span class="cline-any cline-neutral"> </span>
|
965
|
+
<span class="cline-any cline-neutral"> </span>
|
966
|
+
<span class="cline-any cline-neutral"> </span>
|
967
|
+
<span class="cline-any cline-neutral"> </span>
|
968
|
+
<span class="cline-any cline-no"> </span>
|
969
|
+
<span class="cline-any cline-no"> </span>
|
970
|
+
<span class="cline-any cline-no"> </span>
|
971
|
+
<span class="cline-any cline-no"> </span>
|
972
|
+
<span class="cline-any cline-neutral"> </span>
|
973
|
+
<span class="cline-any cline-neutral"> </span>
|
974
|
+
<span class="cline-any cline-neutral"> </span>
|
975
|
+
<span class="cline-any cline-neutral"> </span>
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
977
|
+
<span class="cline-any cline-neutral"> </span>
|
978
|
+
<span class="cline-any cline-neutral"> </span>
|
979
|
+
<span class="cline-any cline-neutral"> </span>
|
980
|
+
<span class="cline-any cline-neutral"> </span>
|
981
|
+
<span class="cline-any cline-neutral"> </span>
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
984
|
+
<span class="cline-any cline-no"> </span>
|
985
|
+
<span class="cline-any cline-no"> </span>
|
986
|
+
<span class="cline-any cline-no"> </span>
|
987
|
+
<span class="cline-any cline-neutral"> </span>
|
988
|
+
<span class="cline-any cline-neutral"> </span>
|
989
|
+
<span class="cline-any cline-no"> </span>
|
990
|
+
<span class="cline-any cline-no"> </span>
|
991
|
+
<span class="cline-any cline-neutral"> </span>
|
992
|
+
<span class="cline-any cline-no"> </span>
|
993
|
+
<span class="cline-any cline-neutral"> </span>
|
994
|
+
<span class="cline-any cline-neutral"> </span>
|
995
|
+
<span class="cline-any cline-neutral"> </span>
|
996
|
+
<span class="cline-any cline-neutral"> </span>
|
997
|
+
<span class="cline-any cline-neutral"> </span>
|
998
|
+
<span class="cline-any cline-neutral"> </span>
|
999
|
+
<span class="cline-any cline-neutral"> </span>
|
1000
|
+
<span class="cline-any cline-neutral"> </span>
|
1001
|
+
<span class="cline-any cline-neutral"> </span>
|
1002
|
+
<span class="cline-any cline-neutral"> </span>
|
1003
|
+
<span class="cline-any cline-neutral"> </span>
|
1004
|
+
<span class="cline-any cline-neutral"> </span>
|
1005
|
+
<span class="cline-any cline-neutral"> </span>
|
1006
|
+
<span class="cline-any cline-neutral"> </span>
|
1007
|
+
<span class="cline-any cline-neutral"> </span>
|
1008
|
+
<span class="cline-any cline-neutral"> </span>
|
1009
|
+
<span class="cline-any cline-neutral"> </span>
|
1010
|
+
<span class="cline-any cline-neutral"> </span>
|
1011
|
+
<span class="cline-any cline-neutral"> </span>
|
1012
|
+
<span class="cline-any cline-neutral"> </span>
|
1013
|
+
<span class="cline-any cline-neutral"> </span>
|
1014
|
+
<span class="cline-any cline-neutral"> </span>
|
1015
|
+
<span class="cline-any cline-neutral"> </span>
|
1016
|
+
<span class="cline-any cline-neutral"> </span>
|
1017
|
+
<span class="cline-any cline-neutral"> </span>
|
1018
|
+
<span class="cline-any cline-neutral"> </span>
|
1019
|
+
<span class="cline-any cline-neutral"> </span>
|
1020
|
+
<span class="cline-any cline-neutral"> </span>
|
1021
|
+
<span class="cline-any cline-yes">1x</span>
|
1022
|
+
<span class="cline-any cline-neutral"> </span>
|
1023
|
+
<span class="cline-any cline-neutral"> </span>
|
1024
|
+
<span class="cline-any cline-neutral"> </span>
|
1025
|
+
<span class="cline-any cline-neutral"> </span>
|
1026
|
+
<span class="cline-any cline-yes">1x</span>
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
1029
|
+
<span class="cline-any cline-no"> </span>
|
1030
|
+
<span class="cline-any cline-no"> </span>
|
1031
|
+
<span class="cline-any cline-neutral"> </span>
|
1032
|
+
<span class="cline-any cline-neutral"> </span>
|
1033
|
+
<span class="cline-any cline-neutral"> </span>
|
1034
|
+
<span class="cline-any cline-neutral"> </span>
|
1035
|
+
<span class="cline-any cline-neutral"> </span>
|
1036
|
+
<span class="cline-any cline-neutral"> </span>
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
1039
|
+
<span class="cline-any cline-no"> </span>
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
1041
|
+
<span class="cline-any cline-no"> </span>
|
1042
|
+
<span class="cline-any cline-neutral"> </span>
|
1043
|
+
<span class="cline-any cline-neutral"> </span>
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
1046
|
+
<span class="cline-any cline-no"> </span>
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
1048
|
+
<span class="cline-any cline-neutral"> </span>
|
1049
|
+
<span class="cline-any cline-no"> </span>
|
1050
|
+
<span class="cline-any cline-neutral"> </span>
|
1051
|
+
<span class="cline-any cline-neutral"> </span>
|
1052
|
+
<span class="cline-any cline-no"> </span>
|
1053
|
+
<span class="cline-any cline-neutral"> </span>
|
1054
|
+
<span class="cline-any cline-neutral"> </span>
|
1055
|
+
<span class="cline-any cline-neutral"> </span>
|
1056
|
+
<span class="cline-any cline-neutral"> </span>
|
1057
|
+
<span class="cline-any cline-neutral"> </span>
|
1058
|
+
<span class="cline-any cline-no"> </span>
|
1059
|
+
<span class="cline-any cline-neutral"> </span>
|
1060
|
+
<span class="cline-any cline-neutral"> </span>
|
1061
|
+
<span class="cline-any cline-no"> </span>
|
1062
|
+
<span class="cline-any cline-neutral"> </span>
|
1063
|
+
<span class="cline-any cline-neutral"> </span>
|
1064
|
+
<span class="cline-any cline-neutral"> </span>
|
1065
|
+
<span class="cline-any cline-neutral"> </span>
|
1066
|
+
<span class="cline-any cline-neutral"> </span>
|
1067
|
+
<span class="cline-any cline-neutral"> </span>
|
1068
|
+
<span class="cline-any cline-neutral"> </span>
|
1069
|
+
<span class="cline-any cline-neutral"> </span>
|
1070
|
+
<span class="cline-any cline-neutral"> </span>
|
1071
|
+
<span class="cline-any cline-neutral"> </span>
|
1072
|
+
<span class="cline-any cline-neutral"> </span>
|
1073
|
+
<span class="cline-any cline-neutral"> </span>
|
1074
|
+
<span class="cline-any cline-neutral"> </span>
|
1075
|
+
<span class="cline-any cline-neutral"> </span>
|
1076
|
+
<span class="cline-any cline-neutral"> </span>
|
1077
|
+
<span class="cline-any cline-neutral"> </span>
|
1078
|
+
<span class="cline-any cline-neutral"> </span>
|
1079
|
+
<span class="cline-any cline-neutral"> </span>
|
1080
|
+
<span class="cline-any cline-neutral"> </span>
|
1081
|
+
<span class="cline-any cline-no"> </span>
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
1087
|
+
<span class="cline-any cline-neutral"> </span>
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
1090
|
+
<span class="cline-any cline-no"> </span>
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
1092
|
+
<span class="cline-any cline-no"> </span>
|
1093
|
+
<span class="cline-any cline-neutral"> </span>
|
1094
|
+
<span class="cline-any cline-no"> </span>
|
1095
|
+
<span class="cline-any cline-no"> </span>
|
1096
|
+
<span class="cline-any cline-no"> </span>
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
1098
|
+
<span class="cline-any cline-neutral"> </span>
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
1100
|
+
<span class="cline-any cline-neutral"> </span>
|
1101
|
+
<span class="cline-any cline-neutral"> </span>
|
1102
|
+
<span class="cline-any cline-neutral"> </span>
|
1103
|
+
<span class="cline-any cline-neutral"> </span>
|
1104
|
+
<span class="cline-any cline-neutral"> </span>
|
1105
|
+
<span class="cline-any cline-neutral"> </span>
|
1106
|
+
<span class="cline-any cline-neutral"> </span>
|
1107
|
+
<span class="cline-any cline-neutral"> </span>
|
1108
|
+
<span class="cline-any cline-neutral"> </span>
|
1109
|
+
<span class="cline-any cline-neutral"> </span>
|
1110
|
+
<span class="cline-any cline-neutral"> </span>
|
1111
|
+
<span class="cline-any cline-neutral"> </span>
|
1112
|
+
<span class="cline-any cline-no"> </span>
|
1113
|
+
<span class="cline-any cline-no"> </span>
|
1114
|
+
<span class="cline-any cline-no"> </span>
|
1115
|
+
<span class="cline-any cline-neutral"> </span>
|
1116
|
+
<span class="cline-any cline-neutral"> </span>
|
1117
|
+
<span class="cline-any cline-neutral"> </span>
|
1118
|
+
<span class="cline-any cline-neutral"> </span>
|
1119
|
+
<span class="cline-any cline-neutral"> </span>
|
1120
|
+
<span class="cline-any cline-neutral"> </span>
|
1121
|
+
<span class="cline-any cline-neutral"> </span>
|
1122
|
+
<span class="cline-any cline-no"> </span>
|
1123
|
+
<span class="cline-any cline-neutral"> </span>
|
1124
|
+
<span class="cline-any cline-neutral"> </span>
|
1125
|
+
<span class="cline-any cline-neutral"> </span>
|
1126
|
+
<span class="cline-any cline-neutral"> </span>
|
1127
|
+
<span class="cline-any cline-neutral"> </span>
|
1128
|
+
<span class="cline-any cline-neutral"> </span>
|
1129
|
+
<span class="cline-any cline-neutral"> </span>
|
1130
|
+
<span class="cline-any cline-neutral"> </span>
|
1131
|
+
<span class="cline-any cline-neutral"> </span>
|
1132
|
+
<span class="cline-any cline-neutral"> </span>
|
1133
|
+
<span class="cline-any cline-neutral"> </span>
|
1134
|
+
<span class="cline-any cline-neutral"> </span>
|
1135
|
+
<span class="cline-any cline-neutral"> </span>
|
1136
|
+
<span class="cline-any cline-neutral"> </span>
|
1137
|
+
<span class="cline-any cline-neutral"> </span>
|
1138
|
+
<span class="cline-any cline-neutral"> </span>
|
1139
|
+
<span class="cline-any cline-neutral"> </span>
|
1140
|
+
<span class="cline-any cline-neutral"> </span>
|
1141
|
+
<span class="cline-any cline-neutral"> </span>
|
1142
|
+
<span class="cline-any cline-neutral"> </span>
|
1143
|
+
<span class="cline-any cline-neutral"> </span>
|
1144
|
+
<span class="cline-any cline-no"> </span>
|
1145
|
+
<span class="cline-any cline-no"> </span>
|
1146
|
+
<span class="cline-any cline-neutral"> </span>
|
1147
|
+
<span class="cline-any cline-neutral"> </span>
|
1148
|
+
<span class="cline-any cline-neutral"> </span>
|
1149
|
+
<span class="cline-any cline-neutral"> </span>
|
1150
|
+
<span class="cline-any cline-neutral"> </span>
|
1151
|
+
<span class="cline-any cline-neutral"> </span>
|
1152
|
+
<span class="cline-any cline-neutral"> </span>
|
1153
|
+
<span class="cline-any cline-neutral"> </span>
|
1154
|
+
<span class="cline-any cline-neutral"> </span>
|
1155
|
+
<span class="cline-any cline-neutral"> </span>
|
1156
|
+
<span class="cline-any cline-neutral"> </span>
|
1157
|
+
<span class="cline-any cline-neutral"> </span>
|
1158
|
+
<span class="cline-any cline-neutral"> </span>
|
1159
|
+
<span class="cline-any cline-neutral"> </span>
|
1160
|
+
<span class="cline-any cline-neutral"> </span>
|
1161
|
+
<span class="cline-any cline-neutral"> </span>
|
1162
|
+
<span class="cline-any cline-neutral"> </span>
|
1163
|
+
<span class="cline-any cline-neutral"> </span>
|
1164
|
+
<span class="cline-any cline-neutral"> </span>
|
1165
|
+
<span class="cline-any cline-neutral"> </span>
|
1166
|
+
<span class="cline-any cline-neutral"> </span>
|
1167
|
+
<span class="cline-any cline-neutral"> </span>
|
1168
|
+
<span class="cline-any cline-neutral"> </span>
|
1169
|
+
<span class="cline-any cline-neutral"> </span>
|
1170
|
+
<span class="cline-any cline-no"> </span>
|
1171
|
+
<span class="cline-any cline-no"> </span>
|
1172
|
+
<span class="cline-any cline-neutral"> </span>
|
1173
|
+
<span class="cline-any cline-neutral"> </span>
|
1174
|
+
<span class="cline-any cline-neutral"> </span>
|
1175
|
+
<span class="cline-any cline-neutral"> </span>
|
1176
|
+
<span class="cline-any cline-no"> </span>
|
1177
|
+
<span class="cline-any cline-neutral"> </span>
|
1178
|
+
<span class="cline-any cline-neutral"> </span>
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
1180
|
+
<span class="cline-any cline-neutral"> </span>
|
1181
|
+
<span class="cline-any cline-neutral"> </span>
|
1182
|
+
<span class="cline-any cline-neutral"> </span>
|
1183
|
+
<span class="cline-any cline-neutral"> </span>
|
1184
|
+
<span class="cline-any cline-neutral"> </span>
|
1185
|
+
<span class="cline-any cline-neutral"> </span>
|
1186
|
+
<span class="cline-any cline-neutral"> </span>
|
1187
|
+
<span class="cline-any cline-neutral"> </span>
|
1188
|
+
<span class="cline-any cline-neutral"> </span>
|
1189
|
+
<span class="cline-any cline-neutral"> </span>
|
1190
|
+
<span class="cline-any cline-neutral"> </span>
|
1191
|
+
<span class="cline-any cline-no"> </span>
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
1193
|
+
<span class="cline-any cline-neutral"> </span>
|
1194
|
+
<span class="cline-any cline-neutral"> </span>
|
1195
|
+
<span class="cline-any cline-neutral"> </span>
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
1197
|
+
<span class="cline-any cline-no"> </span>
|
1198
|
+
<span class="cline-any cline-neutral"> </span>
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
1200
|
+
<span class="cline-any cline-neutral"> </span>
|
1201
|
+
<span class="cline-any cline-neutral"> </span>
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
1203
|
+
<span class="cline-any cline-neutral"> </span>
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
1205
|
+
<span class="cline-any cline-neutral"> </span>
|
1206
|
+
<span class="cline-any cline-neutral"> </span>
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
1208
|
+
<span class="cline-any cline-neutral"> </span>
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
1211
|
+
<span class="cline-any cline-neutral"> </span>
|
1212
|
+
<span class="cline-any cline-neutral"> </span>
|
1213
|
+
<span class="cline-any cline-neutral"> </span>
|
1214
|
+
<span class="cline-any cline-neutral"> </span>
|
1215
|
+
<span class="cline-any cline-neutral"> </span>
|
1216
|
+
<span class="cline-any cline-neutral"> </span>
|
1217
|
+
<span class="cline-any cline-neutral"> </span>
|
1218
|
+
<span class="cline-any cline-neutral"> </span>
|
1219
|
+
<span class="cline-any cline-no"> </span>
|
1220
|
+
<span class="cline-any cline-neutral"> </span>
|
1221
|
+
<span class="cline-any cline-neutral"> </span>
|
1222
|
+
<span class="cline-any cline-neutral"> </span>
|
1223
|
+
<span class="cline-any cline-neutral"> </span>
|
1224
|
+
<span class="cline-any cline-neutral"> </span>
|
1225
|
+
<span class="cline-any cline-neutral"> </span>
|
1226
|
+
<span class="cline-any cline-neutral"> </span>
|
1227
|
+
<span class="cline-any cline-neutral"> </span>
|
1228
|
+
<span class="cline-any cline-neutral"> </span>
|
1229
|
+
<span class="cline-any cline-neutral"> </span>
|
1230
|
+
<span class="cline-any cline-neutral"> </span>
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
1232
|
+
<span class="cline-any cline-neutral"> </span>
|
1233
|
+
<span class="cline-any cline-neutral"> </span>
|
1234
|
+
<span class="cline-any cline-neutral"> </span>
|
1235
|
+
<span class="cline-any cline-neutral"> </span>
|
1236
|
+
<span class="cline-any cline-neutral"> </span>
|
1237
|
+
<span class="cline-any cline-neutral"> </span>
|
1238
|
+
<span class="cline-any cline-neutral"> </span>
|
1239
|
+
<span class="cline-any cline-neutral"> </span>
|
1240
|
+
<span class="cline-any cline-neutral"> </span>
|
1241
|
+
<span class="cline-any cline-neutral"> </span>
|
1242
|
+
<span class="cline-any cline-neutral"> </span>
|
1243
|
+
<span class="cline-any cline-neutral"> </span>
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
1246
|
+
<span class="cline-any cline-neutral"> </span>
|
1247
|
+
<span class="cline-any cline-neutral"> </span>
|
1248
|
+
<span class="cline-any cline-neutral"> </span>
|
1249
|
+
<span class="cline-any cline-neutral"> </span>
|
1250
|
+
<span class="cline-any cline-neutral"> </span>
|
1251
|
+
<span class="cline-any cline-neutral"> </span>
|
1252
|
+
<span class="cline-any cline-neutral"> </span>
|
1253
|
+
<span class="cline-any cline-neutral"> </span>
|
1254
|
+
<span class="cline-any cline-neutral"> </span>
|
1255
|
+
<span class="cline-any cline-no"> </span>
|
1256
|
+
<span class="cline-any cline-neutral"> </span>
|
1257
|
+
<span class="cline-any cline-neutral"> </span>
|
1258
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import bsv from 'bsv';
|
1259
|
+
// @ts-ignore
|
1260
|
+
import Message from 'bsv/message';
|
1261
|
+
// @ts-ignore
|
1262
|
+
import ECIES from 'bsv/ecies';
|
1263
|
+
import 'node-fetch';
|
1264
|
+
|
1265
|
+
import { Utils } from './utils';
|
1266
|
+
import { BAP_ID } from './id';
|
1267
|
+
import {
|
1268
|
+
ENCRYPTION_PATH,
|
1269
|
+
BAP_SERVER,
|
1270
|
+
BAP_BITCOM_ADDRESS,
|
1271
|
+
BAP_BITCOM_ADDRESS_HEX,
|
1272
|
+
AIP_BITCOM_ADDRESS,
|
1273
|
+
} from './constants';
|
1274
|
+
import {Attestation, Identity, PathPrefix} from "./interface";
|
1275
|
+
|
1276
|
+
/**
|
1277
|
+
* BAP class
|
1278
|
+
*
|
1279
|
+
* Creates an instance of the BAP class and uses the given HDPrivateKey for all BAP operations.
|
1280
|
+
*
|
1281
|
+
* @param HDPrivateKey
|
1282
|
+
*/
|
1283
|
+
export const BAP = class {
|
1284
|
+
#HDPrivateKey;
|
1285
|
+
#ids: { [key: string]: BAP_ID } = {};
|
1286
|
+
#BAP_SERVER = BAP_SERVER;
|
1287
|
+
#BAP_TOKEN = '';
|
1288
|
+
#lastIdPath = '';
|
1289
|
+
|
1290
|
+
constructor(HDPrivateKey: string, token = '') {
|
1291
|
+
if (!HDPrivateKey) {
|
1292
|
+
throw new Error('No HDPrivateKey given');
|
1293
|
+
} else {
|
1294
|
+
// @ts-ignore
|
1295
|
+
this.#HDPrivateKey = bsv.HDPrivateKey(HDPrivateKey);
|
1296
|
+
}
|
1297
|
+
|
1298
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (token) {
|
1299
|
+
<span class="cstat-no" title="statement not covered" > this.#BAP_TOKEN = token;</span>
|
1300
|
+
}
|
1301
|
+
}
|
1302
|
+
|
1303
|
+
<span class="fstat-no" title="function not covered" > ge</span>t lastIdPath(): string {
|
1304
|
+
<span class="cstat-no" title="statement not covered" > return this.#lastIdPath;</span>
|
1305
|
+
}
|
1306
|
+
|
1307
|
+
/**
|
1308
|
+
* Get the public key of the given childPath, or of the current HDPrivateKey of childPath is empty
|
1309
|
+
*
|
1310
|
+
* @param childPath Full derivation path for this child
|
1311
|
+
* @returns {*}
|
1312
|
+
*/
|
1313
|
+
getPublicKey(childPath = ''): string {
|
1314
|
+
if (childPath) {
|
1315
|
+
return this.#HDPrivateKey.deriveChild(childPath).publicKey.toString();
|
1316
|
+
}
|
1317
|
+
|
1318
|
+
return this.#HDPrivateKey.publicKey.toString();
|
1319
|
+
}
|
1320
|
+
|
1321
|
+
/**
|
1322
|
+
* Get the public key of the given childPath, or of the current HDPrivateKey of childPath is empty
|
1323
|
+
*
|
1324
|
+
* @param childPath Full derivation path for this child
|
1325
|
+
* @returns {*}
|
1326
|
+
*/
|
1327
|
+
getHdPublicKey(childPath = ''): string {
|
1328
|
+
if (childPath) {
|
1329
|
+
return this.#HDPrivateKey.deriveChild(childPath).hdPublicKey.toString();
|
1330
|
+
}
|
1331
|
+
|
1332
|
+
return this.#HDPrivateKey.hdPublicKey.toString();
|
1333
|
+
}
|
1334
|
+
|
1335
|
+
<span class="fstat-no" title="function not covered" > se</span>t BAP_SERVER(bapServer) {
|
1336
|
+
<span class="cstat-no" title="statement not covered" > this.#BAP_SERVER = bapServer;</span>
|
1337
|
+
<span class="cstat-no" title="statement not covered" > Object.keys(this.#ids).forEach(<span class="fstat-no" title="function not covered" >(k</span>ey) => {</span>
|
1338
|
+
// @ts-ignore - does not recognize private fields that can be set
|
1339
|
+
<span class="cstat-no" title="statement not covered" > this.#ids[key].BAP_SERVER = bapServer;</span>
|
1340
|
+
});
|
1341
|
+
}
|
1342
|
+
|
1343
|
+
<span class="fstat-no" title="function not covered" > ge</span>t BAP_SERVER(): string {
|
1344
|
+
<span class="cstat-no" title="statement not covered" > return this.#BAP_SERVER;</span>
|
1345
|
+
}
|
1346
|
+
|
1347
|
+
<span class="fstat-no" title="function not covered" > se</span>t BAP_TOKEN(token) {
|
1348
|
+
<span class="cstat-no" title="statement not covered" > this.#BAP_TOKEN = token;</span>
|
1349
|
+
<span class="cstat-no" title="statement not covered" > Object.keys(this.#ids).forEach(<span class="fstat-no" title="function not covered" >(k</span>ey) => {</span>
|
1350
|
+
// @ts-ignore - does not recognize private fields that can be set
|
1351
|
+
<span class="cstat-no" title="statement not covered" > this.#ids[key].BAP_TOKEN = token;</span>
|
1352
|
+
});
|
1353
|
+
}
|
1354
|
+
|
1355
|
+
<span class="fstat-no" title="function not covered" > ge</span>t BAP_TOKEN(): string {
|
1356
|
+
<span class="cstat-no" title="statement not covered" > return this.#BAP_TOKEN;</span>
|
1357
|
+
}
|
1358
|
+
|
1359
|
+
/**
|
1360
|
+
* This function verifies that the given bapId matches the given root address
|
1361
|
+
* This is used as a data integrity check
|
1362
|
+
*
|
1363
|
+
* @param bapId BAP_ID instance
|
1364
|
+
*/
|
1365
|
+
<span class="fstat-no" title="function not covered" > ch</span>eckIdBelongs(bapId: BAP_ID): boolean {
|
1366
|
+
const derivedChild = <span class="cstat-no" title="statement not covered" >this.#HDPrivateKey.deriveChild(bapId.rootPath);</span>
|
1367
|
+
const checkRootAddress = <span class="cstat-no" title="statement not covered" >derivedChild.publicKey.toAddress().toString();</span>
|
1368
|
+
<span class="cstat-no" title="statement not covered" > if (checkRootAddress !== bapId.rootAddress) {</span>
|
1369
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('ID does not belong to this private key');</span>
|
1370
|
+
}
|
1371
|
+
|
1372
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
1373
|
+
}
|
1374
|
+
|
1375
|
+
/**
|
1376
|
+
* Returns a list of all the identity keys that are stored in this instance
|
1377
|
+
*
|
1378
|
+
* @returns {string[]}
|
1379
|
+
*/
|
1380
|
+
listIds(): string[] {
|
1381
|
+
return Object.keys(this.#ids);
|
1382
|
+
}
|
1383
|
+
|
1384
|
+
/**
|
1385
|
+
* Create a new Id and link it to this BAP instance
|
1386
|
+
*
|
1387
|
+
* This function uses the length of the #ids of this class to determine the next valid path.
|
1388
|
+
* If not all ids related to this HDPrivateKey have been loaded, determine the path externally
|
1389
|
+
* and pass it to newId when creating a new ID.
|
1390
|
+
*
|
1391
|
+
* @param path
|
1392
|
+
* @param identityAttributes
|
1393
|
+
* @param idSeed
|
1394
|
+
* @returns {*}
|
1395
|
+
*/
|
1396
|
+
newId(path = '', identityAttributes: any = {}, idSeed = ''): BAP_ID {
|
1397
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (!path) {
|
1398
|
+
// get next usable path for this key
|
1399
|
+
path = this.getNextValidPath();
|
1400
|
+
}
|
1401
|
+
|
1402
|
+
const newIdentity = new BAP_ID(this.#HDPrivateKey, identityAttributes, idSeed);
|
1403
|
+
<span class="cstat-no" title="statement not covered" > newIdentity.BAP_SERVER = this.#BAP_SERVER;</span>
|
1404
|
+
<span class="cstat-no" title="statement not covered" > newIdentity.BAP_TOKEN = this.#BAP_TOKEN;</span>
|
1405
|
+
|
1406
|
+
<span class="cstat-no" title="statement not covered" > newIdentity.rootPath = path;</span>
|
1407
|
+
<span class="cstat-no" title="statement not covered" > newIdentity.currentPath = Utils.getNextPath(path);</span>
|
1408
|
+
|
1409
|
+
const idKey = <span class="cstat-no" title="statement not covered" >newIdentity.getIdentityKey();</span>
|
1410
|
+
<span class="cstat-no" title="statement not covered" > this.#ids[idKey] = newIdentity;</span>
|
1411
|
+
<span class="cstat-no" title="statement not covered" > this.#lastIdPath = path;</span>
|
1412
|
+
|
1413
|
+
<span class="cstat-no" title="statement not covered" > return this.#ids[idKey];</span>
|
1414
|
+
}
|
1415
|
+
|
1416
|
+
/**
|
1417
|
+
* Remove identity
|
1418
|
+
*
|
1419
|
+
* @param idKey
|
1420
|
+
* @returns {*}
|
1421
|
+
*/
|
1422
|
+
<span class="fstat-no" title="function not covered" > re</span>moveId(idKey: string): void {
|
1423
|
+
<span class="cstat-no" title="statement not covered" > delete this.#ids[idKey];</span>
|
1424
|
+
}
|
1425
|
+
|
1426
|
+
/**
|
1427
|
+
* Get the next valid path for the used HDPrivateKey and loaded #ids
|
1428
|
+
*
|
1429
|
+
* @returns {string}
|
1430
|
+
*/
|
1431
|
+
getNextValidPath(): PathPrefix {
|
1432
|
+
// prefer hardened paths
|
1433
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.#lastIdPath) {
|
1434
|
+
<span class="cstat-no" title="statement not covered" > return Utils.getNextIdentityPath(this.#lastIdPath);</span>
|
1435
|
+
}
|
1436
|
+
|
1437
|
+
return `/0'/${Object.keys(this.#ids).length}'/0'`;
|
1438
|
+
}
|
1439
|
+
|
1440
|
+
/**
|
1441
|
+
* Get a certain Id
|
1442
|
+
*
|
1443
|
+
* @param identityKey
|
1444
|
+
* @returns {null}
|
1445
|
+
*/
|
1446
|
+
<span class="fstat-no" title="function not covered" > ge</span>tId(identityKey: string): BAP_ID | null {
|
1447
|
+
<span class="cstat-no" title="statement not covered" > return this.#ids[identityKey] || null;</span>
|
1448
|
+
}
|
1449
|
+
|
1450
|
+
/**
|
1451
|
+
* This function is used when manipulating ID's, adding or removing attributes etc
|
1452
|
+
* First create an id through this class and then use getId to get it. Then you can add/edit or
|
1453
|
+
* increment the signing path and then re-set it with this function.
|
1454
|
+
*
|
1455
|
+
* Note: when you getId() from this class, you will be working on the same object as this class
|
1456
|
+
* has and any changes made will be propagated to the id in this class. When you call exportIds
|
1457
|
+
* your new changes will also be included, without having to setId().
|
1458
|
+
*
|
1459
|
+
* @param bapId
|
1460
|
+
*/
|
1461
|
+
<span class="fstat-no" title="function not covered" > se</span>tId(bapId: BAP_ID): void {
|
1462
|
+
<span class="cstat-no" title="statement not covered" > this.checkIdBelongs(bapId);</span>
|
1463
|
+
<span class="cstat-no" title="statement not covered" > this.#ids[bapId.getIdentityKey()] = bapId;</span>
|
1464
|
+
}
|
1465
|
+
|
1466
|
+
/**
|
1467
|
+
* This function is used to import IDs and attributes from some external storage
|
1468
|
+
*
|
1469
|
+
* The ID information should NOT be stored together with the HD private key !
|
1470
|
+
*
|
1471
|
+
* @param idData Array of ids that have been exported
|
1472
|
+
* @param encrypted Whether the data should be treated as being encrypted (default true)
|
1473
|
+
*/
|
1474
|
+
importIds(idData: any, encrypted = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: void {
|
1475
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (encrypted) {
|
1476
|
+
// we first need to decrypt the ids array using ECIES
|
1477
|
+
const ecies = <span class="cstat-no" title="statement not covered" >ECIES();</span>
|
1478
|
+
const derivedChild = <span class="cstat-no" title="statement not covered" >this.#HDPrivateKey.deriveChild(ENCRYPTION_PATH);</span>
|
1479
|
+
<span class="cstat-no" title="statement not covered" > ecies.privateKey(derivedChild.privateKey);</span>
|
1480
|
+
const decrypted = <span class="cstat-no" title="statement not covered" >ecies.decrypt(</span>
|
1481
|
+
Buffer.from(idData, Utils.isHex(idData) ? 'hex' : 'base64'),
|
1482
|
+
).toString();
|
1483
|
+
<span class="cstat-no" title="statement not covered" > idData = JSON.parse(decrypted) as Identity[];</span>
|
1484
|
+
}
|
1485
|
+
|
1486
|
+
let oldFormatImport = false;
|
1487
|
+
if (!idData.hasOwnProperty('ids')) {
|
1488
|
+
// old format id container
|
1489
|
+
oldFormatImport = true;
|
1490
|
+
idData = {
|
1491
|
+
lastIdPath: '',
|
1492
|
+
ids: idData,
|
1493
|
+
};
|
1494
|
+
}
|
1495
|
+
|
1496
|
+
idData.ids.forEach((id: Identity) => {
|
1497
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!id.identityKey || !id.identityAttributes || !id.rootAddress) {
|
1498
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('ID cannot be imported as it is not complete');</span>
|
1499
|
+
}
|
1500
|
+
const importId = new BAP_ID(this.#HDPrivateKey, {}, id.idSeed);
|
1501
|
+
<span class="cstat-no" title="statement not covered" > importId.BAP_SERVER = this.#BAP_SERVER;</span>
|
1502
|
+
<span class="cstat-no" title="statement not covered" > importId.BAP_TOKEN = this.#BAP_TOKEN;</span>
|
1503
|
+
<span class="cstat-no" title="statement not covered" > importId.import(id);</span>
|
1504
|
+
|
1505
|
+
<span class="cstat-no" title="statement not covered" > this.checkIdBelongs(importId);</span>
|
1506
|
+
|
1507
|
+
<span class="cstat-no" title="statement not covered" > this.#ids[importId.getIdentityKey()] = importId;</span>
|
1508
|
+
|
1509
|
+
<span class="cstat-no" title="statement not covered" > if (oldFormatImport) {</span>
|
1510
|
+
// overwrite with the last value on this array
|
1511
|
+
<span class="cstat-no" title="statement not covered" > idData.lastIdPath = importId.currentPath;</span>
|
1512
|
+
}
|
1513
|
+
});
|
1514
|
+
|
1515
|
+
<span class="cstat-no" title="statement not covered" > this.#lastIdPath = idData.lastIdPath;</span>
|
1516
|
+
}
|
1517
|
+
|
1518
|
+
/**
|
1519
|
+
* Export all the IDs of this instance for external storage
|
1520
|
+
*
|
1521
|
+
* By default this function will encrypt the data, using a derivative child of the main HD key
|
1522
|
+
*
|
1523
|
+
* @param encrypted Whether the data should be encrypted (default true)
|
1524
|
+
* @returns {[]|*}
|
1525
|
+
*/
|
1526
|
+
<span class="fstat-no" title="function not covered" > ex</span>portIds(encrypted = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: any {
|
1527
|
+
const idData = <span class="cstat-no" title="statement not covered" >{</span>
|
1528
|
+
lastIdPath: this.#lastIdPath,
|
1529
|
+
ids: [] as Identity[],
|
1530
|
+
};
|
1531
|
+
|
1532
|
+
<span class="cstat-no" title="statement not covered" > Object.keys(this.#ids)</span>
|
1533
|
+
.forEach(<span class="fstat-no" title="function not covered" >(k</span>ey) => {
|
1534
|
+
<span class="cstat-no" title="statement not covered" > idData.ids.push(this.#ids[key].export());</span>
|
1535
|
+
});
|
1536
|
+
|
1537
|
+
<span class="cstat-no" title="statement not covered" > if (encrypted) {</span>
|
1538
|
+
const ecies = <span class="cstat-no" title="statement not covered" >ECIES();</span>
|
1539
|
+
const derivedChild = <span class="cstat-no" title="statement not covered" >this.#HDPrivateKey.deriveChild(ENCRYPTION_PATH);</span>
|
1540
|
+
<span class="cstat-no" title="statement not covered" > ecies.publicKey(derivedChild.publicKey);</span>
|
1541
|
+
<span class="cstat-no" title="statement not covered" > return ecies.encrypt(JSON.stringify(idData)).toString('base64');</span>
|
1542
|
+
}
|
1543
|
+
|
1544
|
+
<span class="cstat-no" title="statement not covered" > return idData;</span>
|
1545
|
+
}
|
1546
|
+
|
1547
|
+
/**
|
1548
|
+
* Encrypt a string of data
|
1549
|
+
*
|
1550
|
+
* @param string
|
1551
|
+
* @returns {string}
|
1552
|
+
*/
|
1553
|
+
<span class="fstat-no" title="function not covered" > en</span>crypt(string: string): string {
|
1554
|
+
const ecies = <span class="cstat-no" title="statement not covered" >ECIES();</span>
|
1555
|
+
const derivedChild = <span class="cstat-no" title="statement not covered" >this.#HDPrivateKey.deriveChild(ENCRYPTION_PATH);</span>
|
1556
|
+
<span class="cstat-no" title="statement not covered" > ecies.publicKey(derivedChild.publicKey);</span>
|
1557
|
+
<span class="cstat-no" title="statement not covered" > return ecies.encrypt(string).toString('base64');</span>
|
1558
|
+
}
|
1559
|
+
|
1560
|
+
/**
|
1561
|
+
* Decrypt a string of data
|
1562
|
+
*
|
1563
|
+
* @param string
|
1564
|
+
* @returns {string}
|
1565
|
+
*/
|
1566
|
+
<span class="fstat-no" title="function not covered" > de</span>crypt(string: string): string {
|
1567
|
+
const ecies = <span class="cstat-no" title="statement not covered" >ECIES();</span>
|
1568
|
+
const derivedChild = <span class="cstat-no" title="statement not covered" >this.#HDPrivateKey.deriveChild(ENCRYPTION_PATH);</span>
|
1569
|
+
<span class="cstat-no" title="statement not covered" > ecies.privateKey(derivedChild.privateKey);</span>
|
1570
|
+
<span class="cstat-no" title="statement not covered" > return ecies.decrypt(Buffer.from(string, 'base64')).toString();</span>
|
1571
|
+
}
|
1572
|
+
|
1573
|
+
/**
|
1574
|
+
* Sign an attestation for a user
|
1575
|
+
*
|
1576
|
+
* @param attestationHash The computed attestation hash for the user - this should be calculated with the BAP_ID class for an identity for the user
|
1577
|
+
* @param identityKey The identity key we are using for the signing
|
1578
|
+
* @param counter
|
1579
|
+
* @param dataString Optional data string that will be appended to the BAP attestation
|
1580
|
+
* @returns {string[]}
|
1581
|
+
*/
|
1582
|
+
<span class="fstat-no" title="function not covered" > si</span>gnAttestationWithAIP(attestationHash: string, identityKey: string, counter = <span class="branch-0 cbranch-no" title="branch not covered" >0,</span> dataString = <span class="branch-0 cbranch-no" title="branch not covered" >'')</span> {
|
1583
|
+
const id = <span class="cstat-no" title="statement not covered" >this.getId(identityKey);</span>
|
1584
|
+
<span class="cstat-no" title="statement not covered" > if (!id) {</span>
|
1585
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Could not find identity to attest with');</span>
|
1586
|
+
}
|
1587
|
+
|
1588
|
+
const attestationBuffer = <span class="cstat-no" title="statement not covered" >this.getAttestationBuffer(attestationHash, counter, dataString);</span>
|
1589
|
+
const { address, signature } = <span class="cstat-no" title="statement not covered" >id.signMessage(attestationBuffer);</span>
|
1590
|
+
|
1591
|
+
<span class="cstat-no" title="statement not covered" > return this.createAttestationTransaction(</span>
|
1592
|
+
attestationHash,
|
1593
|
+
counter,
|
1594
|
+
address,
|
1595
|
+
signature,
|
1596
|
+
dataString,
|
1597
|
+
);
|
1598
|
+
}
|
1599
|
+
|
1600
|
+
/**
|
1601
|
+
* Verify an AIP signed attestation for a user
|
1602
|
+
*
|
1603
|
+
* [
|
1604
|
+
* '0x6a',
|
1605
|
+
* '0x31424150537561506e66476e53424d33474c56397968785564596534764762644d54',
|
1606
|
+
* '0x415454455354',
|
1607
|
+
* '0x33656166366361396334313936356538353831366439336439643034333136393032376633396661623034386333633031333663343364663635376462383761',
|
1608
|
+
* '0x30',
|
1609
|
+
* '0x7c',
|
1610
|
+
* '0x313550636948473232534e4c514a584d6f5355615756693757537163376843667661',
|
1611
|
+
* '0x424954434f494e5f4543445341',
|
1612
|
+
* '0x31477531796d52567a595557634638776f6f506a7a4a4c764d383550795a64655876',
|
1613
|
+
* '0x20ef60c5555001ddb1039bb0f215e46571fcb39ee46f48b089d1c08b0304dbcb3366d8fdf8bafd82be24b5ac42dcd6a5e96c90705dd42e3ad918b1b47ac3ce6ac2'
|
1614
|
+
* ]
|
1615
|
+
*
|
1616
|
+
* @param tx Array of hex values for the OP_RETURN values
|
1617
|
+
* @returns {{}}
|
1618
|
+
*/
|
1619
|
+
verifyAttestationWithAIP(tx: string[]): Attestation {
|
1620
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (
|
1621
|
+
!Array.isArray(tx)
|
1622
|
+
|| tx[0] !== '0x6a'
|
1623
|
+
|| <span class="branch-2 cbranch-no" title="branch not covered" >tx[1] !== BAP_BITCOM_ADDRESS_HEX</span>
|
1624
|
+
) {
|
1625
|
+
throw new Error('Not a valid BAP transaction');
|
1626
|
+
}
|
1627
|
+
|
1628
|
+
const dataOffset = <span class="cstat-no" title="statement not covered" >tx[7] === '0x44415441' ? 5 : 0;</span> // DATA
|
1629
|
+
const attestation: Attestation = <span class="cstat-no" title="statement not covered" >{</span>
|
1630
|
+
type: Utils.hexDecode(tx[2]),
|
1631
|
+
hash: Utils.hexDecode(tx[3]),
|
1632
|
+
sequence: Utils.hexDecode(tx[4]),
|
1633
|
+
signingProtocol: Utils.hexDecode(tx[7 + dataOffset]),
|
1634
|
+
signingAddress: Utils.hexDecode(tx[8 + dataOffset]),
|
1635
|
+
signature: Utils.hexDecode(tx[9 + dataOffset], 'base64'),
|
1636
|
+
};
|
1637
|
+
|
1638
|
+
<span class="cstat-no" title="statement not covered" > if (dataOffset && tx[3] === tx[8]) {</span>
|
1639
|
+
// valid data addition
|
1640
|
+
<span class="cstat-no" title="statement not covered" > attestation.data = Utils.hexDecode(tx[9]);</span>
|
1641
|
+
}
|
1642
|
+
|
1643
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
1644
|
+
const signatureBufferStatements = <span class="cstat-no" title="statement not covered" >[];</span>
|
1645
|
+
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i < 6 + dataOffset; i++) {</span>
|
1646
|
+
<span class="cstat-no" title="statement not covered" > signatureBufferStatements.push(Buffer.from(tx[i].replace('0x', ''), 'hex'));</span>
|
1647
|
+
}
|
1648
|
+
const attestationBuffer = <span class="cstat-no" title="statement not covered" >Buffer.concat([</span>
|
1649
|
+
...signatureBufferStatements,
|
1650
|
+
]);
|
1651
|
+
<span class="cstat-no" title="statement not covered" > attestation.verified = this.verifySignature(</span>
|
1652
|
+
attestationBuffer,
|
1653
|
+
attestation.signingAddress,
|
1654
|
+
attestation.signature,
|
1655
|
+
);
|
1656
|
+
} catch (e) {
|
1657
|
+
<span class="cstat-no" title="statement not covered" > attestation.verified = false;</span>
|
1658
|
+
}
|
1659
|
+
|
1660
|
+
<span class="cstat-no" title="statement not covered" > return attestation;</span>
|
1661
|
+
}
|
1662
|
+
|
1663
|
+
/**
|
1664
|
+
* For BAP attestations we use all fields for the attestation
|
1665
|
+
*
|
1666
|
+
* @param attestationHash
|
1667
|
+
* @param counter
|
1668
|
+
* @param address
|
1669
|
+
* @param signature
|
1670
|
+
* @param dataString Optional data string that will be appended to the BAP attestation
|
1671
|
+
* @returns {[string]}
|
1672
|
+
*/
|
1673
|
+
<span class="fstat-no" title="function not covered" > cr</span>eateAttestationTransaction(
|
1674
|
+
attestationHash: string,
|
1675
|
+
counter: number,
|
1676
|
+
address: string,
|
1677
|
+
signature: string,
|
1678
|
+
dataString = <span class="branch-0 cbranch-no" title="branch not covered" >'',</span>
|
1679
|
+
): string[] {
|
1680
|
+
const transaction = <span class="cstat-no" title="statement not covered" >['0x6a', Utils.hexEncode(BAP_BITCOM_ADDRESS)];</span>
|
1681
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode('ATTEST'));</span>
|
1682
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode(attestationHash));</span>
|
1683
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode(`${counter}`));</span>
|
1684
|
+
<span class="cstat-no" title="statement not covered" > transaction.push('0x7c'); </span>// |
|
1685
|
+
<span class="cstat-no" title="statement not covered" > if (dataString) {</span>
|
1686
|
+
// data should be a string, either encrypted or stringified JSON if applicable
|
1687
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode(BAP_BITCOM_ADDRESS));</span>
|
1688
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode('DATA'));</span>
|
1689
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode(attestationHash));</span>
|
1690
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode(dataString));</span>
|
1691
|
+
<span class="cstat-no" title="statement not covered" > transaction.push('0x7c'); </span>// |
|
1692
|
+
}
|
1693
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode(AIP_BITCOM_ADDRESS));</span>
|
1694
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode('BITCOIN_ECDSA'));</span>
|
1695
|
+
<span class="cstat-no" title="statement not covered" > transaction.push(Utils.hexEncode(address));</span>
|
1696
|
+
<span class="cstat-no" title="statement not covered" > transaction.push('0x' + Buffer.from(signature, 'base64').toString('hex'));</span>
|
1697
|
+
|
1698
|
+
<span class="cstat-no" title="statement not covered" > return transaction;</span>
|
1699
|
+
}
|
1700
|
+
|
1701
|
+
/**
|
1702
|
+
* This is a re-creation of how the bitcoinfiles-sdk creates a hash to sign for AIP
|
1703
|
+
*
|
1704
|
+
* @param attestationHash
|
1705
|
+
* @param counter
|
1706
|
+
* @param dataString Optional data string
|
1707
|
+
* @returns {Buffer}
|
1708
|
+
*/
|
1709
|
+
<span class="fstat-no" title="function not covered" > ge</span>tAttestationBuffer(attestationHash: string, counter = <span class="branch-0 cbranch-no" title="branch not covered" >0,</span> dataString = <span class="branch-0 cbranch-no" title="branch not covered" >'')</span>: Buffer {
|
1710
|
+
// re-create how AIP creates the buffer to sign
|
1711
|
+
let dataStringBuffer = <span class="cstat-no" title="statement not covered" >Buffer.from('');</span>
|
1712
|
+
<span class="cstat-no" title="statement not covered" > if (dataString) {</span>
|
1713
|
+
<span class="cstat-no" title="statement not covered" > dataStringBuffer = Buffer.concat([</span>
|
1714
|
+
Buffer.from(BAP_BITCOM_ADDRESS),
|
1715
|
+
Buffer.from('DATA'),
|
1716
|
+
Buffer.from(attestationHash),
|
1717
|
+
Buffer.from(dataString),
|
1718
|
+
Buffer.from('7c', 'hex'),
|
1719
|
+
]);
|
1720
|
+
}
|
1721
|
+
<span class="cstat-no" title="statement not covered" > return Buffer.concat([</span>
|
1722
|
+
Buffer.from('6a', 'hex'), // OP_RETURN
|
1723
|
+
Buffer.from(BAP_BITCOM_ADDRESS),
|
1724
|
+
Buffer.from('ATTEST'),
|
1725
|
+
Buffer.from(attestationHash),
|
1726
|
+
Buffer.from(`${counter}`),
|
1727
|
+
Buffer.from('7c', 'hex'),
|
1728
|
+
dataStringBuffer,
|
1729
|
+
]);
|
1730
|
+
}
|
1731
|
+
|
1732
|
+
/**
|
1733
|
+
* Verify that the identity challenge is signed by the address
|
1734
|
+
*
|
1735
|
+
* @param message Buffer or utf-8 string
|
1736
|
+
* @param address Bitcoin address of signee
|
1737
|
+
* @param signature Signature base64 string
|
1738
|
+
*
|
1739
|
+
* @return boolean
|
1740
|
+
*/
|
1741
|
+
<span class="fstat-no" title="function not covered" > ve</span>rifySignature(message: string | Buffer, address: string, signature: string): boolean {
|
1742
|
+
// check the signature against the challenge
|
1743
|
+
const messageBuffer = <span class="cstat-no" title="statement not covered" >Buffer.isBuffer(message) ? message : Buffer.from(message);</span>
|
1744
|
+
<span class="cstat-no" title="statement not covered" > return Message.verify(</span>
|
1745
|
+
messageBuffer,
|
1746
|
+
address,
|
1747
|
+
signature,
|
1748
|
+
);
|
1749
|
+
}
|
1750
|
+
|
1751
|
+
/**
|
1752
|
+
* Check whether the given transaction (BAP OP_RETURN) is valid, is signed and that the
|
1753
|
+
* identity signing is also valid at the time of signing
|
1754
|
+
*
|
1755
|
+
* @param idKey
|
1756
|
+
* @param address
|
1757
|
+
* @param challenge
|
1758
|
+
* @param signature
|
1759
|
+
*
|
1760
|
+
* @returns {Promise<boolean|*>}
|
1761
|
+
*/
|
1762
|
+
<span class="fstat-no" title="function not covered" > as</span>ync verifyChallengeSignature(
|
1763
|
+
idKey: string,
|
1764
|
+
address: string,
|
1765
|
+
challenge: string,
|
1766
|
+
signature: string,
|
1767
|
+
): Promise<boolean> {
|
1768
|
+
// first we test locally before sending to server
|
1769
|
+
<span class="cstat-no" title="statement not covered" > if (this.verifySignature(challenge, address, signature)) {</span>
|
1770
|
+
const result = <span class="cstat-no" title="statement not covered" >await this.getApiData('/attestation/valid', {</span>
|
1771
|
+
idKey,
|
1772
|
+
challenge,
|
1773
|
+
signature,
|
1774
|
+
});
|
1775
|
+
<span class="cstat-no" title="statement not covered" > return result.data;</span>
|
1776
|
+
}
|
1777
|
+
|
1778
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
1779
|
+
}
|
1780
|
+
|
1781
|
+
/**
|
1782
|
+
* Check whether the given transaction (BAP OP_RETURN) is valid, is signed and that the
|
1783
|
+
* identity signing is also valid at the time of signing
|
1784
|
+
*
|
1785
|
+
* @param tx
|
1786
|
+
* @returns {Promise<boolean|*>}
|
1787
|
+
*/
|
1788
|
+
<span class="fstat-no" title="function not covered" > as</span>ync isValidAttestationTransaction(tx: string[]): Promise<any> {
|
1789
|
+
// first we test locally before sending to server
|
1790
|
+
<span class="cstat-no" title="statement not covered" > if (this.verifyAttestationWithAIP(tx)) {</span>
|
1791
|
+
<span class="cstat-no" title="statement not covered" > return this.getApiData('/attestation/valid', {</span>
|
1792
|
+
tx,
|
1793
|
+
});
|
1794
|
+
}
|
1795
|
+
|
1796
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
1797
|
+
}
|
1798
|
+
|
1799
|
+
/**
|
1800
|
+
* Get all signing keys for the given idKey
|
1801
|
+
*
|
1802
|
+
* @param address
|
1803
|
+
* @returns {Promise<*>}
|
1804
|
+
*/
|
1805
|
+
<span class="fstat-no" title="function not covered" > as</span>ync getIdentityFromAddress(address: string): Promise<any> {
|
1806
|
+
<span class="cstat-no" title="statement not covered" > return this.getApiData('/identity/from-address', {</span>
|
1807
|
+
address,
|
1808
|
+
});
|
1809
|
+
}
|
1810
|
+
|
1811
|
+
/**
|
1812
|
+
* Get all signing keys for the given idKey
|
1813
|
+
*
|
1814
|
+
* @param idKey
|
1815
|
+
* @returns {Promise<*>}
|
1816
|
+
*/
|
1817
|
+
<span class="fstat-no" title="function not covered" > as</span>ync getIdentity(idKey: string): Promise<any> {
|
1818
|
+
<span class="cstat-no" title="statement not covered" > return this.getApiData('/identity', {</span>
|
1819
|
+
idKey,
|
1820
|
+
});
|
1821
|
+
}
|
1822
|
+
|
1823
|
+
/**
|
1824
|
+
* Get all attestations for the given attestation hash
|
1825
|
+
*
|
1826
|
+
* @param attestationHash
|
1827
|
+
*/
|
1828
|
+
<span class="fstat-no" title="function not covered" > as</span>ync getAttestationsForHash(attestationHash: string): Promise<any> {
|
1829
|
+
// get all BAP ATTEST records for the given attestationHash
|
1830
|
+
<span class="cstat-no" title="statement not covered" > return this.getApiData('/attestations', {</span>
|
1831
|
+
hash: attestationHash,
|
1832
|
+
});
|
1833
|
+
}
|
1834
|
+
|
1835
|
+
/**
|
1836
|
+
* Helper function to get attestation from a BAP API server
|
1837
|
+
*
|
1838
|
+
* @param apiUrl
|
1839
|
+
* @param apiData
|
1840
|
+
* @returns {Promise<any>}
|
1841
|
+
*/
|
1842
|
+
<span class="fstat-no" title="function not covered" > as</span>ync getApiData(apiUrl: string, apiData: any): Promise<any> {
|
1843
|
+
const url = <span class="cstat-no" title="statement not covered" >`${this.#BAP_SERVER}${apiUrl}`;</span>
|
1844
|
+
const response = <span class="cstat-no" title="statement not covered" >await fetch(url, {</span>
|
1845
|
+
method: 'post',
|
1846
|
+
headers: {
|
1847
|
+
'Content-type': 'application/json; charset=utf-8',
|
1848
|
+
token: this.#BAP_TOKEN,
|
1849
|
+
format: 'json',
|
1850
|
+
},
|
1851
|
+
body: JSON.stringify(apiData),
|
1852
|
+
});
|
1853
|
+
|
1854
|
+
<span class="cstat-no" title="statement not covered" > return response.json();</span>
|
1855
|
+
}
|
1856
|
+
};
|
1857
|
+
</pre></td></tr></table></pre>
|
1858
|
+
|
1859
|
+
<div class='push'></div><!-- for sticky footer -->
|
1860
|
+
</div><!-- /wrapper -->
|
1861
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
1862
|
+
Code coverage generated by
|
1863
|
+
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
|
1864
|
+
at Tue Aug 27 2024 10:04:22 GMT-0400 (Eastern Daylight Time)
|
1865
|
+
</div>
|
1866
|
+
</div>
|
1867
|
+
<script src="../prettify.js"></script>
|
1868
|
+
<script>
|
1869
|
+
window.onload = function () {
|
1870
|
+
prettyPrint();
|
1871
|
+
};
|
1872
|
+
</script>
|
1873
|
+
<script src="../sorter.js"></script>
|
1874
|
+
<script src="../block-navigation.js"></script>
|
1875
|
+
</body>
|
1876
|
+
</html>
|
1877
|
+
|