Repository navigation
Commit e4d54cd
committed
Merge bitcoin#26177: refactor / kernel: Move non-gArgs chainparams functionality to kernel
b3e78dc refactor: Don't use global chainparams in chainstatemanager method (TheCharlatan)
382b692 Split non/kernel chainparams (Carl Dong)
edabbc7 Add factory functions for Main/Test/Sig/Reg chainparams (Carl Dong)
d938098 Remove UpdateVersionBitsParameters (Carl Dong)
84b8578 Decouple RegTestChainParams from ArgsManager (Carl Dong)
76cd4e7 Decouple SigNetChainParams from ArgsManager (Carl Dong)
Pull request description:
This pull request is part of the `libbitcoinkernel` project bitcoin#24303 https://github.com/bitcoin/bitcoin/projects/18 and more specifically its "Step 2: Decouple most non-consensus code from libbitcoinkernel". dongcarl is the original author of this patchset, these commits were taken from https://github.com/dongcarl/bitcoin/tree/2022-03-libbitcoinkernel-chainparams-args-only.
#### Context
The bitcoin kernel library currently relies on code containing user configurations through the `ArgsManager`. This is not optimal, since as a stand-alone library it should not rely on bitcoind's argument parsing logic. Instead, its interfaces should accept control and options structs that control the kernel library's desired configuration.
Similar work towards decoupling the `ArgsManager` from the kernel has been done in
bitcoin#25290, bitcoin#25487, bitcoin#25527 and bitcoin#25862.
#### Changes
By moving the `CChainParams` class definition into the kernel and giving it new factory functions `CChainParams::{RegTest,SigNet,Main,TestNet}`it can be constructed without an `ArgsManager` reference, unlike the current factory function `CreateChainParams`.
The first few commits remove uses of `ArgsManager` within `CChainParams`. Then the `CChainParams` definition is moved to a new file in the `kernel/` subdirectory.
ACKs for top commit:
MarcoFalke:
re-ACK b3e78dc 🛁
ryanofsky:
Code review ACK b3e78dc. Only changes since last review were recent review suggestions.
ajtowns:
ACK b3e78dc
Tree-SHA512: 3835aca1d3e3c75cc3303dd584bab3a77e58f6c678724a5e359fe4b0e17e0763a00931ee6191f516b9fde50496f59cc691f0709c0254206db3863bbf7ab2cacd
Dash adaptations:
- src/kernel/chainparams.{h,cpp}: the moved CChainParams is Dash's, not Bitcoin's (the cherry-pick had created verbatim upstream files; both were rewritten). All Dash accessors and fields are kept: DevNetGenesisBlock, GetDefaultPlatformP2PPort/HTTPPort, RequireRoutableExternalIP, AllowMultipleAddressesFromGroup, LLMQConnectionRetryTimeout, Bech32PlatformHRP, ExtCoinType, IsValidMNActivation, PoolMin/MaxParticipants, FulfilledRequestExpireTime, SporkAddress, CreditPoolPeriodBlocks, GetLLMQ/AddLLMQ, UpdateDIP3/DIP8/Budget/LLMQInstantSend declarations.
- src/kernel/chainparams.{h,cpp}: Dash has a fourth network, so a fourth factory CChainParams::DevNet(const DevNetOptions&) was added alongside Main()/TestNet()/RegTest(opts), mirroring upstream's pattern.
- src/kernel/chainparams.h: CChainParams::VersionBitsParameters carries Dash's extra -vbparams fields (window_size, threshold_start, threshold_min, falloff_coeff, use_ehf) with the existing -1 "leave unchanged" sentinel, so -vbparams semantics are unchanged.
- src/kernel/chainparams.h: RegTestOptions is extended with Dash-only entries (dip3_parameters, budget_parameters, llmq_test_parameters, llmq_dip0024_instantsend) and DevNetOptions carries name, minimum_difficulty_blocks, high_subsidy_blocks, high_subsidy_factor, pow_target_spacing, llmq_chainlocks, llmq_dip0024_instantsend, llmq_platform, llmq_mnhf, llmq_devnet_parameters, plus helper structs LLMQParameters/DIP3Parameters/BudgetParameters.
- LLMQ overrides travel as quorum *names* (strings) in the options structs: resolving a name to a Consensus::LLMQType needs the per-chain consensus.llmqs list, which only exists inside the kernel constructors. The lookup loops, the rotation checks and the exact error strings/LogPrintf messages of the old Update*FromArgs functions are preserved, just moved into the kernel side.
- src/kernel/chainparams.cpp: FindDevNetGenesisBlock()/CDevNetParams no longer call gArgs.GetDevNetName(); the devnet name arrives via DevNetOptions::name (filled by ReadDevNetArgs from args.GetDevNetName()), which is what keeps the kernel gArgs-free.
- src/kernel/chainparams.cpp: CRegTestParams::UpdateActivationParameters switches exhaustively over Dash's 15 Consensus::BuriedDeployment values (no -Wswitch warning); DEPLOYMENT_DIP0024 sets both DIP0024Height and DIP0024QuorumsHeight, exactly as the old name-based if/else did. DEPLOYMENT_DIP0003/DIP0020/WITHDRAWALS are unreachable because GetBuriedDeployment does not map any -testactivationheight name to them, matching current behaviour.
- src/deploymentinfo.cpp: GetBuriedDeployment() was auto-applied with Bitcoin's names and returned DEPLOYMENT_SEGWIT, which does not exist in Dash. Rewritten to the exact set of names -testactivationheight accepted before (bip147, bip34, dersig, cltv, csv, brr, dip0001, dip0008, dip0024, v19, v20, mn_rr); no name was added or removed.
- src/chainparams.cpp: Dash's arg readers keep their existing decomposition as file-static helpers (ReadRegTestActivationArgs/DIP3/Budget/LLMQTest/LLMQInstantSendDIP0024, ReadDevNetSubsidyAndDiffArgs/PowTargetSpacing/LLMQDevnetParams) called from ReadRegTestArgs()/ReadDevNetArgs(). Merging them into one function was not possible verbatim because each body ends with an early `if (!args.IsArgSet(...)) return;`.
- src/chainparams.cpp: ReadDevNetSubsidyAndDiffArgs applies -minimumdifficultyblocks/-highsubsidyblocks/-highsubsidyfactor as independent optionals and therefore logs three separate lines instead of the single combined LogPrintf; net effect on consensus is identical (unset values keep the chain defaults, which are no longer visible from the arg reader).
- src/chainparams.cpp: CreateChainParams dispatches MAIN/TESTNET/DEVNET/REGTEST; the DEVNET branch uses the new ReadDevNetArgs + CChainParams::DevNet(opts). Include list and SetupChainParamsOptions() are untouched, as upstream left them untouched.
- src/validation.h: added <deploymentstatus.h>, <kernel/chainparams.h>, <kernel/chainstatemanager_opts.h>, <node/blockstorage.h>. Upstream's <fs.h> and <kernel/cs_main.h> were not added: Dash uses util/fs.h and does not have that include in this block.
Not applicable to Dash (intentionally omitted):
- src/kernel/chainparams.cpp: Upstream's SigNetParams class body, CChainParams::SigNet() factory and the signet challenge/seed handling moved into the kernel file; Dash has no signet chain, so there is no counterpart to move. Dash's own CMainParams/CTestNetParams/CDevNetParams/CRegTestParams (with all DIP/LLMQ/masternode/governance/spork parameters) were moved instead. (reviewer: not for Dash)
- src/kernel/chainparams.h: Upstream's SigNetOptions struct (challenge/seeds) and the static SigNet() declaration; no signet in Dash. Dash instead declares VersionBitsParameters (extended with window/threshold/falloff/useEHF), LLMQParameters, DIP3Parameters, BudgetParameters, DevNetOptions and RegTestOptions. (reviewer: not for Dash)
- src/chainparams.cpp: ReadSigNetArgs() and the CBaseChainParams::SIGNET branch of CreateChainParams(); Dash has no signet. Dash adds ReadDevNetArgs()/the DEVNET branch in the same shape. (reviewer: not for Dash)
- src/deploymentinfo.cpp: GetBuriedDeployment() returning Consensus::DEPLOYMENT_SEGWIT for name "segwit"; Dash has no segwit buried deployment. The Dash function covers exactly the 12 names the previous MaybeUpdateHeights() accepted (bip147, bip34, dersig, cltv, csv, brr, dip0001, dip0008, dip0024, v19, v20, mn_rr). (reviewer: not for Dash)
- src/kernel/chainparams.cpp: Upstream's segwit/taproot consensus fields, script_flag_exceptions maps and bech32_hrp carried in the moved Bitcoin chain classes; Dash's classes have no such fields (Dash keeps bech32_platform_hrp, nExtCoinType, EvoSnapshotHash etc., all of which were moved). (reviewer: not for Dash)
Replayed onto a newer base.
Dash adaptations:
- src/kernel/chainparams.h: EvoSnapshotHash struct and AssumeutxoData::evo_hash (added to src/chainparams.h on the new develop base) travel with the class into the kernel header, so develop's Dash evo-snapshot field is preserved.
- src/kernel/chainparams.cpp: FindDevNetGenesisBlock() and CChainParams::AddLLMQ() use develop's LogError("...\n", ...) instead of the base's error(...) — the new base replaced error() in these two Dash-only helpers before they were moved.
- src/kernel/chainparams.cpp: the two CRegTestParams m_assumeutxo_data entries carry develop's third aggregate member, EvoSnapshotHash{uint256{}}, between AssumeutxoHash and nChainTx.
- src/chainparams.cpp: develop's '2009-2022 The Bitcoin Core developers' copyright line kept rather than the pre-rebase 2009-2021.
- src/validation.h: upstream's kernel/chainparams.h + kernel/chainstatemanager_opts.h are inserted in sorted position alongside develop's new <kernel/cs_main.h> // IWYU pragma: export, which did not exist at the prior base. Upstream's <fs.h> is still not added: Dash uses util/fs.h.
- src/wallet/test/wallet_tests.cpp: the prior backport added #include <chainparams.h> to wallet/test/availablecoins_tests.cpp (needed because validation.h no longer re-exports Params()); the new base deleted that file and moved the Dash-only UTXO tests into wallet_tests.cpp, so the include was applied there instead — that file calls Params().GetConsensus().DIP0003Height.
- src/wallet/test/availablecoins_tests.cpp: deleted, following the new base (bitcoin#25789 + the Dash-only test move); the file's only backport hunk was the include described above.
- src/kernel/chainparams.{h,cpp} content (Dash CChainParams instead of Bitcoin's, fourth DevNet() factory, Dash-extended VersionBitsParameters/RegTestOptions/DevNetOptions, name-based LLMQ override resolution, gArgs-free devnet name via DevNetOptions::name, Dash-specific GetBuriedDeployment names) is unchanged from the reviewed prior backport; see the prior commit body for the full rationale.
Not applicable to Dash (intentionally omitted):
- src/kernel/chainparams.cpp: Upstream's CSigNetParams / SigNetOptions / CChainParams::SigNet() and the ReadSigNetArgs reader: Dash has no signet chain, so there is no counterpart to move.
- src/kernel/chainparams.h: Upstream's SigNetOptions struct and the signet challenge/seed members: no signet in Dash.
- src/kernel/chainparams.cpp: Upstream's segwit/taproot chain fields and script_flag_exceptions maps do not exist in Dash; Dash's own chain classes (including DIP/LLMQ/masternode/governance/spork parameters) were moved instead.
- src/deploymentinfo.cpp: Upstream's GetBuriedDeployment() returns Consensus::DEPLOYMENT_SEGWIT, which does not exist in Dash; the function was written over the exact set of names -testactivationheight already accepted (bip147, bip34, dersig, cltv, csv, brr, dip0001, dip0008, dip0024, v19, v20, mn_rr).
Replayed onto a newer base.
Dash adaptations:
- src/chainparams.cpp: conflict resolved to the prior reviewed backport's content (verified identical to merge stage :3); the Dash CreateGenesisBlock/CreateDevNetGenesisBlock/FindDevNetGenesisBlock helpers, IsValidMNActivation, AddLLMQ/GetLLMQ and the CMain/CTestNet/CDevNet/CRegTest classes move to src/kernel/chainparams.cpp, leaving only the gArgs-reading Read*Args helpers behind
- src/chainparams.h: conflict resolved to the prior reviewed backport's content; the Dash-extended CChainParams (platform ports, devnet genesis, LLMQ/spork/CoinJoin/credit-pool accessors, EvoSnapshotHash in AssumeutxoData) moves to src/kernel/chainparams.h, which this header now includes
- src/kernel/chainparams.h: dropped RequireStandard()/fRequireStandard from the moved class — the new base already removed them from CChainParams via bitcoin#28354 (default acceptnonstdtxn=0 on all chains), which was not yet in the prior backport's base
- src/kernel/chainparams.cpp: dropped the four fRequireStandard assignments (main/testnet/devnet/regtest) for the same reason
- upstream ReadSigNetArgs has no Dash counterpart (no signet); the prior backport instead routes Dash's devnet through ReadDevNetArgs()/CChainParams::DevNet(DevNetOptions) and keeps the Dash-only -dip3params/-budgetparams/-llmqtest*/-llmqdevnetparams/-powtargetspacing readers as RegTest/DevNet option readers
- upstream's flat ReadRegTestArgs is split into ReadRegTest{Activation,DIP3,Budget,LLMQTest,LLMQInstantSendDIP0024}Args because Dash's -vbparams accepts 3/4/6/9 fields (window, thresholdstart, thresholdmin, falloffcoeff, useehf) and regtest has several more Dash-only overrides
Replayed onto a newer base.
Dash adaptations:
- src/chainparams.cpp: took the upstream side of the conflict, which removes the network classes (now in kernel/chainparams.cpp) and keeps the gArgs readers (ReadRegTestArgs/ReadDevNetArgs, CreateChainParams, SelectParams, SetupChainParamsOptions); matches the upstream stage and the previously reviewed prior.diff
- src/kernel/chainparams.cpp: carried develop's CTestNetParams DEPLOYMENT_V24 nStartTime = 1790208000 (Thursday, September 24, 2026) into the moved testnet class; the old base had NEVER_ACTIVE, and this was the only change to src/chainparams.cpp between the old and new base
Replayed onto a newer base.
Dash adaptations:
- src/bitcoin-chainstate.cpp: the ChainstateManager::Options initializer has no `.datadir = gArgs.GetDataDirNet(),` line because the new develop base's kernel::ChainstateManagerOpts has no `datadir` member (the prior base had one). Upstream only uses that line as context, so the upstream change `.chainparams = chainparams` -> `.chainparams = *chainparams` is applied alone.
- All other staged files carry forward the published prior backport unchanged; their Dash adaptations (Makefile.am kernel/chainparams.cpp in libbitcoin_common and libdashkernel, added <chainparams.h> includes in Dash-only files such as active/dkgsession.cpp, chainlock/signing.cpp, instantsend/net_instantsend.cpp, qt/test/providertransactiontests.cpp and Dash tests, and the Dash CChainParams move into kernel/chainparams.cpp) are the same as in prior.diff
Replayed onto a newer base.
Dash adaptations:
- src/chainparams.cpp: restored exactly the published resolution from prior.diff (checked by comparing its +/- lines with prior.diff: identical). Only the class bodies differ on the new base, and they move to kernel, so no line here changed.
- src/kernel/chainparams.cpp: DEPLOYMENT_V24 .bit changed from 12 to 13 in CMainParams, CTestNetParams, CDevNetParams and CRegTestParams, carrying develop commit 1be3ac2 over to the moved classes. Without this the move would quietly undo the bit change.
- All other staged files (Makefile.am, chainparams.h, deploymentinfo.{h,cpp}, validation.{h,cpp}, versionbits.h, node/blockstorage.cpp, node/mempool_args.cpp, bitcoin-chainstate.cpp, kernel/chainparams.h, and the Dash-only call sites active/dkgsession.cpp, chainlock/signing.cpp, instantsend/net_instantsend.cpp, qt/test/*, test/bls_tests.cpp, test/evo_islock_tests.cpp, test/llmq_chainlock_tests.cpp, test/validation_tests.cpp, wallet/test/wallet_tests.cpp) are unchanged from the published prior.diff, including its Dash adaptations: DevNetOptions/RegTestOptions for the LLMQ, DIP3, budget and devnet overrides, GetBuriedDeployment covering Dash's buried deployments, and the <chainparams.h> include fixes at call sites.
Replayed onto a newer base.
Dash adaptations:
- src/validation.cpp: include conflict with the new base, which added #include <kernel/disconnected_transactions.h> where this backport adds #include <kernel/chainparams.h>; kept both, sorted alphabetically
- src/active/dkgsession.cpp, src/chainlock/signing.cpp, src/instantsend/net_instantsend.cpp, src/qt/test/providertransactiontests.cpp, src/qt/test/wallettests.cpp, src/test/bls_tests.cpp, src/test/evo_islock_tests.cpp, src/test/llmq_chainlock_tests.cpp, src/test/validation_tests.cpp: (kept from the published backport) these Dash files now include <chainparams.h> directly, because validation.h includes <kernel/chainparams.h> instead of <chainparams.h> and so no longer pulls in Params()
- src/chainparams.cpp, src/chainparams.h, src/kernel/chainparams.cpp, src/kernel/chainparams.h, src/deploymentinfo.*, src/versionbits.h, src/bitcoin-chainstate.cpp, src/node/*, src/validation.h, src/Makefile.am, src/wallet/test/wallet_tests.cpp: (kept from the published backport) carried over unchanged, including the Dash chain parameters, LLMQ and other Dash-specific fields moved into kernel/chainparams, and all earlier review fixes
Replayed onto a newer base.
Dash adaptations:
- src/chainparams.cpp: took the prior backport's version unchanged (it matches blob 8d5a119, the prior post-image). On the HEAD side, the only change since the prior base (15db478) was #7807's DEPLOYMENT_EVO_SHARES blocks in the network classes, and this PR moves those classes out of the file
- src/kernel/chainparams.cpp: added #7807's DEPLOYMENT_EVO_SHARES settings (bit 14, start/timeout, window, thresholds, falloff, useEHF) right after the DEPLOYMENT_V24 block in CMainParams, CTestNetParams, CDevNetParams and CRegTestParams, word for word, including mainnet's NEVER_ACTIVE/TODO start time. This keeps #7807's settings now that the class definitions live in kernel/chainparams.cpp
- Carried over from the prior reviewed backport unchanged: Dash-only call sites (src/active/dkgsession.cpp, src/chainlock/signing.cpp, src/instantsend/net_instantsend.cpp, src/qt/test/providertransactiontests.cpp, src/qt/test/wallettests.cpp, src/test/bls_tests.cpp, src/test/evo_islock_tests.cpp, src/test/llmq_chainlock_tests.cpp, src/test/validation_tests.cpp, src/wallet/test/wallet_tests.cpp, src/versionbits.h) and the Dash devnet/LLMQ/EHF parts of src/kernel/chainparams.{h,cpp} and src/chainparams.{h,cpp}1 parent f35a24c commit e4d54cd
23 files changed
Lines changed: 1631 additions & 1377 deletions
File tree
- src
- active
- chainlock
- instantsend
- kernel
- node
- qt/test
- test
- wallet/test
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
288 | 288 | | |
289 | 289 | | |
290 | 290 | | |
| 291 | + | |
291 | 292 | | |
292 | 293 | | |
293 | 294 | | |
| |||
994 | 995 | | |
995 | 996 | | |
996 | 997 | | |
| 998 | + | |
997 | 999 | | |
998 | 1000 | | |
999 | 1001 | | |
| |||
1317 | 1319 | | |
1318 | 1320 | | |
1319 | 1321 | | |
| 1322 | + | |
1320 | 1323 | | |
1321 | 1324 | | |
1322 | 1325 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| 14 | + | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| |||
62 | 63 | | |
63 | 64 | | |
64 | 65 | | |
65 | | - | |
| 66 | + | |
66 | 67 | | |
67 | 68 | | |
68 | 69 | | |
| |||
91 | 92 | | |
92 | 93 | | |
93 | 94 | | |
94 | | - | |
| 95 | + | |
95 | 96 | | |
96 | 97 | | |
97 | 98 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
| |||
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
| 10 | + | |
9 | 11 | | |
10 | 12 | | |
11 | 13 | | |
| |||
14 | 16 | | |
15 | 17 | | |
16 | 18 | | |
| 19 | + | |
17 | 20 | | |
18 | 21 | | |
19 | 22 | | |
| 23 | + | |
20 | 24 | | |
21 | 25 | | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
35 | | - | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
66 | | - | |
67 | | - | |
68 | | - | |
69 | | - | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
81 | | - | |
82 | | - | |
83 | | - | |
84 | | - | |
85 | | - | |
86 | | - | |
87 | | - | |
88 | | - | |
89 | | - | |
90 | | - | |
91 | | - | |
92 | | - | |
93 | | - | |
94 | | - | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | | - | |
103 | | - | |
104 | | - | |
105 | | - | |
106 | | - | |
107 | | - | |
108 | | - | |
109 | | - | |
110 | | - | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | | - | |
115 | | - | |
116 | | - | |
117 | | - | |
118 | | - | |
119 | | - | |
120 | | - | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
135 | | - | |
136 | | - | |
137 | | - | |
138 | | - | |
139 | | - | |
140 | | - | |
141 | | - | |
142 | | - | |
143 | | - | |
144 | | - | |
145 | | - | |
146 | | - | |
147 | | - | |
148 | | - | |
149 | | - | |
150 | | - | |
151 | | - | |
152 | | - | |
153 | | - | |
154 | | - | |
155 | | - | |
156 | | - | |
157 | | - | |
158 | | - | |
159 | | - | |
160 | | - | |
161 | | - | |
162 | | - | |
163 | | - | |
164 | | - | |
165 | | - | |
166 | | - | |
167 | | - | |
168 | | - | |
169 | | - | |
170 | | - | |
171 | | - | |
172 | | - | |
173 | | - | |
174 | | - | |
175 | | - | |
176 | | - | |
177 | | - | |
178 | | - | |
179 | | - | |
180 | | - | |
181 | | - | |
182 | | - | |
183 | | - | |
184 | | - | |
185 | | - | |
186 | | - | |
187 | | - | |
188 | | - | |
189 | | - | |
190 | | - | |
191 | | - | |
192 | | - | |
193 | | - | |
194 | | - | |
195 | | - | |
196 | | - | |
197 | | - | |
198 | | - | |
199 | | - | |
200 | 26 | | |
201 | 27 | | |
202 | 28 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
| 10 | + | |
9 | 11 | | |
10 | 12 | | |
11 | 13 | | |
| |||
58 | 60 | | |
59 | 61 | | |
60 | 62 | | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
10 | 11 | | |
11 | 12 | | |
12 | 13 | | |
| |||
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
| 30 | + | |
| 31 | + | |
29 | 32 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
| |||
0 commit comments