@featurevisor/core 2.26.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/coverage/clover.xml +4991 -3130
  3. package/coverage/coverage-final.json +63 -39
  4. package/coverage/lcov-report/block-navigation.js +1 -1
  5. package/coverage/lcov-report/index.html +248 -98
  6. package/coverage/lcov-report/sorter.js +21 -7
  7. package/coverage/lcov-report/src/assess-distribution/index.html +116 -0
  8. package/coverage/lcov-report/src/assess-distribution/index.ts.html +754 -0
  9. package/coverage/lcov-report/{list → src/benchmark}/index.html +30 -30
  10. package/coverage/lcov-report/src/benchmark/index.ts.html +793 -0
  11. package/coverage/lcov-report/{builder → src/builder}/allocator.ts.html +38 -38
  12. package/coverage/lcov-report/{builder/buildScopedConditions.ts.html → src/builder/applyContextToConditions.ts.html} +80 -65
  13. package/coverage/lcov-report/{builder/buildScopedDatafile.ts.html → src/builder/applyContextToDatafile.ts.html} +92 -92
  14. package/coverage/lcov-report/{builder/buildScopedSegments.ts.html → src/builder/applyContextToSegments.ts.html} +103 -67
  15. package/coverage/lcov-report/{builder → src/builder}/buildDatafile.ts.html +336 -306
  16. package/coverage/lcov-report/src/builder/buildProject.ts.html +1117 -0
  17. package/coverage/lcov-report/src/builder/buildRuntimeDatafiles.ts.html +256 -0
  18. package/coverage/lcov-report/{builder → src/builder}/getFeatureRanges.ts.html +22 -22
  19. package/coverage/lcov-report/{builder → src/builder}/hashes.ts.html +50 -50
  20. package/coverage/lcov-report/{builder → src/builder}/index.html +114 -84
  21. package/coverage/lcov-report/{tester/cliFormat.ts.html → src/builder/index.ts.html} +17 -29
  22. package/coverage/lcov-report/{builder → src/builder}/mutateVariables.ts.html +55 -55
  23. package/coverage/lcov-report/{builder → src/builder}/mutator.ts.html +118 -118
  24. package/coverage/lcov-report/{builder → src/builder}/revision.ts.html +15 -15
  25. package/coverage/lcov-report/{builder → src/builder}/traffic.ts.html +86 -86
  26. package/coverage/lcov-report/src/cli/cli.ts.html +400 -0
  27. package/coverage/lcov-report/{tester → src/cli}/index.html +41 -41
  28. package/coverage/lcov-report/src/cli/plugins.ts.html +214 -0
  29. package/coverage/lcov-report/{config → src/config}/index.html +31 -31
  30. package/coverage/lcov-report/{config → src/config}/index.ts.html +12 -12
  31. package/coverage/lcov-report/{config → src/config}/projectConfig.ts.html +312 -96
  32. package/coverage/lcov-report/{datasource → src/datasource}/adapter.ts.html +28 -73
  33. package/coverage/lcov-report/{datasource → src/datasource}/datasource.ts.html +191 -104
  34. package/coverage/lcov-report/{datasource → src/datasource}/filesystemAdapter.ts.html +233 -635
  35. package/coverage/lcov-report/{datasource → src/datasource}/index.html +48 -48
  36. package/coverage/lcov-report/{datasource → src/datasource}/index.ts.html +14 -14
  37. package/coverage/lcov-report/src/evaluate/index.html +116 -0
  38. package/coverage/lcov-report/src/evaluate/index.ts.html +814 -0
  39. package/coverage/lcov-report/src/find-duplicate-segments/findDuplicateSegments.ts.html +313 -0
  40. package/coverage/lcov-report/src/find-duplicate-segments/index.html +131 -0
  41. package/coverage/lcov-report/src/find-duplicate-segments/index.ts.html +307 -0
  42. package/coverage/lcov-report/src/find-usage/index.html +116 -0
  43. package/coverage/lcov-report/src/find-usage/index.ts.html +1780 -0
  44. package/coverage/lcov-report/src/generate-code/index.html +131 -0
  45. package/coverage/lcov-report/src/generate-code/index.ts.html +403 -0
  46. package/coverage/lcov-report/{generate-code → src/generate-code}/typescript.ts.html +266 -1361
  47. package/coverage/lcov-report/{generate-code → src}/index.html +38 -23
  48. package/coverage/lcov-report/src/info/index.html +116 -0
  49. package/coverage/lcov-report/src/info/index.ts.html +472 -0
  50. package/coverage/lcov-report/src/init/index.html +116 -0
  51. package/coverage/lcov-report/src/init/index.ts.html +280 -0
  52. package/coverage/lcov-report/{linter → src/linter}/attributeSchema.ts.html +160 -157
  53. package/coverage/lcov-report/{linter → src/linter}/checkCircularDependency.ts.html +25 -25
  54. package/coverage/lcov-report/{linter → src/linter}/checkPercentageExceedingSlot.ts.html +42 -42
  55. package/coverage/lcov-report/{linter → src/linter}/conditionSchema.ts.html +207 -207
  56. package/coverage/lcov-report/{linter → src/linter}/featureSchema.ts.html +462 -471
  57. package/coverage/lcov-report/{linter → src/linter}/groupSchema.ts.html +25 -22
  58. package/coverage/lcov-report/{linter → src/linter}/index.html +129 -99
  59. package/coverage/lcov-report/src/linter/index.ts.html +88 -0
  60. package/coverage/lcov-report/{linter → src/linter}/lintProject.ts.html +740 -332
  61. package/coverage/lcov-report/{linter → src/linter}/mutationNotation.ts.html +130 -130
  62. package/coverage/lcov-report/{linter → src/linter}/printError.ts.html +27 -27
  63. package/coverage/lcov-report/{linter → src/linter}/schema.ts.html +153 -150
  64. package/coverage/lcov-report/{linter → src/linter}/segmentSchema.ts.html +18 -15
  65. package/coverage/lcov-report/src/linter/targetSchema.ts.html +223 -0
  66. package/coverage/lcov-report/{linter → src/linter}/testSchema.ts.html +54 -48
  67. package/coverage/lcov-report/{linter → src/linter}/zodHelpers.ts.html +17 -17
  68. package/coverage/lcov-report/src/list/index.html +131 -0
  69. package/coverage/lcov-report/src/list/index.ts.html +2065 -0
  70. package/coverage/lcov-report/{list → src/list}/matrix.ts.html +43 -58
  71. package/coverage/lcov-report/src/promoter/index.html +116 -0
  72. package/coverage/lcov-report/src/promoter/index.ts.html +3883 -0
  73. package/coverage/lcov-report/src/sets.ts.html +313 -0
  74. package/coverage/lcov-report/src/targeting.ts.html +403 -0
  75. package/coverage/lcov-report/src/tester/cliFormat.ts.html +133 -0
  76. package/coverage/lcov-report/{tester → src/tester}/helpers.ts.html +15 -15
  77. package/coverage/lcov-report/src/tester/index.html +206 -0
  78. package/coverage/lcov-report/src/tester/prettyDuration.ts.html +187 -0
  79. package/coverage/lcov-report/src/tester/printTestResult.ts.html +337 -0
  80. package/coverage/lcov-report/src/tester/testFeature.ts.html +1186 -0
  81. package/coverage/lcov-report/src/tester/testProject.ts.html +1018 -0
  82. package/coverage/lcov-report/src/tester/testSegment.ts.html +316 -0
  83. package/coverage/lcov-report/{utils → src/utils}/extractKeys.ts.html +68 -68
  84. package/coverage/lcov-report/{utils → src/utils}/git.ts.html +44 -68
  85. package/coverage/lcov-report/{utils → src/utils}/index.html +44 -44
  86. package/coverage/lcov-report/{utils → src/utils}/index.ts.html +14 -14
  87. package/coverage/lcov-report/{utils → src/utils}/pretty.ts.html +20 -20
  88. package/coverage/lcov.info +10121 -5723
  89. package/jest.config.js +13 -4
  90. package/lib/assess-distribution/index.d.ts +1 -1
  91. package/lib/assess-distribution/index.js +59 -40
  92. package/lib/assess-distribution/index.js.map +1 -1
  93. package/lib/benchmark/index.d.ts +8 -5
  94. package/lib/benchmark/index.js +82 -65
  95. package/lib/benchmark/index.js.map +1 -1
  96. package/lib/builder/applyContextToConditions.d.ts +5 -0
  97. package/lib/builder/{buildScopedConditions.js → applyContextToConditions.js} +19 -14
  98. package/lib/builder/applyContextToConditions.js.map +1 -0
  99. package/lib/builder/applyContextToDatafile.d.ts +2 -0
  100. package/lib/builder/{buildScopedDatafile.js → applyContextToDatafile.js} +26 -26
  101. package/lib/builder/applyContextToDatafile.js.map +1 -0
  102. package/lib/builder/applyContextToSegments.d.ts +5 -0
  103. package/lib/builder/{buildScopedSegments.js → applyContextToSegments.js} +19 -14
  104. package/lib/builder/applyContextToSegments.js.map +1 -0
  105. package/lib/builder/buildDatafile.d.ts +9 -6
  106. package/lib/builder/buildDatafile.js +86 -51
  107. package/lib/builder/buildDatafile.js.map +1 -1
  108. package/lib/builder/buildProject.d.ts +17 -3
  109. package/lib/builder/buildProject.js +151 -59
  110. package/lib/builder/buildProject.js.map +1 -1
  111. package/lib/builder/buildRuntimeDatafiles.d.ts +12 -0
  112. package/lib/builder/buildRuntimeDatafiles.js +35 -0
  113. package/lib/builder/buildRuntimeDatafiles.js.map +1 -0
  114. package/lib/builder/getFeatureRanges.js +34 -1
  115. package/lib/builder/getFeatureRanges.js.map +1 -1
  116. package/lib/builder/hashes.js +34 -1
  117. package/lib/builder/hashes.js.map +1 -1
  118. package/lib/builder/index.d.ts +0 -1
  119. package/lib/builder/index.js +0 -1
  120. package/lib/builder/index.js.map +1 -1
  121. package/lib/cli/cli.js +0 -4
  122. package/lib/cli/cli.js.map +1 -1
  123. package/lib/cli/plugins.js +7 -2
  124. package/lib/cli/plugins.js.map +1 -1
  125. package/lib/config/projectConfig.d.ts +17 -17
  126. package/lib/config/projectConfig.js +101 -15
  127. package/lib/config/projectConfig.js.map +1 -1
  128. package/lib/datasource/adapter.d.ts +7 -9
  129. package/lib/datasource/adapter.js +0 -7
  130. package/lib/datasource/adapter.js.map +1 -1
  131. package/lib/datasource/datasource.d.ts +15 -5
  132. package/lib/datasource/datasource.js +37 -9
  133. package/lib/datasource/datasource.js.map +1 -1
  134. package/lib/datasource/filesystemAdapter.d.ts +4 -10
  135. package/lib/datasource/filesystemAdapter.js +111 -149
  136. package/lib/datasource/filesystemAdapter.js.map +1 -1
  137. package/lib/evaluate/index.d.ts +1 -7
  138. package/lib/evaluate/index.js +81 -67
  139. package/lib/evaluate/index.js.map +1 -1
  140. package/lib/find-duplicate-segments/findDuplicateSegments.js +34 -1
  141. package/lib/find-duplicate-segments/findDuplicateSegments.js.map +1 -1
  142. package/lib/find-duplicate-segments/index.js +21 -13
  143. package/lib/find-duplicate-segments/index.js.map +1 -1
  144. package/lib/find-usage/index.js +57 -41
  145. package/lib/find-usage/index.js.map +1 -1
  146. package/lib/generate-code/index.d.ts +1 -1
  147. package/lib/generate-code/index.js +64 -21
  148. package/lib/generate-code/index.js.map +1 -1
  149. package/lib/generate-code/typescript.d.ts +1 -1
  150. package/lib/generate-code/typescript.js +59 -333
  151. package/lib/generate-code/typescript.js.map +1 -1
  152. package/lib/index.d.ts +2 -1
  153. package/lib/index.js +2 -1
  154. package/lib/index.js.map +1 -1
  155. package/lib/info/index.js +57 -16
  156. package/lib/info/index.js.map +1 -1
  157. package/lib/init/index.d.ts +2 -2
  158. package/lib/init/index.js +39 -3
  159. package/lib/init/index.js.map +1 -1
  160. package/lib/linter/attributeSchema.d.ts +1 -0
  161. package/lib/linter/attributeSchema.js +1 -0
  162. package/lib/linter/attributeSchema.js.map +1 -1
  163. package/lib/linter/conditionSchema.js +5 -5
  164. package/lib/linter/conditionSchema.js.map +1 -1
  165. package/lib/linter/featureSchema.d.ts +4 -1
  166. package/lib/linter/featureSchema.js +15 -13
  167. package/lib/linter/featureSchema.js.map +1 -1
  168. package/lib/linter/groupSchema.d.ts +1 -0
  169. package/lib/linter/groupSchema.js +1 -0
  170. package/lib/linter/groupSchema.js.map +1 -1
  171. package/lib/linter/lintProject.d.ts +1 -3
  172. package/lib/linter/lintProject.js +198 -68
  173. package/lib/linter/lintProject.js.map +1 -1
  174. package/lib/linter/schema.js +1 -0
  175. package/lib/linter/schema.js.map +1 -1
  176. package/lib/linter/segmentSchema.d.ts +1 -0
  177. package/lib/linter/segmentSchema.js +1 -0
  178. package/lib/linter/segmentSchema.js.map +1 -1
  179. package/lib/linter/targetSchema.d.ts +16 -0
  180. package/lib/linter/targetSchema.js +40 -0
  181. package/lib/linter/targetSchema.js.map +1 -0
  182. package/lib/linter/testSchema.d.ts +4 -3
  183. package/lib/linter/testSchema.js +9 -4
  184. package/lib/linter/testSchema.js.map +1 -1
  185. package/lib/list/index.d.ts +1 -0
  186. package/lib/list/index.js +131 -12
  187. package/lib/list/index.js.map +1 -1
  188. package/lib/list/matrix.js +3 -7
  189. package/lib/list/matrix.js.map +1 -1
  190. package/lib/promoter/index.d.ts +50 -0
  191. package/lib/promoter/index.js +880 -0
  192. package/lib/promoter/index.js.map +1 -0
  193. package/lib/sets.d.ts +11 -0
  194. package/lib/sets.js +81 -0
  195. package/lib/sets.js.map +1 -0
  196. package/lib/targeting.d.ts +14 -0
  197. package/lib/targeting.js +82 -0
  198. package/lib/targeting.js.map +1 -0
  199. package/lib/tester/cliFormat.d.ts +7 -1
  200. package/lib/tester/cliFormat.js +11 -2
  201. package/lib/tester/cliFormat.js.map +1 -1
  202. package/lib/tester/printTestResult.js +2 -2
  203. package/lib/tester/printTestResult.js.map +1 -1
  204. package/lib/tester/testFeature.d.ts +0 -1
  205. package/lib/tester/testFeature.js +8 -25
  206. package/lib/tester/testFeature.js.map +1 -1
  207. package/lib/tester/testProject.d.ts +2 -3
  208. package/lib/tester/testProject.js +93 -86
  209. package/lib/tester/testProject.js.map +1 -1
  210. package/lib/tester/testSegment.d.ts +1 -1
  211. package/lib/tester/testSegment.js +3 -21
  212. package/lib/tester/testSegment.js.map +1 -1
  213. package/lib/utils/git.js +45 -19
  214. package/lib/utils/git.js.map +1 -1
  215. package/package.json +12 -12
  216. package/src/assess-distribution/index.ts +72 -52
  217. package/src/benchmark/index.ts +124 -91
  218. package/src/builder/{buildScopedConditions.spec.ts → applyContextToConditions.spec.ts} +160 -142
  219. package/src/builder/{buildScopedConditions.ts → applyContextToConditions.ts} +19 -14
  220. package/src/builder/{buildScopedDatafile.spec.ts → applyContextToDatafile.spec.ts} +141 -81
  221. package/src/builder/{buildScopedDatafile.ts → applyContextToDatafile.ts} +33 -33
  222. package/src/builder/{buildScopedSegments.spec.ts → applyContextToSegments.spec.ts} +171 -151
  223. package/src/builder/{buildScopedSegments.ts → applyContextToSegments.ts} +26 -14
  224. package/src/builder/buildDatafile.spec.ts +192 -14
  225. package/src/builder/buildDatafile.ts +74 -64
  226. package/src/builder/buildProject.ts +171 -86
  227. package/src/builder/buildRuntimeDatafiles.ts +57 -0
  228. package/src/builder/index.ts +0 -1
  229. package/src/cli/cli.ts +0 -5
  230. package/src/cli/plugins.ts +7 -2
  231. package/src/config/projectConfig.spec.ts +171 -8
  232. package/src/config/projectConfig.ts +100 -28
  233. package/src/datasource/adapter.ts +8 -23
  234. package/src/datasource/datasource.ts +50 -21
  235. package/src/datasource/filesystemAdapter.spec.ts +133 -74
  236. package/src/datasource/filesystemAdapter.ts +93 -227
  237. package/src/evaluate/index.ts +109 -97
  238. package/src/find-duplicate-segments/index.ts +34 -16
  239. package/src/find-usage/index.ts +89 -44
  240. package/src/generate-code/index.ts +36 -24
  241. package/src/generate-code/typescript.spec.ts +106 -0
  242. package/src/generate-code/typescript.ts +33 -398
  243. package/src/index.ts +2 -1
  244. package/src/info/index.ts +72 -16
  245. package/src/init/index.ts +1 -1
  246. package/src/linter/attributeSchema.ts +1 -0
  247. package/src/linter/conditionSchema.spec.ts +23 -3
  248. package/src/linter/conditionSchema.ts +5 -5
  249. package/src/linter/featureSchema.spec.ts +107 -18
  250. package/src/linter/featureSchema.ts +25 -28
  251. package/src/linter/groupSchema.ts +1 -0
  252. package/src/linter/lintProject.spec.ts +131 -92
  253. package/src/linter/lintProject.ts +233 -97
  254. package/src/linter/schema.ts +1 -0
  255. package/src/linter/segmentSchema.spec.ts +5 -3
  256. package/src/linter/segmentSchema.ts +1 -0
  257. package/src/linter/targetSchema.spec.ts +159 -0
  258. package/src/linter/targetSchema.ts +46 -0
  259. package/src/linter/testSchema.spec.ts +70 -5
  260. package/src/linter/testSchema.ts +12 -10
  261. package/src/list/index.spec.ts +135 -0
  262. package/src/list/index.ts +188 -12
  263. package/src/list/matrix.ts +3 -8
  264. package/src/promoter/index.spec.ts +617 -0
  265. package/src/promoter/index.ts +1266 -0
  266. package/src/sets.ts +76 -0
  267. package/src/targeting.spec.ts +74 -0
  268. package/src/targeting.ts +106 -0
  269. package/src/tester/cliFormat.ts +11 -1
  270. package/src/tester/printTestResult.ts +12 -3
  271. package/src/tester/testFeature.ts +10 -36
  272. package/src/tester/testProject.spec.ts +50 -0
  273. package/src/tester/testProject.ts +89 -140
  274. package/src/tester/testSegment.ts +5 -22
  275. package/src/utils/git.ts +13 -21
  276. package/tsconfig.cjs.json +5 -1
  277. package/tsconfig.typecheck.json +9 -0
  278. package/coverage/lcov-report/builder/convertToV1.ts.html +0 -583
  279. package/lib/builder/allocator.spec.d.ts +0 -1
  280. package/lib/builder/allocator.spec.js +0 -85
  281. package/lib/builder/allocator.spec.js.map +0 -1
  282. package/lib/builder/buildDatafile.spec.d.ts +0 -1
  283. package/lib/builder/buildDatafile.spec.js +0 -233
  284. package/lib/builder/buildDatafile.spec.js.map +0 -1
  285. package/lib/builder/buildScopedConditions.d.ts +0 -5
  286. package/lib/builder/buildScopedConditions.js.map +0 -1
  287. package/lib/builder/buildScopedConditions.spec.d.ts +0 -1
  288. package/lib/builder/buildScopedConditions.spec.js +0 -2167
  289. package/lib/builder/buildScopedConditions.spec.js.map +0 -1
  290. package/lib/builder/buildScopedDatafile.d.ts +0 -2
  291. package/lib/builder/buildScopedDatafile.js.map +0 -1
  292. package/lib/builder/buildScopedDatafile.spec.d.ts +0 -1
  293. package/lib/builder/buildScopedDatafile.spec.js +0 -2277
  294. package/lib/builder/buildScopedDatafile.spec.js.map +0 -1
  295. package/lib/builder/buildScopedSegments.d.ts +0 -5
  296. package/lib/builder/buildScopedSegments.js.map +0 -1
  297. package/lib/builder/buildScopedSegments.spec.d.ts +0 -1
  298. package/lib/builder/buildScopedSegments.spec.js +0 -1062
  299. package/lib/builder/buildScopedSegments.spec.js.map +0 -1
  300. package/lib/builder/convertToV1.d.ts +0 -10
  301. package/lib/builder/convertToV1.js +0 -119
  302. package/lib/builder/convertToV1.js.map +0 -1
  303. package/lib/builder/mutateVariables.spec.d.ts +0 -1
  304. package/lib/builder/mutateVariables.spec.js +0 -1074
  305. package/lib/builder/mutateVariables.spec.js.map +0 -1
  306. package/lib/builder/mutator.spec.d.ts +0 -1
  307. package/lib/builder/mutator.spec.js +0 -368
  308. package/lib/builder/mutator.spec.js.map +0 -1
  309. package/lib/builder/revision.spec.d.ts +0 -1
  310. package/lib/builder/revision.spec.js +0 -21
  311. package/lib/builder/revision.spec.js.map +0 -1
  312. package/lib/builder/traffic.spec.d.ts +0 -1
  313. package/lib/builder/traffic.spec.js +0 -872
  314. package/lib/builder/traffic.spec.js.map +0 -1
  315. package/lib/config/projectConfig.spec.d.ts +0 -1
  316. package/lib/config/projectConfig.spec.js +0 -24
  317. package/lib/config/projectConfig.spec.js.map +0 -1
  318. package/lib/datasource/filesystemAdapter.spec.d.ts +0 -1
  319. package/lib/datasource/filesystemAdapter.spec.js +0 -88
  320. package/lib/datasource/filesystemAdapter.spec.js.map +0 -1
  321. package/lib/generate-code/typescript.spec.d.ts +0 -1
  322. package/lib/generate-code/typescript.spec.js +0 -78
  323. package/lib/generate-code/typescript.spec.js.map +0 -1
  324. package/lib/linter/attributeSchema.spec.d.ts +0 -1
  325. package/lib/linter/attributeSchema.spec.js +0 -266
  326. package/lib/linter/attributeSchema.spec.js.map +0 -1
  327. package/lib/linter/conditionSchema.spec.d.ts +0 -1
  328. package/lib/linter/conditionSchema.spec.js +0 -380
  329. package/lib/linter/conditionSchema.spec.js.map +0 -1
  330. package/lib/linter/featureSchema.spec.d.ts +0 -1
  331. package/lib/linter/featureSchema.spec.js +0 -1552
  332. package/lib/linter/featureSchema.spec.js.map +0 -1
  333. package/lib/linter/lintProject.spec.d.ts +0 -1
  334. package/lib/linter/lintProject.spec.js +0 -211
  335. package/lib/linter/lintProject.spec.js.map +0 -1
  336. package/lib/linter/mutationNotation.spec.d.ts +0 -1
  337. package/lib/linter/mutationNotation.spec.js +0 -598
  338. package/lib/linter/mutationNotation.spec.js.map +0 -1
  339. package/lib/linter/schema.spec.d.ts +0 -1
  340. package/lib/linter/schema.spec.js +0 -535
  341. package/lib/linter/schema.spec.js.map +0 -1
  342. package/lib/linter/segmentSchema.spec.d.ts +0 -1
  343. package/lib/linter/segmentSchema.spec.js +0 -303
  344. package/lib/linter/segmentSchema.spec.js.map +0 -1
  345. package/lib/linter/testSchema.spec.d.ts +0 -1
  346. package/lib/linter/testSchema.spec.js +0 -162
  347. package/lib/linter/testSchema.spec.js.map +0 -1
  348. package/lib/list/matrix.spec.d.ts +0 -1
  349. package/lib/list/matrix.spec.js +0 -42
  350. package/lib/list/matrix.spec.js.map +0 -1
  351. package/lib/site/exportSite.d.ts +0 -2
  352. package/lib/site/exportSite.js +0 -30
  353. package/lib/site/exportSite.js.map +0 -1
  354. package/lib/site/generateHistory.d.ts +0 -3
  355. package/lib/site/generateHistory.js +0 -31
  356. package/lib/site/generateHistory.js.map +0 -1
  357. package/lib/site/generateSiteSearchIndex.d.ts +0 -4
  358. package/lib/site/generateSiteSearchIndex.js +0 -195
  359. package/lib/site/generateSiteSearchIndex.js.map +0 -1
  360. package/lib/site/getLastModifiedFromHistory.d.ts +0 -2
  361. package/lib/site/getLastModifiedFromHistory.js +0 -18
  362. package/lib/site/getLastModifiedFromHistory.js.map +0 -1
  363. package/lib/site/getOwnerAndRepoFromUrl.d.ts +0 -4
  364. package/lib/site/getOwnerAndRepoFromUrl.js +0 -20
  365. package/lib/site/getOwnerAndRepoFromUrl.js.map +0 -1
  366. package/lib/site/getRelativePaths.d.ts +0 -6
  367. package/lib/site/getRelativePaths.js +0 -15
  368. package/lib/site/getRelativePaths.js.map +0 -1
  369. package/lib/site/getRepoDetails.d.ts +0 -8
  370. package/lib/site/getRepoDetails.js +0 -48
  371. package/lib/site/getRepoDetails.js.map +0 -1
  372. package/lib/site/index.d.ts +0 -2
  373. package/lib/site/index.js +0 -43
  374. package/lib/site/index.js.map +0 -1
  375. package/lib/site/serveSite.d.ts +0 -2
  376. package/lib/site/serveSite.js +0 -54
  377. package/lib/site/serveSite.js.map +0 -1
  378. package/lib/tester/helpers.spec.d.ts +0 -1
  379. package/lib/tester/helpers.spec.js +0 -115
  380. package/lib/tester/helpers.spec.js.map +0 -1
  381. package/src/builder/convertToV1.ts +0 -166
  382. package/src/site/exportSite.ts +0 -42
  383. package/src/site/generateHistory.ts +0 -40
  384. package/src/site/generateSiteSearchIndex.ts +0 -258
  385. package/src/site/getLastModifiedFromHistory.ts +0 -21
  386. package/src/site/getOwnerAndRepoFromUrl.ts +0 -17
  387. package/src/site/getRelativePaths.ts +0 -24
  388. package/src/site/getRepoDetails.ts +0 -62
  389. package/src/site/index.ts +0 -46
  390. package/src/site/serveSite.ts +0 -58
