quarchpy 2.2.9.dev4__py2.py3-none-any.whl → 2.2.9.dev5__py2.py3-none-any.whl

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 (691) hide show
  1. quarchpy/__init__.py +1 -1
  2. quarchpy/__pycache__/__init__.cpython-310.pyc +0 -0
  3. quarchpy/__pycache__/_version.cpython-310.pyc +0 -0
  4. quarchpy/__pycache__/connection.cpython-310.pyc +0 -0
  5. quarchpy/_version.py +1 -1
  6. quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.qfg +196 -196
  7. quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v4.000 c1.3.qfg +198 -198
  8. quarchpy/config_files/Cable_Modules/QTL1253-02 - Mini SAS Module Config v3.5 c1.3.qfg +196 -196
  9. quarchpy/config_files/Cable_Modules/QTL1253-02 - Mini SAS Module Config v4.000 c1.3.qfg +198 -198
  10. quarchpy/config_files/Cable_Modules/QTL1253-xx - Mini SAS Module Config v4.003 c1.6.qfg +197 -197
  11. quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v3.5 c1.2.qfg +188 -188
  12. quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v4.000 c1.2.qfg +190 -190
  13. quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v4.100 c1.3.qfg +189 -189
  14. quarchpy/config_files/Cable_Modules/QTL1292-xx - SFP+ Cable Pull Module Config v4.000 c1.1.qfg +154 -154
  15. quarchpy/config_files/Cable_Modules/QTL1309-04 - USB 3.0 Module Config v4.003 c1.2.qfg +187 -187
  16. quarchpy/config_files/Cable_Modules/QTL1309-xx - USB 3.0 Module Config v3.5 c1.1.qfg +187 -187
  17. quarchpy/config_files/Cable_Modules/QTL1309-xx - USB 3.0 Module Config v4.000 c1.1.qfg +188 -188
  18. quarchpy/config_files/Cable_Modules/QTL1366-xx - QSFP Cable Pull Module Config v4.000 c1.1.qfg +209 -209
  19. quarchpy/config_files/Cable_Modules/QTL1383-xx - eSATAp Module Config v4.000 c1.3.qfg +190 -190
  20. quarchpy/config_files/Cable_Modules/QTL1521-02 - Mini SAS HD Module Config v4.000 c1.1.qfg +210 -210
  21. quarchpy/config_files/Cable_Modules/QTL1521-03 - Mini SAS HD Module Config v4.000 c1.1.qfg +210 -210
  22. quarchpy/config_files/Cable_Modules/QTL1521-05 - Mini SAS HD Module Config v4.005 c1.1.qfg +209 -209
  23. quarchpy/config_files/Cable_Modules/QTL1521-05 - Mini SAS HD Module Config v4.007 c1.2.qfg +209 -209
  24. quarchpy/config_files/Cable_Modules/QTL1521-xx - Mini SAS HD Module Config v4.003 c1.5.qfg +209 -209
  25. quarchpy/config_files/Cable_Modules/QTL1663-xx - Quad QSFP Cable Pull Module Config v4.000 c1.1.qfg +308 -308
  26. quarchpy/config_files/Cable_Modules/QTL1675-05 - Mini SAS HD Module w Triggering Config v4.007 c1.3.qfg +211 -211
  27. quarchpy/config_files/Cable_Modules/QTL1675-xx - Mini SAS HD Module w Triggering Config v4.000 c1.1.qfg +210 -210
  28. quarchpy/config_files/Cable_Modules/QTL1917-xx - Dual SFP+ Cable Pull Module Config v4.000 c1.1.qfg +174 -174
  29. quarchpy/config_files/Cable_Modules/QTL1971-01 - USB TypeC Module Config v4.000 c1.1.qfg +203 -203
  30. quarchpy/config_files/Cable_Modules/QTL1971-02 - USB TypeC Module Config v4.000 c1.1.qfg +203 -203
  31. quarchpy/config_files/Cable_Modules/QTL2022-xx - RJ-45 Cable Module Config v4.104 c1.3.QFG +189 -189
  32. quarchpy/config_files/Cable_Modules/QTL2058-xx - External PCIe Module Config v4.001 c1.1.qfg +209 -209
  33. quarchpy/config_files/Cable_Modules/QTL2138-01 - SFP28 Cable Pull Module Config v4.000 c1.1.qfg +154 -154
  34. quarchpy/config_files/Cable_Modules/QTL2146-01 - Gen4 OCuLink Cable Module Config v4.001 c1.1.qfg +212 -212
  35. quarchpy/config_files/Cable_Modules/QTL2162-01 - 24G mini SAS HD Cable Break Module Config v4.000 c1.qfg +209 -209
  36. quarchpy/config_files/Cable_Modules/QTL2171-01 - QSFP28 Cable Module Config v4.000 c1.qfg +198 -198
  37. quarchpy/config_files/Cable_Modules/QTL2171-02 - QSFP28 Cable Module Config v4.000 c1.qfg +198 -198
  38. quarchpy/config_files/Cable_Modules/QTL2341-01 - Gen4 External PCIe Cable Module v4.000.qfg +209 -209
  39. quarchpy/config_files/Cable_Modules/QTL2602-xx - Multiprotocol Link Breaker.qfg +178 -178
  40. quarchpy/config_files/Cable_Modules/QTL2834-xx - -48V DC Breaker Module v5.000 c1.0.qfg +177 -177
  41. quarchpy/config_files/Card_Modules/QTL1069-xx - SBB 2.0 Module Config v3.5 c1.1.qfg +366 -366
  42. quarchpy/config_files/Card_Modules/QTL1630-01 - PCIe Card Module v4.000 c1.0.qfg +280 -280
  43. quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.004 c1.2.qfg +283 -283
  44. quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.005 c1.2.qfg +283 -283
  45. quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.100 c1.4.qfg +284 -284
  46. quarchpy/config_files/Card_Modules/QTL1630-04 - PCIe Card Module Config v4.001 c1.1.qfg +287 -287
  47. quarchpy/config_files/Card_Modules/QTL1630-04 - PCIe Card Module Config v4.004 c1.2.qfg +287 -287
  48. quarchpy/config_files/Card_Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.004 c1.2.qfg +284 -284
  49. quarchpy/config_files/Card_Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.006 c1.3.qfg +285 -285
  50. quarchpy/config_files/Card_Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.001 c1.1.qfg +286 -286
  51. quarchpy/config_files/Card_Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.004 c1.2.qfg +288 -288
  52. quarchpy/config_files/Card_Modules/QTL1688-04 - PCIe Card Module w Triggering Config v4.005 c1.5.qfg +288 -288
  53. quarchpy/config_files/Card_Modules/QTL1688-05 - PCIe Card Module w Triggering Config v4.005 c1.qfg +288 -288
  54. quarchpy/config_files/Card_Modules/QTL1848-01 - PCIe Lite Card Module Config v4.000.qfg +122 -122
  55. quarchpy/config_files/Card_Modules/QTL1848-02 - PCIe Lite Card Module Config v4.000.qfg +134 -134
  56. quarchpy/config_files/Card_Modules/QTL1919-01 - PCIe x8 Card Module Config v4.001 c1.4.qfg +247 -247
  57. quarchpy/config_files/Card_Modules/QTL1920-01 - PCIe x8 Card Module w Triggering Config v4.000 c1.3.qfg +247 -247
  58. quarchpy/config_files/Card_Modules/QTL2019-xx - M.2 Horizontal Card Module Config v4.002 c1.1.qfg +219 -219
  59. quarchpy/config_files/Card_Modules/QTL2034-xx - M.2 M-Key Vertical Module Config v4.001 c1.1.qfg +221 -221
  60. quarchpy/config_files/Card_Modules/QTL2067-xx - PCIe SFF Module Config v4.000 c1.1.qfg +248 -248
  61. quarchpy/config_files/Card_Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.006 c1.4.qfg +256 -256
  62. quarchpy/config_files/Card_Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.007 c1.4.qfg +256 -256
  63. quarchpy/config_files/Card_Modules/QTL2073-01 - GEN3 PCIe Lite Card Module Config v4.001.qfg +134 -134
  64. quarchpy/config_files/Card_Modules/QTL2073-01 - PCIe Lite Card Module Config v4.000.qfg +134 -134
  65. quarchpy/config_files/Card_Modules/QTL2074-01 - GEN3 PCIe HS Card Module v4.005 c1.4.qfg +287 -287
  66. quarchpy/config_files/Card_Modules/QTL2074-01 - PCIe Card Module Config CurrentLimit v4.004 c1.2.qfg +287 -287
  67. quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.1.qfg +287 -287
  68. quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.3.qfg +277 -277
  69. quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v5.000 c1.4.qfg +277 -277
  70. quarchpy/config_files/Card_Modules/QTL2094-01 - Sanblaze Dualport Riser Card Config v4.001 c1.1.qfg +223 -223
  71. quarchpy/config_files/Card_Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.000 c1.1.qfg +287 -287
  72. quarchpy/config_files/Card_Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.4.qfg +277 -277
  73. quarchpy/config_files/Card_Modules/QTL2135-xx - PCIe GEN4 Card Module w Triggering Config - Inrush Limit v4.001 c1.4.qfg +277 -277
  74. quarchpy/config_files/Card_Modules/QTL2161-01 - EDSFF x8 Module Config v4.000 c1.1.qfg +210 -210
  75. quarchpy/config_files/Card_Modules/QTL2171-xx - EDSFF x8 Module w Triggering Config 4.001 c1.1.qfg +213 -213
  76. quarchpy/config_files/Card_Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.000 c1.1.qfg +218 -218
  77. quarchpy/config_files/Card_Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.005 c1.5.qfg +218 -218
  78. quarchpy/config_files/Card_Modules/QTL2272-01 - GEN4 EDSFF x8 Module Config v4.000 c1.1.qfg +211 -211
  79. quarchpy/config_files/Card_Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.000 c1.1.qfg +212 -212
  80. quarchpy/config_files/Card_Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.002 c1.2.qfg +212 -212
  81. quarchpy/config_files/Card_Modules/QTL2318-01 - SANBlaze U.2 Rack Riser Card Config v4.000 c1.1.qfg +218 -218
  82. quarchpy/config_files/Card_Modules/QTL2322-03 - GEN4 M.2 M-Key Vertical Breaker Module Config v5.001 c1.3.qfg +220 -220
  83. quarchpy/config_files/Card_Modules/QTL2322-xx - GEN4 M.2 M-Key Vertical Breaker Module Config v5.000 c1.1.qfg +208 -208
  84. quarchpy/config_files/Card_Modules/QTL2334-xx - Gen4 EDSFF x4 Card Module Config v4.000 c1.1.qfg +187 -187
  85. quarchpy/config_files/Card_Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.000 c1.1.qfg +189 -189
  86. quarchpy/config_files/Card_Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.001 c1.2.qfg +190 -190
  87. quarchpy/config_files/Card_Modules/QTL2357-xx - PCIe GEN5 Card Module Config v5.000 c1.1.qfg +282 -282
  88. quarchpy/config_files/Card_Modules/QTL2358-xx - PCIe GEN5 Card Module w Triggering Config v5.000 c1.1.qfg +283 -283
  89. quarchpy/config_files/Card_Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.000 c1.1.qfg +215 -215
  90. quarchpy/config_files/Card_Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.001 c1.2.qfg +217 -217
  91. quarchpy/config_files/Card_Modules/QTL2395-01 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.000 c1.1.qfg +208 -208
  92. quarchpy/config_files/Card_Modules/QTL2395-02 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.qfg +220 -220
  93. quarchpy/config_files/Card_Modules/QTL2395-03 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.qfg +220 -220
  94. quarchpy/config_files/Card_Modules/QTL2396-xx - PCIe GEN5 Card Module w inrush Config v5.000 c1.1.qfg +282 -282
  95. quarchpy/config_files/Card_Modules/QTL2403-xx - Gen4 PCIe Lite Module Config v4.000.qfg +135 -135
  96. quarchpy/config_files/Card_Modules/QTL2515-xx - PCIe GEN4 Card Module w Triggering - Inrush Limit Config v4.001 c1.3.qfg +277 -277
  97. quarchpy/config_files/Card_Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.000.qfg +130 -130
  98. quarchpy/config_files/Card_Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.003.qfg +137 -137
  99. quarchpy/config_files/Card_Modules/QTL2658-xx - Gen5 PCIe Lite Module w Inrush Config v4.000.qfg +130 -130
  100. quarchpy/config_files/Card_Modules/QTL2661-xx - GEN5 PCIe U.3 Breaker Config w Triggering v5.000 c1.1.qfg +229 -229
  101. quarchpy/config_files/Card_Modules/QTL2662-xx - GEN5 PCIe U.3 Breaker Config v5.000 c1.1.qfg +228 -228
  102. quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.000.qfg +230 -230
  103. quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.001 c1.2.qfg +233 -233
  104. quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker v5.000 c1.1.qfg +230 -230
  105. quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker +Triggering Config v5.000.qfg +230 -230
  106. quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering Config v5.001 c1.2.qfg +233 -233
  107. quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering v5.000 c1.1.qfg +230 -230
  108. quarchpy/config_files/Card_Modules/QTL2766-xx - GEN4 EDSFF E1 x8 Breaker Config v5.000.qfg +253 -253
  109. quarchpy/config_files/Card_Modules/QTL2767-xx - GEN4 EDSFF E3 x8 Breaker Config v5.000.qfg +253 -253
  110. quarchpy/config_files/Card_Modules/QTL2768-xx - GEN4 EDSFF E3 2T x8 Breaker Config v5.000.qfg +253 -253
  111. quarchpy/config_files/Card_Modules/QTL2776-xx - GEN4 EDSFF E1 x8 Breaker +Triggering Config v5.000.qfg +253 -253
  112. quarchpy/config_files/Card_Modules/QTL2777-xx - GEN4 EDSFF E3 x8 Breaker +Triggering Config v5.000.qfg +253 -253
  113. quarchpy/config_files/Card_Modules/QTL2778-xx - GEN4 EDSFF E3 2T x8 Breaker +Triggering Config v5.000.qfg +253 -253
  114. quarchpy/config_files/Card_Modules/QTL2798-xx - PCIe GEN5 Card Module w Triggering w Inrush Limit Config v5.000 c1.1.qfg +283 -283
  115. quarchpy/config_files/Card_Modules/QTL2804-xx - GEN5 MCIO x4 to U.2 Breaker Config v5.000 c1.1.qfg +234 -234
  116. quarchpy/config_files/Card_Modules/QTL2805-xx - GEN5 MCIO x4 to U.2 Breaker + Triggering Config v5.000 c1.1.qfg +234 -234
  117. quarchpy/config_files/Card_Modules/QTL2814-xx - GEN5 AIC to U.2 Breaker + Triggering Config v5.000 c1.1 .qfg +233 -233
  118. quarchpy/config_files/Card_Modules/QTL2892-xx - GEN5 EDSFF E1 x4 Breaker.qfg +233 -233
  119. quarchpy/config_files/Card_Modules/QTL2925-xx - GEN5 EDSFF E1 x4 Breaker +Triggering.qfg +233 -233
  120. quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v3.5 c1.5.qfg +198 -198
  121. quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v4.000 c1.5.qfg +200 -200
  122. quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v4.006 c1.8.qfg +199 -199
  123. quarchpy/config_files/Drive_Modules/QTL1215-xx - Lite Module Config v3.50.qfg +118 -118
  124. quarchpy/config_files/Drive_Modules/QTL1215-xx - Lite Module Config v4.000.qfg +118 -118
  125. quarchpy/config_files/Drive_Modules/QTL1301-xx - HS Lite Module Config v3.50.qfg +129 -129
  126. quarchpy/config_files/Drive_Modules/QTL1301-xx - HS Lite Module Config v4.000.qfg +129 -129
  127. quarchpy/config_files/Drive_Modules/QTL1429-01 - EMC HS Lite Module Config v4.000.qfg +129 -129
  128. quarchpy/config_files/Drive_Modules/QTL1429-02 - EMC HS Lite Module Config v4.002.qfg +120 -120
  129. quarchpy/config_files/Drive_Modules/QTL1623-03 - 12G HS Lite Module Config v4.001.qfg +128 -128
  130. quarchpy/config_files/Drive_Modules/QTL1623-04 - 12G HS Lite Module Config v4.001.qfg +128 -128
  131. quarchpy/config_files/Drive_Modules/QTL1680-xx - SCA2 Lite Module Config v4.001.qfg +135 -135
  132. quarchpy/config_files/Drive_Modules/QTL1689-01 - 12G HS Module Config v4.001 c1.1.qfg +199 -199
  133. quarchpy/config_files/Drive_Modules/QTL1689-04 - 12G HS Module Config v4.002 c1.1.qfg +196 -196
  134. quarchpy/config_files/Drive_Modules/QTL1689-05 - 12G HS Module Config v4.002 c1.1.qfg +196 -196
  135. quarchpy/config_files/Drive_Modules/QTL1743-02 - PCIe SFF Module Config v4.003 c1.3.qfg +222 -222
  136. quarchpy/config_files/Drive_Modules/QTL1743-02 - PCIe SFF Module Config v4.006 c1.4.qfg +213 -213
  137. quarchpy/config_files/Drive_Modules/QTL1743-xx - PCIe SFF Module Config v4.000 c1.1.qfg +221 -221
  138. quarchpy/config_files/Drive_Modules/QTL1753-xx - 12G Lite Module Config v4.000.qfg +116 -116
  139. quarchpy/config_files/Drive_Modules/QTL1921-01 - EMC 12G HS Lite Module Config v4.000.qfg +120 -120
  140. quarchpy/config_files/Drive_Modules/QTL2207-01 - GEN 4 PCIe U.2 Drive Module.qfg +217 -217
  141. quarchpy/config_files/Drive_Modules/QTL2207-02 - GEN 4 PCIe U.2 Drive Module v5.000.qfg +220 -220
  142. quarchpy/config_files/Drive_Modules/QTL2207-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.qfg +221 -221
  143. quarchpy/config_files/Drive_Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module v4.001.qfg +219 -219
  144. quarchpy/config_files/Drive_Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module.qfg +219 -219
  145. quarchpy/config_files/Drive_Modules/QTL2245-01 - GEN 4 PCIe U.3 HS Drive Module v4.000.qfg +223 -223
  146. quarchpy/config_files/Drive_Modules/QTL2245-xx - GEN 4 PCIe U.3 HS Drive Module.qfg +229 -229
  147. quarchpy/config_files/Drive_Modules/QTL2266-01 - GEN 4 PCIe SFF HS Drive Module Triggering.qfg +219 -219
  148. quarchpy/config_files/Drive_Modules/QTL2266-02 - GEN 4 PCIe SFF HS Drive Module Triggering v4.002.qfg +220 -220
  149. quarchpy/config_files/Drive_Modules/QTL2266-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.qfg +221 -221
  150. quarchpy/config_files/Drive_Modules/QTL2266-XX - GEN 4 PCIe SFF HS Drive Module Triggering.qfg +219 -219
  151. quarchpy/config_files/Drive_Modules/QTL2270-01 - GEN 4 PCIe U.3 HS Drive Module Triggering v4.000.qfg +225 -225
  152. quarchpy/config_files/Drive_Modules/QTL2270-xx - GEN 4 PCIe U.3 HS Drive Module Triggering.qfg +230 -230
  153. quarchpy/config_files/Drive_Modules/QTL2542-02 - 24G SAS Drive Breaker Module v5.001.qfg +194 -194
  154. quarchpy/config_files/Drive_Modules/QTL2542-xx - 24G SAS Drive Breaker v5.000 c1.1.qfg +194 -194
  155. quarchpy/config_files/Drive_Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.000 c1.1.qfg +195 -195
  156. quarchpy/config_files/Drive_Modules/QTL2602-xx - Multiprotocol Link Breaker.qfg +178 -178
  157. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.000.qfg +227 -227
  158. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.001.qfg +227 -227
  159. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.003.qfg +227 -227
  160. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.007.qfg +229 -229
  161. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.000.qfg +228 -228
  162. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.001.qfg +228 -228
  163. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.003.qfg +228 -228
  164. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module v5.007.qfg +230 -230
  165. quarchpy/config_files/Drive_Modules/QTL2661-xx - Gen5 U.3 Drive Module + Triggering v5.000.qfg +229 -229
  166. quarchpy/config_files/Drive_Modules/QTL2662-xx - Gen5 PCIe U.3 Drive Module v5.000.qfg +228 -228
  167. quarchpy/config_files/Drive_Modules/QTL2757-xx - Gen5 SFF Lite Breaker Module Config v4.000.qfg +140 -140
  168. quarchpy/config_files/Drive_Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.qfg +253 -253
  169. quarchpy/config_files/Drive_Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker v5.001.qfg +234 -234
  170. quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.001.qfg +234 -234
  171. quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.002.qfg +253 -253
  172. quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.qfg +253 -253
  173. quarchpy/config_files/Drive_Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker v5.001 c1.2.qfg +230 -230
  174. quarchpy/config_files/Drive_Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker with Triggering v5.002 c1.3.qfg +253 -253
  175. quarchpy/config_files/Drive_Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker with Triggering v5.001 c1.2.qfg +230 -230
  176. quarchpy/config_files/Drive_Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker with Triggering v5.002 c1.3.qfg +253 -253
  177. quarchpy/config_files/Drive_Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.001.qfg +233 -233
  178. quarchpy/config_files/Drive_Modules/Standard Drive Module Config v3.5 c1.1.qfg +171 -171
  179. quarchpy/config_files/Power_Margining/HD/QTL1944-xx - HD Power Module v5.000.qfg +123 -123
  180. quarchpy/config_files/Power_Margining/HD/QTL1944-xx - HD Power Module v5.003.qfg +124 -124
  181. quarchpy/config_files/Power_Margining/HD/QTL1995-xx - x6 HD Power Module v5.002.qfg +122 -122
  182. quarchpy/config_files/Power_Margining/HD/QTL1995-xx - x6 HD Power Module v5.003.qfg +123 -123
  183. quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v5.002.qfg +122 -122
  184. quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v5.003.qfg +123 -123
  185. quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v6.000.qfg +124 -124
  186. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.101.qfg +78 -78
  187. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.200.qfg +80 -80
  188. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.201.qfg +82 -82
  189. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Test Power Margining Module v4.004.qfg +73 -73
  190. quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.101.qfg +78 -78
  191. quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.200.qfg +80 -80
  192. quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.201.qfg +82 -82
  193. quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.105.qfg +78 -78
  194. quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.200.qfg +80 -80
  195. quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.201.qfg +82 -82
  196. quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.105.qfg +78 -78
  197. quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.200.qfg +80 -80
  198. quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.201.qfg +82 -82
  199. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.000.qfg +80 -80
  200. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.200.qfg +81 -81
  201. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.202.qfg +87 -87
  202. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.210.qfg +88 -88
  203. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.211.qfg +121 -121
  204. quarchpy/config_files/Power_Margining/XLC/QTL1824-03 - Power Margining Module V2 - Triggering v4.213.qfg +121 -121
  205. quarchpy/config_files/Power_Margining/XLC/QTL1847-01 - Power Margining Module V2 v4.213.qfg +121 -121
  206. quarchpy/config_files/Switch_Modules/QTL1390-xx - 4-8 SATA MUX Module Config v4.002.qfg +186 -186
  207. quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.002.qfg +147 -147
  208. quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.003.qfg +147 -147
  209. quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.100.qfg +147 -147
  210. quarchpy/config_files/Switch_Modules/QTL1449-xx - 1-8 PCIe MUX Module Config v4.000.qfg +145 -145
  211. quarchpy/config_files/Switch_Modules/QTL1490-xx - SATA Keyed HS Module Config v4.003 c1.6.qfg +194 -194
  212. quarchpy/config_files/Switch_Modules/QTL1490-xx - SATA Keyed HS Module Config v4.006 c1.8.qfg +193 -193
  213. quarchpy/config_files/Switch_Modules/QTL1530-xx - 1-8 DP MUX Module Config v4.000.qfg +145 -145
  214. quarchpy/config_files/Switch_Modules/QTL1564-xx - 12 Port Mini SAS HD MUX Module Config v4.000.qfg +184 -184
  215. quarchpy/config_files/Switch_Modules/QTL1584-xx - 1-4 ExpressCard MUX Module Config v4.000.qfg +81 -81
  216. quarchpy/config_files/__pycache__/__init__.cpython-310.pyc +0 -0
  217. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-310.pyc +0 -0
  218. quarchpy/connection_specific/QPS/win-amd64/app.jar +0 -0
  219. quarchpy/connection_specific/QPS/win-amd64/qis/help.txt +17 -50
  220. quarchpy/connection_specific/QPS/win-amd64/qis/qis.jar +0 -0
  221. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/CInterface-2.3.jar +0 -0
  222. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/QuarchCommon-2.0.jar +0 -0
  223. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/usb4java-1.3.1.jar +0 -0
  224. quarchpy/connection_specific/QPS/win-amd64/qps-command-reference.html +104 -104
  225. quarchpy/connection_specific/QPS/win-amd64/qps.jar +0 -0
  226. quarchpy/connection_specific/QPS/win-amd64/qps_lib/JFXUtilities-1.0.jar +0 -0
  227. quarchpy/connection_specific/QPS/win-amd64/qps_lib/QuarchCommon-2.0.jar +0 -0
  228. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-base-21.0.6-linux.jar → javafx-base-21.0.5-linux.jar} +0 -0
  229. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-controls-21.0.6-linux.jar → javafx-controls-21.0.5-linux.jar} +0 -0
  230. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-fxml-21.0.6-linux.jar → javafx-fxml-21.0.5-linux.jar} +0 -0
  231. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-graphics-21.0.6-linux.jar → javafx-graphics-21.0.5-linux.jar} +0 -0
  232. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-swing-21.0.6-linux.jar → javafx-swing-21.0.5-linux.jar} +0 -0
  233. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-base-21.0.6-mac.jar → mac-arm64/javafx-base-21.0.5-mac-aarch64.jar} +0 -0
  234. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-controls-21.0.6-mac-aarch64.jar → javafx-controls-21.0.5-mac-aarch64.jar} +0 -0
  235. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-fxml-21.0.6-mac.jar → mac-arm64/javafx-fxml-21.0.5-mac-aarch64.jar} +0 -0
  236. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-graphics-21.0.6-mac-aarch64.jar → javafx-graphics-21.0.5-mac-aarch64.jar} +0 -0
  237. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-swing-21.0.6-mac.jar → mac-arm64/javafx-swing-21.0.5-mac-aarch64.jar} +0 -0
  238. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-base-21.0.6-mac-aarch64.jar → mac-x64/javafx-base-21.0.5-mac.jar} +0 -0
  239. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-controls-21.0.6-mac.jar → javafx-controls-21.0.5-mac.jar} +0 -0
  240. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-fxml-21.0.6-mac-aarch64.jar → mac-x64/javafx-fxml-21.0.5-mac.jar} +0 -0
  241. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-graphics-21.0.6-mac.jar → javafx-graphics-21.0.5-mac.jar} +0 -0
  242. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-swing-21.0.6-mac-aarch64.jar → mac-x64/javafx-swing-21.0.5-mac.jar} +0 -0
  243. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-base-21.0.6-win.jar → javafx-base-21.0.5-win.jar} +0 -0
  244. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-controls-21.0.6-win.jar → javafx-controls-21.0.5-win.jar} +0 -0
  245. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-fxml-21.0.6-win.jar → javafx-fxml-21.0.5-win.jar} +0 -0
  246. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-graphics-21.0.6-win.jar → javafx-graphics-21.0.5-win.jar} +0 -0
  247. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-swing-21.0.6-win.jar → javafx-swing-21.0.5-win.jar} +0 -0
  248. quarchpy/connection_specific/QPS/win-amd64/scriptCommands.txt +4 -4
  249. quarchpy/connection_specific/QPS/win-amd64/whats-new.txt +12 -20
  250. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-310.pyc +0 -0
  251. quarchpy/connection_specific/__pycache__/__init__.cpython-310.pyc +0 -0
  252. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-310.pyc +0 -0
  253. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-310.pyc +0 -0
  254. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-310.pyc +0 -0
  255. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-310.pyc +0 -0
  256. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-310.pyc +0 -0
  257. quarchpy/connection_specific/__pycache__/connection_USB.cpython-310.pyc +0 -0
  258. quarchpy/connection_specific/__pycache__/mDNS.cpython-310.pyc +0 -0
  259. quarchpy/connection_specific/connection_QIS.py +228 -176
  260. quarchpy/connection_specific/connection_QPS.py +0 -2
  261. quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-310.pyc +0 -0
  262. quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-310.pyc +0 -0
  263. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/jaxp.properties +180 -180
  264. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/logging.properties +63 -63
  265. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/management/management.properties +327 -327
  266. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/net.properties +164 -164
  267. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/security/java.policy +46 -46
  268. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/security/java.security +1509 -1509
  269. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/asm.md +36 -36
  270. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/cldr.md +109 -109
  271. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/icu.md +518 -518
  272. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/public_suffix.md +399 -399
  273. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/unicode.md +103 -103
  274. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.desktop/freetype.md +649 -649
  275. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.desktop/giflib.md +50 -50
  276. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.smartcardio/pcsclite.md +57 -57
  277. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.xml/xalan.md +255 -255
  278. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +72 -72
  279. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/ADDITIONAL_LICENSE_INFO +37 -37
  280. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/ASSEMBLY_EXCEPTION +27 -27
  281. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/LICENSE +347 -347
  282. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/ADDITIONAL_LICENSE_INFO +37 -37
  283. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/ASSEMBLY_EXCEPTION +27 -27
  284. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/LICENSE +347 -347
  285. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.localedata/cldr.md +109 -109
  286. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/classlist +1502 -1502
  287. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/jfr/default.jfc +1126 -1126
  288. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/jfr/profile.jfc +1126 -1126
  289. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/psfontj2d.properties +323 -323
  290. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/security/default.policy +235 -235
  291. quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/release +2 -2
  292. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/jaxp.properties +180 -180
  293. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/logging.properties +63 -63
  294. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/management/management.properties +327 -327
  295. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/net.properties +164 -164
  296. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/security/java.policy +46 -46
  297. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/security/java.security +1510 -1510
  298. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/asm.md +36 -36
  299. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/cldr.md +109 -109
  300. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/icu.md +518 -518
  301. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/public_suffix.md +399 -399
  302. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/unicode.md +103 -103
  303. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.desktop/freetype.md +649 -649
  304. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.desktop/giflib.md +50 -50
  305. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.smartcardio/pcsclite.md +57 -57
  306. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.xml/xalan.md +255 -255
  307. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +72 -72
  308. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/ADDITIONAL_LICENSE_INFO +37 -37
  309. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/ASSEMBLY_EXCEPTION +27 -27
  310. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/LICENSE +347 -347
  311. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/ADDITIONAL_LICENSE_INFO +37 -37
  312. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/ASSEMBLY_EXCEPTION +27 -27
  313. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/LICENSE +347 -347
  314. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.localedata/cldr.md +109 -109
  315. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/classlist +1497 -1497
  316. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/jfr/default.jfc +1126 -1126
  317. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/jfr/profile.jfc +1126 -1126
  318. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/psfontj2d.properties +323 -323
  319. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/security/default.policy +235 -235
  320. quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/release +2 -2
  321. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/jaxp.properties +180 -180
  322. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/logging.properties +63 -63
  323. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/management/management.properties +327 -327
  324. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/net.properties +168 -168
  325. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/security/java.policy +46 -46
  326. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/asm.md +36 -36
  327. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/cldr.md +109 -109
  328. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/icu.md +518 -518
  329. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/public_suffix.md +399 -399
  330. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/unicode.md +103 -103
  331. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.desktop/freetype.md +649 -649
  332. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.desktop/giflib.md +50 -50
  333. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.xml/xalan.md +255 -255
  334. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +72 -72
  335. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/lib/jfr/default.jfc +1126 -1126
  336. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/lib/jfr/profile.jfc +1126 -1126
  337. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/lib/psfontj2d.properties +323 -323
  338. quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/lib/security/default.policy +251 -251
  339. quarchpy/connection_specific/mDNS.py +1 -3
  340. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-310.pyc +0 -0
  341. quarchpy/connection_specific/serial/__pycache__/serialposix.cpython-310.pyc +0 -0
  342. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-310.pyc +0 -0
  343. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-310.pyc +0 -0
  344. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-310.pyc +0 -0
  345. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-310.pyc +0 -0
  346. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_linux.cpython-310.pyc +0 -0
  347. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_posix.cpython-310.pyc +0 -0
  348. quarchpy/connection_specific/usb_libs/usb1.py +4 -4
  349. quarchpy/debug/SystemTest.py +64 -16
  350. quarchpy/debug/__pycache__/SystemTest.cpython-310.pyc +0 -0
  351. quarchpy/debug/__pycache__/__init__.cpython-310.pyc +0 -0
  352. quarchpy/debug/__pycache__/versionCompare.cpython-310.pyc +0 -0
  353. quarchpy/debug/module_debug.py +25 -26
  354. quarchpy/debug/simple_terminal.py +23 -18
  355. quarchpy/device/__init__.py +4 -4
  356. quarchpy/device/__pycache__/__init__.cpython-310.pyc +0 -0
  357. quarchpy/device/__pycache__/device.cpython-310.pyc +0 -0
  358. quarchpy/device/__pycache__/quarchArray.cpython-310.pyc +0 -0
  359. quarchpy/device/__pycache__/quarchPPM.cpython-310.pyc +0 -0
  360. quarchpy/device/__pycache__/quarchQPS.cpython-310.pyc +0 -0
  361. quarchpy/device/__pycache__/scanDevices.cpython-310.pyc +0 -0
  362. quarchpy/device/device.py +1237 -440
  363. quarchpy/device/quarchArray.py +2 -2
  364. quarchpy/device/quarchPPM.py +13 -14
  365. quarchpy/device/quarchQPS.py +95 -67
  366. quarchpy/device/scanDevices.py +4 -4
  367. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-310.pyc +0 -0
  368. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-310.pyc +0 -0
  369. quarchpy/disk_test/__pycache__/__init__.cpython-310.pyc +0 -0
  370. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-310.pyc +0 -0
  371. quarchpy/docs/CHANGES.rst +443 -443
  372. quarchpy/docs/Makefile +20 -20
  373. quarchpy/docs/_build/html/.buildinfo +4 -4
  374. quarchpy/docs/_build/html/CHANGES.html +660 -660
  375. quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +439 -439
  376. quarchpy/docs/_build/html/_sources/index.rst.txt +23 -23
  377. quarchpy/docs/_build/html/_sources/readme.rst.txt +41 -41
  378. quarchpy/docs/_build/html/_sources/source/modules.rst.txt +7 -7
  379. quarchpy/docs/_build/html/_sources/source/quarchpy.calibration.rst.txt +78 -78
  380. quarchpy/docs/_build/html/_sources/source/quarchpy.config_files.rst.txt +22 -22
  381. quarchpy/docs/_build/html/_sources/source/quarchpy.connection_specific.rst.txt +76 -76
  382. quarchpy/docs/_build/html/_sources/source/quarchpy.debug.rst.txt +38 -38
  383. quarchpy/docs/_build/html/_sources/source/quarchpy.device.rst.txt +54 -54
  384. quarchpy/docs/_build/html/_sources/source/quarchpy.disk_test.rst.txt +126 -126
  385. quarchpy/docs/_build/html/_sources/source/quarchpy.fio.rst.txt +30 -30
  386. quarchpy/docs/_build/html/_sources/source/quarchpy.iometer.rst.txt +22 -22
  387. quarchpy/docs/_build/html/_sources/source/quarchpy.qis.rst.txt +22 -22
  388. quarchpy/docs/_build/html/_sources/source/quarchpy.qps.rst.txt +22 -22
  389. quarchpy/docs/_build/html/_sources/source/quarchpy.rst.txt +50 -50
  390. quarchpy/docs/_build/html/_sources/source/quarchpy.user_interface.rst.txt +22 -22
  391. quarchpy/docs/_build/html/_sources/source/quarchpy.utilities.rst.txt +22 -22
  392. quarchpy/docs/_build/html/_static/alabaster.css +662 -662
  393. quarchpy/docs/_build/html/_static/basic.css +913 -913
  394. quarchpy/docs/_build/html/_static/custom.css +1 -1
  395. quarchpy/docs/_build/html/_static/doctools.js +149 -149
  396. quarchpy/docs/_build/html/_static/documentation_options.js +12 -12
  397. quarchpy/docs/_build/html/_static/jquery-3.4.1.js +10598 -10598
  398. quarchpy/docs/_build/html/_static/jquery.js +2 -2
  399. quarchpy/docs/_build/html/_static/language_data.js +192 -192
  400. quarchpy/docs/_build/html/_static/pygments.css +83 -83
  401. quarchpy/docs/_build/html/_static/searchtools.js +632 -632
  402. quarchpy/docs/_build/html/_static/sphinx_highlight.js +154 -154
  403. quarchpy/docs/_build/html/_static/underscore-1.3.1.js +999 -999
  404. quarchpy/docs/_build/html/_static/underscore.js +5 -5
  405. quarchpy/docs/_build/html/genindex.html +1626 -1626
  406. quarchpy/docs/_build/html/index.html +214 -214
  407. quarchpy/docs/_build/html/py-modindex.html +300 -300
  408. quarchpy/docs/_build/html/readme.html +137 -137
  409. quarchpy/docs/_build/html/search.html +123 -123
  410. quarchpy/docs/_build/html/source/changelog.html +739 -739
  411. quarchpy/docs/_build/html/source/licenses.html +181 -181
  412. quarchpy/docs/_build/html/source/modules.html +222 -222
  413. quarchpy/docs/_build/html/source/quarchpy.calibration.html +147 -147
  414. quarchpy/docs/_build/html/source/quarchpy.config_files.html +136 -136
  415. quarchpy/docs/_build/html/source/quarchpy.connection_specific.html +729 -729
  416. quarchpy/docs/_build/html/source/quarchpy.debug.html +251 -251
  417. quarchpy/docs/_build/html/source/quarchpy.device.html +1165 -1165
  418. quarchpy/docs/_build/html/source/quarchpy.disk_test.html +220 -220
  419. quarchpy/docs/_build/html/source/quarchpy.fio.html +218 -218
  420. quarchpy/docs/_build/html/source/quarchpy.html +715 -715
  421. quarchpy/docs/_build/html/source/quarchpy.iometer.html +271 -271
  422. quarchpy/docs/_build/html/source/quarchpy.qis.html +640 -640
  423. quarchpy/docs/_build/html/source/quarchpy.qps.html +186 -186
  424. quarchpy/docs/_build/html/source/quarchpy.user_interface.html +278 -278
  425. quarchpy/docs/_build/html/source/quarchpy.utilities.html +211 -211
  426. quarchpy/docs/_build/html/source/readme.html +147 -147
  427. quarchpy/docs/conf.py +56 -56
  428. quarchpy/docs/index.rst +23 -23
  429. quarchpy/docs/make.bat +35 -35
  430. quarchpy/docs/readme.rst +41 -41
  431. quarchpy/docs/source/modules.rst +7 -7
  432. quarchpy/docs/source/quarchpy.calibration.rst +78 -78
  433. quarchpy/docs/source/quarchpy.config_files.rst +22 -22
  434. quarchpy/docs/source/quarchpy.connection_specific.rst +76 -76
  435. quarchpy/docs/source/quarchpy.debug.rst +38 -38
  436. quarchpy/docs/source/quarchpy.device.rst +54 -54
  437. quarchpy/docs/source/quarchpy.disk_test.rst +126 -126
  438. quarchpy/docs/source/quarchpy.fio.rst +30 -30
  439. quarchpy/docs/source/quarchpy.iometer.rst +22 -22
  440. quarchpy/docs/source/quarchpy.qis.rst +22 -22
  441. quarchpy/docs/source/quarchpy.qps.rst +22 -22
  442. quarchpy/docs/source/quarchpy.rst +50 -50
  443. quarchpy/docs/source/quarchpy.user_interface.rst +22 -22
  444. quarchpy/docs/source/quarchpy.utilities.rst +22 -22
  445. quarchpy/fio/FIO_interface.py +0 -1
  446. quarchpy/fio/HIDEtest_performance_class.py +533 -533
  447. quarchpy/fio/__pycache__/FIO_interface.cpython-310.pyc +0 -0
  448. quarchpy/fio/__pycache__/__init__.cpython-310.pyc +0 -0
  449. quarchpy/iometer/__pycache__/__init__.cpython-310.pyc +0 -0
  450. quarchpy/iometer/__pycache__/{gen_iometer_template.cpython-312.pyc → gen_iometer_template.cpython-310.pyc} +0 -0
  451. quarchpy/iometer/__pycache__/iometerFuncs.cpython-310.pyc +0 -0
  452. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-310.pyc +0 -0
  453. quarchpy/qis/__pycache__/__init__.cpython-310.pyc +0 -0
  454. quarchpy/qis/__pycache__/qisFuncs.cpython-310.pyc +0 -0
  455. quarchpy/qis/qisFuncs.py +46 -51
  456. quarchpy/qps/__pycache__/__init__.cpython-310.pyc +0 -0
  457. quarchpy/qps/__pycache__/qpsFuncs.cpython-310.pyc +0 -0
  458. quarchpy/qps/qpsFuncs.py +10 -17
  459. quarchpy/run.py +3 -3
  460. quarchpy/user_interface/__pycache__/__init__.cpython-310.pyc +0 -0
  461. quarchpy/user_interface/__pycache__/user_interface.cpython-310.pyc +0 -0
  462. quarchpy/utilities/TestCenter.py +2 -2
  463. quarchpy/utilities/__pycache__/TestCenter.cpython-310.pyc +0 -0
  464. quarchpy/utilities/__pycache__/TimeValue.cpython-310.pyc +0 -0
  465. quarchpy/utilities/__pycache__/Version.cpython-310.pyc +0 -0
  466. quarchpy/utilities/__pycache__/__init__.cpython-310.pyc +0 -0
  467. {quarchpy-2.2.9.dev4.dist-info → quarchpy-2.2.9.dev5.dist-info}/METADATA +466 -466
  468. {quarchpy-2.2.9.dev4.dist-info → quarchpy-2.2.9.dev5.dist-info}/RECORD +473 -639
  469. {quarchpy-2.2.9.dev4.dist-info → quarchpy-2.2.9.dev5.dist-info}/WHEEL +1 -1
  470. quarchpy/.idea/.name +0 -1
  471. quarchpy/.idea/inspectionProfiles/Project_Default.xml +0 -50
  472. quarchpy/.idea/inspectionProfiles/profiles_settings.xml +0 -6
  473. quarchpy/.idea/misc.xml +0 -7
  474. quarchpy/.idea/modules.xml +0 -8
  475. quarchpy/.idea/quarchpy.iml +0 -12
  476. quarchpy/.idea/vcs.xml +0 -7
  477. quarchpy/.idea/workspace.xml +0 -273
  478. quarchpy/__pycache__/__init__.cpython-311.pyc +0 -0
  479. quarchpy/__pycache__/__init__.cpython-312.pyc +0 -0
  480. quarchpy/__pycache__/__init__.cpython-313.pyc +0 -0
  481. quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
  482. quarchpy/__pycache__/_version.cpython-312.pyc +0 -0
  483. quarchpy/__pycache__/_version.cpython-313.pyc +0 -0
  484. quarchpy/__pycache__/connection.cpython-311.pyc +0 -0
  485. quarchpy/__pycache__/connection.cpython-312.pyc +0 -0
  486. quarchpy/__pycache__/connection.cpython-313.pyc +0 -0
  487. quarchpy/__pycache__/run.cpython-311.pyc +0 -0
  488. quarchpy/__pycache__/run.cpython-312.pyc +0 -0
  489. quarchpy/config_files/__pycache__/__init__.cpython-311.pyc +0 -0
  490. quarchpy/config_files/__pycache__/__init__.cpython-312.pyc +0 -0
  491. quarchpy/config_files/__pycache__/__init__.cpython-313.pyc +0 -0
  492. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc +0 -0
  493. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-312.pyc +0 -0
  494. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-313.pyc +0 -0
  495. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/Material-Icons-license.txt +0 -51
  496. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/argparse4j-LICENSE.txt +0 -23
  497. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/com.sun.istack-license.html +0 -59
  498. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/commons-io-LICENSE-2.0.txt +0 -202
  499. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/controlsfx-license.txt +0 -29
  500. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.activation-license.html +0 -59
  501. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.xml.bind-api-license.html +0 -59
  502. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-LICENSE.txt +0 -202
  503. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-NOTICE.txt +0 -239
  504. quarchpy/connection_specific/QPS/win-amd64/InstallType.dat +0 -1
  505. quarchpy/connection_specific/QPS/win-amd64/app.properties +0 -6
  506. quarchpy/connection_specific/QPS/win-amd64/license.txt +0 -1
  507. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/com.sun.istack-license.html +0 -59
  508. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/dorkbox-LICENSE.Apachev2 +0 -218
  509. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-APACHE-2.0 +0 -202
  510. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-LGPL-3.0 +0 -165
  511. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.activation-license.html +0 -59
  512. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.xml.bind-api-license.html +0 -59
  513. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/javassist-License.html +0 -381
  514. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jmdns-LICENSE.txt +0 -202
  515. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jna-AL2.0 +0 -177
  516. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/kotlin-stdlib-LICENSE-2.0.txt +0 -202
  517. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-LICENSE.txt +0 -202
  518. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-NOTICE.txt +0 -239
  519. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/slf4j-LICENSE.txt +0 -24
  520. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/usb4java-LICENSE.md +0 -20
  521. quarchpy/connection_specific/QPS/win-amd64/qis/license.txt +0 -1
  522. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/TorridonCommon-1.1.jar +0 -0
  523. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jmdns-3.5.9.jar +0 -0
  524. quarchpy/connection_specific/QPS/win-amd64/qps_lib/commons-io-2.18.0.jar +0 -0
  525. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-base-21.0.6-linux-aarch64.jar +0 -0
  526. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-controls-21.0.6-linux-aarch64.jar +0 -0
  527. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-fxml-21.0.6-linux-aarch64.jar +0 -0
  528. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-graphics-21.0.6-linux-aarch64.jar +0 -0
  529. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-swing-21.0.6-linux-aarch64.jar +0 -0
  530. quarchpy/connection_specific/QPS/win-amd64/qps_lib/qutils-1.0.jar +0 -0
  531. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-311.pyc +0 -0
  532. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-312.pyc +0 -0
  533. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-313.pyc +0 -0
  534. quarchpy/connection_specific/__pycache__/__init__.cpython-311.pyc +0 -0
  535. quarchpy/connection_specific/__pycache__/__init__.cpython-312.pyc +0 -0
  536. quarchpy/connection_specific/__pycache__/__init__.cpython-313.pyc +0 -0
  537. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc +0 -0
  538. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-312.pyc +0 -0
  539. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-313.pyc +0 -0
  540. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-311.pyc +0 -0
  541. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-312.pyc +0 -0
  542. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-313.pyc +0 -0
  543. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-311.pyc +0 -0
  544. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-312.pyc +0 -0
  545. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-313.pyc +0 -0
  546. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-311.pyc +0 -0
  547. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-312.pyc +0 -0
  548. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-313.pyc +0 -0
  549. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-311.pyc +0 -0
  550. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-312.pyc +0 -0
  551. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-313.pyc +0 -0
  552. quarchpy/connection_specific/__pycache__/connection_USB.cpython-311.pyc +0 -0
  553. quarchpy/connection_specific/__pycache__/connection_USB.cpython-312.pyc +0 -0
  554. quarchpy/connection_specific/__pycache__/connection_USB.cpython-313.pyc +0 -0
  555. quarchpy/connection_specific/__pycache__/mDNS.cpython-311.pyc +0 -0
  556. quarchpy/connection_specific/__pycache__/mDNS.cpython-312.pyc +0 -0
  557. quarchpy/connection_specific/__pycache__/mDNS.cpython-313.pyc +0 -0
  558. quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-311.pyc +0 -0
  559. quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-312.pyc +0 -0
  560. quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-313.pyc +0 -0
  561. quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-311.pyc +0 -0
  562. quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-312.pyc +0 -0
  563. quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-313.pyc +0 -0
  564. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-311.pyc +0 -0
  565. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-312.pyc +0 -0
  566. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-313.pyc +0 -0
  567. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-311.pyc +0 -0
  568. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-312.pyc +0 -0
  569. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-313.pyc +0 -0
  570. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-311.pyc +0 -0
  571. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-312.pyc +0 -0
  572. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-313.pyc +0 -0
  573. quarchpy/connection_specific/serial/__pycache__/win32.cpython-311.pyc +0 -0
  574. quarchpy/connection_specific/serial/__pycache__/win32.cpython-312.pyc +0 -0
  575. quarchpy/connection_specific/serial/__pycache__/win32.cpython-313.pyc +0 -0
  576. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-311.pyc +0 -0
  577. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-312.pyc +0 -0
  578. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  579. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-311.pyc +0 -0
  580. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-312.pyc +0 -0
  581. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-313.pyc +0 -0
  582. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-311.pyc +0 -0
  583. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-312.pyc +0 -0
  584. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-313.pyc +0 -0
  585. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-311.pyc +0 -0
  586. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-312.pyc +0 -0
  587. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-313.pyc +0 -0
  588. quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-311.pyc +0 -0
  589. quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-312.pyc +0 -0
  590. quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-311.pyc +0 -0
  591. quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-312.pyc +0 -0
  592. quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc +0 -0
  593. quarchpy/debug/__pycache__/SystemTest.cpython-312.pyc +0 -0
  594. quarchpy/debug/__pycache__/SystemTest.cpython-313.pyc +0 -0
  595. quarchpy/debug/__pycache__/__init__.cpython-311.pyc +0 -0
  596. quarchpy/debug/__pycache__/__init__.cpython-312.pyc +0 -0
  597. quarchpy/debug/__pycache__/__init__.cpython-313.pyc +0 -0
  598. quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
  599. quarchpy/debug/__pycache__/module_debug.cpython-312.pyc +0 -0
  600. quarchpy/debug/__pycache__/module_debug.cpython-313.pyc +0 -0
  601. quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
  602. quarchpy/debug/__pycache__/simple_terminal.cpython-312.pyc +0 -0
  603. quarchpy/debug/__pycache__/simple_terminal.cpython-313.pyc +0 -0
  604. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
  605. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-312.pyc +0 -0
  606. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-313.pyc +0 -0
  607. quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc +0 -0
  608. quarchpy/debug/__pycache__/versionCompare.cpython-312.pyc +0 -0
  609. quarchpy/debug/__pycache__/versionCompare.cpython-313.pyc +0 -0
  610. quarchpy/device/__pycache__/__init__.cpython-311.pyc +0 -0
  611. quarchpy/device/__pycache__/__init__.cpython-312.pyc +0 -0
  612. quarchpy/device/__pycache__/__init__.cpython-313.pyc +0 -0
  613. quarchpy/device/__pycache__/device.cpython-311.pyc +0 -0
  614. quarchpy/device/__pycache__/device.cpython-312.pyc +0 -0
  615. quarchpy/device/__pycache__/device.cpython-313.pyc +0 -0
  616. quarchpy/device/__pycache__/quarchArray.cpython-311.pyc +0 -0
  617. quarchpy/device/__pycache__/quarchArray.cpython-312.pyc +0 -0
  618. quarchpy/device/__pycache__/quarchArray.cpython-313.pyc +0 -0
  619. quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc +0 -0
  620. quarchpy/device/__pycache__/quarchPPM.cpython-312.pyc +0 -0
  621. quarchpy/device/__pycache__/quarchPPM.cpython-313.pyc +0 -0
  622. quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc +0 -0
  623. quarchpy/device/__pycache__/quarchQPS.cpython-312.pyc +0 -0
  624. quarchpy/device/__pycache__/quarchQPS.cpython-313.pyc +0 -0
  625. quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
  626. quarchpy/device/__pycache__/scanDevices.cpython-312.pyc +0 -0
  627. quarchpy/device/__pycache__/scanDevices.cpython-313.pyc +0 -0
  628. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc +0 -0
  629. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-312.pyc +0 -0
  630. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-313.pyc +0 -0
  631. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc +0 -0
  632. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-312.pyc +0 -0
  633. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-313.pyc +0 -0
  634. quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc +0 -0
  635. quarchpy/disk_test/__pycache__/__init__.cpython-312.pyc +0 -0
  636. quarchpy/disk_test/__pycache__/__init__.cpython-313.pyc +0 -0
  637. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc +0 -0
  638. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-312.pyc +0 -0
  639. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-313.pyc +0 -0
  640. quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc +0 -0
  641. quarchpy/fio/__pycache__/FIO_interface.cpython-312.pyc +0 -0
  642. quarchpy/fio/__pycache__/FIO_interface.cpython-313.pyc +0 -0
  643. quarchpy/fio/__pycache__/__init__.cpython-311.pyc +0 -0
  644. quarchpy/fio/__pycache__/__init__.cpython-312.pyc +0 -0
  645. quarchpy/fio/__pycache__/__init__.cpython-313.pyc +0 -0
  646. quarchpy/fio/test_performance_class.py +0 -533
  647. quarchpy/iometer/__pycache__/__init__.cpython-311.pyc +0 -0
  648. quarchpy/iometer/__pycache__/__init__.cpython-312.pyc +0 -0
  649. quarchpy/iometer/__pycache__/__init__.cpython-313.pyc +0 -0
  650. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc +0 -0
  651. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-313.pyc +0 -0
  652. quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc +0 -0
  653. quarchpy/iometer/__pycache__/iometerFuncs.cpython-312.pyc +0 -0
  654. quarchpy/iometer/__pycache__/iometerFuncs.cpython-313.pyc +0 -0
  655. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc +0 -0
  656. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-312.pyc +0 -0
  657. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-313.pyc +0 -0
  658. quarchpy/qis/__pycache__/__init__.cpython-311.pyc +0 -0
  659. quarchpy/qis/__pycache__/__init__.cpython-312.pyc +0 -0
  660. quarchpy/qis/__pycache__/__init__.cpython-313.pyc +0 -0
  661. quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc +0 -0
  662. quarchpy/qis/__pycache__/qisFuncs.cpython-312.pyc +0 -0
  663. quarchpy/qis/__pycache__/qisFuncs.cpython-313.pyc +0 -0
  664. quarchpy/qps/__pycache__/__init__.cpython-311.pyc +0 -0
  665. quarchpy/qps/__pycache__/__init__.cpython-312.pyc +0 -0
  666. quarchpy/qps/__pycache__/__init__.cpython-313.pyc +0 -0
  667. quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
  668. quarchpy/qps/__pycache__/qpsFuncs.cpython-312.pyc +0 -0
  669. quarchpy/qps/__pycache__/qpsFuncs.cpython-313.pyc +0 -0
  670. quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc +0 -0
  671. quarchpy/user_interface/__pycache__/__init__.cpython-312.pyc +0 -0
  672. quarchpy/user_interface/__pycache__/__init__.cpython-313.pyc +0 -0
  673. quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc +0 -0
  674. quarchpy/user_interface/__pycache__/user_interface.cpython-312.pyc +0 -0
  675. quarchpy/user_interface/__pycache__/user_interface.cpython-313.pyc +0 -0
  676. quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc +0 -0
  677. quarchpy/utilities/__pycache__/TestCenter.cpython-312.pyc +0 -0
  678. quarchpy/utilities/__pycache__/TestCenter.cpython-313.pyc +0 -0
  679. quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc +0 -0
  680. quarchpy/utilities/__pycache__/TimeValue.cpython-312.pyc +0 -0
  681. quarchpy/utilities/__pycache__/TimeValue.cpython-313.pyc +0 -0
  682. quarchpy/utilities/__pycache__/Version.cpython-311.pyc +0 -0
  683. quarchpy/utilities/__pycache__/Version.cpython-312.pyc +0 -0
  684. quarchpy/utilities/__pycache__/Version.cpython-313.pyc +0 -0
  685. quarchpy/utilities/__pycache__/__init__.cpython-311.pyc +0 -0
  686. quarchpy/utilities/__pycache__/__init__.cpython-312.pyc +0 -0
  687. quarchpy/utilities/__pycache__/__init__.cpython-313.pyc +0 -0
  688. /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL1995-02.xml → QTL1995-02.XML} +0 -0
  689. /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL1999-02.xml → QTL1999-02.XML} +0 -0
  690. /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL2312-01.xml → QTL2312-01.XML} +0 -0
  691. {quarchpy-2.2.9.dev4.dist-info → quarchpy-2.2.9.dev5.dist-info}/top_level.txt +0 -0
