@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.
- package/README.md +48 -0
- package/USAGE_EXAMPLES.md +476 -0
- package/assets/wallets/extension.svg +7 -0
- package/assets/wallets/hashpack.svg +6 -0
- package/assets/wallets/hsuite.svg +11 -0
- package/assets/wallets/kabila.svg +11 -0
- package/assets/wallets/walletconnect.svg +13 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-summary.json +50 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +476 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +476 -0
- package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
- package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
- package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +685 -0
- package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +766 -0
- package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
- package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1495 -0
- package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1588 -0
- package/coverage/lcov-report/lib/components/account-selector/index.html +161 -0
- package/coverage/lcov-report/lib/components/wallet-account-display/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
- package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
- package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
- package/coverage/lcov-report/lib/components/wallet-session-display/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
- package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
- package/coverage/lcov-report/lib/directives/index.html +146 -0
- package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +670 -0
- package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +547 -0
- package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +781 -0
- package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +715 -0
- package/coverage/lcov-report/lib/index.html +116 -0
- package/coverage/lcov-report/lib/models/connection-config.model.ts.html +280 -0
- package/coverage/lcov-report/lib/models/index.html +131 -0
- package/coverage/lcov-report/lib/models/provider-types.ts.html +577 -0
- package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +1138 -0
- package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
- package/coverage/lcov-report/lib/providers/hsuite-native/index.html +116 -0
- package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +2347 -0
- package/coverage/lcov-report/lib/providers/index.html +146 -0
- package/coverage/lcov-report/lib/providers/p2p-native/index.html +131 -0
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
- package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1132 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +176 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +673 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +146 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
- package/coverage/lcov-report/lib/services/index.html +191 -0
- package/coverage/lcov-report/lib/services/logger.service.ts.html +463 -0
- package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
- package/coverage/lcov-report/lib/services/transaction-builders/index.html +161 -0
- package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
- package/coverage/lcov-report/lib/services/transaction.service.ts.html +1123 -0
- package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +2641 -0
- package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +637 -0
- package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +643 -0
- package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +496 -0
- package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +823 -0
- package/coverage/lcov-report/lib/transports/index.html +116 -0
- package/coverage/lcov-report/lib/utils/index.html +116 -0
- package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +319 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +19252 -0
- package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
- package/coverage/lib/components/account-selector/account-actions/index.html +116 -0
- package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
- package/coverage/lib/components/account-selector/account-filter/index.html +116 -0
- package/coverage/lib/components/account-selector/account-formatting.service.ts.html +685 -0
- package/coverage/lib/components/account-selector/account-grouping.service.ts.html +766 -0
- package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
- package/coverage/lib/components/account-selector/account-list/index.html +116 -0
- package/coverage/lib/components/account-selector/account-selector.component.ts.html +1495 -0
- package/coverage/lib/components/account-selector/account-selector.service.ts.html +1588 -0
- package/coverage/lib/components/account-selector/index.html +161 -0
- package/coverage/lib/components/wallet-account-display/index.html +116 -0
- package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
- package/coverage/lib/components/wallet-connect-button/index.html +116 -0
- package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
- package/coverage/lib/components/wallet-connect-prompt/index.html +116 -0
- package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
- package/coverage/lib/components/wallet-connected-guard/index.html +116 -0
- package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
- package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
- package/coverage/lib/components/wallet-session-display/index.html +116 -0
- package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
- package/coverage/lib/components/wallet-transaction-status/index.html +116 -0
- package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
- package/coverage/lib/directives/index.html +146 -0
- package/coverage/lib/directives/wallet-connected.directive.ts.html +670 -0
- package/coverage/lib/directives/wallet-context.directive.ts.html +547 -0
- package/coverage/lib/directives/wallet-events.directive.ts.html +781 -0
- package/coverage/lib/hsuite-wallet.module.ts.html +715 -0
- package/coverage/lib/index.html +116 -0
- package/coverage/lib/models/connection-config.model.ts.html +280 -0
- package/coverage/lib/models/index.html +131 -0
- package/coverage/lib/models/provider-types.ts.html +577 -0
- package/coverage/lib/providers/base-wallet-provider.ts.html +1138 -0
- package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
- package/coverage/lib/providers/hsuite-native/index.html +116 -0
- package/coverage/lib/providers/hsuite-native-provider.ts.html +2347 -0
- package/coverage/lib/providers/index.html +146 -0
- package/coverage/lib/providers/p2p-native/index.html +131 -0
- package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
- package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
- package/coverage/lib/providers/wallet-error-handler.ts.html +1132 -0
- package/coverage/lib/providers/walletconnect/core/index.html +176 -0
- package/coverage/lib/providers/walletconnect/core/session-health.ts.html +673 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
- package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
- package/coverage/lib/providers/walletconnect/signers/index.html +146 -0
- package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
- package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
- package/coverage/lib/services/index.html +191 -0
- package/coverage/lib/services/logger.service.ts.html +463 -0
- package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
- package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
- package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
- package/coverage/lib/services/transaction-builders/index.html +161 -0
- package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
- package/coverage/lib/services/transaction.service.ts.html +1123 -0
- package/coverage/lib/services/unified-wallet.service.ts.html +2641 -0
- package/coverage/lib/services/wallet-context.service.ts.html +637 -0
- package/coverage/lib/services/wallet-event-bus.service.ts.html +643 -0
- package/coverage/lib/services/wallet-providers.service.ts.html +496 -0
- package/coverage/lib/transports/chrome-extension-transport.ts.html +823 -0
- package/coverage/lib/transports/index.html +116 -0
- package/coverage/lib/utils/index.html +116 -0
- package/coverage/lib/utils/ledger-icons.util.ts.html +319 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/README.md +48 -0
- package/dist/fesm2022/hsuite-native-connect-angular.mjs +14592 -0
- package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -0
- package/dist/index.d.ts +6949 -0
- package/examples/minimal-connect.ts +178 -0
- package/examples/multi-protocol.ts +495 -0
- package/examples/transaction-signing.ts +361 -0
- package/jest.config.json +45 -0
- package/karma.conf.js +42 -0
- package/ng-package.json +20 -0
- package/package.json +60 -0
- package/src/index.ts +203 -0
- package/src/lib/components/account-selector/account-actions/account-actions.component.ts +261 -0
- package/src/lib/components/account-selector/account-filter/account-filter.component.ts +401 -0
- package/src/lib/components/account-selector/account-formatting.service.ts +200 -0
- package/src/lib/components/account-selector/account-grouping.service.ts +227 -0
- package/src/lib/components/account-selector/account-list/account-list.component.ts +470 -0
- package/src/lib/components/account-selector/account-selector.component.html +135 -0
- package/src/lib/components/account-selector/account-selector.component.scss +2039 -0
- package/src/lib/components/account-selector/account-selector.component.ts +470 -0
- package/src/lib/components/account-selector/account-selector.service.ts +501 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.html +34 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.scss +99 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +140 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.html +14 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.scss +272 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +240 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.html +24 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.scss +50 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts +108 -0
- package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.html +24 -0
- package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts +73 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.html +56 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.scss +218 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts +117 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.html +94 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.scss +272 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts +734 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +197 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.scss +678 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +730 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.html +110 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.scss +179 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.ts +197 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.html +65 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.scss +254 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts +206 -0
- package/src/lib/directives/wallet-connected.directive.ts +195 -0
- package/src/lib/directives/wallet-context.directive.ts +154 -0
- package/src/lib/directives/wallet-events.directive.ts +232 -0
- package/src/lib/hsuite-wallet.module.ts +210 -0
- package/src/lib/models/connection-config.model.ts +65 -0
- package/src/lib/models/provider-types.ts +164 -0
- package/src/lib/models/unified-account.model.ts +76 -0
- package/src/lib/models/wallet-context.model.ts +121 -0
- package/src/lib/models/wallet-events.model.ts +158 -0
- package/src/lib/providers/base-wallet-provider.ts +351 -0
- package/src/lib/providers/hsuite-native/channel-client.service.spec.ts +73 -0
- package/src/lib/providers/hsuite-native/channel-client.service.ts +862 -0
- package/src/lib/providers/hsuite-native/index.ts +8 -0
- package/src/lib/providers/hsuite-native-provider.ts +754 -0
- package/src/lib/providers/mobile-native/mobile-native.provider.spec.ts +19 -0
- package/src/lib/providers/p2p-native/index.ts +30 -0
- package/src/lib/providers/p2p-native/p2p-native.provider.spec.ts +523 -0
- package/src/lib/providers/p2p-native/p2p-native.provider.ts +723 -0
- package/src/lib/providers/p2p-native/p2p-session-manager.ts +695 -0
- package/src/lib/providers/wallet-error-handler.ts +349 -0
- package/src/lib/providers/walletconnect/core/base-signer.interface.ts +122 -0
- package/src/lib/providers/walletconnect/core/session-health.ts +196 -0
- package/src/lib/providers/walletconnect/core/walletconnect-client-manager.ts +364 -0
- package/src/lib/providers/walletconnect/core/walletconnect-provider.integration.spec.ts +348 -0
- package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +826 -0
- package/src/lib/providers/walletconnect/core/walletconnect-session-store.ts +273 -0
- package/src/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts +299 -0
- package/src/lib/providers/walletconnect/core/walletconnect-types.ts +48 -0
- package/src/lib/providers/walletconnect/index.ts +33 -0
- package/src/lib/providers/walletconnect/signers/hedera-signer.spec.ts +367 -0
- package/src/lib/providers/walletconnect/signers/hedera-signer.ts +610 -0
- package/src/lib/providers/walletconnect/signers/signer-factory.spec.ts +62 -0
- package/src/lib/providers/walletconnect/signers/signer-factory.ts +120 -0
- package/src/lib/providers/walletconnect/signers/xrpl-signer.spec.ts +296 -0
- package/src/lib/providers/walletconnect/signers/xrpl-signer.ts +478 -0
- package/src/lib/services/logger.service.ts +126 -0
- package/src/lib/services/transaction-builders/base-transaction-builder.service.ts +585 -0
- package/src/lib/services/transaction-builders/hedera-amount-utils.ts +84 -0
- package/src/lib/services/transaction-builders/hedera-transaction-builder.service.spec.ts +741 -0
- package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +1285 -0
- package/src/lib/services/transaction-builders/index.ts +54 -0
- package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.spec.ts +937 -0
- package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.ts +832 -0
- package/src/lib/services/transaction.service.ts +346 -0
- package/src/lib/services/unified-wallet.service.spec.ts +1382 -0
- package/src/lib/services/unified-wallet.service.ts +852 -0
- package/src/lib/services/wallet-context.service.ts +184 -0
- package/src/lib/services/wallet-event-bus.service.ts +186 -0
- package/src/lib/services/wallet-providers.service.ts +137 -0
- package/src/lib/transports/chrome-extension-transport.ts +246 -0
- package/src/lib/utils/index.ts +14 -0
- package/src/lib/utils/ledger-icons.util.ts +78 -0
- package/test/test-setup.ts +21 -0
- package/test-setup.ts +63 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +29 -0
- package/tsconfig.spec.json +15 -0
- package/vitest.config.ts +48 -0
|
@@ -0,0 +1,1177 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for lib/providers/walletconnect/core/walletconnect-client-manager.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/core</a> walletconnect-client-manager.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">72.25% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>263/364</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">56% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>14/25</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">70.58% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>12/17</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">72.25% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>263/364</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
431
|
+
<span class="cline-any cline-yes">1x</span>
|
|
432
|
+
<span class="cline-any cline-yes">1x</span>
|
|
433
|
+
<span class="cline-any cline-yes">1x</span>
|
|
434
|
+
<span class="cline-any cline-yes">1x</span>
|
|
435
|
+
<span class="cline-any cline-yes">1x</span>
|
|
436
|
+
<span class="cline-any cline-yes">1x</span>
|
|
437
|
+
<span class="cline-any cline-yes">1x</span>
|
|
438
|
+
<span class="cline-any cline-yes">1x</span>
|
|
439
|
+
<span class="cline-any cline-yes">1x</span>
|
|
440
|
+
<span class="cline-any cline-yes">1x</span>
|
|
441
|
+
<span class="cline-any cline-yes">1x</span>
|
|
442
|
+
<span class="cline-any cline-yes">1x</span>
|
|
443
|
+
<span class="cline-any cline-yes">1x</span>
|
|
444
|
+
<span class="cline-any cline-yes">1x</span>
|
|
445
|
+
<span class="cline-any cline-yes">1x</span>
|
|
446
|
+
<span class="cline-any cline-yes">1x</span>
|
|
447
|
+
<span class="cline-any cline-yes">1x</span>
|
|
448
|
+
<span class="cline-any cline-yes">1x</span>
|
|
449
|
+
<span class="cline-any cline-yes">1x</span>
|
|
450
|
+
<span class="cline-any cline-yes">1x</span>
|
|
451
|
+
<span class="cline-any cline-yes">1x</span>
|
|
452
|
+
<span class="cline-any cline-yes">1x</span>
|
|
453
|
+
<span class="cline-any cline-yes">1x</span>
|
|
454
|
+
<span class="cline-any cline-yes">1x</span>
|
|
455
|
+
<span class="cline-any cline-yes">1x</span>
|
|
456
|
+
<span class="cline-any cline-yes">1x</span>
|
|
457
|
+
<span class="cline-any cline-yes">1x</span>
|
|
458
|
+
<span class="cline-any cline-yes">1x</span>
|
|
459
|
+
<span class="cline-any cline-yes">1x</span>
|
|
460
|
+
<span class="cline-any cline-yes">1x</span>
|
|
461
|
+
<span class="cline-any cline-yes">1x</span>
|
|
462
|
+
<span class="cline-any cline-yes">1x</span>
|
|
463
|
+
<span class="cline-any cline-yes">1x</span>
|
|
464
|
+
<span class="cline-any cline-yes">1x</span>
|
|
465
|
+
<span class="cline-any cline-yes">1x</span>
|
|
466
|
+
<span class="cline-any cline-yes">1x</span>
|
|
467
|
+
<span class="cline-any cline-yes">1x</span>
|
|
468
|
+
<span class="cline-any cline-yes">1x</span>
|
|
469
|
+
<span class="cline-any cline-yes">1x</span>
|
|
470
|
+
<span class="cline-any cline-yes">1x</span>
|
|
471
|
+
<span class="cline-any cline-yes">1x</span>
|
|
472
|
+
<span class="cline-any cline-yes">1x</span>
|
|
473
|
+
<span class="cline-any cline-yes">1x</span>
|
|
474
|
+
<span class="cline-any cline-yes">1x</span>
|
|
475
|
+
<span class="cline-any cline-yes">1x</span>
|
|
476
|
+
<span class="cline-any cline-yes">1x</span>
|
|
477
|
+
<span class="cline-any cline-yes">1x</span>
|
|
478
|
+
<span class="cline-any cline-yes">1x</span>
|
|
479
|
+
<span class="cline-any cline-yes">1x</span>
|
|
480
|
+
<span class="cline-any cline-yes">1x</span>
|
|
481
|
+
<span class="cline-any cline-yes">1x</span>
|
|
482
|
+
<span class="cline-any cline-yes">1x</span>
|
|
483
|
+
<span class="cline-any cline-yes">16x</span>
|
|
484
|
+
<span class="cline-any cline-yes">16x</span>
|
|
485
|
+
<span class="cline-any cline-yes">16x</span>
|
|
486
|
+
<span class="cline-any cline-yes">16x</span>
|
|
487
|
+
<span class="cline-any cline-yes">16x</span>
|
|
488
|
+
<span class="cline-any cline-yes">16x</span>
|
|
489
|
+
<span class="cline-any cline-yes">16x</span>
|
|
490
|
+
<span class="cline-any cline-yes">16x</span>
|
|
491
|
+
<span class="cline-any cline-yes">16x</span>
|
|
492
|
+
<span class="cline-any cline-yes">16x</span>
|
|
493
|
+
<span class="cline-any cline-yes">16x</span>
|
|
494
|
+
<span class="cline-any cline-yes">16x</span>
|
|
495
|
+
<span class="cline-any cline-yes">16x</span>
|
|
496
|
+
<span class="cline-any cline-yes">13x</span>
|
|
497
|
+
<span class="cline-any cline-no"> </span>
|
|
498
|
+
<span class="cline-any cline-no"> </span>
|
|
499
|
+
<span class="cline-any cline-yes">13x</span>
|
|
500
|
+
<span class="cline-any cline-yes">13x</span>
|
|
501
|
+
<span class="cline-any cline-yes">13x</span>
|
|
502
|
+
<span class="cline-any cline-yes">13x</span>
|
|
503
|
+
<span class="cline-any cline-yes">13x</span>
|
|
504
|
+
<span class="cline-any cline-yes">13x</span>
|
|
505
|
+
<span class="cline-any cline-yes">13x</span>
|
|
506
|
+
<span class="cline-any cline-yes">13x</span>
|
|
507
|
+
<span class="cline-any cline-yes">13x</span>
|
|
508
|
+
<span class="cline-any cline-yes">13x</span>
|
|
509
|
+
<span class="cline-any cline-yes">13x</span>
|
|
510
|
+
<span class="cline-any cline-yes">13x</span>
|
|
511
|
+
<span class="cline-any cline-yes">13x</span>
|
|
512
|
+
<span class="cline-any cline-yes">12x</span>
|
|
513
|
+
<span class="cline-any cline-yes">12x</span>
|
|
514
|
+
<span class="cline-any cline-yes">12x</span>
|
|
515
|
+
<span class="cline-any cline-yes">12x</span>
|
|
516
|
+
<span class="cline-any cline-yes">12x</span>
|
|
517
|
+
<span class="cline-any cline-yes">12x</span>
|
|
518
|
+
<span class="cline-any cline-yes">13x</span>
|
|
519
|
+
<span class="cline-any cline-yes">16x</span>
|
|
520
|
+
<span class="cline-any cline-yes">16x</span>
|
|
521
|
+
<span class="cline-any cline-yes">16x</span>
|
|
522
|
+
<span class="cline-any cline-yes">16x</span>
|
|
523
|
+
<span class="cline-any cline-yes">16x</span>
|
|
524
|
+
<span class="cline-any cline-yes">16x</span>
|
|
525
|
+
<span class="cline-any cline-no"> </span>
|
|
526
|
+
<span class="cline-any cline-no"> </span>
|
|
527
|
+
<span class="cline-any cline-no"> </span>
|
|
528
|
+
<span class="cline-any cline-no"> </span>
|
|
529
|
+
<span class="cline-any cline-no"> </span>
|
|
530
|
+
<span class="cline-any cline-yes">16x</span>
|
|
531
|
+
<span class="cline-any cline-yes">16x</span>
|
|
532
|
+
<span class="cline-any cline-yes">16x</span>
|
|
533
|
+
<span class="cline-any cline-yes">16x</span>
|
|
534
|
+
<span class="cline-any cline-yes">16x</span>
|
|
535
|
+
<span class="cline-any cline-yes">32x</span>
|
|
536
|
+
<span class="cline-any cline-yes">32x</span>
|
|
537
|
+
<span class="cline-any cline-yes">16x</span>
|
|
538
|
+
<span class="cline-any cline-yes">16x</span>
|
|
539
|
+
<span class="cline-any cline-yes">16x</span>
|
|
540
|
+
<span class="cline-any cline-yes">16x</span>
|
|
541
|
+
<span class="cline-any cline-yes">16x</span>
|
|
542
|
+
<span class="cline-any cline-yes">16x</span>
|
|
543
|
+
<span class="cline-any cline-yes">16x</span>
|
|
544
|
+
<span class="cline-any cline-yes">16x</span>
|
|
545
|
+
<span class="cline-any cline-yes">16x</span>
|
|
546
|
+
<span class="cline-any cline-yes">16x</span>
|
|
547
|
+
<span class="cline-any cline-yes">16x</span>
|
|
548
|
+
<span class="cline-any cline-yes">16x</span>
|
|
549
|
+
<span class="cline-any cline-yes">16x</span>
|
|
550
|
+
<span class="cline-any cline-yes">16x</span>
|
|
551
|
+
<span class="cline-any cline-no"> </span>
|
|
552
|
+
<span class="cline-any cline-no"> </span>
|
|
553
|
+
<span class="cline-any cline-no"> </span>
|
|
554
|
+
<span class="cline-any cline-no"> </span>
|
|
555
|
+
<span class="cline-any cline-no"> </span>
|
|
556
|
+
<span class="cline-any cline-no"> </span>
|
|
557
|
+
<span class="cline-any cline-no"> </span>
|
|
558
|
+
<span class="cline-any cline-no"> </span>
|
|
559
|
+
<span class="cline-any cline-no"> </span>
|
|
560
|
+
<span class="cline-any cline-yes">16x</span>
|
|
561
|
+
<span class="cline-any cline-yes">16x</span>
|
|
562
|
+
<span class="cline-any cline-yes">16x</span>
|
|
563
|
+
<span class="cline-any cline-yes">16x</span>
|
|
564
|
+
<span class="cline-any cline-yes">16x</span>
|
|
565
|
+
<span class="cline-any cline-yes">16x</span>
|
|
566
|
+
<span class="cline-any cline-no"> </span>
|
|
567
|
+
<span class="cline-any cline-no"> </span>
|
|
568
|
+
<span class="cline-any cline-no"> </span>
|
|
569
|
+
<span class="cline-any cline-no"> </span>
|
|
570
|
+
<span class="cline-any cline-no"> </span>
|
|
571
|
+
<span class="cline-any cline-yes">16x</span>
|
|
572
|
+
<span class="cline-any cline-yes">16x</span>
|
|
573
|
+
<span class="cline-any cline-yes">16x</span>
|
|
574
|
+
<span class="cline-any cline-yes">16x</span>
|
|
575
|
+
<span class="cline-any cline-yes">16x</span>
|
|
576
|
+
<span class="cline-any cline-yes">16x</span>
|
|
577
|
+
<span class="cline-any cline-yes">12x</span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-no"> </span>
|
|
580
|
+
<span class="cline-any cline-yes">12x</span>
|
|
581
|
+
<span class="cline-any cline-yes">12x</span>
|
|
582
|
+
<span class="cline-any cline-yes">12x</span>
|
|
583
|
+
<span class="cline-any cline-yes">12x</span>
|
|
584
|
+
<span class="cline-any cline-yes">12x</span>
|
|
585
|
+
<span class="cline-any cline-yes">12x</span>
|
|
586
|
+
<span class="cline-any cline-yes">16x</span>
|
|
587
|
+
<span class="cline-any cline-yes">16x</span>
|
|
588
|
+
<span class="cline-any cline-yes">16x</span>
|
|
589
|
+
<span class="cline-any cline-yes">16x</span>
|
|
590
|
+
<span class="cline-any cline-yes">16x</span>
|
|
591
|
+
<span class="cline-any cline-yes">16x</span>
|
|
592
|
+
<span class="cline-any cline-yes">16x</span>
|
|
593
|
+
<span class="cline-any cline-yes">12x</span>
|
|
594
|
+
<span class="cline-any cline-yes">12x</span>
|
|
595
|
+
<span class="cline-any cline-yes">12x</span>
|
|
596
|
+
<span class="cline-any cline-yes">12x</span>
|
|
597
|
+
<span class="cline-any cline-yes">12x</span>
|
|
598
|
+
<span class="cline-any cline-yes">12x</span>
|
|
599
|
+
<span class="cline-any cline-yes">16x</span>
|
|
600
|
+
<span class="cline-any cline-yes">16x</span>
|
|
601
|
+
<span class="cline-any cline-yes">16x</span>
|
|
602
|
+
<span class="cline-any cline-yes">16x</span>
|
|
603
|
+
<span class="cline-any cline-yes">16x</span>
|
|
604
|
+
<span class="cline-any cline-yes">17x</span>
|
|
605
|
+
<span class="cline-any cline-yes">16x</span>
|
|
606
|
+
<span class="cline-any cline-yes">16x</span>
|
|
607
|
+
<span class="cline-any cline-yes">17x</span>
|
|
608
|
+
<span class="cline-any cline-yes">16x</span>
|
|
609
|
+
<span class="cline-any cline-yes">16x</span>
|
|
610
|
+
<span class="cline-any cline-yes">16x</span>
|
|
611
|
+
<span class="cline-any cline-yes">16x</span>
|
|
612
|
+
<span class="cline-any cline-yes">16x</span>
|
|
613
|
+
<span class="cline-any cline-yes">16x</span>
|
|
614
|
+
<span class="cline-any cline-yes">16x</span>
|
|
615
|
+
<span class="cline-any cline-yes">16x</span>
|
|
616
|
+
<span class="cline-any cline-yes">16x</span>
|
|
617
|
+
<span class="cline-any cline-yes">12x</span>
|
|
618
|
+
<span class="cline-any cline-yes">12x</span>
|
|
619
|
+
<span class="cline-any cline-yes">12x</span>
|
|
620
|
+
<span class="cline-any cline-yes">12x</span>
|
|
621
|
+
<span class="cline-any cline-yes">12x</span>
|
|
622
|
+
<span class="cline-any cline-yes">12x</span>
|
|
623
|
+
<span class="cline-any cline-yes">12x</span>
|
|
624
|
+
<span class="cline-any cline-no"> </span>
|
|
625
|
+
<span class="cline-any cline-no"> </span>
|
|
626
|
+
<span class="cline-any cline-yes">12x</span>
|
|
627
|
+
<span class="cline-any cline-yes">12x</span>
|
|
628
|
+
<span class="cline-any cline-yes">12x</span>
|
|
629
|
+
<span class="cline-any cline-yes">12x</span>
|
|
630
|
+
<span class="cline-any cline-yes">12x</span>
|
|
631
|
+
<span class="cline-any cline-yes">12x</span>
|
|
632
|
+
<span class="cline-any cline-yes">12x</span>
|
|
633
|
+
<span class="cline-any cline-yes">12x</span>
|
|
634
|
+
<span class="cline-any cline-yes">12x</span>
|
|
635
|
+
<span class="cline-any cline-yes">12x</span>
|
|
636
|
+
<span class="cline-any cline-yes">12x</span>
|
|
637
|
+
<span class="cline-any cline-yes">12x</span>
|
|
638
|
+
<span class="cline-any cline-yes">12x</span>
|
|
639
|
+
<span class="cline-any cline-yes">12x</span>
|
|
640
|
+
<span class="cline-any cline-yes">12x</span>
|
|
641
|
+
<span class="cline-any cline-yes">12x</span>
|
|
642
|
+
<span class="cline-any cline-yes">16x</span>
|
|
643
|
+
<span class="cline-any cline-yes">16x</span>
|
|
644
|
+
<span class="cline-any cline-yes">16x</span>
|
|
645
|
+
<span class="cline-any cline-yes">16x</span>
|
|
646
|
+
<span class="cline-any cline-yes">16x</span>
|
|
647
|
+
<span class="cline-any cline-yes">16x</span>
|
|
648
|
+
<span class="cline-any cline-yes">16x</span>
|
|
649
|
+
<span class="cline-any cline-yes">16x</span>
|
|
650
|
+
<span class="cline-any cline-yes">16x</span>
|
|
651
|
+
<span class="cline-any cline-yes">4x</span>
|
|
652
|
+
<span class="cline-any cline-no"> </span>
|
|
653
|
+
<span class="cline-any cline-no"> </span>
|
|
654
|
+
<span class="cline-any cline-yes">4x</span>
|
|
655
|
+
<span class="cline-any cline-yes">4x</span>
|
|
656
|
+
<span class="cline-any cline-yes">4x</span>
|
|
657
|
+
<span class="cline-any cline-yes">4x</span>
|
|
658
|
+
<span class="cline-any cline-yes">4x</span>
|
|
659
|
+
<span class="cline-any cline-yes">16x</span>
|
|
660
|
+
<span class="cline-any cline-yes">16x</span>
|
|
661
|
+
<span class="cline-any cline-yes">16x</span>
|
|
662
|
+
<span class="cline-any cline-yes">16x</span>
|
|
663
|
+
<span class="cline-any cline-yes">16x</span>
|
|
664
|
+
<span class="cline-any cline-yes">16x</span>
|
|
665
|
+
<span class="cline-any cline-yes">16x</span>
|
|
666
|
+
<span class="cline-any cline-yes">12x</span>
|
|
667
|
+
<span class="cline-any cline-no"> </span>
|
|
668
|
+
<span class="cline-any cline-no"> </span>
|
|
669
|
+
<span class="cline-any cline-yes">12x</span>
|
|
670
|
+
<span class="cline-any cline-yes">12x</span>
|
|
671
|
+
<span class="cline-any cline-yes">16x</span>
|
|
672
|
+
<span class="cline-any cline-yes">16x</span>
|
|
673
|
+
<span class="cline-any cline-yes">16x</span>
|
|
674
|
+
<span class="cline-any cline-yes">16x</span>
|
|
675
|
+
<span class="cline-any cline-yes">16x</span>
|
|
676
|
+
<span class="cline-any cline-yes">16x</span>
|
|
677
|
+
<span class="cline-any cline-yes">16x</span>
|
|
678
|
+
<span class="cline-any cline-yes">16x</span>
|
|
679
|
+
<span class="cline-any cline-yes">16x</span>
|
|
680
|
+
<span class="cline-any cline-yes">16x</span>
|
|
681
|
+
<span class="cline-any cline-yes">16x</span>
|
|
682
|
+
<span class="cline-any cline-yes">16x</span>
|
|
683
|
+
<span class="cline-any cline-yes">16x</span>
|
|
684
|
+
<span class="cline-any cline-yes">16x</span>
|
|
685
|
+
<span class="cline-any cline-yes">16x</span>
|
|
686
|
+
<span class="cline-any cline-yes">16x</span>
|
|
687
|
+
<span class="cline-any cline-yes">16x</span>
|
|
688
|
+
<span class="cline-any cline-yes">16x</span>
|
|
689
|
+
<span class="cline-any cline-yes">16x</span>
|
|
690
|
+
<span class="cline-any cline-no"> </span>
|
|
691
|
+
<span class="cline-any cline-no"> </span>
|
|
692
|
+
<span class="cline-any cline-no"> </span>
|
|
693
|
+
<span class="cline-any cline-no"> </span>
|
|
694
|
+
<span class="cline-any cline-no"> </span>
|
|
695
|
+
<span class="cline-any cline-no"> </span>
|
|
696
|
+
<span class="cline-any cline-no"> </span>
|
|
697
|
+
<span class="cline-any cline-no"> </span>
|
|
698
|
+
<span class="cline-any cline-no"> </span>
|
|
699
|
+
<span class="cline-any cline-no"> </span>
|
|
700
|
+
<span class="cline-any cline-no"> </span>
|
|
701
|
+
<span class="cline-any cline-no"> </span>
|
|
702
|
+
<span class="cline-any cline-no"> </span>
|
|
703
|
+
<span class="cline-any cline-no"> </span>
|
|
704
|
+
<span class="cline-any cline-no"> </span>
|
|
705
|
+
<span class="cline-any cline-no"> </span>
|
|
706
|
+
<span class="cline-any cline-no"> </span>
|
|
707
|
+
<span class="cline-any cline-no"> </span>
|
|
708
|
+
<span class="cline-any cline-no"> </span>
|
|
709
|
+
<span class="cline-any cline-no"> </span>
|
|
710
|
+
<span class="cline-any cline-no"> </span>
|
|
711
|
+
<span class="cline-any cline-no"> </span>
|
|
712
|
+
<span class="cline-any cline-no"> </span>
|
|
713
|
+
<span class="cline-any cline-no"> </span>
|
|
714
|
+
<span class="cline-any cline-no"> </span>
|
|
715
|
+
<span class="cline-any cline-no"> </span>
|
|
716
|
+
<span class="cline-any cline-no"> </span>
|
|
717
|
+
<span class="cline-any cline-no"> </span>
|
|
718
|
+
<span class="cline-any cline-no"> </span>
|
|
719
|
+
<span class="cline-any cline-no"> </span>
|
|
720
|
+
<span class="cline-any cline-no"> </span>
|
|
721
|
+
<span class="cline-any cline-no"> </span>
|
|
722
|
+
<span class="cline-any cline-no"> </span>
|
|
723
|
+
<span class="cline-any cline-no"> </span>
|
|
724
|
+
<span class="cline-any cline-no"> </span>
|
|
725
|
+
<span class="cline-any cline-no"> </span>
|
|
726
|
+
<span class="cline-any cline-no"> </span>
|
|
727
|
+
<span class="cline-any cline-no"> </span>
|
|
728
|
+
<span class="cline-any cline-no"> </span>
|
|
729
|
+
<span class="cline-any cline-no"> </span>
|
|
730
|
+
<span class="cline-any cline-no"> </span>
|
|
731
|
+
<span class="cline-any cline-no"> </span>
|
|
732
|
+
<span class="cline-any cline-no"> </span>
|
|
733
|
+
<span class="cline-any cline-no"> </span>
|
|
734
|
+
<span class="cline-any cline-no"> </span>
|
|
735
|
+
<span class="cline-any cline-no"> </span>
|
|
736
|
+
<span class="cline-any cline-no"> </span>
|
|
737
|
+
<span class="cline-any cline-no"> </span>
|
|
738
|
+
<span class="cline-any cline-no"> </span>
|
|
739
|
+
<span class="cline-any cline-no"> </span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-no"> </span>
|
|
742
|
+
<span class="cline-any cline-no"> </span>
|
|
743
|
+
<span class="cline-any cline-no"> </span>
|
|
744
|
+
<span class="cline-any cline-no"> </span>
|
|
745
|
+
<span class="cline-any cline-no"> </span>
|
|
746
|
+
<span class="cline-any cline-no"> </span>
|
|
747
|
+
<span class="cline-any cline-no"> </span>
|
|
748
|
+
<span class="cline-any cline-no"> </span>
|
|
749
|
+
<span class="cline-any cline-no"> </span>
|
|
750
|
+
<span class="cline-any cline-yes">16x</span>
|
|
751
|
+
<span class="cline-any cline-yes">16x</span>
|
|
752
|
+
<span class="cline-any cline-yes">16x</span>
|
|
753
|
+
<span class="cline-any cline-yes">16x</span>
|
|
754
|
+
<span class="cline-any cline-yes">16x</span>
|
|
755
|
+
<span class="cline-any cline-yes">16x</span>
|
|
756
|
+
<span class="cline-any cline-yes">16x</span>
|
|
757
|
+
<span class="cline-any cline-yes">16x</span>
|
|
758
|
+
<span class="cline-any cline-yes">16x</span>
|
|
759
|
+
<span class="cline-any cline-yes">16x</span>
|
|
760
|
+
<span class="cline-any cline-yes">16x</span>
|
|
761
|
+
<span class="cline-any cline-yes">16x</span>
|
|
762
|
+
<span class="cline-any cline-no"> </span>
|
|
763
|
+
<span class="cline-any cline-no"> </span>
|
|
764
|
+
<span class="cline-any cline-yes">16x</span>
|
|
765
|
+
<span class="cline-any cline-yes">16x</span>
|
|
766
|
+
<span class="cline-any cline-yes">16x</span>
|
|
767
|
+
<span class="cline-any cline-yes">16x</span>
|
|
768
|
+
<span class="cline-any cline-yes">13x</span>
|
|
769
|
+
<span class="cline-any cline-yes">13x</span>
|
|
770
|
+
<span class="cline-any cline-yes">13x</span>
|
|
771
|
+
<span class="cline-any cline-no"> </span>
|
|
772
|
+
<span class="cline-any cline-no"> </span>
|
|
773
|
+
<span class="cline-any cline-yes">13x</span>
|
|
774
|
+
<span class="cline-any cline-yes">16x</span>
|
|
775
|
+
<span class="cline-any cline-yes">16x</span>
|
|
776
|
+
<span class="cline-any cline-yes">16x</span>
|
|
777
|
+
<span class="cline-any cline-yes">16x</span>
|
|
778
|
+
<span class="cline-any cline-yes">16x</span>
|
|
779
|
+
<span class="cline-any cline-no"> </span>
|
|
780
|
+
<span class="cline-any cline-no"> </span>
|
|
781
|
+
<span class="cline-any cline-yes">16x</span>
|
|
782
|
+
<span class="cline-any cline-yes">16x</span>
|
|
783
|
+
<span class="cline-any cline-yes">16x</span>
|
|
784
|
+
<span class="cline-any cline-yes">16x</span>
|
|
785
|
+
<span class="cline-any cline-yes">16x</span>
|
|
786
|
+
<span class="cline-any cline-yes">16x</span>
|
|
787
|
+
<span class="cline-any cline-no"> </span>
|
|
788
|
+
<span class="cline-any cline-no"> </span>
|
|
789
|
+
<span class="cline-any cline-no"> </span>
|
|
790
|
+
<span class="cline-any cline-no"> </span>
|
|
791
|
+
<span class="cline-any cline-no"> </span>
|
|
792
|
+
<span class="cline-any cline-no"> </span>
|
|
793
|
+
<span class="cline-any cline-yes">16x</span>
|
|
794
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
795
|
+
* HSuite Native Connect
|
|
796
|
+
* Copyright 2024-2025 HSuite (https://hsuite.finance)
|
|
797
|
+
*
|
|
798
|
+
* SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
|
|
799
|
+
*
|
|
800
|
+
* This file is part of HSuite Native Connect. For commercial licensing,
|
|
801
|
+
* visit https://hsuite.finance/licensing
|
|
802
|
+
*/
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* @file walletconnect-client-manager.ts
|
|
806
|
+
* @description WalletConnect SignClient lifecycle management
|
|
807
|
+
*
|
|
808
|
+
* Handles:
|
|
809
|
+
* - SignClient initialization with projectId
|
|
810
|
+
* - Client reuse across multiple connections
|
|
811
|
+
* - Session restoration from IndexedDB
|
|
812
|
+
* - Event listener registration
|
|
813
|
+
*
|
|
814
|
+
* Extracted from WalletConnectV2Provider to reduce file size.
|
|
815
|
+
*/
|
|
816
|
+
|
|
817
|
+
import { getLogger } from '@hsuite/native-connect-sdk';
|
|
818
|
+
import { WalletConnectModal } from '@walletconnect/modal';
|
|
819
|
+
import SignClient from '@walletconnect/sign-client';
|
|
820
|
+
|
|
821
|
+
import { SessionHealthManager } from './session-health';
|
|
822
|
+
|
|
823
|
+
const logger = getLogger().scoped?.('WCClientManager'<span class="branch-0 cbranch-no" title="branch not covered" >) ?? getLogger();</span>
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* Storage key for persisted projectId
|
|
827
|
+
*/
|
|
828
|
+
const STORAGE_KEY_PROJECT_ID = 'hsuite.walletconnect.projectId';
|
|
829
|
+
|
|
830
|
+
/**
|
|
831
|
+
* WalletConnect app metadata
|
|
832
|
+
*/
|
|
833
|
+
export interface WCAppMetadata {
|
|
834
|
+
name: string;
|
|
835
|
+
description: string;
|
|
836
|
+
url: string;
|
|
837
|
+
icons: string[];
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/**
|
|
841
|
+
* WalletConnect Client Manager
|
|
842
|
+
*
|
|
843
|
+
* Manages the SignClient instance lifecycle.
|
|
844
|
+
* Handles initialization, session restoration, and cleanup.
|
|
845
|
+
*/
|
|
846
|
+
export class WalletConnectClientManager {
|
|
847
|
+
private client?: SignClient;
|
|
848
|
+
private modal?: WalletConnectModal;
|
|
849
|
+
private projectId?: string;
|
|
850
|
+
private sessionHealth?: SessionHealthManager;
|
|
851
|
+
|
|
852
|
+
/**
|
|
853
|
+
* Initialize or return existing SignClient.
|
|
854
|
+
*
|
|
855
|
+
* @param projectId - WalletConnect Cloud project ID
|
|
856
|
+
* @param metadata - App metadata for wallet display
|
|
857
|
+
* @returns Initialized SignClient instance
|
|
858
|
+
*/
|
|
859
|
+
async initialize(projectId: string, metadata: WCAppMetadata): Promise<SignClient> {
|
|
860
|
+
if (this.<span class="branch-0 cbranch-no" title="branch not covered" >client && this.projectId === projectId) <span class="branch-0 cbranch-no" title="branch not covered" >{</span></span>
|
|
861
|
+
<span class="cstat-no" title="statement not covered" > return this.client;</span>
|
|
862
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
863
|
+
|
|
864
|
+
logger.debug('Initializing SignClient', { projectId: projectId.substring(0, 8) });
|
|
865
|
+
|
|
866
|
+
// Store projectId for session restoration
|
|
867
|
+
this.projectId = projectId;
|
|
868
|
+
this.persistProjectId(projectId);
|
|
869
|
+
|
|
870
|
+
// Use 'fatal' logger to suppress pino noise from WalletConnect SDK
|
|
871
|
+
this.client = await SignClient.init({
|
|
872
|
+
projectId,
|
|
873
|
+
logger: 'fatal',
|
|
874
|
+
metadata,
|
|
875
|
+
});
|
|
876
|
+
|
|
877
|
+
// Initialize session health manager for relay subscription management
|
|
878
|
+
this.sessionHealth = new SessionHealthManager(this.client);
|
|
879
|
+
|
|
880
|
+
logger.info('SignClient initialized with session health manager');
|
|
881
|
+
return this.client;
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
/**
|
|
885
|
+
* Get the current client instance.
|
|
886
|
+
* @throws Error if not initialized
|
|
887
|
+
*/
|
|
888
|
+
<span class="fstat-no" title="function not covered" > getClient(): SignClient {</span>
|
|
889
|
+
<span class="cstat-no" title="statement not covered" > if (!this.client) {</span>
|
|
890
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('WalletConnect client not initialized');</span>
|
|
891
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
892
|
+
<span class="cstat-no" title="statement not covered" > return this.client;</span>
|
|
893
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
894
|
+
|
|
895
|
+
/**
|
|
896
|
+
* Check if client is initialized.
|
|
897
|
+
*/
|
|
898
|
+
isInitialized(): boolean {
|
|
899
|
+
return !!this.client;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
/**
|
|
903
|
+
* Restore client from stored projectId.
|
|
904
|
+
* Used for session restoration on page reload.
|
|
905
|
+
*
|
|
906
|
+
* @param metadata - App metadata
|
|
907
|
+
* @returns Client if restoration succeeded, undefined otherwise
|
|
908
|
+
*/
|
|
909
|
+
async restoreClient(metadata: WCAppMetadata): Promise<SignClient | undefined> {
|
|
910
|
+
const storedProjectId = this.getStoredProjectId();
|
|
911
|
+
if (!storedProjectId) {
|
|
912
|
+
logger.debug('No stored projectId, skipping client restoration');
|
|
913
|
+
return undefined;
|
|
914
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > }</span>
|
|
915
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
916
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
917
|
+
<span class="cstat-no" title="statement not covered" > return await this.initialize(storedProjectId, metadata);</span>
|
|
918
|
+
<span class="cstat-no" title="statement not covered" > } catch (error) {</span>
|
|
919
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Failed to restore client', {</span>
|
|
920
|
+
<span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error.message : String(error),</span>
|
|
921
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
922
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
923
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/**
|
|
927
|
+
* Get all active sessions from the client.
|
|
928
|
+
*/
|
|
929
|
+
<span class="fstat-no" title="function not covered" > getActiveSessions(): any[] {</span>
|
|
930
|
+
<span class="cstat-no" title="statement not covered" > if (!this.client) {</span>
|
|
931
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
932
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
933
|
+
<span class="cstat-no" title="statement not covered" > return this.client.session.getAll();</span>
|
|
934
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
935
|
+
|
|
936
|
+
/**
|
|
937
|
+
* Get a specific session by topic.
|
|
938
|
+
* @param topic
|
|
939
|
+
*/
|
|
940
|
+
getSession(topic: string): any | undefined {
|
|
941
|
+
if (!this.client) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
942
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
943
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
944
|
+
try {
|
|
945
|
+
return this.client.session.get(topic);
|
|
946
|
+
} catch {
|
|
947
|
+
return undefined;
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
/**
|
|
952
|
+
* Create and return a modal for QR code display.
|
|
953
|
+
* @param projectId
|
|
954
|
+
* @param chains
|
|
955
|
+
*/
|
|
956
|
+
createModal(projectId: string, chains: string[]): WalletConnectModal {
|
|
957
|
+
this.modal = new WalletConnectModal({
|
|
958
|
+
projectId,
|
|
959
|
+
chains,
|
|
960
|
+
});
|
|
961
|
+
return this.modal;
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
/**
|
|
965
|
+
* Close the modal if open.
|
|
966
|
+
*/
|
|
967
|
+
closeModal(): void {
|
|
968
|
+
if (this.modal) {
|
|
969
|
+
this.modal.closeModal();
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
/**
|
|
974
|
+
* Connect to wallet and get session.
|
|
975
|
+
*
|
|
976
|
+
* @param optionalNamespaces - Namespace configuration
|
|
977
|
+
* @param sessionProperties - Optional session properties (e.g., preferredNetwork)
|
|
978
|
+
* @returns URI and approval promise
|
|
979
|
+
*/
|
|
980
|
+
async connect(
|
|
981
|
+
optionalNamespaces: Record<string, any>,
|
|
982
|
+
sessionProperties?: Record<string, string>,
|
|
983
|
+
): Promise<{
|
|
984
|
+
uri?: string;
|
|
985
|
+
approval: () => Promise<any>;
|
|
986
|
+
}> {
|
|
987
|
+
if (!this.client) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
988
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Client not initialized');</span>
|
|
989
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
990
|
+
|
|
991
|
+
const connectParams: any = { optionalNamespaces };
|
|
992
|
+
|
|
993
|
+
// Add session properties if provided
|
|
994
|
+
// This allows passing metadata like preferredNetwork to the wallet
|
|
995
|
+
if (sessionProperties) {
|
|
996
|
+
connectParams.sessionProperties = sessionProperties;
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
logger.debug('Connecting with params', {
|
|
1000
|
+
namespaces: Object.keys(optionalNamespaces),
|
|
1001
|
+
hasSessionProperties: !!sessionProperties,
|
|
1002
|
+
});
|
|
1003
|
+
|
|
1004
|
+
return this.client.connect(connectParams);
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
/**
|
|
1008
|
+
* Disconnect a session.
|
|
1009
|
+
* @param topic
|
|
1010
|
+
* @param reason
|
|
1011
|
+
* @param reason.code
|
|
1012
|
+
* @param reason.message
|
|
1013
|
+
*/
|
|
1014
|
+
async disconnect(topic: string, reason?: { code: number; message: string }): Promise<void> {
|
|
1015
|
+
if (!this.client) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1016
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1017
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1018
|
+
await this.client.disconnect({
|
|
1019
|
+
topic,
|
|
1020
|
+
reason: <span class="branch-0 cbranch-no" title="branch not covered" >reason || { code: 6000, message: 'User disconnected' },</span>
|
|
1021
|
+
});
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
/**
|
|
1025
|
+
* Register event listener on the client.
|
|
1026
|
+
* @param event
|
|
1027
|
+
* @param handler
|
|
1028
|
+
*/
|
|
1029
|
+
on(event: string, handler: (event: any) => void): void {
|
|
1030
|
+
if (!this.client) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1031
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1032
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1033
|
+
(this.client as any).on(event, handler);
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
/**
|
|
1037
|
+
* Send a request to a session.
|
|
1038
|
+
*
|
|
1039
|
+
* Features:
|
|
1040
|
+
* - Automatically ensures session health by pinging before the request
|
|
1041
|
+
* - Runs keep-alive pings during long-running requests (e.g., transaction approval)
|
|
1042
|
+
* - Prevents stale relay subscription issues that cause empty error objects
|
|
1043
|
+
*
|
|
1044
|
+
* @param params - Request parameters including topic, chainId, and request data
|
|
1045
|
+
* @param params.expiry - Optional expiry time in seconds (default: 300)
|
|
1046
|
+
* @param params.topic
|
|
1047
|
+
* @param params.chainId
|
|
1048
|
+
* @param params.request
|
|
1049
|
+
* @param params.request.method
|
|
1050
|
+
* @param params.request.params
|
|
1051
|
+
* @returns Promise resolving to the request result
|
|
1052
|
+
*/
|
|
1053
|
+
<span class="fstat-no" title="function not covered" > async request<T = unknown>(params: {</span>
|
|
1054
|
+
<span class="cstat-no" title="statement not covered" > topic: string;</span>
|
|
1055
|
+
<span class="cstat-no" title="statement not covered" > chainId: string;</span>
|
|
1056
|
+
<span class="cstat-no" title="statement not covered" > request: { method: string; params: unknown };</span>
|
|
1057
|
+
<span class="cstat-no" title="statement not covered" > expiry?: number;</span>
|
|
1058
|
+
<span class="cstat-no" title="statement not covered" > }): Promise<T> {</span>
|
|
1059
|
+
<span class="cstat-no" title="statement not covered" > if (!this.client) {</span>
|
|
1060
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Client not initialized');</span>
|
|
1061
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1062
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1063
|
+
<span class="cstat-no" title="statement not covered" > // Ensure session health before request (transparent to caller)</span>
|
|
1064
|
+
<span class="cstat-no" title="statement not covered" > // This pings the session if needed to refresh relay subscription</span>
|
|
1065
|
+
<span class="cstat-no" title="statement not covered" > if (this.sessionHealth) {</span>
|
|
1066
|
+
<span class="cstat-no" title="statement not covered" > await this.sessionHealth.ensureSessionHealth(params.topic);</span>
|
|
1067
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1068
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1069
|
+
<span class="cstat-no" title="statement not covered" > // Keep-alive pings during long-running requests (e.g., transaction approval)</span>
|
|
1070
|
+
<span class="cstat-no" title="statement not covered" > // WC relay has ~30s subscription timeout, so we ping every 20s to keep it alive</span>
|
|
1071
|
+
<span class="cstat-no" title="statement not covered" > const KEEP_ALIVE_INTERVAL_MS = 20000;</span>
|
|
1072
|
+
<span class="cstat-no" title="statement not covered" > let keepAliveInterval: ReturnType<typeof setInterval> | undefined;</span>
|
|
1073
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1074
|
+
<span class="cstat-no" title="statement not covered" > const startKeepAlive = () => {</span>
|
|
1075
|
+
<span class="cstat-no" title="statement not covered" > keepAliveInterval = setInterval(async () => {</span>
|
|
1076
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1077
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Keep-alive ping during request', {</span>
|
|
1078
|
+
<span class="cstat-no" title="statement not covered" > topic: params.topic?.substring(0, 16) + '...',</span>
|
|
1079
|
+
<span class="cstat-no" title="statement not covered" > method: params.request.method,</span>
|
|
1080
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1081
|
+
<span class="cstat-no" title="statement not covered" > if (this.client) {</span>
|
|
1082
|
+
<span class="cstat-no" title="statement not covered" > await Promise.race([</span>
|
|
1083
|
+
<span class="cstat-no" title="statement not covered" > this.client.ping({ topic: params.topic }),</span>
|
|
1084
|
+
<span class="cstat-no" title="statement not covered" > new Promise((_, reject) => setTimeout(() => reject(new Error('Ping timeout')), 5000)),</span>
|
|
1085
|
+
<span class="cstat-no" title="statement not covered" > ]);</span>
|
|
1086
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1087
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
1088
|
+
<span class="cstat-no" title="statement not covered" > // Log but don't throw - ping failure during wait is not critical</span>
|
|
1089
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Keep-alive ping failed (non-critical)', {</span>
|
|
1090
|
+
<span class="cstat-no" title="statement not covered" > error: err instanceof Error ? err.message : String(err),</span>
|
|
1091
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1092
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1093
|
+
<span class="cstat-no" title="statement not covered" > }, KEEP_ALIVE_INTERVAL_MS);</span>
|
|
1094
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1095
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1096
|
+
<span class="cstat-no" title="statement not covered" > const stopKeepAlive = () => {</span>
|
|
1097
|
+
<span class="cstat-no" title="statement not covered" > if (keepAliveInterval) {</span>
|
|
1098
|
+
<span class="cstat-no" title="statement not covered" > clearInterval(keepAliveInterval);</span>
|
|
1099
|
+
<span class="cstat-no" title="statement not covered" > keepAliveInterval = undefined;</span>
|
|
1100
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1101
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1102
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1103
|
+
<span class="cstat-no" title="statement not covered" > // Start keep-alive pings</span>
|
|
1104
|
+
<span class="cstat-no" title="statement not covered" > startKeepAlive();</span>
|
|
1105
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1106
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1107
|
+
<span class="cstat-no" title="statement not covered" > const result = await this.client.request<T>(params);</span>
|
|
1108
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
1109
|
+
<span class="cstat-no" title="statement not covered" > } finally {</span>
|
|
1110
|
+
<span class="cstat-no" title="statement not covered" > // Always stop keep-alive, whether success or error</span>
|
|
1111
|
+
<span class="cstat-no" title="statement not covered" > stopKeepAlive();</span>
|
|
1112
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1113
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1114
|
+
|
|
1115
|
+
/**
|
|
1116
|
+
* Get the session health manager for advanced operations.
|
|
1117
|
+
*
|
|
1118
|
+
* Use this if you need to:
|
|
1119
|
+
* - Force refresh a subscription
|
|
1120
|
+
* - Clear ping cache
|
|
1121
|
+
* - Access health manager directly
|
|
1122
|
+
*
|
|
1123
|
+
* @returns SessionHealthManager instance or undefined if not initialized
|
|
1124
|
+
*/
|
|
1125
|
+
<span class="fstat-no" title="function not covered" > getSessionHealthManager(): SessionHealthManager | undefined {</span>
|
|
1126
|
+
<span class="cstat-no" title="statement not covered" > return this.sessionHealth;</span>
|
|
1127
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1128
|
+
|
|
1129
|
+
// ========== STORAGE ==========
|
|
1130
|
+
|
|
1131
|
+
private persistProjectId(projectId: string): void {
|
|
1132
|
+
try {
|
|
1133
|
+
window.localStorage?.setItem(STORAGE_KEY_PROJECT_ID, projectId);
|
|
1134
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch {</span>
|
|
1135
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('Failed to persist projectId');</span>
|
|
1136
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
private getStoredProjectId(): string | null {
|
|
1140
|
+
try {
|
|
1141
|
+
return window.localStorage?.getItem(STORAGE_KEY_PROJECT_ID) ?? null;
|
|
1142
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch {</span>
|
|
1143
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1144
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
/**
|
|
1148
|
+
* Clear stored projectId.
|
|
1149
|
+
*/
|
|
1150
|
+
<span class="fstat-no" title="function not covered" > clearStoredProjectId(): void {</span>
|
|
1151
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1152
|
+
<span class="cstat-no" title="statement not covered" > window.localStorage?.removeItem(STORAGE_KEY_PROJECT_ID);</span>
|
|
1153
|
+
<span class="cstat-no" title="statement not covered" > } catch {</span>
|
|
1154
|
+
<span class="cstat-no" title="statement not covered" > // Ignore</span>
|
|
1155
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1156
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1157
|
+
}
|
|
1158
|
+
</pre></td></tr></table></pre>
|
|
1159
|
+
|
|
1160
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1161
|
+
</div><!-- /wrapper -->
|
|
1162
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1163
|
+
Code coverage generated by
|
|
1164
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1165
|
+
at 2026-06-02T14:30:38.372Z
|
|
1166
|
+
</div>
|
|
1167
|
+
<script src="../../../../prettify.js"></script>
|
|
1168
|
+
<script>
|
|
1169
|
+
window.onload = function () {
|
|
1170
|
+
prettyPrint();
|
|
1171
|
+
};
|
|
1172
|
+
</script>
|
|
1173
|
+
<script src="../../../../sorter.js"></script>
|
|
1174
|
+
<script src="../../../../block-navigation.js"></script>
|
|
1175
|
+
</body>
|
|
1176
|
+
</html>
|
|
1177
|
+
|