@basementuniverse/kanbn 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +2 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/coverage-summary.json +31 -0
  5. package/coverage/favicon.png +0 -0
  6. package/coverage/index.html +146 -0
  7. package/coverage/kanbn/index.html +116 -0
  8. package/coverage/kanbn/index.js.html +217 -0
  9. package/coverage/kanbn/src/board.js.html +646 -0
  10. package/coverage/kanbn/src/controller/add.js.html +1729 -0
  11. package/coverage/kanbn/src/controller/archive.js.html +277 -0
  12. package/coverage/kanbn/src/controller/board.js.html +217 -0
  13. package/coverage/kanbn/src/controller/burndown.js.html +607 -0
  14. package/coverage/kanbn/src/controller/comment.js.html +397 -0
  15. package/coverage/kanbn/src/controller/edit.js.html +2920 -0
  16. package/coverage/kanbn/src/controller/find.js.html +1597 -0
  17. package/coverage/kanbn/src/controller/gantt.js.html +1342 -0
  18. package/coverage/kanbn/src/controller/help.js.html +115 -0
  19. package/coverage/kanbn/src/controller/history.js.html +400 -0
  20. package/coverage/kanbn/src/controller/index.html +431 -0
  21. package/coverage/kanbn/src/controller/init.js.html +511 -0
  22. package/coverage/kanbn/src/controller/move.js.html +514 -0
  23. package/coverage/kanbn/src/controller/remove-all.js.html +226 -0
  24. package/coverage/kanbn/src/controller/remove.js.html +307 -0
  25. package/coverage/kanbn/src/controller/rename.js.html +397 -0
  26. package/coverage/kanbn/src/controller/restore.js.html +268 -0
  27. package/coverage/kanbn/src/controller/sort.js.html +1318 -0
  28. package/coverage/kanbn/src/controller/sprint.js.html +361 -0
  29. package/coverage/kanbn/src/controller/status.js.html +310 -0
  30. package/coverage/kanbn/src/controller/task.js.html +244 -0
  31. package/coverage/kanbn/src/controller/validate.js.html +367 -0
  32. package/coverage/kanbn/src/controller/version.js.html +100 -0
  33. package/coverage/kanbn/src/index.html +191 -0
  34. package/coverage/kanbn/src/main.js.html +9787 -0
  35. package/coverage/kanbn/src/parse-index.js.html +1063 -0
  36. package/coverage/kanbn/src/parse-markdown.js.html +202 -0
  37. package/coverage/kanbn/src/parse-task.js.html +2191 -0
  38. package/coverage/kanbn/src/utility.js.html +616 -0
  39. package/coverage/lcov.info +11837 -0
  40. package/coverage/prettify.css +1 -0
  41. package/coverage/prettify.js +2 -0
  42. package/coverage/sort-arrow-sprite.png +0 -0
  43. package/coverage/sorter.js +210 -0
  44. package/coverage/tmp/coverage-214292-1787777191526-0.json +1 -0
  45. package/coverage/tmp/coverage-214293-1787777184569-0.json +1 -0
  46. package/docs/advanced-configuration.md +2 -0
  47. package/docs/commands/add.txt +10 -0
  48. package/docs/commands/board.txt +3 -1
  49. package/docs/commands/burndown.txt +2 -4
  50. package/docs/commands/edit.txt +22 -0
  51. package/docs/commands/find.txt +45 -1
  52. package/docs/commands/help.txt +1 -0
  53. package/docs/commands/move.txt +1 -1
  54. package/docs/commands/sort.txt +13 -2
  55. package/docs/commands/validate.txt +12 -0
  56. package/docs/filtering-and-sorting.md +218 -0
  57. package/docs/index-structure.md +68 -19
  58. package/docs/index.md +26 -2
  59. package/docs/migration-2.0.md +92 -0
  60. package/docs/quick-start.md +37 -1
  61. package/docs/task-structure.md +12 -3
  62. package/docs/views.md +229 -0
  63. package/example/README.md +70 -0
  64. package/example/advanced/.kanbn/index.md +26 -0
  65. package/example/advanced/.kanbn/tasks/add-rate-limiting.md +18 -0
  66. package/example/advanced/.kanbn/tasks/add-sso-support.md +15 -0
  67. package/example/advanced/.kanbn/tasks/migrate-to-new-cdn.md +14 -0
  68. package/example/advanced/.kanbn/tasks/refresh-marketing-site.md +14 -0
  69. package/example/advanced/.kanbn/tasks/rotate-api-keys.md +15 -0
  70. package/example/advanced/.kanbn/tasks/split-billing-service.md +17 -0
  71. package/example/advanced/.kanbn/tasks/upgrade-node-runtime.md +19 -0
  72. package/example/advanced/kanbn.yml +59 -0
  73. package/example/views/.kanbn/index.md +140 -0
  74. package/example/views/.kanbn/tasks/add-audit-log-export.md +18 -0
  75. package/example/views/.kanbn/tasks/add-dark-mode-toggle.md +16 -0
  76. package/example/views/.kanbn/tasks/build-webhook-retry-queue.md +15 -0
  77. package/example/views/.kanbn/tasks/fix-avatar-upload-crash.md +13 -0
  78. package/example/views/.kanbn/tasks/fix-expired-session-redirect.md +15 -0
  79. package/example/views/.kanbn/tasks/investigate-offline-mode.md +12 -0
  80. package/example/views/.kanbn/tasks/rewrite-search-indexer.md +12 -0
  81. package/example/views/.kanbn/tasks/tidy-up-settings-copy.md +12 -0
  82. package/package.json +4 -3
  83. package/routes/edit.json +2 -1
  84. package/routes/validate.json +4 -2
  85. package/skills/kanbn-plan/references/index-structure.md +1 -0
  86. package/skills/kanbn-plan/references/task-structure.md +2 -0
  87. package/src/board.js +1 -0
  88. package/src/controller/board.js +6 -0
  89. package/src/controller/edit.js +65 -12
  90. package/src/controller/gantt.js +46 -1
  91. package/src/controller/status.js +12 -0
  92. package/src/controller/task.js +1 -1
  93. package/src/controller/validate.js +78 -15
  94. package/src/main.js +324 -152
  95. package/src/parse-index.js +3 -0
  96. package/src/parse-markdown.js +3 -1
  97. package/src/parse-task.js +28 -1
  98. package/src/utility.js +26 -1
  99. /package/example/{.kanbn → basic/.kanbn}/index.md +0 -0
  100. /package/example/{.kanbn → basic/.kanbn}/tasks/add-basic-activity-feed.md +0 -0
  101. /package/example/{.kanbn → basic/.kanbn}/tasks/add-passwordless-login-option.md +0 -0
  102. /package/example/{.kanbn → basic/.kanbn}/tasks/add-usage-alert-email-thresholds.md +0 -0
  103. /package/example/{.kanbn → basic/.kanbn}/tasks/build-email-template-system.md +0 -0
  104. /package/example/{.kanbn → basic/.kanbn}/tasks/build-invoice-download-endpoint.md +0 -0
  105. /package/example/{.kanbn → basic/.kanbn}/tasks/build-tenant-settings-page.md +0 -0
  106. /package/example/{.kanbn → basic/.kanbn}/tasks/create-organization-switcher.md +0 -0
  107. /package/example/{.kanbn → basic/.kanbn}/tasks/create-sandbox-environment-provisioner.md +0 -0
  108. /package/example/{.kanbn → basic/.kanbn}/tasks/create-self-serve-cancellation-flow.md +0 -0
  109. /package/example/{.kanbn → basic/.kanbn}/tasks/define-product-pricing-strategy.md +0 -0
  110. /package/example/{.kanbn → basic/.kanbn}/tasks/design-onboarding-checklist.md +0 -0
  111. /package/example/{.kanbn → basic/.kanbn}/tasks/design-team-invite-expiry-flow.md +0 -0
  112. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-data-retention-policy-jobs.md +0 -0
  113. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-feature-flags-foundation.md +0 -0
  114. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-project-creation-wizard.md +0 -0
  115. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-stripe-webhook-signature-check.md +0 -0
  116. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-team-permissions-ui.md +0 -0
  117. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-user-signup-and-login.md +0 -0
  118. /package/example/{.kanbn → basic/.kanbn}/tasks/integrate-crm-lead-sync.md +0 -0
  119. /package/example/{.kanbn → basic/.kanbn}/tasks/legal-review-terms-and-privacy.md +0 -0
  120. /package/example/{.kanbn → basic/.kanbn}/tasks/migrate-legacy-events-to-new-schema.md +0 -0
  121. /package/example/{.kanbn → basic/.kanbn}/tasks/optimize-dashboard-first-load.md +0 -0
  122. /package/example/{.kanbn → basic/.kanbn}/tasks/prototype-report-export-scheduler.md +0 -0
  123. /package/example/{.kanbn → basic/.kanbn}/tasks/publish-internal-qa-checklist.md +0 -0
  124. /package/example/{.kanbn → basic/.kanbn}/tasks/setup-ci-pipeline.md +0 -0