@@ -1,632 +1,632 @@
1
- /*
2
- * Sphinx JavaScript utilities for the full-text search.
3
- */
4
- "use strict";
5
-
6
- /**
7
- * Simple result scoring code.
8
- */
9
- if (typeof Scorer === "undefined") {
10
- var Scorer = {
11
- // Implement the following function to further tweak the score for each result
12
- // The function takes a result array [docname, title, anchor, descr, score, filename]
13
- // and returns the new score.
14
- /*
15
- score: result => {
16
- const [docname, title, anchor, descr, score, filename, kind] = result
17
- return score
18
- },
19
- */
20
-
21
- // query matches the full name of an object
22
- objNameMatch: 11,
23
- // or matches in the last dotted part of the object name
24
- objPartialMatch: 6,
25
- // Additive scores depending on the priority of the object
26
- objPrio: {
27
- 0: 15, // used to be importantResults
28
- 1: 5, // used to be objectResults
29
- 2: -5, // used to be unimportantResults
30
- },
31
- // Used when the priority is not in the mapping.
32
- objPrioDefault: 0,
33
-
34
- // query found in title
35
- title: 15,
36
- partialTitle: 7,
37
- // query found in terms
38
- term: 5,
39
- partialTerm: 2,
40
- };
41
- }
42
-
43
- // Global search result kind enum, used by themes to style search results.
44
- class SearchResultKind {
45
- static get index() { return "index"; }
46
- static get object() { return "object"; }
47
- static get text() { return "text"; }
48
- static get title() { return "title"; }
49
- }
50
-
51
- const _removeChildren = (element) => {
52
- while (element && element.lastChild) element.removeChild(element.lastChild);
53
- };
54
-
55
- /**
56
- * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
57
- */
58
- const _escapeRegExp = (string) =>
59
- string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
60
-
61
- const _displayItem = (item, searchTerms, highlightTerms) => {
62
- const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
63
- const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
64
- const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
65
- const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
66
- const contentRoot = document.documentElement.dataset.content_root;
67
-
68
- const [docName, title, anchor, descr, score, _filename, kind] = item;
69
-
70
- let listItem = document.createElement("li");
71
- // Add a class representing the item's type:
72
- // can be used by a theme's CSS selector for styling
73
- // See SearchResultKind for the class names.
74
- listItem.classList.add(`kind-${kind}`);
75
- let requestUrl;
76
- let linkUrl;
77
- if (docBuilder === "dirhtml") {
78
- // dirhtml builder
79
- let dirname = docName + "/";
80
- if (dirname.match(/\/index\/$/))
81
- dirname = dirname.substring(0, dirname.length - 6);
82
- else if (dirname === "index/") dirname = "";
83
- requestUrl = contentRoot + dirname;
84
- linkUrl = requestUrl;
85
- } else {
86
- // normal html builders
87
- requestUrl = contentRoot + docName + docFileSuffix;
88
- linkUrl = docName + docLinkSuffix;
89
- }
90
- let linkEl = listItem.appendChild(document.createElement("a"));
91
- linkEl.href = linkUrl + anchor;
92
- linkEl.dataset.score = score;
93
- linkEl.innerHTML = title;
94
- if (descr) {
95
- listItem.appendChild(document.createElement("span")).innerHTML =
96
- " (" + descr + ")";
97
- // highlight search terms in the description
98
- if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
99
- highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
100
- }
101
- else if (showSearchSummary)
102
- fetch(requestUrl)
103
- .then((responseData) => responseData.text())
104
- .then((data) => {
105
- if (data)
106
- listItem.appendChild(
107
- Search.makeSearchSummary(data, searchTerms, anchor)
108
- );
109
- // highlight search terms in the summary
110
- if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
111
- highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
112
- });
113
- Search.output.appendChild(listItem);
114
- };
115
- const _finishSearch = (resultCount) => {
116
- Search.stopPulse();
117
- Search.title.innerText = _("Search Results");
118
- if (!resultCount)
119
- Search.status.innerText = Documentation.gettext(
120
- "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
121
- );
122
- else
123
- Search.status.innerText = Documentation.ngettext(
124
- "Search finished, found one page matching the search query.",
125
- "Search finished, found ${resultCount} pages matching the search query.",
126
- resultCount,
127
- ).replace('${resultCount}', resultCount);
128
- };
129
- const _displayNextItem = (
130
- results,
131
- resultCount,
132
- searchTerms,
133
- highlightTerms,
134
- ) => {
135
- // results left, load the summary and display it
136
- // this is intended to be dynamic (don't sub resultsCount)
137
- if (results.length) {
138
- _displayItem(results.pop(), searchTerms, highlightTerms);
139
- setTimeout(
140
- () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
141
- 5
142
- );
143
- }
144
- // search finished, update title and status message
145
- else _finishSearch(resultCount);
146
- };
147
- // Helper function used by query() to order search results.
148
- // Each input is an array of [docname, title, anchor, descr, score, filename, kind].
149
- // Order the results by score (in opposite order of appearance, since the
150
- // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
151
- const _orderResultsByScoreThenName = (a, b) => {
152
- const leftScore = a[4];
153
- const rightScore = b[4];
154
- if (leftScore === rightScore) {
155
- // same score: sort alphabetically
156
- const leftTitle = a[1].toLowerCase();
157
- const rightTitle = b[1].toLowerCase();
158
- if (leftTitle === rightTitle) return 0;
159
- return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
160
- }
161
- return leftScore > rightScore ? 1 : -1;
162
- };
163
-
164
- /**
165
- * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
166
- * custom function per language.
167
- *
168
- * The regular expression works by splitting the string on consecutive characters
169
- * that are not Unicode letters, numbers, underscores, or emoji characters.
170
- * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
171
- */
172
- if (typeof splitQuery === "undefined") {
173
- var splitQuery = (query) => query
174
- .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
175
- .filter(term => term) // remove remaining empty strings
176
- }
177
-
178
- /**
179
- * Search Module
180
- */
181
- const Search = {
182
- _index: null,
183
- _queued_query: null,
184
- _pulse_status: -1,
185
-
186
- htmlToText: (htmlString, anchor) => {
187
- const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
188
- for (const removalQuery of [".headerlink", "script", "style"]) {
189
- htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
190
- }
191
- if (anchor) {
192
- const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
193
- if (anchorContent) return anchorContent.textContent;
194
-
195
- console.warn(
196
- `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
197
- );
198
- }
199
-
200
- // if anchor not specified or not found, fall back to main content
201
- const docContent = htmlElement.querySelector('[role="main"]');
202
- if (docContent) return docContent.textContent;
203
-
204
- console.warn(
205
- "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
206
- );
207
- return "";
208
- },
209
-
210
- init: () => {
211
- const query = new URLSearchParams(window.location.search).get("q");
212
- document
213
- .querySelectorAll('input[name="q"]')
214
- .forEach((el) => (el.value = query));
215
- if (query) Search.performSearch(query);
216
- },
217
-
218
- loadIndex: (url) =>
219
- (document.body.appendChild(document.createElement("script")).src = url),
220
-
221
- setIndex: (index) => {
222
- Search._index = index;
223
- if (Search._queued_query !== null) {
224
- const query = Search._queued_query;
225
- Search._queued_query = null;
226
- Search.query(query);
227
- }
228
- },
229
-
230
- hasIndex: () => Search._index !== null,
231
-
232
- deferQuery: (query) => (Search._queued_query = query),
233
-
234
- stopPulse: () => (Search._pulse_status = -1),
235
-
236
- startPulse: () => {
237
- if (Search._pulse_status >= 0) return;
238
-
239
- const pulse = () => {
240
- Search._pulse_status = (Search._pulse_status + 1) % 4;
241
- Search.dots.innerText = ".".repeat(Search._pulse_status);
242
- if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
243
- };
244
- pulse();
245
- },
246
-
247
- /**
248
- * perform a search for something (or wait until index is loaded)
249
- */
250
- performSearch: (query) => {
251
- // create the required interface elements
252
- const searchText = document.createElement("h2");
253
- searchText.textContent = _("Searching");
254
- const searchSummary = document.createElement("p");
255
- searchSummary.classList.add("search-summary");
256
- searchSummary.innerText = "";
257
- const searchList = document.createElement("ul");
258
- searchList.setAttribute("role", "list");
259
- searchList.classList.add("search");
260
-
261
- const out = document.getElementById("search-results");
262
- Search.title = out.appendChild(searchText);
263
- Search.dots = Search.title.appendChild(document.createElement("span"));
264
- Search.status = out.appendChild(searchSummary);
265
- Search.output = out.appendChild(searchList);
266
-
267
- const searchProgress = document.getElementById("search-progress");
268
- // Some themes don't use the search progress node
269
- if (searchProgress) {
270
- searchProgress.innerText = _("Preparing search...");
271
- }
272
- Search.startPulse();
273
-
274
- // index already loaded, the browser was quick!
275
- if (Search.hasIndex()) Search.query(query);
276
- else Search.deferQuery(query);
277
- },
278
-
279
- _parseQuery: (query) => {
280
- // stem the search terms and add them to the correct list
281
- const stemmer = new Stemmer();
282
- const searchTerms = new Set();
283
- const excludedTerms = new Set();
284
- const highlightTerms = new Set();
285
- const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
286
- splitQuery(query.trim()).forEach((queryTerm) => {
287
- const queryTermLower = queryTerm.toLowerCase();
288
-
289
- // maybe skip this "word"
290
- // stopwords array is from language_data.js
291
- if (
292
- stopwords.indexOf(queryTermLower) !== -1 ||
293
- queryTerm.match(/^\d+$/)
294
- )
295
- return;
296
-
297
- // stem the word
298
- let word = stemmer.stemWord(queryTermLower);
299
- // select the correct list
300
- if (word[0] === "-") excludedTerms.add(word.substr(1));
301
- else {
302
- searchTerms.add(word);
303
- highlightTerms.add(queryTermLower);
304
- }
305
- });
306
-
307
- if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
308
- localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
309
- }
310
-
311
- // console.debug("SEARCH: searching for:");
312
- // console.info("required: ", [...searchTerms]);
313
- // console.info("excluded: ", [...excludedTerms]);
314
-
315
- return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
316
- },
317
-
318
- /**
319
- * execute search (requires search index to be loaded)
320
- */
321
- _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
322
- const filenames = Search._index.filenames;
323
- const docNames = Search._index.docnames;
324
- const titles = Search._index.titles;
325
- const allTitles = Search._index.alltitles;
326
- const indexEntries = Search._index.indexentries;
327
-
328
- // Collect multiple result groups to be sorted separately and then ordered.
329
- // Each is an array of [docname, title, anchor, descr, score, filename, kind].
330
- const normalResults = [];
331
- const nonMainIndexResults = [];
332
-
333
- _removeChildren(document.getElementById("search-progress"));
334
-
335
- const queryLower = query.toLowerCase().trim();
336
- for (const [title, foundTitles] of Object.entries(allTitles)) {
337
- if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
338
- for (const [file, id] of foundTitles) {
339
- const score = Math.round(Scorer.title * queryLower.length / title.length);
340
- const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
341
- normalResults.push([
342
- docNames[file],
343
- titles[file] !== title ? `${titles[file]} > ${title}` : title,
344
- id !== null ? "#" + id : "",
345
- null,
346
- score + boost,
347
- filenames[file],
348
- SearchResultKind.title,
349
- ]);
350
- }
351
- }
352
- }
353
-
354
- // search for explicit entries in index directives
355
- for (const [entry, foundEntries] of Object.entries(indexEntries)) {
356
- if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
357
- for (const [file, id, isMain] of foundEntries) {
358
- const score = Math.round(100 * queryLower.length / entry.length);
359
- const result = [
360
- docNames[file],
361
- titles[file],
362
- id ? "#" + id : "",
363
- null,
364
- score,
365
- filenames[file],
366
- SearchResultKind.index,
367
- ];
368
- if (isMain) {
369
- normalResults.push(result);
370
- } else {
371
- nonMainIndexResults.push(result);
372
- }
373
- }
374
- }
375
- }
376
-
377
- // lookup as object
378
- objectTerms.forEach((term) =>
379
- normalResults.push(...Search.performObjectSearch(term, objectTerms))
380
- );
381
-
382
- // lookup as search terms in fulltext
383
- normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
384
-
385
- // let the scorer override scores with a custom scoring function
386
- if (Scorer.score) {
387
- normalResults.forEach((item) => (item[4] = Scorer.score(item)));
388
- nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
389
- }
390
-
391
- // Sort each group of results by score and then alphabetically by name.
392
- normalResults.sort(_orderResultsByScoreThenName);
393
- nonMainIndexResults.sort(_orderResultsByScoreThenName);
394
-
395
- // Combine the result groups in (reverse) order.
396
- // Non-main index entries are typically arbitrary cross-references,
397
- // so display them after other results.
398
- let results = [...nonMainIndexResults, ...normalResults];
399
-
400
- // remove duplicate search results
401
- // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
402
- let seen = new Set();
403
- results = results.reverse().reduce((acc, result) => {
404
- let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
405
- if (!seen.has(resultStr)) {
406
- acc.push(result);
407
- seen.add(resultStr);
408
- }
409
- return acc;
410
- }, []);
411
-
412
- return results.reverse();
413
- },
414
-
415
- query: (query) => {
416
- const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
417
- const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
418
-
419
- // for debugging
420
- //Search.lastresults = results.slice(); // a copy
421
- // console.info("search results:", Search.lastresults);
422
-
423
- // print the results
424
- _displayNextItem(results, results.length, searchTerms, highlightTerms);
425
- },
426
-
427
- /**
428
- * search for object names
429
- */
430
- performObjectSearch: (object, objectTerms) => {
431
- const filenames = Search._index.filenames;
432
- const docNames = Search._index.docnames;
433
- const objects = Search._index.objects;
434
- const objNames = Search._index.objnames;
435
- const titles = Search._index.titles;
436
-
437
- const results = [];
438
-
439
- const objectSearchCallback = (prefix, match) => {
440
- const name = match[4]
441
- const fullname = (prefix ? prefix + "." : "") + name;
442
- const fullnameLower = fullname.toLowerCase();
443
- if (fullnameLower.indexOf(object) < 0) return;
444
-
445
- let score = 0;
446
- const parts = fullnameLower.split(".");
447
-
448
- // check for different match types: exact matches of full name or
449
- // "last name" (i.e. last dotted part)
450
- if (fullnameLower === object || parts.slice(-1)[0] === object)
451
- score += Scorer.objNameMatch;
452
- else if (parts.slice(-1)[0].indexOf(object) > -1)
453
- score += Scorer.objPartialMatch; // matches in last name
454
-
455
- const objName = objNames[match[1]][2];
456
- const title = titles[match[0]];
457
-
458
- // If more than one term searched for, we require other words to be
459
- // found in the name/title/description
460
- const otherTerms = new Set(objectTerms);
461
- otherTerms.delete(object);
462
- if (otherTerms.size > 0) {
463
- const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
464
- if (
465
- [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
466
- )
467
- return;
468
- }
469
-
470
- let anchor = match[3];
471
- if (anchor === "") anchor = fullname;
472
- else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
473
-
474
- const descr = objName + _(", in ") + title;
475
-
476
- // add custom score for some objects according to scorer
477
- if (Scorer.objPrio.hasOwnProperty(match[2]))
478
- score += Scorer.objPrio[match[2]];
479
- else score += Scorer.objPrioDefault;
480
-
481
- results.push([
482
- docNames[match[0]],
483
- fullname,
484
- "#" + anchor,
485
- descr,
486
- score,
487
- filenames[match[0]],
488
- SearchResultKind.object,
489
- ]);
490
- };
491
- Object.keys(objects).forEach((prefix) =>
492
- objects[prefix].forEach((array) =>
493
- objectSearchCallback(prefix, array)
494
- )
495
- );
496
- return results;
497
- },
498
-
499
- /**
500
- * search for full-text terms in the index
501
- */
502
- performTermsSearch: (searchTerms, excludedTerms) => {
503
- // prepare search
504
- const terms = Search._index.terms;
505
- const titleTerms = Search._index.titleterms;
506
- const filenames = Search._index.filenames;
507
- const docNames = Search._index.docnames;
508
- const titles = Search._index.titles;
509
-
510
- const scoreMap = new Map();
511
- const fileMap = new Map();
512
-
513
- // perform the search on the required terms
514
- searchTerms.forEach((word) => {
515
- const files = [];
516
- const arr = [
517
- { files: terms[word], score: Scorer.term },
518
- { files: titleTerms[word], score: Scorer.title },
519
- ];
520
- // add support for partial matches
521
- if (word.length > 2) {
522
- const escapedWord = _escapeRegExp(word);
523
- if (!terms.hasOwnProperty(word)) {
524
- Object.keys(terms).forEach((term) => {
525
- if (term.match(escapedWord))
526
- arr.push({ files: terms[term], score: Scorer.partialTerm });
527
- });
528
- }
529
- if (!titleTerms.hasOwnProperty(word)) {
530
- Object.keys(titleTerms).forEach((term) => {
531
- if (term.match(escapedWord))
532
- arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
533
- });
534
- }
535
- }
536
-
537
- // no match but word was a required one
538
- if (arr.every((record) => record.files === undefined)) return;
539
-
540
- // found search word in contents
541
- arr.forEach((record) => {
542
- if (record.files === undefined) return;
543
-
544
- let recordFiles = record.files;
545
- if (recordFiles.length === undefined) recordFiles = [recordFiles];
546
- files.push(...recordFiles);
547
-
548
- // set score for the word in each file
549
- recordFiles.forEach((file) => {
550
- if (!scoreMap.has(file)) scoreMap.set(file, {});
551
- scoreMap.get(file)[word] = record.score;
552
- });
553
- });
554
-
555
- // create the mapping
556
- files.forEach((file) => {
557
- if (!fileMap.has(file)) fileMap.set(file, [word]);
558
- else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
559
- });
560
- });
561
-
562
- // now check if the files don't contain excluded terms
563
- const results = [];
564
- for (const [file, wordList] of fileMap) {
565
- // check if all requirements are matched
566
-
567
- // as search terms with length < 3 are discarded
568
- const filteredTermCount = [...searchTerms].filter(
569
- (term) => term.length > 2
570
- ).length;
571
- if (
572
- wordList.length !== searchTerms.size &&
573
- wordList.length !== filteredTermCount
574
- )
575
- continue;
576
-
577
- // ensure that none of the excluded terms is in the search result
578
- if (
579
- [...excludedTerms].some(
580
- (term) =>
581
- terms[term] === file ||
582
- titleTerms[term] === file ||
583
- (terms[term] || []).includes(file) ||
584
- (titleTerms[term] || []).includes(file)
585
- )
586
- )
587
- break;
588
-
589
- // select one (max) score for the file.
590
- const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
591
- // add result to the result list
592
- results.push([
593
- docNames[file],
594
- titles[file],
595
- "",
596
- null,
597
- score,
598
- filenames[file],
599
- SearchResultKind.text,
600
- ]);
601
- }
602
- return results;
603
- },
604
-
605
- /**
606
- * helper function to return a node containing the
607
- * search summary for a given text. keywords is a list
608
- * of stemmed words.
609
- */
610
- makeSearchSummary: (htmlText, keywords, anchor) => {
611
- const text = Search.htmlToText(htmlText, anchor);
612
- if (text === "") return null;
613
-
614
- const textLower = text.toLowerCase();
615
- const actualStartPosition = [...keywords]
616
- .map((k) => textLower.indexOf(k.toLowerCase()))
617
- .filter((i) => i > -1)
618
- .slice(-1)[0];
619
- const startWithContext = Math.max(actualStartPosition - 120, 0);
620
-
621
- const top = startWithContext === 0 ? "" : "...";
622
- const tail = startWithContext + 240 < text.length ? "..." : "";
623
-
624
- let summary = document.createElement("p");
625
- summary.classList.add("context");
626
- summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
627
-
628
- return summary;
629
- },
630
- };
631
-
632
- _ready(Search.init);
1
+ /*
2
+ * Sphinx JavaScript utilities for the full-text search.
3
+ */
4
+ "use strict";
5
+
6
+ /**
7
+ * Simple result scoring code.
8
+ */
9
+ if (typeof Scorer === "undefined") {
10
+ var Scorer = {
11
+ // Implement the following function to further tweak the score for each result
12
+ // The function takes a result array [docname, title, anchor, descr, score, filename]
13
+ // and returns the new score.
14
+ /*
15
+ score: result => {
16
+ const [docname, title, anchor, descr, score, filename, kind] = result
17
+ return score
18
+ },
19
+ */
20
+
21
+ // query matches the full name of an object
22
+ objNameMatch: 11,
23
+ // or matches in the last dotted part of the object name
24
+ objPartialMatch: 6,
25
+ // Additive scores depending on the priority of the object
26
+ objPrio: {
27
+ 0: 15, // used to be importantResults
28
+ 1: 5, // used to be objectResults
29
+ 2: -5, // used to be unimportantResults
30
+ },
31
+ // Used when the priority is not in the mapping.
32
+ objPrioDefault: 0,
33
+
34
+ // query found in title
35
+ title: 15,
36
+ partialTitle: 7,
37
+ // query found in terms
38
+ term: 5,
39
+ partialTerm: 2,
40
+ };
41
+ }
42
+
43
+ // Global search result kind enum, used by themes to style search results.
44
+ class SearchResultKind {
45
+ static get index() { return "index"; }
46
+ static get object() { return "object"; }
47
+ static get text() { return "text"; }
48
+ static get title() { return "title"; }
49
+ }
50
+
51
+ const _removeChildren = (element) => {
52
+ while (element && element.lastChild) element.removeChild(element.lastChild);
53
+ };
54
+
55
+ /**
56
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
57
+ */
58
+ const _escapeRegExp = (string) =>
59
+ string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
60
+
61
+ const _displayItem = (item, searchTerms, highlightTerms) => {
62
+ const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
63
+ const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
64
+ const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
65
+ const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
66
+ const contentRoot = document.documentElement.dataset.content_root;
67
+
68
+ const [docName, title, anchor, descr, score, _filename, kind] = item;
69
+
70
+ let listItem = document.createElement("li");
71
+ // Add a class representing the item's type:
72
+ // can be used by a theme's CSS selector for styling
73
+ // See SearchResultKind for the class names.
74
+ listItem.classList.add(`kind-${kind}`);
75
+ let requestUrl;
76
+ let linkUrl;
77
+ if (docBuilder === "dirhtml") {
78
+ // dirhtml builder
79
+ let dirname = docName + "/";
80
+ if (dirname.match(/\/index\/$/))
81
+ dirname = dirname.substring(0, dirname.length - 6);
82
+ else if (dirname === "index/") dirname = "";
83
+ requestUrl = contentRoot + dirname;
84
+ linkUrl = requestUrl;
85
+ } else {
86
+ // normal html builders
87
+ requestUrl = contentRoot + docName + docFileSuffix;
88
+ linkUrl = docName + docLinkSuffix;
89
+ }
90
+ let linkEl = listItem.appendChild(document.createElement("a"));
91
+ linkEl.href = linkUrl + anchor;
92
+ linkEl.dataset.score = score;
93
+ linkEl.innerHTML = title;
94
+ if (descr) {
95
+ listItem.appendChild(document.createElement("span")).innerHTML =
96
+ " (" + descr + ")";
97
+ // highlight search terms in the description
98
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
99
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
100
+ }
101
+ else if (showSearchSummary)
102
+ fetch(requestUrl)
103
+ .then((responseData) => responseData.text())
104
+ .then((data) => {
105
+ if (data)
106
+ listItem.appendChild(
107
+ Search.makeSearchSummary(data, searchTerms, anchor)
108
+ );
109
+ // highlight search terms in the summary
110
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
111
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
112
+ });
113
+ Search.output.appendChild(listItem);
114
+ };
115
+ const _finishSearch = (resultCount) => {
116
+ Search.stopPulse();
117
+ Search.title.innerText = _("Search Results");
118
+ if (!resultCount)
119
+ Search.status.innerText = Documentation.gettext(
120
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
121
+ );
122
+ else
123
+ Search.status.innerText = Documentation.ngettext(
124
+ "Search finished, found one page matching the search query.",
125
+ "Search finished, found ${resultCount} pages matching the search query.",
126
+ resultCount,
127
+ ).replace('${resultCount}', resultCount);
128
+ };
129
+ const _displayNextItem = (
130
+ results,
131
+ resultCount,
132
+ searchTerms,
133
+ highlightTerms,
134
+ ) => {
135
+ // results left, load the summary and display it
136
+ // this is intended to be dynamic (don't sub resultsCount)
137
+ if (results.length) {
138
+ _displayItem(results.pop(), searchTerms, highlightTerms);
139
+ setTimeout(
140
+ () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
141
+ 5
142
+ );
143
+ }
144
+ // search finished, update title and status message
145
+ else _finishSearch(resultCount);
146
+ };
147
+ // Helper function used by query() to order search results.
148
+ // Each input is an array of [docname, title, anchor, descr, score, filename, kind].
149
+ // Order the results by score (in opposite order of appearance, since the
150
+ // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
151
+ const _orderResultsByScoreThenName = (a, b) => {
152
+ const leftScore = a[4];
153
+ const rightScore = b[4];
154
+ if (leftScore === rightScore) {
155
+ // same score: sort alphabetically
156
+ const leftTitle = a[1].toLowerCase();
157
+ const rightTitle = b[1].toLowerCase();
158
+ if (leftTitle === rightTitle) return 0;
159
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
160
+ }
161
+ return leftScore > rightScore ? 1 : -1;
162
+ };
163
+
164
+ /**
165
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
166
+ * custom function per language.
167
+ *
168
+ * The regular expression works by splitting the string on consecutive characters
169
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
170
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
171
+ */
172
+ if (typeof splitQuery === "undefined") {
173
+ var splitQuery = (query) => query
174
+ .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
175
+ .filter(term => term) // remove remaining empty strings
176
+ }
177
+
178
+ /**
179
+ * Search Module
180
+ */
181
+ const Search = {
182
+ _index: null,
183
+ _queued_query: null,
184
+ _pulse_status: -1,
185
+
186
+ htmlToText: (htmlString, anchor) => {
187
+ const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
188
+ for (const removalQuery of [".headerlink", "script", "style"]) {
189
+ htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
190
+ }
191
+ if (anchor) {
192
+ const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
193
+ if (anchorContent) return anchorContent.textContent;
194
+
195
+ console.warn(
196
+ `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
197
+ );
198
+ }
199
+
200
+ // if anchor not specified or not found, fall back to main content
201
+ const docContent = htmlElement.querySelector('[role="main"]');
202
+ if (docContent) return docContent.textContent;
203
+
204
+ console.warn(
205
+ "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
206
+ );
207
+ return "";
208
+ },
209
+
210
+ init: () => {
211
+ const query = new URLSearchParams(window.location.search).get("q");
212
+ document
213
+ .querySelectorAll('input[name="q"]')
214
+ .forEach((el) => (el.value = query));
215
+ if (query) Search.performSearch(query);
216
+ },
217
+
218
+ loadIndex: (url) =>
219
+ (document.body.appendChild(document.createElement("script")).src = url),
220
+
221
+ setIndex: (index) => {
222
+ Search._index = index;
223
+ if (Search._queued_query !== null) {
224
+ const query = Search._queued_query;
225
+ Search._queued_query = null;
226
+ Search.query(query);
227
+ }
228
+ },
229
+
230
+ hasIndex: () => Search._index !== null,
231
+
232
+ deferQuery: (query) => (Search._queued_query = query),
233
+
234
+ stopPulse: () => (Search._pulse_status = -1),
235
+
236
+ startPulse: () => {
237
+ if (Search._pulse_status >= 0) return;
238
+
239
+ const pulse = () => {
240
+ Search._pulse_status = (Search._pulse_status + 1) % 4;
241
+ Search.dots.innerText = ".".repeat(Search._pulse_status);
242
+ if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
243
+ };
244
+ pulse();
245
+ },
246
+
247
+ /**
248
+ * perform a search for something (or wait until index is loaded)
249
+ */
250
+ performSearch: (query) => {
251
+ // create the required interface elements
252
+ const searchText = document.createElement("h2");
253
+ searchText.textContent = _("Searching");
254
+ const searchSummary = document.createElement("p");
255
+ searchSummary.classList.add("search-summary");
256
+ searchSummary.innerText = "";
257
+ const searchList = document.createElement("ul");
258
+ searchList.setAttribute("role", "list");
259
+ searchList.classList.add("search");
260
+
261
+ const out = document.getElementById("search-results");
262
+ Search.title = out.appendChild(searchText);
263
+ Search.dots = Search.title.appendChild(document.createElement("span"));
264
+ Search.status = out.appendChild(searchSummary);
265
+ Search.output = out.appendChild(searchList);
266
+
267
+ const searchProgress = document.getElementById("search-progress");
268
+ // Some themes don't use the search progress node
269
+ if (searchProgress) {
270
+ searchProgress.innerText = _("Preparing search...");
271
+ }
272
+ Search.startPulse();
273
+
274
+ // index already loaded, the browser was quick!
275
+ if (Search.hasIndex()) Search.query(query);
276
+ else Search.deferQuery(query);
277
+ },
278
+
279
+ _parseQuery: (query) => {
280
+ // stem the search terms and add them to the correct list
281
+ const stemmer = new Stemmer();
282
+ const searchTerms = new Set();
283
+ const excludedTerms = new Set();
284
+ const highlightTerms = new Set();
285
+ const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
286
+ splitQuery(query.trim()).forEach((queryTerm) => {
287
+ const queryTermLower = queryTerm.toLowerCase();
288
+
289
+ // maybe skip this "word"
290
+ // stopwords array is from language_data.js
291
+ if (
292
+ stopwords.indexOf(queryTermLower) !== -1 ||
293
+ queryTerm.match(/^\d+$/)
294
+ )
295
+ return;
296
+
297
+ // stem the word
298
+ let word = stemmer.stemWord(queryTermLower);
299
+ // select the correct list
300
+ if (word[0] === "-") excludedTerms.add(word.substr(1));
301
+ else {
302
+ searchTerms.add(word);
303
+ highlightTerms.add(queryTermLower);
304
+ }
305
+ });
306
+
307
+ if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
308
+ localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
309
+ }
310
+
311
+ // console.debug("SEARCH: searching for:");
312
+ // console.info("required: ", [...searchTerms]);
313
+ // console.info("excluded: ", [...excludedTerms]);
314
+
315
+ return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
316
+ },
317
+
318
+ /**
319
+ * execute search (requires search index to be loaded)
320
+ */
321
+ _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
322
+ const filenames = Search._index.filenames;
323
+ const docNames = Search._index.docnames;
324
+ const titles = Search._index.titles;
325
+ const allTitles = Search._index.alltitles;
326
+ const indexEntries = Search._index.indexentries;
327
+
328
+ // Collect multiple result groups to be sorted separately and then ordered.
329
+ // Each is an array of [docname, title, anchor, descr, score, filename, kind].
330
+ const normalResults = [];
331
+ const nonMainIndexResults = [];
332
+
333
+ _removeChildren(document.getElementById("search-progress"));
334
+
335
+ const queryLower = query.toLowerCase().trim();
336
+ for (const [title, foundTitles] of Object.entries(allTitles)) {
337
+ if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
338
+ for (const [file, id] of foundTitles) {
339
+ const score = Math.round(Scorer.title * queryLower.length / title.length);
340
+ const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
341
+ normalResults.push([
342
+ docNames[file],
343
+ titles[file] !== title ? `${titles[file]} > ${title}` : title,
344
+ id !== null ? "#" + id : "",
345
+ null,
346
+ score + boost,
347
+ filenames[file],
348
+ SearchResultKind.title,
349
+ ]);
350
+ }
351
+ }
352
+ }
353
+
354
+ // search for explicit entries in index directives
355
+ for (const [entry, foundEntries] of Object.entries(indexEntries)) {
356
+ if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
357
+ for (const [file, id, isMain] of foundEntries) {
358
+ const score = Math.round(100 * queryLower.length / entry.length);
359
+ const result = [
360
+ docNames[file],
361
+ titles[file],
362
+ id ? "#" + id : "",
363
+ null,
364
+ score,
365
+ filenames[file],
366
+ SearchResultKind.index,
367
+ ];
368
+ if (isMain) {
369
+ normalResults.push(result);
370
+ } else {
371
+ nonMainIndexResults.push(result);
372
+ }
373
+ }
374
+ }
375
+ }
376
+
377
+ // lookup as object
378
+ objectTerms.forEach((term) =>
379
+ normalResults.push(...Search.performObjectSearch(term, objectTerms))
380
+ );
381
+
382
+ // lookup as search terms in fulltext
383
+ normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
384
+
385
+ // let the scorer override scores with a custom scoring function
386
+ if (Scorer.score) {
387
+ normalResults.forEach((item) => (item[4] = Scorer.score(item)));
388
+ nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
389
+ }
390
+
391
+ // Sort each group of results by score and then alphabetically by name.
392
+ normalResults.sort(_orderResultsByScoreThenName);
393
+ nonMainIndexResults.sort(_orderResultsByScoreThenName);
394
+
395
+ // Combine the result groups in (reverse) order.
396
+ // Non-main index entries are typically arbitrary cross-references,
397
+ // so display them after other results.
398
+ let results = [...nonMainIndexResults, ...normalResults];
399
+
400
+ // remove duplicate search results
401
+ // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
402
+ let seen = new Set();
403
+ results = results.reverse().reduce((acc, result) => {
404
+ let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
405
+ if (!seen.has(resultStr)) {
406
+ acc.push(result);
407
+ seen.add(resultStr);
408
+ }
409
+ return acc;
410
+ }, []);
411
+
412
+ return results.reverse();
413
+ },
414
+
415
+ query: (query) => {
416
+ const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
417
+ const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
418
+
419
+ // for debugging
420
+ //Search.lastresults = results.slice(); // a copy
421
+ // console.info("search results:", Search.lastresults);
422
+
423
+ // print the results
424
+ _displayNextItem(results, results.length, searchTerms, highlightTerms);
425
+ },
426
+
427
+ /**
428
+ * search for object names
429
+ */
430
+ performObjectSearch: (object, objectTerms) => {
431
+ const filenames = Search._index.filenames;
432
+ const docNames = Search._index.docnames;
433
+ const objects = Search._index.objects;
434
+ const objNames = Search._index.objnames;
435
+ const titles = Search._index.titles;
436
+
437
+ const results = [];
438
+
439
+ const objectSearchCallback = (prefix, match) => {
440
+ const name = match[4]
441
+ const fullname = (prefix ? prefix + "." : "") + name;
442
+ const fullnameLower = fullname.toLowerCase();
443
+ if (fullnameLower.indexOf(object) < 0) return;
444
+
445
+ let score = 0;
446
+ const parts = fullnameLower.split(".");
447
+
448
+ // check for different match types: exact matches of full name or
449
+ // "last name" (i.e. last dotted part)
450
+ if (fullnameLower === object || parts.slice(-1)[0] === object)
451
+ score += Scorer.objNameMatch;
452
+ else if (parts.slice(-1)[0].indexOf(object) > -1)
453
+ score += Scorer.objPartialMatch; // matches in last name
454
+
455
+ const objName = objNames[match[1]][2];
456
+ const title = titles[match[0]];
457
+
458
+ // If more than one term searched for, we require other words to be
459
+ // found in the name/title/description
460
+ const otherTerms = new Set(objectTerms);
461
+ otherTerms.delete(object);
462
+ if (otherTerms.size > 0) {
463
+ const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
464
+ if (
465
+ [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
466
+ )
467
+ return;
468
+ }
469
+
470
+ let anchor = match[3];
471
+ if (anchor === "") anchor = fullname;
472
+ else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
473
+
474
+ const descr = objName + _(", in ") + title;
475
+
476
+ // add custom score for some objects according to scorer
477
+ if (Scorer.objPrio.hasOwnProperty(match[2]))
478
+ score += Scorer.objPrio[match[2]];
479
+ else score += Scorer.objPrioDefault;
480
+
481
+ results.push([
482
+ docNames[match[0]],
483
+ fullname,
484
+ "#" + anchor,
485
+ descr,
486
+ score,
487
+ filenames[match[0]],
488
+ SearchResultKind.object,
489
+ ]);
490
+ };
491
+ Object.keys(objects).forEach((prefix) =>
492
+ objects[prefix].forEach((array) =>
493
+ objectSearchCallback(prefix, array)
494
+ )
495
+ );
496
+ return results;
497
+ },
498
+
499
+ /**
500
+ * search for full-text terms in the index
501
+ */
502
+ performTermsSearch: (searchTerms, excludedTerms) => {
503
+ // prepare search
504
+ const terms = Search._index.terms;
505
+ const titleTerms = Search._index.titleterms;
506
+ const filenames = Search._index.filenames;
507
+ const docNames = Search._index.docnames;
508
+ const titles = Search._index.titles;
509
+
510
+ const scoreMap = new Map();
511
+ const fileMap = new Map();
512
+
513
+ // perform the search on the required terms
514
+ searchTerms.forEach((word) => {
515
+ const files = [];
516
+ const arr = [
517
+ { files: terms[word], score: Scorer.term },
518
+ { files: titleTerms[word], score: Scorer.title },
519
+ ];
520
+ // add support for partial matches
521
+ if (word.length > 2) {
522
+ const escapedWord = _escapeRegExp(word);
523
+ if (!terms.hasOwnProperty(word)) {
524
+ Object.keys(terms).forEach((term) => {
525
+ if (term.match(escapedWord))
526
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
527
+ });
528
+ }
529
+ if (!titleTerms.hasOwnProperty(word)) {
530
+ Object.keys(titleTerms).forEach((term) => {
531
+ if (term.match(escapedWord))
532
+ arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
533
+ });
534
+ }
535
+ }
536
+
537
+ // no match but word was a required one
538
+ if (arr.every((record) => record.files === undefined)) return;
539
+
540
+ // found search word in contents
541
+ arr.forEach((record) => {
542
+ if (record.files === undefined) return;
543
+
544
+ let recordFiles = record.files;
545
+ if (recordFiles.length === undefined) recordFiles = [recordFiles];
546
+ files.push(...recordFiles);
547
+
548
+ // set score for the word in each file
549
+ recordFiles.forEach((file) => {
550
+ if (!scoreMap.has(file)) scoreMap.set(file, {});
551
+ scoreMap.get(file)[word] = record.score;
552
+ });
553
+ });
554
+
555
+ // create the mapping
556
+ files.forEach((file) => {
557
+ if (!fileMap.has(file)) fileMap.set(file, [word]);
558
+ else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
559
+ });
560
+ });
561
+
562
+ // now check if the files don't contain excluded terms
563
+ const results = [];
564
+ for (const [file, wordList] of fileMap) {
565
+ // check if all requirements are matched
566
+
567
+ // as search terms with length < 3 are discarded
568
+ const filteredTermCount = [...searchTerms].filter(
569
+ (term) => term.length > 2
570
+ ).length;
571
+ if (
572
+ wordList.length !== searchTerms.size &&
573
+ wordList.length !== filteredTermCount
574
+ )
575
+ continue;
576
+
577
+ // ensure that none of the excluded terms is in the search result
578
+ if (
579
+ [...excludedTerms].some(
580
+ (term) =>
581
+ terms[term] === file ||
582
+ titleTerms[term] === file ||
583
+ (terms[term] || []).includes(file) ||
584
+ (titleTerms[term] || []).includes(file)
585
+ )
586
+ )
587
+ break;
588
+
589
+ // select one (max) score for the file.
590
+ const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
591
+ // add result to the result list
592
+ results.push([
593
+ docNames[file],
594
+ titles[file],
595
+ "",
596
+ null,
597
+ score,
598
+ filenames[file],
599
+ SearchResultKind.text,
600
+ ]);
601
+ }
602
+ return results;
603
+ },
604
+
605
+ /**
606
+ * helper function to return a node containing the
607
+ * search summary for a given text. keywords is a list
608
+ * of stemmed words.
609
+ */
610
+ makeSearchSummary: (htmlText, keywords, anchor) => {
611
+ const text = Search.htmlToText(htmlText, anchor);
612
+ if (text === "") return null;
613
+
614
+ const textLower = text.toLowerCase();
615
+ const actualStartPosition = [...keywords]
616
+ .map((k) => textLower.indexOf(k.toLowerCase()))
617
+ .filter((i) => i > -1)
618
+ .slice(-1)[0];
619
+ const startWithContext = Math.max(actualStartPosition - 120, 0);
620
+
621
+ const top = startWithContext === 0 ? "" : "...";
622
+ const tail = startWithContext + 240 < text.length ? "..." : "";
623
+
624
+ let summary = document.createElement("p");
625
+ summary.classList.add("context");
626
+ summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
627
+
628
+ return summary;
629
+ },
630
+ };
631
+
632
+ _ready(Search.init);