@sentry/warden 0.29.1 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/CHANGELOG.md +491 -0
  2. package/README.md +2 -1
  3. package/coverage/lcov-report/base.css +224 -0
  4. package/coverage/lcov-report/block-navigation.js +87 -0
  5. package/coverage/lcov-report/favicon.png +0 -0
  6. package/coverage/lcov-report/index.html +446 -0
  7. package/coverage/lcov-report/prettify.css +1 -0
  8. package/coverage/lcov-report/prettify.js +2 -0
  9. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  10. package/coverage/lcov-report/sorter.js +210 -0
  11. package/coverage/lcov-report/src/action/checks/index.html +116 -0
  12. package/coverage/lcov-report/src/action/checks/manager.ts.html +499 -0
  13. package/coverage/lcov-report/src/action/error-reporting.ts.html +181 -0
  14. package/coverage/lcov-report/src/action/fix-evaluation/github.ts.html +508 -0
  15. package/coverage/lcov-report/src/action/fix-evaluation/index.html +161 -0
  16. package/coverage/lcov-report/src/action/fix-evaluation/index.ts.html +1243 -0
  17. package/coverage/lcov-report/src/action/fix-evaluation/judge.ts.html +817 -0
  18. package/coverage/lcov-report/src/action/fix-evaluation/types.ts.html +274 -0
  19. package/coverage/lcov-report/src/action/index.html +161 -0
  20. package/coverage/lcov-report/src/action/inputs.ts.html +529 -0
  21. package/coverage/lcov-report/src/action/pi-ncc-compat.ts.html +292 -0
  22. package/coverage/lcov-report/src/action/review/coordination.ts.html +208 -0
  23. package/coverage/lcov-report/src/action/review/index.html +131 -0
  24. package/coverage/lcov-report/src/action/review/poster.ts.html +1051 -0
  25. package/coverage/lcov-report/src/action/review-state.ts.html +280 -0
  26. package/coverage/lcov-report/src/action/triggers/executor.ts.html +856 -0
  27. package/coverage/lcov-report/src/action/triggers/index.html +116 -0
  28. package/coverage/lcov-report/src/action/workflow/base.ts.html +1135 -0
  29. package/coverage/lcov-report/src/action/workflow/index.html +146 -0
  30. package/coverage/lcov-report/src/action/workflow/pr-workflow.ts.html +2713 -0
  31. package/coverage/lcov-report/src/action/workflow/schedule.ts.html +1027 -0
  32. package/coverage/lcov-report/src/cli/args.ts.html +1657 -0
  33. package/coverage/lcov-report/src/cli/commands/add.ts.html +1567 -0
  34. package/coverage/lcov-report/src/cli/commands/build.ts.html +1618 -0
  35. package/coverage/lcov-report/src/cli/commands/index.html +191 -0
  36. package/coverage/lcov-report/src/cli/commands/init.ts.html +1357 -0
  37. package/coverage/lcov-report/src/cli/commands/runs.ts.html +2560 -0
  38. package/coverage/lcov-report/src/cli/commands/setup-app/browser.ts.html +214 -0
  39. package/coverage/lcov-report/src/cli/commands/setup-app/credentials.ts.html +220 -0
  40. package/coverage/lcov-report/src/cli/commands/setup-app/index.html +161 -0
  41. package/coverage/lcov-report/src/cli/commands/setup-app/manifest.ts.html +235 -0
  42. package/coverage/lcov-report/src/cli/commands/setup-app/server.ts.html +601 -0
  43. package/coverage/lcov-report/src/cli/commands/setup-app.ts.html +571 -0
  44. package/coverage/lcov-report/src/cli/commands/sync.ts.html +475 -0
  45. package/coverage/lcov-report/src/cli/context.ts.html +532 -0
  46. package/coverage/lcov-report/src/cli/diff-apply.ts.html +334 -0
  47. package/coverage/lcov-report/src/cli/files.ts.html +904 -0
  48. package/coverage/lcov-report/src/cli/fix.ts.html +1060 -0
  49. package/coverage/lcov-report/src/cli/git.ts.html +1201 -0
  50. package/coverage/lcov-report/src/cli/help.ts.html +1696 -0
  51. package/coverage/lcov-report/src/cli/index.html +281 -0
  52. package/coverage/lcov-report/src/cli/input.ts.html +397 -0
  53. package/coverage/lcov-report/src/cli/log-cleanup.ts.html +337 -0
  54. package/coverage/lcov-report/src/cli/main.ts.html +5107 -0
  55. package/coverage/lcov-report/src/cli/output/box.ts.html +790 -0
  56. package/coverage/lcov-report/src/cli/output/formatters.ts.html +1099 -0
  57. package/coverage/lcov-report/src/cli/output/icons.ts.html +142 -0
  58. package/coverage/lcov-report/src/cli/output/index.html +281 -0
  59. package/coverage/lcov-report/src/cli/output/index.ts.html +295 -0
  60. package/coverage/lcov-report/src/cli/output/ink-runner.tsx.html +1597 -0
  61. package/coverage/lcov-report/src/cli/output/jsonl-schema-gen.ts.html +355 -0
  62. package/coverage/lcov-report/src/cli/output/jsonl.ts.html +2137 -0
  63. package/coverage/lcov-report/src/cli/output/live-status.tsx.html +916 -0
  64. package/coverage/lcov-report/src/cli/output/reporter.ts.html +1630 -0
  65. package/coverage/lcov-report/src/cli/output/tasks.ts.html +3193 -0
  66. package/coverage/lcov-report/src/cli/output/tty.ts.html +310 -0
  67. package/coverage/lcov-report/src/cli/output/verbosity.ts.html +181 -0
  68. package/coverage/lcov-report/src/cli/signals.ts.html +199 -0
  69. package/coverage/lcov-report/src/cli/terminal.ts.html +1060 -0
  70. package/coverage/lcov-report/src/config/index.html +161 -0
  71. package/coverage/lcov-report/src/config/index.ts.html +94 -0
  72. package/coverage/lcov-report/src/config/loader.ts.html +1753 -0
  73. package/coverage/lcov-report/src/config/schema.ts.html +910 -0
  74. package/coverage/lcov-report/src/config/writer.ts.html +538 -0
  75. package/coverage/lcov-report/src/diff/apply.ts.html +241 -0
  76. package/coverage/lcov-report/src/diff/classify.ts.html +361 -0
  77. package/coverage/lcov-report/src/diff/coalesce.ts.html +1123 -0
  78. package/coverage/lcov-report/src/diff/context.ts.html +952 -0
  79. package/coverage/lcov-report/src/diff/index.html +191 -0
  80. package/coverage/lcov-report/src/diff/index.ts.html +100 -0
  81. package/coverage/lcov-report/src/diff/parser.ts.html +532 -0
  82. package/coverage/lcov-report/src/evals/harness.ts.html +700 -0
  83. package/coverage/lcov-report/src/evals/index.html +221 -0
  84. package/coverage/lcov-report/src/evals/index.ts.html +955 -0
  85. package/coverage/lcov-report/src/evals/names.ts.html +121 -0
  86. package/coverage/lcov-report/src/evals/runner.ts.html +664 -0
  87. package/coverage/lcov-report/src/evals/scaffold.ts.html +970 -0
  88. package/coverage/lcov-report/src/evals/types.ts.html +661 -0
  89. package/coverage/lcov-report/src/evals/usage.ts.html +178 -0
  90. package/coverage/lcov-report/src/evals/verify.ts.html +1054 -0
  91. package/coverage/lcov-report/src/event/context.ts.html +490 -0
  92. package/coverage/lcov-report/src/event/index.html +116 -0
  93. package/coverage/lcov-report/src/index.html +116 -0
  94. package/coverage/lcov-report/src/output/dedup.ts.html +2950 -0
  95. package/coverage/lcov-report/src/output/github-checks.ts.html +1579 -0
  96. package/coverage/lcov-report/src/output/index.html +161 -0
  97. package/coverage/lcov-report/src/output/renderer.ts.html +988 -0
  98. package/coverage/lcov-report/src/output/stale.ts.html +640 -0
  99. package/coverage/lcov-report/src/sdk/analyze.ts.html +3010 -0
  100. package/coverage/lcov-report/src/sdk/auth.ts.html +217 -0
  101. package/coverage/lcov-report/src/sdk/circuit-breaker.ts.html +304 -0
  102. package/coverage/lcov-report/src/sdk/errors.ts.html +658 -0
  103. package/coverage/lcov-report/src/sdk/extract.ts.html +1810 -0
  104. package/coverage/lcov-report/src/sdk/fix-quality.ts.html +841 -0
  105. package/coverage/lcov-report/src/sdk/haiku.ts.html +1456 -0
  106. package/coverage/lcov-report/src/sdk/index.html +416 -0
  107. package/coverage/lcov-report/src/sdk/json-output.ts.html +508 -0
  108. package/coverage/lcov-report/src/sdk/model-pricing.json.html +499 -0
  109. package/coverage/lcov-report/src/sdk/otel.ts.html +433 -0
  110. package/coverage/lcov-report/src/sdk/post-process.ts.html +412 -0
  111. package/coverage/lcov-report/src/sdk/prepare.ts.html +400 -0
  112. package/coverage/lcov-report/src/sdk/pricing.ts.html +778 -0
  113. package/coverage/lcov-report/src/sdk/prompt-sections.ts.html +595 -0
  114. package/coverage/lcov-report/src/sdk/prompt.ts.html +451 -0
  115. package/coverage/lcov-report/src/sdk/report-files.ts.html +166 -0
  116. package/coverage/lcov-report/src/sdk/retry.ts.html +202 -0
  117. package/coverage/lcov-report/src/sdk/runner.ts.html +400 -0
  118. package/coverage/lcov-report/src/sdk/runtimes/claude.ts.html +1693 -0
  119. package/coverage/lcov-report/src/sdk/runtimes/index.html +176 -0
  120. package/coverage/lcov-report/src/sdk/runtimes/index.ts.html +244 -0
  121. package/coverage/lcov-report/src/sdk/runtimes/model-selectors.ts.html +328 -0
  122. package/coverage/lcov-report/src/sdk/runtimes/pi.ts.html +2104 -0
  123. package/coverage/lcov-report/src/sdk/runtimes/types.ts.html +508 -0
  124. package/coverage/lcov-report/src/sdk/types.ts.html +730 -0
  125. package/coverage/lcov-report/src/sdk/usage.ts.html +502 -0
  126. package/coverage/lcov-report/src/sdk/verify.ts.html +1027 -0
  127. package/coverage/lcov-report/src/sentry.ts.html +994 -0
  128. package/coverage/lcov-report/src/skill-builder/agentic.ts.html +1063 -0
  129. package/coverage/lcov-report/src/skill-builder/authoring-provider.ts.html +334 -0
  130. package/coverage/lcov-report/src/skill-builder/definition.ts.html +748 -0
  131. package/coverage/lcov-report/src/skill-builder/index.html +236 -0
  132. package/coverage/lcov-report/src/skill-builder/outline-contract.ts.html +400 -0
  133. package/coverage/lcov-report/src/skill-builder/outline-state.ts.html +382 -0
  134. package/coverage/lcov-report/src/skill-builder/outline.ts.html +1402 -0
  135. package/coverage/lcov-report/src/skill-builder/skill-contract.ts.html +382 -0
  136. package/coverage/lcov-report/src/skill-builder/skill-prompts.ts.html +1180 -0
  137. package/coverage/lcov-report/src/skill-builder/skill.ts.html +2398 -0
  138. package/coverage/lcov-report/src/skills/index.html +131 -0
  139. package/coverage/lcov-report/src/skills/loader.ts.html +1693 -0
  140. package/coverage/lcov-report/src/skills/remote.ts.html +1909 -0
  141. package/coverage/lcov-report/src/triggers/index.html +116 -0
  142. package/coverage/lcov-report/src/triggers/matcher.ts.html +841 -0
  143. package/coverage/lcov-report/src/types/index.html +116 -0
  144. package/coverage/lcov-report/src/types/index.ts.html +1240 -0
  145. package/coverage/lcov-report/src/utils/async.ts.html +331 -0
  146. package/coverage/lcov-report/src/utils/exec.ts.html +496 -0
  147. package/coverage/lcov-report/src/utils/index.html +176 -0
  148. package/coverage/lcov-report/src/utils/index.ts.html +313 -0
  149. package/coverage/lcov-report/src/utils/path.ts.html +202 -0
  150. package/coverage/lcov-report/src/utils/version.ts.html +136 -0
  151. package/coverage/lcov.info +19134 -0
  152. package/dist/cli/args.js +1 -1
  153. package/dist/cli/args.js.map +1 -1
  154. package/dist/cli/commands/runs.d.ts +1 -1
  155. package/dist/cli/commands/runs.d.ts.map +1 -1
  156. package/dist/cli/commands/runs.js +1 -1
  157. package/dist/cli/commands/runs.js.map +1 -1
  158. package/dist/cli/files.d.ts.map +1 -1
  159. package/dist/cli/files.js +10 -11
  160. package/dist/cli/files.js.map +1 -1
  161. package/dist/cli/help.js +1 -1
  162. package/dist/cli/help.js.map +1 -1
  163. package/dist/sdk/verify.d.ts.map +1 -1
  164. package/dist/sdk/verify.js +3 -2
  165. package/dist/sdk/verify.js.map +1 -1
  166. package/dist/skill-builder/outline.d.ts.map +1 -1
  167. package/dist/skill-builder/outline.js.map +1 -1
  168. package/package.json +8 -3
  169. package/test-results.junit.xml +4329 -0
  170. package/dist/evals/index.d.ts +0 -22
  171. package/dist/evals/index.d.ts.map +0 -1
  172. package/dist/evals/index.js +0 -92
  173. package/dist/evals/index.js.map +0 -1
  174. package/dist/evals/judge.d.ts +0 -12
  175. package/dist/evals/judge.d.ts.map +0 -1
  176. package/dist/evals/judge.js +0 -171
  177. package/dist/evals/judge.js.map +0 -1
  178. package/dist/evals/runner.d.ts +0 -18
  179. package/dist/evals/runner.d.ts.map +0 -1
  180. package/dist/evals/runner.js +0 -149
  181. package/dist/evals/runner.js.map +0 -1
  182. package/dist/evals/setup.d.ts +0 -2
  183. package/dist/evals/setup.d.ts.map +0 -1
  184. package/dist/evals/setup.js +0 -22
  185. package/dist/evals/setup.js.map +0 -1
  186. package/dist/evals/types.d.ts +0 -160
  187. package/dist/evals/types.d.ts.map +0 -1
  188. package/dist/evals/types.js +0 -148
  189. package/dist/evals/types.js.map +0 -1