@@ -0,0 +1,1729 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for kanbn/src/controller/add.js</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">kanbn/src/controller</a> add.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">93.06% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>510/548</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">87.39% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>104/119</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">94.73% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>18/19</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">93.06% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>510/548</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">17x</span>
615
+ <span class="cline-any cline-yes">17x</span>
616
+ <span class="cline-any cline-yes">17x</span>
617
+ <span class="cline-any cline-yes">17x</span>
618
+ <span class="cline-any cline-yes">17x</span>
619
+ <span class="cline-any cline-yes">17x</span>
620
+ <span class="cline-any cline-yes">17x</span>
621
+ <span class="cline-any cline-yes">17x</span>
622
+ <span class="cline-any cline-yes">17x</span>
623
+ <span class="cline-any cline-yes">17x</span>
624
+ <span class="cline-any cline-yes">17x</span>
625
+ <span class="cline-any cline-yes">17x</span>
626
+ <span class="cline-any cline-yes">17x</span>
627
+ <span class="cline-any cline-yes">17x</span>
628
+ <span class="cline-any cline-yes">17x</span>
629
+ <span class="cline-any cline-yes">17x</span>
630
+ <span class="cline-any cline-yes">17x</span>
631
+ <span class="cline-any cline-yes">17x</span>
632
+ <span class="cline-any cline-yes">17x</span>
633
+ <span class="cline-any cline-yes">14x</span>
634
+ <span class="cline-any cline-yes">14x</span>
635
+ <span class="cline-any cline-yes">14x</span>
636
+ <span class="cline-any cline-yes">14x</span>
637
+ <span class="cline-any cline-no">&nbsp;</span>
638
+ <span class="cline-any cline-yes">14x</span>
639
+ <span class="cline-any cline-yes">14x</span>
640
+ <span class="cline-any cline-yes">14x</span>
641
+ <span class="cline-any cline-yes">14x</span>
642
+ <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-yes">14x</span>
644
+ <span class="cline-any cline-yes">14x</span>
645
+ <span class="cline-any cline-yes">14x</span>
646
+ <span class="cline-any cline-yes">14x</span>
647
+ <span class="cline-any cline-no">&nbsp;</span>
648
+ <span class="cline-any cline-yes">14x</span>
649
+ <span class="cline-any cline-yes">14x</span>
650
+ <span class="cline-any cline-yes">14x</span>
651
+ <span class="cline-any cline-yes">14x</span>
652
+ <span class="cline-any cline-no">&nbsp;</span>
653
+ <span class="cline-any cline-yes">14x</span>
654
+ <span class="cline-any cline-yes">14x</span>
655
+ <span class="cline-any cline-yes">14x</span>
656
+ <span class="cline-any cline-yes">14x</span>
657
+ <span class="cline-any cline-yes">14x</span>
658
+ <span class="cline-any cline-yes">14x</span>
659
+ <span class="cline-any cline-yes">14x</span>
660
+ <span class="cline-any cline-yes">14x</span>
661
+ <span class="cline-any cline-yes">13x</span>
662
+ <span class="cline-any cline-yes">1x</span>
663
+ <span class="cline-any cline-yes">1x</span>
664
+ <span class="cline-any cline-yes">12x</span>
665
+ <span class="cline-any cline-yes">13x</span>
666
+ <span class="cline-any cline-yes">14x</span>
667
+ <span class="cline-any cline-yes">14x</span>
668
+ <span class="cline-any cline-yes">14x</span>
669
+ <span class="cline-any cline-yes">14x</span>
670
+ <span class="cline-any cline-yes">14x</span>
671
+ <span class="cline-any cline-yes">14x</span>
672
+ <span class="cline-any cline-yes">14x</span>
673
+ <span class="cline-any cline-yes">14x</span>
674
+ <span class="cline-any cline-yes">14x</span>
675
+ <span class="cline-any cline-yes">14x</span>
676
+ <span class="cline-any cline-yes">14x</span>
677
+ <span class="cline-any cline-yes">14x</span>
678
+ <span class="cline-any cline-yes">14x</span>
679
+ <span class="cline-any cline-yes">14x</span>
680
+ <span class="cline-any cline-yes">14x</span>
681
+ <span class="cline-any cline-yes">14x</span>
682
+ <span class="cline-any cline-yes">14x</span>
683
+ <span class="cline-any cline-yes">14x</span>
684
+ <span class="cline-any cline-yes">14x</span>
685
+ <span class="cline-any cline-yes">14x</span>
686
+ <span class="cline-any cline-yes">14x</span>
687
+ <span class="cline-any cline-yes">14x</span>
688
+ <span class="cline-any cline-yes">14x</span>
689
+ <span class="cline-any cline-yes">14x</span>
690
+ <span class="cline-any cline-yes">14x</span>
691
+ <span class="cline-any cline-yes">14x</span>
692
+ <span class="cline-any cline-yes">14x</span>
693
+ <span class="cline-any cline-yes">14x</span>
694
+ <span class="cline-any cline-yes">14x</span>
695
+ <span class="cline-any cline-yes">14x</span>
696
+ <span class="cline-any cline-yes">14x</span>
697
+ <span class="cline-any cline-yes">14x</span>
698
+ <span class="cline-any cline-yes">14x</span>
699
+ <span class="cline-any cline-yes">14x</span>
700
+ <span class="cline-any cline-yes">14x</span>
701
+ <span class="cline-any cline-yes">14x</span>
702
+ <span class="cline-any cline-yes">14x</span>
703
+ <span class="cline-any cline-yes">14x</span>
704
+ <span class="cline-any cline-yes">14x</span>
705
+ <span class="cline-any cline-yes">14x</span>
706
+ <span class="cline-any cline-yes">14x</span>
707
+ <span class="cline-any cline-yes">14x</span>
708
+ <span class="cline-any cline-yes">14x</span>
709
+ <span class="cline-any cline-yes">14x</span>
710
+ <span class="cline-any cline-yes">14x</span>
711
+ <span class="cline-any cline-yes">14x</span>
712
+ <span class="cline-any cline-yes">14x</span>
713
+ <span class="cline-any cline-yes">14x</span>
714
+ <span class="cline-any cline-yes">14x</span>
715
+ <span class="cline-any cline-yes">14x</span>
716
+ <span class="cline-any cline-yes">14x</span>
717
+ <span class="cline-any cline-yes">14x</span>
718
+ <span class="cline-any cline-yes">14x</span>
719
+ <span class="cline-any cline-yes">14x</span>
720
+ <span class="cline-any cline-yes">14x</span>
721
+ <span class="cline-any cline-yes">14x</span>
722
+ <span class="cline-any cline-yes">14x</span>
723
+ <span class="cline-any cline-yes">14x</span>
724
+ <span class="cline-any cline-yes">14x</span>
725
+ <span class="cline-any cline-yes">14x</span>
726
+ <span class="cline-any cline-yes">14x</span>
727
+ <span class="cline-any cline-yes">14x</span>
728
+ <span class="cline-any cline-yes">14x</span>
729
+ <span class="cline-any cline-yes">14x</span>
730
+ <span class="cline-any cline-yes">14x</span>
731
+ <span class="cline-any cline-yes">14x</span>
732
+ <span class="cline-any cline-yes">14x</span>
733
+ <span class="cline-any cline-yes">14x</span>
734
+ <span class="cline-any cline-yes">14x</span>
735
+ <span class="cline-any cline-yes">14x</span>
736
+ <span class="cline-any cline-yes">14x</span>
737
+ <span class="cline-any cline-yes">14x</span>
738
+ <span class="cline-any cline-yes">14x</span>
739
+ <span class="cline-any cline-yes">14x</span>
740
+ <span class="cline-any cline-yes">14x</span>
741
+ <span class="cline-any cline-yes">14x</span>
742
+ <span class="cline-any cline-yes">14x</span>
743
+ <span class="cline-any cline-yes">14x</span>
744
+ <span class="cline-any cline-yes">14x</span>
745
+ <span class="cline-any cline-yes">14x</span>
746
+ <span class="cline-any cline-yes">14x</span>
747
+ <span class="cline-any cline-yes">14x</span>
748
+ <span class="cline-any cline-yes">14x</span>
749
+ <span class="cline-any cline-yes">14x</span>
750
+ <span class="cline-any cline-yes">14x</span>
751
+ <span class="cline-any cline-yes">14x</span>
752
+ <span class="cline-any cline-yes">14x</span>
753
+ <span class="cline-any cline-yes">14x</span>
754
+ <span class="cline-any cline-yes">14x</span>
755
+ <span class="cline-any cline-yes">14x</span>
756
+ <span class="cline-any cline-yes">14x</span>
757
+ <span class="cline-any cline-yes">14x</span>
758
+ <span class="cline-any cline-yes">3x</span>
759
+ <span class="cline-any cline-yes">1x</span>
760
+ <span class="cline-any cline-yes">1x</span>
761
+ <span class="cline-any cline-yes">2x</span>
762
+ <span class="cline-any cline-yes">3x</span>
763
+ <span class="cline-any cline-yes">14x</span>
764
+ <span class="cline-any cline-yes">14x</span>
765
+ <span class="cline-any cline-yes">14x</span>
766
+ <span class="cline-any cline-yes">14x</span>
767
+ <span class="cline-any cline-yes">14x</span>
768
+ <span class="cline-any cline-yes">14x</span>
769
+ <span class="cline-any cline-yes">14x</span>
770
+ <span class="cline-any cline-yes">14x</span>
771
+ <span class="cline-any cline-yes">14x</span>
772
+ <span class="cline-any cline-yes">14x</span>
773
+ <span class="cline-any cline-yes">14x</span>
774
+ <span class="cline-any cline-yes">14x</span>
775
+ <span class="cline-any cline-yes">14x</span>
776
+ <span class="cline-any cline-yes">14x</span>
777
+ <span class="cline-any cline-yes">14x</span>
778
+ <span class="cline-any cline-yes">14x</span>
779
+ <span class="cline-any cline-yes">14x</span>
780
+ <span class="cline-any cline-yes">14x</span>
781
+ <span class="cline-any cline-yes">14x</span>
782
+ <span class="cline-any cline-yes">14x</span>
783
+ <span class="cline-any cline-yes">14x</span>
784
+ <span class="cline-any cline-yes">3x</span>
785
+ <span class="cline-any cline-yes">1x</span>
786
+ <span class="cline-any cline-yes">1x</span>
787
+ <span class="cline-any cline-yes">2x</span>
788
+ <span class="cline-any cline-yes">3x</span>
789
+ <span class="cline-any cline-yes">14x</span>
790
+ <span class="cline-any cline-yes">14x</span>
791
+ <span class="cline-any cline-yes">14x</span>
792
+ <span class="cline-any cline-yes">14x</span>
793
+ <span class="cline-any cline-yes">14x</span>
794
+ <span class="cline-any cline-yes">14x</span>
795
+ <span class="cline-any cline-yes">14x</span>
796
+ <span class="cline-any cline-yes">14x</span>
797
+ <span class="cline-any cline-yes">14x</span>
798
+ <span class="cline-any cline-yes">14x</span>
799
+ <span class="cline-any cline-yes">14x</span>
800
+ <span class="cline-any cline-yes">14x</span>
801
+ <span class="cline-any cline-yes">14x</span>
802
+ <span class="cline-any cline-yes">14x</span>
803
+ <span class="cline-any cline-yes">14x</span>
804
+ <span class="cline-any cline-yes">14x</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-no">&nbsp;</span>
807
+ <span class="cline-any cline-no">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-no">&nbsp;</span>
811
+ <span class="cline-any cline-yes">14x</span>
812
+ <span class="cline-any cline-yes">14x</span>
813
+ <span class="cline-any cline-yes">14x</span>
814
+ <span class="cline-any cline-yes">14x</span>
815
+ <span class="cline-any cline-yes">14x</span>
816
+ <span class="cline-any cline-yes">14x</span>
817
+ <span class="cline-any cline-yes">14x</span>
818
+ <span class="cline-any cline-yes">14x</span>
819
+ <span class="cline-any cline-yes">14x</span>
820
+ <span class="cline-any cline-yes">14x</span>
821
+ <span class="cline-any cline-yes">17x</span>
822
+ <span class="cline-any cline-yes">17x</span>
823
+ <span class="cline-any cline-yes">17x</span>
824
+ <span class="cline-any cline-yes">17x</span>
825
+ <span class="cline-any cline-yes">17x</span>
826
+ <span class="cline-any cline-yes">17x</span>
827
+ <span class="cline-any cline-yes">17x</span>
828
+ <span class="cline-any cline-yes">1x</span>
829
+ <span class="cline-any cline-yes">1x</span>
830
+ <span class="cline-any cline-yes">1x</span>
831
+ <span class="cline-any cline-yes">1x</span>
832
+ <span class="cline-any cline-yes">1x</span>
833
+ <span class="cline-any cline-yes">1x</span>
834
+ <span class="cline-any cline-yes">1x</span>
835
+ <span class="cline-any cline-yes">1x</span>
836
+ <span class="cline-any cline-yes">1x</span>
837
+ <span class="cline-any cline-yes">1x</span>
838
+ <span class="cline-any cline-yes">1x</span>
839
+ <span class="cline-any cline-yes">1x</span>
840
+ <span class="cline-any cline-yes">1x</span>
841
+ <span class="cline-any cline-yes">1x</span>
842
+ <span class="cline-any cline-yes">1x</span>
843
+ <span class="cline-any cline-yes">1x</span>
844
+ <span class="cline-any cline-yes">1x</span>
845
+ <span class="cline-any cline-yes">17x</span>
846
+ <span class="cline-any cline-yes">17x</span>
847
+ <span class="cline-any cline-yes">17x</span>
848
+ <span class="cline-any cline-yes">17x</span>
849
+ <span class="cline-any cline-yes">17x</span>
850
+ <span class="cline-any cline-yes">17x</span>
851
+ <span class="cline-any cline-yes">23x</span>
852
+ <span class="cline-any cline-yes">23x</span>
853
+ <span class="cline-any cline-yes">23x</span>
854
+ <span class="cline-any cline-yes">23x</span>
855
+ <span class="cline-any cline-yes">23x</span>
856
+ <span class="cline-any cline-yes">23x</span>
857
+ <span class="cline-any cline-yes">23x</span>
858
+ <span class="cline-any cline-no">&nbsp;</span>
859
+ <span class="cline-any cline-yes">23x</span>
860
+ <span class="cline-any cline-yes">23x</span>
861
+ <span class="cline-any cline-yes">17x</span>
862
+ <span class="cline-any cline-yes">17x</span>
863
+ <span class="cline-any cline-yes">17x</span>
864
+ <span class="cline-any cline-yes">17x</span>
865
+ <span class="cline-any cline-yes">17x</span>
866
+ <span class="cline-any cline-yes">17x</span>
867
+ <span class="cline-any cline-yes">3x</span>
868
+ <span class="cline-any cline-yes">3x</span>
869
+ <span class="cline-any cline-yes">4x</span>
870
+ <span class="cline-any cline-yes">4x</span>
871
+ <span class="cline-any cline-yes">4x</span>
872
+ <span class="cline-any cline-no">&nbsp;</span>
873
+ <span class="cline-any cline-no">&nbsp;</span>
874
+ <span class="cline-any cline-no">&nbsp;</span>
875
+ <span class="cline-any cline-yes">4x</span>
876
+ <span class="cline-any cline-yes">3x</span>
877
+ <span class="cline-any cline-yes">3x</span>
878
+ <span class="cline-any cline-yes">3x</span>
879
+ <span class="cline-any cline-yes">3x</span>
880
+ <span class="cline-any cline-yes">17x</span>
881
+ <span class="cline-any cline-yes">17x</span>
882
+ <span class="cline-any cline-yes">41x</span>
883
+ <span class="cline-any cline-yes">41x</span>
884
+ <span class="cline-any cline-yes">41x</span>
885
+ <span class="cline-any cline-yes">1x</span>
886
+ <span class="cline-any cline-yes">1x</span>
887
+ <span class="cline-any cline-yes">1x</span>
888
+ <span class="cline-any cline-yes">40x</span>
889
+ <span class="cline-any cline-yes">40x</span>
890
+ <span class="cline-any cline-yes">40x</span>
891
+ <span class="cline-any cline-yes">40x</span>
892
+ <span class="cline-any cline-yes">40x</span>
893
+ <span class="cline-any cline-yes">41x</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-no">&nbsp;</span>
897
+ <span class="cline-any cline-yes">40x</span>
898
+ <span class="cline-any cline-yes">41x</span>
899
+ <span class="cline-any cline-yes">1x</span>
900
+ <span class="cline-any cline-yes">1x</span>
901
+ <span class="cline-any cline-yes">1x</span>
902
+ <span class="cline-any cline-yes">39x</span>
903
+ <span class="cline-any cline-yes">39x</span>
904
+ <span class="cline-any cline-yes">39x</span>
905
+ <span class="cline-any cline-yes">41x</span>
906
+ <span class="cline-any cline-yes">3x</span>
907
+ <span class="cline-any cline-yes">3x</span>
908
+ <span class="cline-any cline-yes">1x</span>
909
+ <span class="cline-any cline-yes">1x</span>
910
+ <span class="cline-any cline-yes">1x</span>
911
+ <span class="cline-any cline-yes">3x</span>
912
+ <span class="cline-any cline-yes">38x</span>
913
+ <span class="cline-any cline-yes">38x</span>
914
+ <span class="cline-any cline-yes">41x</span>
915
+ <span class="cline-any cline-yes">4x</span>
916
+ <span class="cline-any cline-yes">4x</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-yes">4x</span>
919
+ <span class="cline-any cline-yes">1x</span>
920
+ <span class="cline-any cline-yes">4x</span>
921
+ <span class="cline-any cline-yes">3x</span>
922
+ <span class="cline-any cline-yes">3x</span>
923
+ <span class="cline-any cline-yes">3x</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-no">&nbsp;</span>
927
+ <span class="cline-any cline-yes">3x</span>
928
+ <span class="cline-any cline-yes">4x</span>
929
+ <span class="cline-any cline-yes">4x</span>
930
+ <span class="cline-any cline-yes">4x</span>
931
+ <span class="cline-any cline-yes">1x</span>
932
+ <span class="cline-any cline-yes">1x</span>
933
+ <span class="cline-any cline-yes">1x</span>
934
+ <span class="cline-any cline-yes">3x</span>
935
+ <span class="cline-any cline-yes">3x</span>
936
+ <span class="cline-any cline-yes">4x</span>
937
+ <span class="cline-any cline-yes">1x</span>
938
+ <span class="cline-any cline-yes">1x</span>
939
+ <span class="cline-any cline-yes">1x</span>
940
+ <span class="cline-any cline-yes">1x</span>
941
+ <span class="cline-any cline-yes">1x</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-yes">1x</span>
944
+ <span class="cline-any cline-yes">1x</span>
945
+ <span class="cline-any cline-yes">4x</span>
946
+ <span class="cline-any cline-yes">2x</span>
947
+ <span class="cline-any cline-yes">2x</span>
948
+ <span class="cline-any cline-yes">2x</span>
949
+ <span class="cline-any cline-yes">4x</span>
950
+ <span class="cline-any cline-yes">34x</span>
951
+ <span class="cline-any cline-yes">34x</span>
952
+ <span class="cline-any cline-yes">34x</span>
953
+ <span class="cline-any cline-yes">34x</span>
954
+ <span class="cline-any cline-yes">34x</span>
955
+ <span class="cline-any cline-yes">34x</span>
956
+ <span class="cline-any cline-yes">34x</span>
957
+ <span class="cline-any cline-yes">34x</span>
958
+ <span class="cline-any cline-yes">34x</span>
959
+ <span class="cline-any cline-yes">34x</span>
960
+ <span class="cline-any cline-yes">34x</span>
961
+ <span class="cline-any cline-yes">41x</span>
962
+ <span class="cline-any cline-yes">20x</span>
963
+ <span class="cline-any cline-yes">20x</span>
964
+ <span class="cline-any cline-yes">34x</span>
965
+ <span class="cline-any cline-yes">34x</span>
966
+ <span class="cline-any cline-yes">41x</span>
967
+ <span class="cline-any cline-yes">1x</span>
968
+ <span class="cline-any cline-yes">1x</span>
969
+ <span class="cline-any cline-yes">34x</span>
970
+ <span class="cline-any cline-yes">34x</span>
971
+ <span class="cline-any cline-yes">41x</span>
972
+ <span class="cline-any cline-yes">2x</span>
973
+ <span class="cline-any cline-yes">2x</span>
974
+ <span class="cline-any cline-yes">1x</span>
975
+ <span class="cline-any cline-yes">1x</span>
976
+ <span class="cline-any cline-yes">1x</span>
977
+ <span class="cline-any cline-yes">2x</span>
978
+ <span class="cline-any cline-yes">33x</span>
979
+ <span class="cline-any cline-yes">33x</span>
980
+ <span class="cline-any cline-yes">41x</span>
981
+ <span class="cline-any cline-yes">2x</span>
982
+ <span class="cline-any cline-yes">2x</span>
983
+ <span class="cline-any cline-yes">1x</span>
984
+ <span class="cline-any cline-yes">1x</span>
985
+ <span class="cline-any cline-yes">1x</span>
986
+ <span class="cline-any cline-yes">2x</span>
987
+ <span class="cline-any cline-yes">32x</span>
988
+ <span class="cline-any cline-yes">32x</span>
989
+ <span class="cline-any cline-yes">41x</span>
990
+ <span class="cline-any cline-yes">2x</span>
991
+ <span class="cline-any cline-yes">2x</span>
992
+ <span class="cline-any cline-yes">1x</span>
993
+ <span class="cline-any cline-yes">1x</span>
994
+ <span class="cline-any cline-yes">1x</span>
995
+ <span class="cline-any cline-yes">2x</span>
996
+ <span class="cline-any cline-yes">31x</span>
997
+ <span class="cline-any cline-yes">31x</span>
998
+ <span class="cline-any cline-yes">41x</span>
999
+ <span class="cline-any cline-yes">2x</span>
1000
+ <span class="cline-any cline-yes">2x</span>
1001
+ <span class="cline-any cline-yes">1x</span>
1002
+ <span class="cline-any cline-yes">1x</span>
1003
+ <span class="cline-any cline-yes">1x</span>
1004
+ <span class="cline-any cline-yes">1x</span>
1005
+ <span class="cline-any cline-yes">1x</span>
1006
+ <span class="cline-any cline-yes">30x</span>
1007
+ <span class="cline-any cline-yes">30x</span>
1008
+ <span class="cline-any cline-yes">41x</span>
1009
+ <span class="cline-any cline-no">&nbsp;</span>
1010
+ <span class="cline-any cline-no">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-no">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-no">&nbsp;</span>
1018
+ <span class="cline-any cline-yes">30x</span>
1019
+ <span class="cline-any cline-yes">30x</span>
1020
+ <span class="cline-any cline-yes">41x</span>
1021
+ <span class="cline-any cline-yes">1x</span>
1022
+ <span class="cline-any cline-yes">1x</span>
1023
+ <span class="cline-any cline-yes">2x</span>
1024
+ <span class="cline-any cline-yes">2x</span>
1025
+ <span class="cline-any cline-yes">1x</span>
1026
+ <span class="cline-any cline-yes">1x</span>
1027
+ <span class="cline-any cline-yes">1x</span>
1028
+ <span class="cline-any cline-yes">1x</span>
1029
+ <span class="cline-any cline-yes">1x</span>
1030
+ <span class="cline-any cline-yes">1x</span>
1031
+ <span class="cline-any cline-yes">1x</span>
1032
+ <span class="cline-any cline-yes">1x</span>
1033
+ <span class="cline-any cline-yes">1x</span>
1034
+ <span class="cline-any cline-yes">1x</span>
1035
+ <span class="cline-any cline-yes">1x</span>
1036
+ <span class="cline-any cline-yes">30x</span>
1037
+ <span class="cline-any cline-yes">30x</span>
1038
+ <span class="cline-any cline-yes">41x</span>
1039
+ <span class="cline-any cline-yes">1x</span>
1040
+ <span class="cline-any cline-yes">1x</span>
1041
+ <span class="cline-any cline-yes">30x</span>
1042
+ <span class="cline-any cline-yes">30x</span>
1043
+ <span class="cline-any cline-yes">41x</span>
1044
+ <span class="cline-any cline-yes">3x</span>
1045
+ <span class="cline-any cline-yes">3x</span>
1046
+ <span class="cline-any cline-yes">3x</span>
1047
+ <span class="cline-any cline-yes">3x</span>
1048
+ <span class="cline-any cline-yes">2x</span>
1049
+ <span class="cline-any cline-yes">2x</span>
1050
+ <span class="cline-any cline-yes">2x</span>
1051
+ <span class="cline-any cline-yes">3x</span>
1052
+ <span class="cline-any cline-yes">1x</span>
1053
+ <span class="cline-any cline-yes">1x</span>
1054
+ <span class="cline-any cline-yes">3x</span>
1055
+ <span class="cline-any cline-yes">3x</span>
1056
+ <span class="cline-any cline-yes">3x</span>
1057
+ <span class="cline-any cline-yes">3x</span>
1058
+ <span class="cline-any cline-yes">3x</span>
1059
+ <span class="cline-any cline-yes">3x</span>
1060
+ <span class="cline-any cline-yes">1x</span>
1061
+ <span class="cline-any cline-yes">1x</span>
1062
+ <span class="cline-any cline-yes">1x</span>
1063
+ <span class="cline-any cline-yes">3x</span>
1064
+ <span class="cline-any cline-yes">2x</span>
1065
+ <span class="cline-any cline-yes">2x</span>
1066
+ <span class="cline-any cline-yes">29x</span>
1067
+ <span class="cline-any cline-yes">29x</span>
1068
+ <span class="cline-any cline-yes">41x</span>
1069
+ <span class="cline-any cline-yes">6x</span>
1070
+ <span class="cline-any cline-yes">36x</span>
1071
+ <span class="cline-any cline-yes">36x</span>
1072
+ <span class="cline-any cline-yes">6x</span>
1073
+ <span class="cline-any cline-yes">6x</span>
1074
+ <span class="cline-any cline-yes">6x</span>
1075
+ <span class="cline-any cline-yes">6x</span>
1076
+ <span class="cline-any cline-yes">2x</span>
1077
+ <span class="cline-any cline-yes">1x</span>
1078
+ <span class="cline-any cline-yes">1x</span>
1079
+ <span class="cline-any cline-yes">1x</span>
1080
+ <span class="cline-any cline-yes">1x</span>
1081
+ <span class="cline-any cline-yes">1x</span>
1082
+ <span class="cline-any cline-yes">1x</span>
1083
+ <span class="cline-any cline-yes">6x</span>
1084
+ <span class="cline-any cline-yes">2x</span>
1085
+ <span class="cline-any cline-yes">2x</span>
1086
+ <span class="cline-any cline-yes">1x</span>
1087
+ <span class="cline-any cline-yes">1x</span>
1088
+ <span class="cline-any cline-yes">1x</span>
1089
+ <span class="cline-any cline-yes">1x</span>
1090
+ <span class="cline-any cline-yes">1x</span>
1091
+ <span class="cline-any cline-yes">1x</span>
1092
+ <span class="cline-any cline-yes">6x</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-no">&nbsp;</span>
1096
+ <span class="cline-any cline-no">&nbsp;</span>
1097
+ <span class="cline-any cline-no">&nbsp;</span>
1098
+ <span class="cline-any cline-no">&nbsp;</span>
1099
+ <span class="cline-any cline-no">&nbsp;</span>
1100
+ <span class="cline-any cline-yes">6x</span>
1101
+ <span class="cline-any cline-yes">2x</span>
1102
+ <span class="cline-any cline-yes">2x</span>
1103
+ <span class="cline-any cline-yes">1x</span>
1104
+ <span class="cline-any cline-yes">1x</span>
1105
+ <span class="cline-any cline-yes">1x</span>
1106
+ <span class="cline-any cline-yes">1x</span>
1107
+ <span class="cline-any cline-yes">1x</span>
1108
+ <span class="cline-any cline-yes">1x</span>
1109
+ <span class="cline-any cline-yes">6x</span>
1110
+ <span class="cline-any cline-yes">6x</span>
1111
+ <span class="cline-any cline-yes">3x</span>
1112
+ <span class="cline-any cline-yes">36x</span>
1113
+ <span class="cline-any cline-yes">3x</span>
1114
+ <span class="cline-any cline-yes">26x</span>
1115
+ <span class="cline-any cline-yes">26x</span>
1116
+ <span class="cline-any cline-yes">41x</span>
1117
+ <span class="cline-any cline-yes">14x</span>
1118
+ <span class="cline-any cline-yes">14x</span>
1119
+ <span class="cline-any cline-yes">11x</span>
1120
+ <span class="cline-any cline-yes">11x</span>
1121
+ <span class="cline-any cline-yes">1x</span>
1122
+ <span class="cline-any cline-yes">1x</span>
1123
+ <span class="cline-any cline-yes">11x</span>
1124
+ <span class="cline-any cline-yes">2x</span>
1125
+ <span class="cline-any cline-yes">2x</span>
1126
+ <span class="cline-any cline-yes">11x</span>
1127
+ <span class="cline-any cline-yes">1x</span>
1128
+ <span class="cline-any cline-yes">1x</span>
1129
+ <span class="cline-any cline-yes">11x</span>
1130
+ <span class="cline-any cline-yes">1x</span>
1131
+ <span class="cline-any cline-yes">1x</span>
1132
+ <span class="cline-any cline-yes">11x</span>
1133
+ <span class="cline-any cline-yes">1x</span>
1134
+ <span class="cline-any cline-yes">1x</span>
1135
+ <span class="cline-any cline-yes">11x</span>
1136
+ <span class="cline-any cline-yes">11x</span>
1137
+ <span class="cline-any cline-yes">2x</span>
1138
+ <span class="cline-any cline-yes">2x</span>
1139
+ <span class="cline-any cline-yes">11x</span>
1140
+ <span class="cline-any cline-yes">11x</span>
1141
+ <span class="cline-any cline-yes">11x</span>
1142
+ <span class="cline-any cline-yes">1x</span>
1143
+ <span class="cline-any cline-yes">1x</span>
1144
+ <span class="cline-any cline-yes">11x</span>
1145
+ <span class="cline-any cline-yes">10x</span>
1146
+ <span class="cline-any cline-yes">1x</span>
1147
+ <span class="cline-any cline-yes">1x</span>
1148
+ <span class="cline-any cline-yes">10x</span>
1149
+ <span class="cline-any cline-yes">10x</span>
1150
+ <span class="cline-any cline-yes">11x</span>
1151
+ <span class="cline-any cline-yes">11x</span>
1152
+ <span class="cline-any cline-yes">14x</span>
1153
+ <span class="cline-any cline-yes">14x</span>
1154
+ <span class="cline-any cline-yes">3x</span>
1155
+ <span class="cline-any cline-yes">14x</span>
1156
+ <span class="cline-any cline-yes">14x</span>
1157
+ <span class="cline-any cline-yes">14x</span>
1158
+ <span class="cline-any cline-yes">41x</span>
1159
+ <span class="cline-any cline-yes">12x</span>
1160
+ <span class="cline-any cline-yes">12x</span>
1161
+ <span class="cline-any cline-yes">17x</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const kanbn = require('../main');
1163
+ const utility = require('../utility');
1164
+ const inquirer = require('inquirer');
1165
+ const fuzzy = require('fuzzy');
1166
+ const chrono = require('chrono-node');
1167
+ const getGitUsername = require('git-user-name');
1168
+ &nbsp;
1169
+ inquirer.registerPrompt('datepicker', require('inquirer-datepicker'));
1170
+ inquirer.registerPrompt('recursive', require('inquirer-recursive'));
1171
+ inquirer.registerPrompt('autocomplete', require('inquirer-autocomplete-prompt'));
1172
+ &nbsp;
1173
+ /**
1174
+ * Create a task interactively
1175
+ * @param {object} taskData
1176
+ * @param {string[]} taskIds
1177
+ * @param {string} columnName
1178
+ * @param {string[]} columnNames
1179
+ * @return {Promise&lt;any&gt;}
1180
+ */
1181
+ async function interactiveCreateTask(taskData, taskIds, columnName, columnNames) {
1182
+ const dueDateExists = (
1183
+ 'metadata' in taskData &amp;&amp;
1184
+ 'due' in taskData.metadata <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp;</span>
1185
+ <span class="cstat-no" title="statement not covered" > taskData.metadata.due != null</span>
1186
+ );
1187
+ const plannedStartDateExists = (
1188
+ 'metadata' in taskData &amp;&amp;
1189
+ 'plannedStart' in taskData.metadata <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp;</span>
1190
+ <span class="cstat-no" title="statement not covered" > taskData.metadata.plannedStart != null</span>
1191
+ );
1192
+ const plannedFinishDateExists = (
1193
+ 'metadata' in taskData &amp;&amp;
1194
+ 'plannedFinish' in taskData.metadata <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp;</span>
1195
+ <span class="cstat-no" title="statement not covered" > taskData.metadata.plannedFinish != null</span>
1196
+ );
1197
+ const assignedExists = (
1198
+ 'metadata' in taskData &amp;&amp;
1199
+ 'assigned' in taskData.metadata <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp;</span>
1200
+ <span class="cstat-no" title="statement not covered" > taskData.metadata.assigned != null</span>
1201
+ );
1202
+ return await inquirer.prompt([
1203
+ {
1204
+ type: 'input',
1205
+ name: 'name',
1206
+ message: 'Task name:',
1207
+ default: taskData.name || '',
1208
+ validate: async value =&gt; {
1209
+ if (!value) {
1210
+ return 'Task name cannot be empty';
1211
+ }
1212
+ return true;
1213
+ }
1214
+ },
1215
+ {
1216
+ type: 'confirm',
1217
+ name: 'setDescription',
1218
+ message: 'Add a description?',
1219
+ default: false
1220
+ },
1221
+ {
1222
+ type: 'editor',
1223
+ name: 'description',
1224
+ message: 'Task description:',
1225
+ default: taskData.description,
1226
+ when: answers =&gt; answers.setDescription
1227
+ },
1228
+ {
1229
+ type: 'list',
1230
+ name: 'column',
1231
+ message: 'Column:',
1232
+ default: columnName,
1233
+ choices: columnNames
1234
+ },
1235
+ {
1236
+ type: 'confirm',
1237
+ name: 'setDue',
1238
+ message: 'Set a due date?',
1239
+ default: false,
1240
+ when: answers =&gt; !dueDateExists
1241
+ },
1242
+ {
1243
+ type: 'datepicker',
1244
+ name: 'due',
1245
+ message: 'Due date:',
1246
+ default: dueDateExists <span class="branch-0 cbranch-no" title="branch not covered" >? taskData.metadata.due </span>: new Date(),
1247
+ format: ['Y', '/', 'MM', '/', 'DD'],
1248
+ when: answers =&gt; answers.setDue,
1249
+ },
1250
+ {
1251
+ type: 'confirm',
1252
+ name: 'setPlannedStart',
1253
+ message: 'Set a planned start date?',
1254
+ default: false,
1255
+ when: answers =&gt; !plannedStartDateExists
1256
+ },
1257
+ {
1258
+ type: 'datepicker',
1259
+ name: 'plannedStart',
1260
+ message: 'Planned start date:',
1261
+ default: plannedStartDateExists <span class="branch-0 cbranch-no" title="branch not covered" >? taskData.metadata.plannedStart </span>: new Date(),
1262
+ format: ['Y', '/', 'MM', '/', 'DD'],
1263
+ when: answers =&gt; answers.setPlannedStart,
1264
+ },
1265
+ {
1266
+ type: 'confirm',
1267
+ name: 'setPlannedFinish',
1268
+ message: 'Set a planned finish date?',
1269
+ default: false,
1270
+ when: answers =&gt; !plannedFinishDateExists
1271
+ },
1272
+ {
1273
+ type: 'datepicker',
1274
+ name: 'plannedFinish',
1275
+ message: 'Planned finish date:',
1276
+ default: plannedFinishDateExists <span class="branch-0 cbranch-no" title="branch not covered" >? taskData.metadata.plannedFinish </span>: new Date(),
1277
+ format: ['Y', '/', 'MM', '/', 'DD'],
1278
+ when: answers =&gt; answers.setPlannedFinish,
1279
+ },
1280
+ {
1281
+ type: 'confirm',
1282
+ name: 'setAssigned',
1283
+ message: 'Assign this task?',
1284
+ default: false,
1285
+ when: answers =&gt; !assignedExists
1286
+ },
1287
+ {
1288
+ type: 'input',
1289
+ name: 'assigned',
1290
+ message: 'Assigned to:',
1291
+ default: assignedExists <span class="branch-0 cbranch-no" title="branch not covered" >? taskData.metadata.assigned </span>: getGitUsername(),
1292
+ when: answers =&gt; answers.setAssigned || assignedExists
1293
+ },
1294
+ {
1295
+ type: 'recursive',
1296
+ name: 'subTasks',
1297
+ initialMessage: 'Add a sub-task?',
1298
+ message: 'Add another sub-task?',
1299
+ default: false,
1300
+ prompts: [
1301
+ {
1302
+ type: 'input',
1303
+ name: 'text',
1304
+ message: 'Sub-task text:',
1305
+ validate: value =&gt; {
1306
+ if (!value) {
1307
+ return 'Sub-task text cannot be empty';
1308
+ }
1309
+ return true;
1310
+ }
1311
+ },
1312
+ {
1313
+ type: 'confirm',
1314
+ name: 'completed',
1315
+ message: 'Sub-task completed?',
1316
+ default: false
1317
+ }
1318
+ ]
1319
+ },
1320
+ {
1321
+ type: 'recursive',
1322
+ name: 'tags',
1323
+ initialMessage: 'Add a tag?',
1324
+ message: 'Add another tag?',
1325
+ default: false,
1326
+ prompts: [
1327
+ {
1328
+ type: 'input',
1329
+ name: 'name',
1330
+ message: 'Tag name:',
1331
+ validate: value =&gt; {
1332
+ if (!value) {
1333
+ return 'Tag name cannot be empty';
1334
+ }
1335
+ return true;
1336
+ }
1337
+ }
1338
+ ]
1339
+ },
1340
+ {
1341
+ type: 'recursive',
1342
+ name: 'relations',
1343
+ initialMessage: 'Add a relation?',
1344
+ message: 'Add another relation?',
1345
+ default: false,
1346
+ when: answers =&gt; taskIds.length &gt; 0,
1347
+ prompts: [
1348
+ {
1349
+ type: 'autocomplete',
1350
+ name: 'task',
1351
+ message: 'Related task id:',
1352
+ source: <span class="fstat-no" title="function not covered" >(answers, input) =&gt; {</span>
1353
+ <span class="cstat-no" title="statement not covered" > input = input || '';</span>
1354
+ <span class="cstat-no" title="statement not covered" > const result = fuzzy.filter(input, taskIds);</span>
1355
+ <span class="cstat-no" title="statement not covered" > return new Promise(resolve =&gt; {</span>
1356
+ <span class="cstat-no" title="statement not covered" > resolve(result.map(result =&gt; result.string));</span>
1357
+ <span class="cstat-no" title="statement not covered" > });</span>
1358
+ <span class="cstat-no" title="statement not covered" > }</span>
1359
+ },
1360
+ {
1361
+ type: 'input',
1362
+ name: 'type',
1363
+ message: 'Relation type:'
1364
+ }
1365
+ ]
1366
+ }
1367
+ ]);
1368
+ }
1369
+ &nbsp;
1370
+ /**
1371
+ * Add untracked tasks interactively
1372
+ * @param {string[]} untrackedTasks
1373
+ * @param {string} columnName
1374
+ * @param {string[]} columnNames
1375
+ */
1376
+ async function interactiveAddUntrackedTasks(untrackedTasks, columnName, columnNames) {
1377
+ return await inquirer.prompt([
1378
+ {
1379
+ type: 'checkbox',
1380
+ name: 'untrackedTasks',
1381
+ message: 'Choose which tasks to add:',
1382
+ choices: untrackedTasks
1383
+ },
1384
+ {
1385
+ type: 'list',
1386
+ name: 'column',
1387
+ message: 'Column:',
1388
+ default: columnName,
1389
+ choices: columnNames
1390
+ }
1391
+ ]);
1392
+ }
1393
+ &nbsp;
1394
+ /**
1395
+ * Create a task
1396
+ * @param {object} taskData
1397
+ * @param {string} columnName
1398
+ */
1399
+ function createTask(taskData, columnName) {
1400
+ kanbn
1401
+ .createTask(taskData, columnName)
1402
+ .then(taskId =&gt; {
1403
+ console.log(`Created task "${taskId}" in column "${columnName}"`);
1404
+ })
1405
+ .catch(error =&gt; {
1406
+ <span class="cstat-no" title="statement not covered" > utility.error(error);</span>
1407
+ });
1408
+ }
1409
+ &nbsp;
1410
+ /**
1411
+ * Add untracked tasks to the index
1412
+ * @param {string[]} untrackedTasks
1413
+ * @param {string} columnName
1414
+ */
1415
+ async function addUntrackedTasks(untrackedTasks, columnName) {
1416
+ for (let untrackedTask of untrackedTasks) {
1417
+ try {
1418
+ await kanbn.addUntrackedTaskToIndex(untrackedTask, columnName);
1419
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1420
+ <span class="cstat-no" title="statement not covered" > utility.error(error);</span>
1421
+ <span class="cstat-no" title="statement not covered" > return;</span>
1422
+ <span class="cstat-no" title="statement not covered" > }</span>
1423
+ }
1424
+ console.log(
1425
+ `Added ${untrackedTasks.length} task${untrackedTasks.length !== 1 ? 's' : ''} to column "${columnName}"`
1426
+ );
1427
+ }
1428
+ &nbsp;
1429
+ module.exports = async args =&gt; {
1430
+ &nbsp;
1431
+ // Make sure kanbn has been initialised
1432
+ if (!await kanbn.initialised()) {
1433
+ utility.error('Kanbn has not been initialised in this folder\nTry running: {b}kanbn init{b}');
1434
+ return;
1435
+ }
1436
+ &nbsp;
1437
+ // Get the index and make sure it has some columns
1438
+ let index;
1439
+ try {
1440
+ index = await kanbn.getIndex();
1441
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1442
+ <span class="cstat-no" title="statement not covered" > utility.error(error);</span>
1443
+ <span class="cstat-no" title="statement not covered" > return;</span>
1444
+ <span class="cstat-no" title="statement not covered" > }</span>
1445
+ const columnNames = Object.keys(index.columns);
1446
+ if (!columnNames.length) {
1447
+ utility.error('No columns defined in the index\nTry running {b}kanbn init -c "column name"{b}');
1448
+ return;
1449
+ }
1450
+ &nbsp;
1451
+ // Get column name if specified, otherwise default to the first available column
1452
+ let columnName = columnNames[0];
1453
+ if (args.column) {
1454
+ columnName = utility.strArg(args.column);
1455
+ if (columnNames.indexOf(columnName) === -1) {
1456
+ utility.error(`Column "${columnName}" doesn't exist`);
1457
+ return;
1458
+ }
1459
+ }
1460
+ &nbsp;
1461
+ // Add untracked file(s)
1462
+ if (args.untracked) {
1463
+ const untrackedTasks = [];
1464
+ if (Array.isArray(args.untracked)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1465
+ <span class="cstat-no" title="statement not covered" > untrackedTasks.push(...args.untracked);</span>
1466
+ } else if (typeof args.untracked === 'string') {
1467
+ untrackedTasks.push(args.untracked);
1468
+ } else if (args.untracked === true) {
1469
+ try {
1470
+ untrackedTasks.push(...await kanbn.findUntrackedTasks());
1471
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1472
+ <span class="cstat-no" title="statement not covered" > utility.error(error);</span>
1473
+ <span class="cstat-no" title="statement not covered" > return;</span>
1474
+ <span class="cstat-no" title="statement not covered" > }</span>
1475
+ }
1476
+ &nbsp;
1477
+ // Make sure there are some untracked tasks to add
1478
+ if (untrackedTasks.length === 0) {
1479
+ utility.error('No untracked tasks to add');
1480
+ return;
1481
+ }
1482
+ &nbsp;
1483
+ // Add untracked files interactively
1484
+ if (args.interactive) {
1485
+ interactiveAddUntrackedTasks(untrackedTasks, columnName, columnNames)
1486
+ .then(async answers =&gt; {
1487
+ await addUntrackedTasks(answers.untrackedTasks, answers.column);
1488
+ })
1489
+ .catch(error =&gt; {
1490
+ <span class="cstat-no" title="statement not covered" > utility.error(error);</span>
1491
+ });
1492
+ return;
1493
+ } else {
1494
+ await addUntrackedTasks(untrackedTasks, columnName);
1495
+ return;
1496
+ }
1497
+ }
1498
+ &nbsp;
1499
+ // Otherwise, create a task from arguments or interactively
1500
+ const taskData = {
1501
+ metadata: {}
1502
+ };
1503
+ &nbsp;
1504
+ // Get a list of existing task ids
1505
+ const taskIds = [...await kanbn.findTrackedTasks()];
1506
+ &nbsp;
1507
+ // Get task settings from arguments
1508
+ // Name
1509
+ if (args.name) {
1510
+ taskData.name = utility.strArg(args.name);
1511
+ }
1512
+ &nbsp;
1513
+ // Description
1514
+ if (args.description) {
1515
+ taskData.description = utility.strArg(args.description);
1516
+ }
1517
+ &nbsp;
1518
+ // Due date
1519
+ if (args.due) {
1520
+ taskData.metadata.due = chrono.parseDate(utility.strArg(args.due));
1521
+ if (taskData.metadata.due === null) {
1522
+ utility.error('Unable to parse due date');
1523
+ return;
1524
+ }
1525
+ }
1526
+ &nbsp;
1527
+ // Planned start date
1528
+ if (args.plannedStart) {
1529
+ taskData.metadata.plannedStart = chrono.parseDate(utility.strArg(args.plannedStart));
1530
+ if (taskData.metadata.plannedStart === null) {
1531
+ utility.error('Unable to parse plannedStart date');
1532
+ return;
1533
+ }
1534
+ }
1535
+ &nbsp;
1536
+ // Planned finish date
1537
+ if (args.plannedFinish) {
1538
+ taskData.metadata.plannedFinish = chrono.parseDate(utility.strArg(args.plannedFinish));
1539
+ if (taskData.metadata.plannedFinish === null) {
1540
+ utility.error('Unable to parse plannedFinish date');
1541
+ return;
1542
+ }
1543
+ }
1544
+ &nbsp;
1545
+ // Progress
1546
+ if (args.progress) {
1547
+ const progressValue = parseFloat(utility.strArg(args.progress));
1548
+ if (isNaN(progressValue)) {
1549
+ utility.error('Progress value is not a number');
1550
+ return;
1551
+ }
1552
+ taskData.metadata.progress = progressValue;
1553
+ }
1554
+ &nbsp;
1555
+ // Assigned
1556
+ if (args.assigned) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1557
+ <span class="cstat-no" title="statement not covered" > const gitUsername = getGitUsername();</span>
1558
+ <span class="cstat-no" title="statement not covered" > if (args.assigned === true) {</span>
1559
+ <span class="cstat-no" title="statement not covered" > if (gitUsername) {</span>
1560
+ <span class="cstat-no" title="statement not covered" > taskData.metadata.assigned = gitUsername;</span>
1561
+ <span class="cstat-no" title="statement not covered" > }</span>
1562
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1563
+ <span class="cstat-no" title="statement not covered" > taskData.metadata.assigned = utility.strArg(args.assigned);</span>
1564
+ <span class="cstat-no" title="statement not covered" > }</span>
1565
+ <span class="cstat-no" title="statement not covered" > }</span>
1566
+ &nbsp;
1567
+ // Sub-tasks
1568
+ if (args['sub-task']) {
1569
+ const subTasks = utility.arrayArg(args['sub-task']);
1570
+ taskData.subTasks = subTasks.map(subTask =&gt; {
1571
+ const match = subTask.match(/^\[([x ])\] (.*)/);
1572
+ if (match !== null) {
1573
+ return {
1574
+ completed: match[1] === 'x',
1575
+ text: match[2]
1576
+ };
1577
+ }
1578
+ return {
1579
+ completed: false,
1580
+ text: subTask
1581
+ };
1582
+ });
1583
+ }
1584
+ &nbsp;
1585
+ // Tags
1586
+ if (args.tag) {
1587
+ taskData.metadata.tags = utility.arrayArg(args.tag);
1588
+ }
1589
+ &nbsp;
1590
+ // Relations
1591
+ if (args.relation) {
1592
+ const relations = utility.arrayArg(args.relation).map(relation =&gt; {
1593
+ const parts = relation.split(':');
1594
+ return parts.length === 1
1595
+ ? {
1596
+ type: '',
1597
+ task: parts[0].trim()
1598
+ }
1599
+ : {
1600
+ type: parts[0].trim(),
1601
+ task: parts[1].trim()
1602
+ };
1603
+ });
1604
+ &nbsp;
1605
+ // Make sure each relation is an existing task
1606
+ for (let relation of relations) {
1607
+ if (taskIds.indexOf(relation.task) === -1) {
1608
+ utility.error(`Related task ${relation.task} doesn't exist`);
1609
+ return;
1610
+ }
1611
+ }
1612
+ taskData.relations = relations;
1613
+ }
1614
+ &nbsp;
1615
+ // Check metadata field types
1616
+ if ('customFields' in index.options) {
1617
+ for (let arg of Object.keys(args)) {
1618
+ const customField = index.options.customFields.find(p =&gt; p.name === arg);
1619
+ if (customField !== undefined) {
1620
+ &nbsp;
1621
+ // Check value type
1622
+ switch (customField.type) {
1623
+ case 'boolean':
1624
+ if (typeof args[arg] === 'boolean') {
1625
+ taskData.metadata[arg] = args[arg];
1626
+ } else {
1627
+ utility.error(`Custom field "${arg}" value is not a boolean`);
1628
+ return;
1629
+ }
1630
+ break;
1631
+ case 'number':
1632
+ const numberValue = parseFloat(args[arg]);
1633
+ if (!isNaN(numberValue)) {
1634
+ taskData.metadata[arg] = numberValue;
1635
+ } else {
1636
+ utility.error(`Custom field "${arg}" value is not a number`);
1637
+ return;
1638
+ }
1639
+ break;
1640
+ <span class="branch-0 cbranch-no" title="branch not covered" > case 'string':</span>
1641
+ <span class="cstat-no" title="statement not covered" > if (typeof args[arg] === 'string') {</span>
1642
+ <span class="cstat-no" title="statement not covered" > taskData.metadata[arg] = args[arg];</span>
1643
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1644
+ <span class="cstat-no" title="statement not covered" > utility.error(`Custom field "${arg}" value is not a string`);</span>
1645
+ <span class="cstat-no" title="statement not covered" > return;</span>
1646
+ <span class="cstat-no" title="statement not covered" > }</span>
1647
+ <span class="cstat-no" title="statement not covered" > break;</span>
1648
+ case 'date':
1649
+ const dateValue = chrono.parseDate(args[arg]);
1650
+ if (dateValue instanceof Date) {
1651
+ taskData.metadata[arg] = dateValue;
1652
+ } else {
1653
+ utility.error(`Unable to parse date for custom field "${arg}"`);
1654
+ return;
1655
+ }
1656
+ break;
1657
+ <span class="branch-0 cbranch-no" title="branch not covered" > default: break;</span>
1658
+ }
1659
+ }
1660
+ }
1661
+ }
1662
+ &nbsp;
1663
+ // Create task interactively
1664
+ if (args.interactive) {
1665
+ interactiveCreateTask(taskData, taskIds, columnName, columnNames)
1666
+ .then(answers =&gt; {
1667
+ taskData.name = answers.name;
1668
+ if ('description' in answers) {
1669
+ taskData.description = answers.description;
1670
+ }
1671
+ if ('due' in answers) {
1672
+ taskData.metadata.due = answers.due;
1673
+ }
1674
+ if ('plannedStart' in answers) {
1675
+ taskData.metadata.plannedStart = answers.plannedStart;
1676
+ }
1677
+ if ('plannedFinish' in answers) {
1678
+ taskData.metadata.plannedFinish = answers.plannedFinish;
1679
+ }
1680
+ if ('assigned' in answers) {
1681
+ taskData.metadata.assigned = answers.assigned;
1682
+ }
1683
+ if ('subTasks' in answers) {
1684
+ taskData.subTasks = answers.subTasks.map(subTask =&gt; ({
1685
+ text: subTask.text,
1686
+ completed: subTask.completed
1687
+ }));
1688
+ }
1689
+ if ('tags' in answers &amp;&amp; answers.tags.length &gt; 0) {
1690
+ taskData.metadata.tags = answers.tags.map(tag =&gt; tag.name);
1691
+ }
1692
+ if ('relations' in answers) {
1693
+ taskData.relations = answers.relations.map(relation =&gt; ({
1694
+ task: relation.task,
1695
+ type: relation.type
1696
+ }));
1697
+ }
1698
+ columnName = answers.column;
1699
+ createTask(taskData, columnName);
1700
+ })
1701
+ .catch(error =&gt; {
1702
+ utility.error(error);
1703
+ });
1704
+ &nbsp;
1705
+ // Otherwise create task non-interactively
1706
+ } else {
1707
+ createTask(taskData, columnName);
1708
+ }
1709
+ };
1710
+ &nbsp;</pre></td></tr></table></pre>
1711
+
1712
+ <div class='push'></div><!-- for sticky footer -->
1713
+ </div><!-- /wrapper -->
1714
+ <div class='footer quiet pad2 space-top1 center small'>
1715
+ Code coverage generated by
1716
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1717
+ at 2026-08-26T20:46:31.702Z
1718
+ </div>
1719
+ <script src="../../../prettify.js"></script>
1720
+ <script>
1721
+ window.onload = function () {
1722
+ prettyPrint();
1723
+ };
1724
+ </script>
1725
+ <script src="../../../sorter.js"></script>
1726
+ <script src="../../../block-navigation.js"></script>
1727
+ </body>
1728
+ </html>
1729
+