@merchi/sdk 1.40.2 → 1.42.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 (167) hide show
  1. package/dist/entities/cart.js +4 -0
  2. package/dist/entities/cart.test.js +6 -0
  3. package/dist/entities/domain.js +4 -0
  4. package/dist/entities/domain.test.js +10 -0
  5. package/dist/entities/invoice.js +4 -0
  6. package/dist/entities/job.js +4 -0
  7. package/dist/entities/job.test.js +6 -0
  8. package/dist/entity.js +3 -0
  9. package/package.json +1 -1
  10. package/src/entities/cart.test.ts +7 -0
  11. package/src/entities/cart.ts +3 -0
  12. package/src/entities/domain.test.ts +14 -0
  13. package/src/entities/domain.ts +3 -0
  14. package/src/entities/invoice.ts +3 -0
  15. package/src/entities/job.test.ts +7 -0
  16. package/src/entities/job.ts +3 -0
  17. package/src/entity.ts +4 -0
  18. package/.turbo/turbo-test.log +0 -849
  19. package/coverage/clover.xml +0 -5057
  20. package/coverage/coverage-final.json +0 -133
  21. package/coverage/lcov-report/base.css +0 -224
  22. package/coverage/lcov-report/block-navigation.js +0 -87
  23. package/coverage/lcov-report/favicon.png +0 -0
  24. package/coverage/lcov-report/index.html +0 -191
  25. package/coverage/lcov-report/prettify.css +0 -1
  26. package/coverage/lcov-report/prettify.js +0 -2
  27. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  28. package/coverage/lcov-report/sorter.js +0 -210
  29. package/coverage/lcov-report/src/constants/auto_assign_production_on_actions.ts.html +0 -103
  30. package/coverage/lcov-report/src/constants/call_to_actions.ts.html +0 -127
  31. package/coverage/lcov-report/src/constants/discount_types.ts.html +0 -100
  32. package/coverage/lcov-report/src/constants/domain_types.ts.html +0 -121
  33. package/coverage/lcov-report/src/constants/errors.ts.html +0 -181
  34. package/coverage/lcov-report/src/constants/event_types.ts.html +0 -100
  35. package/coverage/lcov-report/src/constants/field_types.ts.html +0 -133
  36. package/coverage/lcov-report/src/constants/index.html +0 -551
  37. package/coverage/lcov-report/src/constants/index.ts.html +0 -238
  38. package/coverage/lcov-report/src/constants/input_types.ts.html +0 -124
  39. package/coverage/lcov-report/src/constants/inventory_statuses.ts.html +0 -103
  40. package/coverage/lcov-report/src/constants/invoice_types.ts.html +0 -100
  41. package/coverage/lcov-report/src/constants/item_types.ts.html +0 -100
  42. package/coverage/lcov-report/src/constants/job/drafting_status.ts.html +0 -106
  43. package/coverage/lcov-report/src/constants/job/index.html +0 -176
  44. package/coverage/lcov-report/src/constants/job/payment_status.ts.html +0 -106
  45. package/coverage/lcov-report/src/constants/job/production_status.ts.html +0 -121
  46. package/coverage/lcov-report/src/constants/job/shipment_status.ts.html +0 -118
  47. package/coverage/lcov-report/src/constants/job/supply_chain_request_status.ts.html +0 -103
  48. package/coverage/lcov-report/src/constants/job_priorities.ts.html +0 -103
  49. package/coverage/lcov-report/src/constants/job_status.ts.html +0 -232
  50. package/coverage/lcov-report/src/constants/job_types.ts.html +0 -133
  51. package/coverage/lcov-report/src/constants/notification_sections.ts.html +0 -124
  52. package/coverage/lcov-report/src/constants/notification_types.ts.html +0 -385
  53. package/coverage/lcov-report/src/constants/notification_urgencies.ts.html +0 -106
  54. package/coverage/lcov-report/src/constants/payment_types.ts.html +0 -115
  55. package/coverage/lcov-report/src/constants/platform.ts.html +0 -103
  56. package/coverage/lcov-report/src/constants/product_types.ts.html +0 -163
  57. package/coverage/lcov-report/src/constants/rights.ts.html +0 -100
  58. package/coverage/lcov-report/src/constants/robots_meta_directives.ts.html +0 -118
  59. package/coverage/lcov-report/src/constants/roles.ts.html +0 -223
  60. package/coverage/lcov-report/src/constants/shipment_companies.ts.html +0 -142
  61. package/coverage/lcov-report/src/constants/shipment_services.ts.html +0 -94
  62. package/coverage/lcov-report/src/constants/system_roles.ts.html +0 -94
  63. package/coverage/lcov-report/src/constants/theme_status.ts.html +0 -100
  64. package/coverage/lcov-report/src/constants/user_types.ts.html +0 -136
  65. package/coverage/lcov-report/src/constants/white_label_accessibilities.ts.html +0 -103
  66. package/coverage/lcov-report/src/cookie.ts.html +0 -133
  67. package/coverage/lcov-report/src/entities/address.ts.html +0 -280
  68. package/coverage/lcov-report/src/entities/agent_conversation.ts.html +0 -202
  69. package/coverage/lcov-report/src/entities/agent_skill.ts.html +0 -382
  70. package/coverage/lcov-report/src/entities/agent_skill_approval.ts.html +0 -163
  71. package/coverage/lcov-report/src/entities/agent_skill_version.ts.html +0 -277
  72. package/coverage/lcov-report/src/entities/agent_token_usage.ts.html +0 -349
  73. package/coverage/lcov-report/src/entities/assignment.ts.html +0 -382
  74. package/coverage/lcov-report/src/entities/automatic_payment_relationship.ts.html +0 -172
  75. package/coverage/lcov-report/src/entities/bank.ts.html +0 -220
  76. package/coverage/lcov-report/src/entities/cart.ts.html +0 -391
  77. package/coverage/lcov-report/src/entities/cart_item.ts.html +0 -340
  78. package/coverage/lcov-report/src/entities/cart_shipment_group.ts.html +0 -148
  79. package/coverage/lcov-report/src/entities/cart_shipment_quote.ts.html +0 -184
  80. package/coverage/lcov-report/src/entities/category.ts.html +0 -262
  81. package/coverage/lcov-report/src/entities/company.ts.html +0 -1276
  82. package/coverage/lcov-report/src/entities/company_invitation.ts.html +0 -184
  83. package/coverage/lcov-report/src/entities/country_tax.ts.html +0 -223
  84. package/coverage/lcov-report/src/entities/discount.ts.html +0 -235
  85. package/coverage/lcov-report/src/entities/discount_group.ts.html +0 -214
  86. package/coverage/lcov-report/src/entities/domain.ts.html +0 -3349
  87. package/coverage/lcov-report/src/entities/domain_chat_settings.ts.html +0 -331
  88. package/coverage/lcov-report/src/entities/domain_invitation.ts.html +0 -193
  89. package/coverage/lcov-report/src/entities/domain_tag.ts.html +0 -211
  90. package/coverage/lcov-report/src/entities/draft.ts.html +0 -322
  91. package/coverage/lcov-report/src/entities/draft_comment.ts.html +0 -274
  92. package/coverage/lcov-report/src/entities/draft_preview.ts.html +0 -196
  93. package/coverage/lcov-report/src/entities/draft_preview_layer.ts.html +0 -148
  94. package/coverage/lcov-report/src/entities/draft_template.ts.html +0 -328
  95. package/coverage/lcov-report/src/entities/email_address.ts.html +0 -157
  96. package/coverage/lcov-report/src/entities/email_counter.ts.html +0 -145
  97. package/coverage/lcov-report/src/entities/enrolled_domain.ts.html +0 -205
  98. package/coverage/lcov-report/src/entities/exchange_rate.ts.html +0 -151
  99. package/coverage/lcov-report/src/entities/file.ts.html +0 -580
  100. package/coverage/lcov-report/src/entities/index.html +0 -1271
  101. package/coverage/lcov-report/src/entities/internal_tag.ts.html +0 -238
  102. package/coverage/lcov-report/src/entities/inventory.ts.html +0 -274
  103. package/coverage/lcov-report/src/entities/inventory_group.ts.html +0 -193
  104. package/coverage/lcov-report/src/entities/inventory_unit_variation.ts.html +0 -172
  105. package/coverage/lcov-report/src/entities/invoice.ts.html +0 -661
  106. package/coverage/lcov-report/src/entities/item.ts.html +0 -262
  107. package/coverage/lcov-report/src/entities/job.ts.html +0 -1288
  108. package/coverage/lcov-report/src/entities/job_comment.ts.html +0 -244
  109. package/coverage/lcov-report/src/entities/job_note.ts.html +0 -205
  110. package/coverage/lcov-report/src/entities/job_operation_log.ts.html +0 -208
  111. package/coverage/lcov-report/src/entities/matching_inventory.ts.html +0 -172
  112. package/coverage/lcov-report/src/entities/notification.ts.html +0 -403
  113. package/coverage/lcov-report/src/entities/payment.ts.html +0 -316
  114. package/coverage/lcov-report/src/entities/payment_device.ts.html +0 -175
  115. package/coverage/lcov-report/src/entities/phone_number.ts.html +0 -193
  116. package/coverage/lcov-report/src/entities/product.ts.html +0 -1543
  117. package/coverage/lcov-report/src/entities/product_form.ts.html +0 -238
  118. package/coverage/lcov-report/src/entities/product_form_version.ts.html +0 -238
  119. package/coverage/lcov-report/src/entities/product_review.ts.html +0 -748
  120. package/coverage/lcov-report/src/entities/production_comment.ts.html +0 -244
  121. package/coverage/lcov-report/src/entities/quote.ts.html +0 -505
  122. package/coverage/lcov-report/src/entities/quote_item.ts.html +0 -298
  123. package/coverage/lcov-report/src/entities/reminder.ts.html +0 -307
  124. package/coverage/lcov-report/src/entities/session.ts.html +0 -169
  125. package/coverage/lcov-report/src/entities/shipment.ts.html +0 -673
  126. package/coverage/lcov-report/src/entities/shipment_item.ts.html +0 -130
  127. package/coverage/lcov-report/src/entities/shipment_item_fulfillment.ts.html +0 -130
  128. package/coverage/lcov-report/src/entities/shipment_log.ts.html +0 -196
  129. package/coverage/lcov-report/src/entities/shipment_method.ts.html +0 -268
  130. package/coverage/lcov-report/src/entities/shipment_method_variation.ts.html +0 -202
  131. package/coverage/lcov-report/src/entities/short_url.ts.html +0 -193
  132. package/coverage/lcov-report/src/entities/subscription_plan.ts.html +0 -304
  133. package/coverage/lcov-report/src/entities/supply_domain.ts.html +0 -166
  134. package/coverage/lcov-report/src/entities/support_conversation.ts.html +0 -280
  135. package/coverage/lcov-report/src/entities/support_message.ts.html +0 -175
  136. package/coverage/lcov-report/src/entities/system_role.ts.html +0 -136
  137. package/coverage/lcov-report/src/entities/theme.ts.html +0 -331
  138. package/coverage/lcov-report/src/entities/theme_css_setting.ts.html +0 -154
  139. package/coverage/lcov-report/src/entities/user.ts.html +0 -1369
  140. package/coverage/lcov-report/src/entities/user_company.ts.html +0 -166
  141. package/coverage/lcov-report/src/entities/variation.ts.html +0 -277
  142. package/coverage/lcov-report/src/entities/variation_field.ts.html +0 -889
  143. package/coverage/lcov-report/src/entities/variation_fields_option.ts.html +0 -406
  144. package/coverage/lcov-report/src/entities/variation_option.ts.html +0 -259
  145. package/coverage/lcov-report/src/entities/variations_group.ts.html +0 -208
  146. package/coverage/lcov-report/src/entity.ts.html +0 -3379
  147. package/coverage/lcov-report/src/index.html +0 -221
  148. package/coverage/lcov-report/src/index.ts.html +0 -652
  149. package/coverage/lcov-report/src/merchi.ts.html +0 -1420
  150. package/coverage/lcov-report/src/pricing/discount.ts.html +0 -136
  151. package/coverage/lcov-report/src/pricing/estimate.ts.html +0 -1015
  152. package/coverage/lcov-report/src/pricing/index.html +0 -206
  153. package/coverage/lcov-report/src/pricing/index.ts.html +0 -106
  154. package/coverage/lcov-report/src/pricing/inventory.ts.html +0 -352
  155. package/coverage/lcov-report/src/pricing/matrix.ts.html +0 -736
  156. package/coverage/lcov-report/src/pricing/round.ts.html +0 -166
  157. package/coverage/lcov-report/src/pricing/visibility.ts.html +0 -418
  158. package/coverage/lcov-report/src/request.ts.html +0 -673
  159. package/coverage/lcov-report/src/test_util.ts.html +0 -139
  160. package/coverage/lcov-report/src/toasts.ts.html +0 -187
  161. package/coverage/lcov-report/src/util/float.ts.html +0 -121
  162. package/coverage/lcov-report/src/util/index.html +0 -161
  163. package/coverage/lcov-report/src/util/index.ts.html +0 -106
  164. package/coverage/lcov-report/src/util/query_string.ts.html +0 -124
  165. package/coverage/lcov-report/src/util/validation.ts.html +0 -91
  166. package/coverage/lcov-report/src/uuid.ts.html +0 -109
  167. package/coverage/lcov.info +0 -7758