@@ -0,0 +1,2950 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/output/dedup.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/output</a> dedup.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">72.31% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>209/289</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">63.13% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>125/198</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">77.5% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>31/40</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">71.95% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>195/271</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line medium'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-neutral">&nbsp;</span>
1023
+ <span class="cline-any cline-neutral">&nbsp;</span>
1024
+ <span class="cline-any cline-neutral">&nbsp;</span>
1025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-neutral">&nbsp;</span>
1030
+ <span class="cline-any cline-neutral">&nbsp;</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-neutral">&nbsp;</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-neutral">&nbsp;</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-neutral">&nbsp;</span>
1049
+ <span class="cline-any cline-neutral">&nbsp;</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-neutral">&nbsp;</span>
1057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1058
+ <span class="cline-any cline-neutral">&nbsp;</span>
1059
+ <span class="cline-any cline-neutral">&nbsp;</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-neutral">&nbsp;</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-neutral">&nbsp;</span>
1080
+ <span class="cline-any cline-neutral">&nbsp;</span>
1081
+ <span class="cline-any cline-neutral">&nbsp;</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-neutral">&nbsp;</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-neutral">&nbsp;</span>
1090
+ <span class="cline-any cline-neutral">&nbsp;</span>
1091
+ <span class="cline-any cline-neutral">&nbsp;</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-neutral">&nbsp;</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-neutral">&nbsp;</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-yes">128x</span>
1104
+ <span class="cline-any cline-yes">128x</span>
1105
+ <span class="cline-any cline-neutral">&nbsp;</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1107
+ <span class="cline-any cline-neutral">&nbsp;</span>
1108
+ <span class="cline-any cline-neutral">&nbsp;</span>
1109
+ <span class="cline-any cline-neutral">&nbsp;</span>
1110
+ <span class="cline-any cline-neutral">&nbsp;</span>
1111
+ <span class="cline-any cline-neutral">&nbsp;</span>
1112
+ <span class="cline-any cline-yes">62x</span>
1113
+ <span class="cline-any cline-neutral">&nbsp;</span>
1114
+ <span class="cline-any cline-neutral">&nbsp;</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-neutral">&nbsp;</span>
1120
+ <span class="cline-any cline-yes">6x</span>
1121
+ <span class="cline-any cline-yes">6x</span>
1122
+ <span class="cline-any cline-yes">2x</span>
1123
+ <span class="cline-any cline-neutral">&nbsp;</span>
1124
+ <span class="cline-any cline-neutral">&nbsp;</span>
1125
+ <span class="cline-any cline-yes">4x</span>
1126
+ <span class="cline-any cline-yes">4x</span>
1127
+ <span class="cline-any cline-yes">4x</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-yes">4x</span>
1131
+ <span class="cline-any cline-no">&nbsp;</span>
1132
+ <span class="cline-any cline-neutral">&nbsp;</span>
1133
+ <span class="cline-any cline-neutral">&nbsp;</span>
1134
+ <span class="cline-any cline-yes">4x</span>
1135
+ <span class="cline-any cline-neutral">&nbsp;</span>
1136
+ <span class="cline-any cline-neutral">&nbsp;</span>
1137
+ <span class="cline-any cline-neutral">&nbsp;</span>
1138
+ <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-neutral">&nbsp;</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-neutral">&nbsp;</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-neutral">&nbsp;</span>
1145
+ <span class="cline-any cline-neutral">&nbsp;</span>
1146
+ <span class="cline-any cline-neutral">&nbsp;</span>
1147
+ <span class="cline-any cline-neutral">&nbsp;</span>
1148
+ <span class="cline-any cline-neutral">&nbsp;</span>
1149
+ <span class="cline-any cline-yes">6x</span>
1150
+ <span class="cline-any cline-yes">6x</span>
1151
+ <span class="cline-any cline-yes">1x</span>
1152
+ <span class="cline-any cline-neutral">&nbsp;</span>
1153
+ <span class="cline-any cline-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-neutral">&nbsp;</span>
1155
+ <span class="cline-any cline-yes">5x</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
1157
+ <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-yes">5x</span>
1159
+ <span class="cline-any cline-yes">5x</span>
1160
+ <span class="cline-any cline-yes">5x</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-yes">6x</span>
1163
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
+ <span class="cline-any cline-yes">6x</span>
1165
+ <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-neutral">&nbsp;</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-neutral">&nbsp;</span>
1171
+ <span class="cline-any cline-yes">5x</span>
1172
+ <span class="cline-any cline-yes">5x</span>
1173
+ <span class="cline-any cline-yes">3x</span>
1174
+ <span class="cline-any cline-yes">3x</span>
1175
+ <span class="cline-any cline-yes">3x</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-neutral">&nbsp;</span>
1178
+ <span class="cline-any cline-yes">2x</span>
1179
+ <span class="cline-any cline-yes">2x</span>
1180
+ <span class="cline-any cline-neutral">&nbsp;</span>
1181
+ <span class="cline-any cline-neutral">&nbsp;</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-neutral">&nbsp;</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-neutral">&nbsp;</span>
1187
+ <span class="cline-any cline-neutral">&nbsp;</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
+ <span class="cline-any cline-yes">8x</span>
1192
+ <span class="cline-any cline-neutral">&nbsp;</span>
1193
+ <span class="cline-any cline-neutral">&nbsp;</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-yes">6x</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-yes">9x</span>
1203
+ <span class="cline-any cline-neutral">&nbsp;</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-neutral">&nbsp;</span>
1206
+ <span class="cline-any cline-neutral">&nbsp;</span>
1207
+ <span class="cline-any cline-neutral">&nbsp;</span>
1208
+ <span class="cline-any cline-neutral">&nbsp;</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-neutral">&nbsp;</span>
1211
+ <span class="cline-any cline-neutral">&nbsp;</span>
1212
+ <span class="cline-any cline-neutral">&nbsp;</span>
1213
+ <span class="cline-any cline-neutral">&nbsp;</span>
1214
+ <span class="cline-any cline-neutral">&nbsp;</span>
1215
+ <span class="cline-any cline-neutral">&nbsp;</span>
1216
+ <span class="cline-any cline-neutral">&nbsp;</span>
1217
+ <span class="cline-any cline-yes">35x</span>
1218
+ <span class="cline-any cline-yes">35x</span>
1219
+ <span class="cline-any cline-yes">6x</span>
1220
+ <span class="cline-any cline-yes">6x</span>
1221
+ <span class="cline-any cline-neutral">&nbsp;</span>
1222
+ <span class="cline-any cline-neutral">&nbsp;</span>
1223
+ <span class="cline-any cline-neutral">&nbsp;</span>
1224
+ <span class="cline-any cline-yes">29x</span>
1225
+ <span class="cline-any cline-yes">29x</span>
1226
+ <span class="cline-any cline-yes">7x</span>
1227
+ <span class="cline-any cline-yes">11x</span>
1228
+ <span class="cline-any cline-yes">11x</span>
1229
+ <span class="cline-any cline-yes">7x</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-yes">22x</span>
1234
+ <span class="cline-any cline-yes">22x</span>
1235
+ <span class="cline-any cline-yes">7x</span>
1236
+ <span class="cline-any cline-yes">11x</span>
1237
+ <span class="cline-any cline-yes">11x</span>
1238
+ <span class="cline-any cline-yes">7x</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-neutral">&nbsp;</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-yes">15x</span>
1243
+ <span class="cline-any cline-yes">15x</span>
1244
+ <span class="cline-any cline-yes">8x</span>
1245
+ <span class="cline-any cline-yes">12x</span>
1246
+ <span class="cline-any cline-yes">12x</span>
1247
+ <span class="cline-any cline-yes">8x</span>
1248
+ <span class="cline-any cline-neutral">&nbsp;</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-yes">7x</span>
1252
+ <span class="cline-any cline-yes">7x</span>
1253
+ <span class="cline-any cline-yes">1x</span>
1254
+ <span class="cline-any cline-neutral">&nbsp;</span>
1255
+ <span class="cline-any cline-yes">6x</span>
1256
+ <span class="cline-any cline-neutral">&nbsp;</span>
1257
+ <span class="cline-any cline-yes">10x</span>
1258
+ <span class="cline-any cline-neutral">&nbsp;</span>
1259
+ <span class="cline-any cline-neutral">&nbsp;</span>
1260
+ <span class="cline-any cline-neutral">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-neutral">&nbsp;</span>
1263
+ <span class="cline-any cline-neutral">&nbsp;</span>
1264
+ <span class="cline-any cline-neutral">&nbsp;</span>
1265
+ <span class="cline-any cline-neutral">&nbsp;</span>
1266
+ <span class="cline-any cline-neutral">&nbsp;</span>
1267
+ <span class="cline-any cline-neutral">&nbsp;</span>
1268
+ <span class="cline-any cline-neutral">&nbsp;</span>
1269
+ <span class="cline-any cline-neutral">&nbsp;</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-neutral">&nbsp;</span>
1272
+ <span class="cline-any cline-neutral">&nbsp;</span>
1273
+ <span class="cline-any cline-neutral">&nbsp;</span>
1274
+ <span class="cline-any cline-neutral">&nbsp;</span>
1275
+ <span class="cline-any cline-yes">17x</span>
1276
+ <span class="cline-any cline-neutral">&nbsp;</span>
1277
+ <span class="cline-any cline-neutral">&nbsp;</span>
1278
+ <span class="cline-any cline-yes">17x</span>
1279
+ <span class="cline-any cline-no">&nbsp;</span>
1280
+ <span class="cline-any cline-neutral">&nbsp;</span>
1281
+ <span class="cline-any cline-neutral">&nbsp;</span>
1282
+ <span class="cline-any cline-neutral">&nbsp;</span>
1283
+ <span class="cline-any cline-yes">17x</span>
1284
+ <span class="cline-any cline-yes">5x</span>
1285
+ <span class="cline-any cline-neutral">&nbsp;</span>
1286
+ <span class="cline-any cline-neutral">&nbsp;</span>
1287
+ <span class="cline-any cline-neutral">&nbsp;</span>
1288
+ <span class="cline-any cline-yes">12x</span>
1289
+ <span class="cline-any cline-yes">12x</span>
1290
+ <span class="cline-any cline-yes">1x</span>
1291
+ <span class="cline-any cline-yes">1x</span>
1292
+ <span class="cline-any cline-yes">1x</span>
1293
+ <span class="cline-any cline-yes">1x</span>
1294
+ <span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-yes">1x</span>
1296
+ <span class="cline-any cline-neutral">&nbsp;</span>
1297
+ <span class="cline-any cline-neutral">&nbsp;</span>
1298
+ <span class="cline-any cline-neutral">&nbsp;</span>
1299
+ <span class="cline-any cline-neutral">&nbsp;</span>
1300
+ <span class="cline-any cline-yes">11x</span>
1301
+ <span class="cline-any cline-yes">17x</span>
1302
+ <span class="cline-any cline-yes">4x</span>
1303
+ <span class="cline-any cline-yes">3x</span>
1304
+ <span class="cline-any cline-yes">3x</span>
1305
+ <span class="cline-any cline-yes">3x</span>
1306
+ <span class="cline-any cline-neutral">&nbsp;</span>
1307
+ <span class="cline-any cline-yes">3x</span>
1308
+ <span class="cline-any cline-neutral">&nbsp;</span>
1309
+ <span class="cline-any cline-neutral">&nbsp;</span>
1310
+ <span class="cline-any cline-neutral">&nbsp;</span>
1311
+ <span class="cline-any cline-neutral">&nbsp;</span>
1312
+ <span class="cline-any cline-yes">8x</span>
1313
+ <span class="cline-any cline-yes">8x</span>
1314
+ <span class="cline-any cline-yes">4x</span>
1315
+ <span class="cline-any cline-yes">3x</span>
1316
+ <span class="cline-any cline-yes">3x</span>
1317
+ <span class="cline-any cline-yes">3x</span>
1318
+ <span class="cline-any cline-neutral">&nbsp;</span>
1319
+ <span class="cline-any cline-yes">3x</span>
1320
+ <span class="cline-any cline-neutral">&nbsp;</span>
1321
+ <span class="cline-any cline-neutral">&nbsp;</span>
1322
+ <span class="cline-any cline-neutral">&nbsp;</span>
1323
+ <span class="cline-any cline-neutral">&nbsp;</span>
1324
+ <span class="cline-any cline-yes">5x</span>
1325
+ <span class="cline-any cline-yes">5x</span>
1326
+ <span class="cline-any cline-yes">4x</span>
1327
+ <span class="cline-any cline-neutral">&nbsp;</span>
1328
+ <span class="cline-any cline-yes">3x</span>
1329
+ <span class="cline-any cline-yes">3x</span>
1330
+ <span class="cline-any cline-yes">3x</span>
1331
+ <span class="cline-any cline-yes">3x</span>
1332
+ <span class="cline-any cline-yes">3x</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-yes">3x</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-yes">2x</span>
1340
+ <span class="cline-any cline-neutral">&nbsp;</span>
1341
+ <span class="cline-any cline-yes">2x</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
1362
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">5x</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-yes">1x</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-yes">1x</span>
1417
+ <span class="cline-any cline-yes">1x</span>
1418
+ <span class="cline-any cline-neutral">&nbsp;</span>
1419
+ <span class="cline-any cline-yes">1x</span>
1420
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1428
+ <span class="cline-any cline-yes">1x</span>
1429
+ <span class="cline-any cline-neutral">&nbsp;</span>
1430
+ <span class="cline-any cline-no">&nbsp;</span>
1431
+ <span class="cline-any cline-neutral">&nbsp;</span>
1432
+ <span class="cline-any cline-neutral">&nbsp;</span>
1433
+ <span class="cline-any cline-yes">1x</span>
1434
+ <span class="cline-any cline-neutral">&nbsp;</span>
1435
+ <span class="cline-any cline-yes">1x</span>
1436
+ <span class="cline-any cline-neutral">&nbsp;</span>
1437
+ <span class="cline-any cline-yes">1x</span>
1438
+ <span class="cline-any cline-yes">1x</span>
1439
+ <span class="cline-any cline-no">&nbsp;</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-yes">1x</span>
1443
+ <span class="cline-any cline-yes">1x</span>
1444
+ <span class="cline-any cline-yes">1x</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-neutral">&nbsp;</span>
1448
+ <span class="cline-any cline-yes">1x</span>
1449
+ <span class="cline-any cline-yes">1x</span>
1450
+ <span class="cline-any cline-neutral">&nbsp;</span>
1451
+ <span class="cline-any cline-yes">1x</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-neutral">&nbsp;</span>
1458
+ <span class="cline-any cline-neutral">&nbsp;</span>
1459
+ <span class="cline-any cline-neutral">&nbsp;</span>
1460
+ <span class="cline-any cline-neutral">&nbsp;</span>
1461
+ <span class="cline-any cline-neutral">&nbsp;</span>
1462
+ <span class="cline-any cline-neutral">&nbsp;</span>
1463
+ <span class="cline-any cline-neutral">&nbsp;</span>
1464
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1468
+ <span class="cline-any cline-yes">1x</span>
1469
+ <span class="cline-any cline-yes">1x</span>
1470
+ <span class="cline-any cline-neutral">&nbsp;</span>
1471
+ <span class="cline-any cline-neutral">&nbsp;</span>
1472
+ <span class="cline-any cline-yes">1x</span>
1473
+ <span class="cline-any cline-neutral">&nbsp;</span>
1474
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
1484
+ <span class="cline-any cline-no">&nbsp;</span>
1485
+ <span class="cline-any cline-no">&nbsp;</span>
1486
+ <span class="cline-any cline-neutral">&nbsp;</span>
1487
+ <span class="cline-any cline-neutral">&nbsp;</span>
1488
+ <span class="cline-any cline-neutral">&nbsp;</span>
1489
+ <span class="cline-any cline-yes">5x</span>
1490
+ <span class="cline-any cline-neutral">&nbsp;</span>
1491
+ <span class="cline-any cline-neutral">&nbsp;</span>
1492
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1496
+ <span class="cline-any cline-neutral">&nbsp;</span>
1497
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1503
+ <span class="cline-any cline-neutral">&nbsp;</span>
1504
+ <span class="cline-any cline-neutral">&nbsp;</span>
1505
+ <span class="cline-any cline-neutral">&nbsp;</span>
1506
+ <span class="cline-any cline-neutral">&nbsp;</span>
1507
+ <span class="cline-any cline-neutral">&nbsp;</span>
1508
+ <span class="cline-any cline-neutral">&nbsp;</span>
1509
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1514
+ <span class="cline-any cline-no">&nbsp;</span>
1515
+ <span class="cline-any cline-no">&nbsp;</span>
1516
+ <span class="cline-any cline-neutral">&nbsp;</span>
1517
+ <span class="cline-any cline-neutral">&nbsp;</span>
1518
+ <span class="cline-any cline-no">&nbsp;</span>
1519
+ <span class="cline-any cline-no">&nbsp;</span>
1520
+ <span class="cline-any cline-neutral">&nbsp;</span>
1521
+ <span class="cline-any cline-neutral">&nbsp;</span>
1522
+ <span class="cline-any cline-no">&nbsp;</span>
1523
+ <span class="cline-any cline-neutral">&nbsp;</span>
1524
+ <span class="cline-any cline-no">&nbsp;</span>
1525
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1530
+ <span class="cline-any cline-neutral">&nbsp;</span>
1531
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1539
+ <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
1545
+ <span class="cline-any cline-neutral">&nbsp;</span>
1546
+ <span class="cline-any cline-neutral">&nbsp;</span>
1547
+ <span class="cline-any cline-neutral">&nbsp;</span>
1548
+ <span class="cline-any cline-neutral">&nbsp;</span>
1549
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1555
+ <span class="cline-any cline-no">&nbsp;</span>
1556
+ <span class="cline-any cline-no">&nbsp;</span>
1557
+ <span class="cline-any cline-no">&nbsp;</span>
1558
+ <span class="cline-any cline-neutral">&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-no">&nbsp;</span>
1562
+ <span class="cline-any cline-no">&nbsp;</span>
1563
+ <span class="cline-any cline-no">&nbsp;</span>
1564
+ <span class="cline-any cline-no">&nbsp;</span>
1565
+ <span class="cline-any cline-no">&nbsp;</span>
1566
+ <span class="cline-any cline-neutral">&nbsp;</span>
1567
+ <span class="cline-any cline-neutral">&nbsp;</span>
1568
+ <span class="cline-any cline-neutral">&nbsp;</span>
1569
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1579
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1585
+ <span class="cline-any cline-neutral">&nbsp;</span>
1586
+ <span class="cline-any cline-neutral">&nbsp;</span>
1587
+ <span class="cline-any cline-yes">5x</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-neutral">&nbsp;</span>
1591
+ <span class="cline-any cline-neutral">&nbsp;</span>
1592
+ <span class="cline-any cline-neutral">&nbsp;</span>
1593
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1597
+ <span class="cline-any cline-neutral">&nbsp;</span>
1598
+ <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
1608
+ <span class="cline-any cline-neutral">&nbsp;</span>
1609
+ <span class="cline-any cline-neutral">&nbsp;</span>
1610
+ <span class="cline-any cline-neutral">&nbsp;</span>
1611
+ <span class="cline-any cline-neutral">&nbsp;</span>
1612
+ <span class="cline-any cline-neutral">&nbsp;</span>
1613
+ <span class="cline-any cline-neutral">&nbsp;</span>
1614
+ <span class="cline-any cline-neutral">&nbsp;</span>
1615
+ <span class="cline-any cline-neutral">&nbsp;</span>
1616
+ <span class="cline-any cline-neutral">&nbsp;</span>
1617
+ <span class="cline-any cline-neutral">&nbsp;</span>
1618
+ <span class="cline-any cline-neutral">&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-no">&nbsp;</span>
1625
+ <span class="cline-any cline-neutral">&nbsp;</span>
1626
+ <span class="cline-any cline-neutral">&nbsp;</span>
1627
+ <span class="cline-any cline-neutral">&nbsp;</span>
1628
+ <span class="cline-any cline-neutral">&nbsp;</span>
1629
+ <span class="cline-any cline-neutral">&nbsp;</span>
1630
+ <span class="cline-any cline-neutral">&nbsp;</span>
1631
+ <span class="cline-any cline-neutral">&nbsp;</span>
1632
+ <span class="cline-any cline-neutral">&nbsp;</span>
1633
+ <span class="cline-any cline-neutral">&nbsp;</span>
1634
+ <span class="cline-any cline-neutral">&nbsp;</span>
1635
+ <span class="cline-any cline-neutral">&nbsp;</span>
1636
+ <span class="cline-any cline-neutral">&nbsp;</span>
1637
+ <span class="cline-any cline-neutral">&nbsp;</span>
1638
+ <span class="cline-any cline-neutral">&nbsp;</span>
1639
+ <span class="cline-any cline-neutral">&nbsp;</span>
1640
+ <span class="cline-any cline-neutral">&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-no">&nbsp;</span>
1647
+ <span class="cline-any cline-no">&nbsp;</span>
1648
+ <span class="cline-any cline-no">&nbsp;</span>
1649
+ <span class="cline-any cline-no">&nbsp;</span>
1650
+ <span class="cline-any cline-no">&nbsp;</span>
1651
+ <span class="cline-any cline-no">&nbsp;</span>
1652
+ <span class="cline-any cline-neutral">&nbsp;</span>
1653
+ <span class="cline-any cline-no">&nbsp;</span>
1654
+ <span class="cline-any cline-neutral">&nbsp;</span>
1655
+ <span class="cline-any cline-no">&nbsp;</span>
1656
+ <span class="cline-any cline-no">&nbsp;</span>
1657
+ <span class="cline-any cline-neutral">&nbsp;</span>
1658
+ <span class="cline-any cline-no">&nbsp;</span>
1659
+ <span class="cline-any cline-no">&nbsp;</span>
1660
+ <span class="cline-any cline-neutral">&nbsp;</span>
1661
+ <span class="cline-any cline-no">&nbsp;</span>
1662
+ <span class="cline-any cline-neutral">&nbsp;</span>
1663
+ <span class="cline-any cline-no">&nbsp;</span>
1664
+ <span class="cline-any cline-no">&nbsp;</span>
1665
+ <span class="cline-any cline-no">&nbsp;</span>
1666
+ <span class="cline-any cline-no">&nbsp;</span>
1667
+ <span class="cline-any cline-neutral">&nbsp;</span>
1668
+ <span class="cline-any cline-no">&nbsp;</span>
1669
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1673
+ <span class="cline-any cline-no">&nbsp;</span>
1674
+ <span class="cline-any cline-neutral">&nbsp;</span>
1675
+ <span class="cline-any cline-neutral">&nbsp;</span>
1676
+ <span class="cline-any cline-neutral">&nbsp;</span>
1677
+ <span class="cline-any cline-no">&nbsp;</span>
1678
+ <span class="cline-any cline-neutral">&nbsp;</span>
1679
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1683
+ <span class="cline-any cline-neutral">&nbsp;</span>
1684
+ <span class="cline-any cline-neutral">&nbsp;</span>
1685
+ <span class="cline-any cline-yes">10x</span>
1686
+ <span class="cline-any cline-yes">1x</span>
1687
+ <span class="cline-any cline-neutral">&nbsp;</span>
1688
+ <span class="cline-any cline-neutral">&nbsp;</span>
1689
+ <span class="cline-any cline-yes">9x</span>
1690
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1703
+ <span class="cline-any cline-neutral">&nbsp;</span>
1704
+ <span class="cline-any cline-neutral">&nbsp;</span>
1705
+ <span class="cline-any cline-neutral">&nbsp;</span>
1706
+ <span class="cline-any cline-yes">5x</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-neutral">&nbsp;</span>
1710
+ <span class="cline-any cline-neutral">&nbsp;</span>
1711
+ <span class="cline-any cline-neutral">&nbsp;</span>
1712
+ <span class="cline-any cline-neutral">&nbsp;</span>
1713
+ <span class="cline-any cline-neutral">&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-yes">5x</span>
1719
+ <span class="cline-any cline-neutral">&nbsp;</span>
1720
+ <span class="cline-any cline-neutral">&nbsp;</span>
1721
+ <span class="cline-any cline-neutral">&nbsp;</span>
1722
+ <span class="cline-any cline-neutral">&nbsp;</span>
1723
+ <span class="cline-any cline-neutral">&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-yes">7x</span>
1729
+ <span class="cline-any cline-yes">7x</span>
1730
+ <span class="cline-any cline-yes">12x</span>
1731
+ <span class="cline-any cline-yes">12x</span>
1732
+ <span class="cline-any cline-yes">12x</span>
1733
+ <span class="cline-any cline-yes">4x</span>
1734
+ <span class="cline-any cline-neutral">&nbsp;</span>
1735
+ <span class="cline-any cline-yes">8x</span>
1736
+ <span class="cline-any cline-neutral">&nbsp;</span>
1737
+ <span class="cline-any cline-neutral">&nbsp;</span>
1738
+ <span class="cline-any cline-neutral">&nbsp;</span>
1739
+ <span class="cline-any cline-yes">7x</span>
1740
+ <span class="cline-any cline-neutral">&nbsp;</span>
1741
+ <span class="cline-any cline-yes">7x</span>
1742
+ <span class="cline-any cline-yes">8x</span>
1743
+ <span class="cline-any cline-neutral">&nbsp;</span>
1744
+ <span class="cline-any cline-neutral">&nbsp;</span>
1745
+ <span class="cline-any cline-yes">4x</span>
1746
+ <span class="cline-any cline-neutral">&nbsp;</span>
1747
+ <span class="cline-any cline-neutral">&nbsp;</span>
1748
+ <span class="cline-any cline-neutral">&nbsp;</span>
1749
+ <span class="cline-any cline-yes">4x</span>
1750
+ <span class="cline-any cline-yes">4x</span>
1751
+ <span class="cline-any cline-yes">4x</span>
1752
+ <span class="cline-any cline-neutral">&nbsp;</span>
1753
+ <span class="cline-any cline-yes">4x</span>
1754
+ <span class="cline-any cline-yes">4x</span>
1755
+ <span class="cline-any cline-yes">4x</span>
1756
+ <span class="cline-any cline-yes">4x</span>
1757
+ <span class="cline-any cline-neutral">&nbsp;</span>
1758
+ <span class="cline-any cline-yes">4x</span>
1759
+ <span class="cline-any cline-yes">2x</span>
1760
+ <span class="cline-any cline-neutral">&nbsp;</span>
1761
+ <span class="cline-any cline-yes">2x</span>
1762
+ <span class="cline-any cline-yes">2x</span>
1763
+ <span class="cline-any cline-neutral">&nbsp;</span>
1764
+ <span class="cline-any cline-neutral">&nbsp;</span>
1765
+ <span class="cline-any cline-yes">4x</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">7x</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-neutral">&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-neutral">&nbsp;</span>
1782
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">9x</span>
1786
+ <span class="cline-any cline-yes">2x</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-yes">7x</span>
1791
+ <span class="cline-any cline-yes">7x</span>
1792
+ <span class="cline-any cline-neutral">&nbsp;</span>
1793
+ <span class="cline-any cline-yes">7x</span>
1794
+ <span class="cline-any cline-yes">14x</span>
1795
+ <span class="cline-any cline-yes">14x</span>
1796
+ <span class="cline-any cline-yes">14x</span>
1797
+ <span class="cline-any cline-yes">14x</span>
1798
+ <span class="cline-any cline-neutral">&nbsp;</span>
1799
+ <span class="cline-any cline-yes">14x</span>
1800
+ <span class="cline-any cline-yes">12x</span>
1801
+ <span class="cline-any cline-yes">12x</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-yes">7x</span>
1805
+ <span class="cline-any cline-neutral">&nbsp;</span>
1806
+ <span class="cline-any cline-yes">7x</span>
1807
+ <span class="cline-any cline-yes">2x</span>
1808
+ <span class="cline-any cline-neutral">&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-yes">7x</span>
1812
+ <span class="cline-any cline-neutral">&nbsp;</span>
1813
+ <span class="cline-any cline-neutral">&nbsp;</span>
1814
+ <span class="cline-any cline-yes">7x</span>
1815
+ <span class="cline-any cline-yes">7x</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-no">&nbsp;</span>
1821
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1826
+ <span class="cline-any cline-neutral">&nbsp;</span>
1827
+ <span class="cline-any cline-neutral">&nbsp;</span>
1828
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1835
+ <span class="cline-any cline-neutral">&nbsp;</span>
1836
+ <span class="cline-any cline-neutral">&nbsp;</span>
1837
+ <span class="cline-any cline-neutral">&nbsp;</span>
1838
+ <span class="cline-any cline-neutral">&nbsp;</span>
1839
+ <span class="cline-any cline-neutral">&nbsp;</span>
1840
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</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-neutral">&nbsp;</span>
1851
+ <span class="cline-any cline-no">&nbsp;</span>
1852
+ <span class="cline-any cline-no">&nbsp;</span>
1853
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1857
+ <span class="cline-any cline-neutral">&nbsp;</span>
1858
+ <span class="cline-any cline-no">&nbsp;</span>
1859
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1863
+ <span class="cline-any cline-no">&nbsp;</span>
1864
+ <span class="cline-any cline-no">&nbsp;</span>
1865
+ <span class="cline-any cline-no">&nbsp;</span>
1866
+ <span class="cline-any cline-neutral">&nbsp;</span>
1867
+ <span class="cline-any cline-no">&nbsp;</span>
1868
+ <span class="cline-any cline-neutral">&nbsp;</span>
1869
+ <span class="cline-any cline-no">&nbsp;</span>
1870
+ <span class="cline-any cline-neutral">&nbsp;</span>
1871
+ <span class="cline-any cline-neutral">&nbsp;</span>
1872
+ <span class="cline-any cline-neutral">&nbsp;</span>
1873
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</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-yes">8x</span>
1890
+ <span class="cline-any cline-yes">3x</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">5x</span>
1895
+ <span class="cline-any cline-yes">5x</span>
1896
+ <span class="cline-any cline-yes">5x</span>
1897
+ <span class="cline-any cline-yes">6x</span>
1898
+ <span class="cline-any cline-yes">6x</span>
1899
+ <span class="cline-any cline-yes">6x</span>
1900
+ <span class="cline-any cline-yes">3x</span>
1901
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1905
+ <span class="cline-any cline-yes">5x</span>
1906
+ <span class="cline-any cline-yes">5x</span>
1907
+ <span class="cline-any cline-neutral">&nbsp;</span>
1908
+ <span class="cline-any cline-yes">5x</span>
1909
+ <span class="cline-any cline-yes">7x</span>
1910
+ <span class="cline-any cline-yes">7x</span>
1911
+ <span class="cline-any cline-yes">7x</span>
1912
+ <span class="cline-any cline-yes">7x</span>
1913
+ <span class="cline-any cline-neutral">&nbsp;</span>
1914
+ <span class="cline-any cline-yes">7x</span>
1915
+ <span class="cline-any cline-neutral">&nbsp;</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">7x</span>
1920
+ <span class="cline-any cline-yes">2x</span>
1921
+ <span class="cline-any cline-yes">2x</span>
1922
+ <span class="cline-any cline-yes">2x</span>
1923
+ <span class="cline-any cline-yes">2x</span>
1924
+ <span class="cline-any cline-yes">2x</span>
1925
+ <span class="cline-any cline-yes">1x</span>
1926
+ <span class="cline-any cline-yes">1x</span>
1927
+ <span class="cline-any cline-neutral">&nbsp;</span>
1928
+ <span class="cline-any cline-neutral">&nbsp;</span>
1929
+ <span class="cline-any cline-neutral">&nbsp;</span>
1930
+ <span class="cline-any cline-neutral">&nbsp;</span>
1931
+ <span class="cline-any cline-yes">7x</span>
1932
+ <span class="cline-any cline-yes">4x</span>
1933
+ <span class="cline-any cline-neutral">&nbsp;</span>
1934
+ <span class="cline-any cline-neutral">&nbsp;</span>
1935
+ <span class="cline-any cline-neutral">&nbsp;</span>
1936
+ <span class="cline-any cline-neutral">&nbsp;</span>
1937
+ <span class="cline-any cline-neutral">&nbsp;</span>
1938
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1942
+ <span class="cline-any cline-neutral">&nbsp;</span>
1943
+ <span class="cline-any cline-yes">5x</span>
1944
+ <span class="cline-any cline-yes">3x</span>
1945
+ <span class="cline-any cline-neutral">&nbsp;</span>
1946
+ <span class="cline-any cline-neutral">&nbsp;</span>
1947
+ <span class="cline-any cline-neutral">&nbsp;</span>
1948
+ <span class="cline-any cline-yes">5x</span>
1949
+ <span class="cline-any cline-yes">5x</span>
1950
+ <span class="cline-any cline-neutral">&nbsp;</span>
1951
+ <span class="cline-any cline-neutral">&nbsp;</span>
1952
+ <span class="cline-any cline-neutral">&nbsp;</span>
1953
+ <span class="cline-any cline-no">&nbsp;</span>
1954
+ <span class="cline-any cline-neutral">&nbsp;</span>
1955
+ <span class="cline-any cline-no">&nbsp;</span>
1956
+ <span class="cline-any cline-no">&nbsp;</span>
1957
+ <span class="cline-any cline-neutral">&nbsp;</span>
1958
+ <span class="cline-any cline-neutral">&nbsp;</span>
1959
+ <span class="cline-any cline-no">&nbsp;</span>
1960
+ <span class="cline-any cline-no">&nbsp;</span>
1961
+ <span class="cline-any cline-no">&nbsp;</span>
1962
+ <span class="cline-any cline-no">&nbsp;</span>
1963
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1970
+ <span class="cline-any cline-no">&nbsp;</span>
1971
+ <span class="cline-any cline-neutral">&nbsp;</span>
1972
+ <span class="cline-any cline-neutral">&nbsp;</span>
1973
+ <span class="cline-any cline-neutral">&nbsp;</span>
1974
+ <span class="cline-any cline-no">&nbsp;</span>
1975
+ <span class="cline-any cline-neutral">&nbsp;</span>
1976
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { createHash } from 'node:crypto';
1977
+ import type { Octokit } from '@octokit/rest';
1978
+ import { z } from 'zod';
1979
+ import type { Finding, UsageStats } from '../types/index.js';
1980
+ import { findingLine } from '../types/index.js';
1981
+ import { getRuntime } from '../sdk/runtimes/index.js';
1982
+ import { applyMergeGroups, canUseRuntimeAuth } from '../sdk/extract.js';
1983
+ import type { AuxiliaryCallOptions } from '../sdk/extract.js';
1984
+ import {
1985
+ buildJsonOutputSection,
1986
+ formatIndexedFindingsForPrompt,
1987
+ joinPromptSections,
1988
+ } from '../sdk/prompt-sections.js';
1989
+ &nbsp;
1990
+ /**
1991
+ * Parsed marker data from a Warden comment.
1992
+ */
1993
+ export interface WardenMarker {
1994
+ path: string;
1995
+ line: number;
1996
+ contentHash: string;
1997
+ }
1998
+ &nbsp;
1999
+ /**
2000
+ * Existing comment from GitHub (either Warden or external).
2001
+ */
2002
+ export interface ExistingComment {
2003
+ id: number;
2004
+ path: string;
2005
+ line: number;
2006
+ title: string;
2007
+ description: string;
2008
+ /** Stable Warden finding ID from the attribution footer or legacy title prefix */
2009
+ findingId?: string;
2010
+ contentHash: string;
2011
+ /** GraphQL node ID for the review thread (used to resolve stale comments) */
2012
+ threadId?: string;
2013
+ /** Whether the thread has been resolved (resolved comments are used for dedup but not stale detection) */
2014
+ isResolved?: boolean;
2015
+ /** Whether this is a Warden-generated comment */
2016
+ isWarden?: boolean;
2017
+ /** Skills that have already detected this issue (for Warden comments) */
2018
+ skills?: string[];
2019
+ /** The raw comment body (needed for updating Warden comments) */
2020
+ body?: string;
2021
+ /** GraphQL node ID for the comment (needed for adding reactions) */
2022
+ commentNodeId?: string;
2023
+ }
2024
+ &nbsp;
2025
+ /**
2026
+ * Type of action to take for a duplicate finding.
2027
+ */
2028
+ export type DuplicateActionType = 'update_warden' | 'react_external';
2029
+ &nbsp;
2030
+ /**
2031
+ * Action to take for a duplicate finding.
2032
+ */
2033
+ export interface DuplicateAction {
2034
+ type: DuplicateActionType;
2035
+ finding: Finding;
2036
+ existingComment: ExistingComment;
2037
+ /** Whether this was a hash match or semantic match */
2038
+ matchType: 'hash' | 'semantic';
2039
+ }
2040
+ &nbsp;
2041
+ /**
2042
+ * Result of deduplication with actions for duplicates.
2043
+ */
2044
+ export interface DeduplicateResult {
2045
+ /** Findings that are not duplicates - should be posted */
2046
+ newFindings: Finding[];
2047
+ /** Actions to take for duplicate findings */
2048
+ duplicateActions: DuplicateAction[];
2049
+ /** Usage from semantic dedup LLM call, if invoked */
2050
+ dedupUsage?: UsageStats;
2051
+ }
2052
+ &nbsp;
2053
+ /**
2054
+ * Generate a short content hash from title and description.
2055
+ * Used for exact-match deduplication.
2056
+ */
2057
+ export function generateContentHash(title: string, description: string): string {
2058
+ const content = `${title}\n${description}`;
2059
+ return createHash('sha256').update(content).digest('hex').slice(0, 8);
2060
+ }
2061
+ &nbsp;
2062
+ /**
2063
+ * Generate the marker HTML comment to embed in comment body.
2064
+ * Format: &lt;!-- warden:v1:{path}:{line}:{contentHash} --&gt;
2065
+ */
2066
+ export function generateMarker(path: string, line: number, contentHash: string): string {
2067
+ return `&lt;!-- warden:v1:${path}:${line}:${contentHash} --&gt;`;
2068
+ }
2069
+ &nbsp;
2070
+ /**
2071
+ * Parse a Warden marker from a comment body.
2072
+ * Returns null if no valid marker is found.
2073
+ */
2074
+ export function parseMarker(body: string): WardenMarker | null {
2075
+ const match = body.match(/&lt;!-- warden:v1:([^:]+):(\d+):([a-f0-9]+) --&gt;/);
2076
+ if (!match || match.length &lt; 4) {
2077
+ return null;
2078
+ }
2079
+ &nbsp;
2080
+ const path = match[1];
2081
+ const lineStr = match[2];
2082
+ const contentHash = match[3];
2083
+ &nbsp;
2084
+ // Validate that all capture groups exist (defensive, should always be true when regex matches)
2085
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!path || !lineStr || !contentHash) {
2086
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2087
+ }
2088
+ &nbsp;
2089
+ return {
2090
+ path,
2091
+ line: parseInt(lineStr, 10),
2092
+ contentHash,
2093
+ };
2094
+ }
2095
+ &nbsp;
2096
+ /**
2097
+ * Parse title and description from a Warden comment body.
2098
+ * Expected format: **:emoji: Title**\n\nDescription or **Title**\n\nDescription
2099
+ * Strips legacy [ID] prefix from titles for backward compat.
2100
+ */
2101
+ export function parseWardenComment(body: string): { title: string; description: string } | null {
2102
+ // Match the title pattern: **:emoji: Title** or **Title**
2103
+ // Use non-greedy match to handle titles containing asterisks
2104
+ const titleMatch = body.match(/\*\*(?::[a-z_]+:\s*)?(.+?)\*\*/);
2105
+ if (!titleMatch || !titleMatch[1]) {
2106
+ return null;
2107
+ }
2108
+ &nbsp;
2109
+ // Strip legacy [ID] prefix (e.g., "[2K5-29B] Title" → "Title")
2110
+ const title = titleMatch[1].replace(/^\[[A-Z0-9-]+\]\s*/, '').trim();
2111
+ &nbsp;
2112
+ // Get the description - everything after the title until the first ---
2113
+ const titleEnd = body.indexOf('**', body.indexOf('**') + 2) + 2;
2114
+ const separatorIndex = body.indexOf('---');
2115
+ const descEnd = separatorIndex &gt; -1 ? separatorIndex : body.length;
2116
+ &nbsp;
2117
+ const description = body.slice(titleEnd, descEnd).trim();
2118
+ &nbsp;
2119
+ return { title, description };
2120
+ }
2121
+ &nbsp;
2122
+ /**
2123
+ * Parse the finding ID from a Warden comment's attribution or legacy title.
2124
+ */
2125
+ export function parseWardenFindingId(body: string): string | undefined {
2126
+ const attributionMatch = body.match(/(?:&lt;sub&gt;)?Identified by Warden (?!via\s)([^&lt;\n\r]*)(?:&lt;\/sub&gt;|$)/m);
2127
+ if (attributionMatch?.[1]) {
2128
+ const idMatch = attributionMatch[1].match(/·\s*(?:`([^`]+)`|([^`\n\r]+))/);
2129
+ const id = (idMatch?.[1] ?? idMatch?.[2])?.trim();
2130
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (id) return id;
2131
+ }
2132
+ &nbsp;
2133
+ const titleMatch = body.match(/\*\*(?::[a-z_]+:\s*)?\[([^\]]+)\]\s*.+?\*\*/);
2134
+ return titleMatch?.[1]?.trim() || undefined;
2135
+ }
2136
+ &nbsp;
2137
+ /**
2138
+ * Check if a comment body is a Warden-generated comment.
2139
+ * Supports current muted format (&lt;sub&gt;Identified by Warden skill&lt;/sub&gt;), and
2140
+ * legacy formats: backtick (Identified by Warden `skill`), bracket
2141
+ * (&lt;sub&gt;Identified by Warden [skill]&lt;/sub&gt;), via
2142
+ * (&lt;sub&gt;Identified by Warden via `skill`&lt;/sub&gt;), old
2143
+ * (&lt;sub&gt;warden: skill&lt;/sub&gt;).
2144
+ */
2145
+ export function isWardenComment(body: string): boolean {
2146
+ return (
2147
+ body.includes('&lt;sub&gt;Identified by Warden ') ||
2148
+ body.includes('Identified by Warden `') ||
2149
+ body.includes('&lt;sub&gt;warden:') ||
2150
+ body.includes('&lt;!-- warden:v1:')
2151
+ );
2152
+ }
2153
+ &nbsp;
2154
+ function parsePlainSkillList(value: string): string[] {
2155
+ return value
2156
+ .split(',')
2157
+ .map((s) =&gt; s.trim())
2158
+ .filter(Boolean);
2159
+ }
2160
+ &nbsp;
2161
+ /**
2162
+ * Parse skill names from a Warden comment's attribution line.
2163
+ * Supports five formats:
2164
+ * - Current: "&lt;sub&gt;Identified by Warden skill1, skill2 · id&lt;/sub&gt;"
2165
+ * - Legacy backtick: "Identified by Warden `skill1`, `skill2` · id"
2166
+ * - Legacy bracket: "&lt;sub&gt;Identified by Warden [skill1], [skill2] · id&lt;/sub&gt;"
2167
+ * - Legacy via: "&lt;sub&gt;Identified by Warden via `skill1`, `skill2` · severity&lt;/sub&gt;"
2168
+ * - Legacy old: "&lt;sub&gt;warden: skill1, skill2&lt;/sub&gt;"
2169
+ */
2170
+ export function parseWardenSkills(body: string): string[] {
2171
+ // Try current muted format: &lt;sub&gt;Identified by Warden skill1, skill2 · id&lt;/sub&gt;
2172
+ const plainSubMatch = body.match(/&lt;sub&gt;Identified by Warden (?!via\s)([^`[\]&lt;]+?)(?:\s*·|&lt;\/sub&gt;)/);
2173
+ if (plainSubMatch?.[1]) {
2174
+ const skills = parsePlainSkillList(plainSubMatch[1]);
2175
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (skills.length &gt; 0) return skills;
2176
+ }
2177
+ &nbsp;
2178
+ // Try legacy backtick format (no "via"): Identified by Warden `skill1`, `skill2` · id
2179
+ const backtickMatch = body.match(/Identified by Warden ((?:`[^`]+`(?:, )?)+)/);
2180
+ if (backtickMatch?.[1]) {
2181
+ const skills = [...backtickMatch[1].matchAll(/`([^`]+)`/g)]
2182
+ .map((m) =&gt; m[1])
2183
+ .filter((s): s is string =&gt; s !== undefined);
2184
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (skills.length &gt; 0) return skills;
2185
+ }
2186
+ &nbsp;
2187
+ // Try legacy bracket format: &lt;sub&gt;Identified by Warden [skill1], [skill2] · id&lt;/sub&gt;
2188
+ const bracketMatch = body.match(/&lt;sub&gt;Identified by Warden ((?:\[[^\]]+\](?:, )?)+)/);
2189
+ if (bracketMatch?.[1]) {
2190
+ const skills = [...bracketMatch[1].matchAll(/\[([^\]]+)\]/g)]
2191
+ .map((m) =&gt; m[1])
2192
+ .filter((s): s is string =&gt; s !== undefined);
2193
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (skills.length &gt; 0) return skills;
2194
+ }
2195
+ &nbsp;
2196
+ // Try legacy via format: &lt;sub&gt;Identified by Warden via `skill1`, `skill2` · severity&lt;/sub&gt;
2197
+ const viaMatch = body.match(/&lt;sub&gt;Identified by Warden via ([^·&lt;]+)/);
2198
+ if (viaMatch?.[1]) {
2199
+ const skills = [...viaMatch[1].matchAll(/`([^`]+)`/g)]
2200
+ .map((m) =&gt; m[1])
2201
+ .filter((s): s is string =&gt; s !== undefined);
2202
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (skills.length &gt; 0) return skills;
2203
+ }
2204
+ &nbsp;
2205
+ // Fall back to legacy old format: &lt;sub&gt;warden: skill1, skill2&lt;/sub&gt;
2206
+ const oldMatch = body.match(/&lt;sub&gt;warden:\s*([^&lt;]+)&lt;\/sub&gt;/);
2207
+ if (!oldMatch?.[1]) {
2208
+ return [];
2209
+ }
2210
+ return oldMatch[1]
2211
+ .split(',')
2212
+ .map((s) =&gt; s.trim())
2213
+ .filter(Boolean);
2214
+ }
2215
+ &nbsp;
2216
+ /**
2217
+ * Update a Warden comment body to add a new skill to the attribution.
2218
+ * Current format: Changes "&lt;sub&gt;Identified by Warden skill1 · id&lt;/sub&gt;"
2219
+ * to "&lt;sub&gt;Identified by Warden skill1, skill2 · id&lt;/sub&gt;"
2220
+ * Legacy backtick: Changes "Identified by Warden `skill1` · id"
2221
+ * to "Identified by Warden `skill1`, `skill2` · id"
2222
+ * Legacy bracket: Changes "&lt;sub&gt;Identified by Warden [skill1] · id&lt;/sub&gt;"
2223
+ * to "&lt;sub&gt;Identified by Warden [skill1], [skill2] · id&lt;/sub&gt;"
2224
+ * Legacy via: Changes "&lt;sub&gt;Identified by Warden via `skill1` · severity&lt;/sub&gt;"
2225
+ * to "&lt;sub&gt;Identified by Warden via `skill1`, `skill2` · severity&lt;/sub&gt;"
2226
+ * Legacy old: Changes "&lt;sub&gt;warden: skill1&lt;/sub&gt;" to "&lt;sub&gt;warden: skill1, skill2&lt;/sub&gt;"
2227
+ * Returns null if skill is already listed or if no attribution tag exists.
2228
+ */
2229
+ export function updateWardenCommentBody(body: string, newSkill: string): string | null {
2230
+ const existingSkills = parseWardenSkills(body);
2231
+ &nbsp;
2232
+ // If no existing attribution tag exists, we can't update it
2233
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (existingSkills.length === 0) {
2234
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2235
+ }
2236
+ &nbsp;
2237
+ // Don't update if skill already listed
2238
+ if (existingSkills.includes(newSkill)) {
2239
+ return null;
2240
+ }
2241
+ &nbsp;
2242
+ // Check if it's the current muted format: &lt;sub&gt;Identified by Warden skill · id&lt;/sub&gt;
2243
+ const plainSubFormatMatch = body.match(/&lt;sub&gt;Identified by Warden (?!via\s)[^`[\]&lt;]+&lt;\/sub&gt;/);
2244
+ if (plainSubFormatMatch) {
2245
+ const allSkills = [...existingSkills, newSkill].join(', ');
2246
+ const subTagMatch = body.match(/&lt;sub&gt;Identified by Warden (?!via\s)([^&lt;]*?)(\s*·[^&lt;]*)?&lt;\/sub&gt;/);
2247
+ const suffix = subTagMatch?.[2] || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2248
+ return body.replace(
2249
+ /&lt;sub&gt;Identified by Warden (?!via\s)[^&lt;]+&lt;\/sub&gt;/,
2250
+ () =&gt; `&lt;sub&gt;Identified by Warden ${allSkills}${suffix}&lt;/sub&gt;`
2251
+ );
2252
+ }
2253
+ &nbsp;
2254
+ // Check if it's the legacy backtick format (no &lt;sub&gt;, no "via"): Identified by Warden `skill` · id
2255
+ const backtickFormatMatch = body.match(/Identified by Warden `[^`]+`/) &amp;&amp; !body.includes('&lt;sub&gt;Identified by Warden');
2256
+ if (backtickFormatMatch) {
2257
+ const existingSkillsFormatted = existingSkills.map((s) =&gt; `\`${s}\``).join(', ');
2258
+ const lineMatch = body.match(/Identified by Warden ((?:`[^`]+`(?:, )?)+)(.*)/);
2259
+ const suffix = lineMatch?.[2] || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2260
+ return body.replace(
2261
+ /Identified by Warden (?:`[^`]+`(?:, )?)+.*/,
2262
+ () =&gt; `Identified by Warden ${existingSkillsFormatted}, \`${newSkill}\`${suffix}`
2263
+ );
2264
+ }
2265
+ &nbsp;
2266
+ // Check if it's the legacy bracket format: &lt;sub&gt;Identified by Warden [skill] · id&lt;/sub&gt;
2267
+ const bracketFormatMatch = body.match(/&lt;sub&gt;Identified by Warden \[[^\]]+\]/);
2268
+ if (bracketFormatMatch) {
2269
+ const existingSkillsFormatted = existingSkills.map((s) =&gt; `[${s}]`).join(', ');
2270
+ const subTagMatch = body.match(/&lt;sub&gt;Identified by Warden ((?:\[[^\]]+\](?:, )?)+)(.*?)&lt;\/sub&gt;/);
2271
+ const suffix = subTagMatch?.[2] || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2272
+ return body.replace(
2273
+ /&lt;sub&gt;Identified by Warden [^&lt;]+&lt;\/sub&gt;/,
2274
+ () =&gt; `&lt;sub&gt;Identified by Warden ${existingSkillsFormatted}, [${newSkill}]${suffix}&lt;/sub&gt;`
2275
+ );
2276
+ }
2277
+ &nbsp;
2278
+ // Check if it's the legacy via format
2279
+ const viaFormatMatch = body.match(/&lt;sub&gt;Identified by Warden via `[^`]+`/);
2280
+ if (viaFormatMatch) {
2281
+ const existingSkillsFormatted = existingSkills.map((s) =&gt; `\`${s}\``).join(', ');
2282
+ // Extract the suffix (metadata) starting from the · separator, not from the skill list
2283
+ const subTagMatch = body.match(/&lt;sub&gt;Identified by Warden via ([^&lt;]+)&lt;\/sub&gt;/);
2284
+ const fullContent = subTagMatch?.[1] || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2285
+ const separatorIndex = fullContent.indexOf(' · ');
2286
+ const suffix = separatorIndex &gt;= 0 ? fullContent.slice(separatorIndex) : <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2287
+ return body.replace(
2288
+ /&lt;sub&gt;Identified by Warden via [^&lt;]+&lt;\/sub&gt;/,
2289
+ () =&gt; `&lt;sub&gt;Identified by Warden via ${existingSkillsFormatted}, \`${newSkill}\`${suffix}&lt;/sub&gt;`
2290
+ );
2291
+ }
2292
+ &nbsp;
2293
+ // Legacy old format: &lt;sub&gt;warden: skill1, skill2&lt;/sub&gt;
2294
+ const allSkills = [...existingSkills, newSkill].join(', ');
2295
+ // Use a replacer function to avoid special $ character interpretation in skill names
2296
+ return body.replace(/&lt;sub&gt;warden:\s*[^&lt;]+&lt;\/sub&gt;/, () =&gt; `&lt;sub&gt;warden: ${allSkills}&lt;/sub&gt;`);
2297
+ }
2298
+ &nbsp;
2299
+ /** GraphQL response structure for review threads */
2300
+ interface ReviewThreadNode {
2301
+ id: string;
2302
+ isResolved: boolean;
2303
+ comments: {
2304
+ nodes: {
2305
+ id: string; // GraphQL node ID (for reactions)
2306
+ databaseId: number;
2307
+ body: string;
2308
+ path: string;
2309
+ line: number | null;
2310
+ originalLine: number | null;
2311
+ }[];
2312
+ };
2313
+ }
2314
+ &nbsp;
2315
+ interface ReviewThreadsResponse {
2316
+ repository?: {
2317
+ pullRequest?: {
2318
+ reviewThreads: {
2319
+ pageInfo: {
2320
+ hasNextPage: boolean;
2321
+ endCursor: string | null;
2322
+ };
2323
+ nodes: ReviewThreadNode[];
2324
+ };
2325
+ } | null;
2326
+ } | null;
2327
+ }
2328
+ &nbsp;
2329
+ const REVIEW_THREADS_QUERY = `
2330
+ query($owner: String!, $repo: String!, $prNumber: Int!, $cursor: String) {
2331
+ repository(owner: $owner, name: $repo) {
2332
+ pullRequest(number: $prNumber) {
2333
+ reviewThreads(first: 100, after: $cursor) {
2334
+ pageInfo {
2335
+ hasNextPage
2336
+ endCursor
2337
+ }
2338
+ nodes {
2339
+ id
2340
+ isResolved
2341
+ comments(first: 1) {
2342
+ nodes {
2343
+ id
2344
+ databaseId
2345
+ body
2346
+ path
2347
+ line
2348
+ originalLine
2349
+ }
2350
+ }
2351
+ }
2352
+ }
2353
+ }
2354
+ }
2355
+ }
2356
+ `;
2357
+ &nbsp;
2358
+ /**
2359
+ * Fetch all existing review comments for a PR (both Warden and external).
2360
+ * Uses GraphQL to get thread IDs for stale comment resolution and node IDs for reactions.
2361
+ */
2362
+ export async function fetchExistingComments(
2363
+ octokit: Octokit,
2364
+ owner: string,
2365
+ repo: string,
2366
+ prNumber: number
2367
+ ): Promise&lt;ExistingComment[]&gt; {
2368
+ const comments: ExistingComment[] = [];
2369
+ &nbsp;
2370
+ // Use GraphQL to get thread IDs along with comment data
2371
+ let cursor: string | null = null;
2372
+ let hasNextPage = true;
2373
+ &nbsp;
2374
+ while (hasNextPage) {
2375
+ const response: ReviewThreadsResponse = await octokit.graphql(REVIEW_THREADS_QUERY, {
2376
+ owner,
2377
+ repo,
2378
+ prNumber,
2379
+ cursor,
2380
+ });
2381
+ &nbsp;
2382
+ const pullRequest = response.repository?.pullRequest;
2383
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!pullRequest) {
2384
+ // PR doesn't exist or was deleted
2385
+ <span class="cstat-no" title="statement not covered" > return comments;</span>
2386
+ }
2387
+ &nbsp;
2388
+ const threads = pullRequest.reviewThreads;
2389
+ &nbsp;
2390
+ for (const thread of threads.nodes) {
2391
+ // Get the first comment in the thread
2392
+ const firstComment = thread.comments.nodes[0];
2393
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!firstComment) {
2394
+ <span class="cstat-no" title="statement not covered" > continue;</span>
2395
+ }
2396
+ &nbsp;
2397
+ const isWarden = isWardenComment(firstComment.body);
2398
+ const marker = isWarden ? parseMarker(firstComment.body) : <span class="branch-1 cbranch-no" title="branch not covered" >null;</span>
2399
+ const parsed = parseWardenComment(firstComment.body);
2400
+ &nbsp;
2401
+ // For Warden comments, we need parsed title/description
2402
+ // For external comments, we extract what we can or use body as description
2403
+ const title = parsed?.title ?? <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2404
+ const description = parsed?.description ?? <span class="branch-1 cbranch-no" title="branch not covered" >firstComment.body.slice(0, 500);</span>
2405
+ &nbsp;
2406
+ comments.push({
2407
+ id: firstComment.databaseId,
2408
+ path: marker?.path ?? <span class="branch-1 cbranch-no" title="branch not covered" >firstComment.path,</span>
2409
+ line: marker?.line ?? <span class="branch-1 cbranch-no" title="branch not covered" >firstComment.line ?? <span class="branch-2 cbranch-no" title="branch not covered" >f</span>irstComment.originalLine ?? <span class="branch-3 cbranch-no" title="branch not covered" >0</span>,</span>
2410
+ title,
2411
+ description,
2412
+ findingId: isWarden ? parseWardenFindingId(firstComment.body) : <span class="branch-1 cbranch-no" title="branch not covered" >undefined,</span>
2413
+ contentHash: marker?.contentHash ?? <span class="branch-1 cbranch-no" title="branch not covered" >generateContentHash(title, description),</span>
2414
+ threadId: thread.id,
2415
+ isResolved: thread.isResolved,
2416
+ isWarden,
2417
+ skills: isWarden ? parseWardenSkills(firstComment.body) : <span class="branch-1 cbranch-no" title="branch not covered" >undefined,</span>
2418
+ body: firstComment.body,
2419
+ commentNodeId: firstComment.id,
2420
+ });
2421
+ }
2422
+ &nbsp;
2423
+ hasNextPage = threads.pageInfo.hasNextPage;
2424
+ cursor = threads.pageInfo.endCursor;
2425
+ }
2426
+ &nbsp;
2427
+ return comments;
2428
+ }
2429
+ &nbsp;
2430
+ /**
2431
+ * @deprecated Use fetchExistingComments instead
2432
+ */
2433
+ export async function <span class="fstat-no" title="function not covered" >fetchExistingWardenComments(</span>
2434
+ octokit: Octokit,
2435
+ owner: string,
2436
+ repo: string,
2437
+ prNumber: number
2438
+ ): Promise&lt;ExistingComment[]&gt; {
2439
+ const allComments = <span class="cstat-no" title="statement not covered" >await fetchExistingComments(octokit, owner, repo, prNumber);</span>
2440
+ <span class="cstat-no" title="statement not covered" > return allComments.filter(<span class="fstat-no" title="function not covered" >(c</span>) =&gt; <span class="cstat-no" title="statement not covered" >c.isWarden)</span>;</span>
2441
+ }
2442
+ &nbsp;
2443
+ /** Schema for validating LLM deduplication response with matched indices */
2444
+ const DuplicateMatchesSchema = z.array(
2445
+ z.object({
2446
+ findingIndex: z.number().int(),
2447
+ existingIndex: z.number().int(),
2448
+ })
2449
+ );
2450
+ &nbsp;
2451
+ /**
2452
+ * Result from semantic dedup LLM call.
2453
+ */
2454
+ interface SemanticDuplicateResult {
2455
+ matches: Map&lt;string, ExistingComment&gt;;
2456
+ usage?: UsageStats;
2457
+ }
2458
+ &nbsp;
2459
+ /**
2460
+ * Use LLM to identify which findings are semantic duplicates of existing comments.
2461
+ * Returns a Map of finding ID to matched ExistingComment, plus usage stats.
2462
+ */
2463
+ async function <span class="fstat-no" title="function not covered" >findSemanticDuplicates(</span>
2464
+ findings: Finding[],
2465
+ existingComments: ExistingComment[],
2466
+ apiKey: string | undefined,
2467
+ options: Pick&lt;DeduplicateOptions, 'runtime' | 'model' | 'maxRetries' | 'currentSkill'&gt; = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
2468
+ ): Promise&lt;SemanticDuplicateResult&gt; {
2469
+ <span class="cstat-no" title="statement not covered" > if (findings.length === 0 || existingComments.length === 0) {</span>
2470
+ <span class="cstat-no" title="statement not covered" > return { matches: new Map() };</span>
2471
+ }
2472
+ &nbsp;
2473
+ const existingList = <span class="cstat-no" title="statement not covered" >existingComments</span>
2474
+ .map(<span class="fstat-no" title="function not covered" >(c</span>, i) =&gt; <span class="cstat-no" title="statement not covered" >`${i + 1}. [${c.path}:${c.line}] "${c.title}" - ${c.description}`)</span>
2475
+ .join('\n');
2476
+ &nbsp;
2477
+ const <span class="cstat-no" title="statement not covered" >findingsList = formatIndexedFindingsForPrompt(findings);</span>
2478
+ &nbsp;
2479
+ const <span class="cstat-no" title="statement not covered" >prompt = joinPromptSections([</span>
2480
+ `&lt;task&gt;
2481
+ Compare these code review findings and identify duplicates.
2482
+ &lt;/task&gt;`,
2483
+ `&lt;existing_comments&gt;
2484
+ ${existingList}
2485
+ &lt;/existing_comments&gt;`,
2486
+ `&lt;new_findings&gt;
2487
+ ${findingsList}
2488
+ &lt;/new_findings&gt;`,
2489
+ `&lt;deduplication_rules&gt;
2490
+ Return a JSON array of objects identifying which findings are DUPLICATES of which existing comments.
2491
+ Only mark as duplicate if they describe the SAME issue at the SAME location (within a few lines).
2492
+ Different issues at the same location are NOT duplicates.
2493
+ &lt;/deduplication_rules&gt;`,
2494
+ buildJsonOutputSection(`[{"findingIndex": 1, "existingIndex": 2}]
2495
+ where findingIndex is the 1-based index of the new finding and existingIndex is the 1-based index of the matching existing comment.
2496
+ Return [] if none are duplicates.`),
2497
+ ]);
2498
+ &nbsp;
2499
+ const result = <span class="cstat-no" title="statement not covered" >await getRuntime(options.runtime ?? 'claude').runAuxiliary({</span>
2500
+ task: 'deduplication',
2501
+ agentName: options.currentSkill,
2502
+ apiKey,
2503
+ prompt,
2504
+ schema: DuplicateMatchesSchema,
2505
+ model: options.model,
2506
+ maxTokens: 512,
2507
+ maxRetries: options.maxRetries,
2508
+ });
2509
+ &nbsp;
2510
+ <span class="cstat-no" title="statement not covered" > if (!result.success) {</span>
2511
+ <span class="cstat-no" title="statement not covered" > console.warn(`LLM deduplication failed, falling back to hash-only: ${result.error}`);</span>
2512
+ <span class="cstat-no" title="statement not covered" > return { matches: new Map(), usage: result.usage };</span>
2513
+ }
2514
+ &nbsp;
2515
+ const matches = <span class="cstat-no" title="statement not covered" >new Map&lt;string, ExistingComment&gt;();</span>
2516
+ <span class="cstat-no" title="statement not covered" > for (const match of result.data) {</span>
2517
+ const finding = <span class="cstat-no" title="statement not covered" >findings[match.findingIndex - 1];</span>
2518
+ const existing = <span class="cstat-no" title="statement not covered" >existingComments[match.existingIndex - 1];</span>
2519
+ <span class="cstat-no" title="statement not covered" > if (finding &amp;&amp; existing) {</span>
2520
+ <span class="cstat-no" title="statement not covered" > matches.set(finding.id, existing);</span>
2521
+ }
2522
+ }
2523
+ &nbsp;
2524
+ <span class="cstat-no" title="statement not covered" > return { matches, usage: result.usage };</span>
2525
+ }
2526
+ &nbsp;
2527
+ /**
2528
+ * Options for deduplication.
2529
+ */
2530
+ export interface DeduplicateOptions extends AuxiliaryCallOptions {
2531
+ /** Skip LLM deduplication and only use exact hash matching */
2532
+ hashOnly?: boolean;
2533
+ /** Current skill name (for updating Warden comment attribution) */
2534
+ currentSkill?: string;
2535
+ }
2536
+ &nbsp;
2537
+ export interface ConsolidateOptions extends AuxiliaryCallOptions {
2538
+ /** Skip LLM consolidation and only use exact hash matching */
2539
+ hashOnly?: boolean;
2540
+ }
2541
+ &nbsp;
2542
+ const ADD_REACTION_MUTATION = `
2543
+ mutation($subjectId: ID!, $content: ReactionContent!) {
2544
+ addReaction(input: { subjectId: $subjectId, content: $content }) {
2545
+ reaction {
2546
+ content
2547
+ }
2548
+ }
2549
+ }
2550
+ `;
2551
+ &nbsp;
2552
+ /**
2553
+ * Update an existing Warden PR review comment via REST API.
2554
+ */
2555
+ export async function <span class="fstat-no" title="function not covered" >updateWardenComment(</span>
2556
+ octokit: Octokit,
2557
+ owner: string,
2558
+ repo: string,
2559
+ commentId: number,
2560
+ newBody: string
2561
+ ): Promise&lt;void&gt; {
2562
+ <span class="cstat-no" title="statement not covered" > await octokit.pulls.updateReviewComment({</span>
2563
+ owner,
2564
+ repo,
2565
+ comment_id: commentId,
2566
+ body: newBody,
2567
+ });
2568
+ }
2569
+ &nbsp;
2570
+ /**
2571
+ * Add a reaction to an existing PR review comment.
2572
+ * Uses GraphQL to handle review comments.
2573
+ */
2574
+ export async function <span class="fstat-no" title="function not covered" >addReactionToComment(</span>
2575
+ octokit: Octokit,
2576
+ commentNodeId: string,
2577
+ reaction: 'THUMBS_UP' | 'EYES' = <span class="branch-0 cbranch-no" title="branch not covered" >'EYES'</span>
2578
+ ): Promise&lt;void&gt; {
2579
+ <span class="cstat-no" title="statement not covered" > await octokit.graphql(ADD_REACTION_MUTATION, {</span>
2580
+ subjectId: commentNodeId,
2581
+ content: reaction,
2582
+ });
2583
+ }
2584
+ &nbsp;
2585
+ /**
2586
+ * Process duplicate actions - update Warden comments and add reactions.
2587
+ * Returns counts of actions taken for logging.
2588
+ */
2589
+ export async function <span class="fstat-no" title="function not covered" >processDuplicateActions(</span>
2590
+ octokit: Octokit,
2591
+ owner: string,
2592
+ repo: string,
2593
+ actions: DuplicateAction[],
2594
+ currentSkill: string
2595
+ ): Promise&lt;{ updated: number; reacted: number; skipped: number; failed: number }&gt; {
2596
+ let updated = <span class="cstat-no" title="statement not covered" >0;</span>
2597
+ let reacted = <span class="cstat-no" title="statement not covered" >0;</span>
2598
+ let skipped = <span class="cstat-no" title="statement not covered" >0;</span>
2599
+ let failed = <span class="cstat-no" title="statement not covered" >0;</span>
2600
+ &nbsp;
2601
+ <span class="cstat-no" title="statement not covered" > for (const action of actions) {</span>
2602
+ <span class="cstat-no" title="statement not covered" > try {</span>
2603
+ <span class="cstat-no" title="statement not covered" > if (action.type === 'update_warden') {</span>
2604
+ <span class="cstat-no" title="statement not covered" > if (!action.existingComment.body) {</span>
2605
+ <span class="cstat-no" title="statement not covered" > skipped++;</span>
2606
+ <span class="cstat-no" title="statement not covered" > continue;</span>
2607
+ }
2608
+ const newBody = <span class="cstat-no" title="statement not covered" >updateWardenCommentBody(action.existingComment.body, currentSkill);</span>
2609
+ // Only update if body actually changed (skill wasn't already listed)
2610
+ <span class="cstat-no" title="statement not covered" > if (newBody) {</span>
2611
+ <span class="cstat-no" title="statement not covered" > await updateWardenComment(octokit, owner, repo, action.existingComment.id, newBody);</span>
2612
+ // Update in-memory body so subsequent triggers see the updated content
2613
+ <span class="cstat-no" title="statement not covered" > action.existingComment.body = newBody;</span>
2614
+ <span class="cstat-no" title="statement not covered" > updated++;</span>
2615
+ } else {
2616
+ <span class="cstat-no" title="statement not covered" > skipped++;</span>
2617
+ }
2618
+ <span class="cstat-no" title="statement not covered" > } else if (action.type === 'react_external') {</span>
2619
+ <span class="cstat-no" title="statement not covered" > if (!action.existingComment.commentNodeId) {</span>
2620
+ <span class="cstat-no" title="statement not covered" > skipped++;</span>
2621
+ <span class="cstat-no" title="statement not covered" > continue;</span>
2622
+ }
2623
+ <span class="cstat-no" title="statement not covered" > await addReactionToComment(octokit, action.existingComment.commentNodeId);</span>
2624
+ <span class="cstat-no" title="statement not covered" > reacted++;</span>
2625
+ }
2626
+ } catch (error) {
2627
+ <span class="cstat-no" title="statement not covered" > console.warn(`Failed to process duplicate action for ${action.finding.title}: ${error}`);</span>
2628
+ <span class="cstat-no" title="statement not covered" > failed++;</span>
2629
+ }
2630
+ }
2631
+ &nbsp;
2632
+ <span class="cstat-no" title="statement not covered" > return { updated, reacted, skipped, failed };</span>
2633
+ }
2634
+ &nbsp;
2635
+ /**
2636
+ * Convert a Finding to an ExistingComment for cross-trigger deduplication.
2637
+ * Returns null if the finding has no location.
2638
+ */
2639
+ export function findingToExistingComment(finding: Finding, skill?: string): ExistingComment | null {
2640
+ if (!finding.location) {
2641
+ return null;
2642
+ }
2643
+ &nbsp;
2644
+ return {
2645
+ id: -1, // Newly posted comments don't have IDs yet
2646
+ path: finding.location.path,
2647
+ line: finding.location.endLine ?? finding.location.startLine,
2648
+ title: finding.title,
2649
+ description: finding.description,
2650
+ findingId: finding.id,
2651
+ contentHash: generateContentHash(finding.title, finding.description),
2652
+ isWarden: true,
2653
+ skills: skill ? [skill] : [],
2654
+ };
2655
+ }
2656
+ &nbsp;
2657
+ // -----------------------------------------------------------------------------
2658
+ // Intra-batch consolidation
2659
+ // -----------------------------------------------------------------------------
2660
+ &nbsp;
2661
+ const PROXIMITY_THRESHOLD = 5;
2662
+ &nbsp;
2663
+ /**
2664
+ * Result from consolidating findings within a single batch.
2665
+ */
2666
+ export interface ConsolidateResult {
2667
+ findings: Finding[];
2668
+ removedCount: number;
2669
+ usage?: UsageStats;
2670
+ }
2671
+ &nbsp;
2672
+ /** Schema for LLM consolidation response: groups of finding indices that share a root cause. */
2673
+ const ConsolidationGroupsSchema = z.array(
2674
+ z.array(z.number().int())
2675
+ );
2676
+ &nbsp;
2677
+ /**
2678
+ * Group findings by file path, then identify clusters where findings are within
2679
+ * PROXIMITY_THRESHOLD lines of each other. Returns only clusters with 2+ findings.
2680
+ */
2681
+ function findProximityClusters(findings: Finding[]): Finding[][] {
2682
+ // Group by file path
2683
+ const byPath = new Map&lt;string, Finding[]&gt;();
2684
+ for (const f of findings) {
2685
+ const path = f.location?.path ?? <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2686
+ const existing = byPath.get(path);
2687
+ if (existing) {
2688
+ existing.push(f);
2689
+ } else {
2690
+ byPath.set(path, [f]);
2691
+ }
2692
+ }
2693
+ &nbsp;
2694
+ const clusters: Finding[][] = [];
2695
+ &nbsp;
2696
+ for (const group of byPath.values()) {
2697
+ if (group.length &lt; 2) continue;
2698
+ &nbsp;
2699
+ // Sort by line number
2700
+ const sorted = [...group].sort((a, b) =&gt; findingLine(a) - findingLine(b));
2701
+ &nbsp;
2702
+ // Single-linkage clustering: consecutive findings within PROXIMITY_THRESHOLD
2703
+ // lines of each other are grouped together.
2704
+ const first = sorted[0];
2705
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!first) <span class="cstat-no" title="statement not covered" >continue;</span>
2706
+ let current: Finding[] = [first];
2707
+ &nbsp;
2708
+ for (let i = 1; i &lt; sorted.length; i++) {
2709
+ const prev = sorted[i - 1];
2710
+ const curr = sorted[i];
2711
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!prev || !curr) <span class="cstat-no" title="statement not covered" >continue;</span>
2712
+ &nbsp;
2713
+ if (findingLine(curr) - findingLine(prev) &lt;= PROXIMITY_THRESHOLD) {
2714
+ current.push(curr);
2715
+ } else {
2716
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (current.length &gt;= 2) <span class="cstat-no" title="statement not covered" >clusters.push(current);</span>
2717
+ current = [curr];
2718
+ }
2719
+ }
2720
+ if (current.length &gt;= 2) clusters.push(current);
2721
+ }
2722
+ &nbsp;
2723
+ return clusters;
2724
+ }
2725
+ &nbsp;
2726
+ /**
2727
+ * Consolidate findings within a single batch to remove duplicates that describe
2728
+ * the same root cause. Three-phase approach:
2729
+ *
2730
+ * 1. Hash dedup: remove exact duplicates (same path:line:contentHash)
2731
+ * 2. Proximity grouping: identify clusters of findings within 5 lines of each other
2732
+ * 3. LLM consolidation: ask the auxiliary runtime to group findings by root cause (only when proximity matches exist)
2733
+ *
2734
+ * For each group, keeps the highest-severity finding.
2735
+ */
2736
+ export async function consolidateBatchFindings(
2737
+ findings: Finding[],
2738
+ options: ConsolidateOptions = {}
2739
+ ): Promise&lt;ConsolidateResult&gt; {
2740
+ if (findings.length &lt;= 1) {
2741
+ return { findings, removedCount: 0 };
2742
+ }
2743
+ &nbsp;
2744
+ // Phase 1: Hash dedup within batch
2745
+ const seen = new Set&lt;string&gt;();
2746
+ const hashDeduped: Finding[] = [];
2747
+ &nbsp;
2748
+ for (const f of findings) {
2749
+ const hash = generateContentHash(f.title, f.description);
2750
+ const line = findingLine(f);
2751
+ const path = f.location?.path ?? <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2752
+ const key = `${path}:${line}:${hash}`;
2753
+ &nbsp;
2754
+ if (seen.has(key)) continue;
2755
+ seen.add(key);
2756
+ hashDeduped.push(f);
2757
+ }
2758
+ &nbsp;
2759
+ const hashRemovedCount = findings.length - hashDeduped.length;
2760
+ &nbsp;
2761
+ if (hashRemovedCount &gt; 0) {
2762
+ console.log(`Consolidate: ${hashRemovedCount} exact duplicate findings removed within batch`);
2763
+ }
2764
+ &nbsp;
2765
+ // Phase 2: Proximity grouping
2766
+ const clusters = findProximityClusters(hashDeduped);
2767
+ &nbsp;
2768
+ // If no proximity clusters, hash-only mode, or no runtime auth, return hash-deduped results.
2769
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (clusters.length === 0 || options.hashOnly || !canUseRuntimeAuth(options)) {
2770
+ return { findings: hashDeduped, removedCount: hashRemovedCount };
2771
+ }
2772
+ &nbsp;
2773
+ // Phase 3: LLM consolidation for proximity clusters
2774
+ // Only send clustered findings to the LLM (deduplicated across clusters)
2775
+ const clusteredList = <span class="cstat-no" title="statement not covered" >[...new Set(clusters.flat())];</span>
2776
+ const <span class="cstat-no" title="statement not covered" >findingsList = formatIndexedFindingsForPrompt(clusteredList, {</span>
2777
+ includeSeverity: true,
2778
+ });
2779
+ &nbsp;
2780
+ const <span class="cstat-no" title="statement not covered" >prompt = joinPromptSections([</span>
2781
+ `&lt;task&gt;
2782
+ Group findings that describe the SAME root cause or bug.
2783
+ &lt;/task&gt;`,
2784
+ `&lt;findings&gt;
2785
+ ${findingsList}
2786
+ &lt;/findings&gt;`,
2787
+ `&lt;deduplication_rules&gt;
2788
+ Return a JSON array of arrays, where each inner array contains the 1-based indices of findings that describe the same root cause.
2789
+ Only group findings that are truly about the same underlying issue. Findings about different issues should NOT be grouped even if they're nearby.
2790
+ Singletons (findings with no duplicates) should not appear in any group.
2791
+ &lt;/deduplication_rules&gt;`,
2792
+ buildJsonOutputSection('Return the JSON array. Return [] if no findings share a root cause.'),
2793
+ ]);
2794
+ &nbsp;
2795
+ const result = <span class="cstat-no" title="statement not covered" >await getRuntime(options.runtime ?? 'claude').runAuxiliary({</span>
2796
+ task: 'deduplication',
2797
+ agentName: options.agentName,
2798
+ apiKey: options.apiKey,
2799
+ prompt,
2800
+ schema: ConsolidationGroupsSchema,
2801
+ model: options.model,
2802
+ maxTokens: 512,
2803
+ maxRetries: options.maxRetries,
2804
+ });
2805
+ &nbsp;
2806
+ <span class="cstat-no" title="statement not covered" > if (!result.success) {</span>
2807
+ <span class="cstat-no" title="statement not covered" > console.warn(`LLM batch consolidation failed, keeping all findings: ${result.error}`);</span>
2808
+ <span class="cstat-no" title="statement not covered" > return { findings: hashDeduped, removedCount: hashRemovedCount, usage: result.usage };</span>
2809
+ }
2810
+ &nbsp;
2811
+ const { absorbed, replacements <span class="cstat-no" title="statement not covered" >} = applyMergeGroups(clusteredList, result.data);</span>
2812
+ &nbsp;
2813
+ <span class="cstat-no" title="statement not covered" > if (absorbed.size === 0) {</span>
2814
+ <span class="cstat-no" title="statement not covered" > return { findings: hashDeduped, removedCount: hashRemovedCount, usage: result.usage };</span>
2815
+ }
2816
+ &nbsp;
2817
+ const consolidated = <span class="cstat-no" title="statement not covered" >hashDeduped</span>
2818
+ .filter(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; <span class="cstat-no" title="statement not covered" >!absorbed.has(f))</span>
2819
+ .map(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; <span class="cstat-no" title="statement not covered" >replacements.get(f) ?? f)</span>;
2820
+ const totalRemoved = <span class="cstat-no" title="statement not covered" >hashRemovedCount + absorbed.size;</span>
2821
+ &nbsp;
2822
+ <span class="cstat-no" title="statement not covered" > console.log(`Consolidate: ${absorbed.size} findings merged by LLM (same root cause)`);</span>
2823
+ &nbsp;
2824
+ <span class="cstat-no" title="statement not covered" > return { findings: consolidated, removedCount: totalRemoved, usage: result.usage };</span>
2825
+ }
2826
+ &nbsp;
2827
+ /**
2828
+ * Deduplicate findings against existing comments.
2829
+ * Returns non-duplicate findings and actions to take for duplicates.
2830
+ *
2831
+ * Deduplication is two-pass:
2832
+ * 1. Exact content hash match - instant match
2833
+ * 2. LLM semantic comparison for remaining findings (if API key provided)
2834
+ *
2835
+ * For duplicates:
2836
+ * - If matching a Warden comment: action to update attribution with new skill
2837
+ * - If matching an external comment: action to add reaction
2838
+ */
2839
+ export async function deduplicateFindings(
2840
+ findings: Finding[],
2841
+ existingComments: ExistingComment[],
2842
+ options: DeduplicateOptions = {}
2843
+ ): Promise&lt;DeduplicateResult&gt; {
2844
+ if (findings.length === 0 || existingComments.length === 0) {
2845
+ return { newFindings: findings, duplicateActions: [] };
2846
+ }
2847
+ &nbsp;
2848
+ // Build maps of existing comments by location+hash for fast lookup
2849
+ const existingByKey = new Map&lt;string, ExistingComment&gt;();
2850
+ const wardenByKey = new Map&lt;string, ExistingComment&gt;();
2851
+ for (const c of existingComments) {
2852
+ const key = `${c.path}:${c.line}:${c.contentHash}`;
2853
+ existingByKey.set(key, c);
2854
+ if (c.isWarden) {
2855
+ wardenByKey.set(key, c);
2856
+ }
2857
+ }
2858
+ &nbsp;
2859
+ // First pass: find exact matches (same content at same location)
2860
+ const hashDedupedFindings: Finding[] = [];
2861
+ const duplicateActions: DuplicateAction[] = [];
2862
+ &nbsp;
2863
+ for (const finding of findings) {
2864
+ const hash = generateContentHash(finding.title, finding.description);
2865
+ const line = finding.location?.endLine ?? finding.location?.startLine ?? <span class="branch-2 cbranch-no" title="branch not covered" >0;</span>
2866
+ const path = finding.location?.path ?? <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2867
+ const key = `${path}:${line}:${hash}`;
2868
+ &nbsp;
2869
+ let matchingComment = existingByKey.get(key);
2870
+ &nbsp;
2871
+ // If no primary location match, check additional locations against our own comments.
2872
+ // This handles winner-flip scenarios where a merged finding's primary location changed
2873
+ // between runs but an additional location matches a previous Warden comment.
2874
+ if (!matchingComment &amp;&amp; finding.additionalLocations) {
2875
+ for (const loc of finding.additionalLocations) {
2876
+ const addlLine = loc.endLine ?? loc.startLine;
2877
+ const addlKey = `${loc.path}:${addlLine}:${hash}`;
2878
+ const wardenMatch = wardenByKey.get(addlKey);
2879
+ if (wardenMatch) {
2880
+ matchingComment = wardenMatch;
2881
+ break;
2882
+ }
2883
+ }
2884
+ }
2885
+ &nbsp;
2886
+ if (matchingComment) {
2887
+ duplicateActions.push({
2888
+ type: matchingComment.isWarden ? 'update_warden' : 'react_external',
2889
+ finding,
2890
+ existingComment: matchingComment,
2891
+ matchType: 'hash',
2892
+ });
2893
+ } else {
2894
+ hashDedupedFindings.push(finding);
2895
+ }
2896
+ }
2897
+ &nbsp;
2898
+ if (duplicateActions.length &gt; 0) {
2899
+ console.log(`Dedup: ${duplicateActions.length} findings matched by content hash`);
2900
+ }
2901
+ &nbsp;
2902
+ // If hash-only mode, no runtime auth, or no remaining findings, stop here.
2903
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (options.hashOnly || <span class="branch-1 cbranch-no" title="branch not covered" >!canUseRuntimeAuth(options) || <span class="branch-2 cbranch-no" title="branch not covered" >h</span>ashDedupedFindings.length === 0) {</span>
2904
+ return { newFindings: hashDedupedFindings, duplicateActions };
2905
+ }
2906
+ &nbsp;
2907
+ // Second pass: LLM semantic comparison for remaining findings
2908
+ const semanticResult = <span class="cstat-no" title="statement not covered" >await findSemanticDuplicates(hashDedupedFindings, existingComments, options.apiKey, options);</span>
2909
+ &nbsp;
2910
+ <span class="cstat-no" title="statement not covered" > if (semanticResult.matches.size &gt; 0) {</span>
2911
+ <span class="cstat-no" title="statement not covered" > console.log(`Dedup: ${semanticResult.matches.size} findings identified as semantic duplicates by LLM`);</span>
2912
+ }
2913
+ &nbsp;
2914
+ const newFindings: Finding[] = <span class="cstat-no" title="statement not covered" >[];</span>
2915
+ <span class="cstat-no" title="statement not covered" > for (const finding of hashDedupedFindings) {</span>
2916
+ const matchingComment = <span class="cstat-no" title="statement not covered" >semanticResult.matches.get(finding.id);</span>
2917
+ <span class="cstat-no" title="statement not covered" > if (matchingComment) {</span>
2918
+ <span class="cstat-no" title="statement not covered" > duplicateActions.push({</span>
2919
+ type: matchingComment.isWarden ? 'update_warden' : 'react_external',
2920
+ finding,
2921
+ existingComment: matchingComment,
2922
+ matchType: 'semantic',
2923
+ });
2924
+ } else {
2925
+ <span class="cstat-no" title="statement not covered" > newFindings.push(finding);</span>
2926
+ }
2927
+ }
2928
+ &nbsp;
2929
+ <span class="cstat-no" title="statement not covered" > return { newFindings, duplicateActions, dedupUsage: semanticResult.usage };</span>
2930
+ }
2931
+ &nbsp;</pre></td></tr></table></pre>
2932
+
2933
+ <div class='push'></div><!-- for sticky footer -->
2934
+ </div><!-- /wrapper -->
2935
+ <div class='footer quiet pad2 space-top1 center small'>
2936
+ Code coverage generated by
2937
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2938
+ at 2026-05-17T04:35:52.381Z
2939
+ </div>
2940
+ <script src="../../prettify.js"></script>
2941
+ <script>
2942
+ window.onload = function () {
2943
+ prettyPrint();
2944
+ };
2945
+ </script>
2946
+ <script src="../../sorter.js"></script>
2947
+ <script src="../../block-navigation.js"></script>
2948
+ </body>
2949
+ </html>
2950
+