@@ -0,0 +1,3883 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/promoter/index.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">src/promoter</a> index.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">80.26% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>419/522</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">68.01% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>253/372</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">80.34% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>94/117</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">83.65% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>389/465</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 high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a>
1000
+ <a name='L935'></a><a href='#L935'>935</a>
1001
+ <a name='L936'></a><a href='#L936'>936</a>
1002
+ <a name='L937'></a><a href='#L937'>937</a>
1003
+ <a name='L938'></a><a href='#L938'>938</a>
1004
+ <a name='L939'></a><a href='#L939'>939</a>
1005
+ <a name='L940'></a><a href='#L940'>940</a>
1006
+ <a name='L941'></a><a href='#L941'>941</a>
1007
+ <a name='L942'></a><a href='#L942'>942</a>
1008
+ <a name='L943'></a><a href='#L943'>943</a>
1009
+ <a name='L944'></a><a href='#L944'>944</a>
1010
+ <a name='L945'></a><a href='#L945'>945</a>
1011
+ <a name='L946'></a><a href='#L946'>946</a>
1012
+ <a name='L947'></a><a href='#L947'>947</a>
1013
+ <a name='L948'></a><a href='#L948'>948</a>
1014
+ <a name='L949'></a><a href='#L949'>949</a>
1015
+ <a name='L950'></a><a href='#L950'>950</a>
1016
+ <a name='L951'></a><a href='#L951'>951</a>
1017
+ <a name='L952'></a><a href='#L952'>952</a>
1018
+ <a name='L953'></a><a href='#L953'>953</a>
1019
+ <a name='L954'></a><a href='#L954'>954</a>
1020
+ <a name='L955'></a><a href='#L955'>955</a>
1021
+ <a name='L956'></a><a href='#L956'>956</a>
1022
+ <a name='L957'></a><a href='#L957'>957</a>
1023
+ <a name='L958'></a><a href='#L958'>958</a>
1024
+ <a name='L959'></a><a href='#L959'>959</a>
1025
+ <a name='L960'></a><a href='#L960'>960</a>
1026
+ <a name='L961'></a><a href='#L961'>961</a>
1027
+ <a name='L962'></a><a href='#L962'>962</a>
1028
+ <a name='L963'></a><a href='#L963'>963</a>
1029
+ <a name='L964'></a><a href='#L964'>964</a>
1030
+ <a name='L965'></a><a href='#L965'>965</a>
1031
+ <a name='L966'></a><a href='#L966'>966</a>
1032
+ <a name='L967'></a><a href='#L967'>967</a>
1033
+ <a name='L968'></a><a href='#L968'>968</a>
1034
+ <a name='L969'></a><a href='#L969'>969</a>
1035
+ <a name='L970'></a><a href='#L970'>970</a>
1036
+ <a name='L971'></a><a href='#L971'>971</a>
1037
+ <a name='L972'></a><a href='#L972'>972</a>
1038
+ <a name='L973'></a><a href='#L973'>973</a>
1039
+ <a name='L974'></a><a href='#L974'>974</a>
1040
+ <a name='L975'></a><a href='#L975'>975</a>
1041
+ <a name='L976'></a><a href='#L976'>976</a>
1042
+ <a name='L977'></a><a href='#L977'>977</a>
1043
+ <a name='L978'></a><a href='#L978'>978</a>
1044
+ <a name='L979'></a><a href='#L979'>979</a>
1045
+ <a name='L980'></a><a href='#L980'>980</a>
1046
+ <a name='L981'></a><a href='#L981'>981</a>
1047
+ <a name='L982'></a><a href='#L982'>982</a>
1048
+ <a name='L983'></a><a href='#L983'>983</a>
1049
+ <a name='L984'></a><a href='#L984'>984</a>
1050
+ <a name='L985'></a><a href='#L985'>985</a>
1051
+ <a name='L986'></a><a href='#L986'>986</a>
1052
+ <a name='L987'></a><a href='#L987'>987</a>
1053
+ <a name='L988'></a><a href='#L988'>988</a>
1054
+ <a name='L989'></a><a href='#L989'>989</a>
1055
+ <a name='L990'></a><a href='#L990'>990</a>
1056
+ <a name='L991'></a><a href='#L991'>991</a>
1057
+ <a name='L992'></a><a href='#L992'>992</a>
1058
+ <a name='L993'></a><a href='#L993'>993</a>
1059
+ <a name='L994'></a><a href='#L994'>994</a>
1060
+ <a name='L995'></a><a href='#L995'>995</a>
1061
+ <a name='L996'></a><a href='#L996'>996</a>
1062
+ <a name='L997'></a><a href='#L997'>997</a>
1063
+ <a name='L998'></a><a href='#L998'>998</a>
1064
+ <a name='L999'></a><a href='#L999'>999</a>
1065
+ <a name='L1000'></a><a href='#L1000'>1000</a>
1066
+ <a name='L1001'></a><a href='#L1001'>1001</a>
1067
+ <a name='L1002'></a><a href='#L1002'>1002</a>
1068
+ <a name='L1003'></a><a href='#L1003'>1003</a>
1069
+ <a name='L1004'></a><a href='#L1004'>1004</a>
1070
+ <a name='L1005'></a><a href='#L1005'>1005</a>
1071
+ <a name='L1006'></a><a href='#L1006'>1006</a>
1072
+ <a name='L1007'></a><a href='#L1007'>1007</a>
1073
+ <a name='L1008'></a><a href='#L1008'>1008</a>
1074
+ <a name='L1009'></a><a href='#L1009'>1009</a>
1075
+ <a name='L1010'></a><a href='#L1010'>1010</a>
1076
+ <a name='L1011'></a><a href='#L1011'>1011</a>
1077
+ <a name='L1012'></a><a href='#L1012'>1012</a>
1078
+ <a name='L1013'></a><a href='#L1013'>1013</a>
1079
+ <a name='L1014'></a><a href='#L1014'>1014</a>
1080
+ <a name='L1015'></a><a href='#L1015'>1015</a>
1081
+ <a name='L1016'></a><a href='#L1016'>1016</a>
1082
+ <a name='L1017'></a><a href='#L1017'>1017</a>
1083
+ <a name='L1018'></a><a href='#L1018'>1018</a>
1084
+ <a name='L1019'></a><a href='#L1019'>1019</a>
1085
+ <a name='L1020'></a><a href='#L1020'>1020</a>
1086
+ <a name='L1021'></a><a href='#L1021'>1021</a>
1087
+ <a name='L1022'></a><a href='#L1022'>1022</a>
1088
+ <a name='L1023'></a><a href='#L1023'>1023</a>
1089
+ <a name='L1024'></a><a href='#L1024'>1024</a>
1090
+ <a name='L1025'></a><a href='#L1025'>1025</a>
1091
+ <a name='L1026'></a><a href='#L1026'>1026</a>
1092
+ <a name='L1027'></a><a href='#L1027'>1027</a>
1093
+ <a name='L1028'></a><a href='#L1028'>1028</a>
1094
+ <a name='L1029'></a><a href='#L1029'>1029</a>
1095
+ <a name='L1030'></a><a href='#L1030'>1030</a>
1096
+ <a name='L1031'></a><a href='#L1031'>1031</a>
1097
+ <a name='L1032'></a><a href='#L1032'>1032</a>
1098
+ <a name='L1033'></a><a href='#L1033'>1033</a>
1099
+ <a name='L1034'></a><a href='#L1034'>1034</a>
1100
+ <a name='L1035'></a><a href='#L1035'>1035</a>
1101
+ <a name='L1036'></a><a href='#L1036'>1036</a>
1102
+ <a name='L1037'></a><a href='#L1037'>1037</a>
1103
+ <a name='L1038'></a><a href='#L1038'>1038</a>
1104
+ <a name='L1039'></a><a href='#L1039'>1039</a>
1105
+ <a name='L1040'></a><a href='#L1040'>1040</a>
1106
+ <a name='L1041'></a><a href='#L1041'>1041</a>
1107
+ <a name='L1042'></a><a href='#L1042'>1042</a>
1108
+ <a name='L1043'></a><a href='#L1043'>1043</a>
1109
+ <a name='L1044'></a><a href='#L1044'>1044</a>
1110
+ <a name='L1045'></a><a href='#L1045'>1045</a>
1111
+ <a name='L1046'></a><a href='#L1046'>1046</a>
1112
+ <a name='L1047'></a><a href='#L1047'>1047</a>
1113
+ <a name='L1048'></a><a href='#L1048'>1048</a>
1114
+ <a name='L1049'></a><a href='#L1049'>1049</a>
1115
+ <a name='L1050'></a><a href='#L1050'>1050</a>
1116
+ <a name='L1051'></a><a href='#L1051'>1051</a>
1117
+ <a name='L1052'></a><a href='#L1052'>1052</a>
1118
+ <a name='L1053'></a><a href='#L1053'>1053</a>
1119
+ <a name='L1054'></a><a href='#L1054'>1054</a>
1120
+ <a name='L1055'></a><a href='#L1055'>1055</a>
1121
+ <a name='L1056'></a><a href='#L1056'>1056</a>
1122
+ <a name='L1057'></a><a href='#L1057'>1057</a>
1123
+ <a name='L1058'></a><a href='#L1058'>1058</a>
1124
+ <a name='L1059'></a><a href='#L1059'>1059</a>
1125
+ <a name='L1060'></a><a href='#L1060'>1060</a>
1126
+ <a name='L1061'></a><a href='#L1061'>1061</a>
1127
+ <a name='L1062'></a><a href='#L1062'>1062</a>
1128
+ <a name='L1063'></a><a href='#L1063'>1063</a>
1129
+ <a name='L1064'></a><a href='#L1064'>1064</a>
1130
+ <a name='L1065'></a><a href='#L1065'>1065</a>
1131
+ <a name='L1066'></a><a href='#L1066'>1066</a>
1132
+ <a name='L1067'></a><a href='#L1067'>1067</a>
1133
+ <a name='L1068'></a><a href='#L1068'>1068</a>
1134
+ <a name='L1069'></a><a href='#L1069'>1069</a>
1135
+ <a name='L1070'></a><a href='#L1070'>1070</a>
1136
+ <a name='L1071'></a><a href='#L1071'>1071</a>
1137
+ <a name='L1072'></a><a href='#L1072'>1072</a>
1138
+ <a name='L1073'></a><a href='#L1073'>1073</a>
1139
+ <a name='L1074'></a><a href='#L1074'>1074</a>
1140
+ <a name='L1075'></a><a href='#L1075'>1075</a>
1141
+ <a name='L1076'></a><a href='#L1076'>1076</a>
1142
+ <a name='L1077'></a><a href='#L1077'>1077</a>
1143
+ <a name='L1078'></a><a href='#L1078'>1078</a>
1144
+ <a name='L1079'></a><a href='#L1079'>1079</a>
1145
+ <a name='L1080'></a><a href='#L1080'>1080</a>
1146
+ <a name='L1081'></a><a href='#L1081'>1081</a>
1147
+ <a name='L1082'></a><a href='#L1082'>1082</a>
1148
+ <a name='L1083'></a><a href='#L1083'>1083</a>
1149
+ <a name='L1084'></a><a href='#L1084'>1084</a>
1150
+ <a name='L1085'></a><a href='#L1085'>1085</a>
1151
+ <a name='L1086'></a><a href='#L1086'>1086</a>
1152
+ <a name='L1087'></a><a href='#L1087'>1087</a>
1153
+ <a name='L1088'></a><a href='#L1088'>1088</a>
1154
+ <a name='L1089'></a><a href='#L1089'>1089</a>
1155
+ <a name='L1090'></a><a href='#L1090'>1090</a>
1156
+ <a name='L1091'></a><a href='#L1091'>1091</a>
1157
+ <a name='L1092'></a><a href='#L1092'>1092</a>
1158
+ <a name='L1093'></a><a href='#L1093'>1093</a>
1159
+ <a name='L1094'></a><a href='#L1094'>1094</a>
1160
+ <a name='L1095'></a><a href='#L1095'>1095</a>
1161
+ <a name='L1096'></a><a href='#L1096'>1096</a>
1162
+ <a name='L1097'></a><a href='#L1097'>1097</a>
1163
+ <a name='L1098'></a><a href='#L1098'>1098</a>
1164
+ <a name='L1099'></a><a href='#L1099'>1099</a>
1165
+ <a name='L1100'></a><a href='#L1100'>1100</a>
1166
+ <a name='L1101'></a><a href='#L1101'>1101</a>
1167
+ <a name='L1102'></a><a href='#L1102'>1102</a>
1168
+ <a name='L1103'></a><a href='#L1103'>1103</a>
1169
+ <a name='L1104'></a><a href='#L1104'>1104</a>
1170
+ <a name='L1105'></a><a href='#L1105'>1105</a>
1171
+ <a name='L1106'></a><a href='#L1106'>1106</a>
1172
+ <a name='L1107'></a><a href='#L1107'>1107</a>
1173
+ <a name='L1108'></a><a href='#L1108'>1108</a>
1174
+ <a name='L1109'></a><a href='#L1109'>1109</a>
1175
+ <a name='L1110'></a><a href='#L1110'>1110</a>
1176
+ <a name='L1111'></a><a href='#L1111'>1111</a>
1177
+ <a name='L1112'></a><a href='#L1112'>1112</a>
1178
+ <a name='L1113'></a><a href='#L1113'>1113</a>
1179
+ <a name='L1114'></a><a href='#L1114'>1114</a>
1180
+ <a name='L1115'></a><a href='#L1115'>1115</a>
1181
+ <a name='L1116'></a><a href='#L1116'>1116</a>
1182
+ <a name='L1117'></a><a href='#L1117'>1117</a>
1183
+ <a name='L1118'></a><a href='#L1118'>1118</a>
1184
+ <a name='L1119'></a><a href='#L1119'>1119</a>
1185
+ <a name='L1120'></a><a href='#L1120'>1120</a>
1186
+ <a name='L1121'></a><a href='#L1121'>1121</a>
1187
+ <a name='L1122'></a><a href='#L1122'>1122</a>
1188
+ <a name='L1123'></a><a href='#L1123'>1123</a>
1189
+ <a name='L1124'></a><a href='#L1124'>1124</a>
1190
+ <a name='L1125'></a><a href='#L1125'>1125</a>
1191
+ <a name='L1126'></a><a href='#L1126'>1126</a>
1192
+ <a name='L1127'></a><a href='#L1127'>1127</a>
1193
+ <a name='L1128'></a><a href='#L1128'>1128</a>
1194
+ <a name='L1129'></a><a href='#L1129'>1129</a>
1195
+ <a name='L1130'></a><a href='#L1130'>1130</a>
1196
+ <a name='L1131'></a><a href='#L1131'>1131</a>
1197
+ <a name='L1132'></a><a href='#L1132'>1132</a>
1198
+ <a name='L1133'></a><a href='#L1133'>1133</a>
1199
+ <a name='L1134'></a><a href='#L1134'>1134</a>
1200
+ <a name='L1135'></a><a href='#L1135'>1135</a>
1201
+ <a name='L1136'></a><a href='#L1136'>1136</a>
1202
+ <a name='L1137'></a><a href='#L1137'>1137</a>
1203
+ <a name='L1138'></a><a href='#L1138'>1138</a>
1204
+ <a name='L1139'></a><a href='#L1139'>1139</a>
1205
+ <a name='L1140'></a><a href='#L1140'>1140</a>
1206
+ <a name='L1141'></a><a href='#L1141'>1141</a>
1207
+ <a name='L1142'></a><a href='#L1142'>1142</a>
1208
+ <a name='L1143'></a><a href='#L1143'>1143</a>
1209
+ <a name='L1144'></a><a href='#L1144'>1144</a>
1210
+ <a name='L1145'></a><a href='#L1145'>1145</a>
1211
+ <a name='L1146'></a><a href='#L1146'>1146</a>
1212
+ <a name='L1147'></a><a href='#L1147'>1147</a>
1213
+ <a name='L1148'></a><a href='#L1148'>1148</a>
1214
+ <a name='L1149'></a><a href='#L1149'>1149</a>
1215
+ <a name='L1150'></a><a href='#L1150'>1150</a>
1216
+ <a name='L1151'></a><a href='#L1151'>1151</a>
1217
+ <a name='L1152'></a><a href='#L1152'>1152</a>
1218
+ <a name='L1153'></a><a href='#L1153'>1153</a>
1219
+ <a name='L1154'></a><a href='#L1154'>1154</a>
1220
+ <a name='L1155'></a><a href='#L1155'>1155</a>
1221
+ <a name='L1156'></a><a href='#L1156'>1156</a>
1222
+ <a name='L1157'></a><a href='#L1157'>1157</a>
1223
+ <a name='L1158'></a><a href='#L1158'>1158</a>
1224
+ <a name='L1159'></a><a href='#L1159'>1159</a>
1225
+ <a name='L1160'></a><a href='#L1160'>1160</a>
1226
+ <a name='L1161'></a><a href='#L1161'>1161</a>
1227
+ <a name='L1162'></a><a href='#L1162'>1162</a>
1228
+ <a name='L1163'></a><a href='#L1163'>1163</a>
1229
+ <a name='L1164'></a><a href='#L1164'>1164</a>
1230
+ <a name='L1165'></a><a href='#L1165'>1165</a>
1231
+ <a name='L1166'></a><a href='#L1166'>1166</a>
1232
+ <a name='L1167'></a><a href='#L1167'>1167</a>
1233
+ <a name='L1168'></a><a href='#L1168'>1168</a>
1234
+ <a name='L1169'></a><a href='#L1169'>1169</a>
1235
+ <a name='L1170'></a><a href='#L1170'>1170</a>
1236
+ <a name='L1171'></a><a href='#L1171'>1171</a>
1237
+ <a name='L1172'></a><a href='#L1172'>1172</a>
1238
+ <a name='L1173'></a><a href='#L1173'>1173</a>
1239
+ <a name='L1174'></a><a href='#L1174'>1174</a>
1240
+ <a name='L1175'></a><a href='#L1175'>1175</a>
1241
+ <a name='L1176'></a><a href='#L1176'>1176</a>
1242
+ <a name='L1177'></a><a href='#L1177'>1177</a>
1243
+ <a name='L1178'></a><a href='#L1178'>1178</a>
1244
+ <a name='L1179'></a><a href='#L1179'>1179</a>
1245
+ <a name='L1180'></a><a href='#L1180'>1180</a>
1246
+ <a name='L1181'></a><a href='#L1181'>1181</a>
1247
+ <a name='L1182'></a><a href='#L1182'>1182</a>
1248
+ <a name='L1183'></a><a href='#L1183'>1183</a>
1249
+ <a name='L1184'></a><a href='#L1184'>1184</a>
1250
+ <a name='L1185'></a><a href='#L1185'>1185</a>
1251
+ <a name='L1186'></a><a href='#L1186'>1186</a>
1252
+ <a name='L1187'></a><a href='#L1187'>1187</a>
1253
+ <a name='L1188'></a><a href='#L1188'>1188</a>
1254
+ <a name='L1189'></a><a href='#L1189'>1189</a>
1255
+ <a name='L1190'></a><a href='#L1190'>1190</a>
1256
+ <a name='L1191'></a><a href='#L1191'>1191</a>
1257
+ <a name='L1192'></a><a href='#L1192'>1192</a>
1258
+ <a name='L1193'></a><a href='#L1193'>1193</a>
1259
+ <a name='L1194'></a><a href='#L1194'>1194</a>
1260
+ <a name='L1195'></a><a href='#L1195'>1195</a>
1261
+ <a name='L1196'></a><a href='#L1196'>1196</a>
1262
+ <a name='L1197'></a><a href='#L1197'>1197</a>
1263
+ <a name='L1198'></a><a href='#L1198'>1198</a>
1264
+ <a name='L1199'></a><a href='#L1199'>1199</a>
1265
+ <a name='L1200'></a><a href='#L1200'>1200</a>
1266
+ <a name='L1201'></a><a href='#L1201'>1201</a>
1267
+ <a name='L1202'></a><a href='#L1202'>1202</a>
1268
+ <a name='L1203'></a><a href='#L1203'>1203</a>
1269
+ <a name='L1204'></a><a href='#L1204'>1204</a>
1270
+ <a name='L1205'></a><a href='#L1205'>1205</a>
1271
+ <a name='L1206'></a><a href='#L1206'>1206</a>
1272
+ <a name='L1207'></a><a href='#L1207'>1207</a>
1273
+ <a name='L1208'></a><a href='#L1208'>1208</a>
1274
+ <a name='L1209'></a><a href='#L1209'>1209</a>
1275
+ <a name='L1210'></a><a href='#L1210'>1210</a>
1276
+ <a name='L1211'></a><a href='#L1211'>1211</a>
1277
+ <a name='L1212'></a><a href='#L1212'>1212</a>
1278
+ <a name='L1213'></a><a href='#L1213'>1213</a>
1279
+ <a name='L1214'></a><a href='#L1214'>1214</a>
1280
+ <a name='L1215'></a><a href='#L1215'>1215</a>
1281
+ <a name='L1216'></a><a href='#L1216'>1216</a>
1282
+ <a name='L1217'></a><a href='#L1217'>1217</a>
1283
+ <a name='L1218'></a><a href='#L1218'>1218</a>
1284
+ <a name='L1219'></a><a href='#L1219'>1219</a>
1285
+ <a name='L1220'></a><a href='#L1220'>1220</a>
1286
+ <a name='L1221'></a><a href='#L1221'>1221</a>
1287
+ <a name='L1222'></a><a href='#L1222'>1222</a>
1288
+ <a name='L1223'></a><a href='#L1223'>1223</a>
1289
+ <a name='L1224'></a><a href='#L1224'>1224</a>
1290
+ <a name='L1225'></a><a href='#L1225'>1225</a>
1291
+ <a name='L1226'></a><a href='#L1226'>1226</a>
1292
+ <a name='L1227'></a><a href='#L1227'>1227</a>
1293
+ <a name='L1228'></a><a href='#L1228'>1228</a>
1294
+ <a name='L1229'></a><a href='#L1229'>1229</a>
1295
+ <a name='L1230'></a><a href='#L1230'>1230</a>
1296
+ <a name='L1231'></a><a href='#L1231'>1231</a>
1297
+ <a name='L1232'></a><a href='#L1232'>1232</a>
1298
+ <a name='L1233'></a><a href='#L1233'>1233</a>
1299
+ <a name='L1234'></a><a href='#L1234'>1234</a>
1300
+ <a name='L1235'></a><a href='#L1235'>1235</a>
1301
+ <a name='L1236'></a><a href='#L1236'>1236</a>
1302
+ <a name='L1237'></a><a href='#L1237'>1237</a>
1303
+ <a name='L1238'></a><a href='#L1238'>1238</a>
1304
+ <a name='L1239'></a><a href='#L1239'>1239</a>
1305
+ <a name='L1240'></a><a href='#L1240'>1240</a>
1306
+ <a name='L1241'></a><a href='#L1241'>1241</a>
1307
+ <a name='L1242'></a><a href='#L1242'>1242</a>
1308
+ <a name='L1243'></a><a href='#L1243'>1243</a>
1309
+ <a name='L1244'></a><a href='#L1244'>1244</a>
1310
+ <a name='L1245'></a><a href='#L1245'>1245</a>
1311
+ <a name='L1246'></a><a href='#L1246'>1246</a>
1312
+ <a name='L1247'></a><a href='#L1247'>1247</a>
1313
+ <a name='L1248'></a><a href='#L1248'>1248</a>
1314
+ <a name='L1249'></a><a href='#L1249'>1249</a>
1315
+ <a name='L1250'></a><a href='#L1250'>1250</a>
1316
+ <a name='L1251'></a><a href='#L1251'>1251</a>
1317
+ <a name='L1252'></a><a href='#L1252'>1252</a>
1318
+ <a name='L1253'></a><a href='#L1253'>1253</a>
1319
+ <a name='L1254'></a><a href='#L1254'>1254</a>
1320
+ <a name='L1255'></a><a href='#L1255'>1255</a>
1321
+ <a name='L1256'></a><a href='#L1256'>1256</a>
1322
+ <a name='L1257'></a><a href='#L1257'>1257</a>
1323
+ <a name='L1258'></a><a href='#L1258'>1258</a>
1324
+ <a name='L1259'></a><a href='#L1259'>1259</a>
1325
+ <a name='L1260'></a><a href='#L1260'>1260</a>
1326
+ <a name='L1261'></a><a href='#L1261'>1261</a>
1327
+ <a name='L1262'></a><a href='#L1262'>1262</a>
1328
+ <a name='L1263'></a><a href='#L1263'>1263</a>
1329
+ <a name='L1264'></a><a href='#L1264'>1264</a>
1330
+ <a name='L1265'></a><a href='#L1265'>1265</a>
1331
+ <a name='L1266'></a><a href='#L1266'>1266</a>
1332
+ <a name='L1267'></a><a href='#L1267'>1267</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
1333
+ <span class="cline-any cline-yes">1x</span>
1334
+ <span class="cline-any cline-neutral">&nbsp;</span>
1335
+ <span class="cline-any cline-neutral">&nbsp;</span>
1336
+ <span class="cline-any cline-neutral">&nbsp;</span>
1337
+ <span class="cline-any cline-neutral">&nbsp;</span>
1338
+ <span class="cline-any cline-neutral">&nbsp;</span>
1339
+ <span class="cline-any cline-neutral">&nbsp;</span>
1340
+ <span class="cline-any cline-neutral">&nbsp;</span>
1341
+ <span class="cline-any cline-neutral">&nbsp;</span>
1342
+ <span class="cline-any cline-neutral">&nbsp;</span>
1343
+ <span class="cline-any cline-neutral">&nbsp;</span>
1344
+ <span class="cline-any cline-neutral">&nbsp;</span>
1345
+ <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-neutral">&nbsp;</span>
1347
+ <span class="cline-any cline-neutral">&nbsp;</span>
1348
+ <span class="cline-any cline-neutral">&nbsp;</span>
1349
+ <span class="cline-any cline-neutral">&nbsp;</span>
1350
+ <span class="cline-any cline-neutral">&nbsp;</span>
1351
+ <span class="cline-any cline-neutral">&nbsp;</span>
1352
+ <span class="cline-any cline-yes">1x</span>
1353
+ <span class="cline-any cline-neutral">&nbsp;</span>
1354
+ <span class="cline-any cline-neutral">&nbsp;</span>
1355
+ <span class="cline-any cline-neutral">&nbsp;</span>
1356
+ <span class="cline-any cline-neutral">&nbsp;</span>
1357
+ <span class="cline-any cline-neutral">&nbsp;</span>
1358
+ <span class="cline-any cline-neutral">&nbsp;</span>
1359
+ <span class="cline-any cline-neutral">&nbsp;</span>
1360
+ <span class="cline-any cline-neutral">&nbsp;</span>
1361
+ <span class="cline-any cline-yes">1x</span>
1362
+ <span class="cline-any cline-yes">1x</span>
1363
+ <span class="cline-any cline-neutral">&nbsp;</span>
1364
+ <span class="cline-any cline-neutral">&nbsp;</span>
1365
+ <span class="cline-any cline-neutral">&nbsp;</span>
1366
+ <span class="cline-any cline-neutral">&nbsp;</span>
1367
+ <span class="cline-any cline-neutral">&nbsp;</span>
1368
+ <span class="cline-any cline-neutral">&nbsp;</span>
1369
+ <span class="cline-any cline-neutral">&nbsp;</span>
1370
+ <span class="cline-any cline-neutral">&nbsp;</span>
1371
+ <span class="cline-any cline-neutral">&nbsp;</span>
1372
+ <span class="cline-any cline-neutral">&nbsp;</span>
1373
+ <span class="cline-any cline-neutral">&nbsp;</span>
1374
+ <span class="cline-any cline-neutral">&nbsp;</span>
1375
+ <span class="cline-any cline-neutral">&nbsp;</span>
1376
+ <span class="cline-any cline-neutral">&nbsp;</span>
1377
+ <span class="cline-any cline-neutral">&nbsp;</span>
1378
+ <span class="cline-any cline-neutral">&nbsp;</span>
1379
+ <span class="cline-any cline-neutral">&nbsp;</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-neutral">&nbsp;</span>
1382
+ <span class="cline-any cline-neutral">&nbsp;</span>
1383
+ <span class="cline-any cline-neutral">&nbsp;</span>
1384
+ <span class="cline-any cline-neutral">&nbsp;</span>
1385
+ <span class="cline-any cline-neutral">&nbsp;</span>
1386
+ <span class="cline-any cline-neutral">&nbsp;</span>
1387
+ <span class="cline-any cline-neutral">&nbsp;</span>
1388
+ <span class="cline-any cline-neutral">&nbsp;</span>
1389
+ <span class="cline-any cline-neutral">&nbsp;</span>
1390
+ <span class="cline-any cline-neutral">&nbsp;</span>
1391
+ <span class="cline-any cline-neutral">&nbsp;</span>
1392
+ <span class="cline-any cline-neutral">&nbsp;</span>
1393
+ <span class="cline-any cline-neutral">&nbsp;</span>
1394
+ <span class="cline-any cline-neutral">&nbsp;</span>
1395
+ <span class="cline-any cline-neutral">&nbsp;</span>
1396
+ <span class="cline-any cline-neutral">&nbsp;</span>
1397
+ <span class="cline-any cline-neutral">&nbsp;</span>
1398
+ <span class="cline-any cline-neutral">&nbsp;</span>
1399
+ <span class="cline-any cline-neutral">&nbsp;</span>
1400
+ <span class="cline-any cline-neutral">&nbsp;</span>
1401
+ <span class="cline-any cline-neutral">&nbsp;</span>
1402
+ <span class="cline-any cline-neutral">&nbsp;</span>
1403
+ <span class="cline-any cline-neutral">&nbsp;</span>
1404
+ <span class="cline-any cline-neutral">&nbsp;</span>
1405
+ <span class="cline-any cline-neutral">&nbsp;</span>
1406
+ <span class="cline-any cline-neutral">&nbsp;</span>
1407
+ <span class="cline-any cline-neutral">&nbsp;</span>
1408
+ <span class="cline-any cline-neutral">&nbsp;</span>
1409
+ <span class="cline-any cline-neutral">&nbsp;</span>
1410
+ <span class="cline-any cline-neutral">&nbsp;</span>
1411
+ <span class="cline-any cline-neutral">&nbsp;</span>
1412
+ <span class="cline-any cline-neutral">&nbsp;</span>
1413
+ <span class="cline-any cline-neutral">&nbsp;</span>
1414
+ <span class="cline-any cline-neutral">&nbsp;</span>
1415
+ <span class="cline-any cline-neutral">&nbsp;</span>
1416
+ <span class="cline-any cline-neutral">&nbsp;</span>
1417
+ <span class="cline-any cline-neutral">&nbsp;</span>
1418
+ <span class="cline-any cline-neutral">&nbsp;</span>
1419
+ <span class="cline-any cline-neutral">&nbsp;</span>
1420
+ <span class="cline-any cline-neutral">&nbsp;</span>
1421
+ <span class="cline-any cline-neutral">&nbsp;</span>
1422
+ <span class="cline-any cline-neutral">&nbsp;</span>
1423
+ <span class="cline-any cline-neutral">&nbsp;</span>
1424
+ <span class="cline-any cline-neutral">&nbsp;</span>
1425
+ <span class="cline-any cline-neutral">&nbsp;</span>
1426
+ <span class="cline-any cline-neutral">&nbsp;</span>
1427
+ <span class="cline-any cline-neutral">&nbsp;</span>
1428
+ <span class="cline-any cline-neutral">&nbsp;</span>
1429
+ <span class="cline-any cline-neutral">&nbsp;</span>
1430
+ <span class="cline-any cline-neutral">&nbsp;</span>
1431
+ <span class="cline-any cline-yes">211x</span>
1432
+ <span class="cline-any cline-neutral">&nbsp;</span>
1433
+ <span class="cline-any cline-neutral">&nbsp;</span>
1434
+ <span class="cline-any cline-neutral">&nbsp;</span>
1435
+ <span class="cline-any cline-yes">124x</span>
1436
+ <span class="cline-any cline-yes">44x</span>
1437
+ <span class="cline-any cline-neutral">&nbsp;</span>
1438
+ <span class="cline-any cline-neutral">&nbsp;</span>
1439
+ <span class="cline-any cline-yes">80x</span>
1440
+ <span class="cline-any cline-neutral">&nbsp;</span>
1441
+ <span class="cline-any cline-neutral">&nbsp;</span>
1442
+ <span class="cline-any cline-neutral">&nbsp;</span>
1443
+ <span class="cline-any cline-yes">410x</span>
1444
+ <span class="cline-any cline-neutral">&nbsp;</span>
1445
+ <span class="cline-any cline-neutral">&nbsp;</span>
1446
+ <span class="cline-any cline-neutral">&nbsp;</span>
1447
+ <span class="cline-any cline-yes">407x</span>
1448
+ <span class="cline-any cline-neutral">&nbsp;</span>
1449
+ <span class="cline-any cline-neutral">&nbsp;</span>
1450
+ <span class="cline-any cline-neutral">&nbsp;</span>
1451
+ <span class="cline-any cline-neutral">&nbsp;</span>
1452
+ <span class="cline-any cline-neutral">&nbsp;</span>
1453
+ <span class="cline-any cline-neutral">&nbsp;</span>
1454
+ <span class="cline-any cline-neutral">&nbsp;</span>
1455
+ <span class="cline-any cline-neutral">&nbsp;</span>
1456
+ <span class="cline-any cline-neutral">&nbsp;</span>
1457
+ <span class="cline-any cline-yes">353x</span>
1458
+ <span class="cline-any cline-yes">337x</span>
1459
+ <span class="cline-any cline-neutral">&nbsp;</span>
1460
+ <span class="cline-any cline-yes">337x</span>
1461
+ <span class="cline-any cline-neutral">&nbsp;</span>
1462
+ <span class="cline-any cline-yes">337x</span>
1463
+ <span class="cline-any cline-yes">47x</span>
1464
+ <span class="cline-any cline-yes">12x</span>
1465
+ <span class="cline-any cline-neutral">&nbsp;</span>
1466
+ <span class="cline-any cline-neutral">&nbsp;</span>
1467
+ <span class="cline-any cline-yes">47x</span>
1468
+ <span class="cline-any cline-neutral">&nbsp;</span>
1469
+ <span class="cline-any cline-neutral">&nbsp;</span>
1470
+ <span class="cline-any cline-yes">290x</span>
1471
+ <span class="cline-any cline-yes">120x</span>
1472
+ <span class="cline-any cline-neutral">&nbsp;</span>
1473
+ <span class="cline-any cline-yes">120x</span>
1474
+ <span class="cline-any cline-yes">255x</span>
1475
+ <span class="cline-any cline-neutral">&nbsp;</span>
1476
+ <span class="cline-any cline-neutral">&nbsp;</span>
1477
+ <span class="cline-any cline-neutral">&nbsp;</span>
1478
+ <span class="cline-any cline-neutral">&nbsp;</span>
1479
+ <span class="cline-any cline-neutral">&nbsp;</span>
1480
+ <span class="cline-any cline-yes">120x</span>
1481
+ <span class="cline-any cline-neutral">&nbsp;</span>
1482
+ <span class="cline-any cline-neutral">&nbsp;</span>
1483
+ <span class="cline-any cline-yes">170x</span>
1484
+ <span class="cline-any cline-yes">32x</span>
1485
+ <span class="cline-any cline-neutral">&nbsp;</span>
1486
+ <span class="cline-any cline-neutral">&nbsp;</span>
1487
+ <span class="cline-any cline-yes">170x</span>
1488
+ <span class="cline-any cline-neutral">&nbsp;</span>
1489
+ <span class="cline-any cline-neutral">&nbsp;</span>
1490
+ <span class="cline-any cline-neutral">&nbsp;</span>
1491
+ <span class="cline-any cline-yes">23x</span>
1492
+ <span class="cline-any cline-yes">12x</span>
1493
+ <span class="cline-any cline-neutral">&nbsp;</span>
1494
+ <span class="cline-any cline-neutral">&nbsp;</span>
1495
+ <span class="cline-any cline-yes">11x</span>
1496
+ <span class="cline-any cline-yes">11x</span>
1497
+ <span class="cline-any cline-yes">11x</span>
1498
+ <span class="cline-any cline-neutral">&nbsp;</span>
1499
+ <span class="cline-any cline-neutral">&nbsp;</span>
1500
+ <span class="cline-any cline-neutral">&nbsp;</span>
1501
+ <span class="cline-any cline-neutral">&nbsp;</span>
1502
+ <span class="cline-any cline-yes">3x</span>
1503
+ <span class="cline-any cline-yes">3x</span>
1504
+ <span class="cline-any cline-no">&nbsp;</span>
1505
+ <span class="cline-any cline-neutral">&nbsp;</span>
1506
+ <span class="cline-any cline-yes">3x</span>
1507
+ <span class="cline-any cline-no">&nbsp;</span>
1508
+ <span class="cline-any cline-neutral">&nbsp;</span>
1509
+ <span class="cline-any cline-yes">5x</span>
1510
+ <span class="cline-any cline-neutral">&nbsp;</span>
1511
+ <span class="cline-any cline-neutral">&nbsp;</span>
1512
+ <span class="cline-any cline-neutral">&nbsp;</span>
1513
+ <span class="cline-any cline-yes">3x</span>
1514
+ <span class="cline-any cline-yes">3x</span>
1515
+ <span class="cline-any cline-yes">3x</span>
1516
+ <span class="cline-any cline-yes">3x</span>
1517
+ <span class="cline-any cline-neutral">&nbsp;</span>
1518
+ <span class="cline-any cline-yes">2x</span>
1519
+ <span class="cline-any cline-neutral">&nbsp;</span>
1520
+ <span class="cline-any cline-neutral">&nbsp;</span>
1521
+ <span class="cline-any cline-yes">2x</span>
1522
+ <span class="cline-any cline-neutral">&nbsp;</span>
1523
+ <span class="cline-any cline-neutral">&nbsp;</span>
1524
+ <span class="cline-any cline-neutral">&nbsp;</span>
1525
+ <span class="cline-any cline-yes">2x</span>
1526
+ <span class="cline-any cline-neutral">&nbsp;</span>
1527
+ <span class="cline-any cline-neutral">&nbsp;</span>
1528
+ <span class="cline-any cline-neutral">&nbsp;</span>
1529
+ <span class="cline-any cline-yes">171x</span>
1530
+ <span class="cline-any cline-neutral">&nbsp;</span>
1531
+ <span class="cline-any cline-yes">171x</span>
1532
+ <span class="cline-any cline-neutral">&nbsp;</span>
1533
+ <span class="cline-any cline-neutral">&nbsp;</span>
1534
+ <span class="cline-any cline-neutral">&nbsp;</span>
1535
+ <span class="cline-any cline-neutral">&nbsp;</span>
1536
+ <span class="cline-any cline-neutral">&nbsp;</span>
1537
+ <span class="cline-any cline-neutral">&nbsp;</span>
1538
+ <span class="cline-any cline-yes">119x</span>
1539
+ <span class="cline-any cline-yes">112x</span>
1540
+ <span class="cline-any cline-neutral">&nbsp;</span>
1541
+ <span class="cline-any cline-neutral">&nbsp;</span>
1542
+ <span class="cline-any cline-neutral">&nbsp;</span>
1543
+ <span class="cline-any cline-neutral">&nbsp;</span>
1544
+ <span class="cline-any cline-neutral">&nbsp;</span>
1545
+ <span class="cline-any cline-neutral">&nbsp;</span>
1546
+ <span class="cline-any cline-yes">88x</span>
1547
+ <span class="cline-any cline-yes">88x</span>
1548
+ <span class="cline-any cline-neutral">&nbsp;</span>
1549
+ <span class="cline-any cline-yes">5x</span>
1550
+ <span class="cline-any cline-neutral">&nbsp;</span>
1551
+ <span class="cline-any cline-neutral">&nbsp;</span>
1552
+ <span class="cline-any cline-neutral">&nbsp;</span>
1553
+ <span class="cline-any cline-neutral">&nbsp;</span>
1554
+ <span class="cline-any cline-no">&nbsp;</span>
1555
+ <span class="cline-any cline-neutral">&nbsp;</span>
1556
+ <span class="cline-any cline-no">&nbsp;</span>
1557
+ <span class="cline-any cline-neutral">&nbsp;</span>
1558
+ <span class="cline-any cline-no">&nbsp;</span>
1559
+ <span class="cline-any cline-neutral">&nbsp;</span>
1560
+ <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-neutral">&nbsp;</span>
1562
+ <span class="cline-any cline-neutral">&nbsp;</span>
1563
+ <span class="cline-any cline-neutral">&nbsp;</span>
1564
+ <span class="cline-any cline-neutral">&nbsp;</span>
1565
+ <span class="cline-any cline-neutral">&nbsp;</span>
1566
+ <span class="cline-any cline-neutral">&nbsp;</span>
1567
+ <span class="cline-any cline-neutral">&nbsp;</span>
1568
+ <span class="cline-any cline-yes">34x</span>
1569
+ <span class="cline-any cline-neutral">&nbsp;</span>
1570
+ <span class="cline-any cline-neutral">&nbsp;</span>
1571
+ <span class="cline-any cline-neutral">&nbsp;</span>
1572
+ <span class="cline-any cline-neutral">&nbsp;</span>
1573
+ <span class="cline-any cline-neutral">&nbsp;</span>
1574
+ <span class="cline-any cline-neutral">&nbsp;</span>
1575
+ <span class="cline-any cline-neutral">&nbsp;</span>
1576
+ <span class="cline-any cline-neutral">&nbsp;</span>
1577
+ <span class="cline-any cline-neutral">&nbsp;</span>
1578
+ <span class="cline-any cline-yes">34x</span>
1579
+ <span class="cline-any cline-no">&nbsp;</span>
1580
+ <span class="cline-any cline-neutral">&nbsp;</span>
1581
+ <span class="cline-any cline-neutral">&nbsp;</span>
1582
+ <span class="cline-any cline-neutral">&nbsp;</span>
1583
+ <span class="cline-any cline-neutral">&nbsp;</span>
1584
+ <span class="cline-any cline-yes">19x</span>
1585
+ <span class="cline-any cline-neutral">&nbsp;</span>
1586
+ <span class="cline-any cline-yes">19x</span>
1587
+ <span class="cline-any cline-yes">16x</span>
1588
+ <span class="cline-any cline-neutral">&nbsp;</span>
1589
+ <span class="cline-any cline-neutral">&nbsp;</span>
1590
+ <span class="cline-any cline-yes">3x</span>
1591
+ <span class="cline-any cline-neutral">&nbsp;</span>
1592
+ <span class="cline-any cline-yes">3x</span>
1593
+ <span class="cline-any cline-yes">1x</span>
1594
+ <span class="cline-any cline-neutral">&nbsp;</span>
1595
+ <span class="cline-any cline-neutral">&nbsp;</span>
1596
+ <span class="cline-any cline-yes">2x</span>
1597
+ <span class="cline-any cline-neutral">&nbsp;</span>
1598
+ <span class="cline-any cline-yes">2x</span>
1599
+ <span class="cline-any cline-neutral">&nbsp;</span>
1600
+ <span class="cline-any cline-neutral">&nbsp;</span>
1601
+ <span class="cline-any cline-neutral">&nbsp;</span>
1602
+ <span class="cline-any cline-neutral">&nbsp;</span>
1603
+ <span class="cline-any cline-neutral">&nbsp;</span>
1604
+ <span class="cline-any cline-neutral">&nbsp;</span>
1605
+ <span class="cline-any cline-neutral">&nbsp;</span>
1606
+ <span class="cline-any cline-neutral">&nbsp;</span>
1607
+ <span class="cline-any cline-yes">17x</span>
1608
+ <span class="cline-any cline-yes">11x</span>
1609
+ <span class="cline-any cline-yes">11x</span>
1610
+ <span class="cline-any cline-yes">11x</span>
1611
+ <span class="cline-any cline-neutral">&nbsp;</span>
1612
+ <span class="cline-any cline-no">&nbsp;</span>
1613
+ <span class="cline-any cline-no">&nbsp;</span>
1614
+ <span class="cline-any cline-no">&nbsp;</span>
1615
+ <span class="cline-any cline-neutral">&nbsp;</span>
1616
+ <span class="cline-any cline-no">&nbsp;</span>
1617
+ <span class="cline-any cline-no">&nbsp;</span>
1618
+ <span class="cline-any cline-no">&nbsp;</span>
1619
+ <span class="cline-any cline-neutral">&nbsp;</span>
1620
+ <span class="cline-any cline-neutral">&nbsp;</span>
1621
+ <span class="cline-any cline-neutral">&nbsp;</span>
1622
+ <span class="cline-any cline-neutral">&nbsp;</span>
1623
+ <span class="cline-any cline-neutral">&nbsp;</span>
1624
+ <span class="cline-any cline-neutral">&nbsp;</span>
1625
+ <span class="cline-any cline-neutral">&nbsp;</span>
1626
+ <span class="cline-any cline-yes">24x</span>
1627
+ <span class="cline-any cline-yes">24x</span>
1628
+ <span class="cline-any cline-no">&nbsp;</span>
1629
+ <span class="cline-any cline-no">&nbsp;</span>
1630
+ <span class="cline-any cline-neutral">&nbsp;</span>
1631
+ <span class="cline-any cline-yes">24x</span>
1632
+ <span class="cline-any cline-yes">12x</span>
1633
+ <span class="cline-any cline-yes">12x</span>
1634
+ <span class="cline-any cline-neutral">&nbsp;</span>
1635
+ <span class="cline-any cline-yes">12x</span>
1636
+ <span class="cline-any cline-yes">12x</span>
1637
+ <span class="cline-any cline-yes">12x</span>
1638
+ <span class="cline-any cline-neutral">&nbsp;</span>
1639
+ <span class="cline-any cline-no">&nbsp;</span>
1640
+ <span class="cline-any cline-no">&nbsp;</span>
1641
+ <span class="cline-any cline-no">&nbsp;</span>
1642
+ <span class="cline-any cline-no">&nbsp;</span>
1643
+ <span class="cline-any cline-no">&nbsp;</span>
1644
+ <span class="cline-any cline-no">&nbsp;</span>
1645
+ <span class="cline-any cline-neutral">&nbsp;</span>
1646
+ <span class="cline-any cline-neutral">&nbsp;</span>
1647
+ <span class="cline-any cline-neutral">&nbsp;</span>
1648
+ <span class="cline-any cline-yes">73x</span>
1649
+ <span class="cline-any cline-yes">36x</span>
1650
+ <span class="cline-any cline-neutral">&nbsp;</span>
1651
+ <span class="cline-any cline-neutral">&nbsp;</span>
1652
+ <span class="cline-any cline-yes">37x</span>
1653
+ <span class="cline-any cline-no">&nbsp;</span>
1654
+ <span class="cline-any cline-no">&nbsp;</span>
1655
+ <span class="cline-any cline-neutral">&nbsp;</span>
1656
+ <span class="cline-any cline-neutral">&nbsp;</span>
1657
+ <span class="cline-any cline-yes">37x</span>
1658
+ <span class="cline-any cline-neutral">&nbsp;</span>
1659
+ <span class="cline-any cline-yes">37x</span>
1660
+ <span class="cline-any cline-yes">9x</span>
1661
+ <span class="cline-any cline-neutral">&nbsp;</span>
1662
+ <span class="cline-any cline-neutral">&nbsp;</span>
1663
+ <span class="cline-any cline-yes">47x</span>
1664
+ <span class="cline-any cline-neutral">&nbsp;</span>
1665
+ <span class="cline-any cline-neutral">&nbsp;</span>
1666
+ <span class="cline-any cline-neutral">&nbsp;</span>
1667
+ <span class="cline-any cline-neutral">&nbsp;</span>
1668
+ <span class="cline-any cline-neutral">&nbsp;</span>
1669
+ <span class="cline-any cline-neutral">&nbsp;</span>
1670
+ <span class="cline-any cline-neutral">&nbsp;</span>
1671
+ <span class="cline-any cline-neutral">&nbsp;</span>
1672
+ <span class="cline-any cline-neutral">&nbsp;</span>
1673
+ <span class="cline-any cline-neutral">&nbsp;</span>
1674
+ <span class="cline-any cline-yes">16x</span>
1675
+ <span class="cline-any cline-yes">16x</span>
1676
+ <span class="cline-any cline-no">&nbsp;</span>
1677
+ <span class="cline-any cline-no">&nbsp;</span>
1678
+ <span class="cline-any cline-no">&nbsp;</span>
1679
+ <span class="cline-any cline-no">&nbsp;</span>
1680
+ <span class="cline-any cline-neutral">&nbsp;</span>
1681
+ <span class="cline-any cline-neutral">&nbsp;</span>
1682
+ <span class="cline-any cline-yes">16x</span>
1683
+ <span class="cline-any cline-neutral">&nbsp;</span>
1684
+ <span class="cline-any cline-yes">16x</span>
1685
+ <span class="cline-any cline-no">&nbsp;</span>
1686
+ <span class="cline-any cline-no">&nbsp;</span>
1687
+ <span class="cline-any cline-no">&nbsp;</span>
1688
+ <span class="cline-any cline-no">&nbsp;</span>
1689
+ <span class="cline-any cline-no">&nbsp;</span>
1690
+ <span class="cline-any cline-no">&nbsp;</span>
1691
+ <span class="cline-any cline-neutral">&nbsp;</span>
1692
+ <span class="cline-any cline-neutral">&nbsp;</span>
1693
+ <span class="cline-any cline-neutral">&nbsp;</span>
1694
+ <span class="cline-any cline-neutral">&nbsp;</span>
1695
+ <span class="cline-any cline-neutral">&nbsp;</span>
1696
+ <span class="cline-any cline-neutral">&nbsp;</span>
1697
+ <span class="cline-any cline-neutral">&nbsp;</span>
1698
+ <span class="cline-any cline-neutral">&nbsp;</span>
1699
+ <span class="cline-any cline-neutral">&nbsp;</span>
1700
+ <span class="cline-any cline-neutral">&nbsp;</span>
1701
+ <span class="cline-any cline-neutral">&nbsp;</span>
1702
+ <span class="cline-any cline-yes">16x</span>
1703
+ <span class="cline-any cline-yes">18x</span>
1704
+ <span class="cline-any cline-yes">18x</span>
1705
+ <span class="cline-any cline-yes">18x</span>
1706
+ <span class="cline-any cline-yes">1x</span>
1707
+ <span class="cline-any cline-neutral">&nbsp;</span>
1708
+ <span class="cline-any cline-neutral">&nbsp;</span>
1709
+ <span class="cline-any cline-yes">17x</span>
1710
+ <span class="cline-any cline-yes">17x</span>
1711
+ <span class="cline-any cline-no">&nbsp;</span>
1712
+ <span class="cline-any cline-no">&nbsp;</span>
1713
+ <span class="cline-any cline-no">&nbsp;</span>
1714
+ <span class="cline-any cline-neutral">&nbsp;</span>
1715
+ <span class="cline-any cline-neutral">&nbsp;</span>
1716
+ <span class="cline-any cline-neutral">&nbsp;</span>
1717
+ <span class="cline-any cline-neutral">&nbsp;</span>
1718
+ <span class="cline-any cline-neutral">&nbsp;</span>
1719
+ <span class="cline-any cline-yes">16x</span>
1720
+ <span class="cline-any cline-no">&nbsp;</span>
1721
+ <span class="cline-any cline-no">&nbsp;</span>
1722
+ <span class="cline-any cline-no">&nbsp;</span>
1723
+ <span class="cline-any cline-no">&nbsp;</span>
1724
+ <span class="cline-any cline-neutral">&nbsp;</span>
1725
+ <span class="cline-any cline-neutral">&nbsp;</span>
1726
+ <span class="cline-any cline-neutral">&nbsp;</span>
1727
+ <span class="cline-any cline-neutral">&nbsp;</span>
1728
+ <span class="cline-any cline-neutral">&nbsp;</span>
1729
+ <span class="cline-any cline-neutral">&nbsp;</span>
1730
+ <span class="cline-any cline-neutral">&nbsp;</span>
1731
+ <span class="cline-any cline-neutral">&nbsp;</span>
1732
+ <span class="cline-any cline-neutral">&nbsp;</span>
1733
+ <span class="cline-any cline-neutral">&nbsp;</span>
1734
+ <span class="cline-any cline-neutral">&nbsp;</span>
1735
+ <span class="cline-any cline-yes">14x</span>
1736
+ <span class="cline-any cline-yes">14x</span>
1737
+ <span class="cline-any cline-neutral">&nbsp;</span>
1738
+ <span class="cline-any cline-yes">11x</span>
1739
+ <span class="cline-any cline-yes">11x</span>
1740
+ <span class="cline-any cline-neutral">&nbsp;</span>
1741
+ <span class="cline-any cline-yes">11x</span>
1742
+ <span class="cline-any cline-yes">13x</span>
1743
+ <span class="cline-any cline-yes">1x</span>
1744
+ <span class="cline-any cline-neutral">&nbsp;</span>
1745
+ <span class="cline-any cline-neutral">&nbsp;</span>
1746
+ <span class="cline-any cline-yes">13x</span>
1747
+ <span class="cline-any cline-yes">12x</span>
1748
+ <span class="cline-any cline-neutral">&nbsp;</span>
1749
+ <span class="cline-any cline-yes">12x</span>
1750
+ <span class="cline-any cline-yes">1x</span>
1751
+ <span class="cline-any cline-yes">1x</span>
1752
+ <span class="cline-any cline-neutral">&nbsp;</span>
1753
+ <span class="cline-any cline-neutral">&nbsp;</span>
1754
+ <span class="cline-any cline-yes">11x</span>
1755
+ <span class="cline-any cline-neutral">&nbsp;</span>
1756
+ <span class="cline-any cline-neutral">&nbsp;</span>
1757
+ <span class="cline-any cline-neutral">&nbsp;</span>
1758
+ <span class="cline-any cline-neutral">&nbsp;</span>
1759
+ <span class="cline-any cline-neutral">&nbsp;</span>
1760
+ <span class="cline-any cline-neutral">&nbsp;</span>
1761
+ <span class="cline-any cline-neutral">&nbsp;</span>
1762
+ <span class="cline-any cline-yes">11x</span>
1763
+ <span class="cline-any cline-yes">12x</span>
1764
+ <span class="cline-any cline-no">&nbsp;</span>
1765
+ <span class="cline-any cline-neutral">&nbsp;</span>
1766
+ <span class="cline-any cline-neutral">&nbsp;</span>
1767
+ <span class="cline-any cline-neutral">&nbsp;</span>
1768
+ <span class="cline-any cline-yes">11x</span>
1769
+ <span class="cline-any cline-neutral">&nbsp;</span>
1770
+ <span class="cline-any cline-neutral">&nbsp;</span>
1771
+ <span class="cline-any cline-neutral">&nbsp;</span>
1772
+ <span class="cline-any cline-no">&nbsp;</span>
1773
+ <span class="cline-any cline-neutral">&nbsp;</span>
1774
+ <span class="cline-any cline-neutral">&nbsp;</span>
1775
+ <span class="cline-any cline-neutral">&nbsp;</span>
1776
+ <span class="cline-any cline-neutral">&nbsp;</span>
1777
+ <span class="cline-any cline-neutral">&nbsp;</span>
1778
+ <span class="cline-any cline-neutral">&nbsp;</span>
1779
+ <span class="cline-any cline-neutral">&nbsp;</span>
1780
+ <span class="cline-any cline-neutral">&nbsp;</span>
1781
+ <span class="cline-any cline-yes">14x</span>
1782
+ <span class="cline-any cline-yes">14x</span>
1783
+ <span class="cline-any cline-neutral">&nbsp;</span>
1784
+ <span class="cline-any cline-neutral">&nbsp;</span>
1785
+ <span class="cline-any cline-neutral">&nbsp;</span>
1786
+ <span class="cline-any cline-neutral">&nbsp;</span>
1787
+ <span class="cline-any cline-neutral">&nbsp;</span>
1788
+ <span class="cline-any cline-neutral">&nbsp;</span>
1789
+ <span class="cline-any cline-neutral">&nbsp;</span>
1790
+ <span class="cline-any cline-neutral">&nbsp;</span>
1791
+ <span class="cline-any cline-no">&nbsp;</span>
1792
+ <span class="cline-any cline-no">&nbsp;</span>
1793
+ <span class="cline-any cline-neutral">&nbsp;</span>
1794
+ <span class="cline-any cline-neutral">&nbsp;</span>
1795
+ <span class="cline-any cline-neutral">&nbsp;</span>
1796
+ <span class="cline-any cline-no">&nbsp;</span>
1797
+ <span class="cline-any cline-neutral">&nbsp;</span>
1798
+ <span class="cline-any cline-no">&nbsp;</span>
1799
+ <span class="cline-any cline-no">&nbsp;</span>
1800
+ <span class="cline-any cline-neutral">&nbsp;</span>
1801
+ <span class="cline-any cline-neutral">&nbsp;</span>
1802
+ <span class="cline-any cline-neutral">&nbsp;</span>
1803
+ <span class="cline-any cline-neutral">&nbsp;</span>
1804
+ <span class="cline-any cline-neutral">&nbsp;</span>
1805
+ <span class="cline-any cline-neutral">&nbsp;</span>
1806
+ <span class="cline-any cline-neutral">&nbsp;</span>
1807
+ <span class="cline-any cline-no">&nbsp;</span>
1808
+ <span class="cline-any cline-no">&nbsp;</span>
1809
+ <span class="cline-any cline-neutral">&nbsp;</span>
1810
+ <span class="cline-any cline-neutral">&nbsp;</span>
1811
+ <span class="cline-any cline-neutral">&nbsp;</span>
1812
+ <span class="cline-any cline-no">&nbsp;</span>
1813
+ <span class="cline-any cline-neutral">&nbsp;</span>
1814
+ <span class="cline-any cline-neutral">&nbsp;</span>
1815
+ <span class="cline-any cline-no">&nbsp;</span>
1816
+ <span class="cline-any cline-neutral">&nbsp;</span>
1817
+ <span class="cline-any cline-neutral">&nbsp;</span>
1818
+ <span class="cline-any cline-neutral">&nbsp;</span>
1819
+ <span class="cline-any cline-neutral">&nbsp;</span>
1820
+ <span class="cline-any cline-neutral">&nbsp;</span>
1821
+ <span class="cline-any cline-neutral">&nbsp;</span>
1822
+ <span class="cline-any cline-neutral">&nbsp;</span>
1823
+ <span class="cline-any cline-neutral">&nbsp;</span>
1824
+ <span class="cline-any cline-neutral">&nbsp;</span>
1825
+ <span class="cline-any cline-yes">14x</span>
1826
+ <span class="cline-any cline-yes">14x</span>
1827
+ <span class="cline-any cline-yes">14x</span>
1828
+ <span class="cline-any cline-yes">14x</span>
1829
+ <span class="cline-any cline-neutral">&nbsp;</span>
1830
+ <span class="cline-any cline-neutral">&nbsp;</span>
1831
+ <span class="cline-any cline-neutral">&nbsp;</span>
1832
+ <span class="cline-any cline-neutral">&nbsp;</span>
1833
+ <span class="cline-any cline-neutral">&nbsp;</span>
1834
+ <span class="cline-any cline-yes">14x</span>
1835
+ <span class="cline-any cline-yes">14x</span>
1836
+ <span class="cline-any cline-neutral">&nbsp;</span>
1837
+ <span class="cline-any cline-yes">14x</span>
1838
+ <span class="cline-any cline-yes">11x</span>
1839
+ <span class="cline-any cline-neutral">&nbsp;</span>
1840
+ <span class="cline-any cline-neutral">&nbsp;</span>
1841
+ <span class="cline-any cline-neutral">&nbsp;</span>
1842
+ <span class="cline-any cline-neutral">&nbsp;</span>
1843
+ <span class="cline-any cline-yes">21x</span>
1844
+ <span class="cline-any cline-neutral">&nbsp;</span>
1845
+ <span class="cline-any cline-neutral">&nbsp;</span>
1846
+ <span class="cline-any cline-neutral">&nbsp;</span>
1847
+ <span class="cline-any cline-neutral">&nbsp;</span>
1848
+ <span class="cline-any cline-neutral">&nbsp;</span>
1849
+ <span class="cline-any cline-neutral">&nbsp;</span>
1850
+ <span class="cline-any cline-yes">14x</span>
1851
+ <span class="cline-any cline-neutral">&nbsp;</span>
1852
+ <span class="cline-any cline-neutral">&nbsp;</span>
1853
+ <span class="cline-any cline-neutral">&nbsp;</span>
1854
+ <span class="cline-any cline-neutral">&nbsp;</span>
1855
+ <span class="cline-any cline-neutral">&nbsp;</span>
1856
+ <span class="cline-any cline-neutral">&nbsp;</span>
1857
+ <span class="cline-any cline-neutral">&nbsp;</span>
1858
+ <span class="cline-any cline-neutral">&nbsp;</span>
1859
+ <span class="cline-any cline-neutral">&nbsp;</span>
1860
+ <span class="cline-any cline-neutral">&nbsp;</span>
1861
+ <span class="cline-any cline-neutral">&nbsp;</span>
1862
+ <span class="cline-any cline-neutral">&nbsp;</span>
1863
+ <span class="cline-any cline-neutral">&nbsp;</span>
1864
+ <span class="cline-any cline-neutral">&nbsp;</span>
1865
+ <span class="cline-any cline-neutral">&nbsp;</span>
1866
+ <span class="cline-any cline-yes">17x</span>
1867
+ <span class="cline-any cline-yes">17x</span>
1868
+ <span class="cline-any cline-yes">17x</span>
1869
+ <span class="cline-any cline-yes">17x</span>
1870
+ <span class="cline-any cline-yes">17x</span>
1871
+ <span class="cline-any cline-yes">17x</span>
1872
+ <span class="cline-any cline-yes">17x</span>
1873
+ <span class="cline-any cline-yes">1x</span>
1874
+ <span class="cline-any cline-neutral">&nbsp;</span>
1875
+ <span class="cline-any cline-neutral">&nbsp;</span>
1876
+ <span class="cline-any cline-neutral">&nbsp;</span>
1877
+ <span class="cline-any cline-neutral">&nbsp;</span>
1878
+ <span class="cline-any cline-yes">16x</span>
1879
+ <span class="cline-any cline-neutral">&nbsp;</span>
1880
+ <span class="cline-any cline-neutral">&nbsp;</span>
1881
+ <span class="cline-any cline-neutral">&nbsp;</span>
1882
+ <span class="cline-any cline-neutral">&nbsp;</span>
1883
+ <span class="cline-any cline-neutral">&nbsp;</span>
1884
+ <span class="cline-any cline-yes">16x</span>
1885
+ <span class="cline-any cline-neutral">&nbsp;</span>
1886
+ <span class="cline-any cline-neutral">&nbsp;</span>
1887
+ <span class="cline-any cline-neutral">&nbsp;</span>
1888
+ <span class="cline-any cline-neutral">&nbsp;</span>
1889
+ <span class="cline-any cline-neutral">&nbsp;</span>
1890
+ <span class="cline-any cline-neutral">&nbsp;</span>
1891
+ <span class="cline-any cline-neutral">&nbsp;</span>
1892
+ <span class="cline-any cline-neutral">&nbsp;</span>
1893
+ <span class="cline-any cline-neutral">&nbsp;</span>
1894
+ <span class="cline-any cline-yes">16x</span>
1895
+ <span class="cline-any cline-yes">21x</span>
1896
+ <span class="cline-any cline-yes">16x</span>
1897
+ <span class="cline-any cline-yes">32x</span>
1898
+ <span class="cline-any cline-yes">1x</span>
1899
+ <span class="cline-any cline-yes">16x</span>
1900
+ <span class="cline-any cline-yes">1x</span>
1901
+ <span class="cline-any cline-yes">32x</span>
1902
+ <span class="cline-any cline-neutral">&nbsp;</span>
1903
+ <span class="cline-any cline-neutral">&nbsp;</span>
1904
+ <span class="cline-any cline-yes">16x</span>
1905
+ <span class="cline-any cline-yes">16x</span>
1906
+ <span class="cline-any cline-yes">16x</span>
1907
+ <span class="cline-any cline-yes">16x</span>
1908
+ <span class="cline-any cline-yes">16x</span>
1909
+ <span class="cline-any cline-yes">16x</span>
1910
+ <span class="cline-any cline-neutral">&nbsp;</span>
1911
+ <span class="cline-any cline-yes">16x</span>
1912
+ <span class="cline-any cline-yes">16x</span>
1913
+ <span class="cline-any cline-yes">2x</span>
1914
+ <span class="cline-any cline-yes">2x</span>
1915
+ <span class="cline-any cline-yes">1x</span>
1916
+ <span class="cline-any cline-neutral">&nbsp;</span>
1917
+ <span class="cline-any cline-neutral">&nbsp;</span>
1918
+ <span class="cline-any cline-neutral">&nbsp;</span>
1919
+ <span class="cline-any cline-yes">1x</span>
1920
+ <span class="cline-any cline-yes">1x</span>
1921
+ <span class="cline-any cline-neutral">&nbsp;</span>
1922
+ <span class="cline-any cline-neutral">&nbsp;</span>
1923
+ <span class="cline-any cline-yes">15x</span>
1924
+ <span class="cline-any cline-yes">6x</span>
1925
+ <span class="cline-any cline-yes">5x</span>
1926
+ <span class="cline-any cline-yes">10x</span>
1927
+ <span class="cline-any cline-yes">5x</span>
1928
+ <span class="cline-any cline-yes">5x</span>
1929
+ <span class="cline-any cline-yes">5x</span>
1930
+ <span class="cline-any cline-neutral">&nbsp;</span>
1931
+ <span class="cline-any cline-yes">10x</span>
1932
+ <span class="cline-any cline-yes">14x</span>
1933
+ <span class="cline-any cline-yes">14x</span>
1934
+ <span class="cline-any cline-yes">14x</span>
1935
+ <span class="cline-any cline-neutral">&nbsp;</span>
1936
+ <span class="cline-any cline-yes">14x</span>
1937
+ <span class="cline-any cline-neutral">&nbsp;</span>
1938
+ <span class="cline-any cline-yes">14x</span>
1939
+ <span class="cline-any cline-yes">3x</span>
1940
+ <span class="cline-any cline-neutral">&nbsp;</span>
1941
+ <span class="cline-any cline-yes">14x</span>
1942
+ <span class="cline-any cline-yes">8x</span>
1943
+ <span class="cline-any cline-neutral">&nbsp;</span>
1944
+ <span class="cline-any cline-neutral">&nbsp;</span>
1945
+ <span class="cline-any cline-neutral">&nbsp;</span>
1946
+ <span class="cline-any cline-yes">10x</span>
1947
+ <span class="cline-any cline-yes">1x</span>
1948
+ <span class="cline-any cline-neutral">&nbsp;</span>
1949
+ <span class="cline-any cline-neutral">&nbsp;</span>
1950
+ <span class="cline-any cline-neutral">&nbsp;</span>
1951
+ <span class="cline-any cline-yes">14x</span>
1952
+ <span class="cline-any cline-yes">14x</span>
1953
+ <span class="cline-any cline-yes">15x</span>
1954
+ <span class="cline-any cline-neutral">&nbsp;</span>
1955
+ <span class="cline-any cline-yes">15x</span>
1956
+ <span class="cline-any cline-yes">16x</span>
1957
+ <span class="cline-any cline-yes">16x</span>
1958
+ <span class="cline-any cline-yes">16x</span>
1959
+ <span class="cline-any cline-neutral">&nbsp;</span>
1960
+ <span class="cline-any cline-neutral">&nbsp;</span>
1961
+ <span class="cline-any cline-neutral">&nbsp;</span>
1962
+ <span class="cline-any cline-neutral">&nbsp;</span>
1963
+ <span class="cline-any cline-neutral">&nbsp;</span>
1964
+ <span class="cline-any cline-neutral">&nbsp;</span>
1965
+ <span class="cline-any cline-neutral">&nbsp;</span>
1966
+ <span class="cline-any cline-neutral">&nbsp;</span>
1967
+ <span class="cline-any cline-neutral">&nbsp;</span>
1968
+ <span class="cline-any cline-neutral">&nbsp;</span>
1969
+ <span class="cline-any cline-yes">15x</span>
1970
+ <span class="cline-any cline-yes">2x</span>
1971
+ <span class="cline-any cline-yes">2x</span>
1972
+ <span class="cline-any cline-yes">4x</span>
1973
+ <span class="cline-any cline-yes">4x</span>
1974
+ <span class="cline-any cline-neutral">&nbsp;</span>
1975
+ <span class="cline-any cline-yes">2x</span>
1976
+ <span class="cline-any cline-yes">2x</span>
1977
+ <span class="cline-any cline-yes">4x</span>
1978
+ <span class="cline-any cline-neutral">&nbsp;</span>
1979
+ <span class="cline-any cline-neutral">&nbsp;</span>
1980
+ <span class="cline-any cline-neutral">&nbsp;</span>
1981
+ <span class="cline-any cline-neutral">&nbsp;</span>
1982
+ <span class="cline-any cline-yes">14x</span>
1983
+ <span class="cline-any cline-yes">14x</span>
1984
+ <span class="cline-any cline-yes">12x</span>
1985
+ <span class="cline-any cline-yes">12x</span>
1986
+ <span class="cline-any cline-neutral">&nbsp;</span>
1987
+ <span class="cline-any cline-yes">12x</span>
1988
+ <span class="cline-any cline-neutral">&nbsp;</span>
1989
+ <span class="cline-any cline-yes">12x</span>
1990
+ <span class="cline-any cline-yes">12x</span>
1991
+ <span class="cline-any cline-neutral">&nbsp;</span>
1992
+ <span class="cline-any cline-yes">12x</span>
1993
+ <span class="cline-any cline-no">&nbsp;</span>
1994
+ <span class="cline-any cline-no">&nbsp;</span>
1995
+ <span class="cline-any cline-neutral">&nbsp;</span>
1996
+ <span class="cline-any cline-neutral">&nbsp;</span>
1997
+ <span class="cline-any cline-neutral">&nbsp;</span>
1998
+ <span class="cline-any cline-neutral">&nbsp;</span>
1999
+ <span class="cline-any cline-yes">14x</span>
2000
+ <span class="cline-any cline-yes">14x</span>
2001
+ <span class="cline-any cline-yes">10x</span>
2002
+ <span class="cline-any cline-yes">10x</span>
2003
+ <span class="cline-any cline-neutral">&nbsp;</span>
2004
+ <span class="cline-any cline-yes">10x</span>
2005
+ <span class="cline-any cline-neutral">&nbsp;</span>
2006
+ <span class="cline-any cline-yes">10x</span>
2007
+ <span class="cline-any cline-yes">10x</span>
2008
+ <span class="cline-any cline-neutral">&nbsp;</span>
2009
+ <span class="cline-any cline-yes">10x</span>
2010
+ <span class="cline-any cline-no">&nbsp;</span>
2011
+ <span class="cline-any cline-no">&nbsp;</span>
2012
+ <span class="cline-any cline-neutral">&nbsp;</span>
2013
+ <span class="cline-any cline-neutral">&nbsp;</span>
2014
+ <span class="cline-any cline-neutral">&nbsp;</span>
2015
+ <span class="cline-any cline-neutral">&nbsp;</span>
2016
+ <span class="cline-any cline-yes">14x</span>
2017
+ <span class="cline-any cline-yes">28x</span>
2018
+ <span class="cline-any cline-yes">28x</span>
2019
+ <span class="cline-any cline-neutral">&nbsp;</span>
2020
+ <span class="cline-any cline-neutral">&nbsp;</span>
2021
+ <span class="cline-any cline-yes">14x</span>
2022
+ <span class="cline-any cline-neutral">&nbsp;</span>
2023
+ <span class="cline-any cline-neutral">&nbsp;</span>
2024
+ <span class="cline-any cline-neutral">&nbsp;</span>
2025
+ <span class="cline-any cline-neutral">&nbsp;</span>
2026
+ <span class="cline-any cline-neutral">&nbsp;</span>
2027
+ <span class="cline-any cline-neutral">&nbsp;</span>
2028
+ <span class="cline-any cline-neutral">&nbsp;</span>
2029
+ <span class="cline-any cline-neutral">&nbsp;</span>
2030
+ <span class="cline-any cline-neutral">&nbsp;</span>
2031
+ <span class="cline-any cline-neutral">&nbsp;</span>
2032
+ <span class="cline-any cline-neutral">&nbsp;</span>
2033
+ <span class="cline-any cline-yes">73x</span>
2034
+ <span class="cline-any cline-yes">73x</span>
2035
+ <span class="cline-any cline-neutral">&nbsp;</span>
2036
+ <span class="cline-any cline-neutral">&nbsp;</span>
2037
+ <span class="cline-any cline-neutral">&nbsp;</span>
2038
+ <span class="cline-any cline-neutral">&nbsp;</span>
2039
+ <span class="cline-any cline-neutral">&nbsp;</span>
2040
+ <span class="cline-any cline-neutral">&nbsp;</span>
2041
+ <span class="cline-any cline-yes">73x</span>
2042
+ <span class="cline-any cline-neutral">&nbsp;</span>
2043
+ <span class="cline-any cline-yes">73x</span>
2044
+ <span class="cline-any cline-neutral">&nbsp;</span>
2045
+ <span class="cline-any cline-neutral">&nbsp;</span>
2046
+ <span class="cline-any cline-yes">88x</span>
2047
+ <span class="cline-any cline-yes">88x</span>
2048
+ <span class="cline-any cline-yes">88x</span>
2049
+ <span class="cline-any cline-neutral">&nbsp;</span>
2050
+ <span class="cline-any cline-yes">88x</span>
2051
+ <span class="cline-any cline-yes">1x</span>
2052
+ <span class="cline-any cline-neutral">&nbsp;</span>
2053
+ <span class="cline-any cline-neutral">&nbsp;</span>
2054
+ <span class="cline-any cline-neutral">&nbsp;</span>
2055
+ <span class="cline-any cline-neutral">&nbsp;</span>
2056
+ <span class="cline-any cline-neutral">&nbsp;</span>
2057
+ <span class="cline-any cline-neutral">&nbsp;</span>
2058
+ <span class="cline-any cline-neutral">&nbsp;</span>
2059
+ <span class="cline-any cline-neutral">&nbsp;</span>
2060
+ <span class="cline-any cline-yes">1x</span>
2061
+ <span class="cline-any cline-neutral">&nbsp;</span>
2062
+ <span class="cline-any cline-neutral">&nbsp;</span>
2063
+ <span class="cline-any cline-yes">87x</span>
2064
+ <span class="cline-any cline-yes">87x</span>
2065
+ <span class="cline-any cline-neutral">&nbsp;</span>
2066
+ <span class="cline-any cline-yes">87x</span>
2067
+ <span class="cline-any cline-neutral">&nbsp;</span>
2068
+ <span class="cline-any cline-neutral">&nbsp;</span>
2069
+ <span class="cline-any cline-neutral">&nbsp;</span>
2070
+ <span class="cline-any cline-neutral">&nbsp;</span>
2071
+ <span class="cline-any cline-neutral">&nbsp;</span>
2072
+ <span class="cline-any cline-neutral">&nbsp;</span>
2073
+ <span class="cline-any cline-neutral">&nbsp;</span>
2074
+ <span class="cline-any cline-neutral">&nbsp;</span>
2075
+ <span class="cline-any cline-neutral">&nbsp;</span>
2076
+ <span class="cline-any cline-yes">14x</span>
2077
+ <span class="cline-any cline-yes">25x</span>
2078
+ <span class="cline-any cline-yes">25x</span>
2079
+ <span class="cline-any cline-yes">25x</span>
2080
+ <span class="cline-any cline-neutral">&nbsp;</span>
2081
+ <span class="cline-any cline-neutral">&nbsp;</span>
2082
+ <span class="cline-any cline-neutral">&nbsp;</span>
2083
+ <span class="cline-any cline-yes">14x</span>
2084
+ <span class="cline-any cline-yes">12x</span>
2085
+ <span class="cline-any cline-yes">12x</span>
2086
+ <span class="cline-any cline-yes">12x</span>
2087
+ <span class="cline-any cline-neutral">&nbsp;</span>
2088
+ <span class="cline-any cline-neutral">&nbsp;</span>
2089
+ <span class="cline-any cline-neutral">&nbsp;</span>
2090
+ <span class="cline-any cline-yes">14x</span>
2091
+ <span class="cline-any cline-yes">1x</span>
2092
+ <span class="cline-any cline-yes">1x</span>
2093
+ <span class="cline-any cline-neutral">&nbsp;</span>
2094
+ <span class="cline-any cline-neutral">&nbsp;</span>
2095
+ <span class="cline-any cline-neutral">&nbsp;</span>
2096
+ <span class="cline-any cline-yes">1x</span>
2097
+ <span class="cline-any cline-neutral">&nbsp;</span>
2098
+ <span class="cline-any cline-neutral">&nbsp;</span>
2099
+ <span class="cline-any cline-neutral">&nbsp;</span>
2100
+ <span class="cline-any cline-yes">14x</span>
2101
+ <span class="cline-any cline-yes">10x</span>
2102
+ <span class="cline-any cline-yes">10x</span>
2103
+ <span class="cline-any cline-yes">10x</span>
2104
+ <span class="cline-any cline-neutral">&nbsp;</span>
2105
+ <span class="cline-any cline-neutral">&nbsp;</span>
2106
+ <span class="cline-any cline-neutral">&nbsp;</span>
2107
+ <span class="cline-any cline-yes">14x</span>
2108
+ <span class="cline-any cline-yes">15x</span>
2109
+ <span class="cline-any cline-yes">15x</span>
2110
+ <span class="cline-any cline-neutral">&nbsp;</span>
2111
+ <span class="cline-any cline-neutral">&nbsp;</span>
2112
+ <span class="cline-any cline-neutral">&nbsp;</span>
2113
+ <span class="cline-any cline-yes">15x</span>
2114
+ <span class="cline-any cline-neutral">&nbsp;</span>
2115
+ <span class="cline-any cline-yes">14x</span>
2116
+ <span class="cline-any cline-neutral">&nbsp;</span>
2117
+ <span class="cline-any cline-neutral">&nbsp;</span>
2118
+ <span class="cline-any cline-neutral">&nbsp;</span>
2119
+ <span class="cline-any cline-yes">14x</span>
2120
+ <span class="cline-any cline-yes">1x</span>
2121
+ <span class="cline-any cline-yes">1x</span>
2122
+ <span class="cline-any cline-yes">1x</span>
2123
+ <span class="cline-any cline-neutral">&nbsp;</span>
2124
+ <span class="cline-any cline-neutral">&nbsp;</span>
2125
+ <span class="cline-any cline-neutral">&nbsp;</span>
2126
+ <span class="cline-any cline-yes">14x</span>
2127
+ <span class="cline-any cline-yes">24x</span>
2128
+ <span class="cline-any cline-yes">24x</span>
2129
+ <span class="cline-any cline-neutral">&nbsp;</span>
2130
+ <span class="cline-any cline-neutral">&nbsp;</span>
2131
+ <span class="cline-any cline-yes">14x</span>
2132
+ <span class="cline-any cline-neutral">&nbsp;</span>
2133
+ <span class="cline-any cline-neutral">&nbsp;</span>
2134
+ <span class="cline-any cline-neutral">&nbsp;</span>
2135
+ <span class="cline-any cline-yes">6x</span>
2136
+ <span class="cline-any cline-yes">38x</span>
2137
+ <span class="cline-any cline-yes">28x</span>
2138
+ <span class="cline-any cline-neutral">&nbsp;</span>
2139
+ <span class="cline-any cline-neutral">&nbsp;</span>
2140
+ <span class="cline-any cline-yes">10x</span>
2141
+ <span class="cline-any cline-no">&nbsp;</span>
2142
+ <span class="cline-any cline-yes">10x</span>
2143
+ <span class="cline-any cline-no">&nbsp;</span>
2144
+ <span class="cline-any cline-yes">10x</span>
2145
+ <span class="cline-any cline-no">&nbsp;</span>
2146
+ <span class="cline-any cline-neutral">&nbsp;</span>
2147
+ <span class="cline-any cline-neutral">&nbsp;</span>
2148
+ <span class="cline-any cline-neutral">&nbsp;</span>
2149
+ <span class="cline-any cline-yes">10x</span>
2150
+ <span class="cline-any cline-no">&nbsp;</span>
2151
+ <span class="cline-any cline-yes">10x</span>
2152
+ <span class="cline-any cline-yes">1x</span>
2153
+ <span class="cline-any cline-yes">10x</span>
2154
+ <span class="cline-any cline-yes">5x</span>
2155
+ <span class="cline-any cline-yes">10x</span>
2156
+ <span class="cline-any cline-neutral">&nbsp;</span>
2157
+ <span class="cline-any cline-neutral">&nbsp;</span>
2158
+ <span class="cline-any cline-neutral">&nbsp;</span>
2159
+ <span class="cline-any cline-neutral">&nbsp;</span>
2160
+ <span class="cline-any cline-yes">21x</span>
2161
+ <span class="cline-any cline-yes">19x</span>
2162
+ <span class="cline-any cline-neutral">&nbsp;</span>
2163
+ <span class="cline-any cline-neutral">&nbsp;</span>
2164
+ <span class="cline-any cline-yes">2x</span>
2165
+ <span class="cline-any cline-yes">2x</span>
2166
+ <span class="cline-any cline-neutral">&nbsp;</span>
2167
+ <span class="cline-any cline-neutral">&nbsp;</span>
2168
+ <span class="cline-any cline-no">&nbsp;</span>
2169
+ <span class="cline-any cline-neutral">&nbsp;</span>
2170
+ <span class="cline-any cline-neutral">&nbsp;</span>
2171
+ <span class="cline-any cline-neutral">&nbsp;</span>
2172
+ <span class="cline-any cline-neutral">&nbsp;</span>
2173
+ <span class="cline-any cline-neutral">&nbsp;</span>
2174
+ <span class="cline-any cline-yes">21x</span>
2175
+ <span class="cline-any cline-yes">19x</span>
2176
+ <span class="cline-any cline-neutral">&nbsp;</span>
2177
+ <span class="cline-any cline-neutral">&nbsp;</span>
2178
+ <span class="cline-any cline-yes">2x</span>
2179
+ <span class="cline-any cline-no">&nbsp;</span>
2180
+ <span class="cline-any cline-neutral">&nbsp;</span>
2181
+ <span class="cline-any cline-neutral">&nbsp;</span>
2182
+ <span class="cline-any cline-yes">2x</span>
2183
+ <span class="cline-any cline-yes">2x</span>
2184
+ <span class="cline-any cline-neutral">&nbsp;</span>
2185
+ <span class="cline-any cline-neutral">&nbsp;</span>
2186
+ <span class="cline-any cline-no">&nbsp;</span>
2187
+ <span class="cline-any cline-neutral">&nbsp;</span>
2188
+ <span class="cline-any cline-neutral">&nbsp;</span>
2189
+ <span class="cline-any cline-neutral">&nbsp;</span>
2190
+ <span class="cline-any cline-yes">1x</span>
2191
+ <span class="cline-any cline-yes">5x</span>
2192
+ <span class="cline-any cline-neutral">&nbsp;</span>
2193
+ <span class="cline-any cline-yes">1x</span>
2194
+ <span class="cline-any cline-neutral">&nbsp;</span>
2195
+ <span class="cline-any cline-neutral">&nbsp;</span>
2196
+ <span class="cline-any cline-neutral">&nbsp;</span>
2197
+ <span class="cline-any cline-neutral">&nbsp;</span>
2198
+ <span class="cline-any cline-neutral">&nbsp;</span>
2199
+ <span class="cline-any cline-neutral">&nbsp;</span>
2200
+ <span class="cline-any cline-neutral">&nbsp;</span>
2201
+ <span class="cline-any cline-neutral">&nbsp;</span>
2202
+ <span class="cline-any cline-neutral">&nbsp;</span>
2203
+ <span class="cline-any cline-neutral">&nbsp;</span>
2204
+ <span class="cline-any cline-neutral">&nbsp;</span>
2205
+ <span class="cline-any cline-yes">81x</span>
2206
+ <span class="cline-any cline-neutral">&nbsp;</span>
2207
+ <span class="cline-any cline-neutral">&nbsp;</span>
2208
+ <span class="cline-any cline-neutral">&nbsp;</span>
2209
+ <span class="cline-any cline-neutral">&nbsp;</span>
2210
+ <span class="cline-any cline-neutral">&nbsp;</span>
2211
+ <span class="cline-any cline-neutral">&nbsp;</span>
2212
+ <span class="cline-any cline-neutral">&nbsp;</span>
2213
+ <span class="cline-any cline-neutral">&nbsp;</span>
2214
+ <span class="cline-any cline-yes">81x</span>
2215
+ <span class="cline-any cline-yes">81x</span>
2216
+ <span class="cline-any cline-neutral">&nbsp;</span>
2217
+ <span class="cline-any cline-yes">81x</span>
2218
+ <span class="cline-any cline-neutral">&nbsp;</span>
2219
+ <span class="cline-any cline-neutral">&nbsp;</span>
2220
+ <span class="cline-any cline-neutral">&nbsp;</span>
2221
+ <span class="cline-any cline-neutral">&nbsp;</span>
2222
+ <span class="cline-any cline-yes">22x</span>
2223
+ <span class="cline-any cline-yes">22x</span>
2224
+ <span class="cline-any cline-neutral">&nbsp;</span>
2225
+ <span class="cline-any cline-neutral">&nbsp;</span>
2226
+ <span class="cline-any cline-yes">81x</span>
2227
+ <span class="cline-any cline-neutral">&nbsp;</span>
2228
+ <span class="cline-any cline-neutral">&nbsp;</span>
2229
+ <span class="cline-any cline-neutral">&nbsp;</span>
2230
+ <span class="cline-any cline-yes">82x</span>
2231
+ <span class="cline-any cline-yes">82x</span>
2232
+ <span class="cline-any cline-neutral">&nbsp;</span>
2233
+ <span class="cline-any cline-yes">82x</span>
2234
+ <span class="cline-any cline-neutral">&nbsp;</span>
2235
+ <span class="cline-any cline-neutral">&nbsp;</span>
2236
+ <span class="cline-any cline-neutral">&nbsp;</span>
2237
+ <span class="cline-any cline-neutral">&nbsp;</span>
2238
+ <span class="cline-any cline-neutral">&nbsp;</span>
2239
+ <span class="cline-any cline-neutral">&nbsp;</span>
2240
+ <span class="cline-any cline-neutral">&nbsp;</span>
2241
+ <span class="cline-any cline-yes">1x</span>
2242
+ <span class="cline-any cline-yes">1x</span>
2243
+ <span class="cline-any cline-yes">1x</span>
2244
+ <span class="cline-any cline-yes">1x</span>
2245
+ <span class="cline-any cline-neutral">&nbsp;</span>
2246
+ <span class="cline-any cline-yes">1x</span>
2247
+ <span class="cline-any cline-yes">1x</span>
2248
+ <span class="cline-any cline-yes">1x</span>
2249
+ <span class="cline-any cline-neutral">&nbsp;</span>
2250
+ <span class="cline-any cline-yes">1x</span>
2251
+ <span class="cline-any cline-yes">1x</span>
2252
+ <span class="cline-any cline-neutral">&nbsp;</span>
2253
+ <span class="cline-any cline-neutral">&nbsp;</span>
2254
+ <span class="cline-any cline-no">&nbsp;</span>
2255
+ <span class="cline-any cline-neutral">&nbsp;</span>
2256
+ <span class="cline-any cline-neutral">&nbsp;</span>
2257
+ <span class="cline-any cline-neutral">&nbsp;</span>
2258
+ <span class="cline-any cline-neutral">&nbsp;</span>
2259
+ <span class="cline-any cline-no">&nbsp;</span>
2260
+ <span class="cline-any cline-neutral">&nbsp;</span>
2261
+ <span class="cline-any cline-neutral">&nbsp;</span>
2262
+ <span class="cline-any cline-neutral">&nbsp;</span>
2263
+ <span class="cline-any cline-neutral">&nbsp;</span>
2264
+ <span class="cline-any cline-neutral">&nbsp;</span>
2265
+ <span class="cline-any cline-neutral">&nbsp;</span>
2266
+ <span class="cline-any cline-no">&nbsp;</span>
2267
+ <span class="cline-any cline-neutral">&nbsp;</span>
2268
+ <span class="cline-any cline-neutral">&nbsp;</span>
2269
+ <span class="cline-any cline-neutral">&nbsp;</span>
2270
+ <span class="cline-any cline-neutral">&nbsp;</span>
2271
+ <span class="cline-any cline-neutral">&nbsp;</span>
2272
+ <span class="cline-any cline-neutral">&nbsp;</span>
2273
+ <span class="cline-any cline-neutral">&nbsp;</span>
2274
+ <span class="cline-any cline-neutral">&nbsp;</span>
2275
+ <span class="cline-any cline-neutral">&nbsp;</span>
2276
+ <span class="cline-any cline-neutral">&nbsp;</span>
2277
+ <span class="cline-any cline-neutral">&nbsp;</span>
2278
+ <span class="cline-any cline-yes">1x</span>
2279
+ <span class="cline-any cline-neutral">&nbsp;</span>
2280
+ <span class="cline-any cline-neutral">&nbsp;</span>
2281
+ <span class="cline-any cline-neutral">&nbsp;</span>
2282
+ <span class="cline-any cline-neutral">&nbsp;</span>
2283
+ <span class="cline-any cline-neutral">&nbsp;</span>
2284
+ <span class="cline-any cline-neutral">&nbsp;</span>
2285
+ <span class="cline-any cline-neutral">&nbsp;</span>
2286
+ <span class="cline-any cline-neutral">&nbsp;</span>
2287
+ <span class="cline-any cline-neutral">&nbsp;</span>
2288
+ <span class="cline-any cline-neutral">&nbsp;</span>
2289
+ <span class="cline-any cline-neutral">&nbsp;</span>
2290
+ <span class="cline-any cline-neutral">&nbsp;</span>
2291
+ <span class="cline-any cline-neutral">&nbsp;</span>
2292
+ <span class="cline-any cline-neutral">&nbsp;</span>
2293
+ <span class="cline-any cline-neutral">&nbsp;</span>
2294
+ <span class="cline-any cline-neutral">&nbsp;</span>
2295
+ <span class="cline-any cline-neutral">&nbsp;</span>
2296
+ <span class="cline-any cline-neutral">&nbsp;</span>
2297
+ <span class="cline-any cline-neutral">&nbsp;</span>
2298
+ <span class="cline-any cline-neutral">&nbsp;</span>
2299
+ <span class="cline-any cline-neutral">&nbsp;</span>
2300
+ <span class="cline-any cline-neutral">&nbsp;</span>
2301
+ <span class="cline-any cline-yes">1x</span>
2302
+ <span class="cline-any cline-neutral">&nbsp;</span>
2303
+ <span class="cline-any cline-neutral">&nbsp;</span>
2304
+ <span class="cline-any cline-neutral">&nbsp;</span>
2305
+ <span class="cline-any cline-neutral">&nbsp;</span>
2306
+ <span class="cline-any cline-yes">3x</span>
2307
+ <span class="cline-any cline-yes">7x</span>
2308
+ <span class="cline-any cline-yes">3x</span>
2309
+ <span class="cline-any cline-neutral">&nbsp;</span>
2310
+ <span class="cline-any cline-neutral">&nbsp;</span>
2311
+ <span class="cline-any cline-yes">1x</span>
2312
+ <span class="cline-any cline-yes">1x</span>
2313
+ <span class="cline-any cline-yes">1x</span>
2314
+ <span class="cline-any cline-neutral">&nbsp;</span>
2315
+ <span class="cline-any cline-yes">4x</span>
2316
+ <span class="cline-any cline-neutral">&nbsp;</span>
2317
+ <span class="cline-any cline-neutral">&nbsp;</span>
2318
+ <span class="cline-any cline-yes">1x</span>
2319
+ <span class="cline-any cline-neutral">&nbsp;</span>
2320
+ <span class="cline-any cline-neutral">&nbsp;</span>
2321
+ <span class="cline-any cline-yes">1x</span>
2322
+ <span class="cline-any cline-neutral">&nbsp;</span>
2323
+ <span class="cline-any cline-neutral">&nbsp;</span>
2324
+ <span class="cline-any cline-neutral">&nbsp;</span>
2325
+ <span class="cline-any cline-neutral">&nbsp;</span>
2326
+ <span class="cline-any cline-neutral">&nbsp;</span>
2327
+ <span class="cline-any cline-neutral">&nbsp;</span>
2328
+ <span class="cline-any cline-neutral">&nbsp;</span>
2329
+ <span class="cline-any cline-yes">1x</span>
2330
+ <span class="cline-any cline-yes">1x</span>
2331
+ <span class="cline-any cline-neutral">&nbsp;</span>
2332
+ <span class="cline-any cline-neutral">&nbsp;</span>
2333
+ <span class="cline-any cline-yes">1x</span>
2334
+ <span class="cline-any cline-neutral">&nbsp;</span>
2335
+ <span class="cline-any cline-neutral">&nbsp;</span>
2336
+ <span class="cline-any cline-neutral">&nbsp;</span>
2337
+ <span class="cline-any cline-yes">1x</span>
2338
+ <span class="cline-any cline-neutral">&nbsp;</span>
2339
+ <span class="cline-any cline-yes">1x</span>
2340
+ <span class="cline-any cline-neutral">&nbsp;</span>
2341
+ <span class="cline-any cline-neutral">&nbsp;</span>
2342
+ <span class="cline-any cline-yes">20x</span>
2343
+ <span class="cline-any cline-neutral">&nbsp;</span>
2344
+ <span class="cline-any cline-neutral">&nbsp;</span>
2345
+ <span class="cline-any cline-neutral">&nbsp;</span>
2346
+ <span class="cline-any cline-neutral">&nbsp;</span>
2347
+ <span class="cline-any cline-yes">21x</span>
2348
+ <span class="cline-any cline-yes">21x</span>
2349
+ <span class="cline-any cline-yes">21x</span>
2350
+ <span class="cline-any cline-neutral">&nbsp;</span>
2351
+ <span class="cline-any cline-yes">21x</span>
2352
+ <span class="cline-any cline-no">&nbsp;</span>
2353
+ <span class="cline-any cline-neutral">&nbsp;</span>
2354
+ <span class="cline-any cline-yes">21x</span>
2355
+ <span class="cline-any cline-yes">21x</span>
2356
+ <span class="cline-any cline-yes">21x</span>
2357
+ <span class="cline-any cline-neutral">&nbsp;</span>
2358
+ <span class="cline-any cline-yes">20x</span>
2359
+ <span class="cline-any cline-yes">20x</span>
2360
+ <span class="cline-any cline-yes">1x</span>
2361
+ <span class="cline-any cline-neutral">&nbsp;</span>
2362
+ <span class="cline-any cline-neutral">&nbsp;</span>
2363
+ <span class="cline-any cline-neutral">&nbsp;</span>
2364
+ <span class="cline-any cline-yes">19x</span>
2365
+ <span class="cline-any cline-no">&nbsp;</span>
2366
+ <span class="cline-any cline-neutral">&nbsp;</span>
2367
+ <span class="cline-any cline-neutral">&nbsp;</span>
2368
+ <span class="cline-any cline-neutral">&nbsp;</span>
2369
+ <span class="cline-any cline-neutral">&nbsp;</span>
2370
+ <span class="cline-any cline-yes">19x</span>
2371
+ <span class="cline-any cline-neutral">&nbsp;</span>
2372
+ <span class="cline-any cline-yes">17x</span>
2373
+ <span class="cline-any cline-yes">17x</span>
2374
+ <span class="cline-any cline-neutral">&nbsp;</span>
2375
+ <span class="cline-any cline-yes">17x</span>
2376
+ <span class="cline-any cline-yes">17x</span>
2377
+ <span class="cline-any cline-neutral">&nbsp;</span>
2378
+ <span class="cline-any cline-yes">17x</span>
2379
+ <span class="cline-any cline-neutral">&nbsp;</span>
2380
+ <span class="cline-any cline-neutral">&nbsp;</span>
2381
+ <span class="cline-any cline-neutral">&nbsp;</span>
2382
+ <span class="cline-any cline-neutral">&nbsp;</span>
2383
+ <span class="cline-any cline-neutral">&nbsp;</span>
2384
+ <span class="cline-any cline-neutral">&nbsp;</span>
2385
+ <span class="cline-any cline-neutral">&nbsp;</span>
2386
+ <span class="cline-any cline-yes">88x</span>
2387
+ <span class="cline-any cline-neutral">&nbsp;</span>
2388
+ <span class="cline-any cline-yes">14x</span>
2389
+ <span class="cline-any cline-yes">1x</span>
2390
+ <span class="cline-any cline-neutral">&nbsp;</span>
2391
+ <span class="cline-any cline-yes">4x</span>
2392
+ <span class="cline-any cline-neutral">&nbsp;</span>
2393
+ <span class="cline-any cline-yes">1x</span>
2394
+ <span class="cline-any cline-neutral">&nbsp;</span>
2395
+ <span class="cline-any cline-yes">1x</span>
2396
+ <span class="cline-any cline-neutral">&nbsp;</span>
2397
+ <span class="cline-any cline-neutral">&nbsp;</span>
2398
+ <span class="cline-any cline-neutral">&nbsp;</span>
2399
+ <span class="cline-any cline-neutral">&nbsp;</span>
2400
+ <span class="cline-any cline-yes">13x</span>
2401
+ <span class="cline-any cline-yes">6x</span>
2402
+ <span class="cline-any cline-neutral">&nbsp;</span>
2403
+ <span class="cline-any cline-neutral">&nbsp;</span>
2404
+ <span class="cline-any cline-yes">13x</span>
2405
+ <span class="cline-any cline-yes">81x</span>
2406
+ <span class="cline-any cline-neutral">&nbsp;</span>
2407
+ <span class="cline-any cline-yes">5x</span>
2408
+ <span class="cline-any cline-neutral">&nbsp;</span>
2409
+ <span class="cline-any cline-neutral">&nbsp;</span>
2410
+ <span class="cline-any cline-neutral">&nbsp;</span>
2411
+ <span class="cline-any cline-neutral">&nbsp;</span>
2412
+ <span class="cline-any cline-yes">13x</span>
2413
+ <span class="cline-any cline-yes">81x</span>
2414
+ <span class="cline-any cline-neutral">&nbsp;</span>
2415
+ <span class="cline-any cline-yes">19x</span>
2416
+ <span class="cline-any cline-neutral">&nbsp;</span>
2417
+ <span class="cline-any cline-neutral">&nbsp;</span>
2418
+ <span class="cline-any cline-neutral">&nbsp;</span>
2419
+ <span class="cline-any cline-neutral">&nbsp;</span>
2420
+ <span class="cline-any cline-yes">13x</span>
2421
+ <span class="cline-any cline-yes">81x</span>
2422
+ <span class="cline-any cline-neutral">&nbsp;</span>
2423
+ <span class="cline-any cline-yes">57x</span>
2424
+ <span class="cline-any cline-neutral">&nbsp;</span>
2425
+ <span class="cline-any cline-neutral">&nbsp;</span>
2426
+ <span class="cline-any cline-neutral">&nbsp;</span>
2427
+ <span class="cline-any cline-neutral">&nbsp;</span>
2428
+ <span class="cline-any cline-neutral">&nbsp;</span>
2429
+ <span class="cline-any cline-yes">13x</span>
2430
+ <span class="cline-any cline-yes">81x</span>
2431
+ <span class="cline-any cline-yes">81x</span>
2432
+ <span class="cline-any cline-yes">81x</span>
2433
+ <span class="cline-any cline-yes">81x</span>
2434
+ <span class="cline-any cline-yes">81x</span>
2435
+ <span class="cline-any cline-yes">81x</span>
2436
+ <span class="cline-any cline-yes">81x</span>
2437
+ <span class="cline-any cline-neutral">&nbsp;</span>
2438
+ <span class="cline-any cline-neutral">&nbsp;</span>
2439
+ <span class="cline-any cline-yes">13x</span>
2440
+ <span class="cline-any cline-neutral">&nbsp;</span>
2441
+ <span class="cline-any cline-neutral">&nbsp;</span>
2442
+ <span class="cline-any cline-neutral">&nbsp;</span>
2443
+ <span class="cline-any cline-neutral">&nbsp;</span>
2444
+ <span class="cline-any cline-neutral">&nbsp;</span>
2445
+ <span class="cline-any cline-neutral">&nbsp;</span>
2446
+ <span class="cline-any cline-neutral">&nbsp;</span>
2447
+ <span class="cline-any cline-neutral">&nbsp;</span>
2448
+ <span class="cline-any cline-neutral">&nbsp;</span>
2449
+ <span class="cline-any cline-neutral">&nbsp;</span>
2450
+ <span class="cline-any cline-neutral">&nbsp;</span>
2451
+ <span class="cline-any cline-neutral">&nbsp;</span>
2452
+ <span class="cline-any cline-neutral">&nbsp;</span>
2453
+ <span class="cline-any cline-neutral">&nbsp;</span>
2454
+ <span class="cline-any cline-neutral">&nbsp;</span>
2455
+ <span class="cline-any cline-neutral">&nbsp;</span>
2456
+ <span class="cline-any cline-yes">13x</span>
2457
+ <span class="cline-any cline-yes">1x</span>
2458
+ <span class="cline-any cline-neutral">&nbsp;</span>
2459
+ <span class="cline-any cline-neutral">&nbsp;</span>
2460
+ <span class="cline-any cline-yes">13x</span>
2461
+ <span class="cline-any cline-neutral">&nbsp;</span>
2462
+ <span class="cline-any cline-neutral">&nbsp;</span>
2463
+ <span class="cline-any cline-neutral">&nbsp;</span>
2464
+ <span class="cline-any cline-yes">2x</span>
2465
+ <span class="cline-any cline-yes">1x</span>
2466
+ <span class="cline-any cline-neutral">&nbsp;</span>
2467
+ <span class="cline-any cline-neutral">&nbsp;</span>
2468
+ <span class="cline-any cline-yes">1x</span>
2469
+ <span class="cline-any cline-yes">1x</span>
2470
+ <span class="cline-any cline-yes">2x</span>
2471
+ <span class="cline-any cline-neutral">&nbsp;</span>
2472
+ <span class="cline-any cline-yes">1x</span>
2473
+ <span class="cline-any cline-neutral">&nbsp;</span>
2474
+ <span class="cline-any cline-neutral">&nbsp;</span>
2475
+ <span class="cline-any cline-neutral">&nbsp;</span>
2476
+ <span class="cline-any cline-yes">1x</span>
2477
+ <span class="cline-any cline-no">&nbsp;</span>
2478
+ <span class="cline-any cline-neutral">&nbsp;</span>
2479
+ <span class="cline-any cline-neutral">&nbsp;</span>
2480
+ <span class="cline-any cline-yes">1x</span>
2481
+ <span class="cline-any cline-yes">1x</span>
2482
+ <span class="cline-any cline-yes">4x</span>
2483
+ <span class="cline-any cline-neutral">&nbsp;</span>
2484
+ <span class="cline-any cline-neutral">&nbsp;</span>
2485
+ <span class="cline-any cline-neutral">&nbsp;</span>
2486
+ <span class="cline-any cline-neutral">&nbsp;</span>
2487
+ <span class="cline-any cline-neutral">&nbsp;</span>
2488
+ <span class="cline-any cline-neutral">&nbsp;</span>
2489
+ <span class="cline-any cline-yes">1x</span>
2490
+ <span class="cline-any cline-no">&nbsp;</span>
2491
+ <span class="cline-any cline-neutral">&nbsp;</span>
2492
+ <span class="cline-any cline-yes">1x</span>
2493
+ <span class="cline-any cline-neutral">&nbsp;</span>
2494
+ <span class="cline-any cline-neutral">&nbsp;</span>
2495
+ <span class="cline-any cline-neutral">&nbsp;</span>
2496
+ <span class="cline-any cline-neutral">&nbsp;</span>
2497
+ <span class="cline-any cline-neutral">&nbsp;</span>
2498
+ <span class="cline-any cline-neutral">&nbsp;</span>
2499
+ <span class="cline-any cline-yes">1x</span>
2500
+ <span class="cline-any cline-yes">1x</span>
2501
+ <span class="cline-any cline-yes">1x</span>
2502
+ <span class="cline-any cline-yes">1x</span>
2503
+ <span class="cline-any cline-yes">1x</span>
2504
+ <span class="cline-any cline-yes">1x</span>
2505
+ <span class="cline-any cline-no">&nbsp;</span>
2506
+ <span class="cline-any cline-neutral">&nbsp;</span>
2507
+ <span class="cline-any cline-yes">1x</span>
2508
+ <span class="cline-any cline-no">&nbsp;</span>
2509
+ <span class="cline-any cline-neutral">&nbsp;</span>
2510
+ <span class="cline-any cline-yes">1x</span>
2511
+ <span class="cline-any cline-no">&nbsp;</span>
2512
+ <span class="cline-any cline-neutral">&nbsp;</span>
2513
+ <span class="cline-any cline-yes">1x</span>
2514
+ <span class="cline-any cline-no">&nbsp;</span>
2515
+ <span class="cline-any cline-neutral">&nbsp;</span>
2516
+ <span class="cline-any cline-yes">1x</span>
2517
+ <span class="cline-any cline-yes">1x</span>
2518
+ <span class="cline-any cline-yes">1x</span>
2519
+ <span class="cline-any cline-neutral">&nbsp;</span>
2520
+ <span class="cline-any cline-neutral">&nbsp;</span>
2521
+ <span class="cline-any cline-yes">1x</span>
2522
+ <span class="cline-any cline-yes">1x</span>
2523
+ <span class="cline-any cline-yes">1x</span>
2524
+ <span class="cline-any cline-yes">1x</span>
2525
+ <span class="cline-any cline-yes">1x</span>
2526
+ <span class="cline-any cline-neutral">&nbsp;</span>
2527
+ <span class="cline-any cline-yes">1x</span>
2528
+ <span class="cline-any cline-yes">1x</span>
2529
+ <span class="cline-any cline-yes">1x</span>
2530
+ <span class="cline-any cline-no">&nbsp;</span>
2531
+ <span class="cline-any cline-neutral">&nbsp;</span>
2532
+ <span class="cline-any cline-yes">1x</span>
2533
+ <span class="cline-any cline-neutral">&nbsp;</span>
2534
+ <span class="cline-any cline-yes">1x</span>
2535
+ <span class="cline-any cline-no">&nbsp;</span>
2536
+ <span class="cline-any cline-no">&nbsp;</span>
2537
+ <span class="cline-any cline-neutral">&nbsp;</span>
2538
+ <span class="cline-any cline-neutral">&nbsp;</span>
2539
+ <span class="cline-any cline-yes">1x</span>
2540
+ <span class="cline-any cline-yes">1x</span>
2541
+ <span class="cline-any cline-neutral">&nbsp;</span>
2542
+ <span class="cline-any cline-neutral">&nbsp;</span>
2543
+ <span class="cline-any cline-yes">1x</span>
2544
+ <span class="cline-any cline-neutral">&nbsp;</span>
2545
+ <span class="cline-any cline-neutral">&nbsp;</span>
2546
+ <span class="cline-any cline-yes">1x</span>
2547
+ <span class="cline-any cline-neutral">&nbsp;</span>
2548
+ <span class="cline-any cline-neutral">&nbsp;</span>
2549
+ <span class="cline-any cline-neutral">&nbsp;</span>
2550
+ <span class="cline-any cline-neutral">&nbsp;</span>
2551
+ <span class="cline-any cline-neutral">&nbsp;</span>
2552
+ <span class="cline-any cline-neutral">&nbsp;</span>
2553
+ <span class="cline-any cline-neutral">&nbsp;</span>
2554
+ <span class="cline-any cline-neutral">&nbsp;</span>
2555
+ <span class="cline-any cline-neutral">&nbsp;</span>
2556
+ <span class="cline-any cline-neutral">&nbsp;</span>
2557
+ <span class="cline-any cline-neutral">&nbsp;</span>
2558
+ <span class="cline-any cline-neutral">&nbsp;</span>
2559
+ <span class="cline-any cline-yes">1x</span>
2560
+ <span class="cline-any cline-neutral">&nbsp;</span>
2561
+ <span class="cline-any cline-neutral">&nbsp;</span>
2562
+ <span class="cline-any cline-neutral">&nbsp;</span>
2563
+ <span class="cline-any cline-neutral">&nbsp;</span>
2564
+ <span class="cline-any cline-neutral">&nbsp;</span>
2565
+ <span class="cline-any cline-neutral">&nbsp;</span>
2566
+ <span class="cline-any cline-neutral">&nbsp;</span>
2567
+ <span class="cline-any cline-neutral">&nbsp;</span>
2568
+ <span class="cline-any cline-neutral">&nbsp;</span>
2569
+ <span class="cline-any cline-neutral">&nbsp;</span>
2570
+ <span class="cline-any cline-neutral">&nbsp;</span>
2571
+ <span class="cline-any cline-neutral">&nbsp;</span>
2572
+ <span class="cline-any cline-neutral">&nbsp;</span>
2573
+ <span class="cline-any cline-neutral">&nbsp;</span>
2574
+ <span class="cline-any cline-neutral">&nbsp;</span>
2575
+ <span class="cline-any cline-neutral">&nbsp;</span>
2576
+ <span class="cline-any cline-neutral">&nbsp;</span>
2577
+ <span class="cline-any cline-neutral">&nbsp;</span>
2578
+ <span class="cline-any cline-neutral">&nbsp;</span>
2579
+ <span class="cline-any cline-neutral">&nbsp;</span>
2580
+ <span class="cline-any cline-neutral">&nbsp;</span>
2581
+ <span class="cline-any cline-neutral">&nbsp;</span>
2582
+ <span class="cline-any cline-neutral">&nbsp;</span>
2583
+ <span class="cline-any cline-neutral">&nbsp;</span>
2584
+ <span class="cline-any cline-neutral">&nbsp;</span>
2585
+ <span class="cline-any cline-neutral">&nbsp;</span>
2586
+ <span class="cline-any cline-neutral">&nbsp;</span>
2587
+ <span class="cline-any cline-neutral">&nbsp;</span>
2588
+ <span class="cline-any cline-neutral">&nbsp;</span>
2589
+ <span class="cline-any cline-neutral">&nbsp;</span>
2590
+ <span class="cline-any cline-neutral">&nbsp;</span>
2591
+ <span class="cline-any cline-neutral">&nbsp;</span>
2592
+ <span class="cline-any cline-neutral">&nbsp;</span>
2593
+ <span class="cline-any cline-neutral">&nbsp;</span>
2594
+ <span class="cline-any cline-neutral">&nbsp;</span>
2595
+ <span class="cline-any cline-neutral">&nbsp;</span>
2596
+ <span class="cline-any cline-neutral">&nbsp;</span>
2597
+ <span class="cline-any cline-neutral">&nbsp;</span>
2598
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as fs from "fs";
2599
+ import * as path from "path";
2600
+ &nbsp;
2601
+ import type {
2602
+ Attribute,
2603
+ Condition,
2604
+ EntityType,
2605
+ GroupSegment,
2606
+ ParsedFeature,
2607
+ Rule,
2608
+ RulesByEnvironment,
2609
+ Schema,
2610
+ Segment,
2611
+ Group,
2612
+ Target,
2613
+ Test,
2614
+ } from "@featurevisor/types";
2615
+ &nbsp;
2616
+ import type { ProjectConfig } from "../config";
2617
+ import type { Datasource } from "../datasource";
2618
+ import { lintProject, type LintErrorItem } from "../linter";
2619
+ import {
2620
+ CLI_COLOR_CYAN,
2621
+ CLI_COLOR_DIM,
2622
+ CLI_COLOR_GREEN,
2623
+ CLI_COLOR_YELLOW,
2624
+ CLI_FORMAT_BOLD,
2625
+ CLI_FORMAT_GREEN,
2626
+ colorize,
2627
+ } from "../tester/cliFormat";
2628
+ import { prettyDuration } from "../tester/prettyDuration";
2629
+ import type { Plugin } from "../cli";
2630
+ &nbsp;
2631
+ type ConflictPolicy = "source" | "destination" | "fail";
2632
+ type PromotionAuditFormat = "json" | "markdown";
2633
+ type EntityValue =
2634
+ | Attribute
2635
+ | Segment
2636
+ | ParsedFeature
2637
+ | Group
2638
+ | Record&lt;string, unknown&gt;
2639
+ | Schema
2640
+ | Target
2641
+ | Test;
2642
+ &nbsp;
2643
+ interface PromotionConflict {
2644
+ type: EntityType;
2645
+ key: string;
2646
+ path: string;
2647
+ source: unknown;
2648
+ destination: unknown;
2649
+ }
2650
+ &nbsp;
2651
+ interface EntityPlan {
2652
+ type: EntityType;
2653
+ key: string;
2654
+ source: EntityValue;
2655
+ destination?: EntityValue;
2656
+ merged: EntityValue;
2657
+ conflicts: PromotionConflict[];
2658
+ }
2659
+ &nbsp;
2660
+ export interface PromoteProjectSetsOptions {
2661
+ from?: string;
2662
+ to?: string;
2663
+ includeFeatures?: string | string[];
2664
+ excludeFeatures?: string | string[];
2665
+ target?: string | string[];
2666
+ tag?: string | string[];
2667
+ conflicts?: ConflictPolicy;
2668
+ allowEmpty?: boolean;
2669
+ apply?: boolean;
2670
+ audit?: boolean | PromotionAuditFormat;
2671
+ showUnchanged?: boolean;
2672
+ }
2673
+ &nbsp;
2674
+ export interface PromoteProjectSetsResult {
2675
+ from: string;
2676
+ to: string;
2677
+ apply: boolean;
2678
+ duration: number;
2679
+ filters: {
2680
+ includeFeatures: string[];
2681
+ excludeFeatures: string[];
2682
+ targets: string[];
2683
+ tags: string[];
2684
+ conflicts: ConflictPolicy;
2685
+ };
2686
+ dependencies: Record&lt;EntityType, number&gt;;
2687
+ files: {
2688
+ created: string[];
2689
+ updated: string[];
2690
+ unchanged: string[];
2691
+ };
2692
+ conflicts: PromotionConflict[];
2693
+ auditFilePath?: string;
2694
+ }
2695
+ &nbsp;
2696
+ function isPromotable(entity: { promotable?: boolean } | undefined) {
2697
+ return entity?.promotable !== false;
2698
+ }
2699
+ &nbsp;
2700
+ function toArray(value: string | string[] | undefined): string[] {
2701
+ if (typeof value === "undefined") {
2702
+ return [];
2703
+ }
2704
+ &nbsp;
2705
+ return Array.isArray(value) ? value : [value];
2706
+ }
2707
+ &nbsp;
2708
+ function isPlainObject(value: unknown): value is Record&lt;string, unknown&gt; {
2709
+ return typeof value === "object" &amp;&amp; value !== null &amp;&amp; !Array.isArray(value);
2710
+ }
2711
+ &nbsp;
2712
+ function deepEqual(left: unknown, right: unknown): boolean {
2713
+ return JSON.stringify(left) === JSON.stringify(right);
2714
+ }
2715
+ &nbsp;
2716
+ function deepMergeWithPolicy(
2717
+ destination: unknown,
2718
+ source: unknown,
2719
+ policy: ConflictPolicy,
2720
+ conflicts: Array&lt;Omit&lt;PromotionConflict, "type" | "key"&gt;&gt;,
2721
+ pathSegments: string[] = [],
2722
+ ): unknown {
2723
+ if (typeof destination === "undefined") return source;
2724
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof source === "undefined") <span class="cstat-no" title="statement not covered" >return destination;</span>
2725
+ &nbsp;
2726
+ const conflictPath = pathSegments.join(".") || "&lt;root&gt;";
2727
+ &nbsp;
2728
+ if (Array.isArray(destination) &amp;&amp; Array.isArray(source)) {
2729
+ if (!deepEqual(destination, source)) {
2730
+ conflicts.push({ path: conflictPath, source, destination });
2731
+ }
2732
+ &nbsp;
2733
+ return policy === "destination" ? destination : source;
2734
+ }
2735
+ &nbsp;
2736
+ if (isPlainObject(destination) &amp;&amp; isPlainObject(source)) {
2737
+ const result: Record&lt;string, unknown&gt; = { ...destination };
2738
+ &nbsp;
2739
+ for (const key of Object.keys(source)) {
2740
+ result[key] = deepMergeWithPolicy(result[key], source[key], policy, conflicts, [
2741
+ ...pathSegments,
2742
+ key,
2743
+ ]);
2744
+ }
2745
+ &nbsp;
2746
+ return result;
2747
+ }
2748
+ &nbsp;
2749
+ if (!deepEqual(destination, source)) {
2750
+ conflicts.push({ path: conflictPath, source, destination });
2751
+ }
2752
+ &nbsp;
2753
+ return policy === "destination" ? destination : source;
2754
+ }
2755
+ &nbsp;
2756
+ function matchesPattern(key: string, patterns: string[]) {
2757
+ if (patterns.length === 0) {
2758
+ return false;
2759
+ }
2760
+ &nbsp;
2761
+ return patterns.some((pattern) =&gt; {
2762
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&amp;").replace(/\*/g, ".*");
2763
+ return new RegExp(`^${escaped}$`).test(key);
2764
+ });
2765
+ }
2766
+ &nbsp;
2767
+ function matchesTags(candidateTags: string[], selector: Target["tags"]): boolean {
2768
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!selector) <span class="cstat-no" title="statement not covered" >return true;</span>
2769
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(selector)) {
2770
+ <span class="cstat-no" title="statement not covered" > return selector.some(<span class="fstat-no" title="function not covered" >(t</span>ag) =&gt; <span class="cstat-no" title="statement not covered" >candidateTags.includes(tag));</span></span>
2771
+ }
2772
+ <span class="missing-if-branch" title="if path not taken" >I</span>if ("or" in selector) {
2773
+ <span class="cstat-no" title="statement not covered" > return selector.or.some(<span class="fstat-no" title="function not covered" >(t</span>ag) =&gt; <span class="cstat-no" title="statement not covered" >candidateTags.includes(tag));</span></span>
2774
+ }
2775
+ return selector.and.every((tag) =&gt; candidateTags.includes(tag));
2776
+ }
2777
+ &nbsp;
2778
+ function matchesTarget(featureKey: string, feature: ParsedFeature, target: Target): boolean {
2779
+ const featureTags = feature.tags || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
2780
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (feature.archived === true) <span class="cstat-no" title="statement not covered" >return false;</span>
2781
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (target.tag &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!featureTags.includes(target.tag)) <span class="cstat-no" title="statement not covered" >r</span>eturn false;</span>
2782
+ if (target.tags &amp;&amp; !matchesTags(featureTags, target.tags)) return false;
2783
+ &nbsp;
2784
+ const included = target.includeFeatures
2785
+ ? matchesPattern(featureKey, toArray(target.includeFeatures))
2786
+ : <span class="branch-1 cbranch-no" title="branch not covered" >true;</span>
2787
+ const excluded = target.excludeFeatures
2788
+ ? matchesPattern(featureKey, toArray(target.excludeFeatures))
2789
+ : <span class="branch-1 cbranch-no" title="branch not covered" >false;</span>
2790
+ &nbsp;
2791
+ return included &amp;&amp; !excluded;
2792
+ }
2793
+ &nbsp;
2794
+ function withoutKey&lt;T extends Record&lt;string, unknown&gt;&gt;(entity: T): T {
2795
+ const { key: _key, ...rest } = entity; // eslint-disable-line @typescript-eslint/no-unused-vars
2796
+ &nbsp;
2797
+ return rest as T;
2798
+ }
2799
+ &nbsp;
2800
+ async function safeRead&lt;T&gt;(
2801
+ keys: string[],
2802
+ read: (key: string) =&gt; Promise&lt;T&gt;,
2803
+ ): Promise&lt;Record&lt;string, T&gt;&gt; {
2804
+ const entries = await Promise.all(keys.map(async (key) =&gt; [key, await read(key)] as const));
2805
+ return Object.fromEntries(entries);
2806
+ }
2807
+ &nbsp;
2808
+ async function readDestination&lt;T&gt;(
2809
+ key: string,
2810
+ read: (key: string) =&gt; Promise&lt;T&gt;,
2811
+ ): Promise&lt;T | undefined&gt; {
2812
+ try {
2813
+ return await read(key);
2814
+ } catch {
2815
+ return undefined;
2816
+ }
2817
+ }
2818
+ &nbsp;
2819
+ function <span class="fstat-no" title="function not covered" >formatLintPreflightErrors(s</span>et: string, errors: LintErrorItem[]) {
2820
+ const preview = <span class="cstat-no" title="statement not covered" >errors</span>
2821
+ .slice(0, 5)
2822
+ .map(<span class="fstat-no" title="function not covered" >(e</span>rror) =&gt; <span class="cstat-no" title="statement not covered" >`${error.filePath}: ${error.message}`)</span>
2823
+ .join("\n");
2824
+ const suffix = <span class="cstat-no" title="statement not covered" >errors.length &gt; 5 ? `\n...and ${errors.length - 5} more` : "";</span>
2825
+ &nbsp;
2826
+ <span class="cstat-no" title="statement not covered" > return `Set "${set}" failed preflight lint with ${errors.length} error(s).\n${preview}${suffix}`;</span>
2827
+ }
2828
+ &nbsp;
2829
+ async function assertSetLintsClean(
2830
+ set: string,
2831
+ projectConfig: ProjectConfig,
2832
+ datasource: Datasource,
2833
+ ) {
2834
+ const result = await lintProject(
2835
+ {
2836
+ rootDirectoryPath: path.resolve(projectConfig.setsDirectoryPath, ".."),
2837
+ projectConfig,
2838
+ datasource,
2839
+ options: {},
2840
+ },
2841
+ { json: true },
2842
+ );
2843
+ &nbsp;
2844
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (result.hasError) {
2845
+ <span class="cstat-no" title="statement not covered" > throw new Error(formatLintPreflightErrors(set, result.errors));</span>
2846
+ }
2847
+ }
2848
+ &nbsp;
2849
+ function assertAllowedPromotionFlow(projectConfig: ProjectConfig, from: string, to: string) {
2850
+ const allowedFlows = projectConfig.promotionFlows;
2851
+ &nbsp;
2852
+ if (typeof allowedFlows === "undefined") {
2853
+ return;
2854
+ }
2855
+ &nbsp;
2856
+ const isAllowed = allowedFlows.some((flow) =&gt; flow.from === from &amp;&amp; flow.to === to);
2857
+ &nbsp;
2858
+ if (isAllowed) {
2859
+ return;
2860
+ }
2861
+ &nbsp;
2862
+ const allowedList = allowedFlows.map((flow) =&gt; `${flow.from} -&gt; ${flow.to}`).join(", ") || "none";
2863
+ &nbsp;
2864
+ throw new Error(
2865
+ `Promotion from "${from}" to "${to}" is not allowed by this project's configured promotionFlows.\nAllowed flows: ${allowedList}.\nChoose one of the allowed promotion paths or update featurevisor.config.js if this flow should be permitted.`,
2866
+ );
2867
+ }
2868
+ &nbsp;
2869
+ function collectGroupSegmentKeys(
2870
+ value: GroupSegment | GroupSegment[] | "*" | undefined,
2871
+ result: Set&lt;string&gt;,
2872
+ ) {
2873
+ if (!value || value === "*") return;
2874
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof value === "string") {
2875
+ result.add(value);
2876
+ return;
2877
+ }
2878
+ <span class="cstat-no" title="statement not covered" > if (Array.isArray(value)) {</span>
2879
+ <span class="cstat-no" title="statement not covered" > value.forEach(<span class="fstat-no" title="function not covered" >(e</span>ntry) =&gt; <span class="cstat-no" title="statement not covered" >collectGroupSegmentKeys(entry, result));</span></span>
2880
+ <span class="cstat-no" title="statement not covered" > return;</span>
2881
+ }
2882
+ <span class="cstat-no" title="statement not covered" > if ("and" in value) <span class="cstat-no" title="statement not covered" >value.and.forEach(<span class="fstat-no" title="function not covered" >(e</span>ntry) =&gt; <span class="cstat-no" title="statement not covered" >collectGroupSegmentKeys(entry, result));</span></span></span>
2883
+ <span class="cstat-no" title="statement not covered" > if ("or" in value) <span class="cstat-no" title="statement not covered" >value.or.forEach(<span class="fstat-no" title="function not covered" >(e</span>ntry) =&gt; <span class="cstat-no" title="statement not covered" >collectGroupSegmentKeys(entry, result));</span></span></span>
2884
+ <span class="cstat-no" title="statement not covered" > if ("not" in value) <span class="cstat-no" title="statement not covered" >value.not.forEach(<span class="fstat-no" title="function not covered" >(e</span>ntry) =&gt; <span class="cstat-no" title="statement not covered" >collectGroupSegmentKeys(entry, result));</span></span></span>
2885
+ }
2886
+ &nbsp;
2887
+ function collectConditionDependencies(
2888
+ value: Condition | Condition[] | "*" | undefined,
2889
+ segments: Set&lt;string&gt;,
2890
+ attributes: Set&lt;string&gt;,
2891
+ ) {
2892
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!value || value === "*") <span class="cstat-no" title="statement not covered" >return;</span>
2893
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof value === "string") {
2894
+ <span class="cstat-no" title="statement not covered" > segments.add(value);</span>
2895
+ <span class="cstat-no" title="statement not covered" > return;</span>
2896
+ }
2897
+ if (Array.isArray(value)) {
2898
+ value.forEach((entry) =&gt; collectConditionDependencies(entry, segments, attributes));
2899
+ return;
2900
+ }
2901
+ <span class="missing-if-branch" title="else path not taken" >E</span>if ("attribute" in value) {
2902
+ attributes.add(value.attribute.split(".")[0]);
2903
+ return;
2904
+ }
2905
+ <span class="cstat-no" title="statement not covered" > if ("and" in value)</span>
2906
+ <span class="cstat-no" title="statement not covered" > value.and.forEach(<span class="fstat-no" title="function not covered" >(e</span>ntry) =&gt; <span class="cstat-no" title="statement not covered" >collectConditionDependencies(entry, segments, attributes));</span></span>
2907
+ <span class="cstat-no" title="statement not covered" > if ("or" in value)</span>
2908
+ <span class="cstat-no" title="statement not covered" > value.or.forEach(<span class="fstat-no" title="function not covered" >(e</span>ntry) =&gt; <span class="cstat-no" title="statement not covered" >collectConditionDependencies(entry, segments, attributes));</span></span>
2909
+ <span class="cstat-no" title="statement not covered" > if ("not" in value)</span>
2910
+ <span class="cstat-no" title="statement not covered" > value.not.forEach(<span class="fstat-no" title="function not covered" >(e</span>ntry) =&gt; <span class="cstat-no" title="statement not covered" >collectConditionDependencies(entry, segments, attributes));</span></span>
2911
+ }
2912
+ &nbsp;
2913
+ function collectSchemaReferences(value: unknown, schemas: Set&lt;string&gt;) {
2914
+ if (!value || typeof value !== "object") {
2915
+ return;
2916
+ }
2917
+ &nbsp;
2918
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(value)) {
2919
+ <span class="cstat-no" title="statement not covered" > value.forEach(<span class="fstat-no" title="function not covered" >(e</span>ntry) =&gt; <span class="cstat-no" title="statement not covered" >collectSchemaReferences(entry, schemas));</span></span>
2920
+ <span class="cstat-no" title="statement not covered" > return;</span>
2921
+ }
2922
+ &nbsp;
2923
+ const record = value as Record&lt;string, unknown&gt;;
2924
+ &nbsp;
2925
+ if (typeof record.schema === "string") {
2926
+ schemas.add(record.schema);
2927
+ }
2928
+ &nbsp;
2929
+ Object.values(record).forEach((entry) =&gt; collectSchemaReferences(entry, schemas));
2930
+ }
2931
+ &nbsp;
2932
+ function collectFeatureDependencies(
2933
+ feature: ParsedFeature,
2934
+ features: Record&lt;string, ParsedFeature&gt;,
2935
+ featureKeys: Set&lt;string&gt;,
2936
+ segmentKeys: Set&lt;string&gt;,
2937
+ attributeKeys: Set&lt;string&gt;,
2938
+ schemaKeys: Set&lt;string&gt;,
2939
+ ) {
2940
+ if (typeof feature.bucketBy === "string") {
2941
+ attributeKeys.add(feature.bucketBy);
2942
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (Array.isArray(feature.bucketBy)) {</span>
2943
+ <span class="cstat-no" title="statement not covered" > feature.bucketBy.forEach(<span class="fstat-no" title="function not covered" >(a</span>ttributeKey) =&gt; <span class="cstat-no" title="statement not covered" >attributeKeys.add(attributeKey));</span></span>
2944
+ } else <span class="cstat-no" title="statement not covered" >if (feature.bucketBy &amp;&amp; "or" in feature.bucketBy) {</span>
2945
+ <span class="cstat-no" title="statement not covered" > feature.bucketBy.or.forEach(<span class="fstat-no" title="function not covered" >(a</span>ttributeKey) =&gt; <span class="cstat-no" title="statement not covered" >attributeKeys.add(attributeKey));</span></span>
2946
+ }
2947
+ &nbsp;
2948
+ collectSchemaReferences(feature.variablesSchema, schemaKeys);
2949
+ &nbsp;
2950
+ for (const required of feature.required || []) {
2951
+ const requiredKey = <span class="cstat-no" title="statement not covered" >typeof required === "string" ? required : required.key;</span>
2952
+ <span class="cstat-no" title="statement not covered" > if (!featureKeys.has(requiredKey)) {</span>
2953
+ <span class="cstat-no" title="statement not covered" > featureKeys.add(requiredKey);</span>
2954
+ const requiredFeature = <span class="cstat-no" title="statement not covered" >features[requiredKey];</span>
2955
+ <span class="cstat-no" title="statement not covered" > if (requiredFeature) {</span>
2956
+ <span class="cstat-no" title="statement not covered" > collectFeatureDependencies(</span>
2957
+ requiredFeature,
2958
+ features,
2959
+ featureKeys,
2960
+ segmentKeys,
2961
+ attributeKeys,
2962
+ schemaKeys,
2963
+ );
2964
+ }
2965
+ }
2966
+ }
2967
+ &nbsp;
2968
+ for (const rules of Object.values((feature.rules || <span class="branch-1 cbranch-no" title="branch not covered" >{}) as any)) {</span>
2969
+ const ruleEntries = Array.isArray(rules) ? <span class="branch-0 cbranch-no" title="branch not covered" >rules : [</span>rules];
2970
+ for (const rule of ruleEntries) {
2971
+ if (!isPromotable(rule)) {
2972
+ continue;
2973
+ }
2974
+ &nbsp;
2975
+ collectGroupSegmentKeys(rule?.segments, segmentKeys);
2976
+ Object.values(rule?.variableOverrides || {}).forEach(<span class="fstat-no" title="function not covered" >(o</span>verrides: any) =&gt; {
2977
+ (<span class="cstat-no" title="statement not covered" >overrides || []).forEach(<span class="fstat-no" title="function not covered" >(o</span>verride: any) =&gt; {</span>
2978
+ <span class="cstat-no" title="statement not covered" > collectGroupSegmentKeys(override.segments, segmentKeys);</span>
2979
+ <span class="cstat-no" title="statement not covered" > collectConditionDependencies(override.conditions, segmentKeys, attributeKeys);</span>
2980
+ });
2981
+ });
2982
+ }
2983
+ }
2984
+ &nbsp;
2985
+ for (const force of Object.values((feature.force || {}) as any)) {
2986
+ const forceEntries = <span class="cstat-no" title="statement not covered" >Array.isArray(force) ? force : [force];</span>
2987
+ <span class="cstat-no" title="statement not covered" > for (const forceEntry of forceEntries) {</span>
2988
+ <span class="cstat-no" title="statement not covered" > collectGroupSegmentKeys(forceEntry?.segments, segmentKeys);</span>
2989
+ <span class="cstat-no" title="statement not covered" > collectConditionDependencies(forceEntry?.conditions, segmentKeys, attributeKeys);</span>
2990
+ }
2991
+ }
2992
+ }
2993
+ &nbsp;
2994
+ function mergeRuleArray(
2995
+ destination: Rule[] | undefined,
2996
+ source: Rule[] | undefined,
2997
+ policy: ConflictPolicy,
2998
+ conflicts: Array&lt;Omit&lt;PromotionConflict, "type" | "key"&gt;&gt;,
2999
+ pathSegments: string[],
3000
+ ) {
3001
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof source === "undefined") <span class="cstat-no" title="statement not covered" >return destination;</span>
3002
+ if (typeof destination === "undefined") return source.filter((rule) =&gt; isPromotable(rule));
3003
+ &nbsp;
3004
+ const mergedRuleKeys = new Set&lt;string&gt;();
3005
+ const mergedRules: Rule[] = [];
3006
+ &nbsp;
3007
+ for (const sourceRule of source) {
3008
+ if (!isPromotable(sourceRule)) {
3009
+ continue;
3010
+ }
3011
+ &nbsp;
3012
+ const destinationRule = destination.find((rule) =&gt; rule.key === sourceRule.key);
3013
+ mergedRuleKeys.add(sourceRule.key);
3014
+ &nbsp;
3015
+ if (destinationRule &amp;&amp; !isPromotable(destinationRule)) {
3016
+ mergedRules.push(destinationRule);
3017
+ continue;
3018
+ }
3019
+ &nbsp;
3020
+ mergedRules.push(
3021
+ deepMergeWithPolicy(destinationRule, sourceRule, policy, conflicts, [
3022
+ ...pathSegments,
3023
+ sourceRule.key,
3024
+ ]) as Rule,
3025
+ );
3026
+ }
3027
+ &nbsp;
3028
+ for (const destinationRule of destination) {
3029
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!mergedRuleKeys.has(destinationRule.key)) {
3030
+ <span class="cstat-no" title="statement not covered" > mergedRules.push(destinationRule);</span>
3031
+ }
3032
+ }
3033
+ &nbsp;
3034
+ return mergedRules;
3035
+ }
3036
+ &nbsp;
3037
+ function <span class="fstat-no" title="function not covered" >isRulesByEnvironment(v</span>alue: ParsedFeature["rules"]): value is RulesByEnvironment {
3038
+ <span class="cstat-no" title="statement not covered" > return isPlainObject(value) &amp;&amp; !Array.isArray(value);</span>
3039
+ }
3040
+ &nbsp;
3041
+ function mergeRules(
3042
+ destination: ParsedFeature["rules"] | undefined,
3043
+ source: ParsedFeature["rules"] | undefined,
3044
+ policy: ConflictPolicy,
3045
+ conflicts: Array&lt;Omit&lt;PromotionConflict, "type" | "key"&gt;&gt;,
3046
+ ) {
3047
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (Array.isArray(source) || <span class="branch-1 cbranch-no" title="branch not covered" >Array.isArray(destination)) {</span>
3048
+ return mergeRuleArray(
3049
+ Array.isArray(destination) ? destination : undefined,
3050
+ Array.isArray(source) ? source : <span class="branch-1 cbranch-no" title="branch not covered" >undefined,</span>
3051
+ policy,
3052
+ conflicts,
3053
+ ["rules"],
3054
+ );
3055
+ }
3056
+ &nbsp;
3057
+ <span class="cstat-no" title="statement not covered" > if (isRulesByEnvironment(source) || isRulesByEnvironment(destination)) {</span>
3058
+ const environmentKeys = <span class="cstat-no" title="statement not covered" >new Set([</span>
3059
+ ...Object.keys((destination || {}) as RulesByEnvironment),
3060
+ ...Object.keys((source || {}) as RulesByEnvironment),
3061
+ ]);
3062
+ const result: RulesByEnvironment = <span class="cstat-no" title="statement not covered" >{};</span>
3063
+ &nbsp;
3064
+ <span class="cstat-no" title="statement not covered" > for (const environment of Array.from(environmentKeys).sort()) {</span>
3065
+ const merged = <span class="cstat-no" title="statement not covered" >mergeRuleArray(</span>
3066
+ (destination as RulesByEnvironment | undefined)?.[environment],
3067
+ (source as RulesByEnvironment | undefined)?.[environment],
3068
+ policy,
3069
+ conflicts,
3070
+ ["rules", environment],
3071
+ );
3072
+ &nbsp;
3073
+ <span class="cstat-no" title="statement not covered" > if (typeof merged !== "undefined") {</span>
3074
+ <span class="cstat-no" title="statement not covered" > result[environment] = merged;</span>
3075
+ }
3076
+ }
3077
+ &nbsp;
3078
+ <span class="cstat-no" title="statement not covered" > return Object.keys(result).length &gt; 0 ? result : undefined;</span>
3079
+ }
3080
+ &nbsp;
3081
+ <span class="cstat-no" title="statement not covered" > return source;</span>
3082
+ }
3083
+ &nbsp;
3084
+ function mergeFeature(
3085
+ featureKey: string,
3086
+ destination: ParsedFeature | undefined,
3087
+ source: ParsedFeature,
3088
+ policy: ConflictPolicy,
3089
+ conflicts: PromotionConflict[],
3090
+ ): ParsedFeature {
3091
+ const sourceWithoutRules = { ...source, rules: undefined };
3092
+ const destinationWithoutRules = destination ? { ...destination, rules: undefined } : undefined;
3093
+ const featureConflicts: Array&lt;Omit&lt;PromotionConflict, "type" | "key"&gt;&gt; = [];
3094
+ const mergedFeature = deepMergeWithPolicy(
3095
+ destinationWithoutRules,
3096
+ sourceWithoutRules,
3097
+ policy,
3098
+ featureConflicts,
3099
+ ) as ParsedFeature;
3100
+ const ruleConflicts: Array&lt;Omit&lt;PromotionConflict, "type" | "key"&gt;&gt; = [];
3101
+ const mergedRules = mergeRules(destination?.rules, source.rules, policy, ruleConflicts);
3102
+ &nbsp;
3103
+ conflicts.push(
3104
+ ...featureConflicts.map((conflict) =&gt; ({
3105
+ type: "feature" as const,
3106
+ key: featureKey,
3107
+ ...conflict,
3108
+ })),
3109
+ ...ruleConflicts.map((conflict) =&gt; ({
3110
+ type: "feature" as const,
3111
+ key: featureKey,
3112
+ ...conflict,
3113
+ })),
3114
+ );
3115
+ &nbsp;
3116
+ return {
3117
+ ...mergedFeature,
3118
+ rules: mergedRules,
3119
+ };
3120
+ }
3121
+ &nbsp;
3122
+ async function getPromotionPlan(
3123
+ sourceDatasource: Datasource,
3124
+ destinationDatasource: Datasource,
3125
+ options: Required&lt;
3126
+ Pick&lt;
3127
+ PromoteProjectSetsOptions,
3128
+ "includeFeatures" | "excludeFeatures" | "target" | "tag" | "allowEmpty" | "conflicts"
3129
+ &gt;
3130
+ &gt;,
3131
+ ) {
3132
+ const includeFeatures = toArray(options.includeFeatures);
3133
+ const excludeFeatures = toArray(options.excludeFeatures);
3134
+ const targetSelectors = toArray(options.target);
3135
+ const tagSelectors = toArray(options.tag);
3136
+ const availableTags = sourceDatasource.getConfig().tags;
3137
+ const unknownTag = tagSelectors.find((tag) =&gt; !availableTags.includes(tag));
3138
+ if (unknownTag) {
3139
+ throw new Error(
3140
+ `Unknown source tag "${unknownTag}". Available tags: ${availableTags.join(", ") || <span class="branch-1 cbranch-no" title="branch not covered" >"none"}.</span>`,
3141
+ );
3142
+ }
3143
+ const hasNoFilters =
3144
+ includeFeatures.length === 0 &amp;&amp;
3145
+ excludeFeatures.length === 0 &amp;&amp;
3146
+ targetSelectors.length === 0 &amp;&amp;
3147
+ tagSelectors.length === 0;
3148
+ &nbsp;
3149
+ const [featureKeys, segmentKeys, attributeKeys, groupKeys, schemaKeys, targetKeys, testKeys] =
3150
+ await Promise.all([
3151
+ sourceDatasource.listFeatures(),
3152
+ sourceDatasource.listSegments(),
3153
+ sourceDatasource.listAttributes(),
3154
+ sourceDatasource.listGroups(),
3155
+ sourceDatasource.listSchemas(),
3156
+ sourceDatasource.listTargets(),
3157
+ sourceDatasource.listTests(),
3158
+ ]);
3159
+ &nbsp;
3160
+ const [features, segments, attributes, groups, schemas, targets, tests] = await Promise.all([
3161
+ safeRead&lt;ParsedFeature&gt;(featureKeys, (key) =&gt; sourceDatasource.readFeature(key)),
3162
+ safeRead&lt;Segment&gt;(segmentKeys, (key) =&gt; sourceDatasource.readSegment(key)),
3163
+ safeRead&lt;Attribute&gt;(attributeKeys, (key) =&gt; sourceDatasource.readAttribute(key)),
3164
+ safeRead&lt;Group&gt;(groupKeys, (key) =&gt; sourceDatasource.readGroup(key)),
3165
+ safeRead&lt;Schema&gt;(schemaKeys, (key) =&gt; sourceDatasource.readSchema(key)),
3166
+ safeRead&lt;Target&gt;(targetKeys, (key) =&gt; sourceDatasource.readTarget(key)),
3167
+ safeRead&lt;Test&gt;(testKeys, (key) =&gt; sourceDatasource.readTest(key)),
3168
+ ]);
3169
+ &nbsp;
3170
+ const promotedFeatureKeys = new Set&lt;string&gt;();
3171
+ const promotedSegmentKeys = new Set&lt;string&gt;();
3172
+ const promotedAttributeKeys = new Set&lt;string&gt;();
3173
+ const promotedGroupKeys = new Set&lt;string&gt;();
3174
+ const promotedSchemaKeys = new Set&lt;string&gt;();
3175
+ const promotedTargetKeys = new Set&lt;string&gt;();
3176
+ &nbsp;
3177
+ const selectedTargets: Target[] = [];
3178
+ for (const key of targetSelectors) {
3179
+ const target = targets[key];
3180
+ if (!target) {
3181
+ throw new Error(
3182
+ `Unknown source target "${key}". Available targets: ${targetKeys.join(", ") || "none"}.`,
3183
+ );
3184
+ }
3185
+ selectedTargets.push(target);
3186
+ promotedTargetKeys.add(key);
3187
+ }
3188
+ &nbsp;
3189
+ if (hasNoFilters) {
3190
+ featureKeys.forEach((key) =&gt; promotedFeatureKeys.add(key));
3191
+ segmentKeys.forEach((key) =&gt; promotedSegmentKeys.add(key));
3192
+ attributeKeys.forEach((key) =&gt; promotedAttributeKeys.add(key));
3193
+ groupKeys.forEach(<span class="fstat-no" title="function not covered" >(k</span>ey) =&gt; <span class="cstat-no" title="statement not covered" >promotedGroupKeys.add(key));</span>
3194
+ schemaKeys.forEach((key) =&gt; promotedSchemaKeys.add(key));
3195
+ targetKeys.forEach(<span class="fstat-no" title="function not covered" >(k</span>ey) =&gt; <span class="cstat-no" title="statement not covered" >promotedTargetKeys.add(key));</span>
3196
+ } else {
3197
+ for (const key of featureKeys) {
3198
+ const feature = features[key];
3199
+ const matchesIncludes = includeFeatures.length === 0 || matchesPattern(key, includeFeatures);
3200
+ const matchesExcludes = matchesPattern(key, excludeFeatures);
3201
+ const matchesSelectedTags =
3202
+ tagSelectors.length === 0 || tagSelectors.some((tag) =&gt; (feature.tags || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>.includes(tag));
3203
+ const matchesSelectedTargets =
3204
+ selectedTargets.length === 0 ||
3205
+ selectedTargets.some((target) =&gt; matchesTarget(key, feature, target));
3206
+ &nbsp;
3207
+ if (matchesIncludes &amp;&amp; !matchesExcludes &amp;&amp; matchesSelectedTags &amp;&amp; matchesSelectedTargets) {
3208
+ promotedFeatureKeys.add(key);
3209
+ }
3210
+ }
3211
+ &nbsp;
3212
+ if (promotedFeatureKeys.size === 0 &amp;&amp; !options.allowEmpty) {
3213
+ throw new Error("No source features matched the promotion filters.");
3214
+ }
3215
+ }
3216
+ &nbsp;
3217
+ let previousFeatureCount = -1;
3218
+ while (previousFeatureCount !== promotedFeatureKeys.size) {
3219
+ previousFeatureCount = promotedFeatureKeys.size;
3220
+ &nbsp;
3221
+ for (const key of Array.from(promotedFeatureKeys)) {
3222
+ const feature = features[key];
3223
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (feature) {
3224
+ collectFeatureDependencies(
3225
+ feature,
3226
+ features,
3227
+ promotedFeatureKeys,
3228
+ promotedSegmentKeys,
3229
+ promotedAttributeKeys,
3230
+ promotedSchemaKeys,
3231
+ );
3232
+ }
3233
+ }
3234
+ &nbsp;
3235
+ for (const key of groupKeys) {
3236
+ const group = groups[key];
3237
+ const groupFeatureKeys = group.slots
3238
+ .map((slot) =&gt; slot.feature)
3239
+ .filter((featureKey): featureKey is string =&gt; typeof featureKey === "string");
3240
+ &nbsp;
3241
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (groupFeatureKeys.some((featureKey) =&gt; promotedFeatureKeys.has(featureKey))) {
3242
+ promotedGroupKeys.add(key);
3243
+ groupFeatureKeys.forEach((featureKey) =&gt; promotedFeatureKeys.add(featureKey));
3244
+ }
3245
+ }
3246
+ }
3247
+ &nbsp;
3248
+ const pendingSegments = Array.from(promotedSegmentKeys);
3249
+ for (let index = 0; index &lt; pendingSegments.length; index++) {
3250
+ const segmentKey = pendingSegments[index];
3251
+ const segment = segments[segmentKey];
3252
+ &nbsp;
3253
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!segment) <span class="cstat-no" title="statement not covered" >continue;</span>
3254
+ &nbsp;
3255
+ const beforeSize = promotedSegmentKeys.size;
3256
+ collectConditionDependencies(segment.conditions, promotedSegmentKeys, promotedAttributeKeys);
3257
+ &nbsp;
3258
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (promotedSegmentKeys.size &gt; beforeSize) {
3259
+ <span class="cstat-no" title="statement not covered" > pendingSegments.push(</span>
3260
+ ...Array.from(promotedSegmentKeys).filter(<span class="fstat-no" title="function not covered" >(k</span>ey) =&gt; <span class="cstat-no" title="statement not covered" >!pendingSegments.includes(key)),</span>
3261
+ );
3262
+ }
3263
+ }
3264
+ &nbsp;
3265
+ const pendingSchemas = Array.from(promotedSchemaKeys);
3266
+ for (let index = 0; index &lt; pendingSchemas.length; index++) {
3267
+ const schemaKey = pendingSchemas[index];
3268
+ const schema = schemas[schemaKey];
3269
+ &nbsp;
3270
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!schema) <span class="cstat-no" title="statement not covered" >continue;</span>
3271
+ &nbsp;
3272
+ const beforeSize = promotedSchemaKeys.size;
3273
+ collectSchemaReferences(schema, promotedSchemaKeys);
3274
+ &nbsp;
3275
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (promotedSchemaKeys.size &gt; beforeSize) {
3276
+ <span class="cstat-no" title="statement not covered" > pendingSchemas.push(</span>
3277
+ ...Array.from(promotedSchemaKeys).filter(<span class="fstat-no" title="function not covered" >(k</span>ey) =&gt; <span class="cstat-no" title="statement not covered" >!pendingSchemas.includes(key)),</span>
3278
+ );
3279
+ }
3280
+ }
3281
+ &nbsp;
3282
+ const promotedTestKeys = testKeys.filter((key) =&gt; {
3283
+ const test = tests[key] as any;
3284
+ return promotedFeatureKeys.has(test.feature) || promotedSegmentKeys.has(test.segment);
3285
+ });
3286
+ &nbsp;
3287
+ const plans: EntityPlan[] = [];
3288
+ &nbsp;
3289
+ async function plan&lt;T extends EntityValue&gt;(
3290
+ type: EntityType,
3291
+ key: string,
3292
+ source: T,
3293
+ readDestinationEntity: (key: string) =&gt; Promise&lt;T&gt;,
3294
+ merge: (destination: T | undefined, source: T, conflicts: PromotionConflict[]) =&gt; T = (
3295
+ destination,
3296
+ sourceValue,
3297
+ conflicts,
3298
+ ) =&gt; {
3299
+ const entityConflicts: Array&lt;Omit&lt;PromotionConflict, "type" | "key"&gt;&gt; = [];
3300
+ const merged = deepMergeWithPolicy(
3301
+ destination,
3302
+ sourceValue,
3303
+ options.conflicts,
3304
+ entityConflicts,
3305
+ ) as T;
3306
+ &nbsp;
3307
+ conflicts.push(...entityConflicts.map((conflict) =&gt; ({ type, key, ...conflict })));
3308
+ &nbsp;
3309
+ return merged;
3310
+ },
3311
+ ) {
3312
+ const cleanedSource = withoutKey(source as any) as T;
3313
+ const destination = await readDestination&lt;T&gt;(key, readDestinationEntity);
3314
+ const cleanedDestination = destination ? (withoutKey(destination as any) as T) : undefined;
3315
+ &nbsp;
3316
+ if (cleanedDestination &amp;&amp; (!isPromotable(cleanedSource) || !isPromotable(cleanedDestination))) {
3317
+ plans.push({
3318
+ type,
3319
+ key,
3320
+ source: cleanedSource,
3321
+ destination: cleanedDestination,
3322
+ merged: cleanedDestination,
3323
+ conflicts: [],
3324
+ });
3325
+ &nbsp;
3326
+ return;
3327
+ }
3328
+ &nbsp;
3329
+ const conflicts: PromotionConflict[] = [];
3330
+ const merged = merge(cleanedDestination, cleanedSource, conflicts);
3331
+ &nbsp;
3332
+ plans.push({
3333
+ type,
3334
+ key,
3335
+ source: cleanedSource,
3336
+ destination: cleanedDestination,
3337
+ merged,
3338
+ conflicts,
3339
+ });
3340
+ }
3341
+ &nbsp;
3342
+ for (const key of Array.from(promotedAttributeKeys).sort()) {
3343
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (attributes[key])
3344
+ await plan("attribute", key, attributes[key], (entryKey) =&gt;
3345
+ destinationDatasource.readAttribute(entryKey),
3346
+ );
3347
+ }
3348
+ &nbsp;
3349
+ for (const key of Array.from(promotedSegmentKeys).sort()) {
3350
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (segments[key])
3351
+ await plan("segment", key, segments[key], (entryKey) =&gt;
3352
+ destinationDatasource.readSegment(entryKey),
3353
+ );
3354
+ }
3355
+ &nbsp;
3356
+ for (const key of Array.from(promotedGroupKeys).sort()) {
3357
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (groups[key])
3358
+ await plan(
3359
+ "group",
3360
+ key,
3361
+ groups[key] as any,
3362
+ (entryKey) =&gt; destinationDatasource.readGroup(entryKey) as any,
3363
+ );
3364
+ }
3365
+ &nbsp;
3366
+ for (const key of Array.from(promotedSchemaKeys).sort()) {
3367
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (schemas[key])
3368
+ await plan("schema", key, schemas[key], (entryKey) =&gt;
3369
+ destinationDatasource.readSchema(entryKey),
3370
+ );
3371
+ }
3372
+ &nbsp;
3373
+ for (const key of Array.from(promotedFeatureKeys).sort()) {
3374
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (features[key])
3375
+ await plan(
3376
+ "feature",
3377
+ key,
3378
+ features[key],
3379
+ (entryKey) =&gt; destinationDatasource.readFeature(entryKey),
3380
+ (destination, source, conflicts) =&gt;
3381
+ mergeFeature(key, destination, source, options.conflicts, conflicts),
3382
+ );
3383
+ }
3384
+ &nbsp;
3385
+ for (const key of Array.from(promotedTargetKeys).sort()) {
3386
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (targets[key])
3387
+ await plan("target", key, targets[key], (entryKey) =&gt;
3388
+ destinationDatasource.readTarget(entryKey),
3389
+ );
3390
+ }
3391
+ &nbsp;
3392
+ for (const key of promotedTestKeys.sort()) {
3393
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (tests[key])
3394
+ await plan("test", key, tests[key], (entryKey) =&gt; destinationDatasource.readTest(entryKey));
3395
+ }
3396
+ &nbsp;
3397
+ return plans;
3398
+ }
3399
+ &nbsp;
3400
+ async function writePlan(destinationDatasource: Datasource, plans: EntityPlan[]) {
3401
+ for (const plan of plans) {
3402
+ if (deepEqual(plan.destination, plan.merged)) {
3403
+ continue;
3404
+ }
3405
+ &nbsp;
3406
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (plan.type === "attribute")
3407
+ <span class="cstat-no" title="statement not covered" > await destinationDatasource.writeAttribute(plan.key, plan.merged as Attribute);</span>
3408
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (plan.type === "segment")
3409
+ <span class="cstat-no" title="statement not covered" > await destinationDatasource.writeSegment(plan.key, plan.merged as Segment);</span>
3410
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (plan.type === "group")
3411
+ <span class="cstat-no" title="statement not covered" > await destinationDatasource.writeGroup(</span>
3412
+ plan.key,
3413
+ plan.merged as Record&lt;string, unknown&gt; as any,
3414
+ );
3415
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (plan.type === "schema")
3416
+ <span class="cstat-no" title="statement not covered" > await destinationDatasource.writeSchema(plan.key, plan.merged as Schema);</span>
3417
+ if (plan.type === "target")
3418
+ await destinationDatasource.writeTarget(plan.key, plan.merged as Target);
3419
+ if (plan.type === "feature")
3420
+ await destinationDatasource.writeFeature(plan.key, plan.merged as ParsedFeature);
3421
+ if (plan.type === "test") await destinationDatasource.writeTest(plan.key, plan.merged as Test);
3422
+ }
3423
+ }
3424
+ &nbsp;
3425
+ function normalizeConflictPolicy(value: unknown): ConflictPolicy {
3426
+ if (typeof value === "undefined" || value === false) {
3427
+ return "source";
3428
+ }
3429
+ &nbsp;
3430
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (value === "source" || value === "destination" || value === "fail") {
3431
+ return value;
3432
+ }
3433
+ &nbsp;
3434
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
3435
+ `Invalid --conflicts value "${String(value)}". Use source, destination, or fail.`,
3436
+ );
3437
+ }
3438
+ &nbsp;
3439
+ function normalizeAuditFormat(value: unknown): PromotionAuditFormat | false {
3440
+ if (typeof value === "undefined" || value === false || value === "false") {
3441
+ return false;
3442
+ }
3443
+ &nbsp;
3444
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (value === true || value === "true") {
3445
+ <span class="cstat-no" title="statement not covered" > return "json";</span>
3446
+ }
3447
+ &nbsp;
3448
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (value === "json" || value === "markdown") {
3449
+ return value;
3450
+ }
3451
+ &nbsp;
3452
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Invalid --audit value "${String(value)}". Use json or markdown.`);</span>
3453
+ }
3454
+ &nbsp;
3455
+ function getTimestamp() {
3456
+ const date = new Date();
3457
+ const pad = (value: number) =&gt; (value &lt; 10 ? `0${value}` : String(value));
3458
+ &nbsp;
3459
+ return [
3460
+ date.getUTCFullYear(),
3461
+ pad(date.getUTCMonth() + 1),
3462
+ pad(date.getUTCDate()),
3463
+ "T",
3464
+ pad(date.getUTCHours()),
3465
+ pad(date.getUTCMinutes()),
3466
+ pad(date.getUTCSeconds()),
3467
+ ].join("");
3468
+ }
3469
+ &nbsp;
3470
+ function getEntityFilePath(projectConfig: ProjectConfig, type: EntityType, key: string) {
3471
+ const directories: Record&lt;EntityType, string&gt; = {
3472
+ attribute: projectConfig.attributesDirectoryPath,
3473
+ segment: projectConfig.segmentsDirectoryPath,
3474
+ feature: projectConfig.featuresDirectoryPath,
3475
+ group: projectConfig.groupsDirectoryPath,
3476
+ schema: projectConfig.schemasDirectoryPath,
3477
+ target: projectConfig.targetsDirectoryPath,
3478
+ test: projectConfig.testsDirectoryPath,
3479
+ };
3480
+ const extension = (projectConfig.parser as any).extension || <span class="branch-1 cbranch-no" title="branch not covered" >"yml";</span>
3481
+ const pathSegments = key.split(projectConfig.namespaceCharacter);
3482
+ &nbsp;
3483
+ if (
3484
+ type === "test" &amp;&amp;
3485
+ pathSegments.length &gt; 1 &amp;&amp;
3486
+ pathSegments[pathSegments.length - 1] === "spec"
3487
+ ) {
3488
+ pathSegments[pathSegments.length - 2] = `${pathSegments[pathSegments.length - 2]}.spec`;
3489
+ pathSegments.pop();
3490
+ }
3491
+ &nbsp;
3492
+ return path.join(directories[type], ...pathSegments) + `.${extension}`;
3493
+ }
3494
+ &nbsp;
3495
+ function formatProjectPath(projectConfig: ProjectConfig, filePath: string) {
3496
+ const root = path.resolve(projectConfig.setsDirectoryPath, "..");
3497
+ const relative = path.relative(root, filePath);
3498
+ &nbsp;
3499
+ return relative.startsWith("..") ? <span class="branch-0 cbranch-no" title="branch not covered" >filePath : r</span>elative;
3500
+ }
3501
+ &nbsp;
3502
+ async function getPromotionAuditFilePath(
3503
+ projectConfig: ProjectConfig,
3504
+ result: PromoteProjectSetsResult,
3505
+ format: PromotionAuditFormat,
3506
+ ) {
3507
+ const extension = format === "markdown" ? "md" : <span class="branch-1 cbranch-no" title="branch not covered" >"json";</span>
3508
+ const baseFileName = `${getTimestamp()}-${result.from}-to-${result.to}`;
3509
+ const directoryPath = path.join(projectConfig.stateDirectoryPath, "promotions");
3510
+ let suffix = 0;
3511
+ &nbsp;
3512
+ while (true) {
3513
+ const fileName = `${baseFileName}${suffix === 0 ? "" : <span class="branch-1 cbranch-no" title="branch not covered" >`-${suffix}`}</span>.${extension}`;
3514
+ const filePath = path.join(directoryPath, fileName);
3515
+ &nbsp;
3516
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!fs.existsSync(filePath)) {
3517
+ return filePath;
3518
+ }
3519
+ &nbsp;
3520
+ <span class="cstat-no" title="statement not covered" > suffix++;</span>
3521
+ }
3522
+ }
3523
+ &nbsp;
3524
+ function <span class="fstat-no" title="function not covered" >getAuditPayload(r</span>esult: PromoteProjectSetsResult) {
3525
+ <span class="cstat-no" title="statement not covered" > return {</span>
3526
+ from: result.from,
3527
+ to: result.to,
3528
+ apply: result.apply,
3529
+ filters: result.filters,
3530
+ dependencies: result.dependencies,
3531
+ files: result.files,
3532
+ conflicts: result.conflicts.map(<span class="fstat-no" title="function not covered" >(c</span>onflict) =&gt; (<span class="cstat-no" title="statement not covered" >{</span>
3533
+ type: conflict.type,
3534
+ key: conflict.key,
3535
+ path: conflict.path,
3536
+ source: conflict.source,
3537
+ destination: conflict.destination,
3538
+ })),
3539
+ duration: result.duration,
3540
+ };
3541
+ }
3542
+ &nbsp;
3543
+ function stringifyMarkdownAudit(result: PromoteProjectSetsResult) {
3544
+ const lines = [
3545
+ "# Featurevisor Promotion",
3546
+ "",
3547
+ `- From: ${result.from}`,
3548
+ `- To: ${result.to}`,
3549
+ `- Mode: ${result.apply ? "apply" : <span class="branch-1 cbranch-no" title="branch not covered" >"preview"}`,</span>
3550
+ `- Conflicts: ${result.filters.conflicts}`,
3551
+ `- Duration: ${prettyDuration(result.duration)}`,
3552
+ "",
3553
+ "## Dependencies",
3554
+ "",
3555
+ `- Attributes: ${result.dependencies.attribute}`,
3556
+ `- Segments: ${result.dependencies.segment}`,
3557
+ `- Features: ${result.dependencies.feature}`,
3558
+ `- Groups: ${result.dependencies.group}`,
3559
+ `- Schemas: ${result.dependencies.schema}`,
3560
+ `- Targets: ${result.dependencies.target}`,
3561
+ `- Tests: ${result.dependencies.test}`,
3562
+ "",
3563
+ "## Files",
3564
+ "",
3565
+ ];
3566
+ &nbsp;
3567
+ for (const [label, files] of [
3568
+ ["Created", result.files.created],
3569
+ ["Updated", result.files.updated],
3570
+ ["Unchanged", result.files.unchanged],
3571
+ ] as const) {
3572
+ lines.push(`### ${label}`, "");
3573
+ lines.push(...(files.length &gt; 0 ? files.map((filePath) =&gt; `- ${filePath}`) : ["- None"]));
3574
+ lines.push("");
3575
+ }
3576
+ &nbsp;
3577
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (result.conflicts.length &gt; 0) {
3578
+ lines.push("## Conflicts", "");
3579
+ lines.push(
3580
+ ...result.conflicts.map(
3581
+ (conflict) =&gt; `- ${conflict.type} ${conflict.key} at ${conflict.path}`,
3582
+ ),
3583
+ );
3584
+ lines.push("");
3585
+ }
3586
+ &nbsp;
3587
+ return `${lines.join("\n")}\n`;
3588
+ }
3589
+ &nbsp;
3590
+ async function writePromotionAudit(
3591
+ projectConfig: ProjectConfig,
3592
+ result: PromoteProjectSetsResult,
3593
+ format: PromotionAuditFormat,
3594
+ ) {
3595
+ const filePath = await getPromotionAuditFilePath(projectConfig, result, format);
3596
+ await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
3597
+ &nbsp;
3598
+ const content =
3599
+ format === "markdown"
3600
+ ? stringifyMarkdownAudit(result)
3601
+ : <span class="branch-1 cbranch-no" title="branch not covered" >`${JSON.stringify(getAuditPayload(result), null, 2)}\n`;</span>
3602
+ &nbsp;
3603
+ await fs.promises.writeFile(filePath, content);
3604
+ &nbsp;
3605
+ return formatProjectPath(projectConfig, filePath);
3606
+ }
3607
+ &nbsp;
3608
+ export async function promoteProjectSets(
3609
+ projectConfig: ProjectConfig,
3610
+ datasource: Datasource,
3611
+ options: PromoteProjectSetsOptions,
3612
+ ): Promise&lt;PromoteProjectSetsResult&gt; {
3613
+ const startTime = Date.now();
3614
+ const conflictPolicy = normalizeConflictPolicy(options.conflicts);
3615
+ const auditFormat = normalizeAuditFormat(options.audit);
3616
+ &nbsp;
3617
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!projectConfig.sets) {
3618
+ <span class="cstat-no" title="statement not covered" > throw new Error("Promotion is only available when `sets: true` is configured.");</span>
3619
+ }
3620
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!options.from) <span class="cstat-no" title="statement not covered" >throw new Error("Pass --from=&lt;set&gt;.");</span>
3621
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!options.to) <span class="cstat-no" title="statement not covered" >throw new Error("Pass --to=&lt;set&gt;.");</span>
3622
+ if (options.from === options.to) throw new Error("--from and --to must be different sets.");
3623
+ &nbsp;
3624
+ const sets = await datasource.listSets();
3625
+ if (!sets.includes(options.from)) {
3626
+ throw new Error(
3627
+ `Unknown source set "${options.from}". Available sets: ${sets.join(", ") || <span class="branch-1 cbranch-no" title="branch not covered" >"none"}.</span>`,
3628
+ );
3629
+ }
3630
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!sets.includes(options.to)) {
3631
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
3632
+ `Unknown destination set "${options.to}". Available sets: ${sets.join(", ") || "none"}.`,
3633
+ );
3634
+ }
3635
+ &nbsp;
3636
+ assertAllowedPromotionFlow(projectConfig, options.from, options.to);
3637
+ &nbsp;
3638
+ const sourceDatasource = datasource.forSet(options.from);
3639
+ const destinationDatasource = datasource.forSet(options.to);
3640
+ &nbsp;
3641
+ await assertSetLintsClean(options.from, sourceDatasource.getConfig(), sourceDatasource);
3642
+ await assertSetLintsClean(options.to, destinationDatasource.getConfig(), destinationDatasource);
3643
+ &nbsp;
3644
+ const plans = await getPromotionPlan(sourceDatasource, destinationDatasource, {
3645
+ includeFeatures: options.includeFeatures || [],
3646
+ excludeFeatures: options.excludeFeatures || [],
3647
+ target: options.target || [],
3648
+ tag: options.tag || [],
3649
+ allowEmpty: options.allowEmpty === true,
3650
+ conflicts: conflictPolicy,
3651
+ });
3652
+ const conflicts = plans.flatMap((plan) =&gt; plan.conflicts);
3653
+ &nbsp;
3654
+ if (conflictPolicy === "fail" &amp;&amp; conflicts.length &gt; 0) {
3655
+ const preview = conflicts
3656
+ .slice(0, 5)
3657
+ .map((conflict) =&gt; `${conflict.type} "${conflict.key}" at ${conflict.path}`)
3658
+ .join("\n");
3659
+ const suffix = conflicts.length &gt; 5 ? <span class="branch-0 cbranch-no" title="branch not covered" >`\n...and ${conflicts.length - 5} more` </span>: "";
3660
+ &nbsp;
3661
+ throw new Error(
3662
+ `Promotion has ${conflicts.length} conflict(s) and --conflicts=fail was used.\n${preview}${suffix}`,
3663
+ );
3664
+ }
3665
+ &nbsp;
3666
+ if (options.apply === true) {
3667
+ await writePlan(destinationDatasource, plans);
3668
+ }
3669
+ &nbsp;
3670
+ const created = plans
3671
+ .filter((plan) =&gt; !plan.destination)
3672
+ .map((plan) =&gt;
3673
+ formatProjectPath(
3674
+ projectConfig,
3675
+ getEntityFilePath(destinationDatasource.getConfig(), plan.type, plan.key),
3676
+ ),
3677
+ );
3678
+ const updated = plans
3679
+ .filter((plan) =&gt; plan.destination &amp;&amp; !deepEqual(plan.destination, plan.merged))
3680
+ .map((plan) =&gt;
3681
+ formatProjectPath(
3682
+ projectConfig,
3683
+ getEntityFilePath(destinationDatasource.getConfig(), plan.type, plan.key),
3684
+ ),
3685
+ );
3686
+ const unchanged = plans
3687
+ .filter((plan) =&gt; plan.destination &amp;&amp; deepEqual(plan.destination, plan.merged))
3688
+ .map((plan) =&gt;
3689
+ formatProjectPath(
3690
+ projectConfig,
3691
+ getEntityFilePath(destinationDatasource.getConfig(), plan.type, plan.key),
3692
+ ),
3693
+ );
3694
+ &nbsp;
3695
+ const dependencies = {
3696
+ attribute: plans.filter((plan) =&gt; plan.type === "attribute").length,
3697
+ segment: plans.filter((plan) =&gt; plan.type === "segment").length,
3698
+ feature: plans.filter((plan) =&gt; plan.type === "feature").length,
3699
+ group: plans.filter((plan) =&gt; plan.type === "group").length,
3700
+ schema: plans.filter((plan) =&gt; plan.type === "schema").length,
3701
+ target: plans.filter((plan) =&gt; plan.type === "target").length,
3702
+ test: plans.filter((plan) =&gt; plan.type === "test").length,
3703
+ };
3704
+ &nbsp;
3705
+ const result: PromoteProjectSetsResult = {
3706
+ from: options.from,
3707
+ to: options.to,
3708
+ apply: options.apply === true,
3709
+ duration: Date.now() - startTime,
3710
+ filters: {
3711
+ includeFeatures: toArray(options.includeFeatures),
3712
+ excludeFeatures: toArray(options.excludeFeatures),
3713
+ targets: toArray(options.target),
3714
+ tags: toArray(options.tag),
3715
+ conflicts: conflictPolicy,
3716
+ },
3717
+ dependencies,
3718
+ files: { created, updated, unchanged },
3719
+ conflicts,
3720
+ };
3721
+ &nbsp;
3722
+ if (result.apply &amp;&amp; auditFormat) {
3723
+ result.auditFilePath = await writePromotionAudit(projectConfig, result, auditFormat);
3724
+ }
3725
+ &nbsp;
3726
+ return result;
3727
+ }
3728
+ &nbsp;
3729
+ function printFileGroup(label: string, files: string[], color: number) {
3730
+ if (files.length === 0) {
3731
+ return;
3732
+ }
3733
+ &nbsp;
3734
+ console.log(CLI_FORMAT_BOLD, label);
3735
+ for (const filePath of files) {
3736
+ console.log(` ${colorize(filePath, color)}`);
3737
+ }
3738
+ console.log("");
3739
+ }
3740
+ &nbsp;
3741
+ function printConflictPreview(conflicts: PromotionConflict[]) {
3742
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (conflicts.length === 0) {
3743
+ <span class="cstat-no" title="statement not covered" > return;</span>
3744
+ }
3745
+ &nbsp;
3746
+ console.log(CLI_FORMAT_BOLD, "Conflicts");
3747
+ for (const conflict of conflicts.slice(0, 10)) {
3748
+ console.log(
3749
+ ` ${colorize(conflict.type, CLI_COLOR_YELLOW)} ${conflict.key} ${colorize(
3750
+ conflict.path,
3751
+ CLI_COLOR_DIM,
3752
+ )}`,
3753
+ );
3754
+ }
3755
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (conflicts.length &gt; 10) {
3756
+ <span class="cstat-no" title="statement not covered" > console.log(` ${colorize(`...and ${conflicts.length - 10} more`, CLI_COLOR_DIM)}`);</span>
3757
+ }
3758
+ console.log("");
3759
+ }
3760
+ &nbsp;
3761
+ function printPromoteResult(
3762
+ result: PromoteProjectSetsResult,
3763
+ options: { showUnchanged?: boolean } = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
3764
+ ) {
3765
+ console.log("");
3766
+ console.log(CLI_FORMAT_BOLD, "Promoting Featurevisor set definitions");
3767
+ console.log(` From: ${result.from}`);
3768
+ console.log(` To: ${result.to}`);
3769
+ console.log(` Mode: ${result.apply ? <span class="branch-0 cbranch-no" title="branch not covered" >"apply" : "</span>preview"}`);
3770
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (result.filters.includeFeatures.length &gt; 0) {
3771
+ <span class="cstat-no" title="statement not covered" > console.log(` Include features: ${result.filters.includeFeatures.join(", ")}`);</span>
3772
+ }
3773
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (result.filters.excludeFeatures.length &gt; 0) {
3774
+ <span class="cstat-no" title="statement not covered" > console.log(` Exclude features: ${result.filters.excludeFeatures.join(", ")}`);</span>
3775
+ }
3776
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (result.filters.targets.length &gt; 0) {
3777
+ <span class="cstat-no" title="statement not covered" > console.log(` Targets: ${result.filters.targets.join(", ")}`);</span>
3778
+ }
3779
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (result.filters.tags.length &gt; 0) {
3780
+ <span class="cstat-no" title="statement not covered" > console.log(` Tags: ${result.filters.tags.join(", ")}`);</span>
3781
+ }
3782
+ console.log(` Conflict policy: ${result.filters.conflicts}`);
3783
+ console.log("");
3784
+ console.log(
3785
+ ` Dependencies: ${result.dependencies.attribute} attributes, ${result.dependencies.segment} segments, ${result.dependencies.feature} features, ${result.dependencies.group} groups, ${result.dependencies.schema} schemas, ${result.dependencies.target} targets, ${result.dependencies.test} tests`,
3786
+ );
3787
+ console.log(` Created: ${result.files.created.length}`);
3788
+ console.log(` Updated: ${result.files.updated.length}`);
3789
+ console.log(` Unchanged: ${result.files.unchanged.length}`);
3790
+ console.log(` Conflicts: ${result.conflicts.length}`);
3791
+ console.log("");
3792
+ &nbsp;
3793
+ printFileGroup("Created", result.files.created, CLI_COLOR_GREEN);
3794
+ printFileGroup("Updated", result.files.updated, CLI_COLOR_YELLOW);
3795
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (options.showUnchanged === true) {
3796
+ <span class="cstat-no" title="statement not covered" > printFileGroup("Unchanged", result.files.unchanged, CLI_COLOR_DIM);</span>
3797
+ }
3798
+ printConflictPreview(result.conflicts);
3799
+ &nbsp;
3800
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (result.auditFilePath) {
3801
+ <span class="cstat-no" title="statement not covered" > console.log(` Audit: ${colorize(result.auditFilePath, CLI_COLOR_CYAN)}`);</span>
3802
+ <span class="cstat-no" title="statement not covered" > console.log("");</span>
3803
+ }
3804
+ &nbsp;
3805
+ console.log(CLI_FORMAT_GREEN, result.apply ? <span class="branch-0 cbranch-no" title="branch not covered" >"Promotion applied" : "</span>Promotion preview complete");
3806
+ console.log(CLI_FORMAT_BOLD, `Time: ${prettyDuration(result.duration)}`);
3807
+ }
3808
+ &nbsp;
3809
+ export const promotePlugin: Plugin = {
3810
+ command: "promote",
3811
+ handler: async ({ projectConfig, datasource, parsed }) =&gt; {
3812
+ const result = await promoteProjectSets(projectConfig, datasource, {
3813
+ from: parsed.from,
3814
+ to: parsed.to,
3815
+ includeFeatures: parsed.includeFeatures,
3816
+ excludeFeatures: parsed.excludeFeatures,
3817
+ target: parsed.target,
3818
+ tag: parsed.tag,
3819
+ conflicts: parsed.conflicts,
3820
+ allowEmpty: parsed.allowEmpty === true || parsed.allowEmpty === "true",
3821
+ apply: parsed.apply === true || parsed.apply === "true",
3822
+ audit: parsed.audit,
3823
+ });
3824
+ &nbsp;
3825
+ printPromoteResult(result, {
3826
+ showUnchanged: parsed.showUnchanged === true || parsed.showUnchanged === "true",
3827
+ });
3828
+ },
3829
+ examples: [
3830
+ {
3831
+ command: "promote --from=dev --to=staging",
3832
+ description: "preview definitions that can be promoted from one set to another",
3833
+ },
3834
+ {
3835
+ command: "promote --from=dev --to=staging --target=web",
3836
+ description: "preview the target and every definition needed to build its datafile",
3837
+ },
3838
+ {
3839
+ command: "promote --from=dev --to=staging --tag=web",
3840
+ description: "preview definitions affecting features with a tag",
3841
+ },
3842
+ {
3843
+ command: 'promote --from=dev --to=staging --includeFeatures="checkout*"',
3844
+ description: "preview definitions affecting matching features",
3845
+ },
3846
+ {
3847
+ command: "promote --from=dev --to=staging --conflicts=fail",
3848
+ description: "fail instead of overwriting conflicting destination fields",
3849
+ },
3850
+ {
3851
+ command: "promote --from=dev --to=staging --apply",
3852
+ description: "apply a promotion and write destination files",
3853
+ },
3854
+ {
3855
+ command: "promote --from=dev --to=staging --apply --audit=markdown",
3856
+ description: "write a promotion audit file",
3857
+ },
3858
+ {
3859
+ command: "promote --from=dev --to=staging --showUnchanged",
3860
+ description: "preview a promotion and include unchanged entries",
3861
+ },
3862
+ ],
3863
+ };
3864
+ &nbsp;</pre></td></tr></table></pre>
3865
+
3866
+ <div class='push'></div><!-- for sticky footer -->
3867
+ </div><!-- /wrapper -->
3868
+ <div class='footer quiet pad2 space-top1 center small'>
3869
+ Code coverage generated by
3870
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3871
+ at 2026-07-12T20:35:50.655Z
3872
+ </div>
3873
+ <script src="../../prettify.js"></script>
3874
+ <script>
3875
+ window.onload = function () {
3876
+ prettyPrint();
3877
+ };
3878
+ </script>
3879
+ <script src="../../sorter.js"></script>
3880
+ <script src="../../block-navigation.js"></script>
3881
+ </body>
3882
+ </html>
3883
+