@sidhujag/sysweb3-keyring 1.0.547 → 1.0.549

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/{dist/cjs → cjs}/providers.js +1 -64
  2. package/cjs/providers.js.map +1 -0
  3. package/{dist/cjs → cjs}/transactions/ethereum.js +1 -16
  4. package/cjs/transactions/ethereum.js.map +1 -0
  5. package/package.json +2 -30
  6. package/{dist/types → types}/providers.d.ts +0 -8
  7. package/{dist/types → types}/transactions/ethereum.d.ts +2 -2
  8. package/{dist/types → types}/types.d.ts +2 -2
  9. package/coverage/clover.xml +0 -2875
  10. package/coverage/coverage-final.json +0 -29468
  11. package/coverage/lcov-report/base.css +0 -354
  12. package/coverage/lcov-report/block-navigation.js +0 -85
  13. package/coverage/lcov-report/favicon.png +0 -0
  14. package/coverage/lcov-report/index.html +0 -320
  15. package/coverage/lcov-report/prettify.css +0 -101
  16. package/coverage/lcov-report/prettify.js +0 -1008
  17. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  18. package/coverage/lcov-report/sorter.js +0 -191
  19. package/coverage/lcov-report/src/index.html +0 -276
  20. package/coverage/lcov-report/src/index.ts.html +0 -114
  21. package/coverage/lcov-report/src/initial-state.ts.html +0 -558
  22. package/coverage/lcov-report/src/keyring-manager.ts.html +0 -6279
  23. package/coverage/lcov-report/src/ledger/bitcoin_client/index.html +0 -178
  24. package/coverage/lcov-report/src/ledger/bitcoin_client/index.ts.html +0 -144
  25. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/appClient.ts.html +0 -1560
  26. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/bip32.ts.html +0 -276
  27. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/buffertools.ts.html +0 -495
  28. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/clientCommands.ts.html +0 -1138
  29. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/index.html +0 -363
  30. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts.html +0 -289
  31. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkle.ts.html +0 -486
  32. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkleMap.ts.html +0 -240
  33. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/policy.ts.html +0 -342
  34. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/psbtv2.ts.html +0 -2388
  35. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/varint.ts.html +0 -453
  36. package/coverage/lcov-report/src/ledger/consts.ts.html +0 -177
  37. package/coverage/lcov-report/src/ledger/index.html +0 -216
  38. package/coverage/lcov-report/src/ledger/index.ts.html +0 -1371
  39. package/coverage/lcov-report/src/ledger/utils.ts.html +0 -102
  40. package/coverage/lcov-report/src/signers.ts.html +0 -591
  41. package/coverage/lcov-report/src/storage.ts.html +0 -198
  42. package/coverage/lcov-report/src/transactions/ethereum.ts.html +0 -5826
  43. package/coverage/lcov-report/src/transactions/index.html +0 -216
  44. package/coverage/lcov-report/src/transactions/index.ts.html +0 -93
  45. package/coverage/lcov-report/src/transactions/syscoin.ts.html +0 -1521
  46. package/coverage/lcov-report/src/trezor/index.html +0 -176
  47. package/coverage/lcov-report/src/trezor/index.ts.html +0 -2655
  48. package/coverage/lcov-report/src/types.ts.html +0 -1443
  49. package/coverage/lcov-report/src/utils/derivation-paths.ts.html +0 -486
  50. package/coverage/lcov-report/src/utils/index.html +0 -196
  51. package/coverage/lcov-report/src/utils/psbt.ts.html +0 -159
  52. package/coverage/lcov-report/test/helpers/constants.ts.html +0 -627
  53. package/coverage/lcov-report/test/helpers/index.html +0 -176
  54. package/coverage/lcov.info +0 -4832
  55. package/dist/cjs/providers.js.map +0 -1
  56. package/dist/cjs/transactions/ethereum.js.map +0 -1
  57. package/dist/package.json +0 -50
  58. package/examples/basic-usage.js +0 -140
  59. package/jest.config.js +0 -32
  60. package/readme.md +0 -201
  61. package/src/declare.d.ts +0 -7
  62. package/src/errorUtils.ts +0 -83
  63. package/src/hardware-wallet-manager.ts +0 -655
  64. package/src/index.ts +0 -12
  65. package/src/initial-state.ts +0 -108
  66. package/src/keyring-manager.ts +0 -2698
  67. package/src/ledger/bitcoin_client/index.ts +0 -19
  68. package/src/ledger/bitcoin_client/lib/appClient.ts +0 -405
  69. package/src/ledger/bitcoin_client/lib/bip32.ts +0 -61
  70. package/src/ledger/bitcoin_client/lib/buffertools.ts +0 -134
  71. package/src/ledger/bitcoin_client/lib/clientCommands.ts +0 -356
  72. package/src/ledger/bitcoin_client/lib/constants.ts +0 -12
  73. package/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts +0 -65
  74. package/src/ledger/bitcoin_client/lib/merkle.ts +0 -136
  75. package/src/ledger/bitcoin_client/lib/merkleMap.ts +0 -49
  76. package/src/ledger/bitcoin_client/lib/policy.ts +0 -91
  77. package/src/ledger/bitcoin_client/lib/psbtv2.ts +0 -768
  78. package/src/ledger/bitcoin_client/lib/varint.ts +0 -120
  79. package/src/ledger/consts.ts +0 -3
  80. package/src/ledger/index.ts +0 -685
  81. package/src/ledger/types.ts +0 -74
  82. package/src/network-utils.ts +0 -99
  83. package/src/providers.ts +0 -345
  84. package/src/signers.ts +0 -158
  85. package/src/storage.ts +0 -63
  86. package/src/transactions/__tests__/integration.test.ts +0 -303
  87. package/src/transactions/__tests__/syscoin.test.ts +0 -409
  88. package/src/transactions/ethereum.ts +0 -2503
  89. package/src/transactions/index.ts +0 -2
  90. package/src/transactions/syscoin.ts +0 -542
  91. package/src/trezor/index.ts +0 -1050
  92. package/src/types.ts +0 -366
  93. package/src/utils/derivation-paths.ts +0 -133
  94. package/src/utils/psbt.ts +0 -24
  95. package/src/utils.ts +0 -191
  96. package/test/README.md +0 -158
  97. package/test/__mocks__/ledger-mock.js +0 -20
  98. package/test/__mocks__/trezor-mock.js +0 -75
  99. package/test/cleanup-summary.md +0 -167
  100. package/test/helpers/README.md +0 -78
  101. package/test/helpers/constants.ts +0 -79
  102. package/test/helpers/setup.ts +0 -714
  103. package/test/integration/import-validation.spec.ts +0 -588
  104. package/test/unit/hardware/ledger.spec.ts +0 -869
  105. package/test/unit/hardware/trezor.spec.ts +0 -828
  106. package/test/unit/keyring-manager/account-management.spec.ts +0 -970
  107. package/test/unit/keyring-manager/import-watchonly.spec.ts +0 -181
  108. package/test/unit/keyring-manager/import-wif.spec.ts +0 -126
  109. package/test/unit/keyring-manager/initialization.spec.ts +0 -782
  110. package/test/unit/keyring-manager/key-derivation.spec.ts +0 -996
  111. package/test/unit/keyring-manager/security.spec.ts +0 -505
  112. package/test/unit/keyring-manager/state-management.spec.ts +0 -375
  113. package/test/unit/network/network-management.spec.ts +0 -372
  114. package/test/unit/transactions/ethereum-transactions.spec.ts +0 -382
  115. package/test/unit/transactions/syscoin-transactions.spec.ts +0 -615
  116. package/tsconfig.json +0 -14
  117. /package/{dist/README.md → README.md} +0 -0
  118. /package/{dist/cjs → cjs}/errorUtils.js +0 -0
  119. /package/{dist/cjs → cjs}/errorUtils.js.map +0 -0
  120. /package/{dist/cjs → cjs}/hardware-wallet-manager.js +0 -0
  121. /package/{dist/cjs → cjs}/hardware-wallet-manager.js.map +0 -0
  122. /package/{dist/cjs → cjs}/index.js +0 -0
  123. /package/{dist/cjs → cjs}/index.js.map +0 -0
  124. /package/{dist/cjs → cjs}/initial-state.js +0 -0
  125. /package/{dist/cjs → cjs}/initial-state.js.map +0 -0
  126. /package/{dist/cjs → cjs}/keyring-manager.js +0 -0
  127. /package/{dist/cjs → cjs}/keyring-manager.js.map +0 -0
  128. /package/{dist/cjs → cjs}/ledger/bitcoin_client/index.js +0 -0
  129. /package/{dist/cjs → cjs}/ledger/bitcoin_client/index.js.map +0 -0
  130. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/appClient.js +0 -0
  131. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/appClient.js.map +0 -0
  132. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/bip32.js +0 -0
  133. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/bip32.js.map +0 -0
  134. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/buffertools.js +0 -0
  135. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/buffertools.js.map +0 -0
  136. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/clientCommands.js +0 -0
  137. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/clientCommands.js.map +0 -0
  138. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/constants.js +0 -0
  139. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/constants.js.map +0 -0
  140. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js +0 -0
  141. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +0 -0
  142. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkle.js +0 -0
  143. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkle.js.map +0 -0
  144. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkleMap.js +0 -0
  145. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkleMap.js.map +0 -0
  146. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/policy.js +0 -0
  147. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/policy.js.map +0 -0
  148. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/psbtv2.js +0 -0
  149. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/psbtv2.js.map +0 -0
  150. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/varint.js +0 -0
  151. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/varint.js.map +0 -0
  152. /package/{dist/cjs → cjs}/ledger/consts.js +0 -0
  153. /package/{dist/cjs → cjs}/ledger/consts.js.map +0 -0
  154. /package/{dist/cjs → cjs}/ledger/index.js +0 -0
  155. /package/{dist/cjs → cjs}/ledger/index.js.map +0 -0
  156. /package/{dist/cjs → cjs}/ledger/types.js +0 -0
  157. /package/{dist/cjs → cjs}/ledger/types.js.map +0 -0
  158. /package/{dist/cjs → cjs}/network-utils.js +0 -0
  159. /package/{dist/cjs → cjs}/network-utils.js.map +0 -0
  160. /package/{dist/cjs → cjs}/signers.js +0 -0
  161. /package/{dist/cjs → cjs}/signers.js.map +0 -0
  162. /package/{dist/cjs → cjs}/storage.js +0 -0
  163. /package/{dist/cjs → cjs}/storage.js.map +0 -0
  164. /package/{dist/cjs → cjs}/transactions/__tests__/integration.test.js +0 -0
  165. /package/{dist/cjs → cjs}/transactions/__tests__/integration.test.js.map +0 -0
  166. /package/{dist/cjs → cjs}/transactions/__tests__/syscoin.test.js +0 -0
  167. /package/{dist/cjs → cjs}/transactions/__tests__/syscoin.test.js.map +0 -0
  168. /package/{dist/cjs → cjs}/transactions/index.js +0 -0
  169. /package/{dist/cjs → cjs}/transactions/index.js.map +0 -0
  170. /package/{dist/cjs → cjs}/transactions/syscoin.js +0 -0
  171. /package/{dist/cjs → cjs}/transactions/syscoin.js.map +0 -0
  172. /package/{dist/cjs → cjs}/trezor/index.js +0 -0
  173. /package/{dist/cjs → cjs}/trezor/index.js.map +0 -0
  174. /package/{dist/cjs → cjs}/types.js +0 -0
  175. /package/{dist/cjs → cjs}/types.js.map +0 -0
  176. /package/{dist/cjs → cjs}/utils/derivation-paths.js +0 -0
  177. /package/{dist/cjs → cjs}/utils/derivation-paths.js.map +0 -0
  178. /package/{dist/cjs → cjs}/utils/psbt.js +0 -0
  179. /package/{dist/cjs → cjs}/utils/psbt.js.map +0 -0
  180. /package/{dist/cjs → cjs}/utils.js +0 -0
  181. /package/{dist/cjs → cjs}/utils.js.map +0 -0
  182. /package/{dist/types → types}/errorUtils.d.ts +0 -0
  183. /package/{dist/types → types}/hardware-wallet-manager.d.ts +0 -0
  184. /package/{dist/types → types}/index.d.ts +0 -0
  185. /package/{dist/types → types}/initial-state.d.ts +0 -0
  186. /package/{dist/types → types}/keyring-manager.d.ts +0 -0
  187. /package/{dist/types → types}/ledger/bitcoin_client/index.d.ts +0 -0
  188. /package/{dist/types → types}/ledger/bitcoin_client/lib/appClient.d.ts +0 -0
  189. /package/{dist/types → types}/ledger/bitcoin_client/lib/bip32.d.ts +0 -0
  190. /package/{dist/types → types}/ledger/bitcoin_client/lib/buffertools.d.ts +0 -0
  191. /package/{dist/types → types}/ledger/bitcoin_client/lib/clientCommands.d.ts +0 -0
  192. /package/{dist/types → types}/ledger/bitcoin_client/lib/constants.d.ts +0 -0
  193. /package/{dist/types → types}/ledger/bitcoin_client/lib/merkelizedPsbt.d.ts +0 -0
  194. /package/{dist/types → types}/ledger/bitcoin_client/lib/merkle.d.ts +0 -0
  195. /package/{dist/types → types}/ledger/bitcoin_client/lib/merkleMap.d.ts +0 -0
  196. /package/{dist/types → types}/ledger/bitcoin_client/lib/policy.d.ts +0 -0
  197. /package/{dist/types → types}/ledger/bitcoin_client/lib/psbtv2.d.ts +0 -0
  198. /package/{dist/types → types}/ledger/bitcoin_client/lib/varint.d.ts +0 -0
  199. /package/{dist/types → types}/ledger/consts.d.ts +0 -0
  200. /package/{dist/types → types}/ledger/index.d.ts +0 -0
  201. /package/{dist/types → types}/ledger/types.d.ts +0 -0
  202. /package/{dist/types → types}/network-utils.d.ts +0 -0
  203. /package/{dist/types → types}/signers.d.ts +0 -0
  204. /package/{dist/types → types}/storage.d.ts +0 -0
  205. /package/{dist/types → types}/transactions/__tests__/integration.test.d.ts +0 -0
  206. /package/{dist/types → types}/transactions/__tests__/syscoin.test.d.ts +0 -0
  207. /package/{dist/types → types}/transactions/index.d.ts +0 -0
  208. /package/{dist/types → types}/transactions/syscoin.d.ts +0 -0
  209. /package/{dist/types → types}/trezor/index.d.ts +0 -0
  210. /package/{dist/types → types}/utils/derivation-paths.d.ts +0 -0
  211. /package/{dist/types → types}/utils/psbt.d.ts +0 -0
  212. /package/{dist/types → types}/utils.d.ts +0 -0
