@hsuite/native-connect-angular 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +48 -0
  2. package/USAGE_EXAMPLES.md +476 -0
  3. package/assets/wallets/extension.svg +7 -0
  4. package/assets/wallets/hashpack.svg +6 -0
  5. package/assets/wallets/hsuite.svg +11 -0
  6. package/assets/wallets/kabila.svg +11 -0
  7. package/assets/wallets/walletconnect.svg +13 -0
  8. package/coverage/base.css +224 -0
  9. package/coverage/block-navigation.js +87 -0
  10. package/coverage/coverage-summary.json +50 -0
  11. package/coverage/favicon.png +0 -0
  12. package/coverage/index.html +476 -0
  13. package/coverage/lcov-report/base.css +224 -0
  14. package/coverage/lcov-report/block-navigation.js +87 -0
  15. package/coverage/lcov-report/favicon.png +0 -0
  16. package/coverage/lcov-report/index.html +476 -0
  17. package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
  18. package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +116 -0
  19. package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
  20. package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +116 -0
  21. package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +685 -0
  22. package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +766 -0
  23. package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
  24. package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +116 -0
  25. package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1495 -0
  26. package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1588 -0
  27. package/coverage/lcov-report/lib/components/account-selector/index.html +161 -0
  28. package/coverage/lcov-report/lib/components/wallet-account-display/index.html +116 -0
  29. package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
  30. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +116 -0
  31. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
  32. package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +116 -0
  33. package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
  34. package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +116 -0
  35. package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
  36. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
  37. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
  38. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +116 -0
  39. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
  40. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
  41. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
  42. package/coverage/lcov-report/lib/components/wallet-session-display/index.html +116 -0
  43. package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
  44. package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +116 -0
  45. package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
  46. package/coverage/lcov-report/lib/directives/index.html +146 -0
  47. package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +670 -0
  48. package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +547 -0
  49. package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +781 -0
  50. package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +715 -0
  51. package/coverage/lcov-report/lib/index.html +116 -0
  52. package/coverage/lcov-report/lib/models/connection-config.model.ts.html +280 -0
  53. package/coverage/lcov-report/lib/models/index.html +131 -0
  54. package/coverage/lcov-report/lib/models/provider-types.ts.html +577 -0
  55. package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +1138 -0
  56. package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
  57. package/coverage/lcov-report/lib/providers/hsuite-native/index.html +116 -0
  58. package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +2347 -0
  59. package/coverage/lcov-report/lib/providers/index.html +146 -0
  60. package/coverage/lcov-report/lib/providers/p2p-native/index.html +131 -0
  61. package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
  62. package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
  63. package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1132 -0
  64. package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +176 -0
  65. package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +673 -0
  66. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
  67. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
  68. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
  69. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
  70. package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
  71. package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +146 -0
  72. package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
  73. package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
  74. package/coverage/lcov-report/lib/services/index.html +191 -0
  75. package/coverage/lcov-report/lib/services/logger.service.ts.html +463 -0
  76. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
  77. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
  78. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
  79. package/coverage/lcov-report/lib/services/transaction-builders/index.html +161 -0
  80. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
  81. package/coverage/lcov-report/lib/services/transaction.service.ts.html +1123 -0
  82. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +2641 -0
  83. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +637 -0
  84. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +643 -0
  85. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +496 -0
  86. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +823 -0
  87. package/coverage/lcov-report/lib/transports/index.html +116 -0
  88. package/coverage/lcov-report/lib/utils/index.html +116 -0
  89. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +319 -0
  90. package/coverage/lcov-report/prettify.css +1 -0
  91. package/coverage/lcov-report/prettify.js +2 -0
  92. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  93. package/coverage/lcov-report/sorter.js +210 -0
  94. package/coverage/lcov.info +19252 -0
  95. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
  96. package/coverage/lib/components/account-selector/account-actions/index.html +116 -0
  97. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
  98. package/coverage/lib/components/account-selector/account-filter/index.html +116 -0
  99. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +685 -0
  100. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +766 -0
  101. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
  102. package/coverage/lib/components/account-selector/account-list/index.html +116 -0
  103. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1495 -0
  104. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1588 -0
  105. package/coverage/lib/components/account-selector/index.html +161 -0
  106. package/coverage/lib/components/wallet-account-display/index.html +116 -0
  107. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
  108. package/coverage/lib/components/wallet-connect-button/index.html +116 -0
  109. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
  110. package/coverage/lib/components/wallet-connect-prompt/index.html +116 -0
  111. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
  112. package/coverage/lib/components/wallet-connected-guard/index.html +116 -0
  113. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
  114. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
  115. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
  116. package/coverage/lib/components/wallet-connection-modal/index.html +116 -0
  117. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
  118. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
  119. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
  120. package/coverage/lib/components/wallet-session-display/index.html +116 -0
  121. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
  122. package/coverage/lib/components/wallet-transaction-status/index.html +116 -0
  123. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
  124. package/coverage/lib/directives/index.html +146 -0
  125. package/coverage/lib/directives/wallet-connected.directive.ts.html +670 -0
  126. package/coverage/lib/directives/wallet-context.directive.ts.html +547 -0
  127. package/coverage/lib/directives/wallet-events.directive.ts.html +781 -0
  128. package/coverage/lib/hsuite-wallet.module.ts.html +715 -0
  129. package/coverage/lib/index.html +116 -0
  130. package/coverage/lib/models/connection-config.model.ts.html +280 -0
  131. package/coverage/lib/models/index.html +131 -0
  132. package/coverage/lib/models/provider-types.ts.html +577 -0
  133. package/coverage/lib/providers/base-wallet-provider.ts.html +1138 -0
  134. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
  135. package/coverage/lib/providers/hsuite-native/index.html +116 -0
  136. package/coverage/lib/providers/hsuite-native-provider.ts.html +2347 -0
  137. package/coverage/lib/providers/index.html +146 -0
  138. package/coverage/lib/providers/p2p-native/index.html +131 -0
  139. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
  140. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
  141. package/coverage/lib/providers/wallet-error-handler.ts.html +1132 -0
  142. package/coverage/lib/providers/walletconnect/core/index.html +176 -0
  143. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +673 -0
  144. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
  145. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
  146. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
  147. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
  148. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
  149. package/coverage/lib/providers/walletconnect/signers/index.html +146 -0
  150. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
  151. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
  152. package/coverage/lib/services/index.html +191 -0
  153. package/coverage/lib/services/logger.service.ts.html +463 -0
  154. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
  155. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
  156. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
  157. package/coverage/lib/services/transaction-builders/index.html +161 -0
  158. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
  159. package/coverage/lib/services/transaction.service.ts.html +1123 -0
  160. package/coverage/lib/services/unified-wallet.service.ts.html +2641 -0
  161. package/coverage/lib/services/wallet-context.service.ts.html +637 -0
  162. package/coverage/lib/services/wallet-event-bus.service.ts.html +643 -0
  163. package/coverage/lib/services/wallet-providers.service.ts.html +496 -0
  164. package/coverage/lib/transports/chrome-extension-transport.ts.html +823 -0
  165. package/coverage/lib/transports/index.html +116 -0
  166. package/coverage/lib/utils/index.html +116 -0
  167. package/coverage/lib/utils/ledger-icons.util.ts.html +319 -0
  168. package/coverage/prettify.css +1 -0
  169. package/coverage/prettify.js +2 -0
  170. package/coverage/sort-arrow-sprite.png +0 -0
  171. package/coverage/sorter.js +210 -0
  172. package/dist/README.md +48 -0
  173. package/dist/fesm2022/hsuite-native-connect-angular.mjs +14592 -0
  174. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -0
  175. package/dist/index.d.ts +6949 -0
  176. package/examples/minimal-connect.ts +178 -0
  177. package/examples/multi-protocol.ts +495 -0
  178. package/examples/transaction-signing.ts +361 -0
  179. package/jest.config.json +45 -0
  180. package/karma.conf.js +42 -0
  181. package/ng-package.json +20 -0
  182. package/package.json +60 -0
  183. package/src/index.ts +203 -0
  184. package/src/lib/components/account-selector/account-actions/account-actions.component.ts +261 -0
  185. package/src/lib/components/account-selector/account-filter/account-filter.component.ts +401 -0
  186. package/src/lib/components/account-selector/account-formatting.service.ts +200 -0
  187. package/src/lib/components/account-selector/account-grouping.service.ts +227 -0
  188. package/src/lib/components/account-selector/account-list/account-list.component.ts +470 -0
  189. package/src/lib/components/account-selector/account-selector.component.html +135 -0
  190. package/src/lib/components/account-selector/account-selector.component.scss +2039 -0
  191. package/src/lib/components/account-selector/account-selector.component.ts +470 -0
  192. package/src/lib/components/account-selector/account-selector.service.ts +501 -0
  193. package/src/lib/components/wallet-account-display/wallet-account-display.component.html +34 -0
  194. package/src/lib/components/wallet-account-display/wallet-account-display.component.scss +99 -0
  195. package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +140 -0
  196. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.html +14 -0
  197. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.scss +272 -0
  198. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +240 -0
  199. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.html +24 -0
  200. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.scss +50 -0
  201. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts +108 -0
  202. package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.html +24 -0
  203. package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts +73 -0
  204. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.html +56 -0
  205. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.scss +218 -0
  206. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts +117 -0
  207. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.html +94 -0
  208. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.scss +272 -0
  209. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts +734 -0
  210. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +197 -0
  211. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.scss +678 -0
  212. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +730 -0
  213. package/src/lib/components/wallet-session-display/wallet-session-display.component.html +110 -0
  214. package/src/lib/components/wallet-session-display/wallet-session-display.component.scss +179 -0
  215. package/src/lib/components/wallet-session-display/wallet-session-display.component.ts +197 -0
  216. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.html +65 -0
  217. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.scss +254 -0
  218. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts +206 -0
  219. package/src/lib/directives/wallet-connected.directive.ts +195 -0
  220. package/src/lib/directives/wallet-context.directive.ts +154 -0
  221. package/src/lib/directives/wallet-events.directive.ts +232 -0
  222. package/src/lib/hsuite-wallet.module.ts +210 -0
  223. package/src/lib/models/connection-config.model.ts +65 -0
  224. package/src/lib/models/provider-types.ts +164 -0
  225. package/src/lib/models/unified-account.model.ts +76 -0
  226. package/src/lib/models/wallet-context.model.ts +121 -0
  227. package/src/lib/models/wallet-events.model.ts +158 -0
  228. package/src/lib/providers/base-wallet-provider.ts +351 -0
  229. package/src/lib/providers/hsuite-native/channel-client.service.spec.ts +73 -0
  230. package/src/lib/providers/hsuite-native/channel-client.service.ts +862 -0
  231. package/src/lib/providers/hsuite-native/index.ts +8 -0
  232. package/src/lib/providers/hsuite-native-provider.ts +754 -0
  233. package/src/lib/providers/mobile-native/mobile-native.provider.spec.ts +19 -0
  234. package/src/lib/providers/p2p-native/index.ts +30 -0
  235. package/src/lib/providers/p2p-native/p2p-native.provider.spec.ts +523 -0
  236. package/src/lib/providers/p2p-native/p2p-native.provider.ts +723 -0
  237. package/src/lib/providers/p2p-native/p2p-session-manager.ts +695 -0
  238. package/src/lib/providers/wallet-error-handler.ts +349 -0
  239. package/src/lib/providers/walletconnect/core/base-signer.interface.ts +122 -0
  240. package/src/lib/providers/walletconnect/core/session-health.ts +196 -0
  241. package/src/lib/providers/walletconnect/core/walletconnect-client-manager.ts +364 -0
  242. package/src/lib/providers/walletconnect/core/walletconnect-provider.integration.spec.ts +348 -0
  243. package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +826 -0
  244. package/src/lib/providers/walletconnect/core/walletconnect-session-store.ts +273 -0
  245. package/src/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts +299 -0
  246. package/src/lib/providers/walletconnect/core/walletconnect-types.ts +48 -0
  247. package/src/lib/providers/walletconnect/index.ts +33 -0
  248. package/src/lib/providers/walletconnect/signers/hedera-signer.spec.ts +367 -0
  249. package/src/lib/providers/walletconnect/signers/hedera-signer.ts +610 -0
  250. package/src/lib/providers/walletconnect/signers/signer-factory.spec.ts +62 -0
  251. package/src/lib/providers/walletconnect/signers/signer-factory.ts +120 -0
  252. package/src/lib/providers/walletconnect/signers/xrpl-signer.spec.ts +296 -0
  253. package/src/lib/providers/walletconnect/signers/xrpl-signer.ts +478 -0
  254. package/src/lib/services/logger.service.ts +126 -0
  255. package/src/lib/services/transaction-builders/base-transaction-builder.service.ts +585 -0
  256. package/src/lib/services/transaction-builders/hedera-amount-utils.ts +84 -0
  257. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.spec.ts +741 -0
  258. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +1285 -0
  259. package/src/lib/services/transaction-builders/index.ts +54 -0
  260. package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.spec.ts +937 -0
  261. package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.ts +832 -0
  262. package/src/lib/services/transaction.service.ts +346 -0
  263. package/src/lib/services/unified-wallet.service.spec.ts +1382 -0
  264. package/src/lib/services/unified-wallet.service.ts +852 -0
  265. package/src/lib/services/wallet-context.service.ts +184 -0
  266. package/src/lib/services/wallet-event-bus.service.ts +186 -0
  267. package/src/lib/services/wallet-providers.service.ts +137 -0
  268. package/src/lib/transports/chrome-extension-transport.ts +246 -0
  269. package/src/lib/utils/index.ts +14 -0
  270. package/src/lib/utils/ledger-icons.util.ts +78 -0
  271. package/test/test-setup.ts +21 -0
  272. package/test-setup.ts +63 -0
  273. package/tsconfig.build.json +11 -0
  274. package/tsconfig.json +29 -0
  275. package/tsconfig.spec.json +15 -0
  276. package/vitest.config.ts +48 -0
