@isentinel/rojo-utils 0.1.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 (115) hide show
  1. package/CLAUDE.md +40 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/clover.xml +388 -0
  5. package/coverage/coverage-final.json +7 -0
  6. package/coverage/favicon.png +0 -0
  7. package/coverage/index.html +191 -0
  8. package/coverage/loader.ts.html +220 -0
  9. package/coverage/mount-collector.ts.html +301 -0
  10. package/coverage/path-mapper.ts.html +220 -0
  11. package/coverage/prettify.css +1 -0
  12. package/coverage/prettify.js +2 -0
  13. package/coverage/rojo-resolver.ts.html +1900 -0
  14. package/coverage/rojo-tree.ts.html +559 -0
  15. package/coverage/sort-arrow-sprite.png +0 -0
  16. package/coverage/sorter.js +210 -0
  17. package/coverage/tree-mapper.ts.html +247 -0
  18. package/dist/index.d.mts +175 -0
  19. package/dist/index.d.mts.map +1 -0
  20. package/dist/index.mjs +551 -0
  21. package/dist/index.mjs.map +1 -0
  22. package/eslint.config.ts +23 -0
  23. package/out-tsc/index.d.ts +10 -0
  24. package/out-tsc/index.d.ts.map +1 -0
  25. package/out-tsc/index.js +6 -0
  26. package/out-tsc/loader.d.ts +3 -0
  27. package/out-tsc/loader.d.ts.map +1 -0
  28. package/out-tsc/loader.js +37 -0
  29. package/out-tsc/mount-collector.d.ts +10 -0
  30. package/out-tsc/mount-collector.d.ts.map +1 -0
  31. package/out-tsc/mount-collector.js +37 -0
  32. package/out-tsc/path-mapper.d.ts +4 -0
  33. package/out-tsc/path-mapper.d.ts.map +1 -0
  34. package/out-tsc/path-mapper.js +34 -0
  35. package/out-tsc/rojo-resolver.d.ts +110 -0
  36. package/out-tsc/rojo-resolver.d.ts.map +1 -0
  37. package/out-tsc/rojo-resolver.js +448 -0
  38. package/out-tsc/rojo-tree.d.ts +15 -0
  39. package/out-tsc/rojo-tree.d.ts.map +1 -0
  40. package/out-tsc/rojo-tree.js +106 -0
  41. package/out-tsc/tree-mapper.d.ts +4 -0
  42. package/out-tsc/tree-mapper.d.ts.map +1 -0
  43. package/out-tsc/tree-mapper.js +34 -0
  44. package/out-tsc/tsconfig.tsbuildinfo +1 -0
  45. package/out-tsc/types.d.ts +26 -0
  46. package/out-tsc/types.d.ts.map +1 -0
  47. package/out-tsc/types.js +1 -0
  48. package/out-tsc/vitest/eslint.config.d.ts +3 -0
  49. package/out-tsc/vitest/eslint.config.d.ts.map +1 -0
  50. package/out-tsc/vitest/eslint.shared.d.ts +13 -0
  51. package/out-tsc/vitest/eslint.shared.d.ts.map +1 -0
  52. package/out-tsc/vitest/libs/rojo-utils/eslint.config.d.ts +3 -0
  53. package/out-tsc/vitest/libs/rojo-utils/eslint.config.d.ts.map +1 -0
  54. package/out-tsc/vitest/libs/rojo-utils/src/loader.spec.d.ts +2 -0
  55. package/out-tsc/vitest/libs/rojo-utils/src/loader.spec.d.ts.map +1 -0
  56. package/out-tsc/vitest/libs/rojo-utils/src/mount-collector.spec.d.ts +2 -0
  57. package/out-tsc/vitest/libs/rojo-utils/src/mount-collector.spec.d.ts.map +1 -0
  58. package/out-tsc/vitest/libs/rojo-utils/src/path-mapper.spec.d.ts +2 -0
  59. package/out-tsc/vitest/libs/rojo-utils/src/path-mapper.spec.d.ts.map +1 -0
  60. package/out-tsc/vitest/libs/rojo-utils/src/rojo-resolver.spec.d.ts +2 -0
  61. package/out-tsc/vitest/libs/rojo-utils/src/rojo-resolver.spec.d.ts.map +1 -0
  62. package/out-tsc/vitest/libs/rojo-utils/src/rojo-tree.spec.d.ts +2 -0
  63. package/out-tsc/vitest/libs/rojo-utils/src/rojo-tree.spec.d.ts.map +1 -0
  64. package/out-tsc/vitest/libs/rojo-utils/src/tree-mapper.spec.d.ts +2 -0
  65. package/out-tsc/vitest/libs/rojo-utils/src/tree-mapper.spec.d.ts.map +1 -0
  66. package/out-tsc/vitest/libs/rojo-utils/test/setup/jest-extended.d.ts +2 -0
  67. package/out-tsc/vitest/libs/rojo-utils/test/setup/jest-extended.d.ts.map +1 -0
  68. package/out-tsc/vitest/libs/rojo-utils/tsconfig.spec.tsbuildinfo +1 -0
  69. package/out-tsc/vitest/libs/rojo-utils/tsdown.config.d.ts +3 -0
  70. package/out-tsc/vitest/libs/rojo-utils/tsdown.config.d.ts.map +1 -0
  71. package/out-tsc/vitest/libs/rojo-utils/vitest.config.d.ts +3 -0
  72. package/out-tsc/vitest/libs/rojo-utils/vitest.config.d.ts.map +1 -0
  73. package/out-tsc/vitest/src/loader.spec.d.ts +2 -0
  74. package/out-tsc/vitest/src/loader.spec.d.ts.map +1 -0
  75. package/out-tsc/vitest/src/mount-collector.spec.d.ts +2 -0
  76. package/out-tsc/vitest/src/mount-collector.spec.d.ts.map +1 -0
  77. package/out-tsc/vitest/src/path-mapper.spec.d.ts +2 -0
  78. package/out-tsc/vitest/src/path-mapper.spec.d.ts.map +1 -0
  79. package/out-tsc/vitest/src/rojo-resolver.spec.d.ts +2 -0
  80. package/out-tsc/vitest/src/rojo-resolver.spec.d.ts.map +1 -0
  81. package/out-tsc/vitest/src/rojo-tree.spec.d.ts +2 -0
  82. package/out-tsc/vitest/src/rojo-tree.spec.d.ts.map +1 -0
  83. package/out-tsc/vitest/src/tree-mapper.spec.d.ts +2 -0
  84. package/out-tsc/vitest/src/tree-mapper.spec.d.ts.map +1 -0
  85. package/out-tsc/vitest/test/setup/jest-extended.d.ts +2 -0
  86. package/out-tsc/vitest/test/setup/jest-extended.d.ts.map +1 -0
  87. package/out-tsc/vitest/tsconfig.spec.tsbuildinfo +1 -0
  88. package/out-tsc/vitest/tsdown.config.d.ts +3 -0
  89. package/out-tsc/vitest/tsdown.config.d.ts.map +1 -0
  90. package/out-tsc/vitest/vitest.config.d.ts +3 -0
  91. package/out-tsc/vitest/vitest.config.d.ts.map +1 -0
  92. package/package.json +48 -0
  93. package/project.json +25 -0
  94. package/src/index.ts +25 -0
  95. package/src/loader.spec.ts +240 -0
  96. package/src/loader.ts +45 -0
  97. package/src/mount-collector.spec.ts +272 -0
  98. package/src/mount-collector.ts +72 -0
  99. package/src/path-mapper.spec.ts +201 -0
  100. package/src/path-mapper.ts +45 -0
  101. package/src/rojo-resolver.spec.ts +956 -0
  102. package/src/rojo-resolver.ts +605 -0
  103. package/src/rojo-tree.spec.ts +622 -0
  104. package/src/rojo-tree.ts +162 -0
  105. package/src/tree-mapper.spec.ts +147 -0
  106. package/src/tree-mapper.ts +54 -0
  107. package/src/types.ts +29 -0
  108. package/test/setup/jest-extended.ts +4 -0
  109. package/test/setup/vitest-jest-extended.d.ts +1 -0
  110. package/tsconfig.json +13 -0
  111. package/tsconfig.lib.json +17 -0
  112. package/tsconfig.lib.tsbuildinfo +1 -0
  113. package/tsconfig.spec.json +26 -0
  114. package/tsdown.config.ts +15 -0
  115. package/vitest.config.ts +20 -0