@@ -1,1560 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <title>
5
- Code coverage report for src/ledger/bitcoin_client/lib/appClient.ts
6
- </title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../../../prettify.css" />
9
- <link rel="stylesheet" href="../../../../base.css" />
10
- <link
11
- rel="shortcut icon"
12
- type="image/x-icon"
13
- href="../../../../favicon.png"
14
- />
15
- <meta name="viewport" content="width=device-width, initial-scale=1" />
16
- <style type="text/css">
17
- .coverage-summary .sorter {
18
- background-image: url(../../../../sort-arrow-sprite.png);
19
- }
20
- </style>
21
- </head>
22
-
23
- <body>
24
- <div class="wrapper">
25
- <div class="pad1">
26
- <h1>
27
- <a href="../../../../index.html">All files</a> /
28
- <a href="index.html">src/ledger/bitcoin_client/lib</a> appClient.ts
29
- </h1>
30
- <div class="clearfix">
31
- <div class="fl pad1y space-right2">
32
- <span class="strong">15.72% </span>
33
- <span class="quiet">Statements</span>
34
- <span class="fraction">25/159</span>
35
- </div>
36
-
37
- <div class="fl pad1y space-right2">
38
- <span class="strong">7.69% </span>
39
- <span class="quiet">Branches</span>
40
- <span class="fraction">4/52</span>
41
- </div>
42
-
43
- <div class="fl pad1y space-right2">
44
- <span class="strong">11.76% </span>
45
- <span class="quiet">Functions</span>
46
- <span class="fraction">2/17</span>
47
- </div>
48
-
49
- <div class="fl pad1y space-right2">
50
- <span class="strong">16.12% </span>
51
- <span class="quiet">Lines</span>
52
- <span class="fraction">25/155</span>
53
- </div>
54
- </div>
55
- <p class="quiet">
56
- Press <em>n</em> or <em>j</em> to go to the next uncovered block,
57
- <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
58
- </p>
59
- <template id="filterTemplate">
60
- <div class="quiet">
61
- Filter:
62
- <input type="search" id="fileSearch" />
63
- </div>
64
- </template>
65
- </div>
66
- <div class="status-line low"></div>
67
- <pre><table class="coverage">
68
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
69
- <a name='L2'></a><a href='#L2'>2</a>
70
- <a name='L3'></a><a href='#L3'>3</a>
71
- <a name='L4'></a><a href='#L4'>4</a>
72
- <a name='L5'></a><a href='#L5'>5</a>
73
- <a name='L6'></a><a href='#L6'>6</a>
74
- <a name='L7'></a><a href='#L7'>7</a>
75
- <a name='L8'></a><a href='#L8'>8</a>
76
- <a name='L9'></a><a href='#L9'>9</a>
77
- <a name='L10'></a><a href='#L10'>10</a>
78
- <a name='L11'></a><a href='#L11'>11</a>
79
- <a name='L12'></a><a href='#L12'>12</a>
80
- <a name='L13'></a><a href='#L13'>13</a>
81
- <a name='L14'></a><a href='#L14'>14</a>
82
- <a name='L15'></a><a href='#L15'>15</a>
83
- <a name='L16'></a><a href='#L16'>16</a>
84
- <a name='L17'></a><a href='#L17'>17</a>
85
- <a name='L18'></a><a href='#L18'>18</a>
86
- <a name='L19'></a><a href='#L19'>19</a>
87
- <a name='L20'></a><a href='#L20'>20</a>
88
- <a name='L21'></a><a href='#L21'>21</a>
89
- <a name='L22'></a><a href='#L22'>22</a>
90
- <a name='L23'></a><a href='#L23'>23</a>
91
- <a name='L24'></a><a href='#L24'>24</a>
92
- <a name='L25'></a><a href='#L25'>25</a>
93
- <a name='L26'></a><a href='#L26'>26</a>
94
- <a name='L27'></a><a href='#L27'>27</a>
95
- <a name='L28'></a><a href='#L28'>28</a>
96
- <a name='L29'></a><a href='#L29'>29</a>
97
- <a name='L30'></a><a href='#L30'>30</a>
98
- <a name='L31'></a><a href='#L31'>31</a>
99
- <a name='L32'></a><a href='#L32'>32</a>
100
- <a name='L33'></a><a href='#L33'>33</a>
101
- <a name='L34'></a><a href='#L34'>34</a>
102
- <a name='L35'></a><a href='#L35'>35</a>
103
- <a name='L36'></a><a href='#L36'>36</a>
104
- <a name='L37'></a><a href='#L37'>37</a>
105
- <a name='L38'></a><a href='#L38'>38</a>
106
- <a name='L39'></a><a href='#L39'>39</a>
107
- <a name='L40'></a><a href='#L40'>40</a>
108
- <a name='L41'></a><a href='#L41'>41</a>
109
- <a name='L42'></a><a href='#L42'>42</a>
110
- <a name='L43'></a><a href='#L43'>43</a>
111
- <a name='L44'></a><a href='#L44'>44</a>
112
- <a name='L45'></a><a href='#L45'>45</a>
113
- <a name='L46'></a><a href='#L46'>46</a>
114
- <a name='L47'></a><a href='#L47'>47</a>
115
- <a name='L48'></a><a href='#L48'>48</a>
116
- <a name='L49'></a><a href='#L49'>49</a>
117
- <a name='L50'></a><a href='#L50'>50</a>
118
- <a name='L51'></a><a href='#L51'>51</a>
119
- <a name='L52'></a><a href='#L52'>52</a>
120
- <a name='L53'></a><a href='#L53'>53</a>
121
- <a name='L54'></a><a href='#L54'>54</a>
122
- <a name='L55'></a><a href='#L55'>55</a>
123
- <a name='L56'></a><a href='#L56'>56</a>
124
- <a name='L57'></a><a href='#L57'>57</a>
125
- <a name='L58'></a><a href='#L58'>58</a>
126
- <a name='L59'></a><a href='#L59'>59</a>
127
- <a name='L60'></a><a href='#L60'>60</a>
128
- <a name='L61'></a><a href='#L61'>61</a>
129
- <a name='L62'></a><a href='#L62'>62</a>
130
- <a name='L63'></a><a href='#L63'>63</a>
131
- <a name='L64'></a><a href='#L64'>64</a>
132
- <a name='L65'></a><a href='#L65'>65</a>
133
- <a name='L66'></a><a href='#L66'>66</a>
134
- <a name='L67'></a><a href='#L67'>67</a>
135
- <a name='L68'></a><a href='#L68'>68</a>
136
- <a name='L69'></a><a href='#L69'>69</a>
137
- <a name='L70'></a><a href='#L70'>70</a>
138
- <a name='L71'></a><a href='#L71'>71</a>
139
- <a name='L72'></a><a href='#L72'>72</a>
140
- <a name='L73'></a><a href='#L73'>73</a>
141
- <a name='L74'></a><a href='#L74'>74</a>
142
- <a name='L75'></a><a href='#L75'>75</a>
143
- <a name='L76'></a><a href='#L76'>76</a>
144
- <a name='L77'></a><a href='#L77'>77</a>
145
- <a name='L78'></a><a href='#L78'>78</a>
146
- <a name='L79'></a><a href='#L79'>79</a>
147
- <a name='L80'></a><a href='#L80'>80</a>
148
- <a name='L81'></a><a href='#L81'>81</a>
149
- <a name='L82'></a><a href='#L82'>82</a>
150
- <a name='L83'></a><a href='#L83'>83</a>
151
- <a name='L84'></a><a href='#L84'>84</a>
152
- <a name='L85'></a><a href='#L85'>85</a>
153
- <a name='L86'></a><a href='#L86'>86</a>
154
- <a name='L87'></a><a href='#L87'>87</a>
155
- <a name='L88'></a><a href='#L88'>88</a>
156
- <a name='L89'></a><a href='#L89'>89</a>
157
- <a name='L90'></a><a href='#L90'>90</a>
158
- <a name='L91'></a><a href='#L91'>91</a>
159
- <a name='L92'></a><a href='#L92'>92</a>
160
- <a name='L93'></a><a href='#L93'>93</a>
161
- <a name='L94'></a><a href='#L94'>94</a>
162
- <a name='L95'></a><a href='#L95'>95</a>
163
- <a name='L96'></a><a href='#L96'>96</a>
164
- <a name='L97'></a><a href='#L97'>97</a>
165
- <a name='L98'></a><a href='#L98'>98</a>
166
- <a name='L99'></a><a href='#L99'>99</a>
167
- <a name='L100'></a><a href='#L100'>100</a>
168
- <a name='L101'></a><a href='#L101'>101</a>
169
- <a name='L102'></a><a href='#L102'>102</a>
170
- <a name='L103'></a><a href='#L103'>103</a>
171
- <a name='L104'></a><a href='#L104'>104</a>
172
- <a name='L105'></a><a href='#L105'>105</a>
173
- <a name='L106'></a><a href='#L106'>106</a>
174
- <a name='L107'></a><a href='#L107'>107</a>
175
- <a name='L108'></a><a href='#L108'>108</a>
176
- <a name='L109'></a><a href='#L109'>109</a>
177
- <a name='L110'></a><a href='#L110'>110</a>
178
- <a name='L111'></a><a href='#L111'>111</a>
179
- <a name='L112'></a><a href='#L112'>112</a>
180
- <a name='L113'></a><a href='#L113'>113</a>
181
- <a name='L114'></a><a href='#L114'>114</a>
182
- <a name='L115'></a><a href='#L115'>115</a>
183
- <a name='L116'></a><a href='#L116'>116</a>
184
- <a name='L117'></a><a href='#L117'>117</a>
185
- <a name='L118'></a><a href='#L118'>118</a>
186
- <a name='L119'></a><a href='#L119'>119</a>
187
- <a name='L120'></a><a href='#L120'>120</a>
188
- <a name='L121'></a><a href='#L121'>121</a>
189
- <a name='L122'></a><a href='#L122'>122</a>
190
- <a name='L123'></a><a href='#L123'>123</a>
191
- <a name='L124'></a><a href='#L124'>124</a>
192
- <a name='L125'></a><a href='#L125'>125</a>
193
- <a name='L126'></a><a href='#L126'>126</a>
194
- <a name='L127'></a><a href='#L127'>127</a>
195
- <a name='L128'></a><a href='#L128'>128</a>
196
- <a name='L129'></a><a href='#L129'>129</a>
197
- <a name='L130'></a><a href='#L130'>130</a>
198
- <a name='L131'></a><a href='#L131'>131</a>
199
- <a name='L132'></a><a href='#L132'>132</a>
200
- <a name='L133'></a><a href='#L133'>133</a>
201
- <a name='L134'></a><a href='#L134'>134</a>
202
- <a name='L135'></a><a href='#L135'>135</a>
203
- <a name='L136'></a><a href='#L136'>136</a>
204
- <a name='L137'></a><a href='#L137'>137</a>
205
- <a name='L138'></a><a href='#L138'>138</a>
206
- <a name='L139'></a><a href='#L139'>139</a>
207
- <a name='L140'></a><a href='#L140'>140</a>
208
- <a name='L141'></a><a href='#L141'>141</a>
209
- <a name='L142'></a><a href='#L142'>142</a>
210
- <a name='L143'></a><a href='#L143'>143</a>
211
- <a name='L144'></a><a href='#L144'>144</a>
212
- <a name='L145'></a><a href='#L145'>145</a>
213
- <a name='L146'></a><a href='#L146'>146</a>
214
- <a name='L147'></a><a href='#L147'>147</a>
215
- <a name='L148'></a><a href='#L148'>148</a>
216
- <a name='L149'></a><a href='#L149'>149</a>
217
- <a name='L150'></a><a href='#L150'>150</a>
218
- <a name='L151'></a><a href='#L151'>151</a>
219
- <a name='L152'></a><a href='#L152'>152</a>
220
- <a name='L153'></a><a href='#L153'>153</a>
221
- <a name='L154'></a><a href='#L154'>154</a>
222
- <a name='L155'></a><a href='#L155'>155</a>
223
- <a name='L156'></a><a href='#L156'>156</a>
224
- <a name='L157'></a><a href='#L157'>157</a>
225
- <a name='L158'></a><a href='#L158'>158</a>
226
- <a name='L159'></a><a href='#L159'>159</a>
227
- <a name='L160'></a><a href='#L160'>160</a>
228
- <a name='L161'></a><a href='#L161'>161</a>
229
- <a name='L162'></a><a href='#L162'>162</a>
230
- <a name='L163'></a><a href='#L163'>163</a>
231
- <a name='L164'></a><a href='#L164'>164</a>
232
- <a name='L165'></a><a href='#L165'>165</a>
233
- <a name='L166'></a><a href='#L166'>166</a>
234
- <a name='L167'></a><a href='#L167'>167</a>
235
- <a name='L168'></a><a href='#L168'>168</a>
236
- <a name='L169'></a><a href='#L169'>169</a>
237
- <a name='L170'></a><a href='#L170'>170</a>
238
- <a name='L171'></a><a href='#L171'>171</a>
239
- <a name='L172'></a><a href='#L172'>172</a>
240
- <a name='L173'></a><a href='#L173'>173</a>
241
- <a name='L174'></a><a href='#L174'>174</a>
242
- <a name='L175'></a><a href='#L175'>175</a>
243
- <a name='L176'></a><a href='#L176'>176</a>
244
- <a name='L177'></a><a href='#L177'>177</a>
245
- <a name='L178'></a><a href='#L178'>178</a>
246
- <a name='L179'></a><a href='#L179'>179</a>
247
- <a name='L180'></a><a href='#L180'>180</a>
248
- <a name='L181'></a><a href='#L181'>181</a>
249
- <a name='L182'></a><a href='#L182'>182</a>
250
- <a name='L183'></a><a href='#L183'>183</a>
251
- <a name='L184'></a><a href='#L184'>184</a>
252
- <a name='L185'></a><a href='#L185'>185</a>
253
- <a name='L186'></a><a href='#L186'>186</a>
254
- <a name='L187'></a><a href='#L187'>187</a>
255
- <a name='L188'></a><a href='#L188'>188</a>
256
- <a name='L189'></a><a href='#L189'>189</a>
257
- <a name='L190'></a><a href='#L190'>190</a>
258
- <a name='L191'></a><a href='#L191'>191</a>
259
- <a name='L192'></a><a href='#L192'>192</a>
260
- <a name='L193'></a><a href='#L193'>193</a>
261
- <a name='L194'></a><a href='#L194'>194</a>
262
- <a name='L195'></a><a href='#L195'>195</a>
263
- <a name='L196'></a><a href='#L196'>196</a>
264
- <a name='L197'></a><a href='#L197'>197</a>
265
- <a name='L198'></a><a href='#L198'>198</a>
266
- <a name='L199'></a><a href='#L199'>199</a>
267
- <a name='L200'></a><a href='#L200'>200</a>
268
- <a name='L201'></a><a href='#L201'>201</a>
269
- <a name='L202'></a><a href='#L202'>202</a>
270
- <a name='L203'></a><a href='#L203'>203</a>
271
- <a name='L204'></a><a href='#L204'>204</a>
272
- <a name='L205'></a><a href='#L205'>205</a>
273
- <a name='L206'></a><a href='#L206'>206</a>
274
- <a name='L207'></a><a href='#L207'>207</a>
275
- <a name='L208'></a><a href='#L208'>208</a>
276
- <a name='L209'></a><a href='#L209'>209</a>
277
- <a name='L210'></a><a href='#L210'>210</a>
278
- <a name='L211'></a><a href='#L211'>211</a>
279
- <a name='L212'></a><a href='#L212'>212</a>
280
- <a name='L213'></a><a href='#L213'>213</a>
281
- <a name='L214'></a><a href='#L214'>214</a>
282
- <a name='L215'></a><a href='#L215'>215</a>
283
- <a name='L216'></a><a href='#L216'>216</a>
284
- <a name='L217'></a><a href='#L217'>217</a>
285
- <a name='L218'></a><a href='#L218'>218</a>
286
- <a name='L219'></a><a href='#L219'>219</a>
287
- <a name='L220'></a><a href='#L220'>220</a>
288
- <a name='L221'></a><a href='#L221'>221</a>
289
- <a name='L222'></a><a href='#L222'>222</a>
290
- <a name='L223'></a><a href='#L223'>223</a>
291
- <a name='L224'></a><a href='#L224'>224</a>
292
- <a name='L225'></a><a href='#L225'>225</a>
293
- <a name='L226'></a><a href='#L226'>226</a>
294
- <a name='L227'></a><a href='#L227'>227</a>
295
- <a name='L228'></a><a href='#L228'>228</a>
296
- <a name='L229'></a><a href='#L229'>229</a>
297
- <a name='L230'></a><a href='#L230'>230</a>
298
- <a name='L231'></a><a href='#L231'>231</a>
299
- <a name='L232'></a><a href='#L232'>232</a>
300
- <a name='L233'></a><a href='#L233'>233</a>
301
- <a name='L234'></a><a href='#L234'>234</a>
302
- <a name='L235'></a><a href='#L235'>235</a>
303
- <a name='L236'></a><a href='#L236'>236</a>
304
- <a name='L237'></a><a href='#L237'>237</a>
305
- <a name='L238'></a><a href='#L238'>238</a>
306
- <a name='L239'></a><a href='#L239'>239</a>
307
- <a name='L240'></a><a href='#L240'>240</a>
308
- <a name='L241'></a><a href='#L241'>241</a>
309
- <a name='L242'></a><a href='#L242'>242</a>
310
- <a name='L243'></a><a href='#L243'>243</a>
311
- <a name='L244'></a><a href='#L244'>244</a>
312
- <a name='L245'></a><a href='#L245'>245</a>
313
- <a name='L246'></a><a href='#L246'>246</a>
314
- <a name='L247'></a><a href='#L247'>247</a>
315
- <a name='L248'></a><a href='#L248'>248</a>
316
- <a name='L249'></a><a href='#L249'>249</a>
317
- <a name='L250'></a><a href='#L250'>250</a>
318
- <a name='L251'></a><a href='#L251'>251</a>
319
- <a name='L252'></a><a href='#L252'>252</a>
320
- <a name='L253'></a><a href='#L253'>253</a>
321
- <a name='L254'></a><a href='#L254'>254</a>
322
- <a name='L255'></a><a href='#L255'>255</a>
323
- <a name='L256'></a><a href='#L256'>256</a>
324
- <a name='L257'></a><a href='#L257'>257</a>
325
- <a name='L258'></a><a href='#L258'>258</a>
326
- <a name='L259'></a><a href='#L259'>259</a>
327
- <a name='L260'></a><a href='#L260'>260</a>
328
- <a name='L261'></a><a href='#L261'>261</a>
329
- <a name='L262'></a><a href='#L262'>262</a>
330
- <a name='L263'></a><a href='#L263'>263</a>
331
- <a name='L264'></a><a href='#L264'>264</a>
332
- <a name='L265'></a><a href='#L265'>265</a>
333
- <a name='L266'></a><a href='#L266'>266</a>
334
- <a name='L267'></a><a href='#L267'>267</a>
335
- <a name='L268'></a><a href='#L268'>268</a>
336
- <a name='L269'></a><a href='#L269'>269</a>
337
- <a name='L270'></a><a href='#L270'>270</a>
338
- <a name='L271'></a><a href='#L271'>271</a>
339
- <a name='L272'></a><a href='#L272'>272</a>
340
- <a name='L273'></a><a href='#L273'>273</a>
341
- <a name='L274'></a><a href='#L274'>274</a>
342
- <a name='L275'></a><a href='#L275'>275</a>
343
- <a name='L276'></a><a href='#L276'>276</a>
344
- <a name='L277'></a><a href='#L277'>277</a>
345
- <a name='L278'></a><a href='#L278'>278</a>
346
- <a name='L279'></a><a href='#L279'>279</a>
347
- <a name='L280'></a><a href='#L280'>280</a>
348
- <a name='L281'></a><a href='#L281'>281</a>
349
- <a name='L282'></a><a href='#L282'>282</a>
350
- <a name='L283'></a><a href='#L283'>283</a>
351
- <a name='L284'></a><a href='#L284'>284</a>
352
- <a name='L285'></a><a href='#L285'>285</a>
353
- <a name='L286'></a><a href='#L286'>286</a>
354
- <a name='L287'></a><a href='#L287'>287</a>
355
- <a name='L288'></a><a href='#L288'>288</a>
356
- <a name='L289'></a><a href='#L289'>289</a>
357
- <a name='L290'></a><a href='#L290'>290</a>
358
- <a name='L291'></a><a href='#L291'>291</a>
359
- <a name='L292'></a><a href='#L292'>292</a>
360
- <a name='L293'></a><a href='#L293'>293</a>
361
- <a name='L294'></a><a href='#L294'>294</a>
362
- <a name='L295'></a><a href='#L295'>295</a>
363
- <a name='L296'></a><a href='#L296'>296</a>
364
- <a name='L297'></a><a href='#L297'>297</a>
365
- <a name='L298'></a><a href='#L298'>298</a>
366
- <a name='L299'></a><a href='#L299'>299</a>
367
- <a name='L300'></a><a href='#L300'>300</a>
368
- <a name='L301'></a><a href='#L301'>301</a>
369
- <a name='L302'></a><a href='#L302'>302</a>
370
- <a name='L303'></a><a href='#L303'>303</a>
371
- <a name='L304'></a><a href='#L304'>304</a>
372
- <a name='L305'></a><a href='#L305'>305</a>
373
- <a name='L306'></a><a href='#L306'>306</a>
374
- <a name='L307'></a><a href='#L307'>307</a>
375
- <a name='L308'></a><a href='#L308'>308</a>
376
- <a name='L309'></a><a href='#L309'>309</a>
377
- <a name='L310'></a><a href='#L310'>310</a>
378
- <a name='L311'></a><a href='#L311'>311</a>
379
- <a name='L312'></a><a href='#L312'>312</a>
380
- <a name='L313'></a><a href='#L313'>313</a>
381
- <a name='L314'></a><a href='#L314'>314</a>
382
- <a name='L315'></a><a href='#L315'>315</a>
383
- <a name='L316'></a><a href='#L316'>316</a>
384
- <a name='L317'></a><a href='#L317'>317</a>
385
- <a name='L318'></a><a href='#L318'>318</a>
386
- <a name='L319'></a><a href='#L319'>319</a>
387
- <a name='L320'></a><a href='#L320'>320</a>
388
- <a name='L321'></a><a href='#L321'>321</a>
389
- <a name='L322'></a><a href='#L322'>322</a>
390
- <a name='L323'></a><a href='#L323'>323</a>
391
- <a name='L324'></a><a href='#L324'>324</a>
392
- <a name='L325'></a><a href='#L325'>325</a>
393
- <a name='L326'></a><a href='#L326'>326</a>
394
- <a name='L327'></a><a href='#L327'>327</a>
395
- <a name='L328'></a><a href='#L328'>328</a>
396
- <a name='L329'></a><a href='#L329'>329</a>
397
- <a name='L330'></a><a href='#L330'>330</a>
398
- <a name='L331'></a><a href='#L331'>331</a>
399
- <a name='L332'></a><a href='#L332'>332</a>
400
- <a name='L333'></a><a href='#L333'>333</a>
401
- <a name='L334'></a><a href='#L334'>334</a>
402
- <a name='L335'></a><a href='#L335'>335</a>
403
- <a name='L336'></a><a href='#L336'>336</a>
404
- <a name='L337'></a><a href='#L337'>337</a>
405
- <a name='L338'></a><a href='#L338'>338</a>
406
- <a name='L339'></a><a href='#L339'>339</a>
407
- <a name='L340'></a><a href='#L340'>340</a>
408
- <a name='L341'></a><a href='#L341'>341</a>
409
- <a name='L342'></a><a href='#L342'>342</a>
410
- <a name='L343'></a><a href='#L343'>343</a>
411
- <a name='L344'></a><a href='#L344'>344</a>
412
- <a name='L345'></a><a href='#L345'>345</a>
413
- <a name='L346'></a><a href='#L346'>346</a>
414
- <a name='L347'></a><a href='#L347'>347</a>
415
- <a name='L348'></a><a href='#L348'>348</a>
416
- <a name='L349'></a><a href='#L349'>349</a>
417
- <a name='L350'></a><a href='#L350'>350</a>
418
- <a name='L351'></a><a href='#L351'>351</a>
419
- <a name='L352'></a><a href='#L352'>352</a>
420
- <a name='L353'></a><a href='#L353'>353</a>
421
- <a name='L354'></a><a href='#L354'>354</a>
422
- <a name='L355'></a><a href='#L355'>355</a>
423
- <a name='L356'></a><a href='#L356'>356</a>
424
- <a name='L357'></a><a href='#L357'>357</a>
425
- <a name='L358'></a><a href='#L358'>358</a>
426
- <a name='L359'></a><a href='#L359'>359</a>
427
- <a name='L360'></a><a href='#L360'>360</a>
428
- <a name='L361'></a><a href='#L361'>361</a>
429
- <a name='L362'></a><a href='#L362'>362</a>
430
- <a name='L363'></a><a href='#L363'>363</a>
431
- <a name='L364'></a><a href='#L364'>364</a>
432
- <a name='L365'></a><a href='#L365'>365</a>
433
- <a name='L366'></a><a href='#L366'>366</a>
434
- <a name='L367'></a><a href='#L367'>367</a>
435
- <a name='L368'></a><a href='#L368'>368</a>
436
- <a name='L369'></a><a href='#L369'>369</a>
437
- <a name='L370'></a><a href='#L370'>370</a>
438
- <a name='L371'></a><a href='#L371'>371</a>
439
- <a name='L372'></a><a href='#L372'>372</a>
440
- <a name='L373'></a><a href='#L373'>373</a>
441
- <a name='L374'></a><a href='#L374'>374</a>
442
- <a name='L375'></a><a href='#L375'>375</a>
443
- <a name='L376'></a><a href='#L376'>376</a>
444
- <a name='L377'></a><a href='#L377'>377</a>
445
- <a name='L378'></a><a href='#L378'>378</a>
446
- <a name='L379'></a><a href='#L379'>379</a>
447
- <a name='L380'></a><a href='#L380'>380</a>
448
- <a name='L381'></a><a href='#L381'>381</a>
449
- <a name='L382'></a><a href='#L382'>382</a>
450
- <a name='L383'></a><a href='#L383'>383</a>
451
- <a name='L384'></a><a href='#L384'>384</a>
452
- <a name='L385'></a><a href='#L385'>385</a>
453
- <a name='L386'></a><a href='#L386'>386</a>
454
- <a name='L387'></a><a href='#L387'>387</a>
455
- <a name='L388'></a><a href='#L388'>388</a>
456
- <a name='L389'></a><a href='#L389'>389</a>
457
- <a name='L390'></a><a href='#L390'>390</a>
458
- <a name='L391'></a><a href='#L391'>391</a>
459
- <a name='L392'></a><a href='#L392'>392</a>
460
- <a name='L393'></a><a href='#L393'>393</a>
461
- <a name='L394'></a><a href='#L394'>394</a>
462
- <a name='L395'></a><a href='#L395'>395</a>
463
- <a name='L396'></a><a href='#L396'>396</a>
464
- <a name='L397'></a><a href='#L397'>397</a>
465
- <a name='L398'></a><a href='#L398'>398</a>
466
- <a name='L399'></a><a href='#L399'>399</a>
467
- <a name='L400'></a><a href='#L400'>400</a>
468
- <a name='L401'></a><a href='#L401'>401</a>
469
- <a name='L402'></a><a href='#L402'>402</a>
470
- <a name='L403'></a><a href='#L403'>403</a>
471
- <a name='L404'></a><a href='#L404'>404</a>
472
- <a name='L405'></a><a href='#L405'>405</a>
473
- <a name='L406'></a><a href='#L406'>406</a>
474
- <a name='L407'></a><a href='#L407'>407</a>
475
- <a name='L408'></a><a href='#L408'>408</a>
476
- <a name='L409'></a><a href='#L409'>409</a>
477
- <a name='L410'></a><a href='#L410'>410</a>
478
- <a name='L411'></a><a href='#L411'>411</a>
479
- <a name='L412'></a><a href='#L412'>412</a>
480
- <a name='L413'></a><a href='#L413'>413</a>
481
- <a name='L414'></a><a href='#L414'>414</a>
482
- <a name='L415'></a><a href='#L415'>415</a>
483
- <a name='L416'></a><a href='#L416'>416</a>
484
- <a name='L417'></a><a href='#L417'>417</a>
485
- <a name='L418'></a><a href='#L418'>418</a>
486
- <a name='L419'></a><a href='#L419'>419</a>
487
- <a name='L420'></a><a href='#L420'>420</a>
488
- <a name='L421'></a><a href='#L421'>421</a>
489
- <a name='L422'></a><a href='#L422'>422</a>
490
- <a name='L423'></a><a href='#L423'>423</a>
491
- <a name='L424'></a><a href='#L424'>424</a>
492
- <a name='L425'></a><a href='#L425'>425</a>
493
- <a name='L426'></a><a href='#L426'>426</a>
494
- <a name='L427'></a><a href='#L427'>427</a>
495
- <a name='L428'></a><a href='#L428'>428</a>
496
- <a name='L429'></a><a href='#L429'>429</a>
497
- <a name='L430'></a><a href='#L430'>430</a>
498
- <a name='L431'></a><a href='#L431'>431</a>
499
- <a name='L432'></a><a href='#L432'>432</a>
500
- <a name='L433'></a><a href='#L433'>433</a>
501
- <a name='L434'></a><a href='#L434'>434</a>
502
- <a name='L435'></a><a href='#L435'>435</a>
503
- <a name='L436'></a><a href='#L436'>436</a>
504
- <a name='L437'></a><a href='#L437'>437</a>
505
- <a name='L438'></a><a href='#L438'>438</a>
506
- <a name='L439'></a><a href='#L439'>439</a>
507
- <a name='L440'></a><a href='#L440'>440</a>
508
- <a name='L441'></a><a href='#L441'>441</a>
509
- <a name='L442'></a><a href='#L442'>442</a>
510
- <a name='L443'></a><a href='#L443'>443</a>
511
- <a name='L444'></a><a href='#L444'>444</a>
512
- <a name='L445'></a><a href='#L445'>445</a>
513
- <a name='L446'></a><a href='#L446'>446</a>
514
- <a name='L447'></a><a href='#L447'>447</a>
515
- <a name='L448'></a><a href='#L448'>448</a>
516
- <a name='L449'></a><a href='#L449'>449</a>
517
- <a name='L450'></a><a href='#L450'>450</a>
518
- <a name='L451'></a><a href='#L451'>451</a>
519
- <a name='L452'></a><a href='#L452'>452</a>
520
- <a name='L453'></a><a href='#L453'>453</a>
521
- <a name='L454'></a><a href='#L454'>454</a>
522
- <a name='L455'></a><a href='#L455'>455</a>
523
- <a name='L456'></a><a href='#L456'>456</a>
524
- <a name='L457'></a><a href='#L457'>457</a>
525
- <a name='L458'></a><a href='#L458'>458</a>
526
- <a name='L459'></a><a href='#L459'>459</a>
527
- <a name='L460'></a><a href='#L460'>460</a>
528
- <a name='L461'></a><a href='#L461'>461</a>
529
- <a name='L462'></a><a href='#L462'>462</a>
530
- <a name='L463'></a><a href='#L463'>463</a>
531
- <a name='L464'></a><a href='#L464'>464</a>
532
- <a name='L465'></a><a href='#L465'>465</a>
533
- <a name='L466'></a><a href='#L466'>466</a>
534
- <a name='L467'></a><a href='#L467'>467</a>
535
- <a name='L468'></a><a href='#L468'>468</a>
536
- <a name='L469'></a><a href='#L469'>469</a>
537
- <a name='L470'></a><a href='#L470'>470</a>
538
- <a name='L471'></a><a href='#L471'>471</a>
539
- <a name='L472'></a><a href='#L472'>472</a>
540
- <a name='L473'></a><a href='#L473'>473</a>
541
- <a name='L474'></a><a href='#L474'>474</a>
542
- <a name='L475'></a><a href='#L475'>475</a>
543
- <a name='L476'></a><a href='#L476'>476</a>
544
- <a name='L477'></a><a href='#L477'>477</a>
545
- <a name='L478'></a><a href='#L478'>478</a>
546
- <a name='L479'></a><a href='#L479'>479</a>
547
- <a name='L480'></a><a href='#L480'>480</a>
548
- <a name='L481'></a><a href='#L481'>481</a>
549
- <a name='L482'></a><a href='#L482'>482</a>
550
- <a name='L483'></a><a href='#L483'>483</a>
551
- <a name='L484'></a><a href='#L484'>484</a>
552
- <a name='L485'></a><a href='#L485'>485</a>
553
- <a name='L486'></a><a href='#L486'>486</a>
554
- <a name='L487'></a><a href='#L487'>487</a>
555
- <a name='L488'></a><a href='#L488'>488</a>
556
- <a name='L489'></a><a href='#L489'>489</a>
557
- <a name='L490'></a><a href='#L490'>490</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
558
- <span class="cline-any cline-yes">2x</span>
559
- <span class="cline-any cline-yes">2x</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-yes">2x</span>
563
- <span class="cline-any cline-yes">2x</span>
564
- <span class="cline-any cline-yes">2x</span>
565
- <span class="cline-any cline-yes">2x</span>
566
- <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-yes">2x</span>
568
- <span class="cline-any cline-yes">2x</span>
569
- <span class="cline-any cline-yes">2x</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">2x</span>
572
- <span class="cline-any cline-yes">2x</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-yes">2x</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-yes">2x</span>
577
- <span class="cline-any cline-yes">2x</span>
578
- <span class="cline-any cline-yes">2x</span>
579
- <span class="cline-any cline-yes">2x</span>
580
- <span class="cline-any cline-yes">2x</span>
581
- <span class="cline-any cline-yes">2x</span>
582
- <span class="cline-any cline-yes">2x</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-yes">2x</span>
586
- <span class="cline-any cline-yes">2x</span>
587
- <span class="cline-any cline-neutral">&nbsp;</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-yes">2x</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-neutral">&nbsp;</span>
606
- <span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-neutral">&nbsp;</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-no">&nbsp;</span>
620
- <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-no">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-neutral">&nbsp;</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-neutral">&nbsp;</span>
635
- <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-yes">2x</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-neutral">&nbsp;</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-neutral">&nbsp;</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-neutral">&nbsp;</span>
655
- <span class="cline-any cline-neutral">&nbsp;</span>
656
- <span class="cline-any cline-neutral">&nbsp;</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-neutral">&nbsp;</span>
669
- <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-neutral">&nbsp;</span>
671
- <span class="cline-any cline-neutral">&nbsp;</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-no">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-neutral">&nbsp;</span>
683
- <span class="cline-any cline-neutral">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-neutral">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-no">&nbsp;</span>
692
- <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-no">&nbsp;</span>
694
- <span class="cline-any cline-no">&nbsp;</span>
695
- <span class="cline-any cline-no">&nbsp;</span>
696
- <span class="cline-any cline-no">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
700
- <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-neutral">&nbsp;</span>
708
- <span class="cline-any cline-neutral">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-no">&nbsp;</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-no">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-neutral">&nbsp;</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-neutral">&nbsp;</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-no">&nbsp;</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-no">&nbsp;</span>
745
- <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-no">&nbsp;</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-neutral">&nbsp;</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-neutral">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-neutral">&nbsp;</span>
769
- <span class="cline-any cline-neutral">&nbsp;</span>
770
- <span class="cline-any cline-neutral">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-neutral">&nbsp;</span>
782
- <span class="cline-any cline-neutral">&nbsp;</span>
783
- <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-neutral">&nbsp;</span>
785
- <span class="cline-any cline-neutral">&nbsp;</span>
786
- <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-no">&nbsp;</span>
798
- <span class="cline-any cline-no">&nbsp;</span>
799
- <span class="cline-any cline-no">&nbsp;</span>
800
- <span class="cline-any cline-no">&nbsp;</span>
801
- <span class="cline-any cline-neutral">&nbsp;</span>
802
- <span class="cline-any cline-no">&nbsp;</span>
803
- <span class="cline-any cline-no">&nbsp;</span>
804
- <span class="cline-any cline-neutral">&nbsp;</span>
805
- <span class="cline-any cline-neutral">&nbsp;</span>
806
- <span class="cline-any cline-no">&nbsp;</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-no">&nbsp;</span>
809
- <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-no">&nbsp;</span>
811
- <span class="cline-any cline-no">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-no">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-neutral">&nbsp;</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-no">&nbsp;</span>
826
- <span class="cline-any cline-no">&nbsp;</span>
827
- <span class="cline-any cline-no">&nbsp;</span>
828
- <span class="cline-any cline-neutral">&nbsp;</span>
829
- <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-neutral">&nbsp;</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-neutral">&nbsp;</span>
836
- <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-neutral">&nbsp;</span>
839
- <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-neutral">&nbsp;</span>
842
- <span class="cline-any cline-neutral">&nbsp;</span>
843
- <span class="cline-any cline-neutral">&nbsp;</span>
844
- <span class="cline-any cline-neutral">&nbsp;</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-neutral">&nbsp;</span>
849
- <span class="cline-any cline-no">&nbsp;</span>
850
- <span class="cline-any cline-no">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-no">&nbsp;</span>
854
- <span class="cline-any cline-no">&nbsp;</span>
855
- <span class="cline-any cline-no">&nbsp;</span>
856
- <span class="cline-any cline-no">&nbsp;</span>
857
- <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-no">&nbsp;</span>
860
- <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-no">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-no">&nbsp;</span>
866
- <span class="cline-any cline-neutral">&nbsp;</span>
867
- <span class="cline-any cline-neutral">&nbsp;</span>
868
- <span class="cline-any cline-no">&nbsp;</span>
869
- <span class="cline-any cline-neutral">&nbsp;</span>
870
- <span class="cline-any cline-no">&nbsp;</span>
871
- <span class="cline-any cline-no">&nbsp;</span>
872
- <span class="cline-any cline-no">&nbsp;</span>
873
- <span class="cline-any cline-neutral">&nbsp;</span>
874
- <span class="cline-any cline-no">&nbsp;</span>
875
- <span class="cline-any cline-no">&nbsp;</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-neutral">&nbsp;</span>
878
- <span class="cline-any cline-no">&nbsp;</span>
879
- <span class="cline-any cline-no">&nbsp;</span>
880
- <span class="cline-any cline-no">&nbsp;</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-no">&nbsp;</span>
884
- <span class="cline-any cline-no">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-neutral">&nbsp;</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-neutral">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-neutral">&nbsp;</span>
893
- <span class="cline-any cline-neutral">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-no">&nbsp;</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-no">&nbsp;</span>
904
- <span class="cline-any cline-no">&nbsp;</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-neutral">&nbsp;</span>
907
- <span class="cline-any cline-no">&nbsp;</span>
908
- <span class="cline-any cline-no">&nbsp;</span>
909
- <span class="cline-any cline-no">&nbsp;</span>
910
- <span class="cline-any cline-neutral">&nbsp;</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-no">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-no">&nbsp;</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-no">&nbsp;</span>
918
- <span class="cline-any cline-neutral">&nbsp;</span>
919
- <span class="cline-any cline-no">&nbsp;</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-no">&nbsp;</span>
928
- <span class="cline-any cline-neutral">&nbsp;</span>
929
- <span class="cline-any cline-neutral">&nbsp;</span>
930
- <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-neutral">&nbsp;</span>
933
- <span class="cline-any cline-neutral">&nbsp;</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-neutral">&nbsp;</span>
937
- <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-neutral">&nbsp;</span>
943
- <span class="cline-any cline-neutral">&nbsp;</span>
944
- <span class="cline-any cline-neutral">&nbsp;</span>
945
- <span class="cline-any cline-neutral">&nbsp;</span>
946
- <span class="cline-any cline-no">&nbsp;</span>
947
- <span class="cline-any cline-neutral">&nbsp;</span>
948
- <span class="cline-any cline-no">&nbsp;</span>
949
- <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-neutral">&nbsp;</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
952
- <span class="cline-any cline-no">&nbsp;</span>
953
- <span class="cline-any cline-no">&nbsp;</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-neutral">&nbsp;</span>
956
- <span class="cline-any cline-neutral">&nbsp;</span>
957
- <span class="cline-any cline-no">&nbsp;</span>
958
- <span class="cline-any cline-no">&nbsp;</span>
959
- <span class="cline-any cline-neutral">&nbsp;</span>
960
- <span class="cline-any cline-no">&nbsp;</span>
961
- <span class="cline-any cline-neutral">&nbsp;</span>
962
- <span class="cline-any cline-neutral">&nbsp;</span>
963
- <span class="cline-any cline-neutral">&nbsp;</span>
964
- <span class="cline-any cline-neutral">&nbsp;</span>
965
- <span class="cline-any cline-neutral">&nbsp;</span>
966
- <span class="cline-any cline-neutral">&nbsp;</span>
967
- <span class="cline-any cline-neutral">&nbsp;</span>
968
- <span class="cline-any cline-neutral">&nbsp;</span>
969
- <span class="cline-any cline-neutral">&nbsp;</span>
970
- <span class="cline-any cline-no">&nbsp;</span>
971
- <span class="cline-any cline-neutral">&nbsp;</span>
972
- <span class="cline-any cline-neutral">&nbsp;</span>
973
- <span class="cline-any cline-neutral">&nbsp;</span>
974
- <span class="cline-any cline-neutral">&nbsp;</span>
975
- <span class="cline-any cline-neutral">&nbsp;</span>
976
- <span class="cline-any cline-neutral">&nbsp;</span>
977
- <span class="cline-any cline-neutral">&nbsp;</span>
978
- <span class="cline-any cline-neutral">&nbsp;</span>
979
- <span class="cline-any cline-neutral">&nbsp;</span>
980
- <span class="cline-any cline-no">&nbsp;</span>
981
- <span class="cline-any cline-no">&nbsp;</span>
982
- <span class="cline-any cline-no">&nbsp;</span>
983
- <span class="cline-any cline-no">&nbsp;</span>
984
- <span class="cline-any cline-no">&nbsp;</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-neutral">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-no">&nbsp;</span>
990
- <span class="cline-any cline-no">&nbsp;</span>
991
- <span class="cline-any cline-neutral">&nbsp;</span>
992
- <span class="cline-any cline-no">&nbsp;</span>
993
- <span class="cline-any cline-neutral">&nbsp;</span>
994
- <span class="cline-any cline-neutral">&nbsp;</span>
995
- <span class="cline-any cline-neutral">&nbsp;</span>
996
- <span class="cline-any cline-no">&nbsp;</span>
997
- <span class="cline-any cline-neutral">&nbsp;</span>
998
- <span class="cline-any cline-no">&nbsp;</span>
999
- <span class="cline-any cline-no">&nbsp;</span>
1000
- <span class="cline-any cline-neutral">&nbsp;</span>
1001
- <span class="cline-any cline-no">&nbsp;</span>
1002
- <span class="cline-any cline-no">&nbsp;</span>
1003
- <span class="cline-any cline-no">&nbsp;</span>
1004
- <span class="cline-any cline-neutral">&nbsp;</span>
1005
- <span class="cline-any cline-neutral">&nbsp;</span>
1006
- <span class="cline-any cline-no">&nbsp;</span>
1007
- <span class="cline-any cline-neutral">&nbsp;</span>
1008
- <span class="cline-any cline-neutral">&nbsp;</span>
1009
- <span class="cline-any cline-no">&nbsp;</span>
1010
- <span class="cline-any cline-no">&nbsp;</span>
1011
- <span class="cline-any cline-neutral">&nbsp;</span>
1012
- <span class="cline-any cline-neutral">&nbsp;</span>
1013
- <span class="cline-any cline-neutral">&nbsp;</span>
1014
- <span class="cline-any cline-no">&nbsp;</span>
1015
- <span class="cline-any cline-no">&nbsp;</span>
1016
- <span class="cline-any cline-no">&nbsp;</span>
1017
- <span class="cline-any cline-no">&nbsp;</span>
1018
- <span class="cline-any cline-neutral">&nbsp;</span>
1019
- <span class="cline-any cline-neutral">&nbsp;</span>
1020
- <span class="cline-any cline-neutral">&nbsp;</span>
1021
- <span class="cline-any cline-neutral">&nbsp;</span>
1022
- <span class="cline-any cline-neutral">&nbsp;</span>
1023
- <span class="cline-any cline-neutral">&nbsp;</span>
1024
- <span class="cline-any cline-neutral">&nbsp;</span>
1025
- <span class="cline-any cline-neutral">&nbsp;</span>
1026
- <span class="cline-any cline-neutral">&nbsp;</span>
1027
- <span class="cline-any cline-neutral">&nbsp;</span>
1028
- <span class="cline-any cline-neutral">&nbsp;</span>
1029
- <span class="cline-any cline-neutral">&nbsp;</span>
1030
- <span class="cline-any cline-neutral">&nbsp;</span>
1031
- <span class="cline-any cline-neutral">&nbsp;</span>
1032
- <span class="cline-any cline-neutral">&nbsp;</span>
1033
- <span class="cline-any cline-no">&nbsp;</span>
1034
- <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-no">&nbsp;</span>
1036
- <span class="cline-any cline-neutral">&nbsp;</span>
1037
- <span class="cline-any cline-neutral">&nbsp;</span>
1038
- <span class="cline-any cline-neutral">&nbsp;</span>
1039
- <span class="cline-any cline-no">&nbsp;</span>
1040
- <span class="cline-any cline-neutral">&nbsp;</span>
1041
- <span class="cline-any cline-neutral">&nbsp;</span>
1042
- <span class="cline-any cline-neutral">&nbsp;</span>
1043
- <span class="cline-any cline-neutral">&nbsp;</span>
1044
- <span class="cline-any cline-neutral">&nbsp;</span>
1045
- <span class="cline-any cline-yes">2x</span>
1046
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as descriptors from '@bitcoinerlab/descriptors';
1047
- import * as secp256k1 from '@bitcoinerlab/secp256k1';
1048
- const { Descriptor } = descriptors.DescriptorsFactory(secp256k1);
1049
- import Transport from '@ledgerhq/hw-transport';
1050
- &nbsp;
1051
- import { pathElementsToBuffer, pathStringToArray } from './bip32';
1052
- import { ClientCommandInterpreter } from './clientCommands';
1053
- import { MerkelizedPsbt } from './merkelizedPsbt';
1054
- import { hashLeaf, Merkle } from './merkle';
1055
- import { WalletPolicy } from './policy';
1056
- import { PsbtV2 } from './psbtv2';
1057
- import { createVarint, parseVarint } from './varint';
1058
- import { SYSCOIN_NETWORKS } from '../../../ledger/consts';
1059
- &nbsp;
1060
- const CLA_BTC = 0xe1;
1061
- const CLA_FRAMEWORK = 0xf8;
1062
- &nbsp;
1063
- const CURRENT_PROTOCOL_VERSION = 1; // supported from version 2.1.0 of the app
1064
- &nbsp;
1065
- enum BitcoinIns {
1066
- GET_PUBKEY = 0x00,
1067
- REGISTER_WALLET = 0x02,
1068
- GET_WALLET_ADDRESS = 0x03,
1069
- SIGN_PSBT = 0x04,
1070
- GET_MASTER_FINGERPRINT = 0x05,
1071
- SIGN_MESSAGE = 0x10,
1072
- }
1073
- &nbsp;
1074
- enum FrameworkIns {
1075
- CONTINUE_INTERRUPTED = 0x01,
1076
- }
1077
- &nbsp;
1078
- /**
1079
- * This class represents a partial signature produced by the app during signing.
1080
- * It always contains the `signature` and the corresponding `pubkey` whose private key
1081
- * was used for signing; in the case of taproot script paths, it also contains the
1082
- * tapleaf hash.
1083
- */
1084
- export class PartialSignature {
1085
- readonly pubkey: Buffer;
1086
- readonly signature: Buffer;
1087
- readonly tapleafHash?: Buffer;
1088
- &nbsp;
1089
- <span class="fstat-no" title="function not covered" > constructor(p</span>ubkey: Buffer, signature: Buffer, tapleafHash?: Buffer) {
1090
- <span class="cstat-no" title="statement not covered" > this.pubkey = pubkey;</span>
1091
- <span class="cstat-no" title="statement not covered" > this.signature = signature;</span>
1092
- <span class="cstat-no" title="statement not covered" > this.tapleafHash = tapleafHash;</span>
1093
- }
1094
- }
1095
- &nbsp;
1096
- /**
1097
- * Creates an instance of `PartialSignature` from the returned raw augmented pubkey and signature.
1098
- * @param pubkeyAugm the public key, concatenated with the tapleaf hash in the case of taproot script path spend.
1099
- * @param signature the signature
1100
- * @returns an instance of `PartialSignature`.
1101
- */
1102
- function <span class="fstat-no" title="function not covered" >makePartialSignature(</span>
1103
- pubkeyAugm: Buffer,
1104
- signature: Buffer
1105
- ): PartialSignature {
1106
- <span class="cstat-no" title="statement not covered" > if (pubkeyAugm.length == 64) {</span>
1107
- // tapscript spend: concatenation of 32-bytes x-only pubkey and 32-bytes tapleaf_hash
1108
- <span class="cstat-no" title="statement not covered" > return new PartialSignature(</span>
1109
- pubkeyAugm.slice(0, 32),
1110
- signature,
1111
- pubkeyAugm.slice(32, 64)
1112
- );
1113
- } else <span class="cstat-no" title="statement not covered" >if (pubkeyAugm.length == 32 || pubkeyAugm.length == 33) {</span>
1114
- // legacy, segwit or taproot keypath spend: pubkeyAugm is just the pubkey
1115
- <span class="cstat-no" title="statement not covered" > return new PartialSignature(pubkeyAugm, signature);</span>
1116
- } else {
1117
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1118
- `Invalid length for pubkeyAugm: ${pubkeyAugm.length} bytes.`
1119
- );
1120
- }
1121
- }
1122
- &nbsp;
1123
- /**
1124
- * This class encapsulates the APDU protocol documented at
1125
- * https://github.com/LedgerHQ/app-bitcoin-new/blob/master/doc/bitcoin.md
1126
- */
1127
- export class AppClient {
1128
- readonly transport: Transport;
1129
- &nbsp;
1130
- <span class="fstat-no" title="function not covered" > constructor(t</span>ransport: Transport) {
1131
- <span class="cstat-no" title="statement not covered" > this.transport = transport;</span>
1132
- }
1133
- &nbsp;
1134
- private <span class="fstat-no" title="function not covered" >async </span>makeRequest(
1135
- ins: BitcoinIns,
1136
- data: Buffer,
1137
- cci?: ClientCommandInterpreter
1138
- ): Promise&lt;Buffer&gt; {
1139
- let response: Buffer = <span class="cstat-no" title="statement not covered" >await this.transport.send(</span>
1140
- CLA_BTC,
1141
- ins,
1142
- 0,
1143
- CURRENT_PROTOCOL_VERSION,
1144
- data,
1145
- [0x9000, 0xe000]
1146
- );
1147
- <span class="cstat-no" title="statement not covered" > while (response.readUInt16BE(response.length - 2) === 0xe000) {</span>
1148
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!cci) {</span>
1149
- <span class="cstat-no" title="statement not covered" > throw new Error('Unexpected SW_INTERRUPTED_EXECUTION');</span>
1150
- }
1151
- &nbsp;
1152
- const hwRequest = <span class="cstat-no" title="statement not covered" >response.slice(0, -2);</span>
1153
- const commandResponse = <span class="cstat-no" title="statement not covered" >cci.execute(hwRequest);</span>
1154
- &nbsp;
1155
- <span class="cstat-no" title="statement not covered" > response = await this.transport.send(</span>
1156
- CLA_FRAMEWORK,
1157
- FrameworkIns.CONTINUE_INTERRUPTED,
1158
- 0,
1159
- 0,
1160
- commandResponse,
1161
- [0x9000, 0xe000]
1162
- );
1163
- }
1164
- <span class="cstat-no" title="statement not covered" > return response.slice(0, -2); </span>// drop the status word (can only be 0x9000 at this point)
1165
- }
1166
- &nbsp;
1167
- /**
1168
- * Returns an object containing the currently running app's name, version and the device status flags.
1169
- *
1170
- * @returns an object with app name, version and device status flags.
1171
- */
1172
- public <span class="fstat-no" title="function not covered" >async </span>getAppAndVersion(): Promise&lt;{
1173
- flags: number | Buffer;
1174
- name: string;
1175
- version: string;
1176
- }&gt; {
1177
- const r = <span class="cstat-no" title="statement not covered" >await this.transport.send(0xb0, 0x01, 0x00, 0x00);</span>
1178
- let i = <span class="cstat-no" title="statement not covered" >0;</span>
1179
- const format = <span class="cstat-no" title="statement not covered" >r[i++];</span>
1180
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (format !== 1) <span class="cstat-no" title="statement not covered" >throw new Error('Unexpected response');</span></span>
1181
- &nbsp;
1182
- const nameLength = <span class="cstat-no" title="statement not covered" >r[i++];</span>
1183
- const name = <span class="cstat-no" title="statement not covered" >r.slice(i, (i += nameLength)).toString('ascii');</span>
1184
- const versionLength = <span class="cstat-no" title="statement not covered" >r[i++];</span>
1185
- const version = <span class="cstat-no" title="statement not covered" >r.slice(i, (i += versionLength)).toString('ascii');</span>
1186
- const flagLength = <span class="cstat-no" title="statement not covered" >r[i++];</span>
1187
- const flags = <span class="cstat-no" title="statement not covered" >r.slice(i, (i += flagLength));</span>
1188
- <span class="cstat-no" title="statement not covered" > return {</span>
1189
- name,
1190
- version,
1191
- flags,
1192
- };
1193
- }
1194
- &nbsp;
1195
- /**
1196
- * Requests the BIP-32 extended pubkey to the hardware wallet.
1197
- * If `display` is `false`, only standard paths will be accepted; an error is returned if an unusual path is
1198
- * requested.
1199
- * If `display` is `true`, the requested path is shown on screen for user verification; unusual paths can be
1200
- * requested, and a warning is shown to the user in that case.
1201
- *
1202
- * @param path the requested BIP-32 path as a string
1203
- * @param display `false` to silently retrieve a pubkey for a standard path, `true` to display the path on screen
1204
- * @returns the base58-encoded serialized extended pubkey (xpub)
1205
- */
1206
- <span class="fstat-no" title="function not covered" > async </span>getExtendedPubkey(path: string, display = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: Promise&lt;string&gt; {
1207
- const pathElements = <span class="cstat-no" title="statement not covered" >pathStringToArray(path);</span>
1208
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (pathElements.length &gt; 6) {</span>
1209
- <span class="cstat-no" title="statement not covered" > throw new Error('Path too long. At most 6 levels allowed.');</span>
1210
- }
1211
- const response = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1212
- BitcoinIns.GET_PUBKEY,
1213
- Buffer.concat([
1214
- Buffer.from(display ? [1] : [0]),
1215
- pathElementsToBuffer(pathElements),
1216
- ])
1217
- );
1218
- <span class="cstat-no" title="statement not covered" > return response.toString('ascii');</span>
1219
- }
1220
- &nbsp;
1221
- /**
1222
- * Registers a `WalletPolicy`, after interactive verification from the user.
1223
- * On success, after user's approval, this function returns the id (which is the same that can be computed with
1224
- * `walletPolicy.getid()`), followed by the 32-byte hmac. The client should store the hmac to use it for future
1225
- * requests to `getWalletAddress` or `signPsbt` using this `WalletPolicy`.
1226
- *
1227
- * @param walletPolicy the `WalletPolicy` to register
1228
- * @returns a pair of two 32-byte arrays: the id of the Wallet Policy, followed by the policy hmac
1229
- */
1230
- <span class="fstat-no" title="function not covered" > async </span>registerWallet(
1231
- walletPolicy: WalletPolicy
1232
- ): Promise&lt;readonly [Buffer, Buffer]&gt; {
1233
- const clientInterpreter = <span class="cstat-no" title="statement not covered" >new ClientCommandInterpreter();</span>
1234
- &nbsp;
1235
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownWalletPolicy(walletPolicy);</span>
1236
- &nbsp;
1237
- const serializedWalletPolicy = <span class="cstat-no" title="statement not covered" >walletPolicy.serialize();</span>
1238
- const response = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1239
- BitcoinIns.REGISTER_WALLET,
1240
- Buffer.concat([
1241
- createVarint(serializedWalletPolicy.length),
1242
- serializedWalletPolicy,
1243
- ]),
1244
- clientInterpreter
1245
- );
1246
- &nbsp;
1247
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (response.length != 64) {</span>
1248
- <span class="cstat-no" title="statement not covered" > throw Error(</span>
1249
- `Invalid response length. Expected 64 bytes, got ${response.length}`
1250
- );
1251
- }
1252
- const walletId = <span class="cstat-no" title="statement not covered" >response.subarray(0, 32);</span>
1253
- const walletHMAC = <span class="cstat-no" title="statement not covered" >response.subarray(32);</span>
1254
- &nbsp;
1255
- // sanity check: derive and validate the first address with a 3rd party
1256
- const firstAddrDevice = <span class="cstat-no" title="statement not covered" >await this.getWalletAddress(</span>
1257
- walletPolicy,
1258
- walletHMAC,
1259
- 0,
1260
- 0,
1261
- false
1262
- );
1263
- <span class="cstat-no" title="statement not covered" > await this.validateAddress(firstAddrDevice, walletPolicy, 0, 0);</span>
1264
- &nbsp;
1265
- <span class="cstat-no" title="statement not covered" > return [walletId, walletHMAC];</span>
1266
- }
1267
- &nbsp;
1268
- /**
1269
- * Returns the address of `walletPolicy` for the given `change` and `addressIndex`.
1270
- *
1271
- * @param walletPolicy the `WalletPolicy` to use
1272
- * @param walletHMAC the 32-byte hmac returned during wallet registration for a registered policy; otherwise
1273
- * `null` for a standard policy
1274
- * @param change `0` for a normal receive address, `1` for a change address
1275
- * @param addressIndex the address index to retrieve
1276
- * @param display `True` to show the address on screen, `False` to retrieve it silently
1277
- * @returns the address, as an ascii string.
1278
- */
1279
- <span class="fstat-no" title="function not covered" > async </span>getWalletAddress(
1280
- walletPolicy: WalletPolicy,
1281
- walletHMAC: Buffer | null,
1282
- change: number,
1283
- addressIndex: number,
1284
- display: boolean
1285
- ): Promise&lt;string&gt; {
1286
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (change !== 0 &amp;&amp; change !== 1)</span>
1287
- <span class="cstat-no" title="statement not covered" > throw new Error('Change can only be 0 or 1');</span>
1288
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (addressIndex &lt; 0 || !Number.isInteger(addressIndex))</span>
1289
- <span class="cstat-no" title="statement not covered" > throw new Error('Invalid address index');</span>
1290
- &nbsp;
1291
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (walletHMAC != null &amp;&amp; walletHMAC.length != 32) {</span>
1292
- <span class="cstat-no" title="statement not covered" > throw new Error('Invalid HMAC length');</span>
1293
- }
1294
- &nbsp;
1295
- const clientInterpreter = <span class="cstat-no" title="statement not covered" >new ClientCommandInterpreter();</span>
1296
- &nbsp;
1297
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownWalletPolicy(walletPolicy);</span>
1298
- &nbsp;
1299
- const addressIndexBuffer = <span class="cstat-no" title="statement not covered" >Buffer.alloc(4);</span>
1300
- <span class="cstat-no" title="statement not covered" > addressIndexBuffer.writeUInt32BE(addressIndex, 0);</span>
1301
- &nbsp;
1302
- const response = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1303
- BitcoinIns.GET_WALLET_ADDRESS,
1304
- Buffer.concat([
1305
- Buffer.from(display ? [1] : [0]),
1306
- walletPolicy.getId(),
1307
- walletHMAC || Buffer.alloc(32, 0),
1308
- Buffer.from([change]),
1309
- addressIndexBuffer,
1310
- ]),
1311
- clientInterpreter
1312
- );
1313
- &nbsp;
1314
- const address = <span class="cstat-no" title="statement not covered" >response.toString('ascii');</span>
1315
- <span class="cstat-no" title="statement not covered" > await this.validateAddress(address, walletPolicy, change, addressIndex);</span>
1316
- <span class="cstat-no" title="statement not covered" > return address;</span>
1317
- }
1318
- &nbsp;
1319
- /**
1320
- * Signs a psbt using a (standard or registered) `WalletPolicy`. This is an interactive command, as user validation
1321
- * is necessary using the device's secure screen.
1322
- * On success, a map of input indexes and signatures is returned.
1323
- * @param psbt a base64-encoded string, or a psbt in a binary Buffer. Using the `PsbtV2` type is deprecated.
1324
- * @param walletPolicy the `WalletPolicy` to use for signing
1325
- * @param walletHMAC the 32-byte hmac obtained during wallet policy registration, or `null` for a standard policy
1326
- * @param progressCallback optionally, a callback that will be called every time a signature is produced during
1327
- * the signing process. The callback does not receive any argument, but can be used to track progress.
1328
- * @returns an array of of tuples with 2 elements containing:
1329
- * - the index of the input being signed;
1330
- * - an instance of PartialSignature
1331
- */
1332
- <span class="fstat-no" title="function not covered" > async </span>signPsbt(
1333
- psbt: PsbtV2 | string | Buffer,
1334
- walletPolicy: WalletPolicy,
1335
- walletHMAC: Buffer | null,
1336
- progressCallback?: () =&gt; void
1337
- ): Promise&lt;[number, PartialSignature][]&gt; {
1338
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof psbt === 'string') {</span>
1339
- <span class="cstat-no" title="statement not covered" > psbt = Buffer.from(psbt, 'base64');</span>
1340
- }
1341
- &nbsp;
1342
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (Buffer.isBuffer(psbt)) {</span>
1343
- const psbtObj = <span class="cstat-no" title="statement not covered" >new PsbtV2();</span>
1344
- <span class="cstat-no" title="statement not covered" > psbtObj.deserialize(psbt);</span>
1345
- <span class="cstat-no" title="statement not covered" > psbt = psbtObj;</span>
1346
- }
1347
- &nbsp;
1348
- const merkelizedPsbt = <span class="cstat-no" title="statement not covered" >new MerkelizedPsbt(psbt);</span>
1349
- &nbsp;
1350
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (walletHMAC != null &amp;&amp; walletHMAC.length != 32) {</span>
1351
- <span class="cstat-no" title="statement not covered" > throw new Error('Invalid HMAC length');</span>
1352
- }
1353
- &nbsp;
1354
- const clientInterpreter = <span class="cstat-no" title="statement not covered" >new ClientCommandInterpreter(progressCallback);</span>
1355
- &nbsp;
1356
- // prepare ClientCommandInterpreter
1357
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownWalletPolicy(walletPolicy);</span>
1358
- &nbsp;
1359
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownMapping(merkelizedPsbt.globalMerkleMap);</span>
1360
- <span class="cstat-no" title="statement not covered" > for (const map of merkelizedPsbt.inputMerkleMaps) {</span>
1361
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownMapping(map);</span>
1362
- }
1363
- <span class="cstat-no" title="statement not covered" > for (const map of merkelizedPsbt.outputMerkleMaps) {</span>
1364
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownMapping(map);</span>
1365
- }
1366
- &nbsp;
1367
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownList(merkelizedPsbt.inputMapCommitments);</span>
1368
- const inputMapsRoot = <span class="cstat-no" title="statement not covered" >new Merkle(</span>
1369
- merkelizedPsbt.inputMapCommitments.map(<span class="fstat-no" title="function not covered" >(m</span>) =&gt; <span class="cstat-no" title="statement not covered" >hashLeaf(m))</span>
1370
- ).getRoot();
1371
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownList(merkelizedPsbt.outputMapCommitments);</span>
1372
- const outputMapsRoot = <span class="cstat-no" title="statement not covered" >new Merkle(</span>
1373
- merkelizedPsbt.outputMapCommitments.map(<span class="fstat-no" title="function not covered" >(m</span>) =&gt; <span class="cstat-no" title="statement not covered" >hashLeaf(m))</span>
1374
- ).getRoot();
1375
- &nbsp;
1376
- <span class="cstat-no" title="statement not covered" > await this.makeRequest(</span>
1377
- BitcoinIns.SIGN_PSBT,
1378
- Buffer.concat([
1379
- merkelizedPsbt.getGlobalKeysValuesRoot(),
1380
- createVarint(merkelizedPsbt.getGlobalInputCount()),
1381
- inputMapsRoot,
1382
- createVarint(merkelizedPsbt.getGlobalOutputCount()),
1383
- outputMapsRoot,
1384
- walletPolicy.getId(),
1385
- walletHMAC || Buffer.alloc(32, 0),
1386
- ]),
1387
- clientInterpreter
1388
- );
1389
- &nbsp;
1390
- const yielded = <span class="cstat-no" title="statement not covered" >clientInterpreter.getYielded();</span>
1391
- &nbsp;
1392
- const ret: [number, PartialSignature][] = <span class="cstat-no" title="statement not covered" >[];</span>
1393
- <span class="cstat-no" title="statement not covered" > for (const inputAndSig of yielded) {</span>
1394
- // inputAndSig contains:
1395
- // &lt;inputIndex : varint&gt; &lt;pubkeyLen : 1 byte&gt; &lt;pubkey : pubkeyLen bytes (32 or 33)&gt; &lt;signature : variable length&gt;
1396
- const [inputIndex, inputIndexLen] = <span class="cstat-no" title="statement not covered" >parseVarint(inputAndSig, 0);</span>
1397
- const pubkeyAugmLen = <span class="cstat-no" title="statement not covered" >inputAndSig[inputIndexLen];</span>
1398
- const pubkeyAugm = <span class="cstat-no" title="statement not covered" >inputAndSig.subarray(</span>
1399
- inputIndexLen + 1,
1400
- inputIndexLen + 1 + pubkeyAugmLen
1401
- );
1402
- const signature = <span class="cstat-no" title="statement not covered" >inputAndSig.subarray(inputIndexLen + 1 + pubkeyAugmLen);</span>
1403
- &nbsp;
1404
- const partialSig = <span class="cstat-no" title="statement not covered" >makePartialSignature(pubkeyAugm, signature);</span>
1405
- &nbsp;
1406
- <span class="cstat-no" title="statement not covered" > ret.push([Number(inputIndex), partialSig]);</span>
1407
- }
1408
- <span class="cstat-no" title="statement not covered" > return ret;</span>
1409
- }
1410
- &nbsp;
1411
- /**
1412
- * Returns the fingerprint of the master public key, as per BIP-32 standard.
1413
- * @returns the master key fingerprint as a string of 8 hexadecimal digits.
1414
- */
1415
- <span class="fstat-no" title="function not covered" > async </span>getMasterFingerprint(): Promise&lt;string&gt; {
1416
- const fpr = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1417
- BitcoinIns.GET_MASTER_FINGERPRINT,
1418
- Buffer.from([])
1419
- );
1420
- <span class="cstat-no" title="statement not covered" > return fpr.toString('hex');</span>
1421
- }
1422
- &nbsp;
1423
- /**
1424
- * Signs a message using the legacy Bitcoin Message Signing standard. The signed message is
1425
- * the double-sha256 hash of the concatenation of:
1426
- * - "\x18Bitcoin Signed Message:\n";
1427
- * - the length of `message`, encoded as a Bitcoin-style variable length integer;
1428
- * - `message`.
1429
- *
1430
- * @param message the serialized message to sign
1431
- * @param path the BIP-32 path of the key used to sign the message
1432
- * @returns base64-encoded signature of the message.
1433
- */
1434
- <span class="fstat-no" title="function not covered" > async </span>signMessage(message: Buffer, path: string): Promise&lt;string&gt; {
1435
- const pathElements = <span class="cstat-no" title="statement not covered" >pathStringToArray(path);</span>
1436
- &nbsp;
1437
- const clientInterpreter = <span class="cstat-no" title="statement not covered" >new ClientCommandInterpreter();</span>
1438
- &nbsp;
1439
- // prepare ClientCommandInterpreter
1440
- const nChunks = <span class="cstat-no" title="statement not covered" >Math.ceil(message.length / 64);</span>
1441
- const chunks: Buffer[] = <span class="cstat-no" title="statement not covered" >[];</span>
1442
- <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; nChunks; i++) {</span>
1443
- <span class="cstat-no" title="statement not covered" > chunks.push(message.subarray(64 * i, 64 * i + 64));</span>
1444
- }
1445
- &nbsp;
1446
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownList(chunks);</span>
1447
- const chunksRoot = <span class="cstat-no" title="statement not covered" >new Merkle(chunks.map(<span class="fstat-no" title="function not covered" >(m</span>) =&gt; <span class="cstat-no" title="statement not covered" >hashLeaf(m))</span>).getRoot();</span>
1448
- &nbsp;
1449
- const result = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1450
- BitcoinIns.SIGN_MESSAGE,
1451
- Buffer.concat([
1452
- pathElementsToBuffer(pathElements),
1453
- createVarint(message.length),
1454
- chunksRoot,
1455
- ]),
1456
- clientInterpreter
1457
- );
1458
- &nbsp;
1459
- <span class="cstat-no" title="statement not covered" > return result.toString('base64');</span>
1460
- }
1461
- &nbsp;
1462
- /* Performs any additional check on the generated address before returning it.*/
1463
- private <span class="fstat-no" title="function not covered" >async </span>validateAddress(
1464
- address: string,
1465
- walletPolicy: WalletPolicy,
1466
- change: number,
1467
- addressIndex: number
1468
- ) {
1469
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (change !== 0 &amp;&amp; change !== 1)</span>
1470
- <span class="cstat-no" title="statement not covered" > throw new Error('Change can only be 0 or 1');</span>
1471
- const isChange: boolean = <span class="cstat-no" title="statement not covered" >change === 1;</span>
1472
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (addressIndex &lt; 0 || !Number.isInteger(addressIndex))</span>
1473
- <span class="cstat-no" title="statement not covered" > throw new Error('Invalid address index');</span>
1474
- const appAndVer = <span class="cstat-no" title="statement not covered" >await this.getAppAndVersion();</span>
1475
- let network;
1476
- <span class="cstat-no" title="statement not covered" > if (appAndVer.name === 'Syscoin Test') {</span>
1477
- <span class="cstat-no" title="statement not covered" > network = SYSCOIN_NETWORKS.testnet;</span>
1478
- } else <span class="cstat-no" title="statement not covered" >if (appAndVer.name === 'Syscoin') {</span>
1479
- <span class="cstat-no" title="statement not covered" > network = SYSCOIN_NETWORKS.mainnet;</span>
1480
- } else {
1481
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1482
- `Invalid network: ${appAndVer.name}. Expected 'Syscoin Test' or 'Syscoin'.`
1483
- );
1484
- }
1485
- let expression = <span class="cstat-no" title="statement not covered" >walletPolicy.descriptorTemplate;</span>
1486
- // Replace change:
1487
- <span class="cstat-no" title="statement not covered" > expression = expression.replace(/\/\*\*/g, `/&lt;0;1&gt;/*`);</span>
1488
- const regExpMN = <span class="cstat-no" title="statement not covered" >new RegExp(`/&lt;(\\d+);(\\d+)&gt;`, 'g');</span>
1489
- let matchMN;
1490
- <span class="cstat-no" title="statement not covered" > while ((matchMN = regExpMN.exec(expression)) !== null) {</span>
1491
- const [M, N] = <span class="cstat-no" title="statement not covered" >[parseInt(matchMN[1], 10), parseInt(matchMN[2], 10)];</span>
1492
- <span class="cstat-no" title="statement not covered" > expression = expression.replace(`/&lt;${M};${N}&gt;`, `/${isChange ? N : M}`);</span>
1493
- }
1494
- // Replace index:
1495
- <span class="cstat-no" title="statement not covered" > expression = expression.replace(/\/\*/g, `/${addressIndex}`);</span>
1496
- // Replace origin in reverse order to prevent
1497
- // misreplacements, e.g., @10 being mistaken for @1 and leaving a 0.
1498
- <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >walletPolicy.keys.length - 1;</span> i &gt;= 0; i--)</span>
1499
- <span class="cstat-no" title="statement not covered" > expression = expression.replace(</span>
1500
- new RegExp(`@${i}`, 'g'),
1501
- walletPolicy.keys[i]
1502
- );
1503
- let thirdPartyValidationApplicable = <span class="cstat-no" title="statement not covered" >true;</span>
1504
- let thirdPartyGeneratedAddress = <span class="cstat-no" title="statement not covered" >'';</span>
1505
- <span class="cstat-no" title="statement not covered" > try {</span>
1506
- <span class="cstat-no" title="statement not covered" > thirdPartyGeneratedAddress = new Descriptor({</span>
1507
- expression,
1508
- network,
1509
- }).getAddress();
1510
- } catch (err) {
1511
- // Note: @bitcoinerlab/descriptors@1.0.x does not support Tapscript yet.
1512
- // These are the supported descriptors:
1513
- // - pkh(KEY)
1514
- // - wpkh(KEY)
1515
- // - sh(wpkh(KEY))
1516
- // - sh(SCRIPT)
1517
- // - wsh(SCRIPT)
1518
- // - sh(wsh(SCRIPT)), where
1519
- // SCRIPT is any of the (non-tapscript) fragments in: https://bitcoin.sipa.be/miniscript/
1520
- //
1521
- // Other expressions are not supported and third party validation would not be applicable:
1522
- <span class="cstat-no" title="statement not covered" > thirdPartyValidationApplicable = false;</span>
1523
- }
1524
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1525
- thirdPartyValidationApplicable &amp;&amp;
1526
- address !== thirdPartyGeneratedAddress
1527
- )
1528
- <span class="cstat-no" title="statement not covered" > console.log(</span>
1529
- `Third party address validation mismatch: ${address} != ${thirdPartyGeneratedAddress}`
1530
- );
1531
- }
1532
- }
1533
- &nbsp;
1534
- export default AppClient;
1535
- &nbsp;</pre></td></tr></table></pre>
1536
-
1537
- <div class="push"></div>
1538
- <!-- for sticky footer -->
1539
- </div>
1540
- <!-- /wrapper -->
1541
- <div class="footer quiet pad2 space-top1 center small">
1542
- Code coverage generated by
1543
- <a
1544
- href="https://istanbul.js.org/"
1545
- target="_blank"
1546
- rel="noopener noreferrer"
1547
- >istanbul</a
1548
- >
1549
- at 2025-06-20T17:45:56.456Z
1550
- </div>
1551
- <script src="../../../../prettify.js"></script>
1552
- <script>
1553
- window.onload = function () {
1554
- prettyPrint();
1555
- };
1556
- </script>
1557
- <script src="../../../../sorter.js"></script>
1558
- <script src="../../../../block-navigation.js"></script>
1559
- </body>
1560
- </html>