@@ -0,0 +1,2347 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for lib/providers/hsuite-native-provider.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">lib/providers</a> hsuite-native-provider.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/754</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/754</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
821
+ <span class="cline-any cline-no">&nbsp;</span>
822
+ <span class="cline-any cline-no">&nbsp;</span>
823
+ <span class="cline-any cline-no">&nbsp;</span>
824
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
829
+ <span class="cline-any cline-no">&nbsp;</span>
830
+ <span class="cline-any cline-no">&nbsp;</span>
831
+ <span class="cline-any cline-no">&nbsp;</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-no">&nbsp;</span>
834
+ <span class="cline-any cline-no">&nbsp;</span>
835
+ <span class="cline-any cline-no">&nbsp;</span>
836
+ <span class="cline-any cline-no">&nbsp;</span>
837
+ <span class="cline-any cline-no">&nbsp;</span>
838
+ <span class="cline-any cline-no">&nbsp;</span>
839
+ <span class="cline-any cline-no">&nbsp;</span>
840
+ <span class="cline-any cline-no">&nbsp;</span>
841
+ <span class="cline-any cline-no">&nbsp;</span>
842
+ <span class="cline-any cline-no">&nbsp;</span>
843
+ <span class="cline-any cline-no">&nbsp;</span>
844
+ <span class="cline-any cline-no">&nbsp;</span>
845
+ <span class="cline-any cline-no">&nbsp;</span>
846
+ <span class="cline-any cline-no">&nbsp;</span>
847
+ <span class="cline-any cline-no">&nbsp;</span>
848
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
852
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
858
+ <span class="cline-any cline-no">&nbsp;</span>
859
+ <span class="cline-any cline-no">&nbsp;</span>
860
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
864
+ <span class="cline-any cline-no">&nbsp;</span>
865
+ <span class="cline-any cline-no">&nbsp;</span>
866
+ <span class="cline-any cline-no">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-no">&nbsp;</span>
869
+ <span class="cline-any cline-no">&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-no">&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-no">&nbsp;</span>
877
+ <span class="cline-any cline-no">&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-no">&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-no">&nbsp;</span>
886
+ <span class="cline-any cline-no">&nbsp;</span>
887
+ <span class="cline-any cline-no">&nbsp;</span>
888
+ <span class="cline-any cline-no">&nbsp;</span>
889
+ <span class="cline-any cline-no">&nbsp;</span>
890
+ <span class="cline-any cline-no">&nbsp;</span>
891
+ <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-no">&nbsp;</span>
893
+ <span class="cline-any cline-no">&nbsp;</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-no">&nbsp;</span>
897
+ <span class="cline-any cline-no">&nbsp;</span>
898
+ <span class="cline-any cline-no">&nbsp;</span>
899
+ <span class="cline-any cline-no">&nbsp;</span>
900
+ <span class="cline-any cline-no">&nbsp;</span>
901
+ <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
906
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
911
+ <span class="cline-any cline-no">&nbsp;</span>
912
+ <span class="cline-any cline-no">&nbsp;</span>
913
+ <span class="cline-any cline-no">&nbsp;</span>
914
+ <span class="cline-any cline-no">&nbsp;</span>
915
+ <span class="cline-any cline-no">&nbsp;</span>
916
+ <span class="cline-any cline-no">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-no">&nbsp;</span>
919
+ <span class="cline-any cline-no">&nbsp;</span>
920
+ <span class="cline-any cline-no">&nbsp;</span>
921
+ <span class="cline-any cline-no">&nbsp;</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-no">&nbsp;</span>
927
+ <span class="cline-any cline-no">&nbsp;</span>
928
+ <span class="cline-any cline-no">&nbsp;</span>
929
+ <span class="cline-any cline-no">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-no">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-no">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-no">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-no">&nbsp;</span>
949
+ <span class="cline-any cline-no">&nbsp;</span>
950
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
956
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-no">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-no">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-no">&nbsp;</span>
971
+ <span class="cline-any cline-no">&nbsp;</span>
972
+ <span class="cline-any cline-no">&nbsp;</span>
973
+ <span class="cline-any cline-no">&nbsp;</span>
974
+ <span class="cline-any cline-no">&nbsp;</span>
975
+ <span class="cline-any cline-no">&nbsp;</span>
976
+ <span class="cline-any cline-no">&nbsp;</span>
977
+ <span class="cline-any cline-no">&nbsp;</span>
978
+ <span class="cline-any cline-no">&nbsp;</span>
979
+ <span class="cline-any cline-no">&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-no">&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-no">&nbsp;</span>
992
+ <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-no">&nbsp;</span>
994
+ <span class="cline-any cline-no">&nbsp;</span>
995
+ <span class="cline-any cline-no">&nbsp;</span>
996
+ <span class="cline-any cline-no">&nbsp;</span>
997
+ <span class="cline-any cline-no">&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-no">&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-no">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-no">&nbsp;</span>
1007
+ <span class="cline-any cline-no">&nbsp;</span>
1008
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-no">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-no">&nbsp;</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-no">&nbsp;</span>
1029
+ <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-no">&nbsp;</span>
1031
+ <span class="cline-any cline-no">&nbsp;</span>
1032
+ <span class="cline-any cline-no">&nbsp;</span>
1033
+ <span class="cline-any cline-no">&nbsp;</span>
1034
+ <span class="cline-any cline-no">&nbsp;</span>
1035
+ <span class="cline-any cline-no">&nbsp;</span>
1036
+ <span class="cline-any cline-no">&nbsp;</span>
1037
+ <span class="cline-any cline-no">&nbsp;</span>
1038
+ <span class="cline-any cline-no">&nbsp;</span>
1039
+ <span class="cline-any cline-no">&nbsp;</span>
1040
+ <span class="cline-any cline-no">&nbsp;</span>
1041
+ <span class="cline-any cline-no">&nbsp;</span>
1042
+ <span class="cline-any cline-no">&nbsp;</span>
1043
+ <span class="cline-any cline-no">&nbsp;</span>
1044
+ <span class="cline-any cline-no">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-no">&nbsp;</span>
1047
+ <span class="cline-any cline-no">&nbsp;</span>
1048
+ <span class="cline-any cline-no">&nbsp;</span>
1049
+ <span class="cline-any cline-no">&nbsp;</span>
1050
+ <span class="cline-any cline-no">&nbsp;</span>
1051
+ <span class="cline-any cline-no">&nbsp;</span>
1052
+ <span class="cline-any cline-no">&nbsp;</span>
1053
+ <span class="cline-any cline-no">&nbsp;</span>
1054
+ <span class="cline-any cline-no">&nbsp;</span>
1055
+ <span class="cline-any cline-no">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-no">&nbsp;</span>
1058
+ <span class="cline-any cline-no">&nbsp;</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-no">&nbsp;</span>
1061
+ <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-no">&nbsp;</span>
1065
+ <span class="cline-any cline-no">&nbsp;</span>
1066
+ <span class="cline-any cline-no">&nbsp;</span>
1067
+ <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-no">&nbsp;</span>
1069
+ <span class="cline-any cline-no">&nbsp;</span>
1070
+ <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-no">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-no">&nbsp;</span>
1076
+ <span class="cline-any cline-no">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-no">&nbsp;</span>
1084
+ <span class="cline-any cline-no">&nbsp;</span>
1085
+ <span class="cline-any cline-no">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-no">&nbsp;</span>
1089
+ <span class="cline-any cline-no">&nbsp;</span>
1090
+ <span class="cline-any cline-no">&nbsp;</span>
1091
+ <span class="cline-any cline-no">&nbsp;</span>
1092
+ <span class="cline-any cline-no">&nbsp;</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-no">&nbsp;</span>
1096
+ <span class="cline-any cline-no">&nbsp;</span>
1097
+ <span class="cline-any cline-no">&nbsp;</span>
1098
+ <span class="cline-any cline-no">&nbsp;</span>
1099
+ <span class="cline-any cline-no">&nbsp;</span>
1100
+ <span class="cline-any cline-no">&nbsp;</span>
1101
+ <span class="cline-any cline-no">&nbsp;</span>
1102
+ <span class="cline-any cline-no">&nbsp;</span>
1103
+ <span class="cline-any cline-no">&nbsp;</span>
1104
+ <span class="cline-any cline-no">&nbsp;</span>
1105
+ <span class="cline-any cline-no">&nbsp;</span>
1106
+ <span class="cline-any cline-no">&nbsp;</span>
1107
+ <span class="cline-any cline-no">&nbsp;</span>
1108
+ <span class="cline-any cline-no">&nbsp;</span>
1109
+ <span class="cline-any cline-no">&nbsp;</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-no">&nbsp;</span>
1113
+ <span class="cline-any cline-no">&nbsp;</span>
1114
+ <span class="cline-any cline-no">&nbsp;</span>
1115
+ <span class="cline-any cline-no">&nbsp;</span>
1116
+ <span class="cline-any cline-no">&nbsp;</span>
1117
+ <span class="cline-any cline-no">&nbsp;</span>
1118
+ <span class="cline-any cline-no">&nbsp;</span>
1119
+ <span class="cline-any cline-no">&nbsp;</span>
1120
+ <span class="cline-any cline-no">&nbsp;</span>
1121
+ <span class="cline-any cline-no">&nbsp;</span>
1122
+ <span class="cline-any cline-no">&nbsp;</span>
1123
+ <span class="cline-any cline-no">&nbsp;</span>
1124
+ <span class="cline-any cline-no">&nbsp;</span>
1125
+ <span class="cline-any cline-no">&nbsp;</span>
1126
+ <span class="cline-any cline-no">&nbsp;</span>
1127
+ <span class="cline-any cline-no">&nbsp;</span>
1128
+ <span class="cline-any cline-no">&nbsp;</span>
1129
+ <span class="cline-any cline-no">&nbsp;</span>
1130
+ <span class="cline-any cline-no">&nbsp;</span>
1131
+ <span class="cline-any cline-no">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-no">&nbsp;</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-no">&nbsp;</span>
1144
+ <span class="cline-any cline-no">&nbsp;</span>
1145
+ <span class="cline-any cline-no">&nbsp;</span>
1146
+ <span class="cline-any cline-no">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-no">&nbsp;</span>
1149
+ <span class="cline-any cline-no">&nbsp;</span>
1150
+ <span class="cline-any cline-no">&nbsp;</span>
1151
+ <span class="cline-any cline-no">&nbsp;</span>
1152
+ <span class="cline-any cline-no">&nbsp;</span>
1153
+ <span class="cline-any cline-no">&nbsp;</span>
1154
+ <span class="cline-any cline-no">&nbsp;</span>
1155
+ <span class="cline-any cline-no">&nbsp;</span>
1156
+ <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-no">&nbsp;</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-no">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-no">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-no">&nbsp;</span>
1172
+ <span class="cline-any cline-no">&nbsp;</span>
1173
+ <span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-no">&nbsp;</span>
1176
+ <span class="cline-any cline-no">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-no">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-no">&nbsp;</span>
1197
+ <span class="cline-any cline-no">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-no">&nbsp;</span>
1207
+ <span class="cline-any cline-no">&nbsp;</span>
1208
+ <span class="cline-any cline-no">&nbsp;</span>
1209
+ <span class="cline-any cline-no">&nbsp;</span>
1210
+ <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-no">&nbsp;</span>
1212
+ <span class="cline-any cline-no">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-no">&nbsp;</span>
1216
+ <span class="cline-any cline-no">&nbsp;</span>
1217
+ <span class="cline-any cline-no">&nbsp;</span>
1218
+ <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-no">&nbsp;</span>
1220
+ <span class="cline-any cline-no">&nbsp;</span>
1221
+ <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-no">&nbsp;</span>
1223
+ <span class="cline-any cline-no">&nbsp;</span>
1224
+ <span class="cline-any cline-no">&nbsp;</span>
1225
+ <span class="cline-any cline-no">&nbsp;</span>
1226
+ <span class="cline-any cline-no">&nbsp;</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-no">&nbsp;</span>
1234
+ <span class="cline-any cline-no">&nbsp;</span>
1235
+ <span class="cline-any cline-no">&nbsp;</span>
1236
+ <span class="cline-any cline-no">&nbsp;</span>
1237
+ <span class="cline-any cline-no">&nbsp;</span>
1238
+ <span class="cline-any cline-no">&nbsp;</span>
1239
+ <span class="cline-any cline-no">&nbsp;</span>
1240
+ <span class="cline-any cline-no">&nbsp;</span>
1241
+ <span class="cline-any cline-no">&nbsp;</span>
1242
+ <span class="cline-any cline-no">&nbsp;</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-no">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-no">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-no">&nbsp;</span>
1251
+ <span class="cline-any cline-no">&nbsp;</span>
1252
+ <span class="cline-any cline-no">&nbsp;</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-no">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-no">&nbsp;</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-no">&nbsp;</span>
1262
+ <span class="cline-any cline-no">&nbsp;</span>
1263
+ <span class="cline-any cline-no">&nbsp;</span>
1264
+ <span class="cline-any cline-no">&nbsp;</span>
1265
+ <span class="cline-any cline-no">&nbsp;</span>
1266
+ <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-no">&nbsp;</span>
1270
+ <span class="cline-any cline-no">&nbsp;</span>
1271
+ <span class="cline-any cline-no">&nbsp;</span>
1272
+ <span class="cline-any cline-no">&nbsp;</span>
1273
+ <span class="cline-any cline-no">&nbsp;</span>
1274
+ <span class="cline-any cline-no">&nbsp;</span>
1275
+ <span class="cline-any cline-no">&nbsp;</span>
1276
+ <span class="cline-any cline-no">&nbsp;</span>
1277
+ <span class="cline-any cline-no">&nbsp;</span>
1278
+ <span class="cline-any cline-no">&nbsp;</span>
1279
+ <span class="cline-any cline-no">&nbsp;</span>
1280
+ <span class="cline-any cline-no">&nbsp;</span>
1281
+ <span class="cline-any cline-no">&nbsp;</span>
1282
+ <span class="cline-any cline-no">&nbsp;</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-no">&nbsp;</span>
1285
+ <span class="cline-any cline-no">&nbsp;</span>
1286
+ <span class="cline-any cline-no">&nbsp;</span>
1287
+ <span class="cline-any cline-no">&nbsp;</span>
1288
+ <span class="cline-any cline-no">&nbsp;</span>
1289
+ <span class="cline-any cline-no">&nbsp;</span>
1290
+ <span class="cline-any cline-no">&nbsp;</span>
1291
+ <span class="cline-any cline-no">&nbsp;</span>
1292
+ <span class="cline-any cline-no">&nbsp;</span>
1293
+ <span class="cline-any cline-no">&nbsp;</span>
1294
+ <span class="cline-any cline-no">&nbsp;</span>
1295
+ <span class="cline-any cline-no">&nbsp;</span>
1296
+ <span class="cline-any cline-no">&nbsp;</span>
1297
+ <span class="cline-any cline-no">&nbsp;</span>
1298
+ <span class="cline-any cline-no">&nbsp;</span>
1299
+ <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-no">&nbsp;</span>
1301
+ <span class="cline-any cline-no">&nbsp;</span>
1302
+ <span class="cline-any cline-no">&nbsp;</span>
1303
+ <span class="cline-any cline-no">&nbsp;</span>
1304
+ <span class="cline-any cline-no">&nbsp;</span>
1305
+ <span class="cline-any cline-no">&nbsp;</span>
1306
+ <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-no">&nbsp;</span>
1309
+ <span class="cline-any cline-no">&nbsp;</span>
1310
+ <span class="cline-any cline-no">&nbsp;</span>
1311
+ <span class="cline-any cline-no">&nbsp;</span>
1312
+ <span class="cline-any cline-no">&nbsp;</span>
1313
+ <span class="cline-any cline-no">&nbsp;</span>
1314
+ <span class="cline-any cline-no">&nbsp;</span>
1315
+ <span class="cline-any cline-no">&nbsp;</span>
1316
+ <span class="cline-any cline-no">&nbsp;</span>
1317
+ <span class="cline-any cline-no">&nbsp;</span>
1318
+ <span class="cline-any cline-no">&nbsp;</span>
1319
+ <span class="cline-any cline-no">&nbsp;</span>
1320
+ <span class="cline-any cline-no">&nbsp;</span>
1321
+ <span class="cline-any cline-no">&nbsp;</span>
1322
+ <span class="cline-any cline-no">&nbsp;</span>
1323
+ <span class="cline-any cline-no">&nbsp;</span>
1324
+ <span class="cline-any cline-no">&nbsp;</span>
1325
+ <span class="cline-any cline-no">&nbsp;</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-no">&nbsp;</span>
1328
+ <span class="cline-any cline-no">&nbsp;</span>
1329
+ <span class="cline-any cline-no">&nbsp;</span>
1330
+ <span class="cline-any cline-no">&nbsp;</span>
1331
+ <span class="cline-any cline-no">&nbsp;</span>
1332
+ <span class="cline-any cline-no">&nbsp;</span>
1333
+ <span class="cline-any cline-no">&nbsp;</span>
1334
+ <span class="cline-any cline-no">&nbsp;</span>
1335
+ <span class="cline-any cline-no">&nbsp;</span>
1336
+ <span class="cline-any cline-no">&nbsp;</span>
1337
+ <span class="cline-any cline-no">&nbsp;</span>
1338
+ <span class="cline-any cline-no">&nbsp;</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-no">&nbsp;</span>
1341
+ <span class="cline-any cline-no">&nbsp;</span>
1342
+ <span class="cline-any cline-no">&nbsp;</span>
1343
+ <span class="cline-any cline-no">&nbsp;</span>
1344
+ <span class="cline-any cline-no">&nbsp;</span>
1345
+ <span class="cline-any cline-no">&nbsp;</span>
1346
+ <span class="cline-any cline-no">&nbsp;</span>
1347
+ <span class="cline-any cline-no">&nbsp;</span>
1348
+ <span class="cline-any cline-no">&nbsp;</span>
1349
+ <span class="cline-any cline-no">&nbsp;</span>
1350
+ <span class="cline-any cline-no">&nbsp;</span>
1351
+ <span class="cline-any cline-no">&nbsp;</span>
1352
+ <span class="cline-any cline-no">&nbsp;</span>
1353
+ <span class="cline-any cline-no">&nbsp;</span>
1354
+ <span class="cline-any cline-no">&nbsp;</span>
1355
+ <span class="cline-any cline-no">&nbsp;</span>
1356
+ <span class="cline-any cline-no">&nbsp;</span>
1357
+ <span class="cline-any cline-no">&nbsp;</span>
1358
+ <span class="cline-any cline-no">&nbsp;</span>
1359
+ <span class="cline-any cline-no">&nbsp;</span>
1360
+ <span class="cline-any cline-no">&nbsp;</span>
1361
+ <span class="cline-any cline-no">&nbsp;</span>
1362
+ <span class="cline-any cline-no">&nbsp;</span>
1363
+ <span class="cline-any cline-no">&nbsp;</span>
1364
+ <span class="cline-any cline-no">&nbsp;</span>
1365
+ <span class="cline-any cline-no">&nbsp;</span>
1366
+ <span class="cline-any cline-no">&nbsp;</span>
1367
+ <span class="cline-any cline-no">&nbsp;</span>
1368
+ <span class="cline-any cline-no">&nbsp;</span>
1369
+ <span class="cline-any cline-no">&nbsp;</span>
1370
+ <span class="cline-any cline-no">&nbsp;</span>
1371
+ <span class="cline-any cline-no">&nbsp;</span>
1372
+ <span class="cline-any cline-no">&nbsp;</span>
1373
+ <span class="cline-any cline-no">&nbsp;</span>
1374
+ <span class="cline-any cline-no">&nbsp;</span>
1375
+ <span class="cline-any cline-no">&nbsp;</span>
1376
+ <span class="cline-any cline-no">&nbsp;</span>
1377
+ <span class="cline-any cline-no">&nbsp;</span>
1378
+ <span class="cline-any cline-no">&nbsp;</span>
1379
+ <span class="cline-any cline-no">&nbsp;</span>
1380
+ <span class="cline-any cline-no">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1382
+ <span class="cline-any cline-no">&nbsp;</span>
1383
+ <span class="cline-any cline-no">&nbsp;</span>
1384
+ <span class="cline-any cline-no">&nbsp;</span>
1385
+ <span class="cline-any cline-no">&nbsp;</span>
1386
+ <span class="cline-any cline-no">&nbsp;</span>
1387
+ <span class="cline-any cline-no">&nbsp;</span>
1388
+ <span class="cline-any cline-no">&nbsp;</span>
1389
+ <span class="cline-any cline-no">&nbsp;</span>
1390
+ <span class="cline-any cline-no">&nbsp;</span>
1391
+ <span class="cline-any cline-no">&nbsp;</span>
1392
+ <span class="cline-any cline-no">&nbsp;</span>
1393
+ <span class="cline-any cline-no">&nbsp;</span>
1394
+ <span class="cline-any cline-no">&nbsp;</span>
1395
+ <span class="cline-any cline-no">&nbsp;</span>
1396
+ <span class="cline-any cline-no">&nbsp;</span>
1397
+ <span class="cline-any cline-no">&nbsp;</span>
1398
+ <span class="cline-any cline-no">&nbsp;</span>
1399
+ <span class="cline-any cline-no">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1401
+ <span class="cline-any cline-no">&nbsp;</span>
1402
+ <span class="cline-any cline-no">&nbsp;</span>
1403
+ <span class="cline-any cline-no">&nbsp;</span>
1404
+ <span class="cline-any cline-no">&nbsp;</span>
1405
+ <span class="cline-any cline-no">&nbsp;</span>
1406
+ <span class="cline-any cline-no">&nbsp;</span>
1407
+ <span class="cline-any cline-no">&nbsp;</span>
1408
+ <span class="cline-any cline-no">&nbsp;</span>
1409
+ <span class="cline-any cline-no">&nbsp;</span>
1410
+ <span class="cline-any cline-no">&nbsp;</span>
1411
+ <span class="cline-any cline-no">&nbsp;</span>
1412
+ <span class="cline-any cline-no">&nbsp;</span>
1413
+ <span class="cline-any cline-no">&nbsp;</span>
1414
+ <span class="cline-any cline-no">&nbsp;</span>
1415
+ <span class="cline-any cline-no">&nbsp;</span>
1416
+ <span class="cline-any cline-no">&nbsp;</span>
1417
+ <span class="cline-any cline-no">&nbsp;</span>
1418
+ <span class="cline-any cline-no">&nbsp;</span>
1419
+ <span class="cline-any cline-no">&nbsp;</span>
1420
+ <span class="cline-any cline-no">&nbsp;</span>
1421
+ <span class="cline-any cline-no">&nbsp;</span>
1422
+ <span class="cline-any cline-no">&nbsp;</span>
1423
+ <span class="cline-any cline-no">&nbsp;</span>
1424
+ <span class="cline-any cline-no">&nbsp;</span>
1425
+ <span class="cline-any cline-no">&nbsp;</span>
1426
+ <span class="cline-any cline-no">&nbsp;</span>
1427
+ <span class="cline-any cline-no">&nbsp;</span>
1428
+ <span class="cline-any cline-no">&nbsp;</span>
1429
+ <span class="cline-any cline-no">&nbsp;</span>
1430
+ <span class="cline-any cline-no">&nbsp;</span>
1431
+ <span class="cline-any cline-no">&nbsp;</span>
1432
+ <span class="cline-any cline-no">&nbsp;</span>
1433
+ <span class="cline-any cline-no">&nbsp;</span>
1434
+ <span class="cline-any cline-no">&nbsp;</span>
1435
+ <span class="cline-any cline-no">&nbsp;</span>
1436
+ <span class="cline-any cline-no">&nbsp;</span>
1437
+ <span class="cline-any cline-no">&nbsp;</span>
1438
+ <span class="cline-any cline-no">&nbsp;</span>
1439
+ <span class="cline-any cline-no">&nbsp;</span>
1440
+ <span class="cline-any cline-no">&nbsp;</span>
1441
+ <span class="cline-any cline-no">&nbsp;</span>
1442
+ <span class="cline-any cline-no">&nbsp;</span>
1443
+ <span class="cline-any cline-no">&nbsp;</span>
1444
+ <span class="cline-any cline-no">&nbsp;</span>
1445
+ <span class="cline-any cline-no">&nbsp;</span>
1446
+ <span class="cline-any cline-no">&nbsp;</span>
1447
+ <span class="cline-any cline-no">&nbsp;</span>
1448
+ <span class="cline-any cline-no">&nbsp;</span>
1449
+ <span class="cline-any cline-no">&nbsp;</span>
1450
+ <span class="cline-any cline-no">&nbsp;</span>
1451
+ <span class="cline-any cline-no">&nbsp;</span>
1452
+ <span class="cline-any cline-no">&nbsp;</span>
1453
+ <span class="cline-any cline-no">&nbsp;</span>
1454
+ <span class="cline-any cline-no">&nbsp;</span>
1455
+ <span class="cline-any cline-no">&nbsp;</span>
1456
+ <span class="cline-any cline-no">&nbsp;</span>
1457
+ <span class="cline-any cline-no">&nbsp;</span>
1458
+ <span class="cline-any cline-no">&nbsp;</span>
1459
+ <span class="cline-any cline-no">&nbsp;</span>
1460
+ <span class="cline-any cline-no">&nbsp;</span>
1461
+ <span class="cline-any cline-no">&nbsp;</span>
1462
+ <span class="cline-any cline-no">&nbsp;</span>
1463
+ <span class="cline-any cline-no">&nbsp;</span>
1464
+ <span class="cline-any cline-no">&nbsp;</span>
1465
+ <span class="cline-any cline-no">&nbsp;</span>
1466
+ <span class="cline-any cline-no">&nbsp;</span>
1467
+ <span class="cline-any cline-no">&nbsp;</span>
1468
+ <span class="cline-any cline-no">&nbsp;</span>
1469
+ <span class="cline-any cline-no">&nbsp;</span>
1470
+ <span class="cline-any cline-no">&nbsp;</span>
1471
+ <span class="cline-any cline-no">&nbsp;</span>
1472
+ <span class="cline-any cline-no">&nbsp;</span>
1473
+ <span class="cline-any cline-no">&nbsp;</span>
1474
+ <span class="cline-any cline-no">&nbsp;</span>
1475
+ <span class="cline-any cline-no">&nbsp;</span>
1476
+ <span class="cline-any cline-no">&nbsp;</span>
1477
+ <span class="cline-any cline-no">&nbsp;</span>
1478
+ <span class="cline-any cline-no">&nbsp;</span>
1479
+ <span class="cline-any cline-no">&nbsp;</span>
1480
+ <span class="cline-any cline-no">&nbsp;</span>
1481
+ <span class="cline-any cline-no">&nbsp;</span>
1482
+ <span class="cline-any cline-no">&nbsp;</span>
1483
+ <span class="cline-any cline-no">&nbsp;</span>
1484
+ <span class="cline-any cline-no">&nbsp;</span>
1485
+ <span class="cline-any cline-no">&nbsp;</span>
1486
+ <span class="cline-any cline-no">&nbsp;</span>
1487
+ <span class="cline-any cline-no">&nbsp;</span>
1488
+ <span class="cline-any cline-no">&nbsp;</span>
1489
+ <span class="cline-any cline-no">&nbsp;</span>
1490
+ <span class="cline-any cline-no">&nbsp;</span>
1491
+ <span class="cline-any cline-no">&nbsp;</span>
1492
+ <span class="cline-any cline-no">&nbsp;</span>
1493
+ <span class="cline-any cline-no">&nbsp;</span>
1494
+ <span class="cline-any cline-no">&nbsp;</span>
1495
+ <span class="cline-any cline-no">&nbsp;</span>
1496
+ <span class="cline-any cline-no">&nbsp;</span>
1497
+ <span class="cline-any cline-no">&nbsp;</span>
1498
+ <span class="cline-any cline-no">&nbsp;</span>
1499
+ <span class="cline-any cline-no">&nbsp;</span>
1500
+ <span class="cline-any cline-no">&nbsp;</span>
1501
+ <span class="cline-any cline-no">&nbsp;</span>
1502
+ <span class="cline-any cline-no">&nbsp;</span>
1503
+ <span class="cline-any cline-no">&nbsp;</span>
1504
+ <span class="cline-any cline-no">&nbsp;</span>
1505
+ <span class="cline-any cline-no">&nbsp;</span>
1506
+ <span class="cline-any cline-no">&nbsp;</span>
1507
+ <span class="cline-any cline-no">&nbsp;</span>
1508
+ <span class="cline-any cline-no">&nbsp;</span>
1509
+ <span class="cline-any cline-no">&nbsp;</span>
1510
+ <span class="cline-any cline-no">&nbsp;</span>
1511
+ <span class="cline-any cline-no">&nbsp;</span>
1512
+ <span class="cline-any cline-no">&nbsp;</span>
1513
+ <span class="cline-any cline-no">&nbsp;</span>
1514
+ <span class="cline-any cline-no">&nbsp;</span>
1515
+ <span class="cline-any cline-no">&nbsp;</span>
1516
+ <span class="cline-any cline-no">&nbsp;</span>
1517
+ <span class="cline-any cline-no">&nbsp;</span>
1518
+ <span class="cline-any cline-no">&nbsp;</span>
1519
+ <span class="cline-any cline-no">&nbsp;</span>
1520
+ <span class="cline-any cline-no">&nbsp;</span>
1521
+ <span class="cline-any cline-no">&nbsp;</span>
1522
+ <span class="cline-any cline-no">&nbsp;</span>
1523
+ <span class="cline-any cline-no">&nbsp;</span>
1524
+ <span class="cline-any cline-no">&nbsp;</span>
1525
+ <span class="cline-any cline-no">&nbsp;</span>
1526
+ <span class="cline-any cline-no">&nbsp;</span>
1527
+ <span class="cline-any cline-no">&nbsp;</span>
1528
+ <span class="cline-any cline-no">&nbsp;</span>
1529
+ <span class="cline-any cline-no">&nbsp;</span>
1530
+ <span class="cline-any cline-no">&nbsp;</span>
1531
+ <span class="cline-any cline-no">&nbsp;</span>
1532
+ <span class="cline-any cline-no">&nbsp;</span>
1533
+ <span class="cline-any cline-no">&nbsp;</span>
1534
+ <span class="cline-any cline-no">&nbsp;</span>
1535
+ <span class="cline-any cline-no">&nbsp;</span>
1536
+ <span class="cline-any cline-no">&nbsp;</span>
1537
+ <span class="cline-any cline-no">&nbsp;</span>
1538
+ <span class="cline-any cline-no">&nbsp;</span>
1539
+ <span class="cline-any cline-no">&nbsp;</span>
1540
+ <span class="cline-any cline-no">&nbsp;</span>
1541
+ <span class="cline-any cline-no">&nbsp;</span>
1542
+ <span class="cline-any cline-no">&nbsp;</span>
1543
+ <span class="cline-any cline-no">&nbsp;</span>
1544
+ <span class="cline-any cline-no">&nbsp;</span>
1545
+ <span class="cline-any cline-no">&nbsp;</span>
1546
+ <span class="cline-any cline-no">&nbsp;</span>
1547
+ <span class="cline-any cline-no">&nbsp;</span>
1548
+ <span class="cline-any cline-no">&nbsp;</span>
1549
+ <span class="cline-any cline-no">&nbsp;</span>
1550
+ <span class="cline-any cline-no">&nbsp;</span>
1551
+ <span class="cline-any cline-no">&nbsp;</span>
1552
+ <span class="cline-any cline-no">&nbsp;</span>
1553
+ <span class="cline-any cline-no">&nbsp;</span>
1554
+ <span class="cline-any cline-no">&nbsp;</span>
1555
+ <span class="cline-any cline-no">&nbsp;</span>
1556
+ <span class="cline-any cline-no">&nbsp;</span>
1557
+ <span class="cline-any cline-no">&nbsp;</span>
1558
+ <span class="cline-any cline-no">&nbsp;</span>
1559
+ <span class="cline-any cline-no">&nbsp;</span>
1560
+ <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-no">&nbsp;</span>
1562
+ <span class="cline-any cline-no">&nbsp;</span>
1563
+ <span class="cline-any cline-no">&nbsp;</span>
1564
+ <span class="cline-any cline-no">&nbsp;</span>
1565
+ <span class="cline-any cline-no">&nbsp;</span>
1566
+ <span class="cline-any cline-no">&nbsp;</span>
1567
+ <span class="cline-any cline-no">&nbsp;</span>
1568
+ <span class="cline-any cline-no">&nbsp;</span>
1569
+ <span class="cline-any cline-no">&nbsp;</span>
1570
+ <span class="cline-any cline-no">&nbsp;</span>
1571
+ <span class="cline-any cline-no">&nbsp;</span>
1572
+ <span class="cline-any cline-no">&nbsp;</span>
1573
+ <span class="cline-any cline-no">&nbsp;</span>
1574
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
1575
+ <span class="cstat-no" title="statement not covered" > * @file Provider implementation for HSuite Native Connect protocol.</span>
1576
+ <span class="cstat-no" title="statement not covered" > * @module providers/hsuite-native-provider</span>
1577
+ <span class="cstat-no" title="statement not covered" > *</span>
1578
+ <span class="cstat-no" title="statement not covered" > * @description</span>
1579
+ <span class="cstat-no" title="statement not covered" > * HsuiteNativeProvider implements the {@link BaseWalletProvider} interface for the</span>
1580
+ <span class="cstat-no" title="statement not covered" > * HSuite Native Connect protocol. This provider enables secure communication between</span>
1581
+ <span class="cstat-no" title="statement not covered" > * dApps and HSuite Wallet using the `hsc:` protocol over Nostr relays with automatic</span>
1582
+ <span class="cstat-no" title="statement not covered" > * WebRTC P2P upgrade.</span>
1583
+ <span class="cstat-no" title="statement not covered" > *</span>
1584
+ <span class="cstat-no" title="statement not covered" > * Key Features:</span>
1585
+ <span class="cstat-no" title="statement not covered" > * - **Local-First Discovery**: Uses BroadcastChannel for instant same-browser wallet detection</span>
1586
+ <span class="cstat-no" title="statement not covered" > * - **Nostr Communication**: Uses Nostr relays for encrypted channel messaging</span>
1587
+ <span class="cstat-no" title="statement not covered" > * - **Automatic P2P Upgrade**: Upgrades to direct WebRTC when possible for lower latency</span>
1588
+ <span class="cstat-no" title="statement not covered" > * - **Session Persistence**: Supports automatic reconnection after page reload</span>
1589
+ <span class="cstat-no" title="statement not covered" > * - **Cross-Platform**: Works with desktop browsers, mobile browsers, and native apps</span>
1590
+ <span class="cstat-no" title="statement not covered" > *</span>
1591
+ <span class="cstat-no" title="statement not covered" > * Connection Flow:</span>
1592
+ <span class="cstat-no" title="statement not covered" > * ```</span>
1593
+ <span class="cstat-no" title="statement not covered" > * 1. dApp calls connect() with configuration</span>
1594
+ <span class="cstat-no" title="statement not covered" > * 2. Provider checks local discovery for same-browser wallets (instant!)</span>
1595
+ <span class="cstat-no" title="statement not covered" > * 3. If wallet found -&gt; sends invite via BroadcastChannel (&lt;1ms)</span>
1596
+ <span class="cstat-no" title="statement not covered" > * 4. If not found -&gt; opens wallet tab/window with invite URL</span>
1597
+ <span class="cstat-no" title="statement not covered" > * 5. Wallet receives invite and establishes channel via Nostr relay</span>
1598
+ <span class="cstat-no" title="statement not covered" > * 6. User approves connection in wallet</span>
1599
+ <span class="cstat-no" title="statement not covered" > * 7. Channel becomes active, accounts are available</span>
1600
+ <span class="cstat-no" title="statement not covered" > * 8. P2P upgrade happens automatically in background</span>
1601
+ <span class="cstat-no" title="statement not covered" > * ```</span>
1602
+ <span class="cstat-no" title="statement not covered" > */</span>
1603
+ <span class="cstat-no" title="statement not covered" ></span>
1604
+ <span class="cstat-no" title="statement not covered" >import { Injectable, signal, computed, inject, effect, NgZone } from '@angular/core';</span>
1605
+ <span class="cstat-no" title="statement not covered" >import { getLogger, LocalDiscoveryService } from '@hsuite/native-connect-sdk';</span>
1606
+ <span class="cstat-no" title="statement not covered" ></span>
1607
+ <span class="cstat-no" title="statement not covered" >import type {</span>
1608
+ <span class="cstat-no" title="statement not covered" > ConnectionStatus,</span>
1609
+ <span class="cstat-no" title="statement not covered" > ProviderMetadata,</span>
1610
+ <span class="cstat-no" title="statement not covered" > ConnectionConfig,</span>
1611
+ <span class="cstat-no" title="statement not covered" > HsuiteNativeConfig,</span>
1612
+ <span class="cstat-no" title="statement not covered" >} from '../models/provider-types';</span>
1613
+ <span class="cstat-no" title="statement not covered" >import { DEFAULT_WALLET_URL } from '../models/provider-types';</span>
1614
+ <span class="cstat-no" title="statement not covered" >import type { UnifiedAccount } from '../models/unified-account.model';</span>
1615
+ <span class="cstat-no" title="statement not covered" >import { WalletEventBus } from '../services/wallet-event-bus.service';</span>
1616
+ <span class="cstat-no" title="statement not covered" ></span>
1617
+ <span class="cstat-no" title="statement not covered" >import {</span>
1618
+ <span class="cstat-no" title="statement not covered" > BaseWalletProvider,</span>
1619
+ <span class="cstat-no" title="statement not covered" > SignTransactionOptions,</span>
1620
+ <span class="cstat-no" title="statement not covered" > SubmitTransactionOptions,</span>
1621
+ <span class="cstat-no" title="statement not covered" > SignResult,</span>
1622
+ <span class="cstat-no" title="statement not covered" > SubmitResult,</span>
1623
+ <span class="cstat-no" title="statement not covered" > SignMessageOptions,</span>
1624
+ <span class="cstat-no" title="statement not covered" > SignMessageResult,</span>
1625
+ <span class="cstat-no" title="statement not covered" >} from './base-wallet-provider';</span>
1626
+ <span class="cstat-no" title="statement not covered" >import { ChannelClientService } from './hsuite-native/channel-client.service';</span>
1627
+ <span class="cstat-no" title="statement not covered" ></span>
1628
+ <span class="cstat-no" title="statement not covered" >const logger = getLogger().scoped?.('HsuiteNativeProvider') ?? getLogger();</span>
1629
+ <span class="cstat-no" title="statement not covered" ></span>
1630
+ <span class="cstat-no" title="statement not covered" >/**</span>
1631
+ <span class="cstat-no" title="statement not covered" > * HSuite Native Connect Provider.</span>
1632
+ <span class="cstat-no" title="statement not covered" > *</span>
1633
+ <span class="cstat-no" title="statement not covered" > * @description</span>
1634
+ <span class="cstat-no" title="statement not covered" > * Angular injectable service that manages wallet connections via the HSuite Native</span>
1635
+ <span class="cstat-no" title="statement not covered" > * Connect protocol. This provider uses the unified channel system for secure,</span>
1636
+ <span class="cstat-no" title="statement not covered" > * encrypted communication between dApps and the HSuite Wallet.</span>
1637
+ <span class="cstat-no" title="statement not covered" > *</span>
1638
+ <span class="cstat-no" title="statement not covered" > * Architecture:</span>
1639
+ <span class="cstat-no" title="statement not covered" > * - Uses {@link ChannelClientService} for unified channel-based communication</span>
1640
+ <span class="cstat-no" title="statement not covered" > * - Implements {@link BaseWalletProvider} interface for integration with {@link UnifiedWalletService}</span>
1641
+ <span class="cstat-no" title="statement not covered" > * - Supports both session (1:1 dApp-wallet) and party (N:N multisig) channels</span>
1642
+ <span class="cstat-no" title="statement not covered" > * - Auto-registers with UnifiedWalletService on injection</span>
1643
+ <span class="cstat-no" title="statement not covered" > *</span>
1644
+ <span class="cstat-no" title="statement not covered" > * Transport States (exposed via `transportState` signal):</span>
1645
+ <span class="cstat-no" title="statement not covered" > * - `'idle'` - No active connection</span>
1646
+ <span class="cstat-no" title="statement not covered" > * - `'nostr-only'` - Connected via Nostr relay only</span>
1647
+ <span class="cstat-no" title="statement not covered" > * - `'upgrading'` - P2P upgrade in progress</span>
1648
+ <span class="cstat-no" title="statement not covered" > * - `'p2p-connected'` - Direct P2P connection established</span>
1649
+ <span class="cstat-no" title="statement not covered" > * - `'p2p-failed'` - P2P upgrade failed, using Nostr fallback</span>
1650
+ <span class="cstat-no" title="statement not covered" > *</span>
1651
+ <span class="cstat-no" title="statement not covered" > * @Component({</span>
1652
+ <span class="cstat-no" title="statement not covered" > * template: `</span>
1653
+ <span class="cstat-no" title="statement not covered" > * &lt;ion-badge [color]="transportColor()"&gt;</span>
1654
+ <span class="cstat-no" title="statement not covered" > * {{ transportState() }}</span>
1655
+ <span class="cstat-no" title="statement not covered" > * &lt;/ion-badge&gt;</span>
1656
+ <span class="cstat-no" title="statement not covered" > * `</span>
1657
+ <span class="cstat-no" title="statement not covered" > * })</span>
1658
+ <span class="cstat-no" title="statement not covered" > * export class ConnectionStatus {</span>
1659
+ <span class="cstat-no" title="statement not covered" > * private provider = inject(HsuiteNativeProvider);</span>
1660
+ <span class="cstat-no" title="statement not covered" > *</span>
1661
+ <span class="cstat-no" title="statement not covered" > * transportState = this.provider.transportState;</span>
1662
+ <span class="cstat-no" title="statement not covered" > *</span>
1663
+ <span class="cstat-no" title="statement not covered" > * transportColor = computed(() =&gt; {</span>
1664
+ <span class="cstat-no" title="statement not covered" > * const state = this.transportState();</span>
1665
+ <span class="cstat-no" title="statement not covered" > * return state === 'p2p-connected' ? 'success' : 'warning';</span>
1666
+ <span class="cstat-no" title="statement not covered" > * });</span>
1667
+ <span class="cstat-no" title="statement not covered" > * }</span>
1668
+ <span class="cstat-no" title="statement not covered" > * ```</span>
1669
+ <span class="cstat-no" title="statement not covered" > *</span>
1670
+ <span class="cstat-no" title="statement not covered" > * @publicApi</span>
1671
+ <span class="cstat-no" title="statement not covered" > */</span>
1672
+ <span class="cstat-no" title="statement not covered" >@Injectable({ providedIn: 'root' })</span>
1673
+ <span class="cstat-no" title="statement not covered" >export class HsuiteNativeProvider extends BaseWalletProvider {</span>
1674
+ <span class="cstat-no" title="statement not covered" > private readonly eventBus = inject(WalletEventBus);</span>
1675
+ <span class="cstat-no" title="statement not covered" > private readonly zone = inject(NgZone);</span>
1676
+ <span class="cstat-no" title="statement not covered" > private readonly channelService = inject(ChannelClientService);</span>
1677
+ <span class="cstat-no" title="statement not covered" ></span>
1678
+ <span class="cstat-no" title="statement not covered" > readonly id = 'hsuite-native';</span>
1679
+ <span class="cstat-no" title="statement not covered" ></span>
1680
+ <span class="cstat-no" title="statement not covered" > readonly metadata: ProviderMetadata = {</span>
1681
+ <span class="cstat-no" title="statement not covered" > id: this.id,</span>
1682
+ <span class="cstat-no" title="statement not covered" > name: 'HSuite Native',</span>
1683
+ <span class="cstat-no" title="statement not covered" > type: 'hsuite-native',</span>
1684
+ <span class="cstat-no" title="statement not covered" > description: 'Connect via HSuite Native Connect protocol',</span>
1685
+ <span class="cstat-no" title="statement not covered" > supportsMultipleAccounts: true,</span>
1686
+ <span class="cstat-no" title="statement not covered" > };</span>
1687
+ <span class="cstat-no" title="statement not covered" ></span>
1688
+ <span class="cstat-no" title="statement not covered" > /**</span>
1689
+ <span class="cstat-no" title="statement not covered" > * Error signal (reactive)</span>
1690
+ <span class="cstat-no" title="statement not covered" > */</span>
1691
+ <span class="cstat-no" title="statement not covered" > readonly error = signal&lt;string | null&gt;(null);</span>
1692
+ <span class="cstat-no" title="statement not covered" ></span>
1693
+ <span class="cstat-no" title="statement not covered" > // Track previous connection state for disconnect detection</span>
1694
+ <span class="cstat-no" title="statement not covered" > private previouslyConnected = false;</span>
1695
+ <span class="cstat-no" title="statement not covered" ></span>
1696
+ <span class="cstat-no" title="statement not covered" > /**</span>
1697
+ <span class="cstat-no" title="statement not covered" > * Local discovery service instance.</span>
1698
+ <span class="cstat-no" title="statement not covered" > * Uses BroadcastChannel for instant, private, same-browser wallet discovery.</span>
1699
+ <span class="cstat-no" title="statement not covered" > */</span>
1700
+ <span class="cstat-no" title="statement not covered" > private localDiscoveryService: LocalDiscoveryService | null = null;</span>
1701
+ <span class="cstat-no" title="statement not covered" ></span>
1702
+ <span class="cstat-no" title="statement not covered" > /**</span>
1703
+ <span class="cstat-no" title="statement not covered" > *</span>
1704
+ <span class="cstat-no" title="statement not covered" > */</span>
1705
+ <span class="cstat-no" title="statement not covered" > constructor() {</span>
1706
+ <span class="cstat-no" title="statement not covered" > super();</span>
1707
+ <span class="cstat-no" title="statement not covered" ></span>
1708
+ <span class="cstat-no" title="statement not covered" > // Initialize local discovery service for same-browser wallet detection</span>
1709
+ <span class="cstat-no" title="statement not covered" > this.initializeLocalDiscovery();</span>
1710
+ <span class="cstat-no" title="statement not covered" ></span>
1711
+ <span class="cstat-no" title="statement not covered" > // Synchronize error state from channel service</span>
1712
+ <span class="cstat-no" title="statement not covered" > effect(() =&gt; {</span>
1713
+ <span class="cstat-no" title="statement not covered" > const channelError = this.channelService.error();</span>
1714
+ <span class="cstat-no" title="statement not covered" > if (channelError) {</span>
1715
+ <span class="cstat-no" title="statement not covered" > this.error.set(channelError);</span>
1716
+ <span class="cstat-no" title="statement not covered" > }</span>
1717
+ <span class="cstat-no" title="statement not covered" > });</span>
1718
+ <span class="cstat-no" title="statement not covered" ></span>
1719
+ <span class="cstat-no" title="statement not covered" > // Listen to channel state changes to detect wallet-initiated disconnects</span>
1720
+ <span class="cstat-no" title="statement not covered" > effect(() =&gt; {</span>
1721
+ <span class="cstat-no" title="statement not covered" > const status = this.status();</span>
1722
+ <span class="cstat-no" title="statement not covered" > const isConnected = this.channelService.isConnected();</span>
1723
+ <span class="cstat-no" title="statement not covered" ></span>
1724
+ <span class="cstat-no" title="statement not covered" > // If we were connected but now disconnected, emit disconnect event</span>
1725
+ <span class="cstat-no" title="statement not covered" > if (this.previouslyConnected &amp;&amp; !isConnected &amp;&amp; status === 'disconnected') {</span>
1726
+ <span class="cstat-no" title="statement not covered" > logger.info('[HsuiteNativeProvider] Channel terminated');</span>
1727
+ <span class="cstat-no" title="statement not covered" > this.eventBus.disconnected.emit({</span>
1728
+ <span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
1729
+ <span class="cstat-no" title="statement not covered" > providerType: 'hsuite-native',</span>
1730
+ <span class="cstat-no" title="statement not covered" > reason: 'session_terminated',</span>
1731
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
1732
+ <span class="cstat-no" title="statement not covered" > });</span>
1733
+ <span class="cstat-no" title="statement not covered" > }</span>
1734
+ <span class="cstat-no" title="statement not covered" ></span>
1735
+ <span class="cstat-no" title="statement not covered" > // Update tracking state</span>
1736
+ <span class="cstat-no" title="statement not covered" > this.previouslyConnected = isConnected;</span>
1737
+ <span class="cstat-no" title="statement not covered" > });</span>
1738
+ <span class="cstat-no" title="statement not covered" ></span>
1739
+ <span class="cstat-no" title="statement not covered" > // Attempt automatic reconnect when session exists after reload</span>
1740
+ <span class="cstat-no" title="statement not covered" > void this.attemptReconnect().catch((error) =&gt; {</span>
1741
+ <span class="cstat-no" title="statement not covered" > logger.debug('[HsuiteNativeProvider] Auto-reconnect skipped', { error });</span>
1742
+ <span class="cstat-no" title="statement not covered" > });</span>
1743
+ <span class="cstat-no" title="statement not covered" > }</span>
1744
+ <span class="cstat-no" title="statement not covered" ></span>
1745
+ <span class="cstat-no" title="statement not covered" > /**</span>
1746
+ <span class="cstat-no" title="statement not covered" > * Initialize local discovery for same-browser wallet detection.</span>
1747
+ <span class="cstat-no" title="statement not covered" > * Uses BroadcastChannel for instant, private discovery.</span>
1748
+ <span class="cstat-no" title="statement not covered" > * Cross-device connections use QR/URL flow (no discovery needed).</span>
1749
+ <span class="cstat-no" title="statement not covered" > */</span>
1750
+ <span class="cstat-no" title="statement not covered" > private initializeLocalDiscovery(): void {</span>
1751
+ <span class="cstat-no" title="statement not covered" > this.localDiscoveryService = LocalDiscoveryService.getDAppInstance();</span>
1752
+ <span class="cstat-no" title="statement not covered" > this.localDiscoveryService.start();</span>
1753
+ <span class="cstat-no" title="statement not covered" > }</span>
1754
+ <span class="cstat-no" title="statement not covered" ></span>
1755
+ <span class="cstat-no" title="statement not covered" > /**</span>
1756
+ <span class="cstat-no" title="statement not covered" > * Maps the internal channel state to the provider connection status.</span>
1757
+ <span class="cstat-no" title="statement not covered" > *</span>
1758
+ <span class="cstat-no" title="statement not covered" > * @description</span>
1759
+ <span class="cstat-no" title="statement not covered" > * Computed signal that translates ChannelClientService states to</span>
1760
+ <span class="cstat-no" title="statement not covered" > * standard ConnectionStatus values for UI binding.</span>
1761
+ <span class="cstat-no" title="statement not covered" > *</span>
1762
+ <span class="cstat-no" title="statement not covered" > * @returns Current connection status</span>
1763
+ <span class="cstat-no" title="statement not covered" > */</span>
1764
+ <span class="cstat-no" title="statement not covered" > readonly status = computed&lt;ConnectionStatus&gt;(() =&gt; {</span>
1765
+ <span class="cstat-no" title="statement not covered" > const state = this.channelService.state();</span>
1766
+ <span class="cstat-no" title="statement not covered" ></span>
1767
+ <span class="cstat-no" title="statement not covered" > switch (state) {</span>
1768
+ <span class="cstat-no" title="statement not covered" > case 'idle':</span>
1769
+ <span class="cstat-no" title="statement not covered" > return 'idle';</span>
1770
+ <span class="cstat-no" title="statement not covered" > case 'connecting':</span>
1771
+ <span class="cstat-no" title="statement not covered" > case 'pending':</span>
1772
+ <span class="cstat-no" title="statement not covered" > return 'connecting';</span>
1773
+ <span class="cstat-no" title="statement not covered" > case 'active':</span>
1774
+ <span class="cstat-no" title="statement not covered" > case 'approved':</span>
1775
+ <span class="cstat-no" title="statement not covered" > return 'connected';</span>
1776
+ <span class="cstat-no" title="statement not covered" > case 'disconnected':</span>
1777
+ <span class="cstat-no" title="statement not covered" > return 'disconnected';</span>
1778
+ <span class="cstat-no" title="statement not covered" > case 'error':</span>
1779
+ <span class="cstat-no" title="statement not covered" > return 'error';</span>
1780
+ <span class="cstat-no" title="statement not covered" > default:</span>
1781
+ <span class="cstat-no" title="statement not covered" > return 'idle';</span>
1782
+ <span class="cstat-no" title="statement not covered" > }</span>
1783
+ <span class="cstat-no" title="statement not covered" > });</span>
1784
+ <span class="cstat-no" title="statement not covered" ></span>
1785
+ <span class="cstat-no" title="statement not covered" > /**</span>
1786
+ <span class="cstat-no" title="statement not covered" > * Current transport state (nostr-only, upgrading, p2p-connected, p2p-failed).</span>
1787
+ <span class="cstat-no" title="statement not covered" > * Use this to show users whether they're connected via Nostr relay or P2P.</span>
1788
+ <span class="cstat-no" title="statement not covered" > */</span>
1789
+ <span class="cstat-no" title="statement not covered" > readonly transportState = computed(() =&gt; this.channelService.transportState());</span>
1790
+ <span class="cstat-no" title="statement not covered" ></span>
1791
+ <span class="cstat-no" title="statement not covered" > /**</span>
1792
+ <span class="cstat-no" title="statement not covered" > * Connected accounts from the wallet in UnifiedAccount format.</span>
1793
+ <span class="cstat-no" title="statement not covered" > *</span>
1794
+ <span class="cstat-no" title="statement not covered" > * @description</span>
1795
+ <span class="cstat-no" title="statement not covered" > * Computed signal that exposes wallet accounts from the channel service</span>
1796
+ <span class="cstat-no" title="statement not covered" > * in the standard UnifiedAccount format for UI binding.</span>
1797
+ <span class="cstat-no" title="statement not covered" > *</span>
1798
+ <span class="cstat-no" title="statement not covered" > * @returns Array of connected accounts (empty when disconnected)</span>
1799
+ <span class="cstat-no" title="statement not covered" > */</span>
1800
+ <span class="cstat-no" title="statement not covered" > readonly accounts = computed&lt;UnifiedAccount[]&gt;(() =&gt; {</span>
1801
+ <span class="cstat-no" title="statement not covered" > return this.channelService.unifiedAccounts();</span>
1802
+ <span class="cstat-no" title="statement not covered" > });</span>
1803
+ <span class="cstat-no" title="statement not covered" ></span>
1804
+ <span class="cstat-no" title="statement not covered" > /**</span>
1805
+ <span class="cstat-no" title="statement not covered" > * Check if provider is connected</span>
1806
+ <span class="cstat-no" title="statement not covered" > */</span>
1807
+ <span class="cstat-no" title="statement not covered" > override isConnected(): boolean {</span>
1808
+ <span class="cstat-no" title="statement not covered" > return this.channelService.isConnected();</span>
1809
+ <span class="cstat-no" title="statement not covered" > }</span>
1810
+ <span class="cstat-no" title="statement not covered" ></span>
1811
+ <span class="cstat-no" title="statement not covered" > /**</span>
1812
+ <span class="cstat-no" title="statement not covered" > * Connects to HSuite Wallet via the Native Connect protocol.</span>
1813
+ <span class="cstat-no" title="statement not covered" > *</span>
1814
+ <span class="cstat-no" title="statement not covered" > * @description</span>
1815
+ <span class="cstat-no" title="statement not covered" > * Initiates a connection to HSuite Wallet using the optimal method for the</span>
1816
+ <span class="cstat-no" title="statement not covered" > * current platform:</span>
1817
+ <span class="cstat-no" title="statement not covered" > *</span>
1818
+ <span class="cstat-no" title="statement not covered" > * **Desktop Browsers**:</span>
1819
+ <span class="cstat-no" title="statement not covered" > * 1. Checks if wallet is already online via Nostr discovery (instant!)</span>
1820
+ <span class="cstat-no" title="statement not covered" > * 2. If found, sends invite directly via relay</span>
1821
+ <span class="cstat-no" title="statement not covered" > * 3. If not found, opens wallet in new tab/window</span>
1822
+ <span class="cstat-no" title="statement not covered" > *</span>
1823
+ <span class="cstat-no" title="statement not covered" > * **Mobile Browsers**:</span>
1824
+ <span class="cstat-no" title="statement not covered" > * 1. Tries hsuite: deep link to open native wallet app</span>
1825
+ <span class="cstat-no" title="statement not covered" > * 2. Falls back to opening wallet in same tab (PWA) or new tab</span>
1826
+ <span class="cstat-no" title="statement not covered" > *</span>
1827
+ <span class="cstat-no" title="statement not covered" > * The connection completes when the wallet user approves the session.</span>
1828
+ <span class="cstat-no" title="statement not covered" > *</span>
1829
+ <span class="cstat-no" title="statement not covered" > * @param config - HSuite Native connection configuration</span>
1830
+ <span class="cstat-no" title="statement not covered" > *</span>
1831
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If configuration is invalid</span>
1832
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If connection times out (default 120 seconds)</span>
1833
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If popup is blocked and wallet cannot be opened</span>
1834
+ <span class="cstat-no" title="statement not covered" > */</span>
1835
+ <span class="cstat-no" title="statement not covered" > override async connect(config: ConnectionConfig): Promise&lt;void&gt; {</span>
1836
+ <span class="cstat-no" title="statement not covered" > if (!this.isHsuiteNativeConfig(config)) {</span>
1837
+ <span class="cstat-no" title="statement not covered" > throw new Error('Invalid HSuite Native configuration');</span>
1838
+ <span class="cstat-no" title="statement not covered" > }</span>
1839
+ <span class="cstat-no" title="statement not covered" ></span>
1840
+ <span class="cstat-no" title="statement not covered" > // Guard: Don't start a new connection if already connecting</span>
1841
+ <span class="cstat-no" title="statement not covered" > const currentStatus = this.status();</span>
1842
+ <span class="cstat-no" title="statement not covered" > if (currentStatus === 'connecting') {</span>
1843
+ <span class="cstat-no" title="statement not covered" > logger.warn('Connection already in progress, ignoring duplicate request');</span>
1844
+ <span class="cstat-no" title="statement not covered" > return;</span>
1845
+ <span class="cstat-no" title="statement not covered" > }</span>
1846
+ <span class="cstat-no" title="statement not covered" ></span>
1847
+ <span class="cstat-no" title="statement not covered" > logger.info('Connecting to HSuite Wallet via unified channel protocol', { config });</span>
1848
+ <span class="cstat-no" title="statement not covered" ></span>
1849
+ <span class="cstat-no" title="statement not covered" > try {</span>
1850
+ <span class="cstat-no" title="statement not covered" > const invite = await this.channelService.connect({</span>
1851
+ <span class="cstat-no" title="statement not covered" > type: 'session',</span>
1852
+ <span class="cstat-no" title="statement not covered" > appId: config.appId || 'hsuite-dapp',</span>
1853
+ <span class="cstat-no" title="statement not covered" > appName: config.appName || 'HSuite dApp',</span>
1854
+ <span class="cstat-no" title="statement not covered" > ledgerId: config.ledgerId,</span>
1855
+ <span class="cstat-no" title="statement not covered" > networkId: config.networkId,</span>
1856
+ <span class="cstat-no" title="statement not covered" > walletUrl: config.walletUrl || DEFAULT_WALLET_URL,</span>
1857
+ <span class="cstat-no" title="statement not covered" > });</span>
1858
+ <span class="cstat-no" title="statement not covered" ></span>
1859
+ <span class="cstat-no" title="statement not covered" > // Open wallet with invite URL</span>
1860
+ <span class="cstat-no" title="statement not covered" > const walletUrl = config.walletUrl || DEFAULT_WALLET_URL;</span>
1861
+ <span class="cstat-no" title="statement not covered" > const inviteUrl = this.channelService.getWalletInviteUrl(invite, walletUrl);</span>
1862
+ <span class="cstat-no" title="statement not covered" ></span>
1863
+ <span class="cstat-no" title="statement not covered" > // Open wallet using Nostr-based discovery (works cross-origin, cross-port)</span>
1864
+ <span class="cstat-no" title="statement not covered" > await this.openWalletWindow(inviteUrl, walletUrl, config);</span>
1865
+ <span class="cstat-no" title="statement not covered" ></span>
1866
+ <span class="cstat-no" title="statement not covered" > // Wait for connection to be established</span>
1867
+ <span class="cstat-no" title="statement not covered" > await this.waitForConnection();</span>
1868
+ <span class="cstat-no" title="statement not covered" ></span>
1869
+ <span class="cstat-no" title="statement not covered" > // Run in NgZone to trigger Angular change detection</span>
1870
+ <span class="cstat-no" title="statement not covered" > this.zone.run(() =&gt; {</span>
1871
+ <span class="cstat-no" title="statement not covered" > const accounts = this.accounts();</span>
1872
+ <span class="cstat-no" title="statement not covered" > this.eventBus.connected.emit({</span>
1873
+ <span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
1874
+ <span class="cstat-no" title="statement not covered" > providerType: 'hsuite-native',</span>
1875
+ <span class="cstat-no" title="statement not covered" > accounts,</span>
1876
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
1877
+ <span class="cstat-no" title="statement not covered" > });</span>
1878
+ <span class="cstat-no" title="statement not covered" ></span>
1879
+ <span class="cstat-no" title="statement not covered" > logger.info('Connected successfully via unified channel', {</span>
1880
+ <span class="cstat-no" title="statement not covered" > channelId: invite.id.slice(0, 8),</span>
1881
+ <span class="cstat-no" title="statement not covered" > accountCount: accounts.length,</span>
1882
+ <span class="cstat-no" title="statement not covered" > });</span>
1883
+ <span class="cstat-no" title="statement not covered" > });</span>
1884
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1885
+ <span class="cstat-no" title="statement not covered" > logger.error('Connection failed', { error });</span>
1886
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1887
+ <span class="cstat-no" title="statement not covered" > }</span>
1888
+ <span class="cstat-no" title="statement not covered" > }</span>
1889
+ <span class="cstat-no" title="statement not covered" ></span>
1890
+ <span class="cstat-no" title="statement not covered" > /**</span>
1891
+ <span class="cstat-no" title="statement not covered" > * Open wallet window with LOCAL-FIRST discovery.</span>
1892
+ <span class="cstat-no" title="statement not covered" > *</span>
1893
+ <span class="cstat-no" title="statement not covered" > * LOCAL DISCOVERY MODEL:</span>
1894
+ <span class="cstat-no" title="statement not covered" > * 1. Check if wallet is online in same browser via BroadcastChannel (instant!)</span>
1895
+ <span class="cstat-no" title="statement not covered" > * 2. If not immediately found, wait briefly (500ms) for wallet heartbeat</span>
1896
+ <span class="cstat-no" title="statement not covered" > * 3. If wallet found → send invite via BroadcastChannel (&lt;1ms), focus existing tab</span>
1897
+ <span class="cstat-no" title="statement not covered" > * 4. If not found → open wallet tab or use QR/deep link</span>
1898
+ <span class="cstat-no" title="statement not covered" > *</span>
1899
+ <span class="cstat-no" title="statement not covered" > * Cross-device connections use QR/URL flow - the invite is self-contained,</span>
1900
+ <span class="cstat-no" title="statement not covered" > * no discovery needed.</span>
1901
+ <span class="cstat-no" title="statement not covered" > *</span>
1902
+ <span class="cstat-no" title="statement not covered" > * @param inviteUrl - Full URL with invite parameter</span>
1903
+ <span class="cstat-no" title="statement not covered" > * @param walletBaseUrl - Base URL of the wallet</span>
1904
+ <span class="cstat-no" title="statement not covered" > * @param config - Connection configuration with app metadata</span>
1905
+ <span class="cstat-no" title="statement not covered" > */</span>
1906
+ <span class="cstat-no" title="statement not covered" > private async openWalletWindow(</span>
1907
+ <span class="cstat-no" title="statement not covered" > inviteUrl: string,</span>
1908
+ <span class="cstat-no" title="statement not covered" > walletBaseUrl: string,</span>
1909
+ <span class="cstat-no" title="statement not covered" > config?: HsuiteNativeConfig,</span>
1910
+ <span class="cstat-no" title="statement not covered" > ): Promise&lt;void&gt; {</span>
1911
+ <span class="cstat-no" title="statement not covered" > const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);</span>
1912
+ <span class="cstat-no" title="statement not covered" ></span>
1913
+ <span class="cstat-no" title="statement not covered" > // LOCAL-FIRST DISCOVERY</span>
1914
+ <span class="cstat-no" title="statement not covered" > // Wait briefly for wallet heartbeat before opening new tab</span>
1915
+ <span class="cstat-no" title="statement not covered" > if (this.localDiscoveryService?.active) {</span>
1916
+ <span class="cstat-no" title="statement not covered" > // Wait up to 500ms for a wallet to announce itself</span>
1917
+ <span class="cstat-no" title="statement not covered" > const wallet = await this.localDiscoveryService.waitForWallet({</span>
1918
+ <span class="cstat-no" title="statement not covered" > timeoutMs: 500,</span>
1919
+ <span class="cstat-no" title="statement not covered" > ledgerId: config?.ledgerId,</span>
1920
+ <span class="cstat-no" title="statement not covered" > });</span>
1921
+ <span class="cstat-no" title="statement not covered" ></span>
1922
+ <span class="cstat-no" title="statement not covered" > if (wallet) {</span>
1923
+ <span class="cstat-no" title="statement not covered" > // Send invite directly via BroadcastChannel - instant, no network!</span>
1924
+ <span class="cstat-no" title="statement not covered" > this.localDiscoveryService.sendInvite(</span>
1925
+ <span class="cstat-no" title="statement not covered" > wallet.fingerprint,</span>
1926
+ <span class="cstat-no" title="statement not covered" > inviteUrl,</span>
1927
+ <span class="cstat-no" title="statement not covered" > config?.appId,</span>
1928
+ <span class="cstat-no" title="statement not covered" > config?.appName,</span>
1929
+ <span class="cstat-no" title="statement not covered" > );</span>
1930
+ <span class="cstat-no" title="statement not covered" > logger.info('[HsuiteNativeProvider] Sent invite via local discovery', {</span>
1931
+ <span class="cstat-no" title="statement not covered" > wallet: wallet.fingerprint.slice(0, 8),</span>
1932
+ <span class="cstat-no" title="statement not covered" > });</span>
1933
+ <span class="cstat-no" title="statement not covered" > return;</span>
1934
+ <span class="cstat-no" title="statement not covered" > }</span>
1935
+ <span class="cstat-no" title="statement not covered" > }</span>
1936
+ <span class="cstat-no" title="statement not covered" ></span>
1937
+ <span class="cstat-no" title="statement not covered" > // MOBILE: Prefer same-tab navigation for PWA wallet</span>
1938
+ <span class="cstat-no" title="statement not covered" > if (isMobile) {</span>
1939
+ <span class="cstat-no" title="statement not covered" > const isSameOrigin = this.isSameOrigin(walletBaseUrl);</span>
1940
+ <span class="cstat-no" title="statement not covered" ></span>
1941
+ <span class="cstat-no" title="statement not covered" > if (isSameOrigin) {</span>
1942
+ <span class="cstat-no" title="statement not covered" > window.location.href = inviteUrl;</span>
1943
+ <span class="cstat-no" title="statement not covered" > return;</span>
1944
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1945
+ <span class="cstat-no" title="statement not covered" > // Try deep link first</span>
1946
+ <span class="cstat-no" title="statement not covered" > const deepLinkUrl = inviteUrl.replace(/^https?:/, 'hsuite:');</span>
1947
+ <span class="cstat-no" title="statement not covered" > try {</span>
1948
+ <span class="cstat-no" title="statement not covered" > window.location.href = deepLinkUrl;</span>
1949
+ <span class="cstat-no" title="statement not covered" > await new Promise((resolve) =&gt; setTimeout(resolve, 500));</span>
1950
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
1951
+ <span class="cstat-no" title="statement not covered" > // Deep link failed, continue to open tab</span>
1952
+ <span class="cstat-no" title="statement not covered" > }</span>
1953
+ <span class="cstat-no" title="statement not covered" > }</span>
1954
+ <span class="cstat-no" title="statement not covered" > }</span>
1955
+ <span class="cstat-no" title="statement not covered" ></span>
1956
+ <span class="cstat-no" title="statement not covered" > // FALLBACK: Open wallet in a new tab (for same-browser) or show QR (cross-device)</span>
1957
+ <span class="cstat-no" title="statement not covered" > // §29.8 SOC2 CC6.1: noopener,noreferrer prevents a compromised dApp-supplied</span>
1958
+ <span class="cstat-no" title="statement not covered" > // inviteUrl from hijacking the dApp tab via window.opener. A side effect is</span>
1959
+ <span class="cstat-no" title="statement not covered" > // that window.open() returns null, so we can no longer use the return value</span>
1960
+ <span class="cstat-no" title="statement not covered" > // to detect popup-blocked; modern browsers surface that via their own UI</span>
1961
+ <span class="cstat-no" title="statement not covered" > // and the caller's waitForConnection() timeout will error out if the user</span>
1962
+ <span class="cstat-no" title="statement not covered" > // dismissed the popup dialog without allowing.</span>
1963
+ <span class="cstat-no" title="statement not covered" > const walletWindow = window.open(inviteUrl, 'hsuite-wallet', 'noopener,noreferrer');</span>
1964
+ <span class="cstat-no" title="statement not covered" > // .focus() is a no-op with noopener (walletWindow === null); fresh tabs</span>
1965
+ <span class="cstat-no" title="statement not covered" > // are already focused in every mainstream browser.</span>
1966
+ <span class="cstat-no" title="statement not covered" > void walletWindow;</span>
1967
+ <span class="cstat-no" title="statement not covered" > }</span>
1968
+ <span class="cstat-no" title="statement not covered" ></span>
1969
+ <span class="cstat-no" title="statement not covered" > /**</span>
1970
+ <span class="cstat-no" title="statement not covered" > * Check if a URL is same origin as current page.</span>
1971
+ <span class="cstat-no" title="statement not covered" > * @param url</span>
1972
+ <span class="cstat-no" title="statement not covered" > */</span>
1973
+ <span class="cstat-no" title="statement not covered" > private isSameOrigin(url: string): boolean {</span>
1974
+ <span class="cstat-no" title="statement not covered" > try {</span>
1975
+ <span class="cstat-no" title="statement not covered" > const walletOrigin = new URL(url).origin;</span>
1976
+ <span class="cstat-no" title="statement not covered" > return walletOrigin === window.location.origin;</span>
1977
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
1978
+ <span class="cstat-no" title="statement not covered" > return false;</span>
1979
+ <span class="cstat-no" title="statement not covered" > }</span>
1980
+ <span class="cstat-no" title="statement not covered" > }</span>
1981
+ <span class="cstat-no" title="statement not covered" ></span>
1982
+ <span class="cstat-no" title="statement not covered" > /**</span>
1983
+ <span class="cstat-no" title="statement not covered" > * Wait for channel connection to be established</span>
1984
+ <span class="cstat-no" title="statement not covered" > * @param timeoutMs</span>
1985
+ <span class="cstat-no" title="statement not covered" > */</span>
1986
+ <span class="cstat-no" title="statement not covered" > private async waitForConnection(timeoutMs = 120000): Promise&lt;void&gt; {</span>
1987
+ <span class="cstat-no" title="statement not covered" > const startTime = Date.now();</span>
1988
+ <span class="cstat-no" title="statement not covered" ></span>
1989
+ <span class="cstat-no" title="statement not covered" > return new Promise((resolve, reject) =&gt; {</span>
1990
+ <span class="cstat-no" title="statement not covered" > const checkConnection = () =&gt; {</span>
1991
+ <span class="cstat-no" title="statement not covered" > if (this.channelService.isConnected()) {</span>
1992
+ <span class="cstat-no" title="statement not covered" > resolve();</span>
1993
+ <span class="cstat-no" title="statement not covered" > return;</span>
1994
+ <span class="cstat-no" title="statement not covered" > }</span>
1995
+ <span class="cstat-no" title="statement not covered" ></span>
1996
+ <span class="cstat-no" title="statement not covered" > const state = this.channelService.state();</span>
1997
+ <span class="cstat-no" title="statement not covered" > if (state === 'error') {</span>
1998
+ <span class="cstat-no" title="statement not covered" > reject(new Error(this.channelService.error() || 'Connection failed'));</span>
1999
+ <span class="cstat-no" title="statement not covered" > return;</span>
2000
+ <span class="cstat-no" title="statement not covered" > }</span>
2001
+ <span class="cstat-no" title="statement not covered" ></span>
2002
+ <span class="cstat-no" title="statement not covered" > // Also handle disconnected state (wallet rejected or terminated)</span>
2003
+ <span class="cstat-no" title="statement not covered" > if (state === 'disconnected') {</span>
2004
+ <span class="cstat-no" title="statement not covered" > reject(new Error(this.channelService.error() || 'Connection rejected by wallet'));</span>
2005
+ <span class="cstat-no" title="statement not covered" > return;</span>
2006
+ <span class="cstat-no" title="statement not covered" > }</span>
2007
+ <span class="cstat-no" title="statement not covered" ></span>
2008
+ <span class="cstat-no" title="statement not covered" > if (Date.now() - startTime &gt; timeoutMs) {</span>
2009
+ <span class="cstat-no" title="statement not covered" > reject(new Error('Connection timeout'));</span>
2010
+ <span class="cstat-no" title="statement not covered" > return;</span>
2011
+ <span class="cstat-no" title="statement not covered" > }</span>
2012
+ <span class="cstat-no" title="statement not covered" ></span>
2013
+ <span class="cstat-no" title="statement not covered" > setTimeout(checkConnection, 100);</span>
2014
+ <span class="cstat-no" title="statement not covered" > };</span>
2015
+ <span class="cstat-no" title="statement not covered" ></span>
2016
+ <span class="cstat-no" title="statement not covered" > checkConnection();</span>
2017
+ <span class="cstat-no" title="statement not covered" > });</span>
2018
+ <span class="cstat-no" title="statement not covered" > }</span>
2019
+ <span class="cstat-no" title="statement not covered" ></span>
2020
+ <span class="cstat-no" title="statement not covered" > /**</span>
2021
+ <span class="cstat-no" title="statement not covered" > * Disconnects from the HSuite Wallet.</span>
2022
+ <span class="cstat-no" title="statement not covered" > *</span>
2023
+ <span class="cstat-no" title="statement not covered" > * @description</span>
2024
+ <span class="cstat-no" title="statement not covered" > * Terminates the channel connection and clears session state. The wallet</span>
2025
+ <span class="cstat-no" title="statement not covered" > * is notified of the disconnection. Emits a 'disconnected' event via</span>
2026
+ <span class="cstat-no" title="statement not covered" > * WalletEventBus regardless of success or failure.</span>
2027
+ <span class="cstat-no" title="statement not covered" > *</span>
2028
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If disconnection fails (event still emitted)</span>
2029
+ <span class="cstat-no" title="statement not covered" > */</span>
2030
+ <span class="cstat-no" title="statement not covered" > override async disconnect(): Promise&lt;void&gt; {</span>
2031
+ <span class="cstat-no" title="statement not covered" > logger.info('Disconnecting from HSuite Wallet');</span>
2032
+ <span class="cstat-no" title="statement not covered" ></span>
2033
+ <span class="cstat-no" title="statement not covered" > try {</span>
2034
+ <span class="cstat-no" title="statement not covered" > await this.channelService.disconnect();</span>
2035
+ <span class="cstat-no" title="statement not covered" ></span>
2036
+ <span class="cstat-no" title="statement not covered" > // Emit disconnection event</span>
2037
+ <span class="cstat-no" title="statement not covered" > this.eventBus.disconnected.emit({</span>
2038
+ <span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
2039
+ <span class="cstat-no" title="statement not covered" > providerType: 'hsuite-native',</span>
2040
+ <span class="cstat-no" title="statement not covered" > reason: 'user_initiated',</span>
2041
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
2042
+ <span class="cstat-no" title="statement not covered" > });</span>
2043
+ <span class="cstat-no" title="statement not covered" ></span>
2044
+ <span class="cstat-no" title="statement not covered" > logger.info('Disconnected successfully');</span>
2045
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2046
+ <span class="cstat-no" title="statement not covered" > logger.error('Disconnection failed', { error });</span>
2047
+ <span class="cstat-no" title="statement not covered" > // Still emit event even if disconnect fails</span>
2048
+ <span class="cstat-no" title="statement not covered" > this.eventBus.disconnected.emit({</span>
2049
+ <span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
2050
+ <span class="cstat-no" title="statement not covered" > providerType: 'hsuite-native',</span>
2051
+ <span class="cstat-no" title="statement not covered" > reason: 'error',</span>
2052
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
2053
+ <span class="cstat-no" title="statement not covered" > });</span>
2054
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
2055
+ <span class="cstat-no" title="statement not covered" > }</span>
2056
+ <span class="cstat-no" title="statement not covered" > }</span>
2057
+ <span class="cstat-no" title="statement not covered" ></span>
2058
+ <span class="cstat-no" title="statement not covered" > /**</span>
2059
+ <span class="cstat-no" title="statement not covered" > * Signs a transaction without submitting it to the network.</span>
2060
+ <span class="cstat-no" title="statement not covered" > *</span>
2061
+ <span class="cstat-no" title="statement not covered" > * @description</span>
2062
+ <span class="cstat-no" title="statement not covered" > * Sends the transaction payload to the wallet for signing. The wallet</span>
2063
+ <span class="cstat-no" title="statement not covered" > * displays the transaction details and prompts the user for approval.</span>
2064
+ <span class="cstat-no" title="statement not covered" > * If approved, the signed transaction is returned.</span>
2065
+ <span class="cstat-no" title="statement not covered" > *</span>
2066
+ <span class="cstat-no" title="statement not covered" > * @param options - Transaction signing options</span>
2067
+ <span class="cstat-no" title="statement not covered" > *</span>
2068
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to the signing result with signed payload</span>
2069
+ <span class="cstat-no" title="statement not covered" > *</span>
2070
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If user rejects the signing request</span>
2071
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If wallet is not connected</span>
2072
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If channel communication fails</span>
2073
+ <span class="cstat-no" title="statement not covered" > */</span>
2074
+ <span class="cstat-no" title="statement not covered" > override async signTransaction(options: SignTransactionOptions): Promise&lt;SignResult&gt; {</span>
2075
+ <span class="cstat-no" title="statement not covered" > logger.info('Signing transaction', { options });</span>
2076
+ <span class="cstat-no" title="statement not covered" ></span>
2077
+ <span class="cstat-no" title="statement not covered" > try {</span>
2078
+ <span class="cstat-no" title="statement not covered" > const response = await this.channelService.signTransaction({</span>
2079
+ <span class="cstat-no" title="statement not covered" > accountAddress: options.accountAddress,</span>
2080
+ <span class="cstat-no" title="statement not covered" > payload: options.payload,</span>
2081
+ <span class="cstat-no" title="statement not covered" > ledgerId: options.ledgerId,</span>
2082
+ <span class="cstat-no" title="statement not covered" > networkId: options.networkId,</span>
2083
+ <span class="cstat-no" title="statement not covered" > });</span>
2084
+ <span class="cstat-no" title="statement not covered" ></span>
2085
+ <span class="cstat-no" title="statement not covered" > logger.info('Transaction signed');</span>
2086
+ <span class="cstat-no" title="statement not covered" ></span>
2087
+ <span class="cstat-no" title="statement not covered" > return {</span>
2088
+ <span class="cstat-no" title="statement not covered" > signedPayload: response.signedPayload || '',</span>
2089
+ <span class="cstat-no" title="statement not covered" > signature: response.signature,</span>
2090
+ <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
2091
+ <span class="cstat-no" title="statement not covered" > };</span>
2092
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2093
+ <span class="cstat-no" title="statement not covered" > logger.error('Transaction signing failed', { error });</span>
2094
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
2095
+ <span class="cstat-no" title="statement not covered" > }</span>
2096
+ <span class="cstat-no" title="statement not covered" > }</span>
2097
+ <span class="cstat-no" title="statement not covered" ></span>
2098
+ <span class="cstat-no" title="statement not covered" > /**</span>
2099
+ <span class="cstat-no" title="statement not covered" > * Signs and executes a transaction atomically in a single prompt.</span>
2100
+ <span class="cstat-no" title="statement not covered" > *</span>
2101
+ <span class="cstat-no" title="statement not covered" > * @description</span>
2102
+ <span class="cstat-no" title="statement not covered" > * Performs sign and submit as a single atomic operation with one user</span>
2103
+ <span class="cstat-no" title="statement not covered" > * approval prompt. This is the recommended method for transaction submission</span>
2104
+ <span class="cstat-no" title="statement not covered" > * as it provides better UX and matches WalletConnect's behavior.</span>
2105
+ <span class="cstat-no" title="statement not covered" > *</span>
2106
+ <span class="cstat-no" title="statement not covered" > * Called by {@link UnifiedWalletService.signAndExecuteTransaction} to ensure</span>
2107
+ <span class="cstat-no" title="statement not covered" > * consistent single-prompt behavior across all provider types.</span>
2108
+ <span class="cstat-no" title="statement not covered" > *</span>
2109
+ <span class="cstat-no" title="statement not covered" > * @param options - Transaction submission options</span>
2110
+ <span class="cstat-no" title="statement not covered" > *</span>
2111
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to submission result with transaction ID</span>
2112
+ <span class="cstat-no" title="statement not covered" > *</span>
2113
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If user rejects the transaction</span>
2114
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If wallet is not connected</span>
2115
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If transaction submission fails</span>
2116
+ <span class="cstat-no" title="statement not covered" > */</span>
2117
+ <span class="cstat-no" title="statement not covered" > async signAndExecuteTransaction(options: SubmitTransactionOptions): Promise&lt;SubmitResult&gt; {</span>
2118
+ <span class="cstat-no" title="statement not covered" > logger.info('signAndExecuteTransaction called (single prompt)', {</span>
2119
+ <span class="cstat-no" title="statement not covered" > accountAddress: options.accountAddress,</span>
2120
+ <span class="cstat-no" title="statement not covered" > ledgerId: options.ledgerId,</span>
2121
+ <span class="cstat-no" title="statement not covered" > networkId: options.networkId,</span>
2122
+ <span class="cstat-no" title="statement not covered" > });</span>
2123
+ <span class="cstat-no" title="statement not covered" ></span>
2124
+ <span class="cstat-no" title="statement not covered" > return this.submitTransactionInternal(options);</span>
2125
+ <span class="cstat-no" title="statement not covered" > }</span>
2126
+ <span class="cstat-no" title="statement not covered" ></span>
2127
+ <span class="cstat-no" title="statement not covered" > /**</span>
2128
+ <span class="cstat-no" title="statement not covered" > * Signs and submits a transaction to the blockchain.</span>
2129
+ <span class="cstat-no" title="statement not covered" > *</span>
2130
+ <span class="cstat-no" title="statement not covered" > * @description</span>
2131
+ <span class="cstat-no" title="statement not covered" > * The **preferred method** for submitting transactions. Performs sign and</span>
2132
+ <span class="cstat-no" title="statement not covered" > * submit as a single atomic operation requiring only ONE user approval.</span>
2133
+ <span class="cstat-no" title="statement not covered" > *</span>
2134
+ <span class="cstat-no" title="statement not covered" > * Advantages over separate sign/submit:</span>
2135
+ <span class="cstat-no" title="statement not covered" > * - Single wallet prompt (better UX)</span>
2136
+ <span class="cstat-no" title="statement not covered" > * - Matches WalletConnect's `hedera_signAndExecuteTransaction` behavior</span>
2137
+ <span class="cstat-no" title="statement not covered" > * - Atomic operation (no partial state)</span>
2138
+ <span class="cstat-no" title="statement not covered" > *</span>
2139
+ <span class="cstat-no" title="statement not covered" > * @param options - Transaction submission options</span>
2140
+ <span class="cstat-no" title="statement not covered" > *</span>
2141
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to submission result with transaction ID</span>
2142
+ <span class="cstat-no" title="statement not covered" > *</span>
2143
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If user rejects the transaction</span>
2144
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If wallet is not connected</span>
2145
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If transaction submission fails</span>
2146
+ <span class="cstat-no" title="statement not covered" > */</span>
2147
+ <span class="cstat-no" title="statement not covered" > override async submitTransaction(options: SubmitTransactionOptions): Promise&lt;SubmitResult&gt; {</span>
2148
+ <span class="cstat-no" title="statement not covered" > return this.submitTransactionInternal(options);</span>
2149
+ <span class="cstat-no" title="statement not covered" > }</span>
2150
+ <span class="cstat-no" title="statement not covered" ></span>
2151
+ <span class="cstat-no" title="statement not covered" > /**</span>
2152
+ <span class="cstat-no" title="statement not covered" > * Internal implementation of sign and submit.</span>
2153
+ <span class="cstat-no" title="statement not covered" > * Both submitTransaction() and signAndExecuteTransaction() delegate here.</span>
2154
+ <span class="cstat-no" title="statement not covered" > *</span>
2155
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
2156
+ <span class="cstat-no" title="statement not covered" > */</span>
2157
+ <span class="cstat-no" title="statement not covered" > private async submitTransactionInternal(</span>
2158
+ <span class="cstat-no" title="statement not covered" > options: SubmitTransactionOptions,</span>
2159
+ <span class="cstat-no" title="statement not covered" > ): Promise&lt;SubmitResult&gt; {</span>
2160
+ <span class="cstat-no" title="statement not covered" > logger.info('Signing and submitting transaction (single prompt)', {</span>
2161
+ <span class="cstat-no" title="statement not covered" > accountAddress: options.accountAddress,</span>
2162
+ <span class="cstat-no" title="statement not covered" > ledgerId: options.ledgerId,</span>
2163
+ <span class="cstat-no" title="statement not covered" > networkId: options.networkId,</span>
2164
+ <span class="cstat-no" title="statement not covered" > });</span>
2165
+ <span class="cstat-no" title="statement not covered" ></span>
2166
+ <span class="cstat-no" title="statement not covered" > try {</span>
2167
+ <span class="cstat-no" title="statement not covered" > const response = await this.channelService.signAndSubmitTransaction({</span>
2168
+ <span class="cstat-no" title="statement not covered" > accountAddress: options.accountAddress,</span>
2169
+ <span class="cstat-no" title="statement not covered" > payload: options.payload,</span>
2170
+ <span class="cstat-no" title="statement not covered" > ledgerId: options.ledgerId,</span>
2171
+ <span class="cstat-no" title="statement not covered" > networkId: options.networkId,</span>
2172
+ <span class="cstat-no" title="statement not covered" > // Pass batch transaction fields if present</span>
2173
+ <span class="cstat-no" title="statement not covered" > ...(options.isBatch &amp;&amp; {</span>
2174
+ <span class="cstat-no" title="statement not covered" > isBatch: options.isBatch,</span>
2175
+ <span class="cstat-no" title="statement not covered" > batchKey: options.batchKey,</span>
2176
+ <span class="cstat-no" title="statement not covered" > innerTransactions: options.innerTransactions,</span>
2177
+ <span class="cstat-no" title="statement not covered" > }),</span>
2178
+ <span class="cstat-no" title="statement not covered" > });</span>
2179
+ <span class="cstat-no" title="statement not covered" ></span>
2180
+ <span class="cstat-no" title="statement not covered" > logger.info('Transaction signed and submitted successfully', {</span>
2181
+ <span class="cstat-no" title="statement not covered" > transactionId: response.transactionId,</span>
2182
+ <span class="cstat-no" title="statement not covered" > transactionHash: response.transactionHash?.substring(0, 16),</span>
2183
+ <span class="cstat-no" title="statement not covered" > });</span>
2184
+ <span class="cstat-no" title="statement not covered" ></span>
2185
+ <span class="cstat-no" title="statement not covered" > return {</span>
2186
+ <span class="cstat-no" title="statement not covered" > transactionId: response.transactionId,</span>
2187
+ <span class="cstat-no" title="statement not covered" > transactionHash: response.transactionHash,</span>
2188
+ <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
2189
+ <span class="cstat-no" title="statement not covered" > };</span>
2190
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2191
+ <span class="cstat-no" title="statement not covered" > logger.error('Transaction sign+submit failed', { error });</span>
2192
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
2193
+ <span class="cstat-no" title="statement not covered" > }</span>
2194
+ <span class="cstat-no" title="statement not covered" > }</span>
2195
+ <span class="cstat-no" title="statement not covered" ></span>
2196
+ <span class="cstat-no" title="statement not covered" > /**</span>
2197
+ <span class="cstat-no" title="statement not covered" > * Signs an arbitrary message for authentication or verification.</span>
2198
+ <span class="cstat-no" title="statement not covered" > *</span>
2199
+ <span class="cstat-no" title="statement not covered" > * @description</span>
2200
+ <span class="cstat-no" title="statement not covered" > * Requests the wallet to sign a non-transaction message. Common use cases:</span>
2201
+ <span class="cstat-no" title="statement not covered" > * - Authentication challenges (prove account ownership)</span>
2202
+ <span class="cstat-no" title="statement not covered" > * - DAO voting</span>
2203
+ <span class="cstat-no" title="statement not covered" > * - Off-chain signatures</span>
2204
+ <span class="cstat-no" title="statement not covered" > * - Message verification</span>
2205
+ <span class="cstat-no" title="statement not covered" > *</span>
2206
+ <span class="cstat-no" title="statement not covered" > * @param options - Message signing options</span>
2207
+ <span class="cstat-no" title="statement not covered" > *</span>
2208
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to signature result</span>
2209
+ <span class="cstat-no" title="statement not covered" > *</span>
2210
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If user rejects the signing request</span>
2211
+ <span class="cstat-no" title="statement not covered" > * @throws {Error} If wallet is not connected</span>
2212
+ <span class="cstat-no" title="statement not covered" > */</span>
2213
+ <span class="cstat-no" title="statement not covered" > override async signMessage(options: SignMessageOptions): Promise&lt;SignMessageResult&gt; {</span>
2214
+ <span class="cstat-no" title="statement not covered" > logger.info('Signing message', {</span>
2215
+ <span class="cstat-no" title="statement not covered" > accountAddress: options.accountAddress,</span>
2216
+ <span class="cstat-no" title="statement not covered" > encoding: options.encoding,</span>
2217
+ <span class="cstat-no" title="statement not covered" > messageLength: options.message?.length,</span>
2218
+ <span class="cstat-no" title="statement not covered" > });</span>
2219
+ <span class="cstat-no" title="statement not covered" ></span>
2220
+ <span class="cstat-no" title="statement not covered" > try {</span>
2221
+ <span class="cstat-no" title="statement not covered" > const response = await this.channelService.request&lt;{</span>
2222
+ <span class="cstat-no" title="statement not covered" > signature?: string;</span>
2223
+ <span class="cstat-no" title="statement not covered" > publicKey?: string;</span>
2224
+ <span class="cstat-no" title="statement not covered" > // §21.3 extended shape — new wallets include these fields.</span>
2225
+ <span class="cstat-no" title="statement not covered" > // Older wallets (pre-§21.3) omit them; the optional chain below</span>
2226
+ <span class="cstat-no" title="statement not covered" > // keeps us backwards-compatible with both.</span>
2227
+ <span class="cstat-no" title="statement not covered" > algorithm?: 'ed25519' | 'ecdsa_secp256k1' | 'secp256k1';</span>
2228
+ <span class="cstat-no" title="statement not covered" > encoding?: 'utf-8' | 'base64';</span>
2229
+ <span class="cstat-no" title="statement not covered" > caipChainId?: string;</span>
2230
+ <span class="cstat-no" title="statement not covered" > messageLength?: number;</span>
2231
+ <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
2232
+ <span class="cstat-no" title="statement not covered" > }&gt;('ledger/signMessage', {</span>
2233
+ <span class="cstat-no" title="statement not covered" > accountAddress: options.accountAddress,</span>
2234
+ <span class="cstat-no" title="statement not covered" > message: options.message,</span>
2235
+ <span class="cstat-no" title="statement not covered" > encoding: options.encoding || 'utf-8',</span>
2236
+ <span class="cstat-no" title="statement not covered" > ledgerId: options.ledgerId,</span>
2237
+ <span class="cstat-no" title="statement not covered" > networkId: options.networkId,</span>
2238
+ <span class="cstat-no" title="statement not covered" > });</span>
2239
+ <span class="cstat-no" title="statement not covered" ></span>
2240
+ <span class="cstat-no" title="statement not covered" > logger.info('Message signed successfully', {</span>
2241
+ <span class="cstat-no" title="statement not covered" > algorithm: response.algorithm,</span>
2242
+ <span class="cstat-no" title="statement not covered" > caipChainId: response.caipChainId,</span>
2243
+ <span class="cstat-no" title="statement not covered" > });</span>
2244
+ <span class="cstat-no" title="statement not covered" ></span>
2245
+ <span class="cstat-no" title="statement not covered" > // Pass ALL fields through so the dApp's TransactionService sees the</span>
2246
+ <span class="cstat-no" title="statement not covered" > // full MessageSignResult shape (§21.3 strict end-to-end contract).</span>
2247
+ <span class="cstat-no" title="statement not covered" > return {</span>
2248
+ <span class="cstat-no" title="statement not covered" > signature: response.signature || '',</span>
2249
+ <span class="cstat-no" title="statement not covered" > publicKey: response.publicKey,</span>
2250
+ <span class="cstat-no" title="statement not covered" > algorithm: response.algorithm,</span>
2251
+ <span class="cstat-no" title="statement not covered" > encoding: response.encoding,</span>
2252
+ <span class="cstat-no" title="statement not covered" > caipChainId: response.caipChainId,</span>
2253
+ <span class="cstat-no" title="statement not covered" > messageLength: response.messageLength,</span>
2254
+ <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
2255
+ <span class="cstat-no" title="statement not covered" > };</span>
2256
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2257
+ <span class="cstat-no" title="statement not covered" > logger.error('Message signing failed', { error });</span>
2258
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
2259
+ <span class="cstat-no" title="statement not covered" > }</span>
2260
+ <span class="cstat-no" title="statement not covered" > }</span>
2261
+ <span class="cstat-no" title="statement not covered" ></span>
2262
+ <span class="cstat-no" title="statement not covered" > /**</span>
2263
+ <span class="cstat-no" title="statement not covered" > * Checks if HSuite Native provider is available.</span>
2264
+ <span class="cstat-no" title="statement not covered" > *</span>
2265
+ <span class="cstat-no" title="statement not covered" > * @description</span>
2266
+ <span class="cstat-no" title="statement not covered" > * HSuite Native is always available because it can use either:</span>
2267
+ <span class="cstat-no" title="statement not covered" > * - Direct Nostr relay connection (if wallet is online)</span>
2268
+ <span class="cstat-no" title="statement not covered" > * - Opening wallet in a new browser tab/window</span>
2269
+ <span class="cstat-no" title="statement not covered" > * - Deep linking to native app on mobile</span>
2270
+ <span class="cstat-no" title="statement not covered" > *</span>
2271
+ <span class="cstat-no" title="statement not covered" > * @returns Promise always resolving to true</span>
2272
+ <span class="cstat-no" title="statement not covered" > */</span>
2273
+ <span class="cstat-no" title="statement not covered" > override async isAvailable(): Promise&lt;boolean&gt; {</span>
2274
+ <span class="cstat-no" title="statement not covered" > // HSuite Native is always available (can open wallet window or use extension)</span>
2275
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2276
+ <span class="cstat-no" title="statement not covered" > }</span>
2277
+ <span class="cstat-no" title="statement not covered" ></span>
2278
+ <span class="cstat-no" title="statement not covered" > /**</span>
2279
+ <span class="cstat-no" title="statement not covered" > * Attempts to restore a previous session and reconnect automatically.</span>
2280
+ <span class="cstat-no" title="statement not covered" > *</span>
2281
+ <span class="cstat-no" title="statement not covered" > * @description</span>
2282
+ <span class="cstat-no" title="statement not covered" > * Checks for stored session data and attempts to re-establish the wallet</span>
2283
+ <span class="cstat-no" title="statement not covered" > * connection without requiring user interaction. This is called automatically</span>
2284
+ <span class="cstat-no" title="statement not covered" > * on provider initialization.</span>
2285
+ <span class="cstat-no" title="statement not covered" > *</span>
2286
+ <span class="cstat-no" title="statement not covered" > * If successful, emits a 'sessionRestored' event via WalletEventBus.</span>
2287
+ <span class="cstat-no" title="statement not covered" > *</span>
2288
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to true if reconnection succeeded, false otherwise</span>
2289
+ <span class="cstat-no" title="statement not covered" > */</span>
2290
+ <span class="cstat-no" title="statement not covered" > async attemptReconnect(): Promise&lt;boolean&gt; {</span>
2291
+ <span class="cstat-no" title="statement not covered" > logger.info('Attempting reconnect via unified channel');</span>
2292
+ <span class="cstat-no" title="statement not covered" ></span>
2293
+ <span class="cstat-no" title="statement not covered" > try {</span>
2294
+ <span class="cstat-no" title="statement not covered" > const success = await this.channelService.attemptRestore();</span>
2295
+ <span class="cstat-no" title="statement not covered" ></span>
2296
+ <span class="cstat-no" title="statement not covered" > if (success) {</span>
2297
+ <span class="cstat-no" title="statement not covered" > const accounts = this.accounts();</span>
2298
+ <span class="cstat-no" title="statement not covered" > const invite = this.channelService.currentInvite();</span>
2299
+ <span class="cstat-no" title="statement not covered" ></span>
2300
+ <span class="cstat-no" title="statement not covered" > this.eventBus.sessionRestored.emit({</span>
2301
+ <span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
2302
+ <span class="cstat-no" title="statement not covered" > sessionKey: invite?.id || '',</span>
2303
+ <span class="cstat-no" title="statement not covered" > accounts,</span>
2304
+ <span class="cstat-no" title="statement not covered" > metadata: { autoReconnected: true },</span>
2305
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
2306
+ <span class="cstat-no" title="statement not covered" > });</span>
2307
+ <span class="cstat-no" title="statement not covered" ></span>
2308
+ <span class="cstat-no" title="statement not covered" > logger.info('Reconnect successful');</span>
2309
+ <span class="cstat-no" title="statement not covered" > } else {</span>
2310
+ <span class="cstat-no" title="statement not covered" > logger.warn('Reconnect failed - no session or unable to connect');</span>
2311
+ <span class="cstat-no" title="statement not covered" > }</span>
2312
+ <span class="cstat-no" title="statement not covered" ></span>
2313
+ <span class="cstat-no" title="statement not covered" > return success;</span>
2314
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2315
+ <span class="cstat-no" title="statement not covered" > logger.error('Reconnect failed', { error });</span>
2316
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2317
+ <span class="cstat-no" title="statement not covered" > }</span>
2318
+ <span class="cstat-no" title="statement not covered" > }</span>
2319
+ <span class="cstat-no" title="statement not covered" ></span>
2320
+ <span class="cstat-no" title="statement not covered" > /**</span>
2321
+ <span class="cstat-no" title="statement not covered" > * Type guard for HSuite Native config</span>
2322
+ <span class="cstat-no" title="statement not covered" > * @param config</span>
2323
+ <span class="cstat-no" title="statement not covered" > */</span>
2324
+ <span class="cstat-no" title="statement not covered" > private isHsuiteNativeConfig(config: ConnectionConfig): config is HsuiteNativeConfig {</span>
2325
+ <span class="cstat-no" title="statement not covered" > return config.type === 'hsuite-native';</span>
2326
+ <span class="cstat-no" title="statement not covered" > }</span>
2327
+ <span class="cstat-no" title="statement not covered" >}</span>
2328
+ &nbsp;</pre></td></tr></table></pre>
2329
+
2330
+ <div class='push'></div><!-- for sticky footer -->
2331
+ </div><!-- /wrapper -->
2332
+ <div class='footer quiet pad2 space-top1 center small'>
2333
+ Code coverage generated by
2334
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2335
+ at 2026-06-02T14:30:38.257Z
2336
+ </div>
2337
+ <script src="../../prettify.js"></script>
2338
+ <script>
2339
+ window.onload = function () {
2340
+ prettyPrint();
2341
+ };
2342
+ </script>
2343
+ <script src="../../sorter.js"></script>
2344
+ <script src="../../block-navigation.js"></script>
2345
+ </body>
2346
+ </html>
2347
+