@@ -0,0 +1,1900 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for rojo-resolver.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> rojo-resolver.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>233/233</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>115/115</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'>35/35</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'>227/227</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">1x</span>
677
+ <span class="cline-any cline-yes">1x</span>
678
+ <span class="cline-any cline-yes">1x</span>
679
+ <span class="cline-any cline-yes">1x</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-yes">1x</span>
682
+ <span class="cline-any cline-yes">1x</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-yes">1x</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-yes">1x</span>
687
+ <span class="cline-any cline-yes">1x</span>
688
+ <span class="cline-any cline-yes">1x</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-yes">1x</span>
715
+ <span class="cline-any cline-yes">1x</span>
716
+ <span class="cline-any cline-yes">1x</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-yes">1x</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-yes">1x</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-yes">1x</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-yes">1x</span>
752
+ <span class="cline-any cline-yes">1x</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-yes">1x</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-yes">1x</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-neutral">&nbsp;</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-yes">19x</span>
784
+ <span class="cline-any cline-yes">19x</span>
785
+ <span class="cline-any cline-yes">19x</span>
786
+ <span class="cline-any cline-yes">18x</span>
787
+ <span class="cline-any cline-yes">18x</span>
788
+ <span class="cline-any cline-yes">17x</span>
789
+ <span class="cline-any cline-yes">17x</span>
790
+ <span class="cline-any cline-yes">1x</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-yes">19x</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-yes">54x</span>
800
+ <span class="cline-any cline-yes">54x</span>
801
+ <span class="cline-any cline-yes">54x</span>
802
+ <span class="cline-any cline-yes">45x</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-yes">9x</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-yes">22x</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-neutral">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-yes">37x</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-yes">37x</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-yes">73x</span>
831
+ <span class="cline-any cline-yes">73x</span>
832
+ <span class="cline-any cline-yes">1x</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-yes">72x</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-yes">1x</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-yes">34x</span>
843
+ <span class="cline-any cline-yes">34x</span>
844
+ <span class="cline-any cline-yes">34x</span>
845
+ <span class="cline-any cline-yes">34x</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-yes">34x</span>
848
+ <span class="cline-any cline-yes">34x</span>
849
+ <span class="cline-any cline-yes">34x</span>
850
+ <span class="cline-any cline-yes">34x</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-yes">34x</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-yes">5x</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-yes">5x</span>
861
+ <span class="cline-any cline-yes">5x</span>
862
+ <span class="cline-any cline-yes">1x</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-yes">4x</span>
866
+ <span class="cline-any cline-yes">4x</span>
867
+ <span class="cline-any cline-yes">5x</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-yes">4x</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-yes">4x</span>
876
+ <span class="cline-any cline-yes">1x</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-yes">4x</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-yes">29x</span>
884
+ <span class="cline-any cline-yes">29x</span>
885
+ <span class="cline-any cline-yes">29x</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-neutral">&nbsp;</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-yes">2x</span>
895
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
+ <span class="cline-any cline-yes">2x</span>
897
+ <span class="cline-any cline-yes">1x</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-yes">2x</span>
901
+ <span class="cline-any cline-yes">2x</span>
902
+ <span class="cline-any cline-yes">1x</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-yes">2x</span>
906
+ <span class="cline-any cline-yes">2x</span>
907
+ <span class="cline-any cline-yes">12x</span>
908
+ <span class="cline-any cline-neutral">&nbsp;</span>
909
+ <span class="cline-any cline-yes">2x</span>
910
+ <span class="cline-any cline-yes">2x</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-yes">2x</span>
913
+ <span class="cline-any cline-yes">1x</span>
914
+ <span class="cline-any cline-neutral">&nbsp;</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-yes">2x</span>
917
+ <span class="cline-any cline-yes">2x</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-yes">2x</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-neutral">&nbsp;</span>
923
+ <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-yes">1x</span>
925
+ <span class="cline-any cline-yes">1x</span>
926
+ <span class="cline-any cline-yes">1x</span>
927
+ <span class="cline-any cline-neutral">&nbsp;</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-yes">6x</span>
931
+ <span class="cline-any cline-yes">6x</span>
932
+ <span class="cline-any cline-yes">6x</span>
933
+ <span class="cline-any cline-yes">2x</span>
934
+ <span class="cline-any cline-yes">1x</span>
935
+ <span class="cline-any cline-neutral">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-yes">1x</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-yes">4x</span>
941
+ <span class="cline-any cline-yes">1x</span>
942
+ <span class="cline-any cline-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-yes">3x</span>
945
+ <span class="cline-any cline-yes">1x</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-neutral">&nbsp;</span>
948
+ <span class="cline-any cline-neutral">&nbsp;</span>
949
+ <span class="cline-any cline-yes">2x</span>
950
+ <span class="cline-any cline-neutral">&nbsp;</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-yes">4x</span>
954
+ <span class="cline-any cline-yes">1x</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-yes">3x</span>
958
+ <span class="cline-any cline-yes">1x</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-yes">2x</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-yes">3x</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-yes">23x</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-yes">23x</span>
972
+ <span class="cline-any cline-yes">23x</span>
973
+ <span class="cline-any cline-yes">3x</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-yes">20x</span>
977
+ <span class="cline-any cline-yes">20x</span>
978
+ <span class="cline-any cline-yes">22x</span>
979
+ <span class="cline-any cline-yes">19x</span>
980
+ <span class="cline-any cline-yes">19x</span>
981
+ <span class="cline-any cline-yes">19x</span>
982
+ <span class="cline-any cline-yes">19x</span>
983
+ <span class="cline-any cline-yes">2x</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-yes">19x</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-yes">1x</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-yes">6x</span>
995
+ <span class="cline-any cline-yes">6x</span>
996
+ <span class="cline-any cline-yes">6x</span>
997
+ <span class="cline-any cline-yes">6x</span>
998
+ <span class="cline-any cline-yes">5x</span>
999
+ <span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-neutral">&nbsp;</span>
1001
+ <span class="cline-any cline-neutral">&nbsp;</span>
1002
+ <span class="cline-any cline-yes">1x</span>
1003
+ <span class="cline-any cline-neutral">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-neutral">&nbsp;</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-yes">4x</span>
1011
+ <span class="cline-any cline-yes">4x</span>
1012
+ <span class="cline-any cline-yes">2x</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-neutral">&nbsp;</span>
1015
+ <span class="cline-any cline-yes">4x</span>
1016
+ <span class="cline-any cline-neutral">&nbsp;</span>
1017
+ <span class="cline-any cline-neutral">&nbsp;</span>
1018
+ <span class="cline-any cline-yes">24x</span>
1019
+ <span class="cline-any cline-neutral">&nbsp;</span>
1020
+ <span class="cline-any cline-yes">5x</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-neutral">&nbsp;</span>
1023
+ <span class="cline-any cline-neutral">&nbsp;</span>
1024
+ <span class="cline-any cline-neutral">&nbsp;</span>
1025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-yes">4x</span>
1030
+ <span class="cline-any cline-neutral">&nbsp;</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-yes">3x</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-yes">4x</span>
1038
+ <span class="cline-any cline-yes">4x</span>
1039
+ <span class="cline-any cline-yes">4x</span>
1040
+ <span class="cline-any cline-yes">8x</span>
1041
+ <span class="cline-any cline-yes">3x</span>
1042
+ <span class="cline-any cline-yes">3x</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-yes">4x</span>
1047
+ <span class="cline-any cline-yes">4x</span>
1048
+ <span class="cline-any cline-yes">2x</span>
1049
+ <span class="cline-any cline-yes">3x</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-yes">4x</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-yes">3x</span>
1056
+ <span class="cline-any cline-neutral">&nbsp;</span>
1057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1058
+ <span class="cline-any cline-yes">4x</span>
1059
+ <span class="cline-any cline-neutral">&nbsp;</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1068
+ <span class="cline-any cline-yes">2x</span>
1069
+ <span class="cline-any cline-yes">2x</span>
1070
+ <span class="cline-any cline-yes">2x</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-neutral">&nbsp;</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-yes">4x</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-yes">3x</span>
1079
+ <span class="cline-any cline-neutral">&nbsp;</span>
1080
+ <span class="cline-any cline-neutral">&nbsp;</span>
1081
+ <span class="cline-any cline-neutral">&nbsp;</span>
1082
+ <span class="cline-any cline-yes">484x</span>
1083
+ <span class="cline-any cline-yes">484x</span>
1084
+ <span class="cline-any cline-yes">417x</span>
1085
+ <span class="cline-any cline-yes">417x</span>
1086
+ <span class="cline-any cline-neutral">&nbsp;</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-yes">483x</span>
1089
+ <span class="cline-any cline-neutral">&nbsp;</span>
1090
+ <span class="cline-any cline-neutral">&nbsp;</span>
1091
+ <span class="cline-any cline-neutral">&nbsp;</span>
1092
+ <span class="cline-any cline-yes">22x</span>
1093
+ <span class="cline-any cline-yes">17x</span>
1094
+ <span class="cline-any cline-yes">54x</span>
1095
+ <span class="cline-any cline-yes">9x</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-yes">13x</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
+ <span class="cline-any cline-yes">38x</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-neutral">&nbsp;</span>
1108
+ <span class="cline-any cline-neutral">&nbsp;</span>
1109
+ <span class="cline-any cline-yes">37x</span>
1110
+ <span class="cline-any cline-yes">37x</span>
1111
+ <span class="cline-any cline-neutral">&nbsp;</span>
1112
+ <span class="cline-any cline-neutral">&nbsp;</span>
1113
+ <span class="cline-any cline-yes">37x</span>
1114
+ <span class="cline-any cline-yes">37x</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-neutral">&nbsp;</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-yes">37x</span>
1122
+ <span class="cline-any cline-yes">35x</span>
1123
+ <span class="cline-any cline-neutral">&nbsp;</span>
1124
+ <span class="cline-any cline-neutral">&nbsp;</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <span class="cline-any cline-neutral">&nbsp;</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-yes">2x</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-neutral">&nbsp;</span>
1133
+ <span class="cline-any cline-neutral">&nbsp;</span>
1134
+ <span class="cline-any cline-yes">44x</span>
1135
+ <span class="cline-any cline-neutral">&nbsp;</span>
1136
+ <span class="cline-any cline-neutral">&nbsp;</span>
1137
+ <span class="cline-any cline-neutral">&nbsp;</span>
1138
+ <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-neutral">&nbsp;</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-neutral">&nbsp;</span>
1142
+ <span class="cline-any cline-yes">44x</span>
1143
+ <span class="cline-any cline-yes">2x</span>
1144
+ <span class="cline-any cline-yes">2x</span>
1145
+ <span class="cline-any cline-neutral">&nbsp;</span>
1146
+ <span class="cline-any cline-neutral">&nbsp;</span>
1147
+ <span class="cline-any cline-yes">42x</span>
1148
+ <span class="cline-any cline-yes">44x</span>
1149
+ <span class="cline-any cline-yes">44x</span>
1150
+ <span class="cline-any cline-yes">4x</span>
1151
+ <span class="cline-any cline-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-yes">38x</span>
1153
+ <span class="cline-any cline-yes">38x</span>
1154
+ <span class="cline-any cline-yes">36x</span>
1155
+ <span class="cline-any cline-neutral">&nbsp;</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
1157
+ <span class="cline-any cline-yes">38x</span>
1158
+ <span class="cline-any cline-yes">2x</span>
1159
+ <span class="cline-any cline-neutral">&nbsp;</span>
1160
+ <span class="cline-any cline-yes">36x</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
+ <span class="cline-any cline-neutral">&nbsp;</span>
1165
+ <span class="cline-any cline-yes">36x</span>
1166
+ <span class="cline-any cline-yes">34x</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-neutral">&nbsp;</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-neutral">&nbsp;</span>
1171
+ <span class="cline-any cline-neutral">&nbsp;</span>
1172
+ <span class="cline-any cline-neutral">&nbsp;</span>
1173
+ <span class="cline-any cline-yes">71x</span>
1174
+ <span class="cline-any cline-yes">38x</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-yes">71x</span>
1178
+ <span class="cline-any cline-yes">44x</span>
1179
+ <span class="cline-any cline-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-neutral">&nbsp;</span>
1181
+ <span class="cline-any cline-neutral">&nbsp;</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-neutral">&nbsp;</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-yes">71x</span>
1187
+ <span class="cline-any cline-yes">27x</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-yes">104x</span>
1191
+ <span class="cline-any cline-yes">71x</span>
1192
+ <span class="cline-any cline-neutral">&nbsp;</span>
1193
+ <span class="cline-any cline-yes">33x</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-yes">71x</span>
1197
+ <span class="cline-any cline-yes">38x</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-neutral">&nbsp;</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-neutral">&nbsp;</span>
1206
+ <span class="cline-any cline-neutral">&nbsp;</span>
1207
+ <span class="cline-any cline-yes">373x</span>
1208
+ <span class="cline-any cline-yes">373x</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-yes">373x</span>
1211
+ <span class="cline-any cline-yes">3885x</span>
1212
+ <span class="cline-any cline-yes">3885x</span>
1213
+ <span class="cline-any cline-yes">3885x</span>
1214
+ <span class="cline-any cline-neutral">&nbsp;</span>
1215
+ <span class="cline-any cline-neutral">&nbsp;</span>
1216
+ <span class="cline-any cline-neutral">&nbsp;</span>
1217
+ <span class="cline-any cline-neutral">&nbsp;</span>
1218
+ <span class="cline-any cline-neutral">&nbsp;</span>
1219
+ <span class="cline-any cline-neutral">&nbsp;</span>
1220
+ <span class="cline-any cline-yes">3885x</span>
1221
+ <span class="cline-any cline-yes">32x</span>
1222
+ <span class="cline-any cline-yes">32x</span>
1223
+ <span class="cline-any cline-yes">32x</span>
1224
+ <span class="cline-any cline-yes">32x</span>
1225
+ <span class="cline-any cline-neutral">&nbsp;</span>
1226
+ <span class="cline-any cline-yes">1x</span>
1227
+ <span class="cline-any cline-neutral">&nbsp;</span>
1228
+ <span class="cline-any cline-neutral">&nbsp;</span>
1229
+ <span class="cline-any cline-yes">1x</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-yes">3884x</span>
1234
+ <span class="cline-any cline-yes">4x</span>
1235
+ <span class="cline-any cline-yes">3880x</span>
1236
+ <span class="cline-any cline-yes">340x</span>
1237
+ <span class="cline-any cline-neutral">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-yes">373x</span>
1241
+ <span class="cline-any cline-yes">4x</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
1244
+ <span class="cline-any cline-yes">373x</span>
1245
+ <span class="cline-any cline-yes">340x</span>
1246
+ <span class="cline-any cline-neutral">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-neutral">&nbsp;</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-yes">374x</span>
1251
+ <span class="cline-any cline-yes">374x</span>
1252
+ <span class="cline-any cline-neutral">&nbsp;</span>
1253
+ <span class="cline-any cline-neutral">&nbsp;</span>
1254
+ <span class="cline-any cline-yes">374x</span>
1255
+ <span class="cline-any cline-neutral">&nbsp;</span>
1256
+ <span class="cline-any cline-yes">3886x</span>
1257
+ <span class="cline-any cline-yes">1x</span>
1258
+ <span class="cline-any cline-yes">1x</span>
1259
+ <span class="cline-any cline-neutral">&nbsp;</span>
1260
+ <span class="cline-any cline-neutral">&nbsp;</span>
1261
+ <span class="cline-any cline-yes">373x</span>
1262
+ <span class="cline-any cline-yes">339x</span>
1263
+ <span class="cline-any cline-neutral">&nbsp;</span>
1264
+ <span class="cline-any cline-neutral">&nbsp;</span>
1265
+ <span class="cline-any cline-yes">373x</span>
1266
+ <span class="cline-any cline-neutral">&nbsp;</span>
1267
+ <span class="cline-any cline-yes">373x</span>
1268
+ <span class="cline-any cline-yes">339x</span>
1269
+ <span class="cline-any cline-neutral">&nbsp;</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-neutral">&nbsp;</span>
1272
+ <span class="cline-any cline-neutral">&nbsp;</span>
1273
+ <span class="cline-any cline-yes">4x</span>
1274
+ <span class="cline-any cline-neutral">&nbsp;</span>
1275
+ <span class="cline-any cline-neutral">&nbsp;</span>
1276
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { type } from "arktype";
1277
+ import type { Dirent } from "node:fs";
1278
+ import * as fs from "node:fs";
1279
+ import path from "node:path";
1280
+ &nbsp;
1281
+ const LUA_EXT = ".lua";
1282
+ const LUAU_EXT = ".luau";
1283
+ const JSON_EXT = ".json";
1284
+ const TOML_EXT = ".toml";
1285
+ &nbsp;
1286
+ const ROJO_MODULE_EXTS = new Set([JSON_EXT, LUAU_EXT, TOML_EXT]);
1287
+ const ROJO_SCRIPT_EXTS = new Set([LUAU_EXT]);
1288
+ &nbsp;
1289
+ const INIT_NAME = "init";
1290
+ &nbsp;
1291
+ const SERVER_SUB_EXTENSION = ".server";
1292
+ const CLIENT_SUB_EXTENSION = ".client";
1293
+ const MODULE_SUB_EXTENSION = "";
1294
+ &nbsp;
1295
+ interface RojoTreeProperty {
1296
+ Type: string;
1297
+ Value: unknown;
1298
+ }
1299
+ &nbsp;
1300
+ interface RojoTreeMetadata {
1301
+ $className?: string;
1302
+ $ignoreUnknownInstances?: boolean;
1303
+ $path?: string | { optional: string };
1304
+ $properties?: Array&lt;RojoTreeProperty&gt;;
1305
+ }
1306
+ &nbsp;
1307
+ type RojoTree = RojoTreeMembers &amp; RojoTreeMetadata;
1308
+ &nbsp;
1309
+ interface RojoTreeMembers {
1310
+ [name: string]: RojoTree;
1311
+ }
1312
+ &nbsp;
1313
+ interface RojoFile {
1314
+ name: string;
1315
+ servePort?: number;
1316
+ tree: RojoTree;
1317
+ }
1318
+ &nbsp;
1319
+ const ROJO_FILE_REGEX = /^.+\.project\.json$/;
1320
+ const ROJO_DEFAULT_NAME = "default.project.json";
1321
+ const ROJO_OLD_NAME = "roblox-project.json";
1322
+ &nbsp;
1323
+ export const RbxType = {
1324
+ LocalScript: 2,
1325
+ ModuleScript: 0,
1326
+ Script: 1,
1327
+ Unknown: 3,
1328
+ } as const;
1329
+ &nbsp;
1330
+ export type RbxType = (typeof RbxType)[keyof typeof RbxType];
1331
+ &nbsp;
1332
+ const SUB_EXT_TYPE_MAP = new Map&lt;string, RbxType&gt;([
1333
+ [CLIENT_SUB_EXTENSION, RbxType.LocalScript],
1334
+ [MODULE_SUB_EXTENSION, RbxType.ModuleScript],
1335
+ [SERVER_SUB_EXTENSION, RbxType.Script],
1336
+ ]);
1337
+ &nbsp;
1338
+ /** Represents a roblox tree path. */
1339
+ export type RbxPath = ReadonlyArray&lt;string&gt;;
1340
+ export type RelativeRbxPath = ReadonlyArray&lt;RbxPathParent | string&gt;;
1341
+ &nbsp;
1342
+ export interface PartitionInfo {
1343
+ fsPath: string;
1344
+ rbxPath: RbxPath;
1345
+ }
1346
+ &nbsp;
1347
+ const DEFAULT_ISOLATED_CONTAINERS: Array&lt;RbxPath&gt; = [
1348
+ ["StarterPack"],
1349
+ ["StarterGui"],
1350
+ ["StarterPlayer", "StarterPlayerScripts"],
1351
+ ["StarterPlayer", "StarterCharacterScripts"],
1352
+ ["StarterPlayer", "StarterCharacter"],
1353
+ ["PluginDebugService"],
1354
+ ];
1355
+ &nbsp;
1356
+ const CLIENT_CONTAINERS: Array&lt;RbxPath&gt; = [["StarterPack"], ["StarterGui"], ["StarterPlayer"]];
1357
+ const SERVER_CONTAINERS: Array&lt;RbxPath&gt; = [["ServerStorage"], ["ServerScriptService"]];
1358
+ &nbsp;
1359
+ export const FileRelation = {
1360
+ InToIn: 3,
1361
+ InToOut: 2,
1362
+ OutToIn: 1,
1363
+ OutToOut: 0,
1364
+ } as const;
1365
+ &nbsp;
1366
+ export type FileRelation = (typeof FileRelation)[keyof typeof FileRelation];
1367
+ &nbsp;
1368
+ export const NetworkType = {
1369
+ Client: 1,
1370
+ Server: 2,
1371
+ Unknown: 0,
1372
+ } as const;
1373
+ &nbsp;
1374
+ export type NetworkType = (typeof NetworkType)[keyof typeof NetworkType];
1375
+ &nbsp;
1376
+ /** Serializable snapshot of a {@link RojoResolver} for disk caching. */
1377
+ export interface RojoResolverState {
1378
+ filePathToRbxPathMap: Array&lt;[string, RbxPath]&gt;;
1379
+ isGame: boolean;
1380
+ isolatedContainers: Array&lt;RbxPath&gt;;
1381
+ partitions: Array&lt;PartitionInfo&gt;;
1382
+ walkedConfigFiles: Array&lt;string&gt;;
1383
+ walkedDirs: Array&lt;string&gt;;
1384
+ warnings: Array&lt;string&gt;;
1385
+ }
1386
+ &nbsp;
1387
+ function stripRojoExtensions(filePath: string): string {
1388
+ let stripped = filePath;
1389
+ const extension = path.extname(stripped);
1390
+ if (ROJO_MODULE_EXTS.has(extension)) {
1391
+ stripped = stripped.slice(0, -extension.length);
1392
+ if (ROJO_SCRIPT_EXTS.has(extension)) {
1393
+ const subExtension = path.extname(stripped);
1394
+ if (subExtension === SERVER_SUB_EXTENSION || subExtension === CLIENT_SUB_EXTENSION) {
1395
+ stripped = stripped.slice(0, -subExtension.length);
1396
+ }
1397
+ }
1398
+ }
1399
+ &nbsp;
1400
+ return stripped;
1401
+ }
1402
+ &nbsp;
1403
+ function arrayStartsWith&lt;T&gt;(a: ReadonlyArray&lt;T&gt;, b: ReadonlyArray&lt;T&gt;): boolean {
1404
+ const minLength = Math.min(a.length, b.length);
1405
+ for (let index = 0; index &lt; minLength; index++) {
1406
+ if (a[index] !== b[index]) {
1407
+ return false;
1408
+ }
1409
+ }
1410
+ &nbsp;
1411
+ return true;
1412
+ }
1413
+ &nbsp;
1414
+ function isPathDescendantOf(filePath: string, directoryPath: string): boolean {
1415
+ return directoryPath === filePath || !path.relative(directoryPath, filePath).startsWith("..");
1416
+ }
1417
+ &nbsp;
1418
+ let rojoFileSchema: type.Any | undefined;
1419
+ &nbsp;
1420
+ function isValidRojoConfig(value: unknown): value is RojoFile {
1421
+ // Built lazily on first use (not at module top level) so consumers can
1422
+ // auto-mock this module without a hoisting TDZ on the arktype import, then
1423
+ // memoized so repeated tree-walk validations don't re-allocate the schema. We
1424
+ // validate only the fields the resolver reads; parseTree handles arbitrary
1425
+ // tree shapes defensively.
1426
+ rojoFileSchema ??= type({
1427
+ "name": "string",
1428
+ "servePort?": "number",
1429
+ "tree": "object",
1430
+ });
1431
+ return !(rojoFileSchema(value) instanceof type.errors);
1432
+ }
1433
+ &nbsp;
1434
+ function convertToLuau(filePath: string): string {
1435
+ const extension = path.extname(filePath);
1436
+ if (extension === LUA_EXT) {
1437
+ return filePath.slice(0, -extension.length) + LUAU_EXT;
1438
+ }
1439
+ &nbsp;
1440
+ return filePath;
1441
+ }
1442
+ &nbsp;
1443
+ export const RbxPathParent: unique symbol = Symbol("Parent");
1444
+ export type RbxPathParent = typeof RbxPathParent;
1445
+ &nbsp;
1446
+ export class RojoResolver {
1447
+ private readonly rbxPath = new Array&lt;string&gt;();
1448
+ private readonly realpathCache = new Map&lt;string, string&gt;();
1449
+ private readonly walkedConfigFilesInternal = new Set&lt;string&gt;();
1450
+ private readonly walkedDirectoriesInternal = new Set&lt;string&gt;();
1451
+ &nbsp;
1452
+ private filePathToRbxPathMap = new Map&lt;string, RbxPath&gt;();
1453
+ private isolatedContainers = [...DEFAULT_ISOLATED_CONTAINERS];
1454
+ private partitions = new Array&lt;PartitionInfo&gt;();
1455
+ private warnings = new Array&lt;string&gt;();
1456
+ &nbsp;
1457
+ public isGame = false;
1458
+ &nbsp;
1459
+ public static findRojoConfigFilePath(projectPath: string): {
1460
+ path: string | undefined;
1461
+ warnings: Array&lt;string&gt;;
1462
+ } {
1463
+ const warnings = new Array&lt;string&gt;();
1464
+ &nbsp;
1465
+ const defaultPath = path.join(projectPath, ROJO_DEFAULT_NAME);
1466
+ if (fs.existsSync(defaultPath)) {
1467
+ return { path: defaultPath, warnings };
1468
+ }
1469
+ &nbsp;
1470
+ const candidates = new Array&lt;string | undefined&gt;();
1471
+ for (const fileName of fs.readdirSync(projectPath)) {
1472
+ if (
1473
+ fileName !== ROJO_DEFAULT_NAME &amp;&amp;
1474
+ (fileName === ROJO_OLD_NAME || ROJO_FILE_REGEX.test(fileName))
1475
+ ) {
1476
+ candidates.push(path.join(projectPath, fileName));
1477
+ }
1478
+ }
1479
+ &nbsp;
1480
+ if (candidates.length &gt; 1) {
1481
+ warnings.push(`Multiple *.project.json files found, using ${candidates[0]}`);
1482
+ }
1483
+ &nbsp;
1484
+ return { path: candidates[0], warnings };
1485
+ }
1486
+ &nbsp;
1487
+ public static fromPath(rojoConfigFilePath: string): RojoResolver {
1488
+ const resolver = new RojoResolver();
1489
+ resolver.parseConfig(path.resolve(rojoConfigFilePath), true);
1490
+ return resolver;
1491
+ }
1492
+ &nbsp;
1493
+ /**
1494
+ * Restore a resolver from a {@link RojoResolverState} snapshot.
1495
+ * @param state - The serialized resolver state to restore from.
1496
+ * @returns A resolver equivalent to the one the state was captured from.
1497
+ */
1498
+ public static fromState(state: RojoResolverState): RojoResolver {
1499
+ const resolver = new RojoResolver();
1500
+ &nbsp;
1501
+ resolver.partitions = state.partitions.map((partition) =&gt; {
1502
+ return { fsPath: partition.fsPath, rbxPath: partition.rbxPath.slice() };
1503
+ });
1504
+ &nbsp;
1505
+ const filePathToRbxPathMap = new Map&lt;string, RbxPath&gt;();
1506
+ for (const [filePath, rbxPath] of state.filePathToRbxPathMap) {
1507
+ filePathToRbxPathMap.set(filePath, rbxPath.slice());
1508
+ }
1509
+ &nbsp;
1510
+ resolver.filePathToRbxPathMap = filePathToRbxPathMap;
1511
+ resolver.isolatedContainers = state.isolatedContainers.map((container) =&gt;
1512
+ container.slice(),
1513
+ );
1514
+ resolver.isGame = state.isGame;
1515
+ resolver.warnings = state.warnings.slice();
1516
+ &nbsp;
1517
+ for (const directory of state.walkedDirs) {
1518
+ resolver.walkedDirectoriesInternal.add(directory);
1519
+ }
1520
+ &nbsp;
1521
+ for (const configFile of state.walkedConfigFiles) {
1522
+ resolver.walkedConfigFilesInternal.add(configFile);
1523
+ }
1524
+ &nbsp;
1525
+ return resolver;
1526
+ }
1527
+ &nbsp;
1528
+ public static fromTree(basePath: string, tree: RojoTree): RojoResolver {
1529
+ const resolver = new RojoResolver();
1530
+ resolver.parseTree(basePath, "", tree, true);
1531
+ return resolver;
1532
+ }
1533
+ &nbsp;
1534
+ public getFileRelation(fileRbxPath: RbxPath, moduleRbxPath: RbxPath): FileRelation {
1535
+ const fileContainer = this.getContainer(this.isolatedContainers, fileRbxPath);
1536
+ const moduleContainer = this.getContainer(this.isolatedContainers, moduleRbxPath);
1537
+ if (fileContainer &amp;&amp; moduleContainer) {
1538
+ if (fileContainer === moduleContainer) {
1539
+ return FileRelation.InToIn;
1540
+ }
1541
+ &nbsp;
1542
+ return FileRelation.OutToIn;
1543
+ }
1544
+ &nbsp;
1545
+ if (fileContainer &amp;&amp; !moduleContainer) {
1546
+ return FileRelation.InToOut;
1547
+ }
1548
+ &nbsp;
1549
+ if (!fileContainer &amp;&amp; moduleContainer) {
1550
+ return FileRelation.OutToIn;
1551
+ }
1552
+ &nbsp;
1553
+ // !fileContainer &amp;&amp; !moduleContainer
1554
+ return FileRelation.OutToOut;
1555
+ }
1556
+ &nbsp;
1557
+ public getNetworkType(rbxPath: RbxPath): NetworkType {
1558
+ if (this.getContainer(SERVER_CONTAINERS, rbxPath)) {
1559
+ return NetworkType.Server;
1560
+ }
1561
+ &nbsp;
1562
+ if (this.getContainer(CLIENT_CONTAINERS, rbxPath)) {
1563
+ return NetworkType.Client;
1564
+ }
1565
+ &nbsp;
1566
+ return NetworkType.Unknown;
1567
+ }
1568
+ &nbsp;
1569
+ public getPartitions(): ReadonlyArray&lt;PartitionInfo&gt; {
1570
+ return this.partitions;
1571
+ }
1572
+ &nbsp;
1573
+ public getRbxPathFromFilePath(filePath: string): RbxPath | undefined {
1574
+ const resolved = convertToLuau(path.resolve(filePath));
1575
+ &nbsp;
1576
+ const rbxPath = this.filePathToRbxPathMap.get(resolved);
1577
+ if (rbxPath) {
1578
+ return rbxPath;
1579
+ }
1580
+ &nbsp;
1581
+ const extension = path.extname(resolved);
1582
+ for (const partition of this.partitions) {
1583
+ if (isPathDescendantOf(resolved, partition.fsPath)) {
1584
+ const stripped = stripRojoExtensions(resolved);
1585
+ const relativePath = path.relative(partition.fsPath, stripped);
1586
+ const relativeParts = relativePath === "" ? [] : relativePath.split(path.sep);
1587
+ if (ROJO_SCRIPT_EXTS.has(extension) &amp;&amp; relativeParts.at(-1) === INIT_NAME) {
1588
+ relativeParts.pop();
1589
+ }
1590
+ &nbsp;
1591
+ return [...partition.rbxPath, ...relativeParts];
1592
+ }
1593
+ }
1594
+ &nbsp;
1595
+ return undefined;
1596
+ }
1597
+ &nbsp;
1598
+ public getRbxTypeFromFilePath(filePath: string): RbxType {
1599
+ const resolved = convertToLuau(filePath);
1600
+ const extension = path.extname(resolved);
1601
+ const subExtension = path.extname(path.basename(resolved, extension));
1602
+ if (ROJO_SCRIPT_EXTS.has(extension)) {
1603
+ return SUB_EXT_TYPE_MAP.get(subExtension) ?? RbxType.Unknown;
1604
+ }
1605
+ &nbsp;
1606
+ // non-script exts cannot use .server, .client, etc.
1607
+ return RbxType.ModuleScript;
1608
+ }
1609
+ &nbsp;
1610
+ /**
1611
+ * Serialize this resolver to a {@link RojoResolverState} snapshot.
1612
+ * @returns A serializable snapshot of this resolver's state.
1613
+ */
1614
+ public getState(): RojoResolverState {
1615
+ const filePathToRbxPathMap = new Array&lt;[string, RbxPath]&gt;();
1616
+ for (const [filePath, rbxPath] of this.filePathToRbxPathMap) {
1617
+ filePathToRbxPathMap.push([filePath, rbxPath.slice()]);
1618
+ }
1619
+ &nbsp;
1620
+ return {
1621
+ filePathToRbxPathMap,
1622
+ isGame: this.isGame,
1623
+ isolatedContainers: this.isolatedContainers.map((container) =&gt; container.slice()),
1624
+ partitions: this.partitions.map((partition) =&gt; {
1625
+ return { fsPath: partition.fsPath, rbxPath: partition.rbxPath.slice() };
1626
+ }),
1627
+ walkedConfigFiles: [...this.walkedConfigFilesInternal],
1628
+ walkedDirs: [...this.walkedDirectoriesInternal],
1629
+ warnings: this.warnings.slice(),
1630
+ };
1631
+ }
1632
+ &nbsp;
1633
+ public getWarnings(): ReadonlyArray&lt;string&gt; {
1634
+ return this.warnings;
1635
+ }
1636
+ &nbsp;
1637
+ public isIsolated(rbxPath: RbxPath): boolean {
1638
+ return this.getContainer(this.isolatedContainers, rbxPath) !== undefined;
1639
+ }
1640
+ &nbsp;
1641
+ public static relative(rbxFrom: RbxPath, rbxTo: RbxPath): RelativeRbxPath {
1642
+ const maxLength = Math.max(rbxFrom.length, rbxTo.length);
1643
+ let diffIndex = maxLength;
1644
+ for (let index = 0; index &lt; maxLength; index++) {
1645
+ if (rbxFrom[index] !== rbxTo[index]) {
1646
+ diffIndex = index;
1647
+ break;
1648
+ }
1649
+ }
1650
+ &nbsp;
1651
+ const result = new Array&lt;RbxPathParent | string&gt;();
1652
+ if (diffIndex &lt; rbxFrom.length) {
1653
+ for (let index = 0; index &lt; rbxFrom.length - diffIndex; index++) {
1654
+ result.push(RbxPathParent);
1655
+ }
1656
+ }
1657
+ &nbsp;
1658
+ for (let index = diffIndex; index &lt; rbxTo.length; index++) {
1659
+ // eslint-disable-next-line ts/no-non-null-assertion -- Loop index
1660
+ result.push(rbxTo[index]!);
1661
+ }
1662
+ &nbsp;
1663
+ return result;
1664
+ }
1665
+ &nbsp;
1666
+ /**
1667
+ * Create a synthetic RojoResolver for ProjectType.Package. Forces all imports
1668
+ * to be relative.
1669
+ * @param basePath - The base filesystem path the package resolves against.
1670
+ * @returns A resolver that maps every file in the package relatively.
1671
+ */
1672
+ public static synthetic(basePath: string): RojoResolver {
1673
+ const resolver = new RojoResolver();
1674
+ resolver.parseTree(basePath, "", { $path: basePath } as RojoTree, true);
1675
+ return resolver;
1676
+ }
1677
+ &nbsp;
1678
+ public get walkedConfigFiles(): ReadonlySet&lt;string&gt; {
1679
+ return this.walkedConfigFilesInternal;
1680
+ }
1681
+ &nbsp;
1682
+ public get walkedDirectories(): ReadonlySet&lt;string&gt; {
1683
+ return this.walkedDirectoriesInternal;
1684
+ }
1685
+ &nbsp;
1686
+ private cachedRealpath(targetPath: string): string {
1687
+ let resolved = this.realpathCache.get(targetPath);
1688
+ if (resolved === undefined) {
1689
+ resolved = fs.realpathSync(targetPath);
1690
+ this.realpathCache.set(targetPath, resolved);
1691
+ }
1692
+ &nbsp;
1693
+ return resolved;
1694
+ }
1695
+ &nbsp;
1696
+ private getContainer(from: Array&lt;RbxPath&gt;, rbxPath?: RbxPath): RbxPath | undefined {
1697
+ if (this.isGame &amp;&amp; rbxPath) {
1698
+ for (const container of from) {
1699
+ if (arrayStartsWith(rbxPath, container)) {
1700
+ return container;
1701
+ }
1702
+ }
1703
+ }
1704
+ &nbsp;
1705
+ return undefined;
1706
+ }
1707
+ &nbsp;
1708
+ private parseConfig(rojoConfigFilePath: string, doNotPush = false): void {
1709
+ if (!fs.existsSync(rojoConfigFilePath)) {
1710
+ this.warn(`RojoResolver: Path does not exist "${rojoConfigFilePath}"`);
1711
+ return;
1712
+ }
1713
+ &nbsp;
1714
+ const realPath = this.cachedRealpath(rojoConfigFilePath);
1715
+ this.walkedConfigFilesInternal.add(realPath);
1716
+ &nbsp;
1717
+ let configJson: unknown;
1718
+ try {
1719
+ configJson = JSON.parse(fs.readFileSync(realPath, "utf8"));
1720
+ } catch {
1721
+ // Malformed JSON: leave configJson undefined and fall through so it
1722
+ // is reported as an invalid configuration rather than crashing the
1723
+ // caller.
1724
+ }
1725
+ &nbsp;
1726
+ if (isValidRojoConfig(configJson)) {
1727
+ this.parseTree(
1728
+ path.dirname(rojoConfigFilePath),
1729
+ configJson.name,
1730
+ configJson.tree,
1731
+ doNotPush,
1732
+ );
1733
+ } else {
1734
+ this.warn("RojoResolver: Invalid configuration!");
1735
+ }
1736
+ }
1737
+ &nbsp;
1738
+ private parsePath(itemPath: string): void {
1739
+ const luauPath = convertToLuau(itemPath);
1740
+ &nbsp;
1741
+ // A $path pointing straight at a *.project.json file embeds that nested
1742
+ // project at the current rbxPath (Rojo composes projects this way), the
1743
+ // same as a directory whose default.project.json is discovered below.
1744
+ // Without this, the .json extension routes the file into
1745
+ // filePathToRbxPathMap as an opaque leaf and the nested tree's mounts
1746
+ // (its partitions, its @rbxts mounts) are never read.
1747
+ if (ROJO_FILE_REGEX.test(path.basename(luauPath))) {
1748
+ this.parseConfig(luauPath, true);
1749
+ return;
1750
+ }
1751
+ &nbsp;
1752
+ const realPath = fs.existsSync(luauPath) ? this.cachedRealpath(luauPath) : luauPath;
1753
+ const extension = path.extname(luauPath);
1754
+ if (ROJO_MODULE_EXTS.has(extension)) {
1755
+ this.filePathToRbxPathMap.set(luauPath, [...this.rbxPath]);
1756
+ } else {
1757
+ const isDirectory = fs.existsSync(realPath) &amp;&amp; fs.statSync(realPath).isDirectory();
1758
+ if (isDirectory) {
1759
+ this.walkedDirectoriesInternal.add(realPath);
1760
+ }
1761
+ &nbsp;
1762
+ if (isDirectory &amp;&amp; fs.readdirSync(realPath).includes(ROJO_DEFAULT_NAME)) {
1763
+ this.parseConfig(path.join(luauPath, ROJO_DEFAULT_NAME), true);
1764
+ } else {
1765
+ this.partitions.unshift({
1766
+ fsPath: luauPath,
1767
+ rbxPath: [...this.rbxPath],
1768
+ });
1769
+ &nbsp;
1770
+ if (isDirectory) {
1771
+ this.searchDirectory(luauPath);
1772
+ }
1773
+ }
1774
+ }
1775
+ }
1776
+ &nbsp;
1777
+ private parseTree(basePath: string, name: string, tree: RojoTree, doNotPush = false): void {
1778
+ if (!doNotPush) {
1779
+ this.rbxPath.push(name);
1780
+ }
1781
+ &nbsp;
1782
+ if (tree.$path !== undefined) {
1783
+ this.parsePath(
1784
+ path.resolve(
1785
+ basePath,
1786
+ typeof tree.$path === "string" ? tree.$path : tree.$path.optional,
1787
+ ),
1788
+ );
1789
+ }
1790
+ &nbsp;
1791
+ if (tree.$className === "DataModel") {
1792
+ this.isGame = true;
1793
+ }
1794
+ &nbsp;
1795
+ const childNames = Object.keys(tree).filter((value) =&gt; !value.startsWith("$"));
1796
+ for (const childName of childNames) {
1797
+ // eslint-disable-next-line ts/no-non-null-assertion -- Object.keys ensures this is defined
1798
+ this.parseTree(basePath, childName, tree[childName]!);
1799
+ }
1800
+ &nbsp;
1801
+ if (!doNotPush) {
1802
+ this.rbxPath.pop();
1803
+ }
1804
+ }
1805
+ &nbsp;
1806
+ private searchChildren(directory: string, directoryEntries: Array&lt;Dirent&gt;): void {
1807
+ // Two-phase: parse every sibling *.project.json before recursing into
1808
+ // sibling directories. parsePath / parseConfig insert partitions via
1809
+ // unshift, and getRbxPathFromFilePath returns the first match, so
1810
+ // interleaving in raw entry order would shuffle partition precedence
1811
+ // for overlapping mounts.
1812
+ const projectFiles = new Array&lt;string&gt;();
1813
+ const subDirectories = new Array&lt;{ name: string; path: string }&gt;();
1814
+ &nbsp;
1815
+ for (const entry of directoryEntries) {
1816
+ const childPath = path.join(directory, entry.name);
1817
+ let isFile = entry.isFile();
1818
+ let isDirectory = entry.isDirectory();
1819
+ // Symlinks (both flags false), unknown-type entries on NFS/SMB/FUSE
1820
+ // mounts and some Windows network drives, and NTFS junctions on
1821
+ // Node versions that don't classify them: resolve and stat the
1822
+ // target so we still discover nested *.project.json files and
1823
+ // walkable directories. A broken symlink throws ENOENT here —
1824
+ // warn and skip rather than crash the whole walk.
1825
+ if (!isFile &amp;&amp; !isDirectory) {
1826
+ try {
1827
+ const stat = fs.statSync(this.cachedRealpath(childPath));
1828
+ isFile = stat.isFile();
1829
+ isDirectory = stat.isDirectory();
1830
+ } catch (err) {
1831
+ this.warn(
1832
+ `RojoResolver: Failed to resolve "${childPath}" (${(err as Error).message})`,
1833
+ );
1834
+ continue;
1835
+ }
1836
+ }
1837
+ &nbsp;
1838
+ if (isFile &amp;&amp; ROJO_FILE_REGEX.test(entry.name)) {
1839
+ projectFiles.push(childPath);
1840
+ } else if (isDirectory) {
1841
+ subDirectories.push({ name: entry.name, path: childPath });
1842
+ }
1843
+ }
1844
+ &nbsp;
1845
+ for (const childPath of projectFiles) {
1846
+ this.parseConfig(childPath);
1847
+ }
1848
+ &nbsp;
1849
+ for (const { name, path: childPath } of subDirectories) {
1850
+ this.searchDirectory(childPath, name);
1851
+ }
1852
+ }
1853
+ &nbsp;
1854
+ private searchDirectory(directory: string, item?: string): void {
1855
+ const realPath = this.cachedRealpath(directory);
1856
+ this.walkedDirectoriesInternal.add(realPath);
1857
+ // readdirSync transparently follows a symlink on the argument; the
1858
+ // result is equivalent to readdirSync(realpathSync(directory)).
1859
+ const directoryEntries = fs.readdirSync(directory, { withFileTypes: true });
1860
+ &nbsp;
1861
+ if (directoryEntries.some((entry) =&gt; entry.name === ROJO_DEFAULT_NAME)) {
1862
+ this.parseConfig(path.join(directory, ROJO_DEFAULT_NAME));
1863
+ return;
1864
+ }
1865
+ &nbsp;
1866
+ if (item !== undefined) {
1867
+ this.rbxPath.push(item);
1868
+ }
1869
+ &nbsp;
1870
+ this.searchChildren(directory, directoryEntries);
1871
+ &nbsp;
1872
+ if (item !== undefined) {
1873
+ this.rbxPath.pop();
1874
+ }
1875
+ }
1876
+ &nbsp;
1877
+ private warn(str: string): void {
1878
+ this.warnings.push(str);
1879
+ }
1880
+ }
1881
+ &nbsp;</pre></td></tr></table></pre>
1882
+
1883
+ <div class='push'></div><!-- for sticky footer -->
1884
+ </div><!-- /wrapper -->
1885
+ <div class='footer quiet pad2 space-top1 center small'>
1886
+ Code coverage generated by
1887
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1888
+ at 2026-07-03T17:15:45.546Z
1889
+ </div>
1890
+ <script src="prettify.js"></script>
1891
+ <script>
1892
+ window.onload = function () {
1893
+ prettyPrint();
1894
+ };
1895
+ </script>
1896
+ <script src="sorter.js"></script>
1897
+ <script src="block-navigation.js"></script>
1898
+ </body>
1899
+ </html>
1900
+