@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,1915 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for lib/providers/walletconnect/signers/hedera-signer.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/walletconnect/signers</a> hedera-signer.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">57.86% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>353/610</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">58.53% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>24/41</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">75% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>6/8</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">57.86% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>353/610</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 medium'></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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
677
+ <span class="cline-any cline-yes">1x</span>
678
+ <span class="cline-any cline-yes">1x</span>
679
+ <span class="cline-any cline-yes">1x</span>
680
+ <span class="cline-any cline-yes">1x</span>
681
+ <span class="cline-any cline-yes">1x</span>
682
+ <span class="cline-any cline-yes">1x</span>
683
+ <span class="cline-any cline-yes">1x</span>
684
+ <span class="cline-any cline-yes">1x</span>
685
+ <span class="cline-any cline-yes">1x</span>
686
+ <span class="cline-any cline-yes">1x</span>
687
+ <span class="cline-any cline-yes">1x</span>
688
+ <span class="cline-any cline-yes">1x</span>
689
+ <span class="cline-any cline-yes">1x</span>
690
+ <span class="cline-any cline-yes">1x</span>
691
+ <span class="cline-any cline-yes">1x</span>
692
+ <span class="cline-any cline-yes">1x</span>
693
+ <span class="cline-any cline-yes">1x</span>
694
+ <span class="cline-any cline-yes">1x</span>
695
+ <span class="cline-any cline-yes">1x</span>
696
+ <span class="cline-any cline-yes">1x</span>
697
+ <span class="cline-any cline-yes">1x</span>
698
+ <span class="cline-any cline-yes">1x</span>
699
+ <span class="cline-any cline-yes">1x</span>
700
+ <span class="cline-any cline-yes">1x</span>
701
+ <span class="cline-any cline-yes">1x</span>
702
+ <span class="cline-any cline-yes">1x</span>
703
+ <span class="cline-any cline-yes">1x</span>
704
+ <span class="cline-any cline-yes">1x</span>
705
+ <span class="cline-any cline-yes">1x</span>
706
+ <span class="cline-any cline-yes">1x</span>
707
+ <span class="cline-any cline-yes">1x</span>
708
+ <span class="cline-any cline-yes">1x</span>
709
+ <span class="cline-any cline-yes">1x</span>
710
+ <span class="cline-any cline-yes">1x</span>
711
+ <span class="cline-any cline-yes">1x</span>
712
+ <span class="cline-any cline-yes">1x</span>
713
+ <span class="cline-any cline-yes">1x</span>
714
+ <span class="cline-any cline-yes">1x</span>
715
+ <span class="cline-any cline-yes">1x</span>
716
+ <span class="cline-any cline-yes">2x</span>
717
+ <span class="cline-any cline-yes">2x</span>
718
+ <span class="cline-any cline-yes">2x</span>
719
+ <span class="cline-any cline-yes">2x</span>
720
+ <span class="cline-any cline-yes">2x</span>
721
+ <span class="cline-any cline-yes">2x</span>
722
+ <span class="cline-any cline-yes">2x</span>
723
+ <span class="cline-any cline-yes">2x</span>
724
+ <span class="cline-any cline-yes">2x</span>
725
+ <span class="cline-any cline-yes">2x</span>
726
+ <span class="cline-any cline-yes">2x</span>
727
+ <span class="cline-any cline-yes">2x</span>
728
+ <span class="cline-any cline-no">&nbsp;</span>
729
+ <span class="cline-any cline-yes">2x</span>
730
+ <span class="cline-any cline-no">&nbsp;</span>
731
+ <span class="cline-any cline-no">&nbsp;</span>
732
+ <span class="cline-any cline-no">&nbsp;</span>
733
+ <span class="cline-any cline-no">&nbsp;</span>
734
+ <span class="cline-any cline-no">&nbsp;</span>
735
+ <span class="cline-any cline-no">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-no">&nbsp;</span>
738
+ <span class="cline-any cline-no">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-no">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-no">&nbsp;</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-no">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-no">&nbsp;</span>
757
+ <span class="cline-any cline-no">&nbsp;</span>
758
+ <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-no">&nbsp;</span>
760
+ <span class="cline-any cline-no">&nbsp;</span>
761
+ <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-no">&nbsp;</span>
764
+ <span class="cline-any cline-no">&nbsp;</span>
765
+ <span class="cline-any cline-no">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-no">&nbsp;</span>
770
+ <span class="cline-any cline-no">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-no">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-no">&nbsp;</span>
778
+ <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-no">&nbsp;</span>
783
+ <span class="cline-any cline-no">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-no">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-no">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-no">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-no">&nbsp;</span>
795
+ <span class="cline-any cline-no">&nbsp;</span>
796
+ <span class="cline-any cline-no">&nbsp;</span>
797
+ <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-no">&nbsp;</span>
799
+ <span class="cline-any cline-no">&nbsp;</span>
800
+ <span class="cline-any cline-no">&nbsp;</span>
801
+ <span class="cline-any cline-no">&nbsp;</span>
802
+ <span class="cline-any cline-no">&nbsp;</span>
803
+ <span class="cline-any cline-no">&nbsp;</span>
804
+ <span class="cline-any cline-no">&nbsp;</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-no">&nbsp;</span>
807
+ <span class="cline-any cline-no">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-no">&nbsp;</span>
811
+ <span class="cline-any cline-no">&nbsp;</span>
812
+ <span class="cline-any cline-no">&nbsp;</span>
813
+ <span class="cline-any cline-no">&nbsp;</span>
814
+ <span class="cline-any cline-no">&nbsp;</span>
815
+ <span class="cline-any cline-no">&nbsp;</span>
816
+ <span class="cline-any cline-no">&nbsp;</span>
817
+ <span class="cline-any cline-no">&nbsp;</span>
818
+ <span class="cline-any cline-no">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <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-yes">1x</span>
897
+ <span class="cline-any cline-yes">1x</span>
898
+ <span class="cline-any cline-yes">1x</span>
899
+ <span class="cline-any cline-yes">1x</span>
900
+ <span class="cline-any cline-yes">1x</span>
901
+ <span class="cline-any cline-yes">1x</span>
902
+ <span class="cline-any cline-yes">1x</span>
903
+ <span class="cline-any cline-yes">1x</span>
904
+ <span class="cline-any cline-yes">1x</span>
905
+ <span class="cline-any cline-yes">1x</span>
906
+ <span class="cline-any cline-yes">1x</span>
907
+ <span class="cline-any cline-yes">1x</span>
908
+ <span class="cline-any cline-yes">1x</span>
909
+ <span class="cline-any cline-yes">23x</span>
910
+ <span class="cline-any cline-yes">23x</span>
911
+ <span class="cline-any cline-yes">23x</span>
912
+ <span class="cline-any cline-yes">23x</span>
913
+ <span class="cline-any cline-yes">23x</span>
914
+ <span class="cline-any cline-yes">23x</span>
915
+ <span class="cline-any cline-yes">23x</span>
916
+ <span class="cline-any cline-yes">23x</span>
917
+ <span class="cline-any cline-yes">23x</span>
918
+ <span class="cline-any cline-yes">23x</span>
919
+ <span class="cline-any cline-yes">23x</span>
920
+ <span class="cline-any cline-yes">23x</span>
921
+ <span class="cline-any cline-yes">23x</span>
922
+ <span class="cline-any cline-yes">23x</span>
923
+ <span class="cline-any cline-yes">23x</span>
924
+ <span class="cline-any cline-yes">15x</span>
925
+ <span class="cline-any cline-yes">15x</span>
926
+ <span class="cline-any cline-yes">15x</span>
927
+ <span class="cline-any cline-yes">15x</span>
928
+ <span class="cline-any cline-yes">15x</span>
929
+ <span class="cline-any cline-yes">15x</span>
930
+ <span class="cline-any cline-yes">15x</span>
931
+ <span class="cline-any cline-yes">15x</span>
932
+ <span class="cline-any cline-yes">15x</span>
933
+ <span class="cline-any cline-yes">15x</span>
934
+ <span class="cline-any cline-yes">15x</span>
935
+ <span class="cline-any cline-yes">15x</span>
936
+ <span class="cline-any cline-yes">15x</span>
937
+ <span class="cline-any cline-yes">15x</span>
938
+ <span class="cline-any cline-yes">15x</span>
939
+ <span class="cline-any cline-yes">15x</span>
940
+ <span class="cline-any cline-yes">15x</span>
941
+ <span class="cline-any cline-yes">15x</span>
942
+ <span class="cline-any cline-yes">15x</span>
943
+ <span class="cline-any cline-yes">23x</span>
944
+ <span class="cline-any cline-yes">23x</span>
945
+ <span class="cline-any cline-yes">23x</span>
946
+ <span class="cline-any cline-yes">23x</span>
947
+ <span class="cline-any cline-yes">23x</span>
948
+ <span class="cline-any cline-yes">23x</span>
949
+ <span class="cline-any cline-yes">23x</span>
950
+ <span class="cline-any cline-yes">23x</span>
951
+ <span class="cline-any cline-yes">23x</span>
952
+ <span class="cline-any cline-yes">23x</span>
953
+ <span class="cline-any cline-yes">23x</span>
954
+ <span class="cline-any cline-yes">23x</span>
955
+ <span class="cline-any cline-yes">23x</span>
956
+ <span class="cline-any cline-yes">4x</span>
957
+ <span class="cline-any cline-yes">4x</span>
958
+ <span class="cline-any cline-yes">4x</span>
959
+ <span class="cline-any cline-yes">4x</span>
960
+ <span class="cline-any cline-yes">4x</span>
961
+ <span class="cline-any cline-yes">4x</span>
962
+ <span class="cline-any cline-yes">4x</span>
963
+ <span class="cline-any cline-yes">4x</span>
964
+ <span class="cline-any cline-yes">4x</span>
965
+ <span class="cline-any cline-yes">4x</span>
966
+ <span class="cline-any cline-yes">4x</span>
967
+ <span class="cline-any cline-yes">4x</span>
968
+ <span class="cline-any cline-yes">4x</span>
969
+ <span class="cline-any cline-yes">4x</span>
970
+ <span class="cline-any cline-yes">4x</span>
971
+ <span class="cline-any cline-yes">4x</span>
972
+ <span class="cline-any cline-yes">4x</span>
973
+ <span class="cline-any cline-yes">4x</span>
974
+ <span class="cline-any cline-yes">4x</span>
975
+ <span class="cline-any cline-yes">4x</span>
976
+ <span class="cline-any cline-yes">4x</span>
977
+ <span class="cline-any cline-yes">4x</span>
978
+ <span class="cline-any cline-yes">4x</span>
979
+ <span class="cline-any cline-yes">4x</span>
980
+ <span class="cline-any cline-yes">4x</span>
981
+ <span class="cline-any cline-yes">4x</span>
982
+ <span class="cline-any cline-yes">4x</span>
983
+ <span class="cline-any cline-yes">4x</span>
984
+ <span class="cline-any cline-yes">4x</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-yes">4x</span>
988
+ <span class="cline-any cline-yes">4x</span>
989
+ <span class="cline-any cline-yes">4x</span>
990
+ <span class="cline-any cline-yes">4x</span>
991
+ <span class="cline-any cline-yes">1x</span>
992
+ <span class="cline-any cline-yes">1x</span>
993
+ <span class="cline-any cline-yes">1x</span>
994
+ <span class="cline-any cline-yes">1x</span>
995
+ <span class="cline-any cline-yes">1x</span>
996
+ <span class="cline-any cline-yes">1x</span>
997
+ <span class="cline-any cline-yes">1x</span>
998
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1005
+ <span class="cline-any cline-yes">1x</span>
1006
+ <span class="cline-any cline-yes">1x</span>
1007
+ <span class="cline-any cline-yes">1x</span>
1008
+ <span class="cline-any cline-yes">1x</span>
1009
+ <span class="cline-any cline-yes">4x</span>
1010
+ <span class="cline-any cline-yes">23x</span>
1011
+ <span class="cline-any cline-yes">23x</span>
1012
+ <span class="cline-any cline-yes">23x</span>
1013
+ <span class="cline-any cline-yes">23x</span>
1014
+ <span class="cline-any cline-yes">23x</span>
1015
+ <span class="cline-any cline-yes">23x</span>
1016
+ <span class="cline-any cline-yes">23x</span>
1017
+ <span class="cline-any cline-yes">23x</span>
1018
+ <span class="cline-any cline-yes">23x</span>
1019
+ <span class="cline-any cline-yes">4x</span>
1020
+ <span class="cline-any cline-yes">4x</span>
1021
+ <span class="cline-any cline-yes">4x</span>
1022
+ <span class="cline-any cline-yes">4x</span>
1023
+ <span class="cline-any cline-yes">4x</span>
1024
+ <span class="cline-any cline-yes">4x</span>
1025
+ <span class="cline-any cline-yes">4x</span>
1026
+ <span class="cline-any cline-yes">4x</span>
1027
+ <span class="cline-any cline-yes">4x</span>
1028
+ <span class="cline-any cline-yes">4x</span>
1029
+ <span class="cline-any cline-yes">4x</span>
1030
+ <span class="cline-any cline-yes">4x</span>
1031
+ <span class="cline-any cline-yes">4x</span>
1032
+ <span class="cline-any cline-yes">4x</span>
1033
+ <span class="cline-any cline-yes">4x</span>
1034
+ <span class="cline-any cline-yes">4x</span>
1035
+ <span class="cline-any cline-yes">4x</span>
1036
+ <span class="cline-any cline-yes">4x</span>
1037
+ <span class="cline-any cline-yes">4x</span>
1038
+ <span class="cline-any cline-yes">4x</span>
1039
+ <span class="cline-any cline-yes">4x</span>
1040
+ <span class="cline-any cline-yes">4x</span>
1041
+ <span class="cline-any cline-yes">4x</span>
1042
+ <span class="cline-any cline-yes">4x</span>
1043
+ <span class="cline-any cline-yes">4x</span>
1044
+ <span class="cline-any cline-yes">4x</span>
1045
+ <span class="cline-any cline-yes">4x</span>
1046
+ <span class="cline-any cline-yes">4x</span>
1047
+ <span class="cline-any cline-yes">4x</span>
1048
+ <span class="cline-any cline-yes">4x</span>
1049
+ <span class="cline-any cline-yes">4x</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-yes">4x</span>
1053
+ <span class="cline-any cline-yes">4x</span>
1054
+ <span class="cline-any cline-yes">4x</span>
1055
+ <span class="cline-any cline-yes">4x</span>
1056
+ <span class="cline-any cline-yes">4x</span>
1057
+ <span class="cline-any cline-yes">4x</span>
1058
+ <span class="cline-any cline-yes">4x</span>
1059
+ <span class="cline-any cline-yes">3x</span>
1060
+ <span class="cline-any cline-yes">3x</span>
1061
+ <span class="cline-any cline-yes">3x</span>
1062
+ <span class="cline-any cline-yes">4x</span>
1063
+ <span class="cline-any cline-yes">4x</span>
1064
+ <span class="cline-any cline-yes">4x</span>
1065
+ <span class="cline-any cline-yes">4x</span>
1066
+ <span class="cline-any cline-yes">4x</span>
1067
+ <span class="cline-any cline-yes">4x</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-yes">4x</span>
1071
+ <span class="cline-any cline-yes">4x</span>
1072
+ <span class="cline-any cline-yes">4x</span>
1073
+ <span class="cline-any cline-yes">4x</span>
1074
+ <span class="cline-any cline-yes">1x</span>
1075
+ <span class="cline-any cline-yes">1x</span>
1076
+ <span class="cline-any cline-yes">1x</span>
1077
+ <span class="cline-any cline-yes">1x</span>
1078
+ <span class="cline-any cline-yes">1x</span>
1079
+ <span class="cline-any cline-yes">1x</span>
1080
+ <span class="cline-any cline-yes">1x</span>
1081
+ <span class="cline-any cline-yes">1x</span>
1082
+ <span class="cline-any cline-yes">1x</span>
1083
+ <span class="cline-any cline-yes">1x</span>
1084
+ <span class="cline-any cline-yes">1x</span>
1085
+ <span class="cline-any cline-yes">1x</span>
1086
+ <span class="cline-any cline-yes">1x</span>
1087
+ <span class="cline-any cline-yes">1x</span>
1088
+ <span class="cline-any cline-yes">1x</span>
1089
+ <span class="cline-any cline-yes">1x</span>
1090
+ <span class="cline-any cline-yes">1x</span>
1091
+ <span class="cline-any cline-yes">1x</span>
1092
+ <span class="cline-any cline-no">&nbsp;</span>
1093
+ <span class="cline-any cline-yes">1x</span>
1094
+ <span class="cline-any cline-yes">1x</span>
1095
+ <span class="cline-any cline-yes">1x</span>
1096
+ <span class="cline-any cline-yes">1x</span>
1097
+ <span class="cline-any cline-yes">1x</span>
1098
+ <span class="cline-any cline-yes">1x</span>
1099
+ <span class="cline-any cline-yes">1x</span>
1100
+ <span class="cline-any cline-yes">1x</span>
1101
+ <span class="cline-any cline-yes">1x</span>
1102
+ <span class="cline-any cline-yes">1x</span>
1103
+ <span class="cline-any cline-yes">1x</span>
1104
+ <span class="cline-any cline-yes">1x</span>
1105
+ <span class="cline-any cline-yes">1x</span>
1106
+ <span class="cline-any cline-yes">1x</span>
1107
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1124
+ <span class="cline-any cline-yes">1x</span>
1125
+ <span class="cline-any cline-yes">1x</span>
1126
+ <span class="cline-any cline-yes">1x</span>
1127
+ <span class="cline-any cline-yes">1x</span>
1128
+ <span class="cline-any cline-yes">4x</span>
1129
+ <span class="cline-any cline-yes">23x</span>
1130
+ <span class="cline-any cline-yes">23x</span>
1131
+ <span class="cline-any cline-yes">23x</span>
1132
+ <span class="cline-any cline-yes">23x</span>
1133
+ <span class="cline-any cline-yes">23x</span>
1134
+ <span class="cline-any cline-yes">23x</span>
1135
+ <span class="cline-any cline-yes">23x</span>
1136
+ <span class="cline-any cline-yes">23x</span>
1137
+ <span class="cline-any cline-yes">23x</span>
1138
+ <span class="cline-any cline-yes">23x</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-yes">23x</span>
1143
+ <span class="cline-any cline-yes">23x</span>
1144
+ <span class="cline-any cline-yes">23x</span>
1145
+ <span class="cline-any cline-yes">23x</span>
1146
+ <span class="cline-any cline-yes">23x</span>
1147
+ <span class="cline-any cline-yes">23x</span>
1148
+ <span class="cline-any cline-yes">23x</span>
1149
+ <span class="cline-any cline-yes">23x</span>
1150
+ <span class="cline-any cline-yes">23x</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-yes">23x</span>
1204
+ <span class="cline-any cline-yes">23x</span>
1205
+ <span class="cline-any cline-yes">23x</span>
1206
+ <span class="cline-any cline-yes">23x</span>
1207
+ <span class="cline-any cline-yes">23x</span>
1208
+ <span class="cline-any cline-yes">23x</span>
1209
+ <span class="cline-any cline-yes">23x</span>
1210
+ <span class="cline-any cline-yes">23x</span>
1211
+ <span class="cline-any cline-yes">23x</span>
1212
+ <span class="cline-any cline-yes">23x</span>
1213
+ <span class="cline-any cline-yes">23x</span>
1214
+ <span class="cline-any cline-yes">23x</span>
1215
+ <span class="cline-any cline-yes">23x</span>
1216
+ <span class="cline-any cline-yes">23x</span>
1217
+ <span class="cline-any cline-yes">20x</span>
1218
+ <span class="cline-any cline-yes">20x</span>
1219
+ <span class="cline-any cline-yes">20x</span>
1220
+ <span class="cline-any cline-yes">20x</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-yes">20x</span>
1225
+ <span class="cline-any cline-yes">20x</span>
1226
+ <span class="cline-any cline-yes">1x</span>
1227
+ <span class="cline-any cline-yes">1x</span>
1228
+ <span class="cline-any cline-yes">1x</span>
1229
+ <span class="cline-any cline-yes">19x</span>
1230
+ <span class="cline-any cline-yes">20x</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-yes">19x</span>
1237
+ <span class="cline-any cline-yes">19x</span>
1238
+ <span class="cline-any cline-yes">20x</span>
1239
+ <span class="cline-any cline-yes">20x</span>
1240
+ <span class="cline-any cline-yes">32x</span>
1241
+ <span class="cline-any cline-yes">32x</span>
1242
+ <span class="cline-any cline-yes">32x</span>
1243
+ <span class="cline-any cline-yes">32x</span>
1244
+ <span class="cline-any cline-yes">1x</span>
1245
+ <span class="cline-any cline-yes">1x</span>
1246
+ <span class="cline-any cline-yes">1x</span>
1247
+ <span class="cline-any cline-yes">31x</span>
1248
+ <span class="cline-any cline-yes">31x</span>
1249
+ <span class="cline-any cline-yes">31x</span>
1250
+ <span class="cline-any cline-yes">31x</span>
1251
+ <span class="cline-any cline-yes">31x</span>
1252
+ <span class="cline-any cline-yes">32x</span>
1253
+ <span class="cline-any cline-yes">20x</span>
1254
+ <span class="cline-any cline-yes">20x</span>
1255
+ <span class="cline-any cline-yes">20x</span>
1256
+ <span class="cline-any cline-yes">20x</span>
1257
+ <span class="cline-any cline-yes">14x</span>
1258
+ <span class="cline-any cline-yes">14x</span>
1259
+ <span class="cline-any cline-yes">14x</span>
1260
+ <span class="cline-any cline-yes">14x</span>
1261
+ <span class="cline-any cline-yes">20x</span>
1262
+ <span class="cline-any cline-yes">14x</span>
1263
+ <span class="cline-any cline-yes">14x</span>
1264
+ <span class="cline-any cline-yes">14x</span>
1265
+ <span class="cline-any cline-yes">14x</span>
1266
+ <span class="cline-any cline-yes">14x</span>
1267
+ <span class="cline-any cline-yes">14x</span>
1268
+ <span class="cline-any cline-yes">14x</span>
1269
+ <span class="cline-any cline-yes">14x</span>
1270
+ <span class="cline-any cline-yes">14x</span>
1271
+ <span class="cline-any cline-yes">14x</span>
1272
+ <span class="cline-any cline-yes">14x</span>
1273
+ <span class="cline-any cline-yes">1x</span>
1274
+ <span class="cline-any cline-yes">1x</span>
1275
+ <span class="cline-any cline-yes">1x</span>
1276
+ <span class="cline-any cline-yes">1x</span>
1277
+ <span class="cline-any cline-yes">1x</span>
1278
+ <span class="cline-any cline-yes">14x</span>
1279
+ <span class="cline-any cline-yes">14x</span>
1280
+ <span class="cline-any cline-yes">14x</span>
1281
+ <span class="cline-any cline-yes">14x</span>
1282
+ <span class="cline-any cline-yes">5x</span>
1283
+ <span class="cline-any cline-yes">5x</span>
1284
+ <span class="cline-any cline-yes">20x</span>
1285
+ <span class="cline-any cline-yes">23x</span>
1286
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1287
+ * HSuite Native Connect
1288
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
1289
+ *
1290
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
1291
+ *
1292
+ * This file is part of HSuite Native Connect. For commercial licensing,
1293
+ * visit https://hsuite.finance/licensing
1294
+ */
1295
+ &nbsp;
1296
+ /**
1297
+ * @file hedera-signer.ts
1298
+ * @description Hedera-specific WalletConnect signer implementation
1299
+ *
1300
+ * Implements the IWalletConnectSigner interface for Hedera ledger.
1301
+ * Handles Hedera-specific JSON-RPC methods and transaction formats.
1302
+ */
1303
+ &nbsp;
1304
+ import { getLogger } from '@hsuite/native-connect-sdk';
1305
+ &nbsp;
1306
+ import type { SignResult, SubmitResult } from '../../base-wallet-provider';
1307
+ import type { IWalletConnectSigner, SignerOperationParams } from '../core/base-signer.interface';
1308
+ &nbsp;
1309
+ const logger = getLogger().scoped?.('HederaSigner'<span class="branch-0 cbranch-no" title="branch not covered" >) ?? getLogger();</span>
1310
+ &nbsp;
1311
+ /**
1312
+ * Extract a meaningful error message from various error shapes.
1313
+ * WalletConnect SDK throws errors that are not standard Error instances.
1314
+ *
1315
+ * Handles:
1316
+ * - Standard Error objects
1317
+ * - WalletConnect SDK errors: { code, message }
1318
+ * - Nested errors: { error: { message } }
1319
+ * - PIN_REQUIRED errors from wallet
1320
+ * - DOMException objects
1321
+ * - Objects that stringify to {} (enumerable property check)
1322
+ *
1323
+ * @param error - Error from WalletConnect SDK (can be Error, object, or string)
1324
+ * @returns Human-readable error message
1325
+ */
1326
+ function extractErrorMessage(error: unknown): string {
1327
+ // Log the raw error for debugging
1328
+ logger.debug('Extracting error message', {
1329
+ errorType: typeof error,
1330
+ isError: error instanceof Error,
1331
+ constructorName: error?.constructor?.name,
1332
+ protoName: Object.getPrototypeOf(error)?.constructor?.name,
1333
+ });
1334
+ &nbsp;
1335
+ if (error instanceof Error) {
1336
+ return error.message;
1337
+ <span class="branch-0 cbranch-no" title="branch not covered" > }</span>
1338
+ <span class="cstat-no" title="statement not covered" ></span>
1339
+ if (typeof error === 'object' &amp;&amp; error !== null) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1340
+ <span class="cstat-no" title="statement not covered" > const errorObj = error as Record&lt;string, unknown&gt;;</span>
1341
+ <span class="cstat-no" title="statement not covered" ></span>
1342
+ <span class="cstat-no" title="statement not covered" > // Try to get all properties including non-enumerable and from prototype</span>
1343
+ <span class="cstat-no" title="statement not covered" > const allProps = Object.getOwnPropertyNames(error).concat(</span>
1344
+ <span class="cstat-no" title="statement not covered" > Object.getOwnPropertyNames(Object.getPrototypeOf(error) || {}),</span>
1345
+ <span class="cstat-no" title="statement not covered" > );</span>
1346
+ <span class="cstat-no" title="statement not covered" ></span>
1347
+ <span class="cstat-no" title="statement not covered" > // Log ALL property values for debugging</span>
1348
+ <span class="cstat-no" title="statement not covered" > const propDebug: Record&lt;string, string&gt; = {};</span>
1349
+ <span class="cstat-no" title="statement not covered" > for (const prop of allProps.slice(0, 15)) {</span>
1350
+ <span class="cstat-no" title="statement not covered" > try {</span>
1351
+ <span class="cstat-no" title="statement not covered" > const val = (error as any)[prop];</span>
1352
+ <span class="cstat-no" title="statement not covered" > if (typeof val === 'function') {</span>
1353
+ <span class="cstat-no" title="statement not covered" > propDebug[prop] = '[fn]';</span>
1354
+ <span class="cstat-no" title="statement not covered" > } else if (val === undefined) {</span>
1355
+ <span class="cstat-no" title="statement not covered" > propDebug[prop] = 'undef';</span>
1356
+ <span class="cstat-no" title="statement not covered" > } else if (val === null) {</span>
1357
+ <span class="cstat-no" title="statement not covered" > propDebug[prop] = 'null';</span>
1358
+ <span class="cstat-no" title="statement not covered" > } else if (typeof val === 'object') {</span>
1359
+ <span class="cstat-no" title="statement not covered" > propDebug[prop] = JSON.stringify(val)?.substring(0, 60) || '[obj]';</span>
1360
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1361
+ <span class="cstat-no" title="statement not covered" > propDebug[prop] = String(val).substring(0, 60);</span>
1362
+ <span class="cstat-no" title="statement not covered" > }</span>
1363
+ <span class="cstat-no" title="statement not covered" > } catch (_e) {</span>
1364
+ <span class="cstat-no" title="statement not covered" > propDebug[prop] = '[err]';</span>
1365
+ <span class="cstat-no" title="statement not covered" > }</span>
1366
+ <span class="cstat-no" title="statement not covered" > }</span>
1367
+ <span class="cstat-no" title="statement not covered" > logger.error('WC Error object dump', propDebug);</span>
1368
+ <span class="cstat-no" title="statement not covered" ></span>
1369
+ <span class="cstat-no" title="statement not covered" > // Check for code property first (common in SDK errors like PIN_REQUIRED)</span>
1370
+ <span class="cstat-no" title="statement not covered" > if (typeof errorObj['code'] === 'string') {</span>
1371
+ <span class="cstat-no" title="statement not covered" > const codeMsg = errorObj['message']</span>
1372
+ <span class="cstat-no" title="statement not covered" > ? `${errorObj['code']}: ${errorObj['message']}`</span>
1373
+ <span class="cstat-no" title="statement not covered" > : errorObj['code'];</span>
1374
+ <span class="cstat-no" title="statement not covered" > return codeMsg as string;</span>
1375
+ <span class="cstat-no" title="statement not covered" > }</span>
1376
+ <span class="cstat-no" title="statement not covered" ></span>
1377
+ <span class="cstat-no" title="statement not covered" > // WalletConnect error format: { code, message }</span>
1378
+ <span class="cstat-no" title="statement not covered" > if ('message' in errorObj &amp;&amp; typeof errorObj['message'] === 'string') {</span>
1379
+ <span class="cstat-no" title="statement not covered" > return errorObj['message'];</span>
1380
+ <span class="cstat-no" title="statement not covered" > }</span>
1381
+ <span class="cstat-no" title="statement not covered" ></span>
1382
+ <span class="cstat-no" title="statement not covered" > // Nested error: { error: { message } }</span>
1383
+ <span class="cstat-no" title="statement not covered" > if (</span>
1384
+ <span class="cstat-no" title="statement not covered" > 'error' in errorObj &amp;&amp;</span>
1385
+ <span class="cstat-no" title="statement not covered" > typeof errorObj['error'] === 'object' &amp;&amp;</span>
1386
+ <span class="cstat-no" title="statement not covered" > errorObj['error'] !== null</span>
1387
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1388
+ <span class="cstat-no" title="statement not covered" > const nested = errorObj['error'] as Record&lt;string, unknown&gt;;</span>
1389
+ <span class="cstat-no" title="statement not covered" > if ('message' in nested &amp;&amp; typeof nested['message'] === 'string') {</span>
1390
+ <span class="cstat-no" title="statement not covered" > return nested['message'];</span>
1391
+ <span class="cstat-no" title="statement not covered" > }</span>
1392
+ <span class="cstat-no" title="statement not covered" > if ('code' in nested &amp;&amp; typeof nested['code'] === 'string') {</span>
1393
+ <span class="cstat-no" title="statement not covered" > return nested['code'];</span>
1394
+ <span class="cstat-no" title="statement not covered" > }</span>
1395
+ <span class="cstat-no" title="statement not covered" > }</span>
1396
+ <span class="cstat-no" title="statement not covered" ></span>
1397
+ <span class="cstat-no" title="statement not covered" > // Check for DOMException</span>
1398
+ <span class="cstat-no" title="statement not covered" > if (error instanceof DOMException) {</span>
1399
+ <span class="cstat-no" title="statement not covered" > return error.message || error.name;</span>
1400
+ <span class="cstat-no" title="statement not covered" > }</span>
1401
+ <span class="cstat-no" title="statement not covered" ></span>
1402
+ <span class="cstat-no" title="statement not covered" > // Check for reason/cause properties (common in rejected promises)</span>
1403
+ <span class="cstat-no" title="statement not covered" > if ('reason' in errorObj &amp;&amp; typeof errorObj['reason'] === 'string') {</span>
1404
+ <span class="cstat-no" title="statement not covered" > return errorObj['reason'];</span>
1405
+ <span class="cstat-no" title="statement not covered" > }</span>
1406
+ <span class="cstat-no" title="statement not covered" > if ('cause' in errorObj) {</span>
1407
+ <span class="cstat-no" title="statement not covered" > const cause = errorObj['cause'];</span>
1408
+ <span class="cstat-no" title="statement not covered" > if (typeof cause === 'string') return cause;</span>
1409
+ <span class="cstat-no" title="statement not covered" > if (cause instanceof Error) return cause.message;</span>
1410
+ <span class="cstat-no" title="statement not covered" > if (typeof cause === 'object' &amp;&amp; cause !== null &amp;&amp; 'message' in (cause as any)) {</span>
1411
+ <span class="cstat-no" title="statement not covered" > return String((cause as any).message);</span>
1412
+ <span class="cstat-no" title="statement not covered" > }</span>
1413
+ <span class="cstat-no" title="statement not covered" > }</span>
1414
+ <span class="cstat-no" title="statement not covered" ></span>
1415
+ <span class="cstat-no" title="statement not covered" > // WalletConnect SDK specific error formats</span>
1416
+ <span class="cstat-no" title="statement not covered" > if ('context' in errorObj &amp;&amp; typeof errorObj['context'] === 'string') {</span>
1417
+ <span class="cstat-no" title="statement not covered" > return errorObj['context'];</span>
1418
+ <span class="cstat-no" title="statement not covered" > }</span>
1419
+ <span class="cstat-no" title="statement not covered" > if ('data' in errorObj &amp;&amp; typeof errorObj['data'] === 'object' &amp;&amp; errorObj['data'] !== null) {</span>
1420
+ <span class="cstat-no" title="statement not covered" > const data = errorObj['data'] as Record&lt;string, unknown&gt;;</span>
1421
+ <span class="cstat-no" title="statement not covered" > if ('message' in data &amp;&amp; typeof data['message'] === 'string') {</span>
1422
+ <span class="cstat-no" title="statement not covered" > return data['message'];</span>
1423
+ <span class="cstat-no" title="statement not covered" > }</span>
1424
+ <span class="cstat-no" title="statement not covered" > }</span>
1425
+ <span class="cstat-no" title="statement not covered" ></span>
1426
+ <span class="cstat-no" title="statement not covered" > // WalletConnect JSON-RPC error format: { code: number, message: string }</span>
1427
+ <span class="cstat-no" title="statement not covered" > if ('code' in errorObj &amp;&amp; 'message' in errorObj) {</span>
1428
+ <span class="cstat-no" title="statement not covered" > const code = errorObj['code'];</span>
1429
+ <span class="cstat-no" title="statement not covered" > const msg = errorObj['message'];</span>
1430
+ <span class="cstat-no" title="statement not covered" > if (typeof msg === 'string') {</span>
1431
+ <span class="cstat-no" title="statement not covered" > return typeof code === 'number' ? `[${code}] ${msg}` : msg;</span>
1432
+ <span class="cstat-no" title="statement not covered" > }</span>
1433
+ <span class="cstat-no" title="statement not covered" > }</span>
1434
+ <span class="cstat-no" title="statement not covered" ></span>
1435
+ <span class="cstat-no" title="statement not covered" > // Error with 'name' property (common for built-in errors)</span>
1436
+ <span class="cstat-no" title="statement not covered" > if ('name' in errorObj &amp;&amp; typeof errorObj['name'] === 'string') {</span>
1437
+ <span class="cstat-no" title="statement not covered" > const name = errorObj['name'];</span>
1438
+ <span class="cstat-no" title="statement not covered" > if (name &amp;&amp; name !== 'Error' &amp;&amp; name !== 'Object') {</span>
1439
+ <span class="cstat-no" title="statement not covered" > return name;</span>
1440
+ <span class="cstat-no" title="statement not covered" > }</span>
1441
+ <span class="cstat-no" title="statement not covered" > }</span>
1442
+ <span class="cstat-no" title="statement not covered" ></span>
1443
+ <span class="cstat-no" title="statement not covered" > // Try to stringify, but check if result is empty object</span>
1444
+ <span class="cstat-no" title="statement not covered" > try {</span>
1445
+ <span class="cstat-no" title="statement not covered" > const jsonStr = JSON.stringify(error);</span>
1446
+ <span class="cstat-no" title="statement not covered" > // Don't return empty objects as error messages</span>
1447
+ <span class="cstat-no" title="statement not covered" > if (jsonStr &amp;&amp; jsonStr !== '{}' &amp;&amp; jsonStr !== '[]') {</span>
1448
+ <span class="cstat-no" title="statement not covered" > return jsonStr;</span>
1449
+ <span class="cstat-no" title="statement not covered" > }</span>
1450
+ <span class="cstat-no" title="statement not covered" ></span>
1451
+ <span class="cstat-no" title="statement not covered" > // If stringify returned {}, try Object.keys to get property names</span>
1452
+ <span class="cstat-no" title="statement not covered" > const keys = Object.keys(errorObj);</span>
1453
+ <span class="cstat-no" title="statement not covered" > if (keys.length &gt; 0) {</span>
1454
+ <span class="cstat-no" title="statement not covered" > return `Error object with keys: ${keys.join(', ')}`;</span>
1455
+ <span class="cstat-no" title="statement not covered" > }</span>
1456
+ <span class="cstat-no" title="statement not covered" ></span>
1457
+ <span class="cstat-no" title="statement not covered" > // Try getting own property names (includes non-enumerable)</span>
1458
+ <span class="cstat-no" title="statement not covered" > const ownProps = Object.getOwnPropertyNames(errorObj);</span>
1459
+ <span class="cstat-no" title="statement not covered" > logger.debug('Error object properties', { props: ownProps });</span>
1460
+ <span class="cstat-no" title="statement not covered" ></span>
1461
+ <span class="cstat-no" title="statement not covered" > if (ownProps.length &gt; 0) {</span>
1462
+ <span class="cstat-no" title="statement not covered" > // Try to read ALL properties for better debugging</span>
1463
+ <span class="cstat-no" title="statement not covered" > const propValues: string[] = [];</span>
1464
+ <span class="cstat-no" title="statement not covered" > for (const k of ownProps) {</span>
1465
+ <span class="cstat-no" title="statement not covered" > try {</span>
1466
+ <span class="cstat-no" title="statement not covered" > const val = errorObj[k];</span>
1467
+ <span class="cstat-no" title="statement not covered" > const valStr = typeof val === 'object' ? JSON.stringify(val) : String(val);</span>
1468
+ <span class="cstat-no" title="statement not covered" > propValues.push(`${k}=${valStr?.substring(0, 100)}`);</span>
1469
+ <span class="cstat-no" title="statement not covered" ></span>
1470
+ <span class="cstat-no" title="statement not covered" > // Check if any property contains error info</span>
1471
+ <span class="cstat-no" title="statement not covered" > if (typeof val === 'object' &amp;&amp; val !== null) {</span>
1472
+ <span class="cstat-no" title="statement not covered" > if ('message' in val) return String((val as any).message);</span>
1473
+ <span class="cstat-no" title="statement not covered" > if ('error' in val) return String((val as any).error);</span>
1474
+ <span class="cstat-no" title="statement not covered" > }</span>
1475
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
1476
+ <span class="cstat-no" title="statement not covered" > propValues.push(k);</span>
1477
+ <span class="cstat-no" title="statement not covered" > }</span>
1478
+ <span class="cstat-no" title="statement not covered" > }</span>
1479
+ <span class="cstat-no" title="statement not covered" > logger.debug('Error property values', { values: propValues });</span>
1480
+ <span class="cstat-no" title="statement not covered" ></span>
1481
+ <span class="cstat-no" title="statement not covered" > // Return a more informative error</span>
1482
+ <span class="cstat-no" title="statement not covered" > return `Error with properties: ${propValues.slice(0, 5).join(', ')}`;</span>
1483
+ <span class="cstat-no" title="statement not covered" > }</span>
1484
+ <span class="cstat-no" title="statement not covered" > } catch (_e) {</span>
1485
+ <span class="cstat-no" title="statement not covered" > // If stringify fails, try toString</span>
1486
+ <span class="cstat-no" title="statement not covered" > const str = String(error);</span>
1487
+ <span class="cstat-no" title="statement not covered" > if (str !== '[object Object]') {</span>
1488
+ <span class="cstat-no" title="statement not covered" > return str;</span>
1489
+ <span class="cstat-no" title="statement not covered" > }</span>
1490
+ <span class="cstat-no" title="statement not covered" > }</span>
1491
+ <span class="cstat-no" title="statement not covered" ></span>
1492
+ <span class="cstat-no" title="statement not covered" > // Last resort - log what we know about the object</span>
1493
+ <span class="cstat-no" title="statement not covered" > logger.warn('Could not extract error message', {</span>
1494
+ <span class="cstat-no" title="statement not covered" > constructor: error?.constructor?.name,</span>
1495
+ <span class="cstat-no" title="statement not covered" > prototype: Object.getPrototypeOf(error)?.constructor?.name,</span>
1496
+ <span class="cstat-no" title="statement not covered" > });</span>
1497
+ <span class="cstat-no" title="statement not covered" > return `Unknown error (type: ${error?.constructor?.name || 'object'})`;</span>
1498
+ <span class="cstat-no" title="statement not covered" > }</span>
1499
+ <span class="cstat-no" title="statement not covered" ></span>
1500
+ <span class="cstat-no" title="statement not covered" > if (typeof error === 'string') {</span>
1501
+ <span class="cstat-no" title="statement not covered" > return error;</span>
1502
+ <span class="cstat-no" title="statement not covered" > }</span>
1503
+ <span class="cstat-no" title="statement not covered" ></span>
1504
+ <span class="cstat-no" title="statement not covered" > return 'Unknown error';</span>
1505
+ <span class="cstat-no" title="statement not covered" >}</span>
1506
+ &nbsp;
1507
+ /**
1508
+ * Signer implementation for Hedera ledger.
1509
+ *
1510
+ * Supports Hedera-specific WalletConnect methods:
1511
+ * - hedera_signTransaction (sign-only, returns signature map)
1512
+ * - hedera_signAndExecuteTransaction (sign + submit, returns transaction ID)
1513
+ * - hedera_executeTransaction
1514
+ * - hedera_signMessage (arbitrary message signing)
1515
+ *
1516
+ * Uses HIP-30 account format: hedera:&lt;network&gt;:&lt;accountId&gt;
1517
+ */
1518
+ export class HederaSigner implements IWalletConnectSigner {
1519
+ readonly ledgerId = 'hedera';
1520
+ &nbsp;
1521
+ /**
1522
+ * Build Hedera namespace configuration for WalletConnect.
1523
+ * Defines the JSON-RPC methods and chains this signer supports.
1524
+ *
1525
+ * IMPORTANT: We request ALL Hedera networks (testnet, mainnet)
1526
+ * to ensure wallets like Kabila can show accounts from unknown network.
1527
+ * The wallet will return all accounts it has across all networks.
1528
+ *
1529
+ * @param networkId - Network identifier (e.g., 'hedera:testnet', 'hedera:mainnet')
1530
+ * @param _networkId
1531
+ * @returns Namespace configuration object
1532
+ */
1533
+ buildNamespace(_networkId: string): {
1534
+ methods: string[];
1535
+ chains: string[];
1536
+ events: string[];
1537
+ } {
1538
+ // Request ALL Hedera networks to allow wallets to show all their accounts
1539
+ // Wallets like Kabila may have accounts on multiple networks
1540
+ &nbsp;
1541
+ return {
1542
+ methods: [
1543
+ 'hedera_signTransaction',
1544
+ 'hedera_signAndExecuteTransaction',
1545
+ 'hedera_executeTransaction',
1546
+ 'hedera_signMessage',
1547
+ ],
1548
+ // Request all Hedera networks so wallet can show all accounts
1549
+ chains: ['hedera:testnet', 'hedera:mainnet'],
1550
+ events: ['chainChanged', 'accountsChanged'],
1551
+ };
1552
+ }
1553
+ &nbsp;
1554
+ /**
1555
+ * Sign a Hedera transaction without submitting to network.
1556
+ * Uses hedera_signTransaction method with TransactionList format.
1557
+ *
1558
+ * The payload comes as TransactionList (base64 frozen transaction bytes).
1559
+ * We send the full TransactionList to preserve canonical bytes for signing.
1560
+ * The wallet will sign and return the signature map without executing.
1561
+ *
1562
+ * @param params - Signing parameters (payload is TransactionList base64)
1563
+ * @returns Promise resolving to signed transaction with signature map
1564
+ */
1565
+ async signTransaction(params: SignerOperationParams): Promise&lt;SignResult&gt; {
1566
+ // Extract network name from networkId (mainnet or testnet)
1567
+ const network = params.networkId.includes('mainnet') ? 'mainnet' : 'testnet';
1568
+ &nbsp;
1569
+ // Format account ID in HIP-30 format
1570
+ const signerAccountId = `hedera:${network}:${params.accountAddress}`;
1571
+ &nbsp;
1572
+ try {
1573
+ // Send the full TransactionList (frozen transaction bytes) to preserve canonical bytes.
1574
+ // The wallet needs the complete transaction structure to sign correctly.
1575
+ // Previously we converted to TransactionBody which caused INVALID_SIGNATURE errors
1576
+ // because the signature was computed over different bytes than the network expected.
1577
+ &nbsp;
1578
+ // Use 5-minute expiry to give users time to review and approve
1579
+ const result = await params.client.request({
1580
+ topic: params.topic,
1581
+ chainId: `hedera:${network}`,
1582
+ request: {
1583
+ method: 'hedera_signTransaction',
1584
+ params: {
1585
+ signerAccountId,
1586
+ transactionList: params.payload, // Send full TransactionList for correct signing
1587
+ },
1588
+ },
1589
+ expiry: 300, // 5 minutes in seconds
1590
+ });
1591
+ &nbsp;
1592
+ return {
1593
+ signedPayload: String(
1594
+ (result as { signatureMap?: any }).<span class="branch-0 cbranch-no" title="branch not covered" >signatureMap ||</span>
1595
+ <span class="cstat-no" title="statement not covered" > (result as { signedTransaction?: any }).<span class="branch-0 cbranch-no" title="branch not covered" >signedTransaction ||</span></span>
1596
+ <span class="cstat-no" title="statement not covered" > JSON.stringify(result),</span>
1597
+ ),
1598
+ metadata: { result },
1599
+ };
1600
+ } catch (error) {
1601
+ // Check if this is an empty error object (WalletConnect SDK bug)
1602
+ const isEmptyError =
1603
+ typeof error === 'object' &amp;&amp;
1604
+ error !== null &amp;&amp;
1605
+ Object.keys(error).length === 0 &amp;&amp;
1606
+ !(error instanceof Error);
1607
+ &nbsp;
1608
+ if (isEmptyError) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1609
+ <span class="cstat-no" title="statement not covered" > logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {</span>
1610
+ <span class="cstat-no" title="statement not covered" > topic: params.topic?.substring(0, 16) + '...',</span>
1611
+ <span class="cstat-no" title="statement not covered" > });</span>
1612
+ <span class="cstat-no" title="statement not covered" > throw new Error('WalletConnect connection issue - please try again');</span>
1613
+ <span class="cstat-no" title="statement not covered" > }</span>
1614
+ &nbsp;
1615
+ const errorMsg = extractErrorMessage(error);
1616
+ logger.error('Sign failed', { error: errorMsg });
1617
+ throw new Error(`Hedera sign failed: ${errorMsg}`);
1618
+ }
1619
+ }
1620
+ &nbsp;
1621
+ /**
1622
+ * Sign and submit a Hedera transaction to the network.
1623
+ * Uses hedera_signAndExecuteTransaction method with TransactionList format.
1624
+ *
1625
+ * @param params - Submission parameters
1626
+ * @returns Promise resolving to transaction ID and metadata
1627
+ */
1628
+ async submitTransaction(params: SignerOperationParams): Promise&lt;SubmitResult&gt; {
1629
+ // Extract network name from networkId (mainnet or testnet)
1630
+ const network = params.networkId.includes('mainnet'<span class="branch-0 cbranch-no" title="branch not covered" >) ? 'mainnet' : '</span>testnet';
1631
+ &nbsp;
1632
+ // Format account ID in HIP-30 format
1633
+ const signerAccountId = `hedera:${network}:${params.accountAddress}`;
1634
+ &nbsp;
1635
+ logger.debug('Sending hedera_signAndExecuteTransaction request', {
1636
+ topic: params.topic?.substring(0, 16) + '...',
1637
+ chainId: `hedera:${network}`,
1638
+ signerAccountId,
1639
+ payloadLength: params.payload?.length,
1640
+ });
1641
+ &nbsp;
1642
+ // Create the request promise - keep-alive pings are handled by WalletConnectClientManager
1643
+ const requestPromise = params.client.request({
1644
+ topic: params.topic,
1645
+ chainId: `hedera:${network}`,
1646
+ request: {
1647
+ method: 'hedera_signAndExecuteTransaction',
1648
+ params: {
1649
+ signerAccountId,
1650
+ transactionList: params.payload, // TransactionList protobuf (base64)
1651
+ },
1652
+ },
1653
+ expiry: 300, // 5 minutes in seconds
1654
+ });
1655
+ &nbsp;
1656
+ // Create a 5-minute timeout to override any internal SDK timeouts
1657
+ const timeoutPromise = new Promise&lt;never&gt;((_, reject) =&gt; {
1658
+ setTimeout(
1659
+ () =&gt; {
1660
+ <span class="cstat-no" title="statement not covered" > reject(new Error('Transaction approval timed out after 5 minutes'));</span>
1661
+ <span class="cstat-no" title="statement not covered" > },</span>
1662
+ 5 * 60 * 1000,
1663
+ ); // 5 minutes
1664
+ });
1665
+ &nbsp;
1666
+ try {
1667
+ // Race between the request and our timeout
1668
+ const result = await Promise.race([requestPromise, timeoutPromise]);
1669
+ &nbsp;
1670
+ logger.debug('Received hedera_signAndExecuteTransaction response', {
1671
+ hasResult: !!result,
1672
+ resultKeys: result ? Object.keys(result as object<span class="branch-0 cbranch-no" title="branch not covered" >) : [],</span>
1673
+ });
1674
+ &nbsp;
1675
+ return {
1676
+ transactionId:
1677
+ (result as { transactionId?: string }).<span class="branch-0 cbranch-no" title="branch not covered" >transactionId ||</span>
1678
+ <span class="cstat-no" title="statement not covered" > (result as { response?: { transactionId?: string } }).response?.<span class="branch-0 cbranch-no" title="branch not covered" >transactionId ||</span></span>
1679
+ <span class="cstat-no" title="statement not covered" > '',</span>
1680
+ transactionHash: (result as { transactionHash?: string }).transactionHash,
1681
+ metadata: { result },
1682
+ };
1683
+ } catch (error) {
1684
+ // Log full error for debugging - try to get more info from WalletConnect error
1685
+ const wcError = error as any;
1686
+ &nbsp;
1687
+ // Try to extract all available error info
1688
+ const errorInfo = {
1689
+ errorType: typeof error,
1690
+ errorConstructor: error?.constructor?.name,
1691
+ errorKeys: error &amp;&amp; typeof error === 'object' ? Object.keys(error<span class="branch-0 cbranch-no" title="branch not covered" >) : [],</span>
1692
+ errorString: String(error),
1693
+ // WalletConnect specific error properties
1694
+ wcCode: wcError?.code,
1695
+ wcMessage: wcError?.message,
1696
+ wcContext: wcError?.context,
1697
+ wcData: wcError?.data,
1698
+ // Try Symbol properties
1699
+ symbols:
1700
+ error &amp;&amp; typeof error === 'object'
1701
+ ? Object.getOwnPropertySymbols(error).map((s) =&gt; s.toString()<span class="branch-0 cbranch-no" title="branch not covered" >)</span>
1702
+ <span class="cstat-no" title="statement not covered" > : [],</span>
1703
+ // Get all own property names
1704
+ ownProps: error &amp;&amp; typeof error === 'object' ? Object.getOwnPropertyNames(error<span class="branch-0 cbranch-no" title="branch not covered" >) : [],</span>
1705
+ };
1706
+ &nbsp;
1707
+ logger.error('Submit failed - full error analysis', errorInfo);
1708
+ &nbsp;
1709
+ // Check if this is an empty error object (WalletConnect SDK bug)
1710
+ // This typically happens when relay subscription is stale
1711
+ const isEmptyError =
1712
+ typeof error === 'object' &amp;&amp;
1713
+ error !== null &amp;&amp;
1714
+ Object.keys(error).length === 0 &amp;&amp;
1715
+ !(error instanceof Error);
1716
+ &nbsp;
1717
+ if (isEmptyError) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1718
+ <span class="cstat-no" title="statement not covered" > // Empty error object is a known WalletConnect SDK issue</span>
1719
+ <span class="cstat-no" title="statement not covered" > // It usually means the relay subscription was stale</span>
1720
+ <span class="cstat-no" title="statement not covered" > // The SessionHealthManager should have pinged before the request,</span>
1721
+ <span class="cstat-no" title="statement not covered" > // but if we still get this error, the subscription dropped after the ping</span>
1722
+ <span class="cstat-no" title="statement not covered" > logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {</span>
1723
+ <span class="cstat-no" title="statement not covered" > topic: params.topic?.substring(0, 16) + '...',</span>
1724
+ <span class="cstat-no" title="statement not covered" > hint: 'This can happen when the relay WebSocket connection drops',</span>
1725
+ <span class="cstat-no" title="statement not covered" > });</span>
1726
+ <span class="cstat-no" title="statement not covered" > // NOTE: We can't retry because the wallet may have already executed the transaction.</span>
1727
+ <span class="cstat-no" title="statement not covered" > // A retry could cause a duplicate transaction on Hedera.</span>
1728
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1729
+ <span class="cstat-no" title="statement not covered" > 'WalletConnect connection dropped - if you approved the transaction in your wallet, ' +</span>
1730
+ <span class="cstat-no" title="statement not covered" > 'please check your transaction history as it may have been executed successfully.',</span>
1731
+ <span class="cstat-no" title="statement not covered" > );</span>
1732
+ <span class="cstat-no" title="statement not covered" > }</span>
1733
+ &nbsp;
1734
+ const errorMsg = extractErrorMessage(error);
1735
+ logger.error('Submit failed', { error: errorMsg });
1736
+ throw new Error(`Hedera submit failed: ${errorMsg}`);
1737
+ }
1738
+ }
1739
+ &nbsp;
1740
+ /**
1741
+ * Sign and execute a transaction in one call (alias for submitTransaction).
1742
+ * Uses hedera_signAndExecuteTransaction WalletConnect RPC method.
1743
+ * This prevents double prompts by using the native WalletConnect method.
1744
+ *
1745
+ * @param params - Transaction parameters
1746
+ * @returns Promise resolving to transaction ID and metadata
1747
+ */
1748
+ <span class="fstat-no" title="function not covered" > async signAndExecuteTransaction(params: SignerOperationParams): Promise&lt;SubmitResult&gt; {</span>
1749
+ <span class="cstat-no" title="statement not covered" > // Simply delegate to submitTransaction which already uses hedera_signAndExecuteTransaction</span>
1750
+ <span class="cstat-no" title="statement not covered" > return this.submitTransaction(params);</span>
1751
+ <span class="cstat-no" title="statement not covered" > }</span>
1752
+ &nbsp;
1753
+ /**
1754
+ * Sign an arbitrary message using hedera_signMessage method.
1755
+ * Used for DAO votes, authentication proofs, and other non-transaction signing.
1756
+ *
1757
+ * @param params - Signing parameters with message string
1758
+ * @returns Promise resolving to signature and metadata
1759
+ */
1760
+ <span class="fstat-no" title="function not covered" > async signMessage(</span>
1761
+ <span class="cstat-no" title="statement not covered" > params: SignerOperationParams &amp; { message: string; encoding?: 'utf-8' | 'base64' },</span>
1762
+ <span class="cstat-no" title="statement not covered" > ): Promise&lt;import('../../base-wallet-provider').SignMessageResult&gt; {</span>
1763
+ <span class="cstat-no" title="statement not covered" > // Extract network name from networkId (mainnet or testnet)</span>
1764
+ <span class="cstat-no" title="statement not covered" > const network = params.networkId.includes('mainnet') ? 'mainnet' : 'testnet';</span>
1765
+ <span class="cstat-no" title="statement not covered" ></span>
1766
+ <span class="cstat-no" title="statement not covered" > // Format account ID in HIP-30 format</span>
1767
+ <span class="cstat-no" title="statement not covered" > const signerAccountId = `hedera:${network}:${params.accountAddress}`;</span>
1768
+ <span class="cstat-no" title="statement not covered" ></span>
1769
+ <span class="cstat-no" title="statement not covered" > try {</span>
1770
+ <span class="cstat-no" title="statement not covered" > // Use 5-minute expiry to give users time to review and approve</span>
1771
+ <span class="cstat-no" title="statement not covered" > const result = await params.client.request({</span>
1772
+ <span class="cstat-no" title="statement not covered" > topic: params.topic,</span>
1773
+ <span class="cstat-no" title="statement not covered" > chainId: `hedera:${network}`,</span>
1774
+ <span class="cstat-no" title="statement not covered" > request: {</span>
1775
+ <span class="cstat-no" title="statement not covered" > method: 'hedera_signMessage',</span>
1776
+ <span class="cstat-no" title="statement not covered" > params: {</span>
1777
+ <span class="cstat-no" title="statement not covered" > signerAccountId,</span>
1778
+ <span class="cstat-no" title="statement not covered" > message: params.message, // Can be base64 or utf-8</span>
1779
+ <span class="cstat-no" title="statement not covered" > },</span>
1780
+ <span class="cstat-no" title="statement not covered" > },</span>
1781
+ <span class="cstat-no" title="statement not covered" > expiry: 300, // 5 minutes in seconds</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" > return {</span>
1785
+ <span class="cstat-no" title="statement not covered" > signature: String(</span>
1786
+ <span class="cstat-no" title="statement not covered" > (result as { signatureMap?: any }).signatureMap ||</span>
1787
+ <span class="cstat-no" title="statement not covered" > (result as { signature?: any }).signature ||</span>
1788
+ <span class="cstat-no" title="statement not covered" > JSON.stringify(result),</span>
1789
+ <span class="cstat-no" title="statement not covered" > ),</span>
1790
+ <span class="cstat-no" title="statement not covered" > publicKey: (result as { publicKey?: string }).publicKey,</span>
1791
+ <span class="cstat-no" title="statement not covered" > metadata: { result },</span>
1792
+ <span class="cstat-no" title="statement not covered" > };</span>
1793
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1794
+ <span class="cstat-no" title="statement not covered" > // Check if this is an empty error object (WalletConnect SDK bug)</span>
1795
+ <span class="cstat-no" title="statement not covered" > const isEmptyError =</span>
1796
+ <span class="cstat-no" title="statement not covered" > typeof error === 'object' &amp;&amp;</span>
1797
+ <span class="cstat-no" title="statement not covered" > error !== null &amp;&amp;</span>
1798
+ <span class="cstat-no" title="statement not covered" > Object.keys(error).length === 0 &amp;&amp;</span>
1799
+ <span class="cstat-no" title="statement not covered" > !(error instanceof Error);</span>
1800
+ <span class="cstat-no" title="statement not covered" ></span>
1801
+ <span class="cstat-no" title="statement not covered" > if (isEmptyError) {</span>
1802
+ <span class="cstat-no" title="statement not covered" > logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {</span>
1803
+ <span class="cstat-no" title="statement not covered" > topic: params.topic?.substring(0, 16) + '...',</span>
1804
+ <span class="cstat-no" title="statement not covered" > });</span>
1805
+ <span class="cstat-no" title="statement not covered" > throw new Error('WalletConnect connection issue - please try again');</span>
1806
+ <span class="cstat-no" title="statement not covered" > }</span>
1807
+ <span class="cstat-no" title="statement not covered" ></span>
1808
+ <span class="cstat-no" title="statement not covered" > const errorMsg = extractErrorMessage(error);</span>
1809
+ <span class="cstat-no" title="statement not covered" > logger.error('Sign message failed', { error: errorMsg });</span>
1810
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Hedera sign message failed: ${errorMsg}`);</span>
1811
+ <span class="cstat-no" title="statement not covered" > }</span>
1812
+ <span class="cstat-no" title="statement not covered" > }</span>
1813
+ &nbsp;
1814
+ /**
1815
+ * Parse accounts from Hedera namespace in WalletConnect session.
1816
+ * Extracts account IDs from HIP-30 format: hedera:&lt;network&gt;:&lt;accountId&gt;
1817
+ *
1818
+ * Optionally filters accounts to only include those matching a target network.
1819
+ * This is important for respecting the user's network selection in the dApp,
1820
+ * since wallets may return accounts from multiple networks.
1821
+ *
1822
+ * @param namespace - Hedera namespace object from session
1823
+ * @param targetNetworkId - Optional network ID to filter accounts (e.g., 'hedera:mainnet')
1824
+ * @returns Array of parsed account objects, filtered by target network if specified
1825
+ */
1826
+ parseAccounts(
1827
+ namespace: any,
1828
+ targetNetworkId?: string,
1829
+ ): Array&lt;{ address: string; chainId: string }&gt; {
1830
+ if (!namespace) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1831
+ <span class="cstat-no" title="statement not covered" > logger.warn('Namespace is null or undefined');</span>
1832
+ <span class="cstat-no" title="statement not covered" > return [];</span>
1833
+ <span class="cstat-no" title="statement not covered" > }</span>
1834
+ &nbsp;
1835
+ if (!(namespace as { accounts?: string[] }).accounts) {
1836
+ logger.warn('Namespace has no accounts property');
1837
+ return [];
1838
+ }
1839
+ &nbsp;
1840
+ if (!Array.isArray((namespace as { accounts?: string[] }).accounts)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1841
+ <span class="cstat-no" title="statement not covered" > logger.warn('Namespace accounts is not an array', {</span>
1842
+ <span class="cstat-no" title="statement not covered" > type: typeof (namespace as { accounts?: string[] }).accounts,</span>
1843
+ <span class="cstat-no" title="statement not covered" > });</span>
1844
+ <span class="cstat-no" title="statement not covered" > return [];</span>
1845
+ <span class="cstat-no" title="statement not covered" > }</span>
1846
+ &nbsp;
1847
+ // Parse all accounts from namespace
1848
+ const allAccounts = ((namespace as { accounts?: string[] }).<span class="branch-0 cbranch-no" title="branch not covered" >accounts || []).m</span>ap(
1849
+ (account: string) =&gt; {
1850
+ // HIP-30 format: hedera:testnet:0.0.12345
1851
+ const parts = account.split(':');
1852
+ &nbsp;
1853
+ if (parts.length &lt; 3) {
1854
+ logger.warn('Invalid account format', { account, partsLength: parts.length });
1855
+ return { address: account, chainId: 'hedera:testnet' };
1856
+ }
1857
+ &nbsp;
1858
+ return {
1859
+ address: parts[parts.length - 1], // Account ID (0.0.12345)
1860
+ chainId: `${parts[0]}:${parts[1]}`, // hedera:testnet
1861
+ };
1862
+ },
1863
+ );
1864
+ &nbsp;
1865
+ // If target network specified, filter accounts to only that network
1866
+ if (targetNetworkId) {
1867
+ const targetNetwork = targetNetworkId.split(':')[1]?.toLowerCase(); // e.g., 'mainnet'
1868
+ &nbsp;
1869
+ if (targetNetwork) {
1870
+ const filteredAccounts = allAccounts.filter((acc) =&gt;
1871
+ acc.chainId.toLowerCase().includes(targetNetwork),
1872
+ );
1873
+ &nbsp;
1874
+ logger.debug('Filtered accounts by target network', {
1875
+ targetNetworkId,
1876
+ targetNetwork,
1877
+ totalAccounts: allAccounts.length,
1878
+ filteredCount: filteredAccounts.length,
1879
+ });
1880
+ &nbsp;
1881
+ // If no accounts match the target network, log a warning
1882
+ if (filteredAccounts.length === 0 &amp;&amp; allAccounts.length &gt; 0) {
1883
+ logger.warn('No accounts found for target network', {
1884
+ targetNetwork,
1885
+ availableNetworks: [...new Set(allAccounts.map((a) =&gt; a.chainId))],
1886
+ });
1887
+ }
1888
+ &nbsp;
1889
+ return filteredAccounts;
1890
+ }
1891
+ }
1892
+ &nbsp;
1893
+ return allAccounts;
1894
+ }
1895
+ }
1896
+ &nbsp;</pre></td></tr></table></pre>
1897
+
1898
+ <div class='push'></div><!-- for sticky footer -->
1899
+ </div><!-- /wrapper -->
1900
+ <div class='footer quiet pad2 space-top1 center small'>
1901
+ Code coverage generated by
1902
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1903
+ at 2026-06-02T14:30:38.257Z
1904
+ </div>
1905
+ <script src="../../../../prettify.js"></script>
1906
+ <script>
1907
+ window.onload = function () {
1908
+ prettyPrint();
1909
+ };
1910
+ </script>
1911
+ <script src="../../../../sorter.js"></script>
1912
+ <script src="../../../../block-navigation.js"></script>
1913
+ </body>
1914
+ </html>
1915
+