@@ -1,1015 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/pricing/estimate.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/pricing</a> estimate.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">98.36% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>180/183</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">88.07% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>96/109</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>23/23</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>136/136</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-neutral">&nbsp;</span>
379
- <span class="cline-any cline-neutral">&nbsp;</span>
380
- <span class="cline-any cline-yes">4x</span>
381
- <span class="cline-any cline-yes">4x</span>
382
- <span class="cline-any cline-yes">4x</span>
383
- <span class="cline-any cline-yes">4x</span>
384
- <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-neutral">&nbsp;</span>
386
- <span class="cline-any cline-neutral">&nbsp;</span>
387
- <span class="cline-any cline-neutral">&nbsp;</span>
388
- <span class="cline-any cline-yes">103x</span>
389
- <span class="cline-any cline-yes">103x</span>
390
- <span class="cline-any cline-neutral">&nbsp;</span>
391
- <span class="cline-any cline-neutral">&nbsp;</span>
392
- <span class="cline-any cline-neutral">&nbsp;</span>
393
- <span class="cline-any cline-neutral">&nbsp;</span>
394
- <span class="cline-any cline-neutral">&nbsp;</span>
395
- <span class="cline-any cline-yes">8x</span>
396
- <span class="cline-any cline-yes">14x</span>
397
- <span class="cline-any cline-yes">7x</span>
398
- <span class="cline-any cline-yes">7x</span>
399
- <span class="cline-any cline-yes">7x</span>
400
- <span class="cline-any cline-yes">7x</span>
401
- <span class="cline-any cline-yes">7x</span>
402
- <span class="cline-any cline-yes">7x</span>
403
- <span class="cline-any cline-neutral">&nbsp;</span>
404
- <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-neutral">&nbsp;</span>
406
- <span class="cline-any cline-yes">83x</span>
407
- <span class="cline-any cline-yes">83x</span>
408
- <span class="cline-any cline-yes">83x</span>
409
- <span class="cline-any cline-yes">1x</span>
410
- <span class="cline-any cline-neutral">&nbsp;</span>
411
- <span class="cline-any cline-yes">83x</span>
412
- <span class="cline-any cline-neutral">&nbsp;</span>
413
- <span class="cline-any cline-neutral">&nbsp;</span>
414
- <span class="cline-any cline-neutral">&nbsp;</span>
415
- <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-neutral">&nbsp;</span>
418
- <span class="cline-any cline-yes">42x</span>
419
- <span class="cline-any cline-yes">42x</span>
420
- <span class="cline-any cline-yes">14x</span>
421
- <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-yes">42x</span>
423
- <span class="cline-any cline-neutral">&nbsp;</span>
424
- <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-neutral">&nbsp;</span>
426
- <span class="cline-any cline-neutral">&nbsp;</span>
427
- <span class="cline-any cline-neutral">&nbsp;</span>
428
- <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-yes">42x</span>
430
- <span class="cline-any cline-yes">42x</span>
431
- <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-yes">42x</span>
433
- <span class="cline-any cline-yes">15x</span>
434
- <span class="cline-any cline-yes">2x</span>
435
- <span class="cline-any cline-neutral">&nbsp;</span>
436
- <span class="cline-any cline-yes">14x</span>
437
- <span class="cline-any cline-yes">14x</span>
438
- <span class="cline-any cline-yes">14x</span>
439
- <span class="cline-any cline-neutral">&nbsp;</span>
440
- <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-yes">27x</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-yes">43x</span>
444
- <span class="cline-any cline-neutral">&nbsp;</span>
445
- <span class="cline-any cline-neutral">&nbsp;</span>
446
- <span class="cline-any cline-neutral">&nbsp;</span>
447
- <span class="cline-any cline-yes">45x</span>
448
- <span class="cline-any cline-yes">32x</span>
449
- <span class="cline-any cline-yes">21x</span>
450
- <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-neutral">&nbsp;</span>
452
- <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-yes">11x</span>
454
- <span class="cline-any cline-neutral">&nbsp;</span>
455
- <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-neutral">&nbsp;</span>
458
- <span class="cline-any cline-neutral">&nbsp;</span>
459
- <span class="cline-any cline-neutral">&nbsp;</span>
460
- <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-neutral">&nbsp;</span>
462
- <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-neutral">&nbsp;</span>
464
- <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-yes">8x</span>
467
- <span class="cline-any cline-yes">8x</span>
468
- <span class="cline-any cline-yes">8x</span>
469
- <span class="cline-any cline-yes">1x</span>
470
- <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-yes">7x</span>
472
- <span class="cline-any cline-yes">7x</span>
473
- <span class="cline-any cline-neutral">&nbsp;</span>
474
- <span class="cline-any cline-neutral">&nbsp;</span>
475
- <span class="cline-any cline-neutral">&nbsp;</span>
476
- <span class="cline-any cline-neutral">&nbsp;</span>
477
- <span class="cline-any cline-neutral">&nbsp;</span>
478
- <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-yes">7x</span>
480
- <span class="cline-any cline-neutral">&nbsp;</span>
481
- <span class="cline-any cline-neutral">&nbsp;</span>
482
- <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-neutral">&nbsp;</span>
485
- <span class="cline-any cline-neutral">&nbsp;</span>
486
- <span class="cline-any cline-yes">7x</span>
487
- <span class="cline-any cline-neutral">&nbsp;</span>
488
- <span class="cline-any cline-neutral">&nbsp;</span>
489
- <span class="cline-any cline-neutral">&nbsp;</span>
490
- <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-neutral">&nbsp;</span>
492
- <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-yes">7x</span>
495
- <span class="cline-any cline-neutral">&nbsp;</span>
496
- <span class="cline-any cline-neutral">&nbsp;</span>
497
- <span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-neutral">&nbsp;</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-neutral">&nbsp;</span>
502
- <span class="cline-any cline-yes">7x</span>
503
- <span class="cline-any cline-neutral">&nbsp;</span>
504
- <span class="cline-any cline-yes">7x</span>
505
- <span class="cline-any cline-neutral">&nbsp;</span>
506
- <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-neutral">&nbsp;</span>
508
- <span class="cline-any cline-neutral">&nbsp;</span>
509
- <span class="cline-any cline-yes">7x</span>
510
- <span class="cline-any cline-yes">7x</span>
511
- <span class="cline-any cline-yes">7x</span>
512
- <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-yes">7x</span>
514
- <span class="cline-any cline-yes">7x</span>
515
- <span class="cline-any cline-yes">7x</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-yes">7x</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-neutral">&nbsp;</span>
520
- <span class="cline-any cline-neutral">&nbsp;</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-neutral">&nbsp;</span>
525
- <span class="cline-any cline-yes">53x</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-yes">53x</span>
528
- <span class="cline-any cline-yes">8x</span>
529
- <span class="cline-any cline-neutral">&nbsp;</span>
530
- <span class="cline-any cline-yes">45x</span>
531
- <span class="cline-any cline-yes">17x</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-yes">29x</span>
534
- <span class="cline-any cline-yes">28x</span>
535
- <span class="cline-any cline-yes">19x</span>
536
- <span class="cline-any cline-yes">19x</span>
537
- <span class="cline-any cline-yes">19x</span>
538
- <span class="cline-any cline-yes">26x</span>
539
- <span class="cline-any cline-yes">26x</span>
540
- <span class="cline-any cline-yes">26x</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-yes">20x</span>
543
- <span class="cline-any cline-yes">20x</span>
544
- <span class="cline-any cline-yes">20x</span>
545
- <span class="cline-any cline-yes">19x</span>
546
- <span class="cline-any cline-yes">19x</span>
547
- <span class="cline-any cline-yes">20x</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-yes">19x</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-yes">9x</span>
552
- <span class="cline-any cline-neutral">&nbsp;</span>
553
- <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-neutral">&nbsp;</span>
557
- <span class="cline-any cline-yes">4x</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-yes">83x</span>
562
- <span class="cline-any cline-yes">1x</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-yes">82x</span>
566
- <span class="cline-any cline-yes">82x</span>
567
- <span class="cline-any cline-neutral">&nbsp;</span>
568
- <span class="cline-any cline-neutral">&nbsp;</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-neutral">&nbsp;</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-yes">82x</span>
577
- <span class="cline-any cline-yes">82x</span>
578
- <span class="cline-any cline-yes">49x</span>
579
- <span class="cline-any cline-yes">49x</span>
580
- <span class="cline-any cline-yes">28x</span>
581
- <span class="cline-any cline-yes">28x</span>
582
- <span class="cline-any cline-yes">28x</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-yes">28x</span>
585
- <span class="cline-any cline-yes">49x</span>
586
- <span class="cline-any cline-yes">49x</span>
587
- <span class="cline-any cline-yes">49x</span>
588
- <span class="cline-any cline-yes">49x</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-yes">49x</span>
593
- <span class="cline-any cline-yes">13x</span>
594
- <span class="cline-any cline-yes">13x</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-yes">36x</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-yes">36x</span>
605
- <span class="cline-any cline-yes">36x</span>
606
- <span class="cline-any cline-yes">20x</span>
607
- <span class="cline-any cline-yes">18x</span>
608
- <span class="cline-any cline-yes">18x</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-yes">36x</span>
611
- <span class="cline-any cline-yes">36x</span>
612
- <span class="cline-any cline-yes">36x</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-yes">28x</span>
616
- <span class="cline-any cline-yes">48x</span>
617
- <span class="cline-any cline-neutral">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-neutral">&nbsp;</span>
620
- <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-yes">28x</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-yes">28x</span>
627
- <span class="cline-any cline-yes">3x</span>
628
- <span class="cline-any cline-yes">2x</span>
629
- <span class="cline-any cline-yes">4x</span>
630
- <span class="cline-any cline-yes">2x</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-yes">54x</span>
634
- <span class="cline-any cline-yes">54x</span>
635
- <span class="cline-any cline-yes">54x</span>
636
- <span class="cline-any cline-yes">54x</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-yes">54x</span>
640
- <span class="cline-any cline-yes">54x</span>
641
- <span class="cline-any cline-yes">35x</span>
642
- <span class="cline-any cline-yes">33x</span>
643
- <span class="cline-any cline-yes">33x</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-yes">82x</span>
651
- <span class="cline-any cline-yes">82x</span>
652
- <span class="cline-any cline-yes">5x</span>
653
- <span class="cline-any cline-yes">1x</span>
654
- <span class="cline-any cline-yes">3x</span>
655
- <span class="cline-any cline-yes">2x</span>
656
- <span class="cline-any cline-yes">2x</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-yes">4x</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-neutral">&nbsp;</span>
664
- <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-yes">82x</span>
669
- <span class="cline-any cline-yes">82x</span>
670
- <span class="cline-any cline-yes">82x</span>
671
- <span class="cline-any cline-yes">82x</span>
672
- <span class="cline-any cline-yes">82x</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-yes">49x</span>
683
- <span class="cline-any cline-neutral">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
687
- PricingRules, PricingField, PricingOption, Selections, FieldSelection,
688
- QuoteResult, UnsupportedResult, DiscountGroup,
689
- } from './types.js';
690
- import { applyDiscount } from './discount.js';
691
- import { roundHalfEven } from './round.js';
692
- import { resolveVisibleFields } from './visibility.js';
693
- import { FieldType } from '../constants/field_types.js';
694
- &nbsp;
695
- /** Form inputs often supply quantities as strings. Coerce before any arithmetic
696
- * so `reduce((a,b)=&gt;a+b)` cannot concatenate ("100"+"1" → "01001" → 1001). */
697
- function toQuantity(value: unknown): number {
698
- const n = Number(value);
699
- return Number.isFinite(n) ? n : 0;
700
- }
701
- &nbsp;
702
- function parseAreaMm(
703
- value: string | number | null | undefined
704
- ): { heightMm: number; widthMm: number } | null {
705
- if (value === undefined || value === null || value === '') return null;
706
- const parts = String(value).split(',').map((p) =&gt; p.trim());
707
- <span class="missing-if-branch" title="if path not taken" >I</span>if (parts.length !== 2) <span class="cstat-no" title="statement not covered" >return null;</span>
708
- const heightMm = Number(parts[0]);
709
- const widthMm = Number(parts[1]);
710
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!Number.isFinite(heightMm) || !Number.isFinite(widthMm)) <span class="cstat-no" title="statement not covered" >return null;</span>
711
- <span class="missing-if-branch" title="if path not taken" >I</span>if (heightMm &lt;= 0 || widthMm &lt;= 0) <span class="cstat-no" title="statement not covered" >return null;</span>
712
- return { heightMm, widthMm };
713
- }
714
- &nbsp;
715
- function unitPriceAt(rules: PricingRules, qty: number): number {
716
- let unitPrice = applyDiscount(rules.product.unitPrice, qty, rules.product.discountGroup);
717
- const mop = rules.product.minimumPrice;
718
- if (qty &gt; 0 &amp;&amp; mop &amp;&amp; unitPrice * qty &lt; mop) {
719
- unitPrice = mop / qty;
720
- }
721
- return unitPrice;
722
- }
723
- &nbsp;
724
- function variationSetupCost(
725
- source: { variationCost: number; variationCostDiscountGroup: DiscountGroup | null },
726
- totalQty: number
727
- ): number {
728
- let cost = source.variationCost;
729
- if (source.variationCostDiscountGroup) {
730
- cost = applyDiscount(cost, totalQty, source.variationCostDiscountGroup);
731
- }
732
- return roundHalfEven(cost, 3);
733
- }
734
- &nbsp;
735
- function variationUnitCosts(
736
- source: { variationUnitCost: number; variationUnitCostDiscountGroup: DiscountGroup | null },
737
- groupQuantities: number[]
738
- ): number[] {
739
- const uc = source.variationUnitCost;
740
- const group = source.variationUnitCostDiscountGroup;
741
- let list: number[];
742
- if (group) {
743
- if (group.groupRestricted) {
744
- list = groupQuantities.map((q) =&gt; applyDiscount(uc, q, group));
745
- } else {
746
- const total = groupQuantities.reduce((a, b) =&gt; a + b, 0);
747
- const discounted = applyDiscount(uc, total, group);
748
- list = groupQuantities.map(() =&gt; discounted);
749
- }
750
- } else {
751
- list = groupQuantities.map(() =&gt; uc);
752
- }
753
- return list.map((c) =&gt; roundHalfEven(c, 3));
754
- }
755
- &nbsp;
756
- function isEmpty(field: PricingField, sel: FieldSelection | undefined): boolean {
757
- if (!sel) return true;
758
- if (field.isSelectable) {
759
- return !sel.selectedOptionIds || sel.selectedOptionIds.length === 0;
760
- }
761
- // Server `is_empty` non-selectable branch is `return not self.value`, so
762
- // numeric 0 is empty (but string '0' stays non-empty, since `not '0'` is False).
763
- return (
764
- sel.value === undefined ||
765
- sel.value === null ||
766
- sel.value === '' ||
767
- sel.value === 0
768
- );
769
- }
770
- &nbsp;
771
- function areaCostFactor(
772
- field: PricingField,
773
- sel: FieldSelection | undefined,
774
- groupQuantities: number[]
775
- ): { setup: number; unitList: number[] } {
776
- const n = groupQuantities.length;
777
- const parsed = parseAreaMm(sel<span class="branch-0 cbranch-no" title="branch not covered" >?.v</span>alue ?? <span class="branch-1 cbranch-no" title="branch not covered" >null)</span>;
778
- if (!parsed) {
779
- return { setup: 0, unitList: new Array(n).fill(0) };
780
- }
781
- const totalQty = groupQuantities.reduce((a, b) =&gt; a + b, 0);
782
- const heightSetup = variationSetupCost(
783
- {
784
- variationCost: field.heightVariationCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
785
- variationCostDiscountGroup: field.heightVariationCostDiscountGroup ?? null,
786
- },
787
- totalQty
788
- );
789
- const widthSetup = variationSetupCost(
790
- {
791
- variationCost: field.widthVariationCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
792
- variationCostDiscountGroup: field.widthVariationCostDiscountGroup ?? null,
793
- },
794
- totalQty
795
- );
796
- const heightUcs = variationUnitCosts(
797
- {
798
- variationUnitCost: field.heightVariationUnitCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
799
- variationUnitCostDiscountGroup:
800
- field.heightVariationUnitCostDiscountGroup ?? null,
801
- },
802
- groupQuantities
803
- );
804
- const widthUcs = variationUnitCosts(
805
- {
806
- variationUnitCost: field.widthVariationUnitCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
807
- variationUnitCostDiscountGroup:
808
- field.widthVariationUnitCostDiscountGroup ?? null,
809
- },
810
- groupQuantities
811
- );
812
- const areaUnit = (field.areaUnit || 'mm').toLowerCase();
813
- const mmPerUnit =
814
- areaUnit === 'm' ? <span class="branch-0 cbranch-no" title="branch not covered" >1000</span>
815
- : areaUnit === 'cm' ? <span class="branch-0 cbranch-no" title="branch not covered" >10</span>
816
- : areaUnit === 'in' || areaUnit === 'inch' || areaUnit === 'inches' ? <span class="branch-0 cbranch-no" title="branch not covered" >25.4</span>
817
- : areaUnit === 'ft' || areaUnit === 'foot' || areaUnit === 'feet' ? <span class="branch-0 cbranch-no" title="branch not covered" >304.8</span>
818
- : 1;
819
- const heightU = parsed.heightMm / mmPerUnit;
820
- const widthU = parsed.widthMm / mmPerUnit;
821
- const area = heightU * widthU;
822
- // onceOff/unit = rateH × rateW × height_u × width_u (in field areaUnit)
823
- const setup = roundHalfEven(heightSetup * widthSetup * area, 3);
824
- const unitList = heightUcs.map((hu, i) =&gt;
825
- roundHalfEven(hu * widthUcs[i] * area, 3)
826
- );
827
- return { setup, unitList };
828
- }
829
- &nbsp;
830
- function costFactor(
831
- field: PricingField,
832
- sel: FieldSelection | undefined,
833
- groupQuantities: number[]
834
- ): { setup: number; unitList: number[] } {
835
- const n = groupQuantities.length;
836
- // Coerce: JSON/APIs occasionally deliver fieldType as a string.
837
- if (Number(field.fieldType) === FieldType.AREA) {
838
- return areaCostFactor(field, sel, groupQuantities);
839
- }
840
- if (isEmpty(field, sel)) {
841
- return { setup: 0, unitList: new Array(n).fill(0) };
842
- }
843
- const totalQty = groupQuantities.reduce((a, b) =&gt; a + b, 0);
844
- if (field.isSelectable) {
845
- let setup = 0;
846
- const unitList = new Array(n).fill(0);
847
- const optById = new Map&lt;number, PricingOption&gt;();
848
- for (const o of field.options) {
849
- optById.set(o.id, o);
850
- if (o.originalId != null) optById.set(o.originalId, o);
851
- }
852
- for (const optId of sel!.selectedOptionIds!) {
853
- const opt = optById.get(optId);
854
- if (!opt) continue;
855
- setup += variationSetupCost(opt, totalQty);
856
- const ucs = variationUnitCosts(opt, groupQuantities);
857
- for (let i = 0; i &lt; n; i++) unitList[i] += ucs[i];
858
- }
859
- return { setup, unitList };
860
- }
861
- return {
862
- setup: variationSetupCost(field, totalQty),
863
- unitList: variationUnitCosts(field, groupQuantities),
864
- };
865
- }
866
- &nbsp;
867
- export function estimateQuote(
868
- rules: PricingRules,
869
- selections: Selections
870
- ): QuoteResult | UnsupportedResult {
871
- if (rules.unsupported) {
872
- return { unsupported: rules.unsupported };
873
- }
874
- &nbsp;
875
- const groupCosts: number[] = [];
876
- let cost = 0;
877
- let costPerUnit: number;
878
- let groupQuantities: number[];
879
- &nbsp;
880
- // Mirror the server's `update_group_variations_cost_and_job_cost`
881
- // (jobs.py ~3321): the group-vs-single branch keys off whether the *job*
882
- // actually has variation groups (`if self.variations_groups:`), NOT the
883
- // product's `hasGroups` capability. A group-capable product with no groups
884
- // submitted is priced as a single non-group job (the server's `else` branch
885
- // sets `group_quantities = [self.quantity or 0]`).
886
- const groups = selections.groups || [];
887
- if (groups.length &gt; 0) {
888
- groupQuantities = groups.map((g) =&gt; toQuantity(g.quantity));
889
- const totalQty = groupQuantities.reduce((a, b) =&gt; a + b, 0);
890
- const restricted = Boolean(rules.product.discountGroup?.groupRestricted);
891
- const baseUnitPrice = unitPriceAt(rules, totalQty);
892
- const perGroupCpu: number[] = [];
893
- &nbsp;
894
- for (let gi = 0; gi &lt; groups.length; gi++) {
895
- const group = groups[gi];
896
- const gQty = groupQuantities[gi];
897
- const cpu = restricted ? unitPriceAt(rules, gQty) : baseUnitPrice;
898
- perGroupCpu.push(cpu);
899
- // Server `VariationsGroups.update_cost` (variations_groups.py ~238):
900
- // `if not self.quantity: self.group_cost = 0; return` — a zero-qty group
901
- // contributes exactly 0 and adds NO field/variation costs.
902
- if (!gQty) {
903
- groupCosts.push(0);
904
- continue;
905
- }
906
- // A group's field visibility is scoped to that group's own selections
907
- // plus the job-level (independent) selections — NOT other groups'
908
- // (server `VariationsGroups.selected_options` = group.variations +
909
- // job.variations, variations_groups.py ~252).
910
- const groupVisible = resolveVisibleFields(rules, {
911
- fieldValues: selections.fieldValues,
912
- groups: [group],
913
- });
914
- let groupVariationCost = 0;
915
- for (const field of rules.groupFields) {
916
- if (!groupVisible.has(field.id)) continue;
917
- const { setup, unitList } = costFactor(field, group.fieldValues[field.id], [gQty]);
918
- groupVariationCost += setup + unitList[0] * gQty;
919
- }
920
- const groupCost = gQty * cpu + groupVariationCost;
921
- groupCosts.push(groupCost);
922
- cost += groupCost;
923
- }
924
- &nbsp;
925
- costPerUnit = totalQty &gt; 0
926
- ? perGroupCpu.reduce((acc, cpu, i) =&gt; acc + cpu * groupQuantities[i], 0) / totalQty
927
- : baseUnitPrice;
928
- &nbsp;
929
- // Independent (job-level) field visibility is scoped to independent
930
- // selections only (server `Jobs.selected_options` = job.variations,
931
- // jobs.py ~1392), so other groups' selections never reveal them.
932
- const independentVisible = resolveVisibleFields(rules, {
933
- quantity: selections.quantity,
934
- fieldValues: selections.fieldValues,
935
- });
936
- for (const field of rules.fields) {
937
- if (!independentVisible.has(field.id)) continue;
938
- const { setup, unitList } = costFactor(field, selections.fieldValues[field.id], groupQuantities);
939
- const unitTotal = unitList.reduce((acc, uc, i) =&gt; acc + uc * groupQuantities[i], 0);
940
- cost += setup + unitTotal;
941
- }
942
- } else {
943
- const qty = toQuantity(selections.quantity);
944
- groupQuantities = [qty];
945
- costPerUnit = unitPriceAt(rules, qty);
946
- cost = costPerUnit * qty;
947
- // No groups: single-job scope (resolveVisibleFields with no groups uses
948
- // only the top-level selections and considers only independent fields).
949
- const visible = resolveVisibleFields(rules, selections);
950
- for (const field of rules.fields) {
951
- if (!visible.has(field.id)) continue;
952
- const { setup, unitList } = costFactor(field, selections.fieldValues[field.id], groupQuantities);
953
- cost += setup + unitList[0] * qty;
954
- }
955
- }
956
- &nbsp;
957
- // Server `Jobs.apply_product_setup_price`: product setup fee once per job,
958
- // or once per non-empty group when setupPerGroup is true. With no groups the
959
- // job is a single group, so setup is charged once either way.
960
- const setupPrice = rules.product.setupPrice || 0;
961
- if (setupPrice) {
962
- if (groups.length &gt; 0 &amp;&amp; rules.product.setupPerGroup) {
963
- for (let gi = 0; gi &lt; groups.length; gi++) {
964
- if (!groupQuantities[gi]) continue;
965
- groupCosts[gi] += setupPrice;
966
- cost += setupPrice;
967
- }
968
- } else {
969
- cost += setupPrice;
970
- }
971
- }
972
- &nbsp;
973
- // Server `Jobs.update_cost` (jobs.py ~3452-3454) accumulates `self.cost` at
974
- // full precision and computes `self.tax_amount = tax(self.cost, ...)` on the
975
- // UNROUNDED cost (money_protocol.py `tax` does NOT round). `cost` and
976
- // `taxAmount` are then rounded INDEPENDENTLY at serialization to 2dp
977
- // (jobs.py ~2169-2171). So tax must be derived from the unrounded cost.
978
- const unroundedCost = cost;
979
- const roundedCost = roundHalfEven(unroundedCost, 2);
980
- const unroundedTax = (unroundedCost * rules.taxPercent) / 100;
981
- const taxAmount = roundHalfEven(unroundedTax, 2);
982
- return {
983
- costPerUnit: roundHalfEven(costPerUnit, 3),
984
- cost: roundedCost,
985
- taxAmount,
986
- // `totalCost` mirrors `Jobs.all_total_cost` = `self.cost + self.tax_amount`
987
- // (jobs.py ~1724), serialized UNROUNDED at jobs.py ~1899. We round to 3dp to
988
- // strip float noise while matching the server's effective Numeric scale.
989
- totalCost: roundHalfEven(unroundedCost + unroundedTax, 3),
990
- // `result["groupCost"] = self.group_cost` is serialized UNROUNDED
991
- // (variations_groups.py ~154); round to 3dp to match the Numeric scale.
992
- groupCosts: groupCosts.map((c) =&gt; roundHalfEven(c, 3)),
993
- currency: rules.currency,
994
- };
995
- }
996
- &nbsp;</pre></td></tr></table></pre>
997
-
998
- <div class='push'></div><!-- for sticky footer -->
999
- </div><!-- /wrapper -->
1000
- <div class='footer quiet pad2 space-top1 center small'>
1001
- Code coverage generated by
1002
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1003
- at 2026-09-17T00:23:15.194Z
1004
- </div>
1005
- <script src="../../prettify.js"></script>
1006
- <script>
1007
- window.onload = function () {
1008
- prettyPrint();
1009
- };
1010
- </script>
1011
- <script src="../../sorter.js"></script>
1012
- <script src="../../block-navigation.js"></script>
1013
- </body>
1014
- </html>
1015
-