diff --git a/.dockerignore b/.dockerignore
index 390663a926..9db01272bc 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -29,3 +29,4 @@
*/docs
.readthedocs.y*ml
**/*.db
+**/pyrightconfig.json
diff --git a/.gitignore b/.gitignore
index 8754014b04..ee461c0dc0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,7 +11,6 @@ venv/
static_root/
db.sqlite3
local_data/
-site/
local_settings.py
local_strings.py
coldfront.db
@@ -21,3 +20,8 @@ db.json
.env
.devcontainer/*
.bin/*
+cert.pem
+kep.pem
+coldfront.log
+apa.txt
+pyrightconfig.json
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000..fed8265112
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "coldfront-custom-resources"]
+ path = coldfront-custom-resources
+ url = https://github.com/IUResearchApplications/coldfront-custom-resources.git
diff --git a/MANIFEST.in b/MANIFEST.in
index e5bdd3ff21..04703efeeb 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,6 +1,7 @@
recursive-include coldfront/core/field_of_science/management/commands/data *
recursive-include coldfront/plugins/iquota/templates *
recursive-include coldfront/plugins/system_monitor/templates *
+recursive-include coldfront/plugins/academic_analytics/templates *
recursive-include coldfront/templates *
recursive-include coldfront/static *
recursive-include coldfront/core/portal/templates *
@@ -11,3 +12,13 @@ recursive-include coldfront/core/publication/templates *
recursive-include coldfront/core/grant/templates *
recursive-include coldfront/core/user/templates *
recursive-include coldfront/core/resource/templates *
+recursive-include coldfront/plugins/maintenance_mode/templates *
+recursive-include coldfront/plugins/advanced_search/templates *
+recursive-include coldfront/plugins/customizable_forms/templates *
+recursive-include coldfront/plugins/ldap_user_search/templates *
+recursive-include coldfront/plugins/pi_search/templates *
+recursive-include coldfront/plugins/allocation_removal_requests/templates *
+recursive-include coldfront/plugins/announcements/templates *
+recursive-include coldfront/plugins/help/templates *
+recursive-include coldfront/plugins/movable_allocations/templates *
+recursive-include coldfront/plugins/request_forms/templates *
diff --git a/coldfront-custom-resources b/coldfront-custom-resources
new file mode 160000
index 0000000000..ede7cc31f0
--- /dev/null
+++ b/coldfront-custom-resources
@@ -0,0 +1 @@
+Subproject commit ede7cc31f0224abe84b379618a2c99851343b13e
diff --git a/coldfront/components/site/static/apa.txt b/coldfront/components/site/static/apa.txt
new file mode 100644
index 0000000000..0b0a1f6c47
--- /dev/null
+++ b/coldfront/components/site/static/apa.txt
@@ -0,0 +1,686 @@
+1Cognitive Science Program, Indiana University, Bloomington, IN 47406, USA, Izquierdo, E. J., & Beer, R. D. (2015). An Integrated Neuromechanical Model of Steering in C. elegans. 07/20/2015-07/24/2015, 199–206. https://doi.org/10.1162/978-0-262-33027-5-ch040
+1Cognitive Science Program, Indiana University, Bloomington, IN 47406, USA, Izquierdo, E. J., & Beer, R. D. (2015). An Integrated Neuromechanical Model of Steering in C. elegans. 07/20/2015-07/24/2015, 199–206. https://doi.org/10.7551/978-0-262-33027-5-ch040
+Abu-Sultanah, M., Zhou, Z., Jiang, C., Mitchell, D. K., Bessler, W. K., Jiang, L., Li, X., Qian, S., Smith, A. E., Mang, H. E., White, E. E., Ciesielski, M. D., Hickey, B. E., Brewster, K. M., Sandusky, G. E., Masters, A., Angus, S. P., Clapp, D. W., Le, L. Q., & Rhodes, S. D. (2025). TGFβ-dependent signaling drives tumor growth and aberrant extracellular matrix dynamics in NF1-associated plexiform neurofibroma. Science Advances, 11(25), eadu0772. https://doi.org/10.1126/sciadv.adu0772
+Adhikari, S., Yan, D., Jiang, Z., Han, J., Xu, Z., Zhang, Y., Sainju, A., & Zhou, Y. (2025). Scaling Terrain-Aware Spatial Machine Learning for Flood Mapping on Large Scale Earth Imagery Data. ACM Transactions on Spatial Algorithms and Systems, 11(2), 1–29. https://doi.org/10.1145/3703157
+Adil, A., Xiang, J., Piccirillo, N., Harris, H. G., Sica, S., DiPersio, J. F., & Hurwitz, S. N. (2026). Advanced deep learning enables prediction of allogeneic stem cell mobilization success. Bone Marrow Transplantation, 61(5), 601–604. https://doi.org/10.1038/s41409-026-02811-6
+Agmon, E., Gates, A. J., Churavy, V., & Beer, R. D. (2016). Exploring the Space of Viable Configurations in a Model of Metabolism–Boundary Co-construction. Artificial Life, 22(2), 153–171. https://doi.org/10.1162/ARTL_a_00196
+Agmon, E., Glazier, J. A., & Beer, R. D. (2017). Structural coupling of a Potts model cell. Proceedings of the 14th European Conference on Artificial Life ECAL 2017, 13–20. https://doi.org/10.7551/ecal_a_008
+Aguilar, L. A., Miller-Crews, I., Dobris, J. M., Tracy, J. A., Macklin, P., Dixit, S., Jacobson, R. A., Evans, R. L., McGuire, E. L., Beverly, D. P., Reichard, D. G., & Rosvall, K. A. (2025). Total solar eclipse triggers dawn behavior in birds: Insights from acoustic recordings and community science. Science, 390(6769), 152–155. https://doi.org/10.1126/science.adx3025
+Aguilar-Arevalo, A. A., Anderson, C. E., Bartoszek, L. M., Bazarko, A. O., Brice, S. J., Brown, B. C., Bugel, L., Cao, J., Coney, L., Conrad, J. M., Cox, D. C., Curioni, A., Djurcic, Z., Finley, D. A., Fleming, B. T., Ford, R., Garcia, F. G., Garvey, G. T., Green, C., … Zimmerman, E. D. (2009). The MiniBooNE detector. Nuclear Instruments and Methods in Physics Research Section A: Accelerators, Spectrometers, Detectors and Associated Equipment, 599(1), 28–46. https://doi.org/10.1016/j.nima.2008.10.028
+Aguilar-Arevalo, A. A., Anderson, C. E., Bazarko, A. O., Brice, S. J., Brown, B. C., Bugel, L., Cao, J., Coney, L., Conrad, J. M., Cox, D. C., Curioni, A., Dharmapalan, R., Djurcic, Z., Finley, D. A., Fleming, B. T., Ford, R., Garcia, F. G., Garvey, G. T., Grange, J., … Zimmerman, E. D. (2010a). Measurement of the neutrino neutral-current elastic differential cross section on mineral oil at E ν ∼ 1 GeV. Physical Review D, 82(9), 092005. https://doi.org/10.1103/PhysRevD.82.092005
+Aguilar-Arevalo, A. A., Anderson, C. E., Bazarko, A. O., Brice, S. J., Brown, B. C., Bugel, L., Cao, J., Coney, L., Conrad, J. M., Cox, D. C., Curioni, A., Dharmapalan, R., Djurcic, Z., Finley, D. A., Fleming, B. T., Ford, R., Garcia, F. G., Garvey, G. T., Grange, J., … Zimmerman, E. D. (2013). Test of Lorentz and CPT violation with short baseline neutrino oscillation excesses. Physics Letters B, 718(4–5), 1303–1308. https://doi.org/10.1016/j.physletb.2012.12.020
+Aguilar-Arevalo, A. A., Anderson, C. E., Bazarko, A. O., Brice, S. J., Brown, B. C., Bugel, L., Cao, J., Coney, L., Conrad, J. M., Cox, D. C., Curioni, A., Djurcic, Z., Finley, D. A., Fleming, B. T., Ford, R., Garcia, F. G., Garvey, G. T., Gonzales, J., Grange, J., … Zimmerman, E. D. (2010b). Measurement of ν μ and ν ¯ μ induced neutral current single π 0 production cross sections on mineral oil at E ν ∼ O (1 GeV). Physical Review D, 81(1), 013005. https://doi.org/10.1103/PhysRevD.81.013005
+Aguilar-Arevalo, A. A., Anderson, C. E., Bazarko, A. O., Brice, S. J., Brown, B. C., Bugel, L., Cao, J., Coney, L., Conrad, J. M., Cox, D. C., Curioni, A., Djurcic, Z., Finley, D. A., Fleming, B. T., Ford, R., Garcia, F. G., Garvey, G. T., Grange, J., Green, C., … Zimmerman, E. D. (2009a). Search for Muon Neutrino and Antineutrino Disappearance in MiniBooNE. Physical Review Letters, 103(6), 061802. https://doi.org/10.1103/PhysRevLett.103.061802
+Aguilar-Arevalo, A. A., Anderson, C. E., Bazarko, A. O., Brice, S. J., Brown, B. C., Bugel, L., Cao, J., Coney, L., Conrad, J. M., Cox, D. C., Curioni, A., Djurcic, Z., Finley, D. A., Fleming, B. T., Ford, R., Garcia, F. G., Garvey, G. T., Grange, J., Green, C., … Zimmerman, E. D. (2010c). First measurement of the muon neutrino charged current quasielastic double differential cross section. Physical Review D, 81(9), 092005. https://doi.org/10.1103/PhysRevD.81.092005
+Aguilar-Arevalo, A. A., Anderson, C. E., Bazarko, A. O., Brice, S. J., Brown, B. C., Bugel, L., Cao, J., Coney, L., Conrad, J. M., Cox, D. C., Curioni, A., Djurcic, Z., Finley, D. A., Fleming, B. T., Ford, R., Garcia, F. G., Garvey, G. T., Green, C., Green, J. A., … Zimmerman, E. D. (2009b). Unexplained Excess of Electronlike Events from a 1-GeV Neutrino Beam. Physical Review Letters, 102(10), 101802. https://doi.org/10.1103/PhysRevLett.102.101802
+Aguilar-Arevalo, A. A., Anderson, C. E., Brice, S. J., Brown, B. C., Bugel, L., Conrad, J. M., Dharmapalan, R., Djurcic, Z., Fleming, B. T., Ford, R., Garcia, F. G., Garvey, G. T., Grange, J., Green, J. A., Imlay, R., Johnson, R. A., Karagiorgi, G., Katori, T., Kobilarcik, T., … The MiniBooNE Collaboration. (2011). Measurement of the neutrino component of an antineutrino beam observed by a nonmagnetized detector. Physical Review D, 84(7), 072005. https://doi.org/10.1103/PhysRevD.84.072005
+Aguilar-Arevalo, A. A., Anderson, C. E., Brice, S. J., Brown, B. C., Bugel, L., Conrad, J. M., Djurcic, Z., Fleming, B. T., Ford, R., Garcia, F. G., Garvey, G. T., Gonzales, J., Grange, J., Green, C., Green, J. A., Imlay, R., Johnson, R. A., Karagiorgi, G., Katori, T., … Zimmerman, E. D. (2009). Search for Electron Antineutrino Appearance at the Δ m 2 ∼ 1 eV 2 Scale. Physical Review Letters, 103(11), 111801. https://doi.org/10.1103/PhysRevLett.103.111801
+Aguilar-Arevalo, A. A., Brown, B. C., Bugel, L., Cheng, G., Church, E. D., Conrad, J. M., Dharmapalan, R., Djurcic, Z., Finley, D. A., Ford, R., Garcia, F. G., Garvey, G. T., Grange, J., Huelsnitz, W., Ignarra, C., Imlay, R., Johnson, R. A., Karagiorgi, G., Katori, T., … MiniBooNE Collaboration. (2013). Improved Search for ν ¯ μ → ν ¯ e Oscillations in the MiniBooNE Experiment. Physical Review Letters, 110(16), 161801. https://doi.org/10.1103/PhysRevLett.110.161801
+Aguilar-Arevalo, A. A., Brown, B. C., Bugel, L., Cheng, G., Church, E. D., Conrad, J. M., Dharmapalan, R., Djurcic, Z., Finley, D. A., Ford, R., Garcia, F. G., Garvey, G. T., Grange, J., Huelsnitz, W., Ignarra, C., Imlay, R., Johnson, R. A., Karagiorgi, G., Katori, T., … (MiniBooNE Collaboration). (2015). Measurement of the antineutrino neutral-current elastic differential cross section. Physical Review D, 91(1), 012004. https://doi.org/10.1103/PhysRevD.91.012004
+Aguilar-Arevalo, A. A., Brown, B. C., Bugel, L., Cheng, G., Church, E. D., Conrad, J. M., Dharmapalan, R., Djurcic, Z., Finley, D. A., Ford, R., Garcia, F. G., Garvey, G. T., Grange, J., Huelsnitz, W., Ignarra, C., Imlay, R., Johnson, R. A., Karagiorgi, G., Katori, T., … Zimmerman, E. D. (2013). First measurement of the muon antineutrino double-differential charged-current quasielastic cross section. Physical Review D, 88(3), 032001. https://doi.org/10.1103/PhysRevD.88.032001
+Ahmad, S. F., Hassan, D., Kumar, A., Gaur, G. K., Dutt, T., & Janga, S. C. (2024). CattleAssigner: A framework for accurate assignment of individuals to cattle lineages and populations using minimum informative markers. Computers and Electronics in Agriculture, 226, 109427. https://doi.org/10.1016/j.compag.2024.109427
+Aiello, L. M., Barrat, A., Schifanella, R., Cattuto, C., Markines, B., & Menczer, F. (2012). Friendship prediction and homophily in social media. ACM Transactions on the Web, 6(2), 1–33. https://doi.org/10.1145/2180861.2180866
+Aiyappa, R., DeVerna, M. R., Pote, M., Tran Truong, B., Zhao, W., Axelrod, D., Pessianzadeh, A., Kachwala, Z., Kim, M., Can Seckin, O., Kim, M., Gandhi, S., Manikonda, A., Pierri, F., Menczer, F., & Yang, K.-C. (2023). A Multi-Platform Collection of Social Media Posts about the 2022 U.S. Midterm Elections. Proceedings of the International AAAI Conference on Web and Social Media, 17, 981–989. https://doi.org/10.1609/icwsm.v17i1.22205
+Akimov, D., Albert, J. B., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Bernardi, I., Blackston, M. A., Blokland, L., Bolozdynya, A., Cabrera-Palmer, B., Chen, N., Chernyak, D., Conley, E., Cooper, R. L., Daughhetee, J., Del Valle Coello, M., Detwiler, J. A., … COHERENT Collaboration. (2021). First Measurement of Coherent Elastic Neutrino-Nucleus Scattering on Argon. Physical Review Letters, 126(1), 012002. https://doi.org/10.1103/PhysRevLett.126.012002
+Akimov, D., Albert, J. B., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Blackston, M. A., Bolozdynya, A., Cabrera-Palmer, B., Cervantes, M., Collar, J. I., Cooper, R. L., Daughhetee, J., Del Valle Coello, M., Detwiler, J. A., D’Onofrio, M., Efremenko, Y., Erkela, E. M., … Zettlemoyer, J. (2019). First constraint on coherent elastic neutrino-nucleus scattering in argon. Physical Review D, 100(11), 115020. https://doi.org/10.1103/PhysRevD.100.115020
+Akimov, D., Albert, J. B., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Brown, A., Bolozdynya, A., Cabrera-Palmer, B., Cervantes, M., Collar, J. I., Cooper, R. J., Cooper, R. L., Cuesta, C., Dean, D. J., Detwiler, J. A., Eberhardt, A., Efremenko, Y., … COHERENT Collaboration. (2017). Observation of coherent elastic neutrino-nucleus scattering. Science, 357(6356), 1123–1126. https://doi.org/10.1126/science.aao0990
+Akimov, D., Albert, J. B., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Bolozdynya, A., Burenkov, A., Cabrera-Palmer, B., Cervantes, M., Collar, J. I., Cooper, R. J., Cooper, R. L., Cuesta, C., Dean, D., Del Valle Coello, M., Detwiler, J., Dolgolenko, A. G., D’Onofrio, M., … COHERENT Collaboration. (2017). COHERENT Experiment: Current status. Journal of Physics: Conference Series, 798, 012213. https://doi.org/10.1088/1742-6596/798/1/012213
+Akimov, D., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Bernardi, I., Blackston, M. A., Blokland, L., Bolozdynya, A., Cabrera-Palmer, B., Chen, N., Chernyak, D., Conley, E., Daughhetee, J., Del Valle Coello, M., Detwiler, J. A., Durand, M. R., Efremenko, Y., … Zettlemoyer, J. (2021a). Development of a83 mKr source for the calibration of the CENNS-10 liquid argon detector. Journal of Instrumentation, 16(04), P04002. https://doi.org/10.1088/1748-0221/16/04/P04002
+Akimov, D., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Bernardi, I., Blackston, M. A., Bock, C., Bolozdynya, A., Browning, J., Cabrera-Palmer, B., Chernyak, D., Conley, E., Daughhetee, J., Detwiler, J., Ding, K., Durand, M. R., Efremenko, Y., … COHERENT Collaboration. (2022a). Measurement of the Coherent Elastic Neutrino-Nucleus Scattering Cross Section on CsI by COHERENT. Physical Review Letters, 129(8), 081801. https://doi.org/10.1103/PhysRevLett.129.081801
+Akimov, D., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Bernardi, I., Blackston, M. A., Bock, C., Bolozdynya, A., Browning, J., Cabrera-Palmer, B., Chernyak, D., Conley, E., Daughhetee, J., Detwiler, J., Ding, K., Durand, M. R., Efremenko, Y., … COHERENT Collaboration. (2022b). Simulating the neutrino flux from the Spallation Neutron Source for the COHERENT experiment. Physical Review D, 106(3), 032003. https://doi.org/10.1103/PhysRevD.106.032003
+Akimov, D., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Bernardi, I., Blackston, M. A., Bock, C., Bolozdynya, A., Browning, J., Cabrera-Palmer, B., Chernyak, D., Conley, E., Daughhetee, J., Detwiler, J., Ding, K., Durand, M. R., Efremenko, Y., … Johnson, B. A. (2022). Monitoring the SNS basement neutron background with the MARS detector. Journal of Instrumentation, 17(03), P03021. https://doi.org/10.1088/1748-0221/17/03/P03021
+Akimov, D., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Bernardi, I., Blackston, M. A., Bock, C., Bolozdynya, A., Browning, J., Cabrera-Palmer, B., Chernyak, D., Conley, E., Daughhetee, J., Detwiler, J., Ding, K., Durand, M. R., Efremenko, Y., … Zettlemoyer, J. (2023). First Probe of Sub-GeV Dark Matter beyond the Cosmological Expectation with the COHERENT CsI Detector at the SNS. Physical Review Letters, 130(5), 051803. https://doi.org/10.1103/PhysRevLett.130.051803
+Akimov, D., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Bernardi, I., Blackston, M. A., Bolozdynya, A., Cabrera-Palmer, B., Chernyak, D., Conley, E., Daughhetee, J., Day, E., Detwiler, J., Ding, K., Durand, M. R., Efremenko, Y., Elliott, S. R., … Zettlemoyer, J. (2021b). A D2 O detector for flux normalization of a pion decay-at-rest neutrino source. Journal of Instrumentation, 16(08), P08048. https://doi.org/10.1088/1748-0221/16/08/P08048
+Akimov, D., An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Blackston, M. A., Bolozdynya, A., Cabrera-Palmer, B., Chen, N., Conley, E., Cooper, R. L., Daughhetee, J., Del Valle Coello, M., Detwiler, J. A., Durand, M. R., Efremenko, Y., Elliott, S. R., Fabris, L., … Zettlemoyer, J. (2020). Sensitivity of the COHERENT experiment to accelerator-produced dark matter. Physical Review D, 102(5), 052007. https://doi.org/10.1103/PhysRevD.102.052007
+Akridge, A., Gallimore, D., Morales, H., & Liao, J. (2025). Initial baryon stopping and angular momentum in heavy-ion collisions. Physical Review C, 112(6), 064911. https://doi.org/10.1103/lz5s-98rc
+Aksamit, N. O., Kravitz, B., MacMartin, D. G., & Haller, G. (2021). Harnessing stratospheric diffusion barriers for enhanced climate geoengineering. Atmospheric Chemistry and Physics, 21(11), 8845–8861. https://doi.org/10.5194/acp-21-8845-2021
+Allen, K. S., Stiles, J., Daye, V. M., Wiensch, A., Valvi, N., & Dixon, B. E. (2025). Equivalence of electronic health record data for measuring hypertension prevalence: A retrospective comparison to BRFSS with data from two Indiana health systems, 2021. BMC Public Health, 25(1), 1285. https://doi.org/10.1186/s12889-025-22425-9
+Allen, O. M., & Menczer, F. (2022). Ukraine as a Political Tool in Facebook Sponsored Content. 2022 IEEE/ACM International Conference on Advances in Social Networks Analysis and Mining (ASONAM), 549–551. https://doi.org/10.1109/ASONAM55673.2022.10068635
+Alsaadi, A., Wang, T., Park, A., Bajracharya, P., Wang, L., Sun, F., Seal, S., Jadhao, V., Fox, G., & Jha, S. (2025). ROSE: RADICAL Orchestrator for Surrogate Exploration. Proceedings of the SC ’25 Workshops of the International Conference for High Performance Computing, Networking, Storage and Analysis, 61–70. https://doi.org/10.1145/3731599.3767347
+Alvarez-Ruso, L., Benhar, O., Tayloe, R., Zeller, G. P., Sanchez, F., Sorel, M., & Alvarez-Ruso, L. (2009). The Path Forward: Neutrino Quasi-Elastic Scattering Discussion. 291–296. https://doi.org/10.1063/1.3274172
+Amorim, G., Slone, J., Semeere, A., Diero, L., Otero, L., Crabtree-Ramirez, B., Tao, R., Duda, S. N., Musick, B., Yiannoutsos, C., Lumley, T., Shaw, P. A., & Shepherd, B. E. (2025). Data validation in multinational observational studies with error-prone data: Applying an optimal validation sampling strategy in a study of Kaposi sarcoma and HIV. American Journal of Epidemiology, kwaf264. https://doi.org/10.1093/aje/kwaf264
+An, J., Ciampaglia, G. L., Grinberg, N., Joseph, K., Mantzarlis, A., Maus, G., Menczer, F., Proferes, N., & Welles, B. F. (2017). Reports of the Workshops Held at the 2017 International AAAI Conference on Web and Social Media. AI Magazine, 38(4), 93–98. https://doi.org/10.1609/aimag.v38i4.2772
+An, P., Awe, C., Barbeau, P. S., Becker, B., Belling, S. W., Belov, V., Bernardi, I., Bock, C., Bolozdynya, A., Bouabid, R., Brown, A., Browning, J., Cabrera-Palmer, B., Cervantes, M., Conley, E., Daughhetee, J., Detwiler, J., Ding, K., Durand, M. R., … Zettlemoyer, J. (2023). Measurement of Pb n a t ( ν e , X n ) production with a stopped-pion neutrino source. Physical Review D, 108(7), 072001. https://doi.org/10.1103/PhysRevD.108.072001
+An, P., Awe, C., Barbeau, P. S., Becker, B., Belov, V., Bernardi, I., Bock, C., Bolozdynya, A., Bouabid, R., Brown, A., Browning, J., Cabrera-Palmer, B., Cervantes, M., Conley, E., Daughhetee, J., Detwiler, J., Ding, K., Durand, M. R., Efremenko, Y., … Zderic, A. (2023). Measurement of Electron-Neutrino Charged-Current Cross Sections on I 127 with the COHERENT NaI ν E Detector. Physical Review Letters, 131(22), 221801. https://doi.org/10.1103/PhysRevLett.131.221801
+Andorfer, M. C., Evans, D., Yang, S., He, C. Q., Girlich, A. M., Vergara-Coll, J., Sukumar, N., Houk, K. N., & Lewis, J. C. (2022). Analysis of laboratory-evolved flavin-dependent halogenases affords a computational model for predicting halogenase site selectivity. Chem Catalysis, 2(10), 2658–2674. https://doi.org/10.1016/j.checat.2022.07.003
+Angelo, M., Bhargava, Y., Kierzek, E., Kierzek, R., Hayes, R., Zhang, W., Vilseck, J., & Aoki, S. T. (2025). Accurate in silico predictions of modified RNA interactions to a prototypical RNA-binding protein with λ-dynamics. RNA, rna.080367.124. https://doi.org/10.1261/rna.080367.124
+Arcurio, L. R., Finn, P. R., & James, T. W. (2015). Neural mechanisms of high‐risk decisions‐to‐drink in alcohol‐dependent women. Addiction Biology, 20(2), 390–406. https://doi.org/10.1111/adb.12121
+Ariyapala, I. S., Buddika, K., Hundley, H. A., Calvi, B. R., & Sokol, N. S. (2022). The RNA-binding protein Swm is critical for Drosophila melanogaster intestinal progenitor cell maintenance. Genetics, 222(2), iyac099. https://doi.org/10.1093/genetics/iyac099
+Aros, F. I., Vesperini, E., & Dalessandro, E. (2025). Phase-space mixing of multiple stellar populations in globular clusters. Astronomy & Astrophysics, 699, A44. https://doi.org/10.1051/0004-6361/202453155
+Asadian, A., Derman, D., Adepoju, T., White, B. R., & Ferradal, S. L. (2025). Anesthetic effects on functional connectivity fingerprinting in mice. In J. M. Kainerstorfer, E. M. Buckley, & V. J. Srinivasan (Eds.), Clinical and Translational Neurophotonics 2025 (p. 7). SPIE. https://doi.org/10.1117/12.3042513
+Asselman, J., Glaholt, S. P., Smith, Z., Smagghe, G., Janssen, C. R., Colbourne, J. K., Shaw, J. R., & De Schamphelaere, K. A. C. (2012). Functional characterization of four metallothionein genes in Daphnia pulex exposed to environmental stressors. Aquatic Toxicology, 110–111, 54–65. https://doi.org/10.1016/j.aquatox.2011.12.010
+Asselman, J., Pfrender, M. E., Lopez, J. A., De Coninck, D. I. M., Janssen, C. R., Shaw, J. R., & De Schamphelaere, K. A. C. (2015). Conserved transcriptional responses to cyanobacterial stressors are mediated by alternate regulation of paralogous genes in Daphnia. Molecular Ecology, 24(8), 1844–1855. https://doi.org/10.1111/mec.13148
+Asselman, J., Semmouri, I., Jackson, C. E., Keith, N., Van Nieuwerburgh, F., Deforce, D., Shaw, J. R., & De Schamphelaere, K. A. C. (2019). Genome-Wide Stress Responses to Copper and Arsenic in a Field Population of Daphnia. Environmental Science & Technology, 53(7), 3850–3859. https://doi.org/10.1021/acs.est.8b06720
+Auerbach, L. B., Burman, R. L., Caldwell, D. O., Church, E. D., Cochran, A. K., Donahue, J. B., Fazely, A. R., Garvey, G. T., Gunasingha, R., Imlay, R. L., Katori, T., Louis, W. C., McIlhany, K. L., Metcalf, W. J., Mills, G. B., Sandberg, V. D., Smith, D., Stancu, I., Strossman, W. H., … Yellin, S. (2005). Tests of Lorentz violation in ν ¯ μ → ν ¯ e oscillations. Physical Review D, 72(7), 076004. https://doi.org/10.1103/PhysRevD.72.076004
+Bach, R. D., & Schlegel, H. B. (2024). Mechanism of the Sharpless Epoxidation Reaction: A DFT Study. The Journal of Physical Chemistry A, 128(11), 2072–2091. https://doi.org/10.1021/acs.jpca.3c08476
+Backus, B., Blaha, J., Cormack, L., & Bonnen, K. (2018). Use of continuous 3D target-tracking in VR to measure response latency to changes in depth. Journal of Vision, 18(10), 724. https://doi.org/10.1167/18.10.724
+Bae, J., Logan, P. E., Acri, D. J., Bharthur, A., Nho, K., Saykin, A. J., Risacher, S. L., Nudelman, K., Polsinelli, A. J., Pentchev, V., Kim, J., Hammers, D. B., Apostolova, L. G., & for the Alzheimer’s Disease Neuroimaging Initiative. (2023). A simulative deep learning model of SNP interactions on chromosome 19 for predicting Alzheimer’s disease risk and rates of disease progression. Alzheimer’s & Dementia, 19(12), 5690–5699. https://doi.org/10.1002/alz.13319
+Balci, N., Isenberg, A. M., & Jolly, M. S. (2018). Turbulence in vertically averaged convection. Physica D: Nonlinear Phenomena, 376–377, 216–227. https://doi.org/10.1016/j.physd.2018.02.005
+Barbeau, P. S., Belov, V., Bernardi, I., Bock, C., Bolozdynya, A., Bouabid, R., Browning, J., Cabrera-Palmer, B., Conley, E., Da Silva, V., Daughhetee, J., Detwiler, J., Ding, K., Durand, M. R., Efremenko, Y., Elliott, S. R., Erlandson, A., Fabris, L., Febbraro, M., … Zaalishvili, A. (2024). Accessing new physics with an undoped, cryogenic CsI CEvNS detector for COHERENT at the SNS. Physical Review D, 109(9), 092005. https://doi.org/10.1103/PhysRevD.109.092005
+Barbosa, J. S., Gondhali, U., Petrossian, G., Sharma, K., Chakraborty, S., Jacquet, J., & Freire, J. (2025). A Cost-Effective LLM-based Approach to Identify Wildlife Trafficking in Online Marketplaces. Proceedings of the ACM on Management of Data, 3(3), 1–23. https://doi.org/10.1145/3725256
+Barefoot, E. A., Gearon, J. H., & Edmonds, D. A. (2026). O Levee, Where Art Thou? Measuring the Abundance of Natural River Levees Across the Contiguous USA. Journal of Geophysical Research: Earth Surface, 131(4), e2025JF008642. https://doi.org/10.1029/2025JF008642
+Barnett, W. H., Kuznetsov, A., & Lapish, C. C. (2023). Distinct cortico-striatal compartments drive competition between adaptive and automatized behavior. PLOS ONE, 18(3), e0279841. https://doi.org/10.1371/journal.pone.0279841
+Barti, B., Dudok, B., Kenesei, K., Zöldi, M., Miczán, V., Balla, G. Y., Zala, D., Tasso, M., Sagheddu, C., Kisfali, M., Tóth, B., Ledri, M., Vizi, E. S., Melis, M., Barna, L., Lenkei, Z., Soltész, I., & Katona, I. (2024). Presynaptic nanoscale components of retrograde synaptic signaling. Science Advances, 10(22), eado0077. https://doi.org/10.1126/sciadv.ado0077
+Bass, B., Hundley, H., Li, J. B., Peng, Z., Pickrell, J., Xiao, X. G., & Yang, L. (2012). The difficult calls in RNA editing. Nature Biotechnology, 30(12), 1207–1209. https://doi.org/10.1038/nbt.2452
+Basu, S., Zhao, B., Biró, B., Faraggi, E., Gsponer, J., Hu, G., Kloczkowski, A., Malhis, N., Mirdita, M., Söding, J., Steinegger, M., Wang, D., Wang, K., Xu, D., Zhang, J., & Kurgan, L. (2024). DescribePROT in 2023: More, higher-quality and experimental annotations and improved data download options. Nucleic Acids Research, 52(D1), D426–D433. https://doi.org/10.1093/nar/gkad985
+Bazavov, A., Bernard, C., DeTar, C., El-Khadra, A. X., Gámiz, E., Gottlieb, S., Grebe, A., Heller, U. M., Jay, W., Kronfeld, A., & Lin, Y. (2024). Update on the gradient flow scale on the 2+1+1 HISQ ensembles. Proceedings of The 40th International Symposium on Lattice Field Theory — PoS(LATTICE2023), 292. https://doi.org/10.22323/1.453.0292
+Bazavov, A., Bernard, C. W., Clarke, D. A., DeTar, C., El-Khadra, A. X., Gámiz, E., Gottlieb, S., Grebe, A. V., Heller, U. M., Hostetler, L., Jay, W. I., Jeong, H., Kronfeld, A. S., Lin, Y., Lahert, S., Laiho, J., Lynch, M., Lytle, A. T., Meyer, A. S., … Fermilab Lattice and MILC Collaborations. (2026). High-precision scale setting with the Ω -baryon mass and gradient flow. Physical Review D, 113(5), 054501. https://doi.org/10.1103/t18c-bpqy
+Bazavov, A., Davies, C., DeTar, C., El-Khadra, A. X., Gámiz, E., Gottlieb, S., Jay, W. I., Jeong, H., Kronfeld, A. S., Lahert, S., Lepage, G. P., Lynch, M., Lytle, A. T., Mackenzie, P. B., McNeile, C., Neil, E. T., Peterson, C. T., Ray, G., Simone, J. N., … Fermilab Lattice, HPQCD, and MILC Collaborations. (2023). Light-quark connected intermediate-window contributions to the muon g − 2 hadronic vacuum polarization from lattice QCD. Physical Review D, 107(11), 114514. https://doi.org/10.1103/PhysRevD.107.114514
+Bednarski, O. J., Lehman, S. B., Mzinza, D., Kazinga, C., Namazzi, R., Opoka, R. O., Ren, J., Tran, T. M., Taylor, T. E., Seydel, K. B., John, C. C., Conroy, A. L., & Schmidt, N. W. (2025). Gut bacterial dysbiosis in pediatric severe malaria associates with post-discharge mortality. Nature Communications, 16(1), 9658. https://doi.org/10.1038/s41467-025-64632-3
+Bednarz, E. M., Butler, A. H., Visioni, D., Zhang, Y., Kravitz, B., & MacMartin, D. G. (2023). Injection strategy – a driver of atmospheric circulation and ozone response to stratospheric aerosol geoengineering. Atmospheric Chemistry and Physics, 23(21), 13665–13684. https://doi.org/10.5194/acp-23-13665-2023
+Bednarz, E. M., Visioni, D., Banerjee, A., Braesicke, P., Kravitz, B., & MacMartin, D. G. (2022). The Overlooked Role of the Stratosphere Under a Solar Constant Reduction. Geophysical Research Letters, 49(12), e2022GL098773. https://doi.org/10.1029/2022GL098773
+Bednarz, E. M., Visioni, D., Butler, A. H., Kravitz, B., MacMartin, D. G., & Tilmes, S. (2023). Potential Non‐Linearities in the High Latitude Circulation and Ozone Response to Stratospheric Aerosol Injection. Geophysical Research Letters, 50(22), e2023GL104726. https://doi.org/10.1029/2023GL104726
+Bednarz, E. M., Visioni, D., Kravitz, B., Jones, A., Haywood, J. M., Richter, J., MacMartin, D. G., & Braesicke, P. (2023). Climate response to off-equatorial stratospheric sulfur injections in three Earth system models – Part 2: Stratospheric and free-tropospheric response. Atmospheric Chemistry and Physics, 23(1), 687–709. https://doi.org/10.5194/acp-23-687-2023
+Beer, R., & Chiel, H. (2008). Computational neuroethology. Scholarpedia, 3(3), 5307. https://doi.org/10.4249/scholarpedia.5307
+Beer, R. D. (2010). Fitness Space Structure of a Neuromechanical System. Adaptive Behavior, 18(2), 93–115. https://doi.org/10.1177/1059712310363163
+Beer, R. D. (2015). Characterizing Autopoiesis in the Game of Life. Artificial Life, 21(1), 1–19. https://doi.org/10.1162/ARTL_a_00143
+Beer, R. D. (2017). Computing aggregate properties of preimages for 2D cellular automata. Chaos: An Interdisciplinary Journal of Nonlinear Science, 27(11), 111104. https://doi.org/10.1063/1.5006143
+Beer, R. D. (2018). On the Origin of Gliders. The 2018 Conference on Artificial Life, 67–74. https://doi.org/10.1162/isal_a_00019
+Beer, R. D. (2022). Codimension-2 parameter space structure of continuous-time recurrent neural networks. Biological Cybernetics, 116(4), 501–515. https://doi.org/10.1007/s00422-022-00938-5
+Beer, R. D. (2023). On the Proper Treatment of Dynamics in Cognitive Science. Topics in Cognitive Science, e12686. https://doi.org/10.1111/tops.12686
+Beer, R. D., & Di Paolo, E. A. (2023). The theoretical foundations of enaction: Precariousness. Biosystems, 223, 104823. https://doi.org/10.1016/j.biosystems.2022.104823
+Beer, R. D., & Williams, P. L. (2015). Information Processing and Dynamics in Minimally Cognitive Agents. Cognitive Science, 39(1), 1–38. https://doi.org/10.1111/cogs.12142
+Berto, G., Lauren, W., Franco, P., & Port, N. (2024). 6.1 Predicting the time to return to play and persistent post concussion symptoms utilizing machine learning of behavior and diffusion weighted MR imaging: Findings from the NCAA/DOD CARE consortium. Second Round Abstract Submissions, A107.1-A107. https://doi.org/10.1136/bjsports-2023-concussion.279
+Bertò, G., Rooks, L. T., Broglio, S. P., McAllister, T. A., McCrea, M. A., Pasquina, P. F., Giza, C., Brooks, A., Mihalik, J., Guskiewicz, K., Goldman, J., Duma, S., Rowson, S., Port, N. L., & Pestilli, F. (2024). Diffusion tensor analysis of white matter tracts is prognostic of persisting post-concussion symptoms in collegiate athletes. NeuroImage: Clinical, 43, 103646. https://doi.org/10.1016/j.nicl.2024.103646
+Bhat, B., Lanzoni, B., Ferraro, F. R., & Vesperini, E. (2023). New Parameters for Star Cluster Dynamics: The Effect of Primordial Binaries and Dark Remnants. The Astrophysical Journal, 945(2), 164. https://doi.org/10.3847/1538-4357/acb434
+Bhat, B., Lanzoni, B., Vesperini, E., Ferraro, F. R., Aros, F. I., Askar, A., & Hypki, A. (2024). New Parameters for Star Cluster Dynamics: The Role of Clusters’ Initial Conditions. The Astrophysical Journal, 968(1), 2. https://doi.org/10.3847/1538-4357/ad3dec
+Bhikharee, D., Rhyman, L., & Ramasami, P. (2023). Computational study of the interaction of the psychoactive amphetamine with 1,2-indanedione and 1,8-diazafluoren-9-one as fingerprinting reagents. RSC Advances, 13(6), 4077–4088. https://doi.org/10.1039/D2RA07044H
+Bhowmick, M., Mishra, S. K., Kravitz, B., Sahany, S., & Salunke, P. (2021). Response of the Indian summer monsoon to global warming, solar geoengineering and its termination. Scientific Reports, 11(1), 9791. https://doi.org/10.1038/s41598-021-89249-6
+Bibrzycki, Ł., Hammoud, N., Mathieu, V., Perry, R. J., Akridge, A., Fernández-Ramírez, C., Montaña, G., Pilloni, A., Rodas, A., Shastry, V., Smith, W. A., Winney, D., Szczepaniak, A. P., & Joint Physics Analysis Center. (2025). Studying π + π − photoproduction beyond Pomeron exchange. Physical Review D, 111(1), 014002. https://doi.org/10.1103/PhysRevD.111.014002
+Bidelman, G. M., Stirn, J. R., Rizzi, R., MacLean, J. A., & Cheng, H. (2026). Auditory Brainstem–Cortical Anatomy Relates to the Magnitude of Frequency-Following Responses (FFRs) and Event-Related Potentials (ERPs) Coding Speech-in-Noise. Neuroimaging, 1(1), 6. https://doi.org/10.3390/neuroimaging1010006
+Birge, J. R., Parker, R. P., Wu, X., & Yang, S. A. (2015). Operations Strategies in the Presence of Consumer-Driven Bankruptcy Risk. SSRN Electronic Journal. https://doi.org/10.2139/ssrn.2652994
+Biswas, A., Bradshaw, Z., & Jolly, M. S. (2021). Data Assimilation for the Navier—Stokes Equations Using Local Observables. SIAM Journal on Applied Dynamical Systems, 20(4), 2174–2203. https://doi.org/10.1137/20M136058X
+Biswas, A., Bradshaw, Z., Jolly, M., University of Maryland Baltimore County, USA, University of Arkansas, USA, & Indiana University, USA. (2023). Convergence of a mobile data assimilation scheme for the 2D Navier-Stokes equations. Discrete and Continuous Dynamical Systems, 43(11), 4042–4068. https://doi.org/10.3934/dcds.2023078
+Bloomer, B. F., Bolbecker, A. R., Gildea, E. L., Kennedy, D. P., Wisner, K. M., O’Donnell, B. F., & Hetrick, W. P. (2025). Postural sway dynamics in adults across the autism spectrum: A multifactor approach. Molecular Autism, 16(1), 44. https://doi.org/10.1186/s13229-025-00676-y
+Bloomer, B. F., Larson, E. R., Tullar, R. L., Herms, E. N., Bolbecker, A. R., O’Donnell, B. F., Hetrick, W. P., & Wisner, K. M. (2024). Alterations in self-reported sensory gating and interoception in individuals frequently using cannabis. The American Journal of Drug and Alcohol Abuse, 50(4), 525–535. https://doi.org/10.1080/00952990.2024.2332602
+Bollenbacher, J., Pacheco, D., Hui, P.-M., Ahn, Y.-Y., Flammini, A., & Menczer, F. (2021). On the challenges of predicting microscopic dynamics of online conversations. Applied Network Science, 6(1), 12. https://doi.org/10.1007/s41109-021-00357-8
+Bonnen, K., Huk, A. C., & Cormack, L. K. (2017). Dynamic mechanisms of visually guided 3D motion tracking. Journal of Neurophysiology, 118(3), 1515–1531. https://doi.org/10.1152/jn.00831.2016
+Borchers, C., Osburn, K., Roh, H. C., & Aoki, S. T. (2025). In vivo pulse-chase in Caenorhabditis elegans reveals intestinal histone turnover changes upon starvation. Journal of Biological Chemistry, 301(7), 110299. https://doi.org/10.1016/j.jbc.2025.110299
+Border, S. P., Ferreira, R. M., Lucarelli, N., Kumar, S. K. C., Paul, A. S., Manthey, D., Barisoni, L., Levites Strekalova, Y. A., Ray, J., Cheng, Y.-H., Rosenberg, A. Z., Tomaszewski, J. E., Mimar, S., Hodgin, J. B., Hickey, J. W., Wei, B., Ginty, F., Karunamurthy, A., Wang, J., … Sarder, P. (2025). FUSION: A web-based application for in-depth exploration of multi-omics data with brightfield histology. Nature Communications, 16(1), 8388. https://doi.org/10.1038/s41467-025-63050-9
+Boro, B., Kalita, P., Vijayaprabhakaran, A., Dao, D. Q., Nandy, S., Chae, K. H., Nailwal, Y., Kathiresan, M., & Mondal, J. (2023). Discrete Cu-Metalloporous Polycarbazole as a Nanoelectromediator for Effective Electrocarboxylation of Benzyl Bromide with CO2. ACS Applied Nano Materials, 6(13), 11788–11801. https://doi.org/10.1021/acsanm.3c01721
+Bortolan, E., Bruce, J., Milone, A. P., Vesperini, E., Dondoglio, E., Legnardi, M. V., Muratore, F., Ziliotto, T., Cordoni, G., Lagioia, E. P., Marino, A. F., & Tailo, M. (2025). Exploring the formation environment and dynamics of multiple stellar populations in globular clusters through binary systems. Astronomy & Astrophysics, 696, A220. https://doi.org/10.1051/0004-6361/202452786
+Brice, S. J., Cooper, R. L., DeJongh, F., Empl, A., Garrison, L. M., Hime, A., Hungerford, E., Kobilarcik, T., Loer, B., Mariani, C., Mocko, M., Muhrer, G., Pattie, R., Pavlovic, Z., Ramberg, E., Scholberg, K., Tayloe, R., Thornton, R. T., Yoo, J., & Young, A. (2014). A method for measuring coherent elastic neutrino-nucleus scattering at a far off-axis high-energy neutrino beam target. Physical Review D, 89(7), 072004. https://doi.org/10.1103/PhysRevD.89.072004
+Brothwell, J. A., Fortney, K. R., Batteiger, T., Katz, B. P., & Spinola, S. M. (2023). Dispensability of Ascorbic Acid Uptake and Utilization Encoded by ulaABCD for the Virulence of Haemophilus ducreyi in Humans. The Journal of Infectious Diseases, 227(3), 317–321. https://doi.org/10.1093/infdis/jiac314
+Brothwell, J. A., Fortney, K. R., Gao, H., Wilson, L. S., Andrews, C. F., Tran, T. M., Hu, X., Batteiger, T. A., Barnes, S., Liu, Y., & Spinola, S. M. (2022). Haemophilus ducreyi Infection Induces Oxidative Stress, Central Metabolic Changes, and a Mixed Pro- and Anti-inflammatory Environment in the Human Host. mBio, 13(6), e03125-22. https://doi.org/10.1128/mbio.03125-22
+Brothwell, J. A., Fortney, K. R., Williams, J. S., Batteiger, T. A., Duplantier, R., Grounds, D., Jannasch, A. S., Katz, B. P., & Spinola, S. M. (2023). Formate production is dispensable for Haemophilus ducreyi virulence in human volunteers. Infection and Immunity, 91(9), e00176-23. https://doi.org/10.1128/iai.00176-23
+Brothwell, J. A., & Spinola, S. M. (2022). Genes Differentially Expressed by Haemophilus ducreyi during Anaerobic Growth Significantly Overlap Those Differentially Expressed during Experimental Infection of Human Volunteers. Journal of Bacteriology, 204(5), e00005-22. https://doi.org/10.1128/jb.00005-22
+Brown, B. C., Brice, S., Hawker, E., Maza, S., Meyer, H., Pla-Dalmau, A., Tayloe, R., Tanaka, H. A., & Toptygin, D. (2004). Study of scintillation, fluorescence and scattering in mineral oil for the miniboone neutrino detector. IEEE Symposium Conference Record Nuclear Science 2004., 1, 652–656. https://doi.org/10.1109/NSSMIC.2004.1462277
+Brown, H. E., Weasner, B. P., Weasner, B. M., & Kumar, J. P. (2023). Polycomb safeguards imaginal disc specification through control of the Vestigial–Scalloped complex. Development, 150(18), dev201872. https://doi.org/10.1242/dev.201872
+Bruce, J., Vesperini, E., Askar, A., Bortolan, E., Giersz, M., Hong, J., Hypki, A., & Milone, A. P. (2026). Exploring the dynamical evolution of binary stars in multiple-population globular clusters. Astronomy & Astrophysics, 707, A284. https://doi.org/10.1051/0004-6361/202557826
+Budhkar, A., Ha, J., Song, Q., Su, J., & Zhang, X. (2026). SpaGene: A Deep Adversarial Framework for Spatial Gene Imputation. Computational and Structural Biotechnology Journal, 35(1), 0102. https://doi.org/10.34133/csbj.0102
+Budhkar, A., Song, Q., Su, J., & Zhang, X. (2025). Demystifying the black box: A survey on explainable artificial intelligence (XAI) in bioinformatics. Computational and Structural Biotechnology Journal, 27, 346–359. https://doi.org/10.1016/j.csbj.2024.12.027
+Budhkar, A., Tang, Z., Liu, X., Zhang, X., Su, J., & Song, Q. (2024). xSiGra: Explainable model for single-cell spatial data elucidation. Bioinformatics. https://doi.org/10.1101/2024.04.27.591458
+Caccese, J. B., Garcia, G.-G. P., Kontos, A. P., Port, N., Valerio, K., Broglio, S. P., McCrea, M., McAllister, T. W., Pasquina, P. F., & Buckley, T. A. (2022). Test-retest Reliability And Efficacy Of Individual Symptoms In Concussion Management: 266. Medicine & Science in Sports & Exercise, 54(9S), 66–66. https://doi.org/10.1249/01.mss.0000875844.04195.62
+Cain, R. L., & Webb, I. K. (2025). Comparison of Partially Denatured Cytochrome c Structural Ensembles in Solution and Gas Phases Using Cross-Linking Mass Spectrometry. Journal of the American Society for Mass Spectrometry, 36(1), 153–160. https://doi.org/10.1021/jasms.4c00388
+Calura, F., Pascale, R., Agertz, O., Andersson, E., Lacchin, E., Lupi, A., Meneghetti, M., Nipoti, C., Ragagnin, A., Rosdahl, J., Vanzella, E., Vesperini, E., & Zanella, A. (2025). SIEGE: III. The formation of dense stellar clusters in sub-parsec resolution cosmological simulations with individual star feedback. Astronomy & Astrophysics, 698, A207. https://doi.org/10.1051/0004-6361/202452876
+Campanello, G. C., Ma, Z., Grossoehme, N. E., Guerra, A. J., Ward, B. P., DiMarchi, R. D., Ye, Y., Dann, C. E., & Giedroc, D. P. (2013). Allosteric Inhibition of a Zinc-Sensing Transcriptional Repressor: Insights into the Arsenic Repressor (ArsR) Family. Journal of Molecular Biology, 425(7), 1143–1157. https://doi.org/10.1016/j.jmb.2013.01.018
+Cao, Y., Giorgini, A., Jolly, M., & Pakzad, A. (2022). Continuous data assimilation for the 3D Ladyzhenskaya model: Analysis and computations. Nonlinear Analysis: Real World Applications, 68, 103659. https://doi.org/10.1016/j.nonrwa.2022.103659
+Cao, Y., Jolly, M. S., Titi, E. S., & Whitehead, J. P. (2021). Algebraic bounds on the Rayleigh–Bénard attractor. Nonlinearity, 34(1), 509–531. https://doi.org/10.1088/1361-6544/abb1c6
+Caron, B., Ferris, L., Kontos, A., Eagle, S., Elbin, R., Collins, M., Mucha, A., Clugston, J., & Port, N. (2024). 7.2 A deep learning neural network predicts return-to-play time-point groups utilizing the vestibular/ocular-motor screening and SCAT3: An NCAA-DoD CARE consortium analysis. First Round Abstract Submissions, A34.1-A34. https://doi.org/10.1136/bjsports-2023-concussion.90
+Carpenter, R. L., Paw, I., Dewhirst, M. W., & Lo, H.-W. (2015). Akt phosphorylates and activates HSF-1 independent of heat shock, leading to Slug overexpression and epithelial–mesenchymal transition (EMT) of HER2-overexpressing breast cancer cells. Oncogene, 34(5), 546–557. https://doi.org/10.1038/onc.2013.582
+Cavar, D., & Zhang, C. (2024). Semantic Similarities Using Classical Embeddings in Quantum NLP. 2024 IEEE International Conference on Quantum Computing and Engineering (QCE), 450–451. https://doi.org/10.1109/QCE60285.2024.10350
+Cha, W., Chumin, E. J., Yi, D., Byun, M. S., Jung, J. H., Ahn, H., Jung, G., Kim, Y. K., Lee, Y., Kang, K. M., Sohn, C., Risacher, S. L., Sporns, O., Nho, K., Saykin, A. J., Lee, D. Y., & for the KBASE Research Group. (2026). Amyloid‐related default mode network hyperconnectivity and longitudinal decline in network distinctiveness in preclinical Alzheimer’s disease. Alzheimer’s & Dementia, 22(2), e71025. https://doi.org/10.1002/alz.71025
+Chakrabarti, S., Feng, Y., Adelfinsky, D., Tennessen, J., & Carpenter, R. (2025). Abstract 1496: Understanding a novel interaction between HSF1 and ERRα in breast cancer. Cancer Research, 85(8_Supplement_1), 1496–1496. https://doi.org/10.1158/1538-7445.AM2025-1496
+Charn, A. B., O’Brien, T. A., Risser, M. D., Longmate, J. M., & Feldman, D. R. (2022). Sign of Observed California Temperature Trends Depends on Data Set Homogenization: Implications for Weighting and Downscaling. Geophysical Research Letters, 49(15), e2022GL099186. https://doi.org/10.1029/2022GL099186
+Chastain, Z., Williams, I., Ulhaskumar, V., Wang, J., DeHart, H., Ray, H., & Carpenter, R. L. (2024). Inhibition of HSF1 as a Mechanism for Overcoming Hsp90 Treatment Resistance. Proceedings of IMPRS, 6(1). https://doi.org/10.18060/27850
+Chaturvedi, A., Zhou, J., Raeymaekers, J. A. M., Czypionka, T., Orsini, L., Jackson, C. E., Spanier, K. I., Shaw, J. R., Colbourne, J. K., & De Meester, L. (2021). Extensive standing genetic variation from a small number of founders enables rapid adaptation in Daphnia. Nature Communications, 12(1), 4306. https://doi.org/10.1038/s41467-021-24581-z
+Chaudhuri, S., Dempsey, D. A., Huang, Y., Park, T., Cao, S., Chumin, E. J., Craft, H., Crane, P. K., Mukherjee, S., Choi, S., Scollard, P., Lee, M., Nakano, C., Mez, J., Trittschuh, E. H., Klinedinst, B. S., Hohman, T. J., Lee, J., Kang, K. M., … for the KBASE Research Group. (2024). Association of amyloid and cardiovascular risk with cognition: Findings from KBASE. Alzheimer’s & Dementia, 20(12), 8527–8540. https://doi.org/10.1002/alz.14290
+Chen, A. M., Manh, V., & Candy, T. R. (2018). Longitudinal Evaluation of Accommodation During Treatment for Unilateral Amblyopia. Investigative Opthalmology & Visual Science, 59(5), 2187. https://doi.org/10.1167/iovs.17-22990
+Chen, C., & Han, L. (2025). Deciphering genetic regulation at single-cell resolution in gastric cancer. Cell Genomics, 5(4), 100846. https://doi.org/10.1016/j.xgen.2025.100846
+Chen, C., & Han, L. (2026). Modeling context-dependent RNA splicing by deep learning. Nature Computational Science, 6(5), 435–436. https://doi.org/10.1038/s43588-026-00987-x
+Chen, C. J., Jain, N., & Yang, S. A. (2023). The Impact of Trade Credit Provision on Retail Inventory: An Empirical Investigation Using Synthetic Controls. Management Science, 69(8), 4591–4608. https://doi.org/10.1287/mnsc.2022.4600
+Chen, C., Jain, N., & Yang, S. A. (2019). The Impact of Trade Credit Provision on Retail Inventory: An Empirical Investigation Using Synthetic Controls. SSRN Electronic Journal. https://doi.org/10.2139/ssrn.3375922
+Chen, C., Liu, Y., Luo, M., Yang, J., Chen, Y., Wang, R., Zhou, J., Zang, Y., Diao, L., & Han, L. (2024). PancanQTLv2.0: A comprehensive resource for expression quantitative trait loci across human cancers. Nucleic Acids Research, 52(D1), D1400–D1406. https://doi.org/10.1093/nar/gkad916
+Chen, C., Zhang, Z., Liu, Y., Hong, W., Karahan, H., Wang, J., Li, W., Diao, L., Yu, M., Saykin, A. J., Nho, K., Kim, J., & Han, L. (2025). Comprehensive characterization of the transcriptional landscape in Alzheimer’s disease (AD) brains. Science Advances, 11(1), eadn1927. https://doi.org/10.1126/sciadv.adn1927
+Chen, T., Pu, M., Subramanian, S., Kearns, D., & Rowe-Magnus, D. (2023). PlzD modifies Vibrio vulnificus foraging behavior and virulence in response to elevated c-di-GMP. mBio, 14(5), e01536-23. https://doi.org/10.1128/mbio.01536-23
+Chen, W., Pacheco, D., Yang, K.-C., & Menczer, F. (2021). Neutral bots probe political bias on social media. Nature Communications, 12(1), 5580. https://doi.org/10.1038/s41467-021-25738-6
+Chen, W., Pacheco, D., Yang, K.-C., & Menczer, F. (2022). Publisher Correction: Neutral bots probe political bias on social media. Nature Communications, 13(1), 264. https://doi.org/10.1038/s41467-021-27855-8
+Cheng, G., Huelsnitz, W., Aguilar-Arevalo, A. A., Alcaraz-Aunion, J. L., Brice, S. J., Brown, B. C., Bugel, L., Catala-Perez, J., Church, E. D., Conrad, J. M., Dharmapalan, R., Djurcic, Z., Dore, U., Finley, D. A., Ford, R., Franke, A. J., Garcia, F. G., Garvey, G. T., Giganti, C., … MiniBooNE and SciBooNE Collaborations. (2012). Dual baseline search for muon antineutrino disappearance at 0.1 eV 2 < Δ m 2 < 100 eV 2. Physical Review D, 86(5), 052009. https://doi.org/10.1103/PhysRevD.86.052009
+Cheng, S. (Mark), & Golshan, N. M. (2025). Silent Suffering: Using Machine Learning to Measure CEO Depression. Journal of Accounting Research, 63(2), 689–767. https://doi.org/10.1111/1475-679X.12590
+Cheng, W., MacMartin, D. G., Kravitz, B., Visioni, D., Bednarz, E. M., Xu, Y., Luo, Y., Huang, L., Hu, Y., Staten, P. W., Hitchcock, P., Moore, J. C., Guo, A., & Deng, X. (2022). Changes in Hadley circulation and intertropical convergence zone under strategic stratospheric aerosol geoengineering. Npj Climate and Atmospheric Science, 5(1), 32. https://doi.org/10.1038/s41612-022-00254-6
+Chepkemoi, A., McPheron, M., Naanyu, V., Carlucci, J. G., Kerich, C., Matelong, W., Kooreman, H., McHenry, M. S., Bernard, C., Kiano, M., Midiwo, R., Musick, B., Yiannoutsos, C. T., Wools‐Kaloustian, K., Patel, R. C., Were, E., Humphrey, J. M., & EA‐IeDEA consortium. (2026). Human‐Centered Design of a Contextualized Service Delivery Model for Families of Infants With Major Congenital Anomalies in Kenya. Birth Defects Research, 118(2), e70014. https://doi.org/10.1002/bdr2.70014
+Cheung See Kit, M., Carvalho, V. V., Vilseck, J. Z., & Webb, I. K. (2021). Gas-phase ion/ion chemistry for structurally sensitive probes of gaseous protein ion structure: Electrostatic and electrostatic to covalent cross-linking. International Journal of Mass Spectrometry, 463, 116549. https://doi.org/10.1016/j.ijms.2021.116549
+Cheung See Kit, M., Cropley, T. C., Bleiholder, C., Chouinard, C. D., Sobott, F., & Webb, I. K. (2024). The role of solvation on the conformational landscape of α-synuclein. The Analyst, 149(1), 125–136. https://doi.org/10.1039/D3AN01680C
+Chimmula, R. R., Green, M., Tann, M., Koch, M., Boris, R., Collins, K., Bahler, C., & Oderinde, O. (2025). Comparative analysis of machine learning-derived nomogram and biomarkers in predicting side-specific extraprostatic extension: Preliminary findings. Clinical Imaging, 125, 110556. https://doi.org/10.1016/j.clinimag.2025.110556
+Cho, J.-H., Kim, H.-G., Huang, M., Wang, S., Liu, S., Lu, A., McCrocklin, K., Zhang, Y., Fang, Z., Wang, J., Liu, W., Wan, J., & Dong, X. C. (2026). The Patatin-Like Phospholipase Domain–Containing 3 148M Variant Exacerbates Alcohol-Induced Liver Injury and Tumorigenesis in Mice. The American Journal of Pathology, 196(1), 209–222. https://doi.org/10.1016/j.ajpath.2025.04.014
+Choban, C. R., Salim, S., Kereš, D., Hayward, C. C., & Sandstrom, K. M. (2025). A dusty dawn: Galactic dust buildup at z ≳ 5. Monthly Notices of the Royal Astronomical Society, 537(2), 1518–1541. https://doi.org/10.1093/mnras/staf118
+Choban, C. R., Salim, S., Kereš, D., Roman-Duval, J., & Sandstrom, K. M. (2026). Ashes of FIRE: Modelling dust grain size evolution in the Local Group with fire. Monthly Notices of the Royal Astronomical Society, 549(4), stag1020. https://doi.org/10.1093/mnras/stag1020
+Chodur, D. M., & Rowe-Magnus, D. A. (2018). Complex Control of a Genomic Island Governing Biofilm and Rugose Colony Development in Vibrio vulnificus. Journal of Bacteriology, 200(16). https://doi.org/10.1128/JB.00190-18
+Chow, Y. T., Leung, W. T., & Pakzad, A. (2022). Continuous data assimilation for two-phase flow: Analysis and simulations. Journal of Computational Physics, 466, 111395. https://doi.org/10.1016/j.jcp.2022.111395
+Cognitive Science Program, Indiana University, Bloomington, IN 47406, USA, Agmon, E., Gates, A., Churavy, V., & Beer, R. (2014). Quantifying Robustness in a Spatial Model of Metabolism-Boundary Co-Construction. Artificial Life 14: Proceedings of the Fourteenth International Conference on the Synthesis and Simulation of Living Systems, 514–521. https://doi.org/10.1162/978-0-262-32621-6-ch082
+Cognitive Science Program, Indiana University, Bloomington, IN 47406, USA; School of Informatics and Computing, Indiana University, Bloomington, IN 47406, USA, Agmon, E., Gates, A. J., & Beer, R. D. (2015). Ontogeny and adaptivity in a model protocell. 07/20/2015-07/24/2015, 216–223. https://doi.org/10.1162/978-0-262-33027-5-ch043
+Cognitive Science Program, Indiana University, Bloomington, IN 47406, USA, Agmon, E., Gates, A., Churavy, V., & Beer, R. (2014). Quantifying Robustness in a Spatial Model of Metabolism-Boundary Co-Construction. Artificial Life 14: Proceedings of the Fourteenth International Conference on the Synthesis and Simulation of Living Systems, 514–521. https://doi.org/10.7551/978-0-262-32621-6-ch082
+Cognitive Science Program, Indiana University, Bloomington, IN 47406, USA; School of Informatics and Computing, Indiana University, Bloomington, IN 47406, USA, Agmon, E., Gates, A. J., & Beer, R. D. (2015). Ontogeny and adaptivity in a model protocell. 07/20/2015-07/24/2015, 216–223. https://doi.org/10.7551/978-0-262-33027-5-ch043
+Colizza, V., Flammini, A., Serrano, M. A., & Vespignani, A. (2006). Detecting rich-club ordering in complex networks. Nature Physics, 2(2), 110–115. https://doi.org/10.1038/nphys209
+Collins, K. S., Aruldhas, B. W., Metzger, I. F., Lu, J. B. L., Heathman, M. A., Quinney, S. K., & Desta, Z. (2025). A Population Pharmacokinetic Approach to Understand the Effect of Efavirenz on CYP3A Activity in Healthy Volunteers Using Midazolam as a Probe. CPT: Pharmacometrics & Systems Pharmacology, 14(12), 2095–2106. https://doi.org/10.1002/psp4.70116
+Cordova, R. A., Elbanna, M., Rupert, C., Orsi, S. A., Sommers, N. R., Klunk, A. J., Shen, L., Misra, J., Hanquier, J. N., Tsompana, M., Wang, Y., Goodrich, D. W., Wek, R. C., Fontana, L., Staschke, K. A., & Pili, R. (2025). Caloric Restriction Enhances the Efficacy of Antiandrogen Therapy in Prostate Cancer by Inhibiting Androgen Receptor Translation. Cancer Research, 85(21), 4182–4197. https://doi.org/10.1158/0008-5472.CAN-24-1986
+Cordova, R. A., Misra, J., Amin, P. H., Klunk, A. J., Damayanti, N. P., Carlson, K. R., Elmendorf, A. J., Kim, H.-G., Mirek, E. T., Elzey, B. D., Miller, M. J., Dong, X. C., Cheng, L., Anthony, T. G., Pili, R., Wek, R. C., & Staschke, K. A. (2022). GCN2 eIF2 kinase promotes prostate cancer by maintaining amino acid homeostasis. eLife, 11, e81083. https://doi.org/10.7554/eLife.81083
+Cordova, R. A., Sommers, N. R., Law, A. S., Klunk, A. J., Brady, K. E., Goodrich, D. W., Anthony, T. G., Brault, J. J., Pili, R., Wek, R. C., & Staschke, K. A. (2024). Coordination between the eIF2 kinase GCN2 and p53 signaling supports purine metabolism and the progression of prostate cancer. Science Signaling, 17(864), eadp1375. https://doi.org/10.1126/scisignal.adp1375
+Couetil, J., Liu, Z., Huang, K., Zhang, J., & Alomari, A. K. (2023). Predicting melanoma survival and metastasis with interpretable histopathological features and machine learning models. Frontiers in Medicine, 9, 1029227. https://doi.org/10.3389/fmed.2022.1029227
+Cserép, C., Schwarcz, A. D., Pósfai, B., László, Z. I., Kellermayer, A., Környei, Z., Kisfali, M., Nyerges, M., Lele, Z., Katona, I., & Ádám Dénes. (2022). Microglial control of neuronal development via somatic purinergic junctions. Cell Reports, 40(12), 111369. https://doi.org/10.1016/j.celrep.2022.111369
+Dabin, L. C., Kersey, H., Kim, B., Acri, D. J., Sharify, D., Lee‐Gosselin, A., Lasagna‐Reeves, C. A., Oblak, A. L., Lamb, B. T., & Kim, J. (2024). Loss of Inpp5d has disease‐relevant and sex‐specific effects on glial transcriptomes. Alzheimer’s & Dementia, 20(8), 5311–5323. https://doi.org/10.1002/alz.13901
+Dakota, D., & Kübler, S. (2024). Bits and Pieces: Investigating the Effects of Subwords in Multi-task Parsing across Languages and Domains. 2397–2409. https://doi.org/10.63317/5ohiuu697g79
+Dalessandro, E., Cadelano, M., Della Croce, A., Aros, F. I., White, E. B., Vesperini, E., Fanelli, C., Ferraro, F. R., Lanzoni, B., Leanza, S., & Origlia, L. (2024). A 3D view of multiple populations’ kinematics in Galactic globular clusters. Astronomy & Astrophysics, 691, A94. https://doi.org/10.1051/0004-6361/202451054
+Dao, D. Q., Taamalli, S., Louis, F., Kdouh, D., Srour, Z., Ngo, T. C., Truong, D. H., Fèvre-Nollet, V., Ribaucour, M., El Bakali, A., & Černuśák, I. (2023). Hydroxyl radical-initiated decomposition of metazachlor herbicide in the gaseous and aqueous phases: Mechanism, kinetics, and toxicity evaluation. Chemosphere, 312, 137234. https://doi.org/10.1016/j.chemosphere.2022.137234
+Davis, C. A., Ciampaglia, G. L., Aiello, L. M., Chung, K., Conover, M. D., Ferrara, E., Flammini, A., Fox, G. C., Gao, X., Gonçalves, B., Grabowicz, P. A., Hong, K., Hui, P.-M., McCaulay, S., McKelvey, K., Meiss, M. R., Patil, S., Peli Kankanamalage, C., Pentchev, V., … Menczer, F. (2016). OSoMe: The IUNI observatory on social media. PeerJ Computer Science, 2, e87. https://doi.org/10.7717/peerj-cs.87
+Davis, C. A., Varol, O., Ferrara, E., Flammini, A., & Menczer, F. (2016). BotOrNot: A System to Evaluate Social Bots. Proceedings of the 25th International Conference Companion on World Wide Web - WWW 16 Companion, 273–274. https://doi.org/10.1145/2872518.2889302
+Dawid, S. M., Smith, W. A., Rodas, A., Perry, R. J., Fernández-Ramírez, C., Swanson, E. S., & Szczepaniak, A. P. (2024). Coulomb confinement in the Hamiltonian limit. Physical Review D, 110(9), 094509. https://doi.org/10.1103/PhysRevD.110.094509
+DeFond, M. L., Konchitchki, Y., McMullin, J. L., & O’Leary, D. E. (2013). Capital markets valuation and accounting performance of Most Admired Knowledge Enterprise (MAKE) award winners. Decision Support Systems, 56, 348–360. https://doi.org/10.1016/j.dss.2013.07.001
+DeHart, H., Gregg, N., & Carpenter, R. (2024). Abstract LB200: Defining the mechanisms of cancer specific transcription factor, tGLI1. Cancer Research, 84(7_Supplement), LB200–LB200. https://doi.org/10.1158/1538-7445.AM2024-LB200
+DeHart, H., Gregg, N., Heldman, J., & Carpenter, R. (2025). Abstract 1416: Defining the mechanisms of cancer specific transcription factor, tGLI1. Cancer Research, 85(8_Supplement_1), 1416–1416. https://doi.org/10.1158/1538-7445.AM2025-1416
+Deis, S. M., Doshi, A., Hou, Z., Matherly, L. H., Gangjee, A., & Dann, C. E. (2016). Structural and Enzymatic Analysis of Tumor-Targeted Antifolates That Inhibit Glycinamide Ribonucleotide Formyltransferase. Biochemistry, 55(32), 4574–4582. https://doi.org/10.1021/acs.biochem.6b00412
+Dekhne, A. S., Shah, K., Ducker, G. S., Katinas, J. M., Wong-Roushar, J., Nayeen, Md. J., Doshi, A., Ning, C., Bao, X., Frühauf, J., Liu, J., Wallace-Povirk, A., O’Connor, C., Dzinic, S. H., White, K., Kushner, J., Kim, S., Hüttemann, M., Polin, L., … Matherly, L. H. (2019). Novel Pyrrolo[3,2- d ]pyrimidine Compounds Target Mitochondrial and Cytosolic One-carbon Metabolism with Broad-spectrum Antitumor Efficacy. Molecular Cancer Therapeutics, 18(10), 1787–1799. https://doi.org/10.1158/1535-7163.MCT-19-0037
+Della Croce, A., Aros, F. I., Vesperini, E., Dalessandro, E., Lanzoni, B., Ferraro, F. R., & Bhat, B. (2024). Inference of black-hole mass fraction in Galactic globular clusters: A multi-dimensional approach to break the initial-condition degeneracies. Astronomy & Astrophysics, 690, A179. https://doi.org/10.1051/0004-6361/202450954
+Denizli, M., Ropa, J., Beasley, L., Ghosh, J., DeVanna, K., Spice, T., Haneline, L. S., Capitano, M., & Kua, K. L. (2024). Glucose intolerance as a consequence of hematopoietic stem cell dysfunction in offspring of obese mice. Molecular Metabolism, 88, 102008. https://doi.org/10.1016/j.molmet.2024.102008
+Dentino, F. C., Yepes, J. F., Jones, J. E., Scully, A. C., Eckert, G. J., Downey, T., & Maupome, G. (2023). Amalgam or composite in pediatric dentistry. The Journal of the American Dental Association, 154(8), 705-714.e10. https://doi.org/10.1016/j.adaj.2023.04.015
+Dev, S., Zolensky, A., Aridi, H. D., Kelty, C., Madison, M. K., Motaganahalli, A., Brooke, B. S., Dixon, B., Boustani, M., Ben Miled, Z., Zhang, P., & Gonzalez, A. A. (2024). Use of Deep Learning to Identify Peripheral Arterial Disease Cases From Narrative Clinical Notes. Journal of Surgical Research, 303, 699–708. https://doi.org/10.1016/j.jss.2024.09.062
+DeVerna, M. R., Aiyappa, R., Pacheco, D., Bryden, J., & Menczer, F. (2024). Identifying and characterizing superspreaders of low-credibility content on Twitter. PLOS ONE, 19(5), e0302201. https://doi.org/10.1371/journal.pone.0302201
+DeVerna, M. R., Pierri, F., Truong, B. T., Bollenbacher, J., Axelrod, D., Loynes, N., Torres-Lugo, C., Yang, K.-C., Menczer, F., & Bryden, J. (2021). CoVaxxy: A Collection of English-Language Twitter Posts About COVID-19 Vaccines. Proceedings of the International AAAI Conference on Web and Social Media, 15, 992–999. https://doi.org/10.1609/icwsm.v15i1.18122
+DeVerna, M. R., Yan, H. Y., Yang, K.-C., & Menczer, F. (2024). Fact-checking information from large language models can decrease headline discernment. Proceedings of the National Academy of Sciences, 121(50), e2322823121. https://doi.org/10.1073/pnas.2322823121
+Dhakal, A., Salim, C., Skelly, M., Amichan, Y., Lamm, A. T., & Hundley, H. A. (2024). ADARs regulate cuticle collagen expression and promote survival to pathogen infection. BMC Biology, 22(1), 37. https://doi.org/10.1186/s12915-024-01840-1
+Dixon, B. E., Inderstrodt, J., Riggins, D. P., Price, J. P., Schlyer, T. K. L., & Grannis, S. J. (2024). Linking Maternal and Child Health Data to Enhance Public Health Surveillance and Implement Sustainable Interventions. In J. Mantas, A. Hasman, G. Demiris, K. Saranto, M. Marschollek, T. N. Arvanitis, I. Ognjanović, A. Benis, P. Gallos, E. Zoulias, & E. Andrikopoulou (Eds.), Studies in Health Technology and Informatics. IOS Press. https://doi.org/10.3233/SHTI240801
+Dixon, B. E., Wandai, M., Reese, E., Di, M., Hills, G. D., Gatz, J. L., Okolo, A., & Hardesty, B. M. (2025). Making SCD Warriors Visible: A Public Health Visualization Project. In M. S. Househ, Z. U. A. Tariq, M. Al-Zubaidi, U. Shah, & E. Huesing (Eds.), Studies in Health Technology and Informatics. IOS Press. https://doi.org/10.3233/SHTI251269
+Djulbegovic, B., Hozo, I., Iskander, R., Parish, A. J., Kimmelman, J., & Ioannidis, J. P. A. (2025). There is no upper limit on the maximum effect that can be detected in randomized trials. Journal of Clinical Epidemiology, 184, 111828. https://doi.org/10.1016/j.jclinepi.2025.111828
+Dong, G., Iyamu, I. D., Vilseck, J. Z., Chen, D., & Huang, R. (2022). Improved Cell-Potent and Selective Peptidomimetic Inhibitors of Protein N-Terminal Methyltransferase 1. Molecules, 27(4), 1381. https://doi.org/10.3390/molecules27041381
+Dos Santos, T. F., Rice, M., Wang, X.-Y., & Wang, S. (2024). SOLES XII. The Aligned Orbit of TOI-2533 b, a Transiting Brown Dwarf Orbiting an F8-type Star. The Astronomical Journal, 168(4), 145. https://doi.org/10.3847/1538-3881/ad6b7f
+Dugan, E., Wang, X.-Y., Heron, A., Bhaskar, H. G., Rice, M., Petrovich, C., & Wang, S. (2025). Early Evidence for Polar Orbits of Sub-Saturns around Hot Stars. The Astrophysical Journal Letters, 994(1), L23. https://doi.org/10.3847/2041-8213/ae18c7
+Duggan, B., Metzcar, J., & Macklin, P. (2021). DAPT: A package enabling distributed automated parameter testing. Gigabyte, 2021, gigabyte150. https://doi.org/10.46471/gigabyte.22
+Durak, L. J., & Lewis, J. C. (2014). Iridium-Promoted, Palladium-Catalyzed Direct Arylation of Unactivated Arenes. Organometallics, 33(3), 620–623. https://doi.org/10.1021/om401221v
+Dzemidzic, M., Cox, M. R., Haines, D., Hays, J., Mlungwana, M. K., Avena-Koenigsberger, A., Logrip, M. L., Goni, J., Harezlak, J., Kosobud, A. E. K., Kareken, D. A., O’Connor, S., Plawecki, M. H., & Cyders, M. A. (2026). Alcohol-seeking associations with resting state functional connectivity of the amygdala. Drug and Alcohol Dependence, 278, 112999. https://doi.org/10.1016/j.drugalcdep.2025.112999
+Erdmann, E. A., Mahapatra, A., Mukherjee, P., Yang, B., & Hundley, H. A. (2021). To protect and modify double-stranded RNA – the critical roles of ADARs in development, immunity and oncogenesis. Critical Reviews in Biochemistry and Molecular Biology, 56(1), 54–87. https://doi.org/10.1080/10409238.2020.1856768
+Ermi, J. J., Tyler, J. H., Baltazar Felipe, R., Hunnicutt, H., Reising, D. R., & Loveless, T. D. (2026). Validating satellite-based communications sources under degraded radiation conditions using specific emitter identification. In M. C. Dudzik, T. J. Axenson, & S. M. Jameson (Eds.), Autonomous Systems: Sensors, Processing, and Security for Ground, Air, Sea, and Space Vehicles and Infrastructure 2026 (p. 15). SPIE. https://doi.org/10.1117/12.3094907
+Etkins, J., So, G. C., Lu, J. B. L., Koyama, S., Gisch, D. L., Melo Ferreira, R., Cheng, Y., McClara, K., Jun, J., Miller, M., Desta, Z., & Eadon, M. T. (2026). Genotype–Specific Safety and Pharmacokinetics of Cannabidiol in Healthy Volunteers. Clinical and Translational Science, 19(1), e70455. https://doi.org/10.1111/cts.70455
+Faccini De Lima, C., Hewagama, N. D., Uchida, M., Douglas, T., & Jadhao, V. (2025). Multilayered ordered arrays self-assembled from a mixed population of nanoparticles. Soft Matter, 21(19), 3720–3740. https://doi.org/10.1039/D4SM01370K
+Ferrara, E., Varol, O., Davis, C., Menczer, F., & Flammini, A. (2016). The rise of social bots. Communications of the ACM, 59(7), 96–104. https://doi.org/10.1145/2818717
+Flores, I., Maas, Z. G., & Hinkel, N. R. (2024). An Exploration of Molecular Lines for Abundance Analysis in M-dwarf IR Spectra. Research Notes of the AAS, 8(12), 315. https://doi.org/10.3847/2515-5172/ad9f60
+Folco, K. L., Fridberg, D. J., Arcurio, L. R., Finn, P. R., Heiman, J. R., & James, T. W. (2021). Neural mechanisms of sexual decision-making in women with alcohol use disorder. Psychopharmacology, 238(7), 1867–1883. https://doi.org/10.1007/s00213-021-05815-w
+Foley, K. E., Weekman, E. M., & Wilcock, D. M. (2026). Acute anti‐Aβ antibody exposure induces microglial changes and significantly alters chemokine signaling. Alzheimer’s & Dementia: Translational Research & Clinical Interventions, 12(1), e70201. https://doi.org/10.1002/trc2.70201
+Forbes, E., & Beer, R. (2023). The Sun Always Rises: Behavioral Attunement to Abiotic Reins. The 2023 Conference on Artificial Life. The 2023 Conference on Artificial Life. https://doi.org/10.1162/isal_a_00598
+Forbes, E., & Beer, R. (2024). Deriving Community Models with Evolutionary Robotics: A Case Study of Sensory Pollution. The 2024 Conference on Artificial Life. The 2024 Conference on Artificial Life. https://doi.org/10.1162/isal_a_00738
+Fortney, K. R., Brothwell, J. A., Batteiger, T. A., Duplantier, R., Katz, B. P., & Spinola, S. M. (2024). A Haemophilus ducreyi strain lacking the yfeABCD iron transport system is virulent in human volunteers. Infection and Immunity, 92(6), e00058-24. https://doi.org/10.1128/iai.00058-24
+Fowlie, J., Georgescu, A. B., Suter, A., Mundet, B., Toulouse, C., Jaouen, N., Viret, M., Domínguez, C., Gibert, M., Salman, Z., Prokscha, T., Alexander, D. T. L., Kreisel, J., Georges, A., Millis, A. J., & Triscone, J.-M. (2023). Metal–insulator transition in composition-tuned nickel oxide films. Journal of Physics: Condensed Matter, 35(30), 304001. https://doi.org/10.1088/1361-648X/accd38
+Frederick, A., Lopes, C., Fulton, B., Huang, Y., Podicheti, R., Rusch, D., Minasov, G., Shuvalova, L., Satchell, K. J. F., & Rowe-Magnus, D. A. (2026). Altering chemotaxis as a strategy to enhance the foraging range of motility-restricted bacteria. Communications Biology, 9(1), 197. https://doi.org/10.1038/s42003-025-09475-w
+Fukudome, A., Singh, J., Mishra, V., Reddem, E., Martinez-Marquez, F., Wenzel, S., Yan, R., Shiozaki, M., Yu, Z., Wang, J. C.-Y., Takagi, Y., & Pikaard, C. S. (2021). Structure and RNA template requirements of Arabidopsis RNA-DEPENDENT RNA POLYMERASE 2. Proceedings of the National Academy of Sciences, 118(51), e2115899118. https://doi.org/10.1073/pnas.2115899118
+Ganem, N. S., Ben-Asher, N., Manning, A. C., Deffit, S. N., Washburn, M. C., Wheeler, E. C., Yeo, G. W., Zgayer, O. B.-N., Mantsur, E., Hundley, H. A., & Lamm, A. T. (2019). Disruption in A-to-I Editing Levels Affects C. elegans Development More Than a Complete Lack of Editing. Cell Reports, 27(4), 1244-1253.e4. https://doi.org/10.1016/j.celrep.2019.03.095
+Garcia, K. E., Basinski, C., & Kroenke, C. D. (2025). Quantifying the timing of gyral and sulcal formation relative to growth in the ferret cerebral cortex. Developmental Neuroscience, 1–24. https://doi.org/10.1159/000544824
+Garcia, K. E., Wang, X., Santiago, S. E., Bakshi, S., Barnes, A. P., & Kroenke, C. D. (2024). Longitudinal MRI of the developing ferret brain reveals regional variations in timing and rate of growth. Cerebral Cortex, 34(4), bhae172. https://doi.org/10.1093/cercor/bhae172
+Gatz, J. L., Okolo, A., Janson, I. A., Hardesty, B., & Dixon, B. E. (2026). Comorbidities in sickle cell disease by age in the Indiana sickle cell data collection (IN-SCDC). Hematology, 31(1), 2655477. https://doi.org/10.1080/16078454.2026.2655477
+Ghobashi, A. H., Lanzloth, R., Ladaika, C. A., Masood, A., & O’Hagan, H. M. (2024). Single-Cell Profiling Reveals the Impact of Genetic Alterations on the Differentiation of Inflammation-Induced Murine Colon Tumors. Cancers, 16(11), 2040. https://doi.org/10.3390/cancers16112040
+Gilbert, D. G. (2019a). Genes of the pig, Sus scrofa , reconstructed with EvidentialGene. PeerJ, 7, e6374. https://doi.org/10.7717/peerj.6374
+Gilbert, D. G. (2019b). Longest protein, longest transcript or most expression, for accurate gene reconstruction of transcriptomes? Bioinformatics. https://doi.org/10.1101/829184
+Gilbert, D. G. (2022). Genes ruler for genomes, Gnodes, measures assembly accuracy in animals and plants. Bioinformatics. https://doi.org/10.1101/2022.05.13.491861
+Gilbert, D. G. (2023). Measure of major contents in animal and plant genomes, using Gnodes, finds under-assemblies of model plant, Daphnia, fire ant and others. Genomics. https://doi.org/10.1101/2023.12.20.572422
+Gilbert, D. G. (2024). Measuring DNA contents of animal and plant genomes with Gnodes, the long and short of it. Genomics. https://doi.org/10.1101/2024.10.06.616888
+Gildea, E., Kim, D.-J., Bloomer, B., Tullar, R., Bolbecker, A., O’Donnell, B., Wisner, K., & Hetrick, W. (2023). 460. Functional Connectivity Between the Cortex and the Cerebellum: An MRI Analysis in Cannabis Users. Biological Psychiatry, 93(9), S280–S281. https://doi.org/10.1016/j.biopsych.2023.02.700
+Gisch, D. L., Koyama, S., Etkins, J., So, G. C., Fehrenbach, D. J., Lu, J. B. L., Cheng, Y.-H., Ferreira, R. M., Rajadhyaksha, E., McClara, K., Asghari, M., Sharfuddin, A. A., Dagher, P. C., Snell, L. M., Madhur, M. S., Polidoro, R. B., Desta, Z., & Eadon, M. T. (2026). Cannabidiol exerts antiinflammatory effects but maintains T effector memory cell differentiation in humans. JCI Insight, 11(1), e198590. https://doi.org/10.1172/jci.insight.198590
+Glaholt, S. P., Chen, C. Y., Demidenko, E., Bugge, D. M., Folt, C. L., & Shaw, J. R. (2012). Adaptive iterative design (AID): A novel approach for evaluating the interactive effects of multiple stressors on aquatic organisms. Science of The Total Environment, 432, 57–64. https://doi.org/10.1016/j.scitotenv.2012.05.074
+Glaholt, S. P., Kennedy, M. L., Turner, E., Colbourne, J. K., & Shaw, J. R. (2016). Thermal variation and factors influencing vertical migration behavior in Daphnia populations. Journal of Thermal Biology, 60, 70–78. https://doi.org/10.1016/j.jtherbio.2016.06.008
+Goddard, P. B., Kravitz, B., MacMartin, D. G., Visioni, D., Bednarz, E. M., & Lee, W. R. (2023). Stratospheric Aerosol Injection Can Reduce Risks to Antarctic Ice Loss Depending on Injection Location and Amount. Journal of Geophysical Research: Atmospheres, 128(22), e2023JD039434. https://doi.org/10.1029/2023JD039434
+Goddard, P., Kravitz, B., Scribner, A., Milks, K., & Peterson, C. (2024). Incorporating Climate Engineering into Secondary Education: A New Direction for Indiana’s Science Classrooms. The Hoosier Science Teacher, 47(1), 38–48. https://doi.org/10.14434/thst.v47i1.37892
+Golani, L. K., Wallace-Povirk, A., Deis, S. M., Wong, J., Ke, J., Gu, X., Raghavan, S., Wilson, M. R., Li, X., Polin, L., De Waal, P. W., White, K., Kushner, J., O’Connor, C., Hou, Z., Xu, H. E., Melcher, K., Dann, C. E., Matherly, L. H., & Gangjee, A. (2016). Tumor Targeting with Novel 6-Substituted Pyrrolo [2,3- d ] Pyrimidine Antifolates with Heteroatom Bridge Substitutions via Cellular Uptake by Folate Receptor α and the Proton-Coupled Folate Transporter and Inhibition of de Novo Purine Nucleotide Biosynthesis. Journal of Medicinal Chemistry, 59(17), 7856–7876. https://doi.org/10.1021/acs.jmedchem.6b00594
+Gomha, S. M., Al-Hussain, S. A., Zaki, M. E. A., Elangovan, N., & Berdimurodov, E. (2026). Synthesis and Structural Profiling of a Fluorinated Bis Schiff Base: A Comprehensive Study Via DFT and Molecular Topology. Journal of Fluorescence, 36(4), 3085–3106. https://doi.org/10.1007/s10895-026-04756-x
+Goodale, B. C., Hampton, T. H., Ford, E. N., Jackson, C. E., Shaw, J. R., Stanton, B. A., & King, B. L. (2019). Profiling microRNA expression in Atlantic killifish (Fundulus heteroclitus) gill and responses to arsenic and hyperosmotic stress. Aquatic Toxicology, 206, 142–153. https://doi.org/10.1016/j.aquatox.2018.11.009
+Graves, E., Aswar, S., Desai, R., Nampelli, S., Chakraborty, S., & Hall, T. (2024). AAVE Corpus Generation and Low-Resource Dialect Machine Translation. Proceedings of the 7th ACM SIGCAS/SIGCHI Conference on Computing and Sustainable Societies, 50–59. https://doi.org/10.1145/3674829.3675060
+Gregory, M. E., Kasthurirathne, S. N., Magoc, T., McNamee, C., Harle, C. A., & Vest, J. R. (2024). Development and validation of computable social phenotypes for health-related social needs. JAMIA Open, 8(1), ooae150. https://doi.org/10.1093/jamiaopen/ooae150
+Grossoehme, N. E., Li, L., Keane, S. C., Liu, P., Dann, C. E., Leibowitz, J. L., & Giedroc, D. P. (2009). Coronavirus N Protein N-Terminal Domain (NTD) Specifically Binds the Transcriptional Regulatory Sequence (TRS) and Melts TRS-cTRS RNA Duplexes. Journal of Molecular Biology, 394(3), 544–557. https://doi.org/10.1016/j.jmb.2009.09.040
+Guerra, A. J., Dann, C. E., & Giedroc, D. P. (2011). Crystal Structure of the Zinc-Dependent MarR Family Transcriptional Regulator AdcR in the Zn(II)-Bound State. Journal of the American Chemical Society, 133(49), 19614–19617. https://doi.org/10.1021/ja2080532
+Guerrero, D., Dzemidzic, M., Moghaddam, M., Liu, M., Avena-Koenigsberger, A., Harezlak, J., Kareken, D. A., Plawecki, M. H., Cyders, M. A., & Goñi, J. (2026). Resting state functional connectivity patterns associate with alcohol use disorder characteristics: Insights from the triple network model. NeuroImage: Clinical, 49, 103939. https://doi.org/10.1016/j.nicl.2025.103939
+Gupta, S., Nguyen, T., Raman, S., Lee, B., Lozano-Rojas, F., Bento, A., Simon, K., & Wing, C. (2021). Tracking Public and Private Responses to the COVID-19 Epidemic: Evidence from State and Local Government Actions. American Journal of Health Economics, 7(4), 361–404. https://doi.org/10.1086/716197
+Hammoud, N., Bibrzyck, Ł., Mathieu, V., Perry, R., & Szczepaniak, A. (2025). A Comprehensive Study of Double pion Photoproduction: A Regge Approach. Proceedings of 10th International Conference on Quarks and Nuclear Physics — PoS(QNP2024), 041. https://doi.org/10.22323/1.465.0041
+Hampton, T. H., Jackson, C., Jung, D., Chen, C. Y., Glaholt, S. P., Stanton, B. A., Colbourne, J. K., & Shaw, J. R. (2018). Arsenic Reduces Gene Expression Response to Changing Salinity in Killifish. Environmental Science & Technology, 52(15), 8811–8821. https://doi.org/10.1021/acs.est.8b01550
+Hanquier, J. N., Sanders, K., Berryhill, C. A., Sahoo, F. K., Hudmon, A., Vilseck, J. Z., & Cornett, E. M. (2023). Identification of nonhistone substrates of the lysine methyltransferase PRDM9. Journal of Biological Chemistry, 299(5), 104651. https://doi.org/10.1016/j.jbc.2023.104651
+Hansen, B., Miller, K., Seo, B., & Weber, C. (2020). TAXING THE POTENCY OF SIN GOODS: EVIDENCE FROM RECREATIONAL CANNABIS AND LIQUOR MARKETS. National Tax Journal, 73(2), 511–544. https://doi.org/10.17310/ntj.2020.2.07
+Hati, S., Yang, X., Gupta, P., Muhoberac, B. B., Pu, J., Zhang, J., & Sardar, R. (2023). Hybrid Metal–Ligand Interfacial Dipole Engineering of Functional Plasmonic Nanostructures for Extraordinary Responses of Optoelectronic Properties. ACS Nano, 17(17), 17499–17515. https://doi.org/10.1021/acsnano.3c06047
+Hayashi, S., Caron, B. A., Heinsfeld, A. S., Vinci-Booher, S., McPherson, B., Bullock, D. N., Bertò, G., Niso, G., Hanekamp, S., Levitas, D., Ray, K., MacKenzie, A., Avesani, P., Kitchell, L., Leong, J. K., Nascimento-Silva, F., Koudoro, S., Willis, H., Jolly, J. K., … Pestilli, F. (2024a). Author Correction: Brainlife.io: a decentralized and open-source cloud platform to support neuroscience research. Nature Methods, 21(6), 1131–1131. https://doi.org/10.1038/s41592-024-02296-5
+Hayashi, S., Caron, B. A., Heinsfeld, A. S., Vinci-Booher, S., McPherson, B., Bullock, D. N., Bertò, G., Niso, G., Hanekamp, S., Levitas, D., Ray, K., MacKenzie, A., Avesani, P., Kitchell, L., Leong, J. K., Nascimento-Silva, F., Koudoro, S., Willis, H., Jolly, J. K., … Pestilli, F. (2024b). brainlife.io: A decentralized and open-source cloud platform to support neuroscience research. Nature Methods, 21(5), 809–813. https://doi.org/10.1038/s41592-024-02237-2
+He, J., Xu, Q., Jing, Y., Agani, F., Qian, X., Carpenter, R., Li, Q., Wang, X., Peiper, S. S., Lu, Z., Liu, L., & Jiang, B. (2012). Reactive oxygen species regulate ERBB2 and ERBB3 expression via miR‐199a/125b and DNA methylation. The EMBO Reports, 13(12), 1116–1122. https://doi.org/10.1038/embor.2012.162
+Hege, M., Li, L., & Pu, J. (2023). Revealing intrinsic changes of DNA induced by spore photoproduct lesion through computer simulation. Biophysical Chemistry, 296, 106992. https://doi.org/10.1016/j.bpc.2023.106992
+Hensel, D. J., Hummer, T. A., Acrurio, L. R., James, T. W., & Fortenberry, J. D. (2015). Feasibility of Functional Neuroimaging to Understand Adolescent Women’s Sexual Decision Making. Journal of Adolescent Health, 56(4), 389–395. https://doi.org/10.1016/j.jadohealth.2014.11.004
+Herms, E. N., Bolbecker, A. R., & Wisner, K. M. (2022). Emotion regulation and delusion-proneness relate to empathetic tendencies in a transdiagnostic sample. Frontiers in Psychiatry, 13, 992757. https://doi.org/10.3389/fpsyt.2022.992757
+Herms, E. N., Bolbecker, A. R., & Wisner, K. M. (2024). Impaired Sleep Mediates the Relationship Between Interpersonal Trauma and Subtypes of Delusional Ideation. Schizophrenia Bulletin, 50(3), 642–652. https://doi.org/10.1093/schbul/sbad081
+Herms, E. N., Brown, J. W., Wisner, K. M., Hetrick, W. P., Zald, D. H., & Purcell, J. R. (2024). Modeling Decision-Making in Schizophrenia: Associations Between Computationally Derived Risk Propensity and Self-Reported Risk Perception. Schizophrenia Bulletin, 51(1), 133–144. https://doi.org/10.1093/schbul/sbae144
+Herms, E. N., & Wisner, K. M. (2025). Moving from isolation to integration: A Bayesian multisensory perspective of interoception and psychosis. Neuropsychopharmacology, 50(13), 1913–1915. https://doi.org/10.1038/s41386-025-02250-9
+Herms, E., & Wisner, K. (2023). 0139 Impaired Sleep Mediates the Relationship Between Interpersonal Trauma and Subtypes of Delusional Ideation. SLEEP, 46(Supplement_1), A63–A63. https://doi.org/10.1093/sleep/zsad077.0139
+Herzog, C. R., Zhang, J., Feng, X., Dang, T. T., Yu, X., Huang, J., Fang, F., Gao, H., Yu, X., Wang, Y., Han, R., Liu, Y., Cornetta, K., Xiao, W., & Xu, W. (2025). Bioinformatic Analysis of the Genetic Basis of Differential Adeno-Associated Virus Production Capability of 293 Variants. Human Gene Therapy, 36(9–10), 801–813. https://doi.org/10.1089/hum.2025.002
+Hipp, A. L., Althaus, K. N., Fuller, E. L., Hahn, M., Larson, D. A., Mohn, R. A., Wang, B., & Manos, P. S. (2026). Resolving the oak tree of life: Comparing RADseq and whole genome resequencing methods for oak phylogenetics. Evolutionary Biology. https://doi.org/10.64898/2026.05.14.725274
+Hirsch, A. G., Conderino, S., Crume, T. L., Liese, A. D., Bellatorre, A., Bendik, S., Divers, J., Anthopolos, R., Dixon, B. E., Guo, Y., Imperatore, G., Lee, D. C., Reynolds, K., Rosenman, M., Shao, H., Utidjian, L., & Thorpe, L. E. (2024). Using electronic health records to enhance surveillance of diabetes in children, adolescents and young adults: A study protocol for the DiCAYA Network. BMJ Open, 14(1), e073791. https://doi.org/10.1136/bmjopen-2023-073791
+Hirschfeld, L. R., Deardorff, R., Chumin, E. J., Wu, Y.-C., McDonald, B. C., Cao, S., Risacher, S. L., Yi, D., Byun, M. S., Lee, J.-Y., Kim, Y. K., Kang, K. M., Sohn, C.-H., Nho, K., Saykin, A. J., Lee, D. Y., & for the KBASE Research Group. (2023). White matter integrity is associated with cognition and amyloid burden in older adult Koreans along the Alzheimer’s disease continuum. Alzheimer’s Research & Therapy, 15(1), 218. https://doi.org/10.1186/s13195-023-01369-5
+Hockaden, N., Leriger, G., Wang, J., Ray, H., Chakrabarti, S., Downing, N., Desmond, J., Williams, D., Hollenhorst, P. C., Longmore, G., & Carpenter, R. L. (2025). Amyloidogenesis promotes HSF1 activity enhancing cell survival during breast cancer metastatic colonization. Cell Stress and Chaperones, 30(3), 143–159. https://doi.org/10.1016/j.cstres.2025.03.003
+Hong, J., Peela, B., Georgescu, A. B., Fertig, H. A., Zhu, H., & Zhang, S. (2025). Influence of chromium intercalation in self-intercalated van der Waals magnets C r 1 + δ T e 2. Physical Review Materials, 9(9), 094414. https://doi.org/10.1103/4mqg-l8f5
+Hou, Z., Jiang, M., Liu, H., & Zhuang, Y. (2025). LLM-Integrated Normalization and Knowledge for FHIR (LINK-FHIR). In M. S. Househ, Z. U. A. Tariq, M. Al-Zubaidi, U. Shah, & E. Huesing (Eds.), Studies in Health Technology and Informatics. IOS Press. https://doi.org/10.3233/SHTI250793
+Hou, Z., Liu, H., Bian, J., He, X., & Zhuang, Y. (2025). Enhancing medical coding efficiency through domain-specific fine-tuned large language models. Npj Health Systems, 2(1), 14. https://doi.org/10.1038/s44401-025-00018-3
+Hozo, I., & Djulbegovic, B. (2025). Theory of clinical therapeutic progress: Reconciling equipoise with fat-tailed (skewed) outcomes. Journal of Clinical Epidemiology, 188, 112004. https://doi.org/10.1016/j.jclinepi.2025.112004
+Huang, J.-Y., Hess, M., Bajpai, A., Li, X., Hobson, L. N., Xu, A. J., Barton, S. J., & Lu, H.-C. (2025). From initial formation to developmental refinement: GABAergic inputs shape neuronal subnetworks in the primary somatosensory cortex. iScience, 28(3), 112104. https://doi.org/10.1016/j.isci.2025.112104
+Hudson, J., & Jolly, M. (2019). Numerical efficacy study of data assimilation for the 2D magnetohydrodynamic equations. Journal of Computational Dynamics, 6(1), 131–145. https://doi.org/10.3934/jcd.2019006
+Hui, P.-M., Shao, C., Flammini, A., Menczer, F., & Ciampaglia, G. L. (2018). The Hoaxy Misinformation and Fact-Checking Diffusion Network. Proceedings of the International AAAI Conference on Web and Social Media, 12(1). https://doi.org/10.1609/icwsm.v12i1.14986
+Hui, P.-M., Yang, K.-C., Torres-Lugo, C., & Menczer, F. (2020). BotSlayer: DIY Real-Time Influence Campaign Detection. Proceedings of the International AAAI Conference on Web and Social Media, 14, 980–982. https://doi.org/10.1609/icwsm.v14i1.7370
+Hui, P.-M., Yang, K.-C., Torres-Lugo, C., Monroe, Z., McCarty, M., Serrette, B., Pentchev, V., & Menczer, F. (2019). BotSlayer: Real-time detection of bot amplification on Twitter. Journal of Open Source Software, 4(42), 1706. https://doi.org/10.21105/joss.01706
+Huizenga, C. D., Vaish, S., Dwyer, C., Abou Taka, A., Bovill, A. J., Thompson, L. M., Hratchian, H. P., & Jarrold, C. C. (2025). Exploring Anomalous Photoelectron Angular Distributions in the Photoelectron Spectra of Gd3 O3–: Study of Gd3 O2– and Gd3 O3– Using Photoelectron Spectroscopy and Density Functional Theory Calculations. The Journal of Physical Chemistry A, 129(50), 11607–11623. https://doi.org/10.1021/acs.jpca.5c06858
+Huizenga, C., Hratchian, H. P., & Jarrold, C. C. (2021). Lanthanide Oxides: From Diatomics to High-Spin, Strongly Correlated Homo- and Heterometallic Clusters. The Journal of Physical Chemistry A, 125(29), 6315–6331. https://doi.org/10.1021/acs.jpca.1c04253
+Huizenga, C., Vaish, S., & Chick Jarrold, C. (2022). A SPECTROSCOPIC INVESTIGATION OF THE EFFECTS OF SPIN STRAIN ON LN3O− CLUSTERS. Proceedings of the 2022 International Symposium on Molecular Spectroscopy, 1–1. https://doi.org/10.15278/isms.2022.WD03
+Hundley, H. A., Rajendren, S., Manning, A. C., & Takagi, Y. (2018). Dimerization of ADARs Expands The Range of Substrates That Can Undergo A‐to‐I RNA Editing. The FASEB Journal, 32(S1). https://doi.org/10.1096/fasebj.2018.32.1_supplement.650.11
+Hundley, H., & Mahapatra, A. (2025). Abstract 2524 The kinase GSK-3 regulates the RNA binding protein landscape in the nervous system to control survival to hypoxia. Journal of Biological Chemistry, 301(5), 109714. https://doi.org/10.1016/j.jbc.2025.109714
+Hutchison, D., Kanade, T., Kittler, J., Kleinberg, J. M., Mattern, F., Mitchell, J. C., Naor, M., Nierstrasz, O., Pandu Rangan, C., Steffen, B., Sudan, M., Terzopoulos, D., Tygar, D., Vardi, M. Y., Weikum, G., Kadihasanoglu, D., Beer, R. D., & Bingham, G. P. (2010). The Dependence of Braking Strategies on Optical Variables in an Evolved Model of Visually-Guided Braking. In S. Doncieux, B. Girard, A. Guillot, J. Hallam, J.-A. Meyer, & J.-B. Mouret (Eds.), From Animals to Animats 11 (Vol. 6226, pp. 555–564). Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-15193-4_52
+Hutchison, D., Kanade, T., Kittler, J., Kleinberg, J. M., Mattern, F., Mitchell, J. C., Naor, M., Nierstrasz, O., Pandu Rangan, C., Steffen, B., Sudan, M., Terzopoulos, D., Tygar, D., Vardi, M. Y., Weikum, G., Williams, P. L., & Beer, R. D. (2010). Information Dynamics of Evolved Agents. In S. Doncieux, B. Girard, A. Guillot, J. Hallam, J.-A. Meyer, & J.-B. Mouret (Eds.), From Animals to Animats 11 (Vol. 6226, pp. 38–49). Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-15193-4_4
+Hwang, W., Austin, S. L., Blondel, A., Boittier, E. D., Boresch, S., Buck, M., Buckner, J., Caflisch, A., Chang, H.-T., Cheng, X., Choi, Y. K., Chu, J.-W., Crowley, M. F., Cui, Q., Damjanovic, A., Deng, Y., Devereux, M., Ding, X., Feig, M. F., … Karplus, M. (2024). CHARMM at 45: Enhancements in Accessibility, Functionality, and Speed. The Journal of Physical Chemistry B, 128(41), 9976–10042. https://doi.org/10.1021/acs.jpcb.4c04100
+Hypki, A., Vesperini, E., Giersz, M., Hong, J., Askar, A., Otulakowska-Hypka, M., Hellstrom, L., & Wiktorowicz, G. (2025). MOCCA: Global properties of tidally filling and underfilling globular star clusters with multiple stellar populations. Astronomy & Astrophysics, 693, A41. https://doi.org/10.1051/0004-6361/202348653
+Inda‐Díaz, H. A., O’Brien, T. A., Zhou, Y., & Collins, W. D. (2021). Constraining and Characterizing the Size of Atmospheric Rivers: A Perspective Independent From the Detection Algorithm. Journal of Geophysical Research: Atmospheres, 126(16), e2020JD033746. https://doi.org/10.1029/2020JD033746
+Inderstrodt, J., Riggins, D., Greenwell, A., Price, J., Williams, J., Bezy, E., Forkner, A., Bowman, E., Miller, S., Schleyer, T., Grannis, S., & Dixon, B. (2024). A statewide system for maternal-infant linked longitudinal surveillance: Indiana’s model for improving maternal and child health. International Journal of Population Data Science, 9(2). https://doi.org/10.23889/ijpds.v9i2.2395
+Indiana University Bloomington, Izquierdo, E., Aguilera, M., & Beer, R. (2013). Analysis of Ultrastability in Small Dynamical Recurrent Neural Networks. Advances in Artificial Life, ECAL 2013, 51–58. https://doi.org/10.1162/978-0-262-31709-2-ch008
+Indiana University Bloomington, Williams, P., & Beer, R. (2013). Environmental Feedback Drives Multiple Behaviors from the Same Neural Circuit. Advances in Artificial Life, ECAL 2013, 268–275. https://doi.org/10.1162/978-0-262-31709-2-ch041
+Indiana University Bloomington, Izquierdo, E., Aguilera, M., & Beer, R. (2013). Analysis of Ultrastability in Small Dynamical Recurrent Neural Networks. Advances in Artificial Life, ECAL 2013, 51–58. https://doi.org/10.7551/978-0-262-31709-2-ch008
+Indiana University Bloomington, Williams, P., & Beer, R. (2013). Environmental Feedback Drives Multiple Behaviors from the Same Neural Circuit. Advances in Artificial Life, ECAL 2013, 268–275. https://doi.org/10.7551/978-0-262-31709-2-ch041
+Indiana University, USA, Miehling, D., Dakota, D., Indiana University, USA, Kübler, S., & Indiana University, USA. (2025). Investigating Polarization in YouTube Comments via Aspect-Based Sentiment Analysis. 718–728. https://doi.org/10.26615/978-954-452-098-4-083
+Innani, S., Bell, W. R., Harmsen, H., Nasrallah, M. P., Baheti, B., & Bakas, S. (2025). Interpretable artificial intelligence based determination of glioma IDH mutation status directly from histology slides. Neuro-Oncology Advances, 7(1), vdaf140. https://doi.org/10.1093/noajnl/vdaf140
+Innani, S., Bell, W. R., Nasrallah, M. P., Baheti, B., & Bakas, S. (2025). PATH-67. AI-based WHO 2021 classification of adult-type diffuse glioma solely from H&E-stained slides. Neuro-Oncology, 27(Supplement_5), v256–v256. https://doi.org/10.1093/neuonc/noaf201.1019
+Innani, S., Bell, W. R., Nasrallah, M. P., Baheti, B., & Bakas, S. (2026). AI-driven WHO 2021 classification of gliomas based only on H&E-stained slides. Neuro-Oncology, 28(1), 282–296. https://doi.org/10.1093/neuonc/noaf189
+Innani, S., Pitarch-Abaigar, C., Marwan, M. M., Harmsen, H., Bell, W. R., Makris, D., & Bakas, S. (2025). PATH-69. AI-based prognostic risk stratification of adult-type diffuse gliomas using H&E-stained slides. Neuro-Oncology, 27(Supplement_5), v257–v257. https://doi.org/10.1093/neuonc/noaf201.1021
+Ipe, J., Li, R., Metzger, I. F., Bo Li Lu, J., Gufford, B. T., Desta, Z., Liu, Y., & Skaar, T. C. (2021). Circulating miRNAs as Biomarkers for CYP2B6 Enzyme Activity. Clinical Pharmacology & Therapeutics, 109(2), 485–493. https://doi.org/10.1002/cpt.2018
+Irvine, P. J., Boucher, O., Kravitz, B., Alterskjaer, K., Cole, J. N. S., Ji, D., Jones, A., Lunt, D. J., Moore, J. C., Muri, H., Niemeier, U., Robock, A., Singh, B., Tilmes, S., Watanabe, S., Yang, S., & Yoon, J.-H. (2014). Key factors governing uncertainty in the response to sunshade geoengineering from a comparison of the GeoMIP ensemble and a perturbed parameter ensemble. Journal of Geophysical Research: Atmospheres, 119(13), 7946–7962. https://doi.org/10.1002/2013JD020716
+Iyamu, I. D., Vilseck, J. Z., Yadav, R., Noinaj, N., & Huang, R. (2022). Exploring Unconventional SAM Analogues To Build Cell‐Potent Bisubstrate Inhibitors for Nicotinamide N ‐Methyltransferase. Angewandte Chemie International Edition, 61(16), e202114813. https://doi.org/10.1002/anie.202114813
+Izquierdo, E. J., & Beer, R. D. (2013). Connecting a Connectome to Behavior: An Ensemble of Neuroanatomical Models of C. elegans Klinotaxis. PLoS Computational Biology, 9(2), e1002890. https://doi.org/10.1371/journal.pcbi.1002890
+Izquierdo, E. J., & Beer, R. D. (2016a). Propagation of rhythmic dorsoventral wave in a neuromechanical model of locomotion in Caernohabditis elegans. Proceedings of the Artificial Life Conference 2016, 544–545. https://doi.org/10.7551/978-0-262-33936-0-ch087
+Izquierdo, E. J., & Beer, R. D. (2016b). Propagation of rhythmic dorsoventral wave in a neuromechanical model of locomotion in Caernohabditis elegans. Proceedings of the Artificial Life Conference 2016, 544–545. https://doi.org/10.1162/978-0-262-33936-0-ch087
+Izquierdo, E. J., & Beer, R. D. (2016c). The whole worm: Brain–body–environment models of C. elegans. Current Opinion in Neurobiology, 40, 23–30. https://doi.org/10.1016/j.conb.2016.06.005
+Jackson, C. E., Xu, S., Ye, Z., Pfrender, M. E., Lynch, M., Colbourne, J. K., & Shaw, J. R. (2021). Chromosomal rearrangements preserve adaptive divergence in ecological speciation. Evolutionary Biology. https://doi.org/10.1101/2021.08.20.457158
+Jackson, H. J., Yepes, J. F., Scully, A. C., Vinson, L. A., Jones, J. E., Eckert, G., Downey, T., & Maupomé, G. (2023). Topical fluoride impact in future restorative dental procedures. The Journal of the American Dental Association, 154(10), 876–884. https://doi.org/10.1016/j.adaj.2023.06.012
+JafariAsbagh, M., Ferrara, E., Varol, O., Menczer, F., & Flammini, A. (2014). Clustering memes in social media streams. Social Network Analysis and Mining, 4(1), 237. https://doi.org/10.1007/s13278-014-0237-x
+James, T. W., Folco, K. L., & Levitas, D. J. (2023). Neural segregation and integration of sensory, decision, and action processes during object categorization. Neuropsychologia, 190, 108695. https://doi.org/10.1016/j.neuropsychologia.2023.108695
+Jayachitra, R., Thilagavathi, G., Kanagavalli, A., Elangovan, N., Sirajunnisa, A., Sowrirajan, S., & Thomas, R. (2023). Synthesis, Computational, Electronic spectra, and molecular docking studies of 4-((diphenylmethylene)amino)-N-(pyrimidin-2-yl)benzenesulfonamide. Journal of the Indian Chemical Society, 100(1), 100836. https://doi.org/10.1016/j.jics.2022.100836
+Jiang, B., Wang, S., Xie, J., Kim, H., Tukker, A. M., Wang, J., Bowman, A. B., Yuan, C., & Baloni, P. (2025). Neuronal subtype-specific metabolic changes in neurodegenerative and neuropsychiatric diseases predicted via a systems biology-based approach. Systems Biology. https://doi.org/10.1101/2025.11.03.686281
+Jiang, G., Reiter, J. L., Dong, C., Wang, Y., Fang, F., Jiang, Z., & Liu, Y. (2023). Genetic Regulation of Human isomiR Biogenesis. Cancers, 15(17), 4411. https://doi.org/10.3390/cancers15174411
+Jiang, Y., Mondal, D., & Lewis, J. C. (2022). Expanding the Reactivity of Flavin-Dependent Halogenases toward Olefins via Enantioselective Intramolecular Haloetherification and Chemoenzymatic Oxidative Rearrangements. ACS Catalysis, 12(21), 13501–13505. https://doi.org/10.1021/acscatal.2c03383
+Jikeli, G., Axelrod, D., Fischer, R. K., Forouzesh, E., Jeong, W., Miehling, D., & Soemer, K. (2024). Differences between antisemitic and non-antisemitic English language tweets. Computational and Mathematical Organization Theory, 30(3), 232–266. https://doi.org/10.1007/s10588-022-09363-2
+Jikeli, G., & Soemer, K. (2023). The value of manual annotation in assessing trends of hate speech on social media: Was antisemitism on the rise during the tumultuous weeks of Elon Musk’s Twitter takeover? Journal of Computational Social Science, 6(2), 943–971. https://doi.org/10.1007/s42001-023-00219-6
+Jikeli, G., Soemer, K., & Karali, S. (2024). Annotating live messages on social media. Testing the efficiency of the AnnotHate – live data annotation portal. Journal of Computational Social Science, 7(1), 571–585. https://doi.org/10.1007/s42001-024-00251-0
+Jo, T., Lee, E. H., & for the Alzheimer’s Disease Neuroimaging Initiative (ADNI) and the Alzheimer’s Disease Sequencing Project (ADSP). (2025). Uncertainty-aware genomic classification of Alzheimer’s disease: A transformer-based ensemble approach with Monte Carlo dropout. Briefings in Bioinformatics, 26(6), bbaf587. https://doi.org/10.1093/bib/bbaf587
+Johnson, D. P. (2026). A foundation-model GeoAI framework for continuous heat and health risk mapping. Frontiers in Environmental Science, 14, 1770260. https://doi.org/10.3389/fenvs.2026.1770260
+Johnson, D. P., Filippelli, G., & Heintzelman, A. (2025). Evaluating PM2.5 Exposure Disparities Through Agent-Based Geospatial Modeling in an Urban Airshed. Air, 3(4), 33. https://doi.org/10.3390/air3040033
+Johnson, D. P., & Lulla, V. (2022). Predicting COVID-19 community infection relative risk with a Dynamic Bayesian Network. Frontiers in Public Health, 10, 876691. https://doi.org/10.3389/fpubh.2022.876691
+Johnson, D. P., & Owusu, C. (2024). Examining associations between social vulnerability indices and COVID-19 incidence and mortality with spatial-temporal Bayesian modeling. Spatial and Spatio-Temporal Epidemiology, 48, 100623. https://doi.org/10.1016/j.sste.2023.100623
+Johnson, D. P., Ravi, N., & Braneon, C. V. (2021). Spatiotemporal Associations Between Social Vulnerability, Environmental Measurements, and COVID‐19 in the Conterminous United States. GeoHealth, 5(8), e2021GH000423. https://doi.org/10.1029/2021GH000423
+Johnson, K., & Sherrill, E. (2026). Eroding asperities imply larger locked regions on subduction megathrusts. In Review. https://doi.org/10.21203/rs.3.rs-8714153/v1
+Jolly, M. S., & Pakzad, A. (2023a). Data assimilation with higher order finite element interpolants. International Journal for Numerical Methods in Fluids, 95(3), 472–490. https://doi.org/10.1002/fld.5152
+Jolly, M. S., & Pakzad, A. (2023b). Data assimilation with higher order finite element interpolants. International Journal for Numerical Methods in Fluids, 95(3), 472–490. https://doi.org/10.1002/fld.5152
+Jolly, M. S., & Wirosoetisno, D. (2020). Tracer Turbulence: The Batchelor–Howells–Townsend Spectrum Revisited. Journal of Mathematical Fluid Mechanics, 22(2), 18. https://doi.org/10.1007/s00021-019-0478-6
+Jones, A., Haywood, J. M., Jones, A. C., Tilmes, S., Kravitz, B., & Robock, A. (2021). North Atlantic Oscillation response in GeoMIP experiments G6solar and G6sulfur: Why detailed modelling is needed for understanding regional implications of solar radiation management. Atmospheric Chemistry and Physics, 21(2), 1287–1304. https://doi.org/10.5194/acp-21-1287-2021
+Jones, A., Haywood, J. M., Scaife, A. A., Boucher, O., Henry, M., Kravitz, B., Lurton, T., Nabat, P., Niemeier, U., Séférian, R., Tilmes, S., & Visioni, D. (2022). The impact of stratospheric aerosol intervention on the North Atlantic and Quasi-Biennial Oscillations in the Geoengineering Model Intercomparison Project (GeoMIP) G6sulfur experiment. Atmospheric Chemistry and Physics, 22(5), 2999–3016. https://doi.org/10.5194/acp-22-2999-2022
+Jones, R. M., Andrews, J. G., Dalton, A. F., Dixon, B. E., Dzomba, B. J., Fernando, S. I., Pogreba-Brown, K. M., Ortiz, M. R., Sharma, V., Simmons, N., Saydah, S. H., for the Track PCC Study Group, Slen, J., Smith, L., McComack, J., McCullough, M., Young, B., Arora, M. K., Epstein, R., … Thomas, J. (2024). Tracking the burden, distribution, and impact of Post-COVID conditions in diverse populations for children, adolescents, and adults (Track PCC): Passive and active surveillance protocols. BMC Public Health, 24(1), 2345. https://doi.org/10.1186/s12889-024-19772-4
+Jonnalagadda, P., Dixon, B. E., Williams, L. S., & Rahurkar, S. (2026). Leveraging real-world data for population health outcomes research: Evaluating all-cause mortality in stroke hospitalization using a statewide health information exchange. Critical Public Health, 36(1), 2659432. https://doi.org/10.1080/09581596.2026.2659432
+Jung, D., Adamo, M. A., Lehman, R. M., Barnaby, R., Jackson, C. E., Jackson, B. P., Shaw, J. R., & Stanton, B. A. (2015). A novel variant of aquaporin 3 is expressed in killifish (Fundulus heteroclitus) intestine. Comparative Biochemistry and Physiology Part C: Toxicology & Pharmacology, 171, 1–7. https://doi.org/10.1016/j.cbpc.2015.03.001
+Jury-Garfe, N., Redding-Ochoa, J., You, Y., Martínez, P., Karahan, H., Chimal-Juárez, E., Johnson, T. S., Zhang, J., Resnick, S., Kim, J., Troncoso, J. C., & Lasagna-Reeves, C. A. (2024). Enhanced microglial dynamics and a paucity of tau seeding in the amyloid plaque microenvironment contribute to cognitive resilience in Alzheimer’s disease. Acta Neuropathologica, 148(1), 15. https://doi.org/10.1007/s00401-024-02775-1
+K. Al Rawas, H., Al Mawla, R., Pham, T. Y. N., Truong, D. H., Nguyen, T. L. A., Taamalli, S., Ribaucour, M., El Bakali, A., Černušák, I., Dao, D. Q., & Louis, F. (2023). New insight into environmental oxidation of phosmet insecticide initiated by HO˙ radicals in gas and water – a theoretical study. Environmental Science: Processes & Impacts, 25(12), 2042–2056. https://doi.org/10.1039/D3EM00325F
+Kachwala, Z., An, J., Kwak, H., & Menczer, F. (2024). REMATCH: Robust and Efficient Matching of Local Knowledge Graphs to Improve Structural and Semantic Similarity. Findings of the Association for Computational Linguistics: NAACL 2024, 1018–1028. https://doi.org/10.18653/v1/2024.findings-naacl.64
+Kadihasanoglu, D., Beer, R. D., & Bingham, G. P. (2017). An evolutionary robotics model of visually-guided braking: Testing optical variables. Proceedings of the 14th European Conference on Artificial Life ECAL 2017, 230–236. https://doi.org/10.7551/ecal_a_040
+Kalema, N., Musick, B., Babirye, S., Najjemba, L., Mubiri, P., Kiragga, A., Ddungu, A., Kasozi, C., Diero, L. O., Odhiambo, F., Lyamuya, R., Castelnuovo, B., Musaazi, J., Yiannoutsos, C. T., Wools-Kaloustian, K., & Semeere, A. (2025). Trends in prevalent TB among persons enrolling for HIV care before and after ‘Test and Treat’ across East-Africa. IJTLD Open, 2(6), 359–365. https://doi.org/10.5588/ijtldopen.24.0687
+Kalgaonkar, P., & El-Sharkawy, M. (2021a). CondenseNeXt: An Ultra-Efficient Deep Neural Network for Embedded Systems. 2021 IEEE 11th Annual Computing and Communication Workshop and Conference (CCWC), 0524–0528. https://doi.org/10.1109/CCWC51732.2021.9375950
+Kalgaonkar, P., & El-Sharkawy, M. (2021b). EffCNet: An Efficient CondenseNet for Image Classification on NXP BlueBox. American Journal of Electrical and Computer Engineering, 5(2), 77. https://doi.org/10.11648/j.ajece.20210502.15
+Kalgaonkar, P., & El-Sharkawy, M. (2021c). Image Classification with CondenseNeXt for ARM-Based Computing Platforms. 2021 IEEE International IOT, Electronics and Mechatronics Conference (IEMTRONICS), 1–6. https://doi.org/10.1109/IEMTRONICS52119.2021.9422541
+Kalgaonkar, P., & El-Sharkawy, M. (2022a). CondenseNeXtV2: Light-Weight Modern Image Classifier Utilizing Self-Querying Augmentation Policies. Journal of Low Power Electronics and Applications, 12(1), 8. https://doi.org/10.3390/jlpea12010008
+Kalgaonkar, P., & El-Sharkawy, M. (2022b). NextDet: Efficient Sparse-to-Dense Object Detection with Attentive Feature Aggregation. Future Internet, 14(12), 355. https://doi.org/10.3390/fi14120355
+Kalgaonkar, P., & El-Sharkawy, M. (2023). An Improved Lightweight Network Using Attentive Feature Aggregation for Object Detection in Autonomous Driving. Journal of Low Power Electronics and Applications, 13(3), 49. https://doi.org/10.3390/jlpea13030049
+Kanagavalli, A., Jayachitra, R., Thilagavathi, G., Padmavathy, M., Elangovan, N., Sowrirajan, S., & Thomas, R. (2023). Synthesis, structural, spectral, computational, docking and biological activities of Schiff base (E)-4-bromo-2-hydroxybenzylidene) amino)-N-(pyrimidin-2-yl) benzenesulfonamide from 5-bromosalicylaldehyde and sulfadiazine. Journal of the Indian Chemical Society, 100(1), 100823. https://doi.org/10.1016/j.jics.2022.100823
+Kanakri, W., & King, B. (2025). PK-Judge: Enhancing IP Protection of Neural Network Models Using an Asymmetric Approach. Big Data and Cognitive Computing, 9(3), 66. https://doi.org/10.3390/bdcc9030066
+Karahan, H., Hartigan, K., Al‐Amin, M. M., John, S. K., McCord, B., Wijeratne, H. R. S., Acri, D. J., Smith, D. C., Dabin, L. C., Cordero, H. M. R., Kim, B., Lee, D., & Kim, J. (2025). Deletion of neuronal Idol ameliorates Alzheimer’s disease–related pathologies via APOE receptors. Alzheimer’s & Dementia, 21(12), e70949. https://doi.org/10.1002/alz.70949
+Kasem, K. K., Pu, J., & Cox, L. (2023). Photoactivities of thiophene monomer/polymer transition in gel–based photoelectrochemical assembly: A theoretical/experimental approach. International Journal of Electrochemical Science, 18(4), 100077. https://doi.org/10.1016/j.ijoes.2023.100077
+Katinas, J. M., Nayeen, Md. J., Schneider, M., Shah, K., Fifer, A. N., Klapper, L. M., Sharma, A., Thalluri, K., Van Nieuwenhze, M. S., Hou, Z., Gangjee, A., Matherly, L. H., & Dann, C. E. (2024). Structural Characterization of 5-Substituted Pyrrolo[3,2- d ]pyrimidine Antifolate Inhibitors in Complex with Human Serine Hydroxymethyl Transferase 2. Biochemistry, acs.biochem.3c00613. https://doi.org/10.1021/acs.biochem.3c00613
+Katori, T., Kostelecký, V. A., & Tayloe, R. (2011). Global three-parameter model for neutrino oscillations using Lorentz violation. Nuclear Physics B - Proceedings Supplements, 221, 357. https://doi.org/10.1016/j.nuclphysbps.2011.10.007
+Katori, T., Tayloe, R., & FOR THE MINIBOONE COLLABORATION. (2008). TEST FOR LORENTZ VIOLATION IN THE MINIBOONE NEUTRINO OSCILLATION EXPERIMENT. CPT and Lorentz Symmetry, 296–298. https://doi.org/10.1142/9789812779519_0048
+Kauffman, S. J., Awori, R. M., Allwell, E. C., Taylor, A., Bashey, F., & Goodrich-Blair, H. (2026). Genomic diversification and tailocin-mediated competition in animal-associated Xenorhabdus bacteria. ISME Communications, 6(1), ycag050. https://doi.org/10.1093/ismeco/ycag050
+Kaur, J., Hoang, D. T., Sun, X., Possamai, L., JafariAsbagh, M., Patil, S., & Menczer, F. (2012). Scholarometer: A Social Framework for Analyzing Impact across Disciplines. PLoS ONE, 7(9), e43235. https://doi.org/10.1371/journal.pone.0043235
+Keith, N., Glaholt, S. P., Jackson, C. E., Young, K., De Schamphelaere, K., Colbourne, J. K., & Shaw, J. R. (2026). Discovery and Evaluation of Cadmium‐Adapted Daphnia pulex Genotypes in a Region of Historical Mining Reveals Adaptation Protects the Germline From Cadmium‐Induced Mutations. Molecular Ecology, 35(9), e70357. https://doi.org/10.1111/mec.70357
+Keith, N., Jackson, C. E., Glaholt, S. P., Young, K., Lynch, M., & Shaw, J. R. (2021). Genome-Wide Analysis of Cadmium-Induced, Germline Mutations in a Long-Term Daphnia pulex Mutation-Accumulation Experiment. Environmental Health Perspectives, 129(10), 107003. https://doi.org/10.1289/EHP8932
+Keith, N., Tucker, A. E., Jackson, C. E., Sung, W., Lucas Lledó, J. I., Schrider, D. R., Schaack, S., Dudycha, J. L., Ackerman, M., Younge, A. J., Shaw, J. R., & Lynch, M. (2016). High mutational rates of large-scale duplication and deletion in Daphnia pulex. Genome Research, 26(1), 60–69. https://doi.org/10.1101/gr.191338.115
+Kelemen, K., Orbán-Kis, K., Szentes, Á., Nagy, Z. A., Kelemen, H., Fehér, A., Bába, L.-I., Gáll, Z., Horváth, E., Katona, I., Szatmári, S., Szász, J. A., & Szilágyi, T. (2025). Distribution of NECAB1-Positive Neurons in Normal and Epileptic Brain—Expression Changes in Temporal Lobe Epilepsy and Modulation by Levetiracetam and Brivaracetam. International Journal of Molecular Sciences, 26(10), 4906. https://doi.org/10.3390/ijms26104906
+Kelemen, K., Sárosi, M., Csüdör, Á., Orbán-Kis, K., Kelemen, H., Bába, L., Gáll, Z., Horváth, E., Katona, I., & Szilágyi, T. (2025). Marked differences in the effects of levetiracetam and its analogue brivaracetam on microglial, astrocytic, and neuronal density in the rat model of kainic acid-induced temporal lobe epilepsy. Frontiers in Pharmacology, 16, 1553545. https://doi.org/10.3389/fphar.2025.1553545
+Kersey, H. N., Acri, D. J., Dabin, L. C., Hartigan, K. A., Mustaklem, R., Park, J. H., & Kim, J. (2026). Comparative analysis of nuclei isolation methods for brain single-nucleus RNA sequencing. Cell Reports Methods, 6(3), 101337. https://doi.org/10.1016/j.crmeth.2026.101337
+Khairbek, A. A., Al-Zaben, M. I., Alzahrani, A. Y. A., & Thomas, R. (2026). Interpretable machine-learning prediction of DFT energies per atom and identification of magic numbers in coinage-metal nanoclusters ( N ≤ 55) from the open quantum cluster database. Physical Chemistry Chemical Physics, 28(23), 14300–14310. https://doi.org/10.1039/D6CP01474G
+Khan, H., Ali, Q., Shah, M. H., Muhammad, K., Shah, A., AlAsmari, A. F., Alasmari, F., & Khan, M. (2026). A detailed DFT inspection on the trapping of aspirin from drinking water using B12N12 nanocage. Scientific Reports. https://doi.org/10.1038/s41598-026-53566-5
+Kier, R. J., Ames, J. C., Beer, R. D., & Harrison, R. R. (2006). Design and Implementation of Multipattern Generators in Analog VLSI. IEEE Transactions on Neural Networks, 17(4), 1025–1038. https://doi.org/10.1109/TNN.2006.875983
+Kim, B., Dabin, L. C., Tate, M. D., Karahan, H., Sharify, A. D., Acri, D. J., Al-Amin, M. M., Philtjens, S., Smith, D. C., Wijeratne, H. R. S., Park, J. H., Jucker, M., & Kim, J. (2024). Effects of SPI1-mediated transcriptome remodeling on Alzheimer’s disease-related phenotypes in mouse models of Aβ amyloidosis. Nature Communications, 15(1), 3996. https://doi.org/10.1038/s41467-024-48484-x
+Kim, B., Shao, Y., & Pu, J. (2021). Doubly Polarized QM/MM with Machine Learning Chaperone Polarizability. Journal of Chemical Theory and Computation, 17(12), 7682–7695. https://doi.org/10.1021/acs.jctc.1c00567
+Kim, B., Snyder, R., Nagaraju, M., Zhou, Y., Ojeda-May, P., Keeton, S., Hege, M., Shao, Y., & Pu, J. (2021). Reaction Path-Force Matching in Collective Variables: Determining Ab Initio QM/MM Free Energy Profiles by Fitting Mean Force. Journal of Chemical Theory and Computation, 17(8), 4961–4980. https://doi.org/10.1021/acs.jctc.1c00245
+Kim, D.-J., Bolbecker, A. R., Moussa-Tooks, A. B., Wisner, K. M., O’Donnell, B. F., Gildea, E. L., & Hetrick, W. P. (2026). Distinct neural signatures in a sensorimotor synchronization-continuation task. Imaging Neuroscience, 4, IMAG.a.1100. https://doi.org/10.1162/IMAG.a.1100
+Kim, H.-G., Huang, M., Wang, S., Zhang, Y., Li, K., Liu, S., Dong, C., Yang, X., Cho, J.-H., Chowdhury, K., Stein, B., Wan, J., & Dong, X. C. (2025). Autophagy related 14 protects against liver injury by inhibiting multiple cell death pathways. eGastroenterology, 3(4), e100181. https://doi.org/10.1136/egastro-2025-100181
+Kinyua, A. M., Hratchian, H. P., Jarrold, C. C., & Thompson, L. M. (2025). Photoelectron–remnant interaction effect on remnant wavefunction in low-kinetic energy electron detachment events. The Journal of Chemical Physics, 162(6), 064304. https://doi.org/10.1063/5.0245067
+Kiran, S., Wireman, R. S., Peil, J., Mitchell, D. K., Potchanant, E. S., Rai, R., Vilseck, J. Z., Cao, S., Haiaty, S., Georgiadis, M. M., Fishel, M. L., & Kelley, M. R. (2025). The absence of Peroxiredoxin-1 in human pancreatic ductal adenocarcinoma (PDAC) markedly reduces cell survival and tumor growth when coupled with the inhibition of Ref-1 redox signaling. Redox Biology, 86, 103848. https://doi.org/10.1016/j.redox.2025.103848
+Kitase, Y., Ji, J., Bonewald, L. F., Prideaux, M., Roh, H. C., & Peng, G. (2026). High-resolution profiling of osteocyte transcriptomes via single-nucleus RNA sequencing. JBMR Plus, 10(5), ziag051. https://doi.org/10.1093/jbmrpl/ziag051
+Kojaku, S., Radicchi, F., Ahn, Y.-Y., & Fortunato, S. (2024). Network community detection via neural embeddings. Nature Communications, 15(1), 9446. https://doi.org/10.1038/s41467-024-52355-w
+Koshy, N. R., Dixit, A., Jadhav, S. S., Penmatsa, A. V., Samanthapudi, S. V., Kumar, M. G. A., Anuyah, S. O., Vemula, G., Herzog, P. S., & Bolchini, D. (2023). Data-To-Question Generation Using Deep Learning. 2023 4th International Conference on Big Data Analytics and Practices (IBDAP), 1–6. https://doi.org/10.1109/IBDAP58581.2023.10271940
+Koyama, S., Etkins, J., Jun, J., Miller, M., So, G. C., Gisch, D. L., & Eadon, M. T. (2025). Utilization of Cannabidiol in Post-Organ-Transplant Care. International Journal of Molecular Sciences, 26(2), 699. https://doi.org/10.3390/ijms26020699
+Kravitz, B., MacMartin, D. G., Visioni, D., Boucher, O., Cole, J. N. S., Haywood, J., Jones, A., Lurton, T., Nabat, P., Niemeier, U., Robock, A., Séférian, R., & Tilmes, S. (2021). Comparing different generations of idealized solar geoengineering simulations in the Geoengineering Model Intercomparison Project (GeoMIP). Atmospheric Chemistry and Physics, 21(6), 4231–4247. https://doi.org/10.5194/acp-21-4231-2021
+Kravitz, B., Robock, A., Forster, P. M., Haywood, J. M., Lawrence, M. G., & Schmidt, H. (2013). An overview of the Geoengineering Model Intercomparison Project (GeoMIP). Journal of Geophysical Research: Atmospheres, 118(23). https://doi.org/10.1002/2013JD020569
+Kravitz, B., Robock, A., Tilmes, S., Boucher, O., English, J. M., Irvine, P. J., Jones, A., Lawrence, M. G., MacCracken, M., Muri, H., Moore, J. C., Niemeier, U., Phipps, S. J., Sillmann, J., Storelvmo, T., Wang, H., & Watanabe, S. (2015). The Geoengineering Model Intercomparison Project Phase 6 (GeoMIP6): Simulation design and preliminary results. Climate and Earth system modeling. https://doi.org/10.5194/gmdd-8-4697-2015
+Kucukyildirim, S., Miller, S. F., & Lynch, M. (2021). Low base‐substitution mutation rate and predominance of insertion‐deletion events in the acidophilic bacterium Acidobacterium capsulatum. Ecology and Evolution, 11(24), 17609–17614. https://doi.org/10.1002/ece3.8429
+Kucukyildirim, S., Ozdemirel, H. O., & Lynch, M. (2023). Similar mutation rates but different mutation spectra in moderate and extremely halophilic archaea. G3: Genes, Genomes, Genetics, 13(3), jkac303. https://doi.org/10.1093/g3journal/jkac303
+Kumar, N. V. S., Sharma, S., & Srinivasa Rao, L. (2023). Mg-Containing Zn3 O3 Structures for Detection of CO2: A DFT Study on CHEM Effects of SERS and Electronic Properties. The Journal of Physical Chemistry A, 127(34), 7070–7079. https://doi.org/10.1021/acs.jpca.3c02322
+Kurimoto, Y., Alcaraz-Aunion, J. L., Brice, S. J., Bugel, L., Catala-Perez, J., Cheng, G., Conrad, J. M., Djurcic, Z., Dore, U., Finley, D. A., Franke, A. J., Giganti, C., Gomez-Cadenas, J. J., Guzowski, P., Hanson, A., Hayato, Y., Hiraide, K., Jover-Manas, G., Karagiorgi, G., … Zimmerman, E. D. (2010). Measurement of inclusive neutral current π 0 production on carbon in a few-GeV neutrino beam. Physical Review D, 81(3), 033004. https://doi.org/10.1103/PhysRevD.81.033004
+Kuswanto, H., Kravitz, B., Miftahurrohmah, B., Fauzi, F., Sopahaluwaken, A., & Moore, J. (2022). Impact of solar geoengineering on temperatures over the Indonesian Maritime Continent. International Journal of Climatology, 42(5), 2795–2814. https://doi.org/10.1002/joc.7391
+Ladaika, C. A., Chakraborty, A., Masood, A., Hostetter, G., Yi, J. M., & O’Hagan, H. M. (2025). LSD1 inhibition attenuates targeted therapy-induced lineage plasticity in BRAF mutant colorectal cancer. Molecular Cancer, 24(1), 122. https://doi.org/10.1186/s12943-025-02311-z
+Ladaika, C. A., Ghobashi, A. H., Boulton, W. C., Miller, S. A., & O’Hagan, H. M. (2025). LSD1 and CoREST2 Potentiate STAT3 Activity to Promote Enteroendocrine Cell Differentiation in Mucinous Colorectal Cancer. Cancer Research, 85(1), 52–68. https://doi.org/10.1158/0008-5472.CAN-24-0788
+Lagerna, O., Shivanyuk, A., Dolgonos, G. A., Shishkina, S., Kienko, T., Poyarkov, A., Tarchuk, I., Lukin, O., & Fetyukhin, V. (2024). Towards Amplified Probing of Weak Intermolecular Interactions on the External Surfaces of Molecular Capsules. Chemistry – A European Journal, 30(18), e202304006. https://doi.org/10.1002/chem.202304006
+Lai, D., Zhang, M., Li, R., Zhang, C., Zhang, P., Liu, Y., Gao, S., & Foroud, T. (2023). Identifying Genes Associated with Alzheimer’s Disease Using Gene-Based Polygenic Risk Score. Journal of Alzheimer’s Disease, 96(4), 1639–1649. https://doi.org/10.3233/JAD-230510
+Lake, A. J., Finn, P. R., & James, T. W. (2021). Neural Modulation in Approach-Avoidance Conflicts in Externalizing Psychopathology. Brain Imaging and Behavior, 15(2), 1007–1024. https://doi.org/10.1007/s11682-020-00308-4
+Lan, N. T. H., Hieu, T. D., Chinh, N. T., Le Anh, N. T., Nhi, P. T. Y., & Quang, D. D. (2023). HO● ‐ initiated oxidation of isoleucine amino acid in the aqueous phase. Vietnam Journal of Chemistry, 61(S1), 37–44. https://doi.org/10.1002/vjch.202200210
+Langlais, S. R., Hati, S., Simas, M. V., Pu, J., Muhoberac, B. B., & Sardar, R. (2024). Design of Light‐Induced Solid‐State Plasmonic Rulers via Tethering Photoswitchable Molecular Machines to Gold Nanostructures Displaying Angstrom Length Resolution. Advanced Optical Materials, 12(24), 2400801. https://doi.org/10.1002/adom.202400801
+Lanzoni, B., Ferraro, F. R., & Vesperini, E. (2026). New parameters for star-cluster dynamics: Observational results. Astronomy & Astrophysics, 707, A186. https://doi.org/10.1051/0004-6361/202558092
+Larson, E., Moussa-Tooks, A., Tullar, R., Bolbecker, A., O’Donnell, B., Hetrick, W., & Wisner, K. (2023). 159. Interactions Between Cannabis Use and Biological Sex on Acute Neuroendocrine, Sympathetic, and Affective Stress Responses. Biological Psychiatry, 93(9), S158. https://doi.org/10.1016/j.biopsych.2023.02.399
+Larson, E. R., Moussa-Tooks, A. B., Tullar, R. L., Bolbecker, A. R., O’Donnell, B. F., Hetrick, W. P., & Wisner, K. M. (2023). Sex differences in neuroendocrine, sympathetic nervous system, and affect responses to acute stress in cannabis users. Psychopharmacology, 240(8), 1805–1821. https://doi.org/10.1007/s00213-023-06400-z
+Larson, E. R., Moussa-Tooks, A. B., & Wisner, K. M. (2025). Indicators of resource scarcity differentially moderate the impact of threat exposure on psychopathology in a cross-sectional community sample of youth. Frontiers in Child and Adolescent Psychiatry, 4, 1568829. https://doi.org/10.3389/frcha.2025.1568829
+Lasagna, C. A., Tso, I. F., Blain, S. D., & Pleskac, T. J. (2026). Cognitive Mechanisms of Aberrant Self-Referential Social Perception in Psychosis and Bipolar Disorder: Insights From Computational Modeling. Schizophrenia Bulletin, 52(1), sbae147. https://doi.org/10.1093/schbul/sbae147
+Lauer, A., Devaney, J., Kieu, C., Kravitz, B., O’Brien, T. A., Robeson, S. M., Staten, P. W., & Vu, T. A. (2023). A convection‐permitting dynamically downscaled dataset over the Midwestern United States. Geoscience Data Journal, 10(4), 429–446. https://doi.org/10.1002/gdj3.188
+Lazaro, O., Beimfohr, C., App, B., Basu, R., Johnson, T. S., & Flak, J. N. (2026). High fat diet remodels the gene regulatory networks in the preoptic area. Scientific Reports, 16(1), 7042. https://doi.org/10.1038/s41598-026-37692-8
+Lee, A. J., Liu, X., Borza, T., Qin, Y., Li, B. Y., Urish, K. L., Kirk, P. S., Gilbert, S., Hollenbeck, B. K., Helm, J. E., Lavieri, M. S., Skolarus, T. A., & Jacobs, B. L. (2019). Role of Post–Acute Care on Hospital Readmission After High-Risk Surgery. Journal of Surgical Research, 234, 116–122. https://doi.org/10.1016/j.jss.2018.08.053
+Lee, E. H., & Jo, T. (2026). DuAL-Net: A Dual-Network Approach for Alzheimer’s Disease Risk Prediction Using APOE -Centered Regional Whole-Genome Sequencing Data. Computational and Structural Biotechnology Journal, 35(1), 0010. https://doi.org/10.34133/csbj.0010
+Lee, W., MacMartin, D., Visioni, D., & Kravitz, B. (2020). Expanding the design space of stratospheric aerosol geoengineering to include precipitation-based objectives and explore trade-offs. Earth System Dynamics, 11(4), 1051–1072. https://doi.org/10.5194/esd-11-1051-2020
+Lee, W. R., MacMartin, D. G., Visioni, D., & Kravitz, B. (2021). High‐Latitude Stratospheric Aerosol Geoengineering Can Be More Effective if Injection Is Limited to Spring. Geophysical Research Letters, 48(9), e2021GL092696. https://doi.org/10.1029/2021GL092696
+Lee, W. R., MacMartin, D. G., Visioni, D., Kravitz, B., Chen, Y., Moore, J. C., Leguy, G., Lawrence, D. M., & Bailey, D. A. (2023). High‐Latitude Stratospheric Aerosol Injection to Preserve the Arctic. Earth’s Future, 11(1), e2022EF003052. https://doi.org/10.1029/2022EF003052
+Lee, W. R., Visioni, D., Bednarz, E. M., MacMartin, D. G., Kravitz, B., & Tilmes, S. (2023). Quantifying the Efficiency of Stratospheric Aerosol Geoengineering at Different Altitudes. Geophysical Research Letters, 50(14), e2023GL104417. https://doi.org/10.1029/2023GL104417
+Leung, L. R., Boos, W. R., Catto, J. L., A. DeMott, C., Martin, G. M., Neelin, J. D., O’Brien, T. A., Xie, S., Feng, Z., Klingaman, N. P., Kuo, Y.-H., Lee, R. W., Martinez-Villalobos, C., Vishnu, S., Priestley, M. D. K., Tao, C., & Zhou, Y. (2022). Exploratory Precipitation Metrics: Spatiotemporal Characteristics, Process-Oriented, and Phenomena-Based. Journal of Climate, 35(12), 3659–3686. https://doi.org/10.1175/JCLI-D-21-0590.1
+Li, J., Raina, M., Wang, Y., Xu, C., Su, L., Guo, Q., Ferreira, R. M., Eadon, M. T., Ma, Q., Wang, J., & Xu, D. (2025). scBSP: A fast and accurate tool for identifying spatially variable features from high-resolution spatial omics data. Bioinformatics, 41(10), btaf554. https://doi.org/10.1093/bioinformatics/btaf554
+Li, J., Wang, Y., Raina, M. A., Xu, C., Su, L., Guo, Q., Ma, Q., Wang, J., & Xu, D. (2024). scBSP: A fast and accurate tool for identifying spatially variable genes from spatial transcriptomic data. Bioinformatics. https://doi.org/10.1101/2024.05.06.592851
+Li, R., Reiter, J. L., Chen, A. B., Chen, S. X., Foroud, T., Edenberg, H. J., Lai, D., & Liu, Y. (2023). RNA alternative splicing impacts the risk for alcohol use disorder. Molecular Psychiatry, 28(7), 2922–2933. https://doi.org/10.1038/s41380-023-02111-1
+Li, W., Mucke, N., Rütten, M., Schweers, T. L., Beck, T., & Jadhao, V. (2026). Peptide‐Ligand Cooperative Interplay Drives Gold Nanoparticle Encapsulation by Protein Cages. Small, e73690. https://doi.org/10.1002/smll.73690
+Liesen, M. P., Hayes, R. L., Brooks Iii, C. L., & Vilseck, J. Z. (2025). Multiple Molecule λ-Dynamics: Probing Drug Resistance with Concurrent Protein and Ligand Perturbations. The Journal of Physical Chemistry Letters, 16(25), 6273–6278. https://doi.org/10.1021/acs.jpclett.5c00467
+Lilien, D. A., Alley, K. E., & Alley, R. B. (2025). The effect of melt-channel geometry on ice-shelf flow. Journal of Glaciology, 71, e73. https://doi.org/10.1017/jog.2025.36
+Lin, H., Hargreaves, K. A., Li, R., Reiter, J. L., Wang, Y., Mort, M., Cooper, D. N., Zhou, Y., Zhang, C., Eadon, M. T., Dolan, M. E., Ipe, J., Skaar, T. C., & Liu, Y. (2019). RegSNPs-intron: A computational framework for predicting pathogenic impact of intronic single nucleotide variants. Genome Biology, 20(1), 254. https://doi.org/10.1186/s13059-019-1847-4
+Lin, Y., Wang, Y., Wang, J., Raina, M., Ferreira, R. M., Eadon, M. T., Liang, Y., & Xu, D. (2025). Defining Keypoints to Align H&E Images and Xenium DAPI-Stained Images Automatically. Cells, 14(13), 1000. https://doi.org/10.3390/cells14131000
+Lindahl, S. E., Metzger, E. M., Chen, C.-H., Pink, M., & Zaleski, J. M. (2025). Pronounced electronic modulation of geometrically-regulated metalloenediyne cyclization. Chemical Science, 16(1), 255–279. https://doi.org/10.1039/D4SC05396F
+Liu, Y., Yang, J., Iqbal, M., Uyanik, M., Luo, M., Yang, L., Lou, Y., Diao, L., Oluwole, O. O., Moslehi, J. J., Johnson, D. B., & Han, L. (2026). A retrospective pharmacovigilance analysis based on the FAERS database reveals sex-associated differences in toxicities of CAR T-cell therapy. Nature Communications, 17(1), 6025. https://doi.org/10.1038/s41467-026-72816-8
+Livernois, A. R., Aros, F. I., Vesperini, E., Askar, A., Bellini, A., Giersz, M., Hong, J., Hypki, A., Libralato, M., & Ziliotto, T. (2024). Energy equipartition in multiple-population globular clusters. Monthly Notices of the Royal Astronomical Society, 534(3), 2397–2409. https://doi.org/10.1093/mnras/stae2222
+Livernois, A. R., Vesperini, E., & Pavlík, V. (2023). Evolution of binary stars in the early evolutionary phases of ultra-faint dwarf galaxies. Monthly Notices of the Royal Astronomical Society, 521(3), 4395–4405. https://doi.org/10.1093/mnras/stad826
+Lopez, H., & Kübler, S. (2025). Context in abusive language detection: On the interdependence of context and annotation of user comments. Discourse, Context & Media, 63, 100848. https://doi.org/10.1016/j.dcm.2024.100848
+Lorenzetti, C., Maguitman, A., Leake, D., Menczer, F., & Reichherzer, T. (2017). Mining for Topics to Suggest Knowledge Model Extensions. ACM Transactions on Knowledge Discovery from Data, 11(2), 1–30. https://doi.org/10.1145/2997657
+Lu, W., Omari, R., Ray, H., Wang, J., Williams, I., Jacobs, C., Hockaden, N., Bochman, M. L., & Carpenter, R. L. (2022). AKT1 mediates multiple phosphorylation events that functionally promote HSF1 activation. The FEBS Journal, 289(13), 3876–3893. https://doi.org/10.1111/febs.16375
+Lu, W.-C., Ray, H., Omari, R., Cao, S., & Carpenter, R. (2019a). Abstract 2602: AKT1-mediated activation of HSF1 by phosphorylation and an association with metastasis-free survival. Cancer Research, 79(13_Supplement), 2602–2602. https://doi.org/10.1158/1538-7445.AM2019-2602
+Lu, W.-C., Ray, H., Omari, R., Cao, S., & Carpenter, R. (2019b). Abstract 2602: AKT1-mediated activation of HSF1 by phosphorylation and an association with metastasis-free survival. Cancer Research, 79(13_Supplement), 2602–2602. https://doi.org/10.1158/1538-7445.AM2019-2602
+Lubin, J., Wang, X.-Y., Rice, M., Dong, J., Wang, S., Radzom, B. T., Robertson, P., Stefansson, G., Alvarado-Montes, J. A., Beard, C., Bender, C. F., Gupta, A. F., Halverson, S., Kanodia, S., Li, D., Lin, A. S. J., Logsdon, S. E., Lubar, E., Mahadevan, S., … Wright, J. T. (2023). TOI-1670 c, a 40 day Orbital Period Warm Jupiter in a Compact System, Is Well Aligned. The Astrophysical Journal Letters, 959(1), L5. https://doi.org/10.3847/2041-8213/ad0fea
+Luján, M. Á., Young-Morrison, R., Aroni, S., Katona, I., Melis, M., & Cheer, J. F. (2024). Dynamic overrepresentation of accumbal cues in food- and opioid-seeking rats after prenatal THC exposure. Science Advances, 10(45), eadq5652. https://doi.org/10.1126/sciadv.adq5652
+Luo, M., Yang, J., Schäffer, A. A., Chen, C., Liu, Y., Chen, Y., Lin, C., Diao, L., Zang, Y., Lou, Y., Salman, H., Mills, G. B., Ruppin, E., & Han, L. (2025). Ancestral Differences in Anticancer Treatment Efficacy and Their Underlying Genomic and Molecular Alterations. Cancer Discovery, 15(3), 511–529. https://doi.org/10.1158/2159-8290.CD-24-0827
+Ma, W., Wang, H., Chen, G., Leung, L. R., Lu, J., Rasch, P. J., Fu, Q., Kravitz, B., Zou, Y., Cassano, J. J., & Maslowski, W. (2024). The role of interdecadal climate oscillations in driving Arctic atmospheric river trends. Nature Communications, 15(1), 2135. https://doi.org/10.1038/s41467-024-45159-5
+Macklin, P., & Lowengrub, J. (2007). Nonlinear simulation of the effect of microenvironment on tumor growth. Journal of Theoretical Biology, 245(4), 677–704. https://doi.org/10.1016/j.jtbi.2006.12.004
+MacMartin, D. G., & Kravitz, B. (2019). Mission-driven research for stratospheric aerosol geoengineering. Proceedings of the National Academy of Sciences, 116(4), 1089–1094. https://doi.org/10.1073/pnas.1811022116
+MacMartin, D. G., Kravitz, B., & Goddard, P. B. (2023). Transboundary effects from idealized regional geoengineering. Environmental Research Communications, 5(9), 091004. https://doi.org/10.1088/2515-7620/acf441
+MacMartin, D. G., Visioni, D., Kravitz, B., Richter, J. H., Felgenhauer, T., Lee, W. R., Morrow, D. R., Parson, E. A., & Sugiyama, M. (2022a). Scenarios for modeling solar radiation modification. Proceedings of the National Academy of Sciences, 119(33), e2202230119. https://doi.org/10.1073/pnas.2202230119
+MacMartin, D. G., Visioni, D., Kravitz, B., Richter, J. H., Felgenhauer, T., Lee, W. R., Morrow, D. R., Parson, E. A., & Sugiyama, M. (2022b). Scenarios for modeling solar radiation modification. Proceedings of the National Academy of Sciences, 119(33), e2202230119. https://doi.org/10.1073/pnas.2202230119
+Mahesh, A., O’Brien, T. A., Loring, B., Elbashandy, A., Boos, W., & Collins, W. D. (2024). Identifying atmospheric rivers and their poleward latent heat transport with generalizable neural networks: ARCNNv1. Geoscientific Model Development, 17(8), 3533–3557. https://doi.org/10.5194/gmd-17-3533-2024
+Maini, S. S., Mochizuki-Freeman, J., Indi, C. S., Jacques, B. G., Sederberg, P. B., Howard, M. W., & Tiganj, Z. (2023). Representing Latent Dimensions Using Compressed Number Lines. 2023 International Joint Conference on Neural Networks (IJCNN), 1–10. https://doi.org/10.1109/IJCNN54540.2023.10190998
+Manatova, D., Camp, L. J., Fox, J. R., Kuebler, S., Shardakova, M. A., & Kouper, I. (2023). An Argument for Linguistic Expertise in Cyberthreat Analysis: LOLSec in Russian Language eCrime Landscape. 2023 IEEE European Symposium on Security and Privacy Workshops (EuroS&PW), 170–176. https://doi.org/10.1109/EuroSPW59978.2023.00024
+Manatova, D., Sharma, D., Samtani, S., & Camp, L. J. (2022). Building and Testing a Network of Social Trust in an Underground Forum: Robust Connections and Overlapping Criminal Domains. 2022 APWG Symposium on Electronic Crime Research (eCrime), 1–12. https://doi.org/10.1109/eCrime57793.2022.10142120
+Mandel, M. I., Pascanu, R., Eck, D., Bengio, Y., Aiello, L. M., Schifanella, R., & Menczer, F. (2011). Contextual tag inference. ACM Transactions on Multimedia Computing, Communications, and Applications, 7S(1), 1–18. https://doi.org/10.1145/2037676.2037689
+Marder, E., Smiley, T. M., Yanites, B. J., & Kravitz, K. (2025). Direct effects of mountain uplift and topography on biodiversity. Science, 387(6740), 1287–1291. https://doi.org/10.1126/science.adp7290
+Marks, N., Herms, E., & Wisner, K. (2025). A longitudinal study on the relationship between delusional ideation and social network. Schizophrenia Research, 284, 86–92. https://doi.org/10.1016/j.schres.2025.07.026
+Martinez, A. C., Tye, O. J., Frazier, C. M., & Bartz, J. A. (2023). Vector Correlations in the 225 nm Photodissociation of Co(CO)3 NO. The Journal of Physical Chemistry A, 127(1), 71–77. https://doi.org/10.1021/acs.jpca.2c06549
+Mason, J., Chick Jarrold, C., Huizenga, C., & McMahon, A. (2020). PROBING THE EFFECTS OF ELECTRON CORRELATION: THE NOT-SO-SIMPLE CASE OF Gd2O. Proceedings of the 2020 International Symposium on Molecular Spectroscopy, 1–1. https://doi.org/10.15278/isms.2020.RJ06
+Mason, J. L., Huizenga, C. D., Ray, M., Kafader, J. O., & Jarrold, C. C. (2023). Electronic Structure of Heteronuclear Cerium-Platinum Clusters. The Journal of Physical Chemistry A, 127(32), 6749–6763. https://doi.org/10.1021/acs.jpca.3c03738
+Mathew, M., Puchta, R., & Thomas, R. (2026). Protonation-Induced Planarization and Aromaticity Enhancement in Diazahelicenes: A Route to Stronger Bases. The Journal of Physical Chemistry A, 130(2), 423–432. https://doi.org/10.1021/acs.jpca.5c06393
+Maupome, G., Scully, A. C., Yepes, J. F., Eckert, G. J., & Downey, T. (2023). Trends in dental insurance claims in the United States in the context of the COVID ‐19 pandemic: A 3‐year perspective (2019–2022). Journal of Public Health Dentistry, 83(2), 147–154. https://doi.org/10.1111/jphd.12561
+Maxey, N. J., Bather, J. R., Griffin, T. S., Powla, P. P., & Pabon-Rodriguez, F. M. (2026). Trust in federal statistical agencies and vaccine uptake among U.S. adults. Vaccine: X, 31, 100847. https://doi.org/10.1016/j.jvacx.2026.100847
+Maxey, N. J., Griffin, T. S., Powla, P. P., & Pabon-Rodriguez, F. M. (2026). Comparative evaluation of machine learning models for predicting COVID-19 vaccine uptake in U.S. adults. BMC Public Health, 26(1), 1625. https://doi.org/10.1186/s12889-026-27199-2
+Mazurenko, O., Harle, C. A., Musey, P. I., Schleyer, T. K., Sanner, L. M., & Vest, J. R. (2025). Integrating a risk prediction score in a clinical decision support to identify patients with health-related social needs in the emergency department. JAMIA Open, 8(4), ooaf060. https://doi.org/10.1093/jamiaopen/ooaf060
+McGee, C. J., McGinnis, K. R., & Jarrold, C. C. (2023a). Anion Photoelectron Imaging Spectroscopy of C6 HF5– , C6 F6– , and the Absence of C6 H2 F4–. The Journal of Physical Chemistry A, 127(41), 8556–8565. https://doi.org/10.1021/acs.jpca.3c04016
+McGee, C. J., McGinnis, K. R., & Jarrold, C. C. (2023b). Trend in the Electron Affinities of Fluorophenyl Radicals ·C6 H5-x F x (1 ≤ x ≤ 4). The Journal of Physical Chemistry A, 127(34), 7264–7273. https://doi.org/10.1021/acs.jpca.3c04327
+McGee, C. J., McGinnis, K. R., Raghavachari, K., & Jarrold, C. C. (2025). Evidence of HF Loss in C or C– + C6 F x H 6– x (1 ≤ x ≤ 5) Reactions. The Journal of Physical Chemistry A, 129(44), 10187–10201. https://doi.org/10.1021/acs.jpca.5c06090
+McGinnis, K. R., McGee, C. J., & Jarrold, C. C. (2024). Isomer-Dependent Electron Affinities of Fluorophenyl Radicals,• C6 H 5– x F x (2 ≤ x ≤ 4). Journal of the American Chemical Society, 146(10), 7063–7075. https://doi.org/10.1021/jacs.4c00556
+McKelvey, K. R., & Menczer, F. (2013). Truthy: Enabling the study of online social networks. Proceedings of the 2013 Conference on Computer Supported Cooperative Work Companion, 23–26. https://doi.org/10.1145/2441955.2441962
+Meana-Pañeda, R., Zheng, J., Bao, J. L., Zhang, S., Lynch, B. J., Corchado, J. C., Chuang, Y.-Y., Fast, P. L., Hu, W.-P., Liu, Y.-P., Lynch, G. C., Nguyen, K. A., Jackels, C. F., Fernández-Ramos, A., Ellingson, B. A., Melissas, V. S., Villà, J., Rossi, I., Coitiño, E. L., … Truhlar, D. G. (2024). Polyrate 2023: A computer program for the calculation of chemical reaction rates for polyatomics. New version announcement. Computer Physics Communications, 294, 108933. https://doi.org/10.1016/j.cpc.2023.108933
+Meiss, M., Menczer, F., & Vespignani, A. (2011). Properties and Evolution of Internet Traffic Networks from Anonymized Flow Data. ACM Transactions on Internet Technology, 10(4), 1–23. https://doi.org/10.1145/1944339.1944342
+Menczer, F. (2012). The diffusion of political memes in social media: Keynote abstract. Proceedings of the First Edition Workshop on Politics, Elections and Data, 1–2. https://doi.org/10.1145/2389661.2389663
+Menczer, F. (2016). The Spread of Misinformation in Social Media. Proceedings of the 25th International Conference Companion on World Wide Web - WWW 16 Companion, 717–717. https://doi.org/10.1145/2872518.2890092
+Menczer, F., Wu, L., & Akavipat, R. (2008). Intelligent Peer Networks for Collaborative Web Search. AI Magazine, 29(3), 35–46. https://doi.org/10.1609/aimag.v29i3.2155
+Metzcar, J., Duggan, B. S., Fischer, B., Murphy, M., Heiland, R., & Macklin, P. (2025). A Simple Framework for Agent-Based Modeling with Extracellular Matrix. Bulletin of Mathematical Biology, 87(3), 43. https://doi.org/10.1007/s11538-024-01408-8
+Miao, H., Chen, D., Ropa, J., Purohit, T., Kim, E., Sulis, M.-L., Ferrando, A., Cierpicki, T., & Grembecka, J. (2024). Combination of menin and kinase inhibitors as an effective treatment for leukemia with NUP98 translocations. Leukemia, 38(8), 1674–1687. https://doi.org/10.1038/s41375-024-02312-9
+Miczán, V., Kelemen, K., Glavinics, J. R., László, Z. I., Barti, B., Kenesei, K., Kisfali, M., & Katona, I. (2021). NECAB1 and NECAB2 are Prevalent Calcium-Binding Proteins of CB1/CCK-Positive GABAergic Interneurons. Cerebral Cortex, 31(3), 1786–1806. https://doi.org/10.1093/cercor/bhaa326
+Miller, S. A., Policastro, R. A., Sriramkumar, S., Lai, T., Huntington, T. D., Ladaika, C. A., Kim, D., Hao, C., Zentner, G. E., & O’Hagan, H. M. (2021). LSD1 and Aberrant DNA Methylation Mediate Persistence of Enteroendocrine Progenitors That Support BRAF -Mutant Colorectal Cancer. Cancer Research, 81(14), 3791–3805. https://doi.org/10.1158/0008-5472.CAN-20-3562
+Misra, J., Spandau, D. F., Vilseck, J. Z., Anthony, T. G., Staschke, K. A., & Wek, R. C. (2026). An inhibitor of GCN2 and the integrated stress response directly targets ZAK protein kinase to limit cytotoxicity. Journal of Biological Chemistry, 302(6), 111482. https://doi.org/10.1016/j.jbc.2026.111482
+Mitchell, D. K., Brewster, K., Makri, S. C., Khan, J., Albright, E. A., Horvai, A., Mang, H., Lu, Q., Dixon, S. A. H., White, E., Saadatzadeh, M. R., Bijangi-Vishehsaraei, K., Gampala, S., Hickey, B. E., Leffew, H., Li, X., Jiang, L., Ciesielski, M. D., Bessler, W. K., … Clapp, W. (2025). DLK1 Distinguishes Subsets of NF1-Associated Malignant Peripheral Nerve Sheath Tumors with Divergent Molecular Signatures. Clinical Cancer Research, 31(10), 1988–2009. https://doi.org/10.1158/1078-0432.CCR-24-3029
+Mitchell, D. K., Burgess, B., White, E. E., Smith, A. E., Sierra Potchanant, E. A., Mang, H., Hickey, B. E., Lu, Q., Qian, S., Bessler, W., Li, X., Jiang, L., Brewster, K., Temm, C., Horvai, A., Albright, E. A., Fishel, M. L., Pratilas, C. A., Angus, S. P., … Rhodes, S. D. (2024). Spatial Gene-Expression Profiling Unveils Immuno-oncogenic Programs of NF1-Associated Peripheral Nerve Sheath Tumor Progression. Clinical Cancer Research, 30(5), 1038–1053. https://doi.org/10.1158/1078-0432.CCR-23-2548
+Mitchell, L. C., Moczek, A. P., & Nadolski, E. M. (2025). A Conserved Somatic Sex Determination Cascade Instructs Trait‐Specific Sexual Dimorphism in Horned Dung Beetles. Evolution & Development, 27(1), e70004. https://doi.org/10.1111/ede.70004
+Mochizuki-Freeman, J., Singh Maini, S., & Tiganj, Z. (2023). Characterizing neural activity in cognitively inspired RL agents during an evidence accumulation task. 2023 International Joint Conference on Neural Networks (IJCNN), 01–09. https://doi.org/10.1109/IJCNN54540.2023.10191578
+Mofidi, S. M., Nejat Pishkenari, H., & Edelmaier, C. J. (2024). Toward Directional Motion on Graphene by Uniaxial Strain. Iranian Journal of Science and Technology, Transactions of Mechanical Engineering, 48(2), 691–700. https://doi.org/10.1007/s40997-023-00676-4
+Mokh, N. A., Dakota, D., & Kübler, S. (2024). Out-of-Domain Dependency Parsing for Dialects of Arabic: A Case Study. Proceedings of The Second Arabic Natural Language Processing Conference, 170–182. https://doi.org/10.18653/v1/2024.arabicnlp-1.16
+Mondal, D., Snodgrass, H. M., Gomez, C. A., & Lewis, J. C. (2023). Non-Native Site-Selective Enzyme Catalysis. Chemical Reviews, 123(16), 10381–10431. https://doi.org/10.1021/acs.chemrev.3c00215
+Morningstar, M. D., Timme, N. M., Ma, B., Cornwell, E., Galbari, T., & Lapish, C. C. (2024). Proactive Versus Reactive Control Strategies Differentially Mediate Alcohol Drinking in Male Wistars and P Rats. Eneuro, 11(3), ENEURO.0385-23.2024. https://doi.org/10.1523/ENEURO.0385-23.2024
+Mukherjee, S., Calvi, B. R., Hundley, H. A., & Sokol, N. S. (2022). MicroRNA mediated regulation of the onset of enteroblast differentiation in the Drosophila adult intestine. Cell Reports, 41(3), 111495. https://doi.org/10.1016/j.celrep.2022.111495
+Murray, D., Yoon, J., Kojaku, S., Costas, R., Jung, W.-S., Milojević, S., & Ahn, Y.-Y. (2023). Unsupervised embedding of trajectories captures the latent structure of scientific migration. Proceedings of the National Academy of Sciences, 120(52), e2305414120. https://doi.org/10.1073/pnas.2305414120
+Mustaree, S., Podicheti, R., Rusch, D., & Rowe-Magnus, D. A. (2025). Spatio-genetically coordinated TPR domain-containing proteins modulate c-di-GMP signaling in Vibrio vulnificus. PLOS Pathogens, 21(7), e1013353. https://doi.org/10.1371/journal.ppat.1013353
+Nallandhighal, S., Park, G. S., Ho, Y.-Y., Opoka, R. O., John, C. C., & Tran, T. M. (2018). Whole-Blood Transcriptional Signatures Composed of Erythropoietic and NRF2-Regulated Genes Differ Between Cerebral Malaria and Severe Malarial Anemia. The Journal of Infectious Diseases. https://doi.org/10.1093/infdis/jiy468
+Nasrollahi, F. S. F., Silva, F. N., Liu, S., Chaudhuri, S., Yu, M., Wang, J., Nho, K., Saykin, A. J., Bennett, D. A., Sporns, O., & Fortunato, S. (2026). Network clustering algorithms and preprocessing pipelines for robust cell type identification in single-cell RNA sequencing data. Scientific Reports, 16(1), 22201. https://doi.org/10.1038/s41598-026-49033-w
+Nayeen, Md. J., Katinas, J. M., Magdum, T., Shah, K., Wong, J. E., O’Connor, C. E., Fifer, A. N., Wallace-Povirk, A., Hou, Z., Matherly, L. H., Dann, C. E., & Gangjee, A. (2023). Structure-Based Design of Transport-Specific Multitargeted One-Carbon Metabolism Inhibitors in Cytosol and Mitochondria. Journal of Medicinal Chemistry, 66(16), 11294–11323. https://doi.org/10.1021/acs.jmedchem.3c00763
+Nellikkattil, A. B., Lemmon, D., O’Brien, T. A., Lee, J.-Y., & Chu, J.-E. (2024). Scalable Feature Extraction and Tracking (SCAFET): A general framework for feature extraction from large climate data sets. Geoscientific Model Development, 17(1), 301–320. https://doi.org/10.5194/gmd-17-301-2024
+Neupane, S., Wu, Y., Sreenivasan, V., Lyon, D., Connolly, K., & Candy, T. (2018). Comparison of Vergence and Accommodation Responses of Strabismic and Non-strabismic hyperopic, and emmetropic children. Journal of Vision, 18(10), 940. https://doi.org/10.1167/18.10.940
+Newcombe, V. F. J., Correia, M. M., Ledig, C., Abate, M. G., Outtrim, J. G., Chatfield, D., Geeraerts, T., Manktelow, A. E., Garyfallidis, E., Pickard, J. D., Sahakian, B. J., Hutchinson, P. J. A., Rueckert, D., Coles, J. P., Williams, G. B., & Menon, D. K. (2016). Dynamic Changes in White Matter Abnormalities Correlate With Late Improvement and Deterioration Following TBI: A Diffusion Tensor Imaging Study. Neurorehabilitation and Neural Repair, 30(1), 49–62. https://doi.org/10.1177/1545968315584004
+Ngo, T. C., Taamalli, S., Srour, Z., Fèvre-Nollet, V., El Bakali, A., Louis, F., Černuśák, I., & Dao, D. Q. (2023). Theoretical insights into the oxidation of quinmerac herbicide initiated by HO• radical in aqueous media: Mechanism, kinetics, and ecotoxicity. Journal of Environmental Chemical Engineering, 11(3), 109941. https://doi.org/10.1016/j.jece.2023.109941
+Nguyen, T., Ziedan, E., Simon, K., Miles, J., Crystal, S., Samples, H., & Gupta, S. (2022). Racial and Ethnic Disparities in Buprenorphine and Extended-Release Naltrexone Filled Prescriptions During the COVID-19 Pandemic. JAMA Network Open, 5(6), e2214765. https://doi.org/10.1001/jamanetworkopen.2022.14765
+Ni, Y., Zheng, X., Betzel, R., & James, T. W. (2024). Increased Segregation in Functional Connectivity Networks When Watching Unpleasant Arousing Videos: A Generalized Psychophysiological Interaction Analysis. Brain Connectivity, 14(2), 92–106. https://doi.org/10.1089/brain.2023.0048
+Niihori, M., Hinkle, A., James, J., Kacar, S., De Jesus Perez, V., Goncharova, E. A., Rafikov, R., & Rafikova, O. (2025). Novel Insights Into Right Ventricular Dysfunction in Pulmonary Arterial Hypertension: The Role of Mitochondrial Dysfunction and Cell Cycle Arrest. American Journal of Respiratory and Critical Care Medicine, 211(Supplement_1), A7716–A7716. https://doi.org/10.1164/ajrccm.2025.211.Abstracts.A7716
+Nikolov, D., Lalmas, M., Flammini, A., & Menczer, F. (2019). Quantifying Biases in Online Information Exposure. Journal of the Association for Information Science and Technology, 70(3), 218–229. https://doi.org/10.1002/asi.24121
+Nikolov, D., Oliveira, D. F. M., Flammini, A., & Menczer, F. (2015). Measuring online social bubbles. PeerJ Computer Science, 1, e38. https://doi.org/10.7717/peerj-cs.38
+Nikoulina, A. I., Arcurio, L. R., Finn, P. R., & James, T. W. (2020). Risky drinking decisions: The influence of party music and alcohol abuse in young adult women. Alcohol, 84, 33–42. https://doi.org/10.1016/j.alcohol.2019.05.003
+Novakovic, V. A., Sutton, G. P., Neustadter, D. M., Beer, R. D., & Chiel, H. J. (2006). Mechanical reconfiguration mediates swallowing and rejection in Aplysia californica. Journal of Comparative Physiology A, 192(8), 857–870. https://doi.org/10.1007/s00359-006-0124-7
+Nwala, A. C., Flammini, A., & Menczer, F. (2023). A language framework for modeling social media account behavior. EPJ Data Science, 12(1), 33. https://doi.org/10.1140/epjds/s13688-023-00410-9
+Nwayor, I. J., Robeson, S. M., Ficklin, D. L., & Maxwell, J. T. (2024). A Multiscalar Standardized Vapor Pressure Deficit Index for Drought Monitoring and Impacts. International Journal of Climatology, 44(16), 5825–5838. https://doi.org/10.1002/joc.8668
+Obahoundje, S., N’guessan Bi, V. H., Diedhiou, A., Kravitz, B., & Moore, J. C. (2022). Influence of stratospheric aerosol geoengineering on temperature mean and precipitation extremes indices in Africa. International Journal of Climate Change Strategies and Management, 14(4), 399–423. https://doi.org/10.1108/IJCCSM-03-2021-0028
+Obahoundje, S., Nguessan-Bi, V. H., Diedhiou, A., Kravitz, B., & Moore, J. C. (2023). Implication of stratospheric aerosol geoengineering on compound precipitation and temperature extremes in Africa. Science of The Total Environment, 863, 160806. https://doi.org/10.1016/j.scitotenv.2022.160806
+Obeng-Gyasi, B., Chinthala, A. S., Brown, E. D. L., Abraham, B., Pabón-Rodríguez, F., Griffin, T. S., Young, K., Line, T. A., Snyder Iii, W., Dalal, O., Christodoulides, A., Elsamadicy, A. A., & Mao, G. (2026). Critical radiographic findings and medical comorbidities in the management of thoracolumbar burst fractures. Journal of Clinical Neuroscience, 147, 111936. https://doi.org/10.1016/j.jocn.2026.111936
+Olivares, E., Izquierdo, E. J., & Beer, R. D. (2021). A Neuromechanical Model of Multiple Network Rhythmic Pattern Generators for Forward Locomotion in C. elegans. Frontiers in Computational Neuroscience, 15, 572339. https://doi.org/10.3389/fncom.2021.572339
+Olusola, R. E., Udofia, I. A., Momoh, J. O., Oshin, T. T., & Ojo, O. (2026). Antimicrobial effects, phytochemical profiling and In silico analysis of compounds from Spilanthes filicaulis (Schumach. &Thonn.) C. D. Adams grown in Southern Nigeria. Pharmacological Research - Natural Products, 10, 100585. https://doi.org/10.1016/j.prenap.2026.100585
+O’Malley, M. S., Williams, I., DeHart, H., Walker, B., Ulhaskumar, V., Jothirajah, P., Ray, H., Landrum, L. M., Delaney, J. R., Nephew, K. P., & Carpenter, R. L. (2025). Abstract A040: MYC-HSF1 coamplification as a biomarker for treatment sensitivity in high-grade serous ovarian cancer. Cancer Research, 85(18_Supplement), A040–A040. https://doi.org/10.1158/1538-7445.OVARIAN25-A040
+O’Malley, M. S., Williams, I., DeHart, H., Walker, B., Ulhaskumar, V., Ray, H., Jothirajah, P., Delaney, J. R., Nephew, K. P., & Carpenter, R. (2025). Abstract 4233: Ovarian cancer treatments: Using HSF1 and MYC gene amplification as a biomarker. Cancer Research, 85(8_Supplement_1), 4233–4233. https://doi.org/10.1158/1538-7445.AM2025-4233
+O’Malley, M., Williams, I. W., Walker, B., Ray, H., Nephew, K. P., & Carpenter, R. (2024). Abstract B031: The PLK1 inhibitor Volasertib as a treatment for HSF1 and MYC coamplified ovarian cancer. Cancer Research, 84(5_Supplement_2), B031–B031. https://doi.org/10.1158/1538-7445.OVARIAN23-B031
+O’Neil, A., Swanson, D., & Chelliah, S. (2024). Computational Language Documentation: Designing a Modular Annotation and Data Management Tool for Cross-cultural Applicability. Proceedings of the 2nd Workshop on Cross-Cultural Considerations in NLP, 107–116. https://doi.org/10.18653/v1/2024.c3nlp-1.9
+Pacheco, D., Flammini, A., & Menczer, F. (2020). Unveiling Coordinated Groups Behind White Helmets Disinformation. Companion Proceedings of the Web Conference 2020, 611–616. https://doi.org/10.1145/3366424.3385775
+Pacheco, D., Hui, P.-M., Torres-Lugo, C., Truong, B. T., Flammini, A., & Menczer, F. (2021). Uncovering Coordinated Networks on Social Media: Methods and Case Studies. Proceedings of the International AAAI Conference on Web and Social Media, 15, 455–466. https://doi.org/10.1609/icwsm.v15i1.18075
+Pan, X., Snyder, R., Wang, J., Lander, C., Wickizer, C., Van, R., Chesney, A., Xue, Y., Mao, Y., Mei, Y., Pu, J., & Shao, Y. (2024). Training machine learning potentials for reactive systems: A Colab tutorial on basic models. Journal of Computational Chemistry, 45(10), 638–647. https://doi.org/10.1002/jcc.27269
+Pan, X., Van, R., Epifanovsky, E., Liu, J., Pu, J., Nam, K., & Shao, Y. (2022). Accelerating Ab Initio Quantum Mechanical and Molecular Mechanical (QM/MM) Molecular Dynamics Simulations with Multiple Time Step Integration and a Recalibrated Semiempirical QM/MM Hamiltonian. The Journal of Physical Chemistry B, 126(23), 4226–4235. https://doi.org/10.1021/acs.jpcb.2c02262
+Pan, X., Van, R., Pu, J., Nam, K., Mao, Y., & Shao, Y. (2023). Free Energy Profile Decomposition Analysis for QM/MM Simulations of Enzymatic Reactions. Journal of Chemical Theory and Computation, 19(22), 8234–8244. https://doi.org/10.1021/acs.jctc.3c00973
+Pan, X., Yang, J., Van, R., Epifanovsky, E., Ho, J., Huang, J., Pu, J., Mei, Y., Nam, K., & Shao, Y. (2021). Machine-Learning-Assisted Free Energy Simulation of Solution-Phase and Enzyme Reactions. Journal of Chemical Theory and Computation, 17(9), 5745–5758. https://doi.org/10.1021/acs.jctc.1c00565
+Papudeshi, B., Rusch, D. B., VanInsberghe, D., Lively, C. M., Edwards, R. A., & Bashey, F. (2023). Host Association and Spatial Proximity Shape but Do Not Constrain Population Structure in the Mutualistic Symbiont Xenorhabdus bovienii. mBio, 14(3), e00434-23. https://doi.org/10.1128/mbio.00434-23
+Pascale, R., Calura, F., Vesperini, E., Rosdahl, J., Nipoti, C., Giunchi, E., Lacchin, E., Lupi, A., Messa, M., Meneghetti, M., Ragagnin, A., Vanzella, E., & Zanella, A. (2025). SIEGE: IV. Compact star clusters in cosmological simulations with a high star formation efficiency and subparsec resolution. Astronomy & Astrophysics, 699, A31. https://doi.org/10.1051/0004-6361/202453252
+Patwardhan, R., Tang, H., Kim, S., & Dalkilic, M. (2006). An Approximate de Bruijn Graph Approach to Multiple Local Alignment and Motif Discovery in Protein Sequences. In M. M. Dalkilic, S. Kim, & J. Yang (Eds.), Data Mining and Bioinformatics (Vol. 4316, pp. 158–169). Springer Berlin Heidelberg. https://doi.org/10.1007/11960669_14
+Pavlík, V., Heggie, D. C., Varri, A. L., & Vesperini, E. (2024). Dynamics of star clusters with tangentially anisotropic velocity distribution. Astronomy & Astrophysics, 689, A313. https://doi.org/10.1051/0004-6361/202450270
+Pavlík, V., & Vesperini, E. (2021a). Evolution towards energy equipartition in star clusters: Effects of the tidal field, primordial binaries, and internal velocity anisotropy. Monthly Notices of the Royal Astronomical Society, 509(3), 3815–3825. https://doi.org/10.1093/mnras/stab3157
+Pavlík, V., & Vesperini, E. (2021b). New insights into star cluster evolution towards energy equipartition. Monthly Notices of the Royal Astronomical Society: Letters, 504(1), L12–L16. https://doi.org/10.1093/mnrasl/slab026
+Pavlík, V., & Vesperini, E. (2022). Mass segregation and dynamics of primordial binaries in star clusters with a radially anisotropic velocity distribution. Monthly Notices of the Royal Astronomical Society, 515(2), 1830–1838. https://doi.org/10.1093/mnras/stac1776
+Peck Justice, S. A., Barron, M. P., Qi, G. D., Wijeratne, H. R. S., Victorino, J. F., Simpson, E. R., Vilseck, J. Z., Wijeratne, A. B., & Mosley, A. L. (2020). Mutant thermal proteome profiling for characterization of missense protein variants and their associated phenotypes within the proteome. Journal of Biological Chemistry, 295(48), 16219–16238. https://doi.org/10.1074/jbc.RA120.014576
+Pentchev, J. V., Jackson, T., Khan, N., Rosewood, T. J., Huang, Y., Nho, K., Saykin, A. J., Eloyan, A., Taurone, A., Thangarajah, M., Riddle, M., Salloway, S., Atri, A., Honig, L. S., Johnson, E. C. B., Turner, R. S., Masdeu, J. C., Foroud, T. M., Clark, D., … for the Longitudinal Early‐Onset Alzheimer’s Disease Study Consortium and the Alzheimer’s Disease Neuroimaging Initiative. (2026). Alzheimer’s disease polygenic risk in early‐ and late‐onset Alzheimer’s disease. Alzheimer’s & Dementia, 22(1), e71066. https://doi.org/10.1002/alz.71066
+Perevalov, D., Tayloe, R., MiniBooNE collaboration, Sanchez, F., Sorel, M., & Alvarez-Ruso, L. (2009). Measurement of Neutrino-Nucleon Neutral Current Elastic Scattering in MiniBooNE. 175–180. https://doi.org/10.1063/1.3274151
+Petersen, A., Kumar, V., & Stevens, P. S. (2025). Experimental and Theoretical Study of the Kinetics of the OH + Methyl Ethyl Ketone Reaction as a Function of Temperature. The Journal of Physical Chemistry A, 129(48), 11213–11221. https://doi.org/10.1021/acs.jpca.5c06778
+Petroff, Z., Candy, T. R., & Bonnen, K. (2023). The statistics of infants’ natural visual experience are shaped by motor development. Journal of Vision, 23(9), 5873. https://doi.org/10.1167/jov.23.9.5873
+Pierri, F., DeVerna, M. R., Yang, K.-C., Axelrod, D., Bryden, J., & Menczer, F. (2023). One Year of COVID-19 Vaccine Misinformation on Twitter: Longitudinal Study. Journal of Medical Internet Research, 25, e42227. https://doi.org/10.2196/42227
+Pierri, F., Perry, B. L., DeVerna, M. R., Yang, K.-C., Flammini, A., Menczer, F., & Bryden, J. (2022). Online misinformation is linked to early COVID-19 vaccination hesitancy and refusal. Scientific Reports, 12(1), 5966. https://doi.org/10.1038/s41598-022-10070-w
+Powla, P., Maxey, N., Griffin, T., & Pabon-Rodriguez, F. (2026). Mental Health Treatment Utilization Among Hispanic and Latino Adults in the United States: The Role of Immigration Status, Acculturation, and Socioeconomic Disadvantage. Journal of Immigrant and Minority Health. https://doi.org/10.1007/s10903-026-01896-x
+Prokop, S., Ábrányi-Balogh, P., Barti, B., Vámosi, M., Zöldi, M., Barna, L., Urbán, G. M., Tóth, A. D., Dudok, B., Egyed, A., Deng, H., Leggio, G. M., Hunyady, L., Van Der Stelt, M., Keserű, G. M., & Katona, I. (2021). PharmacoSTORM nanoscale pharmacology reveals cariprazine binding on Islands of Calleja granule cells. Nature Communications, 12(1), 6505. https://doi.org/10.1038/s41467-021-26757-z
+Psujek, S., & Beer, R. D. (2008). Developmental bias in evolution: Evolutionary accessibility of phenotypes in a model evo‐devo system. Evolution & Development, 10(3), 375–390. https://doi.org/10.1111/j.1525-142X.2008.00245.x
+Quaglia, I., Visioni, D., Bednarz, E. M., MacMartin, D. G., & Kravitz, B. (2024). The Potential of Stratospheric Aerosol Injection to Reduce the Climatic Risks of Explosive Volcanic Eruptions. Geophysical Research Letters, 51(8), e2023GL107702. https://doi.org/10.1029/2023GL107702
+Quaglia, I., Visioni, D., Pitari, G., & Kravitz, B. (2022). An approach to sulfate geoengineering with surface emissions of carbonyl sulfide. Atmospheric Chemistry and Physics, 22(9), 5757–5773. https://doi.org/10.5194/acp-22-5757-2022
+Radicchi, F., Castellano, C., Flammini, A., Muñoz, M. A., & Notarmuzi, D. (2020). Classes of critical avalanche dynamics in complex networks. Physical Review Research, 2(3), 033171. https://doi.org/10.1103/PhysRevResearch.2.033171
+Radzom, B. T., Dong, J., Rice, M., Wang, X.-Y., Yee, S. W., Fairnington, T. R., Petrovich, C., & Wang, S. (2024). Evidence for Primordial Alignment: Insights from Stellar Obliquity Measurements for Compact Sub-Saturn Systems. The Astronomical Journal, 168(3), 116. https://doi.org/10.3847/1538-3881/ad61d8
+Raghava Kurup, R., Oakes, E. K., Vadlamani, P., Nwosu, O., Danthi, P., & Hundley, H. A. (2022). ADAR3 activates NF-κB signaling and promotes glioblastoma cell resistance to temozolomide. Scientific Reports, 12(1), 13362. https://doi.org/10.1038/s41598-022-17559-4
+Raina, M., Cheng, H., Ferreira, R. M., Stansfield, T., Modak, C., Cheng, Y.-H., Suryadevara, H. N. S. K., Xu, D., Eadon, M. T., Ma, Q., & Wang, J. (2025). Relation equivariant graph neural networks to explore the mosaic-like tissue architecture of kidney diseases on spatially resolved transcriptomics. Bioinformatics, 41(6), btaf303. https://doi.org/10.1093/bioinformatics/btaf303
+Raina, M., Cheng, H., Suryadevara, H. N. S. K., Stransfield, T., Xu, D., Ma, Q., Eadon, M. T., & Wang, J. (2023). Exploring the Mosaic-like Tissue Architecture of Kidney Diseases Using Relation Equivariant Graph Neural Networks on Spatially Resolved Transcriptomics. Bioinformatics. https://doi.org/10.1101/2023.11.09.566479
+Rajendren, S., Dhakal, A., Vadlamani, P., Townsend, J., Deffit, S. N., & Hundley, H. A. (2021). Profiling neural editomes reveals a molecular mechanism to regulate RNA editing during development. Genome Research, 31(1), 27–39. https://doi.org/10.1101/gr.267575.120
+Rajimon, K. J., Elangovan, N., Amir Khairbek, A., & Thomas, R. (2023). Schiff bases from chlorine substituted anilines and salicylaldehyde: Synthesis, characterization, fluorescence, thermal features, biological studies and electronic structure investigations. Journal of Molecular Liquids, 370, 121055. https://doi.org/10.1016/j.molliq.2022.121055
+Ravi, N., & Johnson, D. P. (2021). Artificial intelligence based monitoring system for onsite septic systems failure. Process Safety and Environmental Protection, 148, 1090–1097. https://doi.org/10.1016/j.psep.2021.01.049
+Reid, K. J., O’Brien, T. A., King, A. D., & Lane, T. P. (2021). Extreme Water Vapor Transport During the March 2021 Sydney Floods in the Context of Climate Projections. Geophysical Research Letters, 48(22), e2021GL095335. https://doi.org/10.1029/2021GL095335
+Reid, N. M., Jackson, C. E., Gilbert, D., Minx, P., Montague, M. J., Hampton, T. H., Helfrich, L. W., King, B. L., Nacci, D. E., Aluru, N., Karchner, S. I., Colbourne, J. K., Hahn, M. E., Shaw, J. R., Oleksiak, M. F., Crawford, D. L., Warren, W. C., & Whitehead, A. (2017). The Landscape of Extreme Genomic Variation in the Highly Adaptable Atlantic Killifish. Genome Biology and Evolution, 9(3), 659–676. https://doi.org/10.1093/gbe/evx023
+Ren, H., Cromwell, E., Kravitz, B., & Chen, X. (2022). Technical note: Using long short-term memory models to fill data gaps in hydrological monitoring networks. Hydrology and Earth System Sciences, 26(7), 1727–1743. https://doi.org/10.5194/hess-26-1727-2022
+Rhyman, L., Lee, E. P. F., Ramasami, P., & Dyke, J. M. (2023). A study of the thermodynamics and mechanisms of the atmospherically relevant reaction dimethyl sulphide (DMS) with atomic chlorine (Cl) in the absence and presence of water, using electronic structure methods. Physical Chemistry Chemical Physics, 25(6), 4780–4793. https://doi.org/10.1039/D2CP05814F
+Rice, M., Wang, X.-Y., Wang, S., Shporer, A., Barkaoui, K., Brahm, R., Collins, K. A., Jordán, A., Lowson, N., Butler, R. P., Crane, J. D., Shectman, S., Teske, J. K., Osip, D., Collins, K. I., Murgas, F., Boyle, G., Pozuelos, F. J., Timmermans, M., … Gillon, M. (2023). Evidence for Low-level Dynamical Excitation in Near-resonant Exoplanet Systems*. The Astronomical Journal, 166(6), 266. https://doi.org/10.3847/1538-3881/ad09de
+Riggins, D. P., Inderstrodt, J., Price, J., Grannis, S. J., Schleyer, T., Crago, J., O’Brien, S., & Dixon, B. E. (2024). Linking Maternal and Child Health Data to Enhance Public Health Surveillance in Indiana. International Journal of Population Data Science, 9(5). https://doi.org/10.23889/ijpds.v9i5.2570
+Risser, M., Collins, W., Wehner, M., O’Brien, T., Huang, H., & Ullrich, P. (2022). Anthropogenic aerosols mask increases in US rainfall by greenhouse gases. In Review. https://doi.org/10.21203/rs.3.rs-2038838/v1
+Risser, M. D., Collins, W. D., Wehner, M. F., O’Brien, T. A., Huang, H., & Ullrich, P. A. (2024). Anthropogenic aerosols mask increases in US rainfall by greenhouse gases. Nature Communications, 15(1), 1318. https://doi.org/10.1038/s41467-024-45504-8
+Risser, M. D., Collins, W. D., Wehner, M. F., O’Brien, T. A., Paciorek, C. J., O’Brien, J. P., Patricola-DiRosario, C. M., Huang, H., Ullrich, P. A., & Loring, B. (2023). A framework for detection and attribution of regional precipitation change: Application to the United States historical record. Climate Dynamics, 60(3–4), 705–741. https://doi.org/10.1007/s00382-022-06321-1
+Risser, M. D., Wehner, M. F., O’Brien, J. P., Patricola-DiRosario, C. M., O’Brien, T. A., Collins, W. D., Paciorek, C. J., & Huang, H. (2021). Quantifying the influence of natural climate variability on in situ measurements of seasonal total and extreme daily precipitation. Climate Dynamics, 56(9–10), 3205–3230. https://doi.org/10.1007/s00382-021-05638-7
+Robo, M. T., Hayes, R. L., Ding, X., Pulawski, B., & Vilseck, J. Z. (2023). Fast free energy estimates from λ-dynamics with bias-updated Gibbs sampling. Nature Communications, 14(1), 8515. https://doi.org/10.1038/s41467-023-44208-9
+Rocha, H. L., Aguilar, B., Getz, M., Shmulevich, I., & Macklin, P. (2023). A multiscale model of immune surveillance in micrometastases: Towards cancer patient digital twins. Systems Biology. https://doi.org/10.1101/2023.10.17.562733
+Rogers, L. M., Firestone, K., Chinni, R., Branco, A. C., Wrobleski, K., Chou, T., Goldstein, J. A., Gu, X., Mason, E., Chu, S., Der Lohe, M. R., Low, P., & Aronoff, D. M. (2026). Folate receptor beta drives NLRP3 inflammasome activation and pyroptosis in macrophages independent of folate binding. The Journal of Immunology, 215(4), vkag051. https://doi.org/10.1093/jimmun/vkag051
+Rusznak, J., Wang, X.-Y., Rice, M., & Wang, S. (2025). From Misaligned Sub-Saturns to Aligned Brown Dwarfs: The Highest M p / M* Systems Exhibit Low Obliquities, Even around Hot Stars*. The Astrophysical Journal Letters, 983(2), L42. https://doi.org/10.3847/2041-8213/adc129
+Sahneh, E. S., Nogara, G., DeVerna, M. R., Liu, N., Luceri, L., Menczer, F., Pierri, F., & Giordano, S. (2025). The Dawn of Decentralized Social Media: An Exploration of Bluesky’s Public Opening. In L. M. Aiello, T. Chakraborty, & S. Gaito (Eds.), Social Networks Analysis and Mining (Vol. 15211, pp. 422–437). Springer Nature Switzerland. https://doi.org/10.1007/978-3-031-78541-2_26
+Sanders, K. L., & James, T. W. (2019). Alcoholic drink preferences modulate acquired salience. Journal of Vision, 19(10), 30a. https://doi.org/10.1167/19.10.30a
+Sapp, C. D., Evans, E., Sprouse, R., & Dakota, D. (2024). Introducing a Parsed Corpus of Historical High German. 9224–9233. https://doi.org/10.63317/2dedf5d769f8
+Sarabipour, S., Macklin, P., & Niemi, N. M. (2024). Improving academic mentorship practices. Nature Human Behaviour, 8(7), 1228–1231. https://doi.org/10.1038/s41562-024-01910-y
+Sasi, S. C., Sunny, S. A., Sulay, R., Thomas, R., & Krishnan, R. (2026). Exploring the Role of Hydrogen Bonding in Cyclodextrin─Naphthalenediimide Binding Orientation. The Journal of Physical Chemistry B, 130(15), 4234–4246. https://doi.org/10.1021/acs.jpcb.6c00517
+Savoo, N., Mungur, C., Rhyman, L., Ramasami, P., & Joule, J. A. (2023). Electrophilic substitution reactions of thiophene and thieno[2,3- b ]thiophene heterocycles: A DFT study. Pure and Applied Chemistry, 95(7), 799–807. https://doi.org/10.1515/pac-2022-1104
+Sayyadiharikandeh, M., Varol, O., Yang, K.-C., Flammini, A., & Menczer, F. (2020). Detection of Novel Social Bots by Ensembles of Specialized Classifiers. Proceedings of the 29th ACM International Conference on Information & Knowledge Management, 2725–2732. https://doi.org/10.1145/3340531.3412698
+Schoenemann, P. T., Holloway, R. L., Gao, J.-H., & Yang, G. (2026). Neanderthal brain and cognition reconsidered. Proceedings of the National Academy of Sciences, 123(19), e2426638123. https://doi.org/10.1073/pnas.2426638123
+Seamans, J. K., Emberly, E., White, S., Morningstar, M., Linsenbardt, D., Ma, B., Czachowski, C. L., & Lapish, C. C. (2024). Neural basis of cognitive control signals in anterior cingulate cortex during delay discounting. Neuroscience. https://doi.org/10.1101/2024.06.07.597894
+Seo, B. (2016). Firm Scope and the Value of One-Stop Shopping in Washington State’s Deregulated Liquor Market. SSRN Electronic Journal. https://doi.org/10.2139/ssrn.2863094
+Sepe-Forrest, L., Kim, D.-J., Quinn, P. D., Bolbecker, A. R., Wisner, K. M., Hetrick, W. P., & O’Donnell, B. F. (2022). Evidence of familial confounding of the association between cannabis use and cerebellar-cortical functional connectivity using a twin study. NeuroImage: Clinical, 36, 103237. https://doi.org/10.1016/j.nicl.2022.103237
+Shao, C., Ciampaglia, G. L., Flammini, A., & Menczer, F. (2016). Hoaxy: A Platform for Tracking Online Misinformation. Proceedings of the 25th International Conference Companion on World Wide Web - WWW ’16 Companion, 745–750. https://doi.org/10.1145/2872518.2890098
+Shao, C., Ciampaglia, G. L., Varol, O., Yang, K.-C., Flammini, A., & Menczer, F. (2018). The spread of low-credibility content by social bots. Nature Communications, 9(1), 4787. https://doi.org/10.1038/s41467-018-06930-7
+Shao, C., Hui, P.-M., Wang, L., Jiang, X., Flammini, A., Menczer, F., & Ciampaglia, G. L. (2018). Anatomy of an online misinformation network. PLOS ONE, 13(4), e0196087. https://doi.org/10.1371/journal.pone.0196087
+Sharma, K., Barbosa, J. S., Roberts, S., Gondhali, U., Petrossian, G., Jacquet, J., Freire, J., & Chakraborty, S. (2025). Descriptive Analysis of Online Wildlife Products Using Vision Language Models. Proceedings of the ACM SIGCAS/SIGCHI Conference on Computing and Sustainable Societies, 461–472. https://doi.org/10.1145/3715335.3735484
+Shaw, J. R., Colbourne, J. K., Davey, J. C., Glaholt, S. P., Hampton, T. H., Chen, C. Y., Folt, C. L., & Hamilton, J. W. (2007). Gene response profiles for Daphnia pulex exposed to the environmental stressor cadmium reveals novel crustacean metallothioneins. BMC Genomics, 8(1), 477. https://doi.org/10.1186/1471-2164-8-477
+Shaw, J. R., Colbourne, J. K., Glaholt, S. P., Turner, E., Folt, C. L., & Chen, C. Y. (2019). Dynamics of Cadmium Acclimation in Daphnia pulex: Linking Fitness Costs, Cross-Tolerance, and Hyper-Induction of Metallothionein. Environmental Science & Technology, 53(24), 14670–14678. https://doi.org/10.1021/acs.est.9b05006
+Shaw, J. R., Hampton, T. H., King, B. L., Whitehead, A., Galvez, F., Gross, R. H., Keith, N., Notch, E., Jung, D., Glaholt, S. P., Chen, C. Y., Colbourne, J. K., & Stanton, B. A. (2014). Natural Selection Canalizes Expression Variation of Environmentally Induced Plasticity-Enabling Genes. Molecular Biology and Evolution, 31(11), 3002–3015. https://doi.org/10.1093/molbev/msu241
+Sherrill, E. M., & Johnson, K. M. (2021). New Insights Into the Slip Budget at Nankai: An Iterative Approach to Estimate Coseismic Slip and Afterslip. Journal of Geophysical Research: Solid Earth, 126(2), 2020JB020833. https://doi.org/10.1029/2020JB020833
+Sherrill, E. M., Johnson, K. M., & Jackson, N. M. (2024). Locating Boundaries Between Locked and Creeping Regions at Nankai and Cascadia Subduction Zones. Journal of Geophysical Research: Solid Earth, 129(10), e2024JB029346. https://doi.org/10.1029/2024JB029346
+Shi, Y., Chiang, C.-W., Unroe, K. T., Oyarzun-Gonzalez, X., Sun, A., Yang, Y., Hunold, K. M., Caterino, J., Li, L., Donneyong, M., & Zhang, P. (2024). Application of an Innovative Data Mining Approach Towards Safe Polypharmacy Practice in Older Adults. Drug Safety, 47(1), 93–102. https://doi.org/10.1007/s40264-023-01370-9
+Shi, Y., Eadon, M. T., Chen, Y., Sun, A., Yang, Y., Chiang, C., Donneyong, M., Su, J., & Zhang, P. (2024). A Precision Mixture Risk Model to Identify Adverse Drug Events in Subpopulations Using a Case‐Crossover Design. Statistics in Medicine, 43(27), 5088–5099. https://doi.org/10.1002/sim.10216
+Shi, Y., Sun, A., Nan, H., Yang, Y., Xu, J., Eadon, M. T., Su, J., & Zhang, P. (2025). A trajectory-informed model for detecting drug-drug-host interaction from real-world data. Journal of Biomedical Informatics, 168, 104859. https://doi.org/10.1016/j.jbi.2025.104859
+Shi, Y., Sun, A., Yang, Y., Xu, J., Li, J., Eadon, M., Su, J., & Zhang, P. (2025). A theoretical model for detecting drug interaction with awareness of timing of exposure. Scientific Reports, 15(1), 13693. https://doi.org/10.1038/s41598-025-98528-5
+Shields, C. A., Payne, A. E., Shearer, E. J., Wehner, M. F., O’Brien, T. A., Rutz, J. J., Leung, L. R., Ralph, F. M., Marquardt Collow, A. B., Ullrich, P. A., Dong, Q., Gershunov, A., Griffith, H., Guan, B., Lora, J. M., Lu, M., McClenny, E., Nardi, K. M., Pan, M., … Zarzycki, C. (2023). Future Atmospheric Rivers and Impacts on Precipitation: Overview of the ARTMIP Tier 2 High‐Resolution Global Warming Experiment. Geophysical Research Letters, 50(6), e2022GL102091. https://doi.org/10.1029/2022GL102091
+Silva, F. N., Tandon, A., Amancio, D. R., Flammini, A., Menczer, F., Milojević, S., & Fortunato, S. (2020). Recency predicts bursts in the evolution of author citations. Quantitative Science Studies, 1(3), 1298–1308. https://doi.org/10.1162/qss_a_00070
+Silva, F. N., Vega‐Oliveros, D. A., Yan, X., Flammini, A., Menczer, F., Radicchi, F., Kravitz, B., & Fortunato, S. (2021). Detecting Climate Teleconnections With Granger Causality. Geophysical Research Letters, 48(18), e2021GL094707. https://doi.org/10.1029/2021GL094707
+Simas, M. V., Davis, G. A., Hati, S., Pu, J., Goodpaster, J. V., & Sardar, R. (2025). Anisotropically Shaped Plasmonic WO 3– x Nanostructure-Driven Ultrasensitive SERS Detection and Machine Learning-Based Differentiation of Nitro-Explosives. ACS Applied Materials & Interfaces, 17(7), 11309–11324. https://doi.org/10.1021/acsami.4c19673
+Singh, S., Gyawali, Y. P., Jiang, T., Bukowski, G. S., Zheng, H., Zhang, H., Owopetu, R., Thielges, M. C., & Feng, C. (2024). Probing calmodulin–NO synthase interactions via site-specific infrared spectroscopy: An introductory investigation. JBIC Journal of Biological Inorganic Chemistry, 29(2), 243–250. https://doi.org/10.1007/s00775-024-02046-0
+Slone, J., Amorim, G., Semeere, A., Diero, L., Otero, L., Crabtree-Ramirez, B., Tao, R., Duda, S. N., Musick, B., Yiannoutsos, C., Lumley, T., Shaw, P. A., & Shepherd, B. E. (2026). Analysis approaches to combine error-prone data with a subset of validated data: An application to a multinational study of Kaposi sarcoma and HIV. American Journal of Epidemiology, kwag015. https://doi.org/10.1093/aje/kwag015
+Smith, J., Husted, S., Pilrose, J., Kuchangi, D., Ems-McClung, S. C., Carpenter, R. L., & Walczak, C. E. (2023). 294 Identification of MCAK Inhibitors that Induce Aneuploidy in Triple Negative Breast Cancer Models. Journal of Clinical and Translational Science, 7(s1), 88–88. https://doi.org/10.1017/cts.2023.349
+Smith, W. A., Dawid, S. M., Fernández-Ramírez, C., & Szczepaniak, A. P. (2023). Confining Potential in Coulomb-gauge Lattice QCD. Acta Physica Polonica B Proceedings Supplement, 16(8), 1. https://doi.org/10.5506/APhysPolBSupp.16.8-A22
+Smith, W. A., Glazier, D. I., Mathieu, V., Albaladejo, M., Albrecht, M., Baldwin, Z., Fernández-Ramírez, C., Hammoud, N., Mikhasenko, M., Montaña, G., Perry, R. J., Pilloni, A., Shastry, V., Szczepaniak, A. P., Winney, D., & Joint Physics Analysis Center. (2023). Ambiguities in partial wave analysis of two spinless meson photoproduction. Physical Review D, 108(7), 076001. https://doi.org/10.1103/PhysRevD.108.076001
+Snodgrass, H. M., Mondal, D., & Lewis, J. C. (2022). Directed Evolution of Flavin-Dependent Halogenases for Site- and Atroposelective Halogenation of 3-Aryl-4(3 H )-Quinazolinones via Kinetic or Dynamic Kinetic Resolution. Journal of the American Chemical Society, 144(36), 16676–16682. https://doi.org/10.1021/jacs.2c07422
+Snyder, R., Kim, B., Pan, X., Shao, Y., & Pu, J. (2022). Facilitating ab initio QM/MM free energy simulations by Gaussian process regression with derivative observations. Physical Chemistry Chemical Physics, 24(41), 25134–25143. https://doi.org/10.1039/D2CP02820D
+Snyder, R., Kim, B., Pan, X., Shao, Y., & Pu, J. (2023). Bridging semiempirical and ab initio QM/MM potentials by Gaussian process regression and its sparse variants for free energy simulation. The Journal of Chemical Physics, 159(5), 054107. https://doi.org/10.1063/5.0156327
+Snyder, R., Li, D., Ho, T., Kim, B., Qazi, H., Pan, X., Shao, Y., & Pu, J. (2025). Enhancing Gaussian process regression-accelerated QM/MM free energy simulations using atomic environment descriptors. https://doi.org/10.26434/chemrxiv-2025-hg8n7
+Snyder, R., Li, D., Ho, T., Kim, B., Qazi, H., Pan, X., Shao, Y., & Pu, J. (2026). Enhancing Gaussian process regression-accelerated QM/MM free energy simulations using atomic environment descriptors. The Journal of Chemical Physics, 164(11), 114111. https://doi.org/10.1063/5.0315012
+So, G. C., Lu, J. B. L., Cheng, Y., Gisch, D. L., Koyama, S., Melo Ferreira, R., Beamon, T. R., Desta, Z., & Eadon, M. T. (2025). Inhibition of Tacrolimus Metabolism by Cannabidiol and Its Metabolites In Vitro. Clinical and Translational Science, 18(2), e70152. https://doi.org/10.1111/cts.70152
+So, J., Strobel, O., Wann, J., Kim, K., Paul, A., Acri, D. J., Dabin, L. C., Kim, J., Peng, G., & Roh, H. C. (2025). Robust single-nucleus RNA sequencing reveals depot-specific cell population dynamics in adipose tissue remodeling during obesity. eLife, 13, RP97981. https://doi.org/10.7554/eLife.97981.3
+Spence, L., Henschel, B., Li, R., Tekwe, C., & Thiagarajah, K. (2022). Adding Walnuts to The Regular Diet Improved the Diet Quality Among U.S. Adults: Results of An NHANES Modeling Study. Journal of the Academy of Nutrition and Dietetics, 122(9), A40. https://doi.org/10.1016/j.jand.2022.06.143
+Srivastava, P., Yang, H., Ellis-Guardiola, K., & Lewis, J. C. (2015). Engineering a dirhodium artificial metalloenzyme for selective olefin cyclopropanation. Nature Communications, 6(1), 7789. https://doi.org/10.1038/ncomms8789
+Starski, P., Morningstar, M. D., Katner, S. N., Frasier, R. M., De Oliveira Sergio, T., Wean, S., Lapish, C. C., & Hopf, F. W. (2024). Neural activity in anterior insula at drinking onset and licking relates to compulsion-like alcohol consumption. The Journal of Neuroscience, e1490232023. https://doi.org/10.1523/JNEUROSCI.1490-23.2023
+Stevenson, R. A., Altieri, N. A., Kim, S., Pisoni, D. B., & James, T. W. (2010). Neural processing of asynchronous audiovisual speech perception. NeuroImage, 49(4), 3308–3318. https://doi.org/10.1016/j.neuroimage.2009.12.001
+Stolting, L., Beer, R. D., & Izquierdo, E. J. (2023a). Characterizing the Role of Homeostatic Plasticity in Central Pattern Generators. The 2023 Conference on Artificial Life. The 2023 Conference on Artificial Life. https://doi.org/10.1162/isal_a_00599
+Stolting, L., Beer, R. D., & Izquierdo, E. J. (2023b). Characterizing the Role of Homeostatic Plasticity in Central Pattern Generators. The 2023 Conference on Artificial Life. The 2023 Conference on Artificial Life. https://doi.org/10.1162/isal_a_00599
+Straub, V. M., Barti, B., Tandar, S. T., Stevens, A. F., Van Egmond, N., Van Der Wel, T., Zhu, N., Rüegger, J., Van Der Horst, C., Heitman, L. H., Li, Y., Stella, N., Van Hasselt, J. G. C., Katona, I., & Van Der Stelt, M. (2025). The endocannabinoid 2-arachidonoylglycerol is released and transported on demand via extracellular microvesicles. Proceedings of the National Academy of Sciences, 122(8), e2421717122. https://doi.org/10.1073/pnas.2421717122
+Suárez-Serrato, P., Roberts, M. E., Davis, C., & Menczer, F. (2016). On the Influence of Social Bots in Online Protests: Preliminary Findings of a Mexican Case Study. In E. Spiro & Y.-Y. Ahn (Eds.), Social Informatics (Vol. 10047, pp. 269–278). Springer International Publishing. https://doi.org/10.1007/978-3-319-47874-6_19
+Subramanian, S., Gao, X., Dann, C. E., & Kearns, D. B. (2017). MotI (DgrA) acts as a molecular clutch on the flagellar stator protein MotA in Bacillus subtilis. Proceedings of the National Academy of Sciences, 114(51), 13537–13542. https://doi.org/10.1073/pnas.1716231114
+Sunny, S. A., Mathew, T., Thomas, J. M., Alzahrani, A. Y. A., & Thomas, R. (2026). Dominant non-covalent forces in diphenhydramine-8-chlorotheophylline supramolecular assembly. Modern Physics Letters B, 40(04), 2550285. https://doi.org/10.1142/S0217984925502859
+Sunny, S. A., Rajan, R. F., Thilakan, S., Thomas, F., Pooventhiran, T., Alzahrani, A. Y. A., & Thomas, R. (2026). Investigating the Role of Noncovalent Interactions in Vadadustat’s Solubility and Stability With Selected Solvents. ChemistrySelect, 11(5), e05824. https://doi.org/10.1002/slct.202505824
+Sutton, G. P., Mangan, E. V., Neustadter, D. M., Beer, R. D., Crago, P. E., & Chiel, H. J. (2004). Neural control exploits changing mechanical advantage and context dependence to generate different feeding responses in Aplysia. Biological Cybernetics, 91(5), 333–345. https://doi.org/10.1007/s00422-004-0517-z
+Swinford, C. G., Risacher, S. L., Vosmeier, A., Deardorff, R., Chumin, E. J., Dzemidzic, M., Wu, Y.-C., Gao, S., McDonald, B. C., Yoder, K. K., Unverzagt, F. W., Wang, S., Farlow, M. R., Brosch, J. R., Clark, D. G., Apostolova, L. G., Sims, J., Wang, D. J., & Saykin, A. J. (2023). Amyloid and tau pathology are associated with cerebral blood flow in a mixed sample of nondemented older adults with and without vascular risk factors for Alzheimer’s disease. Neurobiology of Aging, 130, 103–113. https://doi.org/10.1016/j.neurobiolaging.2023.06.014
+Tang, W., Guaje, J., Fadnavis, S., Heilbronner, S. R., & Garyfallidis, E. (2026). Mapping the structural connections between the anterior cingulate cortex and the insula/ventrolateral prefrontal cortex. Imaging Neuroscience, 4, IMAG.a.1253. https://doi.org/10.1162/IMAG.a.1253
+Tayloe, R. (2006). Neutrinos, Oscillations and New Physics: An Introduction. AIP Conference Proceedings, 842, 748–755. https://doi.org/10.1063/1.2220375
+Tayloe, R. (2011). Neutrino cross section measurements with MiniBooNE. Nuclear Physics B - Proceedings Supplements, 221, 287–291. https://doi.org/10.1016/j.nuclphysbps.2011.09.018
+Tayloe, R. & for the MiniBooNE Collaboration. (2010). RECENT RESULTS FROM $\bar \nu _\mu \, \to \,\bar \nu _e$ WITH MINIBOONE. CPT and Lorentz Symmetry, 239–243. https://doi.org/10.1142/9789814327688_0047
+Tayloe, R., Kaplan, D., Goodman, M., & Sullivan, Z. (2010). Quasielastic Neutrino Scattering at E[sub ν]≈1 GeV: Recent Measurements and Interpretations. 191–195. https://doi.org/10.1063/1.3399290
+Tayloe, R., Katori, T., & FOR THE MINIBOONE COLLABORATION. (2008). NEUTRINO OSCILLATIONS AND LORENTZ VIOLATION WITH MINIBOONE. CPT and Lorentz Symmetry, 79–85. https://doi.org/10.1142/9789812779519_0012
+Tayloe, R., MiniBooNE collaboration, Zeller, G. P., Morfin, J. G., & Cavanna, F. (2007). Measuring Neutrino Interactions with MiniBooNE. AIP Conference Proceedings, 967, 39–44. https://doi.org/10.1063/1.2834506
+Tefft, K., Wang, A., Reinstein, Z. Z., Zhang, Y., Pillai, A., Hwang, S., Ng, S., Cho, R. J., Cheng, J. B., Kuang, F. L., King, B., & Choi, J. (2025). Cellular profiling identifies targetable T cell phenotypes in lymphocytic variant hypereosinophilic syndrome. Journal of Clinical Investigation, 135(21), e190853. https://doi.org/10.1172/JCI190853
+Thangaiyan, P., Kasparraj, J. S., Khairbek, A. A., Shadakshara Murthy, K. R., & Thomas, R. (2026). Glycolytic Inhibition may not be a Pathway for Covid-19 Inhibition of 2-Deoxyglucose: Evidence from Computational Studies. Letters in Applied NanoBioScience, 15(1), 48. https://doi.org/10.33263/LIANBS151.048
+Thilagavathi, G., Jayachitra, R., Kanagavalli, A., Elangovan, N., Sirajunnisa, A., Rajimon, K. J., Sowrirajan, S., & Thomas, R. (2023). (E)-4-((4-chlorobenzylidene)amino)-N-(thiazole-2yl) benzenesulfonamide: Synthesis, characterization and electronic structure theory and docking studies. Journal of the Indian Chemical Society, 100(2), 100910. https://doi.org/10.1016/j.jics.2023.100910
+Thilagavathi, G., Jayachitra, R., Kanagavalli, A., N, E., Sirajunnisa, A., S, S., & Thomas, R. (2023). Synthesis, computational, molecular docking studies and photophysical properties of (Z)-N-(pyrimidin-2-yl)-4-(thiophen-2-ylmethylene)amino) benzenesulfonamide. Journal of the Indian Chemical Society, 100(1), 100835. https://doi.org/10.1016/j.jics.2022.100835
+Thomas, R., Al‐Zaben, M. I., Alzahrani, A. Y. A., Puchta, R., & Khairbek, A. A. (2026). A Comparative DFT Study of Pd‐ and Ni‐Based Catalysts in the Narasaka–Heck/C(sp3 )–H Activation Reaction. Journal of Computational Chemistry, 47(8), e70361. https://doi.org/10.1002/jcc.70361
+Tilmes, S., Richter, J. H., Kravitz, B., MacMartin, D. G., Glanville, A. S., Visioni, D., Kinnison, D. E., & Müller, R. (2021). Sensitivity of Total Column Ozone to Stratospheric Sulfur Injection Strategies. Geophysical Research Letters, 48(19), e2021GL094058. https://doi.org/10.1029/2021GL094058
+Tilmes, S., Richter, J. H., Kravitz, B., MacMartin, D. G., Mills, M. J., Simpson, I. R., Glanville, A. S., Fasullo, J. T., Phillips, A. S., Lamarque, J.-F., Tribbia, J., Edwards, J., Mickelson, S., & Ghosh, S. (2018). CESM1(WACCM) Stratospheric Aerosol Geoengineering Large Ensemble Project. Bulletin of the American Meteorological Society, 99(11), 2361–2371. https://doi.org/10.1175/BAMS-D-17-0267.1
+Timme, N. M., Ardinger, C. E., Weir, S. D. C., Zelaya-Escobar, R., Kruger, R., & Lapish, C. C. (2024). Non-consummatory behavior signals predict aversion-resistant alcohol drinking in head-fixed mice. Neuropharmacology, 242, 109762. https://doi.org/10.1016/j.neuropharm.2023.109762
+Timme, N. M., Ma, B., Linsenbardt, D., Cornwell, E., Galbari, T., & Lapish, C. C. (2022). Compulsive alcohol drinking in rodents is associated with altered representations of behavioral control and seeking in dorsal medial prefrontal cortex. Nature Communications, 13(1), 3990. https://doi.org/10.1038/s41467-022-31731-4
+Tobin, R. W., & Berrington, R. C. (2023). Photometric study of the overcontact binary V826 Aur. New Astronomy, 101, 102019. https://doi.org/10.1016/j.newast.2023.102019
+Tobin, R. W., & Berrington, R. C. (2024). Photometric study of the overcontact binary NSVS2910034. New Astronomy, 109, 102210. https://doi.org/10.1016/j.newast.2024.102210
+Todd, K., Schneider, O., Lawrence, J. M., Aronoff, J. L., Witek, B., Velázquez-Colón, V., Santana-Ufret, V., Anderson, N. L., Gunter, K., Noda, M., Relich, R. F., Zeng, L., Limoli, D. H., Whidbey, C., & Vornhagen, J. (2026). Environmental redox conditions and strain variation define phenazine-mediated antagonism in co-infecting bacteria. PLOS Biology, 24(5), e3003809. https://doi.org/10.1371/journal.pbio.3003809
+Tong, N., Wong-Roushar, J., Wallace-Povirk, A., Shah, Y., Nyman, M. C., Katinas, J. M., Schneider, M., O’Connor, C., Bao, X., Kim, S., Li, J., Hou, Z., Matherly, L. H., Dann, C. E., & Gangjee, A. (2023). Multitargeted 6-Substituted Thieno[2,3- d ]pyrimidines as Folate Receptor-Selective Anticancer Agents that Inhibit Cytosolic and Mitochondrial One-Carbon Metabolism. ACS Pharmacology & Translational Science, 6(5), 748–770. https://doi.org/10.1021/acsptsci.3c00020
+Torres-Lugo, C., Pote, M., Nwala, A. C., & Menczer, F. (2022). Manipulating Twitter through Deletions. Proceedings of the International AAAI Conference on Web and Social Media, 16, 1029–1039. https://doi.org/10.1609/icwsm.v16i1.19355
+Torres-Lugo, C., Yang, K.-C., & Menczer, F. (2022). The Manufacture of Partisan Echo Chambers by Follow Train Abuse on Twitter. Proceedings of the International AAAI Conference on Web and Social Media, 16, 1017–1028. https://doi.org/10.1609/icwsm.v16i1.19354
+Truong, B. T., Allen, O. M., & Menczer, F. (2024). Account credibility inference based on news-sharing networks. EPJ Data Science, 13(1), 10. https://doi.org/10.1140/epjds/s13688-024-00450-9
+Truong, B. T., Lou, X., Flammini, A., & Menczer, F. (2024a). Quantifying the vulnerabilities of the online public square to adversarial manipulation tactics. PNAS Nexus, 3(7), pgae258. https://doi.org/10.1093/pnasnexus/pgae258
+Truong, B. T., Lou, X., Flammini, A., & Menczer, F. (2024b). Quantifying the vulnerabilities of the online public square to adversarial manipulation tactics. PNAS Nexus, 3(7), pgae258. https://doi.org/10.1093/pnasnexus/pgae258
+Truong, D. H., Lan Nguyen, T. H., & Dao, D. Q. (2023). Revisiting the HO● -initiated oxidation of L-proline amino acid in the aqueous phase: Influence of transition metal ions. Royal Society Open Science, 10(6), 230114. https://doi.org/10.1098/rsos.230114
+Tsui, H. T., Joseph, M., Zheng, J. J., Perez, A. J., Manzoor, I., Rued, B. E., Richardson, J. D., Branny, P., Doubravová, L., Massidda, O., & Winkler, M. E. (2023). Negative regulation of MurZ and MurA underlies the essentiality of GpsB ‐ and StkP ‐mediated protein phosphorylation in Streptococcus pneumoniae D39. Molecular Microbiology, 120(3), 351–383. https://doi.org/10.1111/mmi.15122
+Tye, M. R., Dagon, K., Molina, M. J., Richter, J. H., Visioni, D., Kravitz, B., & Tilmes, S. (2022). Indices of extremes: Geographic patterns of change in extremes and associated vegetation impacts under climate intervention. Earth System Dynamics, 13(3), 1233–1257. https://doi.org/10.5194/esd-13-1233-2022
+Udofia, I. A., Ekama, T., Ogunbayo, T. B., Oloba-Whenu, O. A., Rhyman, L., Isanbor, C., & Ramasami, P. (2023). Experimental and theoretical calculation of pKa values of substituted-2,4,6-trinitrodiphenylamines. Journal of Molecular Liquids, 371, 120926. https://doi.org/10.1016/j.molliq.2022.120926
+Udofia, I. A., Oloba‐Whenu, O. A., Ogunbayo, T. B., & Isanbor, C. (2023). Theoretical Study of the Photophysical and Photochemical Properties of 1H‐Benzimidazole and 2‐Ethyl‐7‐nitro‐5‐Substituted 1H‐Benzimidazoles. ChemistrySelect, 8(44), e202302135. https://doi.org/10.1002/slct.202302135
+Ueda, Y., Nakamura, T., Nie, J., Solivais, A. J., Hoffman, J. R., Daye, B. J., & Hashino, E. (2023). Defining developmental trajectories of prosensory cells in human inner ear organoids at single-cell resolution. Development, 150(12), dev201071. https://doi.org/10.1242/dev.201071
+Urayama, S., Fukudome, A., Hirai, M., Okumura, T., Nishimura, Y., Takaki, Y., Kurosawa, N., Koonin, E. V., Krupovic, M., & Nunoura, T. (2024). Double-stranded RNA sequencing reveals distinct riboviruses associated with thermoacidophilic bacteria from hot springs in Japan. Nature Microbiology, 9(2), 514–523. https://doi.org/10.1038/s41564-023-01579-5
+Urayama, S., Fukudome, A., Mutz, P., Matsushita, Y., Takaki, Y., Nishimura, Y., Medvedeva, S., Krupovic, M., Koonin, E. V., & Nunoura, T. (2026). Identification of hot spring Obelisk-like RNA replicons and expanded diversity of the Obelisk superfamily. Nature Communications, 17(1), 3041. https://doi.org/10.1038/s41467-026-71096-6
+Vaish, S., & Chick Jarrold, C. (2022). ZINC OXIDE ELECTRONIC STRUCTURE STUDY USING PES. Proceedings of the 2022 International Symposium on Molecular Spectroscopy, 1–1. https://doi.org/10.15278/isms.2022.WD04
+Van Der Vliet, D., Klinkenberg, A. X. Y., Platte, R., Higgins, K., Prokop, S., Huizenga, M. C. W., Kraaijevanger, L., Van Egmond, N., Straub, V. M., Kole, M. H. P., Pacher, P., Katona, I., Huitinga, I., & Van Der Stelt, M. (2025). Spatially Resolved Mapping of Monoacylglycerol Lipase Activity in the Brain. ACS Chemical Neuroscience, 16(24), 4622–4635. https://doi.org/10.1021/acschemneuro.5c00638
+Visioni, D., Bednarz, E. M., Lee, W. R., Kravitz, B., Jones, A., Haywood, J. M., & MacMartin, D. G. (2023). Climate response to off-equatorial stratospheric sulfur injections in three Earth system models – Part 1: Experimental protocols and surface changes. Atmospheric Chemistry and Physics, 23(1), 663–685. https://doi.org/10.5194/acp-23-663-2023
+Visioni, D., Bednarz, E. M., MacMartin, D. G., Kravitz, B., & Goddard, P. B. (2023). The Choice of Baseline Period Influences the Assessments of the Outcomes of Stratospheric Aerosol Injection. Earth’s Future, 11(8), e2023EF003851. https://doi.org/10.1029/2023EF003851
+Visioni, D., Kravitz, B., Robock, A., Tilmes, S., Haywood, J., Boucher, O., Lawrence, M., Irvine, P., Niemeier, U., Xia, L., Chiodo, G., Lennard, C., Watanabe, S., Moore, J. C., & Muri, H. (2023). Opinion: The scientific and community-building roles of the Geoengineering Model Intercomparison Project (GeoMIP) – past, present, and future. Atmospheric Chemistry and Physics, 23(9), 5149–5176. https://doi.org/10.5194/acp-23-5149-2023
+Visioni, D., MacMartin, D. G., & Kravitz, B. (2021). Is Turning Down the Sun a Good Proxy for Stratospheric Sulfate Geoengineering? Journal of Geophysical Research: Atmospheres, 126(5), e2020JD033952. https://doi.org/10.1029/2020JD033952
+Visioni, D., MacMartin, D. G., Kravitz, B., Lee, W., Simpson, I. R., & Richter, J. H. (2020). Reduced Poleward Transport Due to Stratospheric Heating Under Stratospheric Aerosols Geoengineering. Geophysical Research Letters, 47(17), e2020GL089470. https://doi.org/10.1029/2020GL089470
+Visioni, D., MacMartin, D. G., Kravitz, B., Richter, J. H., Tilmes, S., & Mills, M. J. (2020). Seasonally Modulated Stratospheric Aerosol Geoengineering Alters the Climate Outcomes. Geophysical Research Letters, 47(12), e2020GL088337. https://doi.org/10.1029/2020GL088337
+Visioni, D., Robock, A., Haywood, J., Henry, M., Tilmes, S., MacMartin, D. G., Kravitz, B., Doherty, S. J., Moore, J., Lennard, C., Watanabe, S., Muri, H., Niemeier, U., Boucher, O., Syed, A., Egbebiyi, T. S., Séférian, R., & Quaglia, I. (2024). G6-1.5K-SAI: A new Geoengineering Model Intercomparison Project (GeoMIP) experiment integrating recent advances in solar radiation modification studies. Geoscientific Model Development, 17(7), 2583–2596. https://doi.org/10.5194/gmd-17-2583-2024
+Visioni, D., Tilmes, S., Bardeen, C., Mills, M., MacMartin, D. G., Kravitz, B., & Richter, J. H. (2022). Limitations of assuming internal mixing between different aerosol species: A case study with sulfate geoengineering simulations. Atmospheric Chemistry and Physics, 22(3), 1739–1756. https://doi.org/10.5194/acp-22-1739-2022
+Vornhagen, J., Rao, K., & Bachman, M. A. (2023). Gut community structure as a risk factor for infection in Klebsiella -colonized patients. Infectious Diseases (except HIV/AIDS). https://doi.org/10.1101/2023.04.18.23288742
+Vornhagen, J., Rao, K., & Bachman, M. A. (2024). Gut community structure as a risk factor for infection in Klebsiella pneumoniae -colonized patients. mSystems, 9(8), e00786-24. https://doi.org/10.1128/msystems.00786-24
+Vreeman, R. C., Yiannoutsos, C. T., Edmonds, A., Leroy, V., Fatti, G., Kosalaraksa, P., Pinto, J., Musick, B., Nyandiko, W., Twizere, C., Amorissani-Folquet, M., Mbewe, S., Mejia, F., Scanlon, M. L., Martin, R., Wools-Kaloustian, K., & IeDEA. (2025). Rates of adherence, adherence measurement, and support services for children and adolescents living with HIV followed in global sites of the International Epidemiology Databases to Evaluate AIDS (IeDEA). BMC Pediatrics, 25(1), 706. https://doi.org/10.1186/s12887-025-05939-4
+Wagner, C., Graells-Garrido, E., Garcia, D., & Menczer, F. (2016). Women through the glass ceiling: Gender asymmetries in Wikipedia. EPJ Data Science, 5(1), 5. https://doi.org/10.1140/epjds/s13688-016-0066-4
+Wallace-Povirk, A., Tong, N., Wong-Roushar, J., O’Connor, C., Zhou, X., Hou, Z., Bao, X., Garcia, G. E., Li, J., Kim, S., Dann, C. E., Matherly, L. H., & Gangjee, A. (2021). Discovery of 6-substituted thieno[2,3-d]pyrimidine analogs as dual inhibitors of glycinamide ribonucleotide formyltransferase and 5-aminoimidazole-4-carboxamide ribonucleotide formyltransferase in de novo purine nucleotide biosynthesis in folate receptor expressing human tumors. Bioorganic & Medicinal Chemistry, 37, 116093. https://doi.org/10.1016/j.bmc.2021.116093
+Wandai, M. E., Allen, K. S., Wiensch, A., Price, J., & Dixon, B. E. (2025). Equivalence of Type 2 Diabetes Prevalence Estimates: Comparative Study of Similar Phenotyping Algorithms Using Electronic Health Record Data. JMIR Public Health and Surveillance, 11, e79653–e79653. https://doi.org/10.2196/79653
+Wang, B., Ascenzi Pettenuzzo, C., Singh, J., Mccabe, G. E., Clark, L., Young, R., Pu, J., & Deng, Y. (2022). Photoinduced Site-Selective Functionalization of Aliphatic C–H Bonds by Pyridine N -oxide Based HAT Catalysts. ACS Catalysis, 12(16), 10441–10448. https://doi.org/10.1021/acscatal.2c02993
+Wang, D., Pulido, J., Grosset, P., Tian, J., Ahrens, J., & Tao, D. (2023). Analyzing Impact of Data Reduction Techniques on Visualization for AMR Applications Using AMReX Framework. Proceedings of the SC ’23 Workshops of the International Conference on High Performance Computing, Network, Storage, and Analysis, 263–271. https://doi.org/10.1145/3624062.3625123
+Wang, F., Hendryx, M., Liu, N., Bidulescu, A., Mitra, A. K., & Luo, J. (2024). SGLT2 Inhibitor Use and Risk of Breast Cancer Among Adult Women with Type 2 Diabetes. Drug Safety, 47(2), 125–133. https://doi.org/10.1007/s40264-023-01373-6
+Wang, J., & Kang, J. (2026). Artificial intelligence in the assessment of epilepsy‐related genetic mutations: Learned from GABAA receptors and GABA transporter 1. Epilepsia Open, 11(3), 740–751. https://doi.org/10.1002/epi4.70259
+Wang, L., Wallace, A., Raghavan, S., Deis, S. M., Wilson, M. R., Yang, S., Polin, L., White, K., Kushner, J., Orr, S., George, C., O’Connor, C., Hou, Z., Mitchell-Ryan, S., Dann, C. E., Matherly, L. H., & Gangjee, A. (2015). 6-Substituted Pyrrolo[2,3- d ]pyrimidine Thienoyl Regioisomers as Targeted Antifolates for Folate Receptor α and the Proton-Coupled Folate Transporter in Human Tumors. Journal of Medicinal Chemistry, 58(17), 6938–6959. https://doi.org/10.1021/acs.jmedchem.5b00801
+Wang, Q., Adams, E. L., Poole, R. A., Soleimani, T., Wang, G. X., Li, H., Capitano, M. L., Masood, A., Abrams, S. I., Lee, K. P., Zhang, S., & Opyrchal, M. (2026). Iron diminishes immunosuppressive macrophages and enhances anti-PD-1 immunotherapy in breast cancer models. Journal of Experimental & Clinical Cancer Research, 45(1), 70. https://doi.org/10.1186/s13046-026-03661-2
+Wang, R., Chen, C., Liu, Y., Luo, M., Yang, J., Chen, Y., Ma, L., Yang, L., Lin, C., Diao, L., & Han, L. (2024). The pharmacogenomic and immune landscape of snoRNAs in human cancers. Cancer Letters, 605, 217304. https://doi.org/10.1016/j.canlet.2024.217304
+Wang, R. J., Peña-García, Y., Raveendran, M., Harris, R. A., Nguyen, T.-T., Gingras, M.-C., Wu, Y., Perez, L., Yoder, A. D., Simmons, J. H., Rogers, J., & Hahn, M. W. (2025). Unprecedented female mutation bias in the aye-aye, a highly unusual lemur from Madagascar. PLOS Biology, 23(2), e3003015. https://doi.org/10.1371/journal.pbio.3003015
+Wang, R., Luo, M., Liu, Y., Yang, J., Chen, Y., Chen, C., Ma, L., Ding, S., Wengler, J., Zang, Y., Lim, B., Li, W., Yang, L., Lin, C., Diao, L., & Han, L. (2026). Functional, Pharmacogenomic, and Immune Landscapes of Long Non‐Coding RNAs in Cancer. Advanced Science, 13(6), e13414. https://doi.org/10.1002/advs.202513414
+Wang, X.-Y., Rice, M., Wang, S., Kanodia, S., Dai, F., Logsdon, S. E., Schweiker, H., Teske, J. K., Butler, R. P., Crane, J. D., Shectman, S., Quinn, S. N., Kostov, V., Osborn, H. P., Goeke, R. F., Eastman, J. D., Shporer, A., Rapetti, D., Collins, K. A., … Jenkins, J. M. (2024). Single-star Warm-Jupiter Systems Tend to Be Aligned, Even around Hot Stellar Hosts: No Teff –λ Dependency*. The Astrophysical Journal Letters, 973(1), L21. https://doi.org/10.3847/2041-8213/ad7469
+Wang, Y., Brodin, E., Nishii, K., Frieboes, H. B., Mumenthaler, S. M., Sparks, J. L., & Macklin, P. (2021). Impact of tumor-parenchyma biomechanics on liver metastatic progression: A multi-model approach. Scientific Reports, 11(1), 1710. https://doi.org/10.1038/s41598-020-78780-7
+Wang, Y., Bucher, E., Rocha, H., Jadhao, V., Metzcar, J., Heiland, R., Frieboes, H. B., & Macklin, P. (2024). Drug-loaded nanoparticles for cancer therapy: A high-throughput multicellular agent-based modeling study. Systems Biology. https://doi.org/10.1101/2024.04.09.588498
+Wang 汪, X.-Y. 宪钰, Wang 王, S. 松虎, & Ong 王, J. M. J. 加冕. (2026). Unified Kraft Break at ∼6500 K: A Newly Identified Single-star Obliquity Transition Matches the Classical Rotation Break. The Astrophysical Journal Letters, 996(1), L7. https://doi.org/10.3847/2041-8213/ae21c5
+Watkins, J., Aradi, P., Hahn, R., Makriyannis, A., Mackie, K., Katona, I., & Hohmann, A. G. (2025). CB1 cannabinoid receptor agonists induce acute respiratory depression in awake mice. Pharmacological Research, 214, 107682. https://doi.org/10.1016/j.phrs.2025.107682
+Watkins, J., Herms, E., Schiestl, E., & Wisner, K. (2026). Exploring the role of negative urgency in body dissatisfaction in young adults. Journal of Health Psychology, 13591053261430272. https://doi.org/10.1177/13591053261430272
+Weng, L., & Menczer, F. (2015). Topicality and Impact in Social Media: Diverse Messages, Focused Messengers. PLOS ONE, 10(2), e0118410. https://doi.org/10.1371/journal.pone.0118410
+Weng, L., Menczer, F., & Ahn, Y.-Y. (2013). Virality Prediction and Community Structure in Social Networks. Scientific Reports, 3(1), 2522. https://doi.org/10.1038/srep02522
+White, E. B., Vesperini, E., Dalessandro, E., & Varri, A. L. (2026). Evolution of the kinematic properties of rotating, multiple-population globular clusters. Astronomy & Astrophysics, 705, A159. https://doi.org/10.1051/0004-6361/202556382
+White, S. M., Morningstar, M. D., De Falco, E., Linsenbardt, D. N., Ma, B., Parks, M. A., Czachowski, C. L., & Lapish, C. C. (2024). Impulsive Choices Emerge When the Anterior Cingulate Cortex Fails to Encode Deliberative Strategies. Eneuro, 11(11), ENEURO.0379-24.2024. https://doi.org/10.1523/ENEURO.0379-24.2024
+White, S. M., Morningstar, M. D., Falco, E. D., Linsenbardt, D. N., Ma, B., Parks, M. A., Czachowski, C. L., & Lapish, C. C. (2023). Flexible coding schemes in dorsomedial prefrontal cortex underlie decision-making during delay discounting. Neuroscience. https://doi.org/10.1101/2023.06.15.545101
+Wibowo, A. S., Singh, M., Reeder, K. M., Carter, J. J., Kovach, A. R., Meng, W., Ratnam, M., Zhang, F., & Dann, C. E. (2013). Structures of human folate receptors reveal biological trafficking states and diversity in folate and antifolate recognition. Proceedings of the National Academy of Sciences, 110(38), 15180–15188. https://doi.org/10.1073/pnas.1308827110
+Wilhelm, E., Ballalai, I., Belanger, M.-E., Benjamin, P., Bertrand-Ferrandis, C., Bezbaruah, S., Briand, S., Brooks, I., Bruns, R., Bucci, L. M., Calleja, N., Chiou, H., Devaria, A., Dini, L., D’Souza, H., Dunn, A. G., Eichstaedt, J. C., Evers, S. M. A. A., Gobat, N., … Purnat, T. D. (2023). Measuring the Burden of Infodemics: Summary of the Methods and Results of the Fifth WHO Infodemic Management Conference. JMIR Infodemiology, 3, e44207. https://doi.org/10.2196/44207
+Wilkerson, K., & Leake, D. (2024). On Implementing Case-Based Reasoning with Large Language Models. In J. A. Recio-Garcia, M. G. Orozco-del-Castillo, & D. Bridge (Eds.), Case-Based Reasoning Research and Development (Vol. 14775, pp. 404–417). Springer Nature Switzerland. https://doi.org/10.1007/978-3-031-63646-2_26
+Wilkins, L., Berto, G., Pestilli, F., & Port, N. (2024). 6.15 Protective and risk factors for persistent post concussion symptoms and return to play of NCAA collegiate athletes: Findings from the NCAA-DOD CARE consortium. Second Round Abstract Submissions, A112.1-A112. https://doi.org/10.1136/bjsports-2023-concussion.293
+Williams, I., O’Malley, M., DeHart, H., Walker, B., Ulhaskumar, V., Jothirajah, P., Ray, H., Landrum, L. M., Delaney, J. R., Nephew, K. P., & Carpenter, R. L. (2025). MYC and HSF1 Cooperate to Drive Sensitivity to Polo-like Kinase 1 Inhibitor Volasertib in High-grade Serous Ovarian Cancer. Cancer Research Communications, 5(2), 253–266. https://doi.org/10.1158/2767-9764.CRC-24-0400
+Winney, D., Fernández-Ramírez, C., Pilloni, A., Hiller Blin, A. N., Albaladejo, M., Bibrzycki, Ł., Hammoud, N., Liao, J., Mathieu, V., Montaña, G., Perry, R. J., Shastry, V., Smith, W. A., Szczepaniak, A. P., & Joint Physics Analysis Center. (2023). Dynamics in near-threshold J / ψ photoproduction. Physical Review D, 108(5), 054018. https://doi.org/10.1103/PhysRevD.108.054018
+Woodward, T. J., Dimen, D., Sizemore, E. F., Stockman, S., Kazi, F., Luquet, S., Mackie, K., Katona, I., & Hohmann, A. G. (2025). Genetic deletion of NAPE-PLD alters stress responsiveness and HPA-axis functionality in a context-dependent manner in mice. Neuropharmacology, 281, 110702. https://doi.org/10.1016/j.neuropharm.2025.110702
+Xie, F. (2024). Bias-Corrected Joint Spectral Embedding for Multilayer Networks With Invariant Subspace: Entrywise Eigenvector Perturbation and Inference. IEEE Transactions on Information Theory, 70(12), 9036–9083. https://doi.org/10.1109/TIT.2024.3471953
+Xing, F., Liu, Y., Sharma, S., Wu, K., Chan, M. D., Lo, H.-W., Carpenter, R. L., Metheny-Barlow, L. J., Zhou, X., Qasem, S. A., Pasche, B., & Watabe, K. (2016). Activation of the c-Met Pathway Mobilizes an Inflammatory Network in the Brain Microenvironment to Promote Brain Metastasis of Breast Cancer. Cancer Research, 76(17), 4970–4980. https://doi.org/10.1158/0008-5472.CAN-15-3541
+Xu, J., Chen, Y., Shi, Y., Sun, A., Yang, Y., Boustani, M., Su, J., & Zhang, P. (2024). Associations Between Neuroinflammation-Related Conditions and Alzheimer’s Disease: A Study of US Insurance Claims Data. Journal of Alzheimer’s Disease, 99(2), 739–752. https://doi.org/10.3233/JAD-231286
+Xu, J., Sun, A., Yang, Y., Shi, Y., Su, J., Eadon, M. T., & Zhang, P. (2025). Risk of Urinary Tract Infections with Sodium-Glucose Transport Protein-2 Inhibitors in Subpopulations with Abnormal Genitourinary Pathology. Clinical Journal of the American Society of Nephrology, 20(6), 820–828. https://doi.org/10.2215/CJN.0000000687
+Xu, S., Spitze, K., Ackerman, M. S., Ye, Z., Bright, L., Keith, N., Jackson, C. E., Shaw, J. R., & Lynch, M. (2015). Hybridization and the Origin of Contagious Asexuality in Daphnia pulex. Molecular Biology and Evolution, msv190. https://doi.org/10.1093/molbev/msv190
+Yamada, C., Peng, G., Johnson, J. A., Nusbaum, A., Sanz, N., AlQallaf, H., Nichols, F., & Movila, A. (2026). Porphyromonas gingivalis –Derived Virulence Lipids Accelerate Osteoclastogenesis Independently of High Mobility Group Box Protein‐1 Canonical Signaling. Molecular Oral Microbiology, 41(2), 85–93. https://doi.org/10.1111/omi.70015
+Yamada, M., Tang, J., Lugo-Martinez, J., Hodzic, E., Shrestha, R., Saha, A., Ouyang, H., Yin, D., Mamitsuka, H., Sahinalp, C., Radivojac, P., Menczer, F., & Chang, Y. (2018). Ultra High-Dimensional Nonlinear Feature Selection for Big Biological Data. IEEE Transactions on Knowledge and Data Engineering, 30(7), 1352–1365. https://doi.org/10.1109/TKDE.2018.2789451
+Yan, H. Y., Yang, K.-C., Menczer, F., & Shanahan, J. (2021). Asymmetrical perceptions of partisan political bots. New Media & Society, 23(10), 3016–3037. https://doi.org/10.1177/1461444820942744
+Yan, H. Y., Yang, K.-C., Shanahan, J., & Menczer, F. (2023). Exposure to social bots amplifies perceptual biases and regulation propensity. Scientific Reports, 13(1), 20707. https://doi.org/10.1038/s41598-023-46630-x
+Yan, X., Jeub, L. G. S., Flammini, A., Radicchi, F., & Fortunato, S. (2018). Weight thresholding on complex networks. Physical Review E, 98(4), 042304. https://doi.org/10.1103/PhysRevE.98.042304
+Yang, C.-E., Hoffman, F. M., Ricciuto, D. M., Tilmes, S., Xia, L., MacMartin, D. G., Kravitz, B., Richter, J. H., Mills, M., & Fu, J. S. (2020). Assessing terrestrial biogeochemical feedbacks in a strategically geoengineered climate. Environmental Research Letters, 15(10), 104043. https://doi.org/10.1088/1748-9326/abacf7
+Yang, H.-C., Nguyen, T., White, F. A., Naugle, K. M., & Wu, Y.-C. (2025). Pain-Related White-Matter Changes Following Mild Traumatic Brain Injury: A Longitudinal Diffusion Tensor Imaging Pilot Study. Diagnostics, 15(5), 642. https://doi.org/10.3390/diagnostics15050642
+Yang, K., Varol, O., Davis, C. A., Ferrara, E., Flammini, A., & Menczer, F. (2019). Arming the public with artificial intelligence to counter social bots. Human Behavior and Emerging Technologies, 1(1), 48–61. https://doi.org/10.1002/hbe2.115
+Yang, K.-C., Ferrara, E., & Menczer, F. (2022). Botometer 101: Social bot practicum for computational social scientists. Journal of Computational Social Science, 5(2), 1511–1528. https://doi.org/10.1007/s42001-022-00177-5
+Yang, K.-C., Hui, P.-M., & Menczer, F. (2019). Bot Electioneering Volume: Visualizing Social Bot Activity During Elections. Companion Proceedings of The 2019 World Wide Web Conference, 214–217. https://doi.org/10.1145/3308560.3316499
+Yang, K.-C., Hui, P.-M., & Menczer, F. (2022). How Twitter data sampling biases U.S. voter behavior characterizations. PeerJ Computer Science, 8, e1025. https://doi.org/10.7717/peerj-cs.1025
+Yang, K.-C., Pierri, F., Hui, P.-M., Axelrod, D., Torres-Lugo, C., Bryden, J., & Menczer, F. (2021). The COVID-19 Infodemic: Twitter versus Facebook. Big Data & Society, 8(1), 20539517211013861. https://doi.org/10.1177/20539517211013861
+Yang, K.-C., Varol, O., Hui, P.-M., & Menczer, F. (2020). Scalable and Generalizable Social Bot Detection through Data Selection. Proceedings of the AAAI Conference on Artificial Intelligence, 34(01), 1096–1103. https://doi.org/10.1609/aaai.v34i01.5460
+Yao, S., Van, R., Pan, X., Park, J. H., Mao, Y., Pu, J., Mei, Y., & Shao, Y. (2023). Machine learning based implicit solvent model for aqueous-solution alanine dipeptide molecular dynamics simulations. RSC Advances, 13(7), 4565–4577. https://doi.org/10.1039/D2RA08180F
+Yoshida, M., Medvedeva, S., Fukudome, A., Wolf, Y. I., Urayama, S., Nishimura, Y., Takaki, Y., Koonin, E. V., Krupovic, M., & Nunoura, T. (2025). “ Paraxenoviridae ”, a putative family of globally distributed marine bacteriophages with double-stranded RNA genomes. The ISME Journal, 19(1), wraf139. https://doi.org/10.1093/ismejo/wraf139
+Yoshioka, M., Fukudome, A., Chiba, Y., Hagiwara, D., & Urayama, S. (2025). Characterization of a multi-segmented rod-shaped mycovirus within the order Martellivirales largely accommodating plant viruses. Virus Research, 357, 199591. https://doi.org/10.1016/j.virusres.2025.199591
+Yu, Y., Wang, S., Li, J., Yu, M., McCrocklin, K., Kang, J.-Q., Ma, A., Ma, Q., Xu, D., & Wang, J. (2025). TrimNN: Characterizing cellular community motifs for studying multicellular topological organization in complex tissues. Nature Communications, 16(1), 7737. https://doi.org/10.1038/s41467-025-63141-7
+Yu, Y., Wang, S., Xu, D., & Wang, J. (2023). Exploring building blocks of cell organization by estimating network motifs using graph isomorphism network. Bioinformatics. https://doi.org/10.1101/2023.11.04.565623
+Zhang, B., Fang, B., Guan, Q., Li, A., & Tao, D. (2023a). HQ-Sim: High-performance State Vector Simulation of Quantum Circuits on Heterogeneous HPC Systems. Proceedings of the 2023 International Workshop on Quantum Classical Cooperative, 1–4. https://doi.org/10.1145/3588983.3596679
+Zhang, B., Fang, B., Guan, Q., Li, A., & Tao, D. (2023b). MEMQSim: Highly Memory-Efficient and Modularized Quantum State-Vector Simulation. Proceedings of the SC ’23 Workshops of the International Conference on High Performance Computing, Network, Storage, and Analysis, 1452–1453. https://doi.org/10.1145/3624062.3624217
+Zhang, C., Kumari, A., & Cavar, D. (2024a). Entangled Meanings: Classification and Ambiguity Resolution in Near-Term QNLP. 2024 IEEE International Conference on Quantum Computing and Engineering (QCE), 460–461. https://doi.org/10.1109/QCE60285.2024.10355
+Zhang, C., Kumari, A., & Cavar, D. (2024b). Entangled Meanings: Classification and Ambiguity Resolution in QNLP. 2024 IEEE International Conference on Quantum Computing and Engineering (QCE), 97–102. https://doi.org/10.1109/QCE60285.2024.10260
+Zhang, C., Sun, B., Yu, X., Xie, Z., Zheng, W., Iskra, K. A., Beckman, P., & Tao, D. (2023). Benchmarking and In-depth Performance Study of Large Language Models on Habana Gaudi Processors. Proceedings of the SC ’23 Workshops of the International Conference on High Performance Computing, Network, Storage, and Analysis, 1759–1766. https://doi.org/10.1145/3624062.3624257
+Zhang, J., Dang, T. T., Lin, T.-Y., Yu, X., Pellin, D., Tian, J., Simmons, O., Kou, E., Cornetta, K., & Xiao, W. (2026). Development of a Novel Method to Detect AAV Vector Integration. Viruses, 18(3), 315. https://doi.org/10.3390/v18030315
+Zhang, T., Hong, J., Coughlin, A. L., Nnokwe, C., Hosek, M. K., He, R., Fertig, H. A., & Zhang, S. (2024). Anisotropic Straintronic Transport in Topological Semimetal Nanoflakes. ACS Applied Nano Materials, 7(11), 13101–13109. https://doi.org/10.1021/acsanm.4c01612
+Zhang, T. X., Samanta, B., Wang, J., Georgescu, A. B., Fertig, H. A., & Zhang, S. X. (2024). Controlled Vapor–Liquid–Solid Growth of Long and Remarkably Thin Pb 1– x Sn x Te Nanowires with Strain-Tunable Ferroelectric Phase Transition. ACS Applied Materials & Interfaces, 16(40), 54837–54846. https://doi.org/10.1021/acsami.4c11537
+Zhang, T., Yuan, L., Rondinelli, J. M., Fertig, H. A., & Zhang, S. (2026). Tunable Hidden Altermagnetic Spin Splitting in Layered Ruddlesden–Popper Oxides. Nano Letters, 26(7), 2778–2786. https://doi.org/10.1021/acs.nanolett.6c00013
+Zhang, Y., Li, M., Haas, D. M., Bairey Merz, C. N., Workalemahu, T., Ryckman, K., Catov, J. M., Levine, L. D., Freedman, A., Saade, G. R., Hu, J., Zhao, H., Li, X., Liu, N., & Yan, Q. (2026). A novel two-sample Mendelian randomization framework integrating common and rare variants: Application to assess the effect of HDL-C on preeclampsia risk. Briefings in Bioinformatics, 27(1), bbaf649. https://doi.org/10.1093/bib/bbaf649
+Zhang, Y., MacMartin, D. G., Visioni, D., & Kravitz, B. (2022). How large is the design space for stratospheric aerosol geoengineering? Earth System Dynamics, 13(1), 201–217. https://doi.org/10.5194/esd-13-201-2022
+Zhang, Y., Yescas, J. A., Tefft, K., Ng, S., Qiu, K., Wang, E. B., Akhtar, S., Walker, A., Welborn, M., Zaiac, M., Guitart, J., Qureshi, A. M., Kim, Y. H., Khodadoust, M. S., Issa, N. T., & Choi, J. (2025). Addiction of primary cutaneous γδ T cell lymphomas to JAK/STAT signaling. Journal of Clinical Investigation, 135(8), e180417. https://doi.org/10.1172/JCI180417
+Zhou, H., Dakota, D., & Kübler, S. (2025). Cross-lingual dependency parsing for a language with a unique script. Natural Language Processing, 31(2), 277–305. https://doi.org/10.1017/nlp.2024.21
+Zhou, H., & Liang, Y. (2026). Enhancing Robustness in Deep Convolutional Neural Networks Through Multiresolution Learning. IEEE Transactions on Artificial Intelligence, 7(7), 3913–3925. https://doi.org/10.1109/TAI.2025.3648953
+Zhou, Y., O’Brien, T. A., Collins, W. D., Shields, C. A., Loring, B., & Elbashandy, A. A. (2022). Characteristics and Variability of Winter Northern Pacific Atmospheric River Flavors. Journal of Geophysical Research: Atmospheres, 127(23), e2022JD037105. https://doi.org/10.1029/2022JD037105
+Ziliotto, T., Milone, A. P., Cordoni, G., Aros, F. I., Vesperini, E., Lee, J.-W., Bellini, A., Bianchini, P., Mastrobuono-Battisti, A., Libralato, M., Dondoglio, E., Tailo, M., Livernois, A., Legnardi, M. V., Lagioia, E., Bortolan, E., Muratore, F., Marino, A. F., Alves-Brito, A., & Renzini, A. (2025). A JWST project on 47 Tucanae: Kinematics, energy equipartition, and anisotropy of multiple populations. Astronomy & Astrophysics, 698, A209. https://doi.org/10.1051/0004-6361/202554038
diff --git a/coldfront/components/site/static/common/css/brand.css b/coldfront/components/site/static/common/css/brand.css
new file mode 100644
index 0000000000..e90e64d8b0
--- /dev/null
+++ b/coldfront/components/site/static/common/css/brand.css
@@ -0,0 +1,410 @@
+@font-face {
+ font-family: 'BentonSansRegular';
+ src: url("https://fonts.iu.edu/fonts/benton-sans-regular.eot");
+ src: url("https://fonts.iu.edu/fonts/benton-sans-regular.eot?#iefix") format("embedded-opentype"), url("https://fonts.iu.edu/fonts/benton-sans-regular.woff") format("woff"), url("https://fonts.iu.edu/fonts/benton-sans-regular.ttf") format("truetype"), url("https://fonts.iu.edu/fonts/benton-sans-regular.svg#BentonSansRegular") format("svg");
+ font-display: swap;
+ font-style: normal;
+ font-weight: normal;
+}
+
+@font-face {
+ font-family: 'BentonSansBold';
+ src: url("https://fonts.iu.edu/fonts/benton-sans-bold.eot");
+ src: url("https://fonts.iu.edu/fonts/benton-sans-bold.eot?#iefix") format("embedded-opentype"), url("https://fonts.iu.edu/fonts/benton-sans-bold.woff") format("woff"), url("https://fonts.iu.edu/fonts/benton-sans-bold.ttf") format("truetype"), url("https://fonts.iu.edu/fonts/benton-sans-bold.svg#BentonSansBold") format("svg");
+ font-display: swap;
+ font-style: normal;
+ font-weight: normal;
+}
+
+@font-face {
+ font-family: 'BentonSansCondRegular';
+ src: url("https://fonts.iu.edu/fonts/benton-sans-cond-regular.eot");
+ src: url("https://fonts.iu.edu/fonts/benton-sans-cond-regular.eot?#iefix") format("embedded-opentype"), url("https://fonts.iu.edu/fonts/benton-sans-cond-regular.woff") format("woff"), url("https://fonts.iu.edu/fonts/benton-sans-cond-regular.ttf") format("truetype"), url("https://fonts.iu.edu/fonts/benton-sans-cond-regular.svg#BentonSansCondRegular") format("svg");
+ font-display: swap;
+ font-style: normal;
+ font-weight: normal;
+}
+
+@font-face {
+ font-family: 'BentonSansCondBold';
+ src: url("https://fonts.iu.edu/fonts/benton-sans-cond-bold.eot");
+ src: url("https://fonts.iu.edu/fonts/benton-sans-cond-bold.eot?#iefix") format("embedded-opentype"), url("https://fonts.iu.edu/fonts/benton-sans-cond-bold.woff") format("woff"), url("https://fonts.iu.edu/fonts/benton-sans-cond-bold.ttf") format("truetype"), url("https://fonts.iu.edu/fonts/benton-sans-cond-bold.svg#BentonSansCondBold") format("svg");
+ font-display: swap;
+ font-style: normal;
+ font-weight: normal;
+}
+
+@font-face {
+ font-family: 'GeorgiaProBoldItalic';
+ src: url("https://fonts.iu.edu/fonts/georgia-pro-bold-italic.eot");
+ src: url("https://fonts.iu.edu/fonts/georgia-pro-bold-italic.eot?#iefix") format("embedded-opentype"), url("https://fonts.iu.edu/fonts/georgia-pro-bold-italic.woff") format("woff"), url("https://fonts.iu.edu/fonts/georgia-pro-bold-italic.ttf") format("truetype"), url("https://fonts.iu.edu/fonts/georgia-pro-bold-italic.svg#GeorgiaProBoldItalic") format("svg");
+ font-display: swap;
+ font-style: normal;
+ font-weight: normal;
+}
+
+.visually-hidden {
+ position: absolute;
+ overflow: hidden;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ width: 1px;
+ margin: -1px;
+ padding: 0;
+ border: 0;
+}
+
+#branding-bar,
+#footer {
+ -webkit-font-smoothing: initial;
+ -moz-font-smoothing: initial;
+ font-smooth: initial;
+}
+
+#branding-bar *,
+#footer * {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+#branding-bar .row,
+#footer .row {
+ width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 0;
+ margin-bottom: 0;
+ max-width: 64rem;
+ position: relative;
+}
+
+#branding-bar .row:before, #branding-bar .row:after,
+#footer .row:before,
+#footer .row:after {
+ content: " ";
+ display: table;
+}
+
+#branding-bar .row:after,
+#footer .row:after {
+ clear: both;
+}
+
+#branding-bar .row.pad,
+#footer .row.pad {
+ padding-left: 0.9375rem;
+ padding-right: 0.9375rem;
+ width: 100%;
+}
+
+#branding-bar {
+ position: fixed;
+ line-height: 1.5;
+ top: 0;
+ width: 100%;
+ z-index: 10;
+ background-color: #ffffff;
+ margin-bottom: 0;
+ padding-bottom: 1rem;
+ border-bottom: 1px solid #E2E7E9;
+}
+
+#branding-bar .show-on-mobile {
+ display: inline;
+}
+
+#branding-bar .show-on-tablet,
+#branding-bar .show-on-desktop {
+ display: none;
+}
+
+#branding-bar:after {
+ content: "";
+ bottom: -3px;
+ position: absolute;
+ width: 100%;
+ height: 3px;
+ background: none;
+ z-index: 8;
+}
+
+#branding-bar img {
+ top: 10px;
+ width: 36px;
+ position: absolute;
+ left: 0.9375rem;
+ -webkit-transition: all 0.5s;
+ -moz-transition: all 0.5s;
+ transition: all 0.5s;
+ z-index: 9;
+}
+
+#branding-bar h1,
+#branding-bar #iu-campus {
+ font-family: "BentonSansBold" ,Arial,serif;
+ position: relative;
+ top: .55rem;
+ padding-left: 48px;
+ font-weight: normal;
+ color: #243142;
+ font-size: 18px;
+ float: left;
+ line-height: 45px;
+ margin: 0;
+ text-transform: uppercase;
+ -webkit-transition: all 0.25s;
+ -moz-transition: all 0.25s;
+ transition: all 0.25s;
+}
+
+#branding-bar h1 a,
+#branding-bar #iu-campus a {
+ color: #243142;
+ text-decoration: none;
+}
+
+#branding-bar h1 span,
+#branding-bar #iu-campus span {
+ font-family: "BentonSansBold", sans-serif;
+ text-transform: none;
+}
+
+#branding-bar h1 .show-on-tablet,
+#branding-bar h1 .show-on-mobile,
+#branding-bar #iu-campus .show-on-tablet,
+#branding-bar #iu-campus .show-on-mobile {
+ font-size: 17px;
+}
+
+#branding-bar a:focus {
+ outline: none;
+}
+
+#branding-bar a:focus span {
+ outline: .125rem solid #990000;
+ outline-offset: .125rem;
+ padding: 2px;
+}
+
+#branding-bar.iupui #iu-campus,
+#branding-bar.iupuc #iu-campus {
+ font-size: 1.5rem;
+}
+
+#branding-bar.iupui #iu-campus .show-on-tablet,
+#branding-bar.iupui #iu-campus .show-on-mobile,
+#branding-bar.iupuc #iu-campus .show-on-tablet,
+#branding-bar.iupuc #iu-campus .show-on-mobile {
+ font-size: 1.5rem;
+}
+
+#footer {
+ padding: 24px 0;
+ text-align: center;
+ position: relative;
+ font-family: BentonSansRegular, Arial, serif;
+ font-weight: normal;
+}
+
+#footer a {
+ color: #990000;
+ text-decoration: underline;
+}
+
+#footer a:hover {
+ text-decoration: none;
+}
+
+#footer a:focus {
+ outline: .125rem solid #990000;
+ outline-offset: .125rem;
+}
+
+#footer .signature {
+ text-align: center;
+}
+
+#footer .signature-link {
+ background: url("iu-sig-formal.svg") no-repeat left top;
+ background-size: contain;
+ display: inline-block;
+ height: 0;
+ padding-top: 36px;
+ overflow: hidden;
+ width: 240px;
+}
+
+#footer .signature-link.signature-img {
+ background-image: none;
+ height: auto;
+ width: 15rem;
+ padding-top: 0;
+}
+
+#footer p {
+ font-size: 0.75rem;
+ line-height: 24px;
+ margin: 0;
+ clear: left;
+}
+
+#footer .tagline {
+ font-family: BentonSansCondBold, Arial, serif;
+ font-weight: normal;
+ -webkit-font-smoothing: antialiased;
+ background: #7A1705;
+ color: #fff;
+ font-size: 1.375rem;
+ line-height: 2.5rem;
+ margin: -24px -0.9375rem 24px -0.9375rem;
+ text-transform: uppercase;
+ letter-spacing: 0.2em;
+}
+
+#footer .tagline span {
+ text-transform: lowercase;
+ font-family: GeorgiaProBoldItalic, Georgia, serif;
+ font-size: 1rem;
+ vertical-align: 2px;
+ letter-spacing: 0;
+ margin-left: -4px;
+}
+
+#footer .tagline a:focus {
+ outline-color: #fff;
+}
+
+#footer .tagline.bicentennial {
+ font-family: inherit;
+ letter-spacing: .1em;
+}
+
+#footer .tagline.bicentennial.celebration {
+ font-size: inherit;
+ padding-bottom: 2px;
+}
+
+#footer .tagline.celebration a {
+ color: #fff;
+ text-decoration: none;
+}
+
+#footer .tagline.celebration svg {
+ vertical-align: middle;
+}
+
+@media screen and (max-width: 350px) {
+ #footer .line-break-small {
+ display: block;
+ }
+}
+
+@media screen and (max-width: 420px) {
+ #footer .line-break {
+ display: block;
+ }
+ #footer .hide-on-mobile {
+ display: none;
+ }
+}
+
+@media only screen and (min-width: 40em) {
+ /* Campus names */
+ #branding-bar .show-on-tablet {
+ display: inline;
+ }
+ #branding-bar .show-on-mobile,
+ #branding-bar .show-on-desktop {
+ display: none;
+ }
+ #footer {
+ text-align: left;
+ border-top: 6px solid #800000;
+ padding: 32px 0 24px;
+ }
+ #footer p {
+ line-height: 2.25rem;
+ }
+ #footer .signature {
+ float: left;
+ text-align: left;
+ height: 36px;
+ }
+ #footer .copyright {
+ float: right;
+ clear: right;
+ text-align: right;
+ }
+ #footer .tagline {
+ font-size: 1.5rem;
+ position: absolute;
+ left: 50%;
+ margin: 0 -200px 0 0;
+ top: -55px;
+ padding: 0 24px;
+ -webkit-transform: translateX(-50%);
+ -moz-transform: translateX(-50%);
+ -ms-transform: translateX(-50%);
+ -o-transform: translateX(-50%);
+ transform: translateX(-50%);
+ }
+ #footer .tagline.bicentennial {
+ padding: 0 16px;
+ }
+}
+
+@media only screen and (min-width: 1025px) {
+ #branding-bar {
+ padding-bottom: 1.6rem;
+ /* account for trident */
+ position: relative;
+ }
+
+ #branding-bar:after {
+ height: 0;
+ }
+
+ #branding-bar img {
+ position: absolute;
+ width: 2.5rem;
+ top: 1rem;
+ }
+
+ #branding-bar h1,
+ #branding-bar #iu-campus {
+ line-height: inherit;
+ top: 0;
+ padding-top: 1.45rem;
+ padding-left: 3.4rem;
+ font-size: 1.25rem;
+ }
+
+ #branding-bar .search {
+ margin-top: 6px;
+ float: right;
+ width: 250px;
+ }
+
+ #branding-bar input[type='text'] {
+ width: 80%;
+ float: left;
+ margin-bottom: 0;
+ }
+ #branding-bar input[type='submit'].button {
+ width: 20%;
+ float: left;
+ border-radius: 0;
+ }
+}
+
+@media only screen and (min-width: 1025px) {
+ /* Campus names */
+ #branding-bar .show-on-desktop {
+ display: inline !important;
+ }
+ #branding-bar .show-on-tablet,
+ #branding-bar .show-on-desktop {
+ display: none;
+ }
+}
diff --git a/coldfront/components/site/static/common/css/common.css b/coldfront/components/site/static/common/css/common.css
new file mode 100644
index 0000000000..d72c73a083
--- /dev/null
+++ b/coldfront/components/site/static/common/css/common.css
@@ -0,0 +1,259 @@
+.fakeimg {
+ height: 77px;
+ background: #E2E2E2;
+}
+
+html {
+ position: relative;
+ min-height: 100%;
+}
+
+main {
+ padding-top: 40px;
+ padding-bottom: 40px;
+}
+
+.banner-name {
+ padding-top: 25px;
+}
+
+.banner-logo {
+ margin-top: 5px;
+ max-height: 75px !important;
+ margin-bottom: 5px;
+}
+
+body > main > form > div.alert.alert-block.alert-danger > ul > li {
+ list-style: none;
+ margin-top: 14px;
+}
+
+body > main > div > div.card.border-primary > div.card-body > form > div.alert.alert-block.alert-danger > ul > li {
+ list-style: none;
+ margin-top: 14px;
+
+}
+
+/*
+ * These were copied from django-hijack https://github.com/arteria/django-hijack
+ *
+ */
+ .hijacked-warning {
+ background-size: 50px 50px;
+ background-color: #ffe761;
+ color: #000;
+ background-image: -webkit-linear-gradient(-45deg, rgba(0, 0, 0, .04) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, .04) 50%, rgba(0, 0, 0, .04) 75%, transparent 75%, transparent);
+ background-image: -moz-linear-gradient(-45deg, rgba(0, 0, 0, .04) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, .04) 50%, rgba(0, 0, 0, .04) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(135deg, rgba(0, 0, 0, .04) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, .04) 50%, rgba(0, 0, 0, .04) 75%, transparent 75%, transparent);
+ margin-bottom:0;
+}
+
+.hijacked-warning-controls,
+.hijacked-warning-controls form {
+ display: inline;
+}
+
+.django-hijack-button-default {
+ -moz-box-shadow:inset 0px 1px 0px 0px #ffffff;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #ffffff;
+ box-shadow:inset 0px 1px 0px 0px #ffffff;
+ background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffffff), color-stop(1, #f6f6f6));
+ background:-moz-linear-gradient(top, #ffffff 5%, #f6f6f6 100%);
+ background:-webkit-linear-gradient(top, #ffffff 5%, #f6f6f6 100%);
+ background:-o-linear-gradient(top, #ffffff 5%, #f6f6f6 100%);
+ background:-ms-linear-gradient(top, #ffffff 5%, #f6f6f6 100%);
+ background:linear-gradient(to bottom, #ffffff 5%, #f6f6f6 100%);
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f6f6f6',GradientType=0);
+ background-color:#ffffff;
+ -moz-border-radius:6px;
+ -webkit-border-radius:6px;
+ border-radius:6px;
+ border:1px solid #dcdcdc;
+ display:inline-block;
+ cursor:pointer;
+ color:#666666;
+ font-family:Arial;
+ font-size:11px;
+ font-weight:bold;
+ padding:3px 12px;
+ text-decoration:none;
+ text-shadow:0px 1px 0px #ffffff;
+}
+.django-hijack-button-default:hover {
+ background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #f6f6f6), color-stop(1, #ffffff));
+ background:-moz-linear-gradient(top, #f6f6f6 5%, #ffffff 100%);
+ background:-webkit-linear-gradient(top, #f6f6f6 5%, #ffffff 100%);
+ background:-o-linear-gradient(top, #f6f6f6 5%, #ffffff 100%);
+ background:-ms-linear-gradient(top, #f6f6f6 5%, #ffffff 100%);
+ background:linear-gradient(to bottom, #f6f6f6 5%, #ffffff 100%);
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#ffffff',GradientType=0);
+ background-color:#f6f6f6;
+}
+.django-hijack-button-default:active {
+ position:relative;
+ top:1px;
+}
+
+.form-control[readonly]{background-color:#ffffff;opacity:1}
+
+.bg-primary {
+ background-color: #990000 !important;
+}
+
+.border-primary {
+ border-color: #990000 !important;
+}
+
+.btn-primary {
+ background-color: #006298;
+ border-color: #006298;
+}
+
+.btn-primary:disabled {
+ background-color: #006298;
+ border-color: #006298;
+ pointer-events: none;
+}
+
+.btn-primary:hover {
+ background-color: #01426A;
+ border-color: #01426A;
+}
+
+.badge-success {
+ background-color: #008216;
+ border-color: #008216;
+}
+
+.badge-primary {
+ background-color: #006298;
+ border-color: #006298;
+}
+
+.btn-success {
+ background-color: #008216;
+ border-color: #008216;
+}
+
+.btn-success:hover {
+ background-color: #006611;
+ border-color: #006611;
+}
+
+.badge-danger {
+ background-color: #990000;
+ border-color: #990000;
+}
+
+.btn-danger {
+ background-color: #990000;
+ border-color: #990000;
+}
+
+.btn-danger:hover {
+ background-color: #7c0000;
+ border-color: #7c0000;
+}
+
+.text-primary {
+ color: #006298 !important;
+}
+
+.text-success {
+ color: #008216 !important;
+}
+
+.text-warning {
+ color: #a35a00 !important;
+}
+
+.text-danger {
+ color: #990000 !important;
+}
+
+.page-link {
+ color: #006298;
+}
+
+.page-link:hover {
+ color: #01426A;
+}
+
+.page-item.active .page-link {
+ background-color: #006298;
+ border-color: #01426A;
+}
+
+.alert-warning {
+ color: black;
+ background-color: #FDF7E7;
+ border-color: #F5BB17;
+}
+
+.alert-info {
+ color: black;
+ background-color: #E9F6FC;
+ border-color: #49AFC7;
+}
+
+.alert-success {
+ color: black;
+ background-color: #DDF4EA;
+ border-color: #009933;
+}
+
+.alert-danger {
+ color: black;
+ background-color: #FDEEE8;
+ border-color: #F25B19;
+}
+
+a {
+ color: #006298;
+}
+
+a:hover {
+ color: #01426A;
+}
+
+.dropdown-submenu {
+ position: relative;
+}
+
+.dropdown-submenu .dropdown-menu {
+ top: 0;
+ left: 100%;
+ padding-top: 0;
+ margin-top: 0;
+ margin-left: .1rem;
+ margin-right: .1rem;
+}
+
+.dropdown-submenu a::after{
+ transform: rotate(-90deg);
+}
+
+.navbar-nav .nav-link {
+ position: relative;
+ color: white !important;
+}
+
+/* Can't use ::after because it clashes with bootstraps dropdown-toggle::after */
+.navbar-nav .nav-item.active .nav-link::before {
+ content: "";
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 90%;
+ height: 2px;
+ background-color: white;
+}
+
+.dropdown-submenu > a:focus {
+ outline: 2px solid #990000;
+}
+
+#branding-bar {
+ position: relative !important;
+}
diff --git a/coldfront/components/site/static/images/228QL2PR.png b/coldfront/components/site/static/images/228QL2PR.png
new file mode 100644
index 0000000000..19c9002caa
Binary files /dev/null and b/coldfront/components/site/static/images/228QL2PR.png differ
diff --git a/coldfront/components/site/static/images/22KCX6VA.png b/coldfront/components/site/static/images/22KCX6VA.png
new file mode 100644
index 0000000000..fab07837b7
Binary files /dev/null and b/coldfront/components/site/static/images/22KCX6VA.png differ
diff --git a/coldfront/components/site/static/images/232WG868.png b/coldfront/components/site/static/images/232WG868.png
new file mode 100644
index 0000000000..65530491d6
Binary files /dev/null and b/coldfront/components/site/static/images/232WG868.png differ
diff --git a/coldfront/components/site/static/images/234T9V7T.png b/coldfront/components/site/static/images/234T9V7T.png
new file mode 100644
index 0000000000..8b8a88e747
Binary files /dev/null and b/coldfront/components/site/static/images/234T9V7T.png differ
diff --git a/coldfront/components/site/static/images/23KGFE7P.png b/coldfront/components/site/static/images/23KGFE7P.png
new file mode 100644
index 0000000000..3bfacb0a2a
Binary files /dev/null and b/coldfront/components/site/static/images/23KGFE7P.png differ
diff --git a/coldfront/components/site/static/images/25ICYTGQ.png b/coldfront/components/site/static/images/25ICYTGQ.png
new file mode 100644
index 0000000000..4ca5772f40
Binary files /dev/null and b/coldfront/components/site/static/images/25ICYTGQ.png differ
diff --git a/coldfront/components/site/static/images/263JZKN7.png b/coldfront/components/site/static/images/263JZKN7.png
new file mode 100644
index 0000000000..4227d370b0
Binary files /dev/null and b/coldfront/components/site/static/images/263JZKN7.png differ
diff --git a/coldfront/components/site/static/images/26UII4UB.png b/coldfront/components/site/static/images/26UII4UB.png
new file mode 100644
index 0000000000..402d83e6d7
Binary files /dev/null and b/coldfront/components/site/static/images/26UII4UB.png differ
diff --git a/coldfront/components/site/static/images/27BNCUP2.png b/coldfront/components/site/static/images/27BNCUP2.png
new file mode 100644
index 0000000000..2a82a52678
Binary files /dev/null and b/coldfront/components/site/static/images/27BNCUP2.png differ
diff --git a/coldfront/components/site/static/images/27P2UCSP.png b/coldfront/components/site/static/images/27P2UCSP.png
new file mode 100644
index 0000000000..772b6f4411
Binary files /dev/null and b/coldfront/components/site/static/images/27P2UCSP.png differ
diff --git a/coldfront/components/site/static/images/29BF9TLG.png b/coldfront/components/site/static/images/29BF9TLG.png
new file mode 100644
index 0000000000..833eccf7e8
Binary files /dev/null and b/coldfront/components/site/static/images/29BF9TLG.png differ
diff --git a/coldfront/components/site/static/images/2BR6U46Q.png b/coldfront/components/site/static/images/2BR6U46Q.png
new file mode 100644
index 0000000000..72fc7961a9
Binary files /dev/null and b/coldfront/components/site/static/images/2BR6U46Q.png differ
diff --git a/coldfront/components/site/static/images/2DA5YSFJ.png b/coldfront/components/site/static/images/2DA5YSFJ.png
new file mode 100644
index 0000000000..6e4332f74d
Binary files /dev/null and b/coldfront/components/site/static/images/2DA5YSFJ.png differ
diff --git a/coldfront/components/site/static/images/2DWE4ZIV.png b/coldfront/components/site/static/images/2DWE4ZIV.png
new file mode 100644
index 0000000000..7f6bfd6a37
Binary files /dev/null and b/coldfront/components/site/static/images/2DWE4ZIV.png differ
diff --git a/coldfront/components/site/static/images/2E687EU7.png b/coldfront/components/site/static/images/2E687EU7.png
new file mode 100644
index 0000000000..72709dcacd
Binary files /dev/null and b/coldfront/components/site/static/images/2E687EU7.png differ
diff --git a/coldfront/components/site/static/images/2EM56CXT.png b/coldfront/components/site/static/images/2EM56CXT.png
new file mode 100644
index 0000000000..813313e189
Binary files /dev/null and b/coldfront/components/site/static/images/2EM56CXT.png differ
diff --git a/coldfront/components/site/static/images/2F3AWV7R.png b/coldfront/components/site/static/images/2F3AWV7R.png
new file mode 100644
index 0000000000..51aa44036a
Binary files /dev/null and b/coldfront/components/site/static/images/2F3AWV7R.png differ
diff --git a/coldfront/components/site/static/images/2FIBCL25.png b/coldfront/components/site/static/images/2FIBCL25.png
new file mode 100644
index 0000000000..6cb789ab32
Binary files /dev/null and b/coldfront/components/site/static/images/2FIBCL25.png differ
diff --git a/coldfront/components/site/static/images/2FSFGD8K.png b/coldfront/components/site/static/images/2FSFGD8K.png
new file mode 100644
index 0000000000..5621ae8b18
Binary files /dev/null and b/coldfront/components/site/static/images/2FSFGD8K.png differ
diff --git a/coldfront/components/site/static/images/2GICQX7M.png b/coldfront/components/site/static/images/2GICQX7M.png
new file mode 100644
index 0000000000..7ecaee4d74
Binary files /dev/null and b/coldfront/components/site/static/images/2GICQX7M.png differ
diff --git a/coldfront/components/site/static/images/2GL9L75C.png b/coldfront/components/site/static/images/2GL9L75C.png
new file mode 100644
index 0000000000..bea8c21a00
Binary files /dev/null and b/coldfront/components/site/static/images/2GL9L75C.png differ
diff --git a/coldfront/components/site/static/images/2HZ4ZGSM.png b/coldfront/components/site/static/images/2HZ4ZGSM.png
new file mode 100644
index 0000000000..1aff4ff19b
Binary files /dev/null and b/coldfront/components/site/static/images/2HZ4ZGSM.png differ
diff --git a/coldfront/components/site/static/images/2J9BXQLS.png b/coldfront/components/site/static/images/2J9BXQLS.png
new file mode 100644
index 0000000000..8e17ae330f
Binary files /dev/null and b/coldfront/components/site/static/images/2J9BXQLS.png differ
diff --git a/coldfront/components/site/static/images/2K5YB9WX.png b/coldfront/components/site/static/images/2K5YB9WX.png
new file mode 100644
index 0000000000..2eb8fc6f32
Binary files /dev/null and b/coldfront/components/site/static/images/2K5YB9WX.png differ
diff --git a/coldfront/components/site/static/images/2LB7X4Z3.png b/coldfront/components/site/static/images/2LB7X4Z3.png
new file mode 100644
index 0000000000..67b5ecbede
Binary files /dev/null and b/coldfront/components/site/static/images/2LB7X4Z3.png differ
diff --git a/coldfront/components/site/static/images/2MCB6V27.png b/coldfront/components/site/static/images/2MCB6V27.png
new file mode 100644
index 0000000000..39b6b87605
Binary files /dev/null and b/coldfront/components/site/static/images/2MCB6V27.png differ
diff --git a/coldfront/components/site/static/images/2NNL2LSC.png b/coldfront/components/site/static/images/2NNL2LSC.png
new file mode 100644
index 0000000000..95e6ac738c
Binary files /dev/null and b/coldfront/components/site/static/images/2NNL2LSC.png differ
diff --git a/coldfront/components/site/static/images/2PUFN5S6.png b/coldfront/components/site/static/images/2PUFN5S6.png
new file mode 100644
index 0000000000..a308357443
Binary files /dev/null and b/coldfront/components/site/static/images/2PUFN5S6.png differ
diff --git a/coldfront/components/site/static/images/2RS6CSAA.png b/coldfront/components/site/static/images/2RS6CSAA.png
new file mode 100644
index 0000000000..bc4dc6204f
Binary files /dev/null and b/coldfront/components/site/static/images/2RS6CSAA.png differ
diff --git a/coldfront/components/site/static/images/2TGHSZBH.png b/coldfront/components/site/static/images/2TGHSZBH.png
new file mode 100644
index 0000000000..d9cd3570e3
Binary files /dev/null and b/coldfront/components/site/static/images/2TGHSZBH.png differ
diff --git a/coldfront/components/site/static/images/2UNTVIQP.png b/coldfront/components/site/static/images/2UNTVIQP.png
new file mode 100644
index 0000000000..8b89ff6dfb
Binary files /dev/null and b/coldfront/components/site/static/images/2UNTVIQP.png differ
diff --git a/coldfront/components/site/static/images/2VAQ6S8X.png b/coldfront/components/site/static/images/2VAQ6S8X.png
new file mode 100644
index 0000000000..9e0ed7d59a
Binary files /dev/null and b/coldfront/components/site/static/images/2VAQ6S8X.png differ
diff --git a/coldfront/components/site/static/images/2WDP6PRM.png b/coldfront/components/site/static/images/2WDP6PRM.png
new file mode 100644
index 0000000000..84fce8b691
Binary files /dev/null and b/coldfront/components/site/static/images/2WDP6PRM.png differ
diff --git a/coldfront/components/site/static/images/2WIPR99L.png b/coldfront/components/site/static/images/2WIPR99L.png
new file mode 100644
index 0000000000..9b86e59a7b
Binary files /dev/null and b/coldfront/components/site/static/images/2WIPR99L.png differ
diff --git a/coldfront/components/site/static/images/2WVNAE6V.png b/coldfront/components/site/static/images/2WVNAE6V.png
new file mode 100644
index 0000000000..0013d07f40
Binary files /dev/null and b/coldfront/components/site/static/images/2WVNAE6V.png differ
diff --git a/coldfront/components/site/static/images/2X9HTNFX.png b/coldfront/components/site/static/images/2X9HTNFX.png
new file mode 100644
index 0000000000..38dec30a17
Binary files /dev/null and b/coldfront/components/site/static/images/2X9HTNFX.png differ
diff --git a/coldfront/components/site/static/images/32GSHIUL.png b/coldfront/components/site/static/images/32GSHIUL.png
new file mode 100644
index 0000000000..0022215b1c
Binary files /dev/null and b/coldfront/components/site/static/images/32GSHIUL.png differ
diff --git a/coldfront/components/site/static/images/33DVUR7Z.png b/coldfront/components/site/static/images/33DVUR7Z.png
new file mode 100644
index 0000000000..158e00d555
Binary files /dev/null and b/coldfront/components/site/static/images/33DVUR7Z.png differ
diff --git a/coldfront/components/site/static/images/35K2D2BH.png b/coldfront/components/site/static/images/35K2D2BH.png
new file mode 100644
index 0000000000..64f1b89760
Binary files /dev/null and b/coldfront/components/site/static/images/35K2D2BH.png differ
diff --git a/coldfront/components/site/static/images/35WQUJF6.png b/coldfront/components/site/static/images/35WQUJF6.png
new file mode 100644
index 0000000000..ef75d56cd7
Binary files /dev/null and b/coldfront/components/site/static/images/35WQUJF6.png differ
diff --git a/coldfront/components/site/static/images/36WWGAQ6.png b/coldfront/components/site/static/images/36WWGAQ6.png
new file mode 100644
index 0000000000..f52c5924e0
Binary files /dev/null and b/coldfront/components/site/static/images/36WWGAQ6.png differ
diff --git a/coldfront/components/site/static/images/374BA9I4.png b/coldfront/components/site/static/images/374BA9I4.png
new file mode 100644
index 0000000000..021f83d512
Binary files /dev/null and b/coldfront/components/site/static/images/374BA9I4.png differ
diff --git a/coldfront/components/site/static/images/3A4WIGFN.png b/coldfront/components/site/static/images/3A4WIGFN.png
new file mode 100644
index 0000000000..cef7ecf80f
Binary files /dev/null and b/coldfront/components/site/static/images/3A4WIGFN.png differ
diff --git a/coldfront/components/site/static/images/3BB2YMVJ.png b/coldfront/components/site/static/images/3BB2YMVJ.png
new file mode 100644
index 0000000000..fa7a0d280f
Binary files /dev/null and b/coldfront/components/site/static/images/3BB2YMVJ.png differ
diff --git a/coldfront/components/site/static/images/3BBE9CG3.png b/coldfront/components/site/static/images/3BBE9CG3.png
new file mode 100644
index 0000000000..57631cca92
Binary files /dev/null and b/coldfront/components/site/static/images/3BBE9CG3.png differ
diff --git a/coldfront/components/site/static/images/3CRBNRY6.png b/coldfront/components/site/static/images/3CRBNRY6.png
new file mode 100644
index 0000000000..57e7e9dfa5
Binary files /dev/null and b/coldfront/components/site/static/images/3CRBNRY6.png differ
diff --git a/coldfront/components/site/static/images/3CVVLTDU.png b/coldfront/components/site/static/images/3CVVLTDU.png
new file mode 100644
index 0000000000..a045e65e45
Binary files /dev/null and b/coldfront/components/site/static/images/3CVVLTDU.png differ
diff --git a/coldfront/components/site/static/images/3DFFZBGW.png b/coldfront/components/site/static/images/3DFFZBGW.png
new file mode 100644
index 0000000000..c2b35708d6
Binary files /dev/null and b/coldfront/components/site/static/images/3DFFZBGW.png differ
diff --git a/coldfront/components/site/static/images/3DFWX8M5.png b/coldfront/components/site/static/images/3DFWX8M5.png
new file mode 100644
index 0000000000..653959ecd5
Binary files /dev/null and b/coldfront/components/site/static/images/3DFWX8M5.png differ
diff --git a/coldfront/components/site/static/images/3EN43KY7.png b/coldfront/components/site/static/images/3EN43KY7.png
new file mode 100644
index 0000000000..553946f125
Binary files /dev/null and b/coldfront/components/site/static/images/3EN43KY7.png differ
diff --git a/coldfront/components/site/static/images/3HX5TD29.png b/coldfront/components/site/static/images/3HX5TD29.png
new file mode 100644
index 0000000000..50cba3e1da
Binary files /dev/null and b/coldfront/components/site/static/images/3HX5TD29.png differ
diff --git a/coldfront/components/site/static/images/3JAIIVJN.png b/coldfront/components/site/static/images/3JAIIVJN.png
new file mode 100644
index 0000000000..038c26f588
Binary files /dev/null and b/coldfront/components/site/static/images/3JAIIVJN.png differ
diff --git a/coldfront/components/site/static/images/3JPL6XZA.png b/coldfront/components/site/static/images/3JPL6XZA.png
new file mode 100644
index 0000000000..33a466d1ec
Binary files /dev/null and b/coldfront/components/site/static/images/3JPL6XZA.png differ
diff --git a/coldfront/components/site/static/images/3JS64SHG.png b/coldfront/components/site/static/images/3JS64SHG.png
new file mode 100644
index 0000000000..63aa125c66
Binary files /dev/null and b/coldfront/components/site/static/images/3JS64SHG.png differ
diff --git a/coldfront/components/site/static/images/3KJ4A3XT.png b/coldfront/components/site/static/images/3KJ4A3XT.png
new file mode 100644
index 0000000000..51575a1c00
Binary files /dev/null and b/coldfront/components/site/static/images/3KJ4A3XT.png differ
diff --git a/coldfront/components/site/static/images/3KWQL463.png b/coldfront/components/site/static/images/3KWQL463.png
new file mode 100644
index 0000000000..35ee1031ea
Binary files /dev/null and b/coldfront/components/site/static/images/3KWQL463.png differ
diff --git a/coldfront/components/site/static/images/3L3UMMDA.png b/coldfront/components/site/static/images/3L3UMMDA.png
new file mode 100644
index 0000000000..cc56e8b98c
Binary files /dev/null and b/coldfront/components/site/static/images/3L3UMMDA.png differ
diff --git a/coldfront/components/site/static/images/3L8UB5AH.png b/coldfront/components/site/static/images/3L8UB5AH.png
new file mode 100644
index 0000000000..423f951c0d
Binary files /dev/null and b/coldfront/components/site/static/images/3L8UB5AH.png differ
diff --git a/coldfront/components/site/static/images/3MTPWPQD.png b/coldfront/components/site/static/images/3MTPWPQD.png
new file mode 100644
index 0000000000..98a78ff152
Binary files /dev/null and b/coldfront/components/site/static/images/3MTPWPQD.png differ
diff --git a/coldfront/components/site/static/images/3N58LGEL.png b/coldfront/components/site/static/images/3N58LGEL.png
new file mode 100644
index 0000000000..99ffae49ed
Binary files /dev/null and b/coldfront/components/site/static/images/3N58LGEL.png differ
diff --git a/coldfront/components/site/static/images/3NNJL9SJ.png b/coldfront/components/site/static/images/3NNJL9SJ.png
new file mode 100644
index 0000000000..7e14bf6790
Binary files /dev/null and b/coldfront/components/site/static/images/3NNJL9SJ.png differ
diff --git a/coldfront/components/site/static/images/3NTPFTFC.png b/coldfront/components/site/static/images/3NTPFTFC.png
new file mode 100644
index 0000000000..8448f95fa2
Binary files /dev/null and b/coldfront/components/site/static/images/3NTPFTFC.png differ
diff --git a/coldfront/components/site/static/images/3PCSHMLJ.png b/coldfront/components/site/static/images/3PCSHMLJ.png
new file mode 100644
index 0000000000..03c102f284
Binary files /dev/null and b/coldfront/components/site/static/images/3PCSHMLJ.png differ
diff --git a/coldfront/components/site/static/images/3Q6A85YY.png b/coldfront/components/site/static/images/3Q6A85YY.png
new file mode 100644
index 0000000000..56da572ec1
Binary files /dev/null and b/coldfront/components/site/static/images/3Q6A85YY.png differ
diff --git a/coldfront/components/site/static/images/3QD3LWCF.png b/coldfront/components/site/static/images/3QD3LWCF.png
new file mode 100644
index 0000000000..e18afd596a
Binary files /dev/null and b/coldfront/components/site/static/images/3QD3LWCF.png differ
diff --git a/coldfront/components/site/static/images/3QEW5DCR.png b/coldfront/components/site/static/images/3QEW5DCR.png
new file mode 100644
index 0000000000..6491e8fdd3
Binary files /dev/null and b/coldfront/components/site/static/images/3QEW5DCR.png differ
diff --git a/coldfront/components/site/static/images/3QYSUUB4.png b/coldfront/components/site/static/images/3QYSUUB4.png
new file mode 100644
index 0000000000..1334650ec0
Binary files /dev/null and b/coldfront/components/site/static/images/3QYSUUB4.png differ
diff --git a/coldfront/components/site/static/images/3RF45BR8.png b/coldfront/components/site/static/images/3RF45BR8.png
new file mode 100644
index 0000000000..90eb12d099
Binary files /dev/null and b/coldfront/components/site/static/images/3RF45BR8.png differ
diff --git a/coldfront/components/site/static/images/3RTXE55N.png b/coldfront/components/site/static/images/3RTXE55N.png
new file mode 100644
index 0000000000..010bec65b6
Binary files /dev/null and b/coldfront/components/site/static/images/3RTXE55N.png differ
diff --git a/coldfront/components/site/static/images/3S3XZFW2.png b/coldfront/components/site/static/images/3S3XZFW2.png
new file mode 100644
index 0000000000..84e0b0fc31
Binary files /dev/null and b/coldfront/components/site/static/images/3S3XZFW2.png differ
diff --git a/coldfront/components/site/static/images/3TM2E3JG.png b/coldfront/components/site/static/images/3TM2E3JG.png
new file mode 100644
index 0000000000..ca3b637f7f
Binary files /dev/null and b/coldfront/components/site/static/images/3TM2E3JG.png differ
diff --git a/coldfront/components/site/static/images/3VKLIM2I.png b/coldfront/components/site/static/images/3VKLIM2I.png
new file mode 100644
index 0000000000..754a695e6d
Binary files /dev/null and b/coldfront/components/site/static/images/3VKLIM2I.png differ
diff --git a/coldfront/components/site/static/images/3VR2RZBD.png b/coldfront/components/site/static/images/3VR2RZBD.png
new file mode 100644
index 0000000000..d25fc66e19
Binary files /dev/null and b/coldfront/components/site/static/images/3VR2RZBD.png differ
diff --git a/coldfront/components/site/static/images/3VVP5CJD.png b/coldfront/components/site/static/images/3VVP5CJD.png
new file mode 100644
index 0000000000..55f12f5a34
Binary files /dev/null and b/coldfront/components/site/static/images/3VVP5CJD.png differ
diff --git a/coldfront/components/site/static/images/3W3HQNKZ.png b/coldfront/components/site/static/images/3W3HQNKZ.png
new file mode 100644
index 0000000000..021f83d512
Binary files /dev/null and b/coldfront/components/site/static/images/3W3HQNKZ.png differ
diff --git a/coldfront/components/site/static/images/3W7TBD52.png b/coldfront/components/site/static/images/3W7TBD52.png
new file mode 100644
index 0000000000..84907da0a7
Binary files /dev/null and b/coldfront/components/site/static/images/3W7TBD52.png differ
diff --git a/coldfront/components/site/static/images/3XDI2KPH.png b/coldfront/components/site/static/images/3XDI2KPH.png
new file mode 100644
index 0000000000..a7ce34838f
Binary files /dev/null and b/coldfront/components/site/static/images/3XDI2KPH.png differ
diff --git a/coldfront/components/site/static/images/3YMW5Q2K.png b/coldfront/components/site/static/images/3YMW5Q2K.png
new file mode 100644
index 0000000000..fad2877bc4
Binary files /dev/null and b/coldfront/components/site/static/images/3YMW5Q2K.png differ
diff --git a/coldfront/components/site/static/images/3YZVP5NY.png b/coldfront/components/site/static/images/3YZVP5NY.png
new file mode 100644
index 0000000000..f91833dc63
Binary files /dev/null and b/coldfront/components/site/static/images/3YZVP5NY.png differ
diff --git a/coldfront/components/site/static/images/3ZG5GRR5.png b/coldfront/components/site/static/images/3ZG5GRR5.png
new file mode 100644
index 0000000000..c3c793e802
Binary files /dev/null and b/coldfront/components/site/static/images/3ZG5GRR5.png differ
diff --git a/coldfront/components/site/static/images/42Y3IR2A.png b/coldfront/components/site/static/images/42Y3IR2A.png
new file mode 100644
index 0000000000..4b66548ac4
Binary files /dev/null and b/coldfront/components/site/static/images/42Y3IR2A.png differ
diff --git a/coldfront/components/site/static/images/43WPQJLK.png b/coldfront/components/site/static/images/43WPQJLK.png
new file mode 100644
index 0000000000..51aa44036a
Binary files /dev/null and b/coldfront/components/site/static/images/43WPQJLK.png differ
diff --git a/coldfront/components/site/static/images/46P3MTJD.png b/coldfront/components/site/static/images/46P3MTJD.png
new file mode 100644
index 0000000000..2b32e8693d
Binary files /dev/null and b/coldfront/components/site/static/images/46P3MTJD.png differ
diff --git a/coldfront/components/site/static/images/4822GD75.png b/coldfront/components/site/static/images/4822GD75.png
new file mode 100644
index 0000000000..9a6a7b6ff8
Binary files /dev/null and b/coldfront/components/site/static/images/4822GD75.png differ
diff --git a/coldfront/components/site/static/images/49E4GPZJ.png b/coldfront/components/site/static/images/49E4GPZJ.png
new file mode 100644
index 0000000000..25e7694cc7
Binary files /dev/null and b/coldfront/components/site/static/images/49E4GPZJ.png differ
diff --git a/coldfront/components/site/static/images/49MPBUX8.png b/coldfront/components/site/static/images/49MPBUX8.png
new file mode 100644
index 0000000000..16ebf6028b
Binary files /dev/null and b/coldfront/components/site/static/images/49MPBUX8.png differ
diff --git a/coldfront/components/site/static/images/49NCF3AA.png b/coldfront/components/site/static/images/49NCF3AA.png
new file mode 100644
index 0000000000..9a82de1032
Binary files /dev/null and b/coldfront/components/site/static/images/49NCF3AA.png differ
diff --git a/coldfront/components/site/static/images/4AU9DZ84.png b/coldfront/components/site/static/images/4AU9DZ84.png
new file mode 100644
index 0000000000..396bdb537a
Binary files /dev/null and b/coldfront/components/site/static/images/4AU9DZ84.png differ
diff --git a/coldfront/components/site/static/images/4BZUNGQK.png b/coldfront/components/site/static/images/4BZUNGQK.png
new file mode 100644
index 0000000000..dab7827c02
Binary files /dev/null and b/coldfront/components/site/static/images/4BZUNGQK.png differ
diff --git a/coldfront/components/site/static/images/4DX4ICQP.png b/coldfront/components/site/static/images/4DX4ICQP.png
new file mode 100644
index 0000000000..5d88877212
Binary files /dev/null and b/coldfront/components/site/static/images/4DX4ICQP.png differ
diff --git a/coldfront/components/site/static/images/4DY6M3ZQ.png b/coldfront/components/site/static/images/4DY6M3ZQ.png
new file mode 100644
index 0000000000..7d82fff10f
Binary files /dev/null and b/coldfront/components/site/static/images/4DY6M3ZQ.png differ
diff --git a/coldfront/components/site/static/images/4DYH5A98.png b/coldfront/components/site/static/images/4DYH5A98.png
new file mode 100644
index 0000000000..253626feaa
Binary files /dev/null and b/coldfront/components/site/static/images/4DYH5A98.png differ
diff --git a/coldfront/components/site/static/images/4E62RKGB.png b/coldfront/components/site/static/images/4E62RKGB.png
new file mode 100644
index 0000000000..fcfa825442
Binary files /dev/null and b/coldfront/components/site/static/images/4E62RKGB.png differ
diff --git a/coldfront/components/site/static/images/4EH4XNV8.png b/coldfront/components/site/static/images/4EH4XNV8.png
new file mode 100644
index 0000000000..b8094fff89
Binary files /dev/null and b/coldfront/components/site/static/images/4EH4XNV8.png differ
diff --git a/coldfront/components/site/static/images/4FTVALRG.png b/coldfront/components/site/static/images/4FTVALRG.png
new file mode 100644
index 0000000000..cb69f08c9a
Binary files /dev/null and b/coldfront/components/site/static/images/4FTVALRG.png differ
diff --git a/coldfront/components/site/static/images/4GS76GGJ.png b/coldfront/components/site/static/images/4GS76GGJ.png
new file mode 100644
index 0000000000..6f7fc5b32e
Binary files /dev/null and b/coldfront/components/site/static/images/4GS76GGJ.png differ
diff --git a/coldfront/components/site/static/images/4HZCFGX6.png b/coldfront/components/site/static/images/4HZCFGX6.png
new file mode 100644
index 0000000000..8b89ff6dfb
Binary files /dev/null and b/coldfront/components/site/static/images/4HZCFGX6.png differ
diff --git a/coldfront/components/site/static/images/4I9Z5VPN.png b/coldfront/components/site/static/images/4I9Z5VPN.png
new file mode 100644
index 0000000000..555dd70f4c
Binary files /dev/null and b/coldfront/components/site/static/images/4I9Z5VPN.png differ
diff --git a/coldfront/components/site/static/images/4J7HN9UT.png b/coldfront/components/site/static/images/4J7HN9UT.png
new file mode 100644
index 0000000000..c041c3296c
Binary files /dev/null and b/coldfront/components/site/static/images/4J7HN9UT.png differ
diff --git a/coldfront/components/site/static/images/4KTLCYP7.png b/coldfront/components/site/static/images/4KTLCYP7.png
new file mode 100644
index 0000000000..9cc5a68713
Binary files /dev/null and b/coldfront/components/site/static/images/4KTLCYP7.png differ
diff --git a/coldfront/components/site/static/images/4LE2V4NF.png b/coldfront/components/site/static/images/4LE2V4NF.png
new file mode 100644
index 0000000000..c40ce0bdc1
Binary files /dev/null and b/coldfront/components/site/static/images/4LE2V4NF.png differ
diff --git a/coldfront/components/site/static/images/4M4FHXXY.png b/coldfront/components/site/static/images/4M4FHXXY.png
new file mode 100644
index 0000000000..d92042acf6
Binary files /dev/null and b/coldfront/components/site/static/images/4M4FHXXY.png differ
diff --git a/coldfront/components/site/static/images/4MJGI4FL.png b/coldfront/components/site/static/images/4MJGI4FL.png
new file mode 100644
index 0000000000..3242a18228
Binary files /dev/null and b/coldfront/components/site/static/images/4MJGI4FL.png differ
diff --git a/coldfront/components/site/static/images/4MQRR47H.png b/coldfront/components/site/static/images/4MQRR47H.png
new file mode 100644
index 0000000000..5d19246103
Binary files /dev/null and b/coldfront/components/site/static/images/4MQRR47H.png differ
diff --git a/coldfront/components/site/static/images/4MUJD9IH.png b/coldfront/components/site/static/images/4MUJD9IH.png
new file mode 100644
index 0000000000..72709dcacd
Binary files /dev/null and b/coldfront/components/site/static/images/4MUJD9IH.png differ
diff --git a/coldfront/components/site/static/images/4P7PJAF8.png b/coldfront/components/site/static/images/4P7PJAF8.png
new file mode 100644
index 0000000000..48b5a2f328
Binary files /dev/null and b/coldfront/components/site/static/images/4P7PJAF8.png differ
diff --git a/coldfront/components/site/static/images/4QFBKZ3H.png b/coldfront/components/site/static/images/4QFBKZ3H.png
new file mode 100644
index 0000000000..6707fe9853
Binary files /dev/null and b/coldfront/components/site/static/images/4QFBKZ3H.png differ
diff --git a/coldfront/components/site/static/images/4QX6ML7P.png b/coldfront/components/site/static/images/4QX6ML7P.png
new file mode 100644
index 0000000000..d409d4be75
Binary files /dev/null and b/coldfront/components/site/static/images/4QX6ML7P.png differ
diff --git a/coldfront/components/site/static/images/4UHHSK3D.png b/coldfront/components/site/static/images/4UHHSK3D.png
new file mode 100644
index 0000000000..3340bc2d82
Binary files /dev/null and b/coldfront/components/site/static/images/4UHHSK3D.png differ
diff --git a/coldfront/components/site/static/images/4V773QEL.png b/coldfront/components/site/static/images/4V773QEL.png
new file mode 100644
index 0000000000..c281638904
Binary files /dev/null and b/coldfront/components/site/static/images/4V773QEL.png differ
diff --git a/coldfront/components/site/static/images/4VZ9ZHGY.png b/coldfront/components/site/static/images/4VZ9ZHGY.png
new file mode 100644
index 0000000000..1e841e7c76
Binary files /dev/null and b/coldfront/components/site/static/images/4VZ9ZHGY.png differ
diff --git a/coldfront/components/site/static/images/4WZRDWIG.png b/coldfront/components/site/static/images/4WZRDWIG.png
new file mode 100644
index 0000000000..c6d93d356c
Binary files /dev/null and b/coldfront/components/site/static/images/4WZRDWIG.png differ
diff --git a/coldfront/components/site/static/images/4X4PVZ6F.png b/coldfront/components/site/static/images/4X4PVZ6F.png
new file mode 100644
index 0000000000..402d83e6d7
Binary files /dev/null and b/coldfront/components/site/static/images/4X4PVZ6F.png differ
diff --git a/coldfront/components/site/static/images/4XPW3KUY.png b/coldfront/components/site/static/images/4XPW3KUY.png
new file mode 100644
index 0000000000..7f6d44ffb8
Binary files /dev/null and b/coldfront/components/site/static/images/4XPW3KUY.png differ
diff --git a/coldfront/components/site/static/images/4Y52UEQ8.png b/coldfront/components/site/static/images/4Y52UEQ8.png
new file mode 100644
index 0000000000..956790baaf
Binary files /dev/null and b/coldfront/components/site/static/images/4Y52UEQ8.png differ
diff --git a/coldfront/components/site/static/images/534HF7QE.png b/coldfront/components/site/static/images/534HF7QE.png
new file mode 100644
index 0000000000..fd7f99a05e
Binary files /dev/null and b/coldfront/components/site/static/images/534HF7QE.png differ
diff --git a/coldfront/components/site/static/images/537RJ5BY.png b/coldfront/components/site/static/images/537RJ5BY.png
new file mode 100644
index 0000000000..b746bd9086
Binary files /dev/null and b/coldfront/components/site/static/images/537RJ5BY.png differ
diff --git a/coldfront/components/site/static/images/5387FSTA.png b/coldfront/components/site/static/images/5387FSTA.png
new file mode 100644
index 0000000000..70ce30ccf9
Binary files /dev/null and b/coldfront/components/site/static/images/5387FSTA.png differ
diff --git a/coldfront/components/site/static/images/538T87A3.png b/coldfront/components/site/static/images/538T87A3.png
new file mode 100644
index 0000000000..72709dcacd
Binary files /dev/null and b/coldfront/components/site/static/images/538T87A3.png differ
diff --git a/coldfront/components/site/static/images/552PAF4Y.png b/coldfront/components/site/static/images/552PAF4Y.png
new file mode 100644
index 0000000000..526a9295d8
Binary files /dev/null and b/coldfront/components/site/static/images/552PAF4Y.png differ
diff --git a/coldfront/components/site/static/images/558N94CN.png b/coldfront/components/site/static/images/558N94CN.png
new file mode 100644
index 0000000000..99ffae49ed
Binary files /dev/null and b/coldfront/components/site/static/images/558N94CN.png differ
diff --git a/coldfront/components/site/static/images/55ARYACY.png b/coldfront/components/site/static/images/55ARYACY.png
new file mode 100644
index 0000000000..3cc9aebeca
Binary files /dev/null and b/coldfront/components/site/static/images/55ARYACY.png differ
diff --git a/coldfront/components/site/static/images/55GGFLD5.png b/coldfront/components/site/static/images/55GGFLD5.png
new file mode 100644
index 0000000000..92a1d0ea3c
Binary files /dev/null and b/coldfront/components/site/static/images/55GGFLD5.png differ
diff --git a/coldfront/components/site/static/images/56W8FPMC.png b/coldfront/components/site/static/images/56W8FPMC.png
new file mode 100644
index 0000000000..ef5e06c699
Binary files /dev/null and b/coldfront/components/site/static/images/56W8FPMC.png differ
diff --git a/coldfront/components/site/static/images/58UBRXB7.png b/coldfront/components/site/static/images/58UBRXB7.png
new file mode 100644
index 0000000000..0ed7d8ffa4
Binary files /dev/null and b/coldfront/components/site/static/images/58UBRXB7.png differ
diff --git a/coldfront/components/site/static/images/5976VA8P.png b/coldfront/components/site/static/images/5976VA8P.png
new file mode 100644
index 0000000000..fc09317bb1
Binary files /dev/null and b/coldfront/components/site/static/images/5976VA8P.png differ
diff --git a/coldfront/components/site/static/images/59PUEFRG.png b/coldfront/components/site/static/images/59PUEFRG.png
new file mode 100644
index 0000000000..0a7f029708
Binary files /dev/null and b/coldfront/components/site/static/images/59PUEFRG.png differ
diff --git a/coldfront/components/site/static/images/59WQWETJ.png b/coldfront/components/site/static/images/59WQWETJ.png
new file mode 100644
index 0000000000..37c8c8fd69
Binary files /dev/null and b/coldfront/components/site/static/images/59WQWETJ.png differ
diff --git a/coldfront/components/site/static/images/5BFLEJNS.png b/coldfront/components/site/static/images/5BFLEJNS.png
new file mode 100644
index 0000000000..d0f99afc24
Binary files /dev/null and b/coldfront/components/site/static/images/5BFLEJNS.png differ
diff --git a/coldfront/components/site/static/images/5BVV7DSI.png b/coldfront/components/site/static/images/5BVV7DSI.png
new file mode 100644
index 0000000000..51aa44036a
Binary files /dev/null and b/coldfront/components/site/static/images/5BVV7DSI.png differ
diff --git a/coldfront/components/site/static/images/5EAVVGNF.png b/coldfront/components/site/static/images/5EAVVGNF.png
new file mode 100644
index 0000000000..2db2fd8bce
Binary files /dev/null and b/coldfront/components/site/static/images/5EAVVGNF.png differ
diff --git a/coldfront/components/site/static/images/5EHIL72X.png b/coldfront/components/site/static/images/5EHIL72X.png
new file mode 100644
index 0000000000..950ffb980f
Binary files /dev/null and b/coldfront/components/site/static/images/5EHIL72X.png differ
diff --git a/coldfront/components/site/static/images/5GZM3I39.png b/coldfront/components/site/static/images/5GZM3I39.png
new file mode 100644
index 0000000000..0ef918b90e
Binary files /dev/null and b/coldfront/components/site/static/images/5GZM3I39.png differ
diff --git a/coldfront/components/site/static/images/5HF2Z6B8.png b/coldfront/components/site/static/images/5HF2Z6B8.png
new file mode 100644
index 0000000000..21e8489269
Binary files /dev/null and b/coldfront/components/site/static/images/5HF2Z6B8.png differ
diff --git a/coldfront/components/site/static/images/5HKVXA27.png b/coldfront/components/site/static/images/5HKVXA27.png
new file mode 100644
index 0000000000..055fd29bd5
Binary files /dev/null and b/coldfront/components/site/static/images/5HKVXA27.png differ
diff --git a/coldfront/components/site/static/images/5IG3BRPL.png b/coldfront/components/site/static/images/5IG3BRPL.png
new file mode 100644
index 0000000000..f70c42bfbb
Binary files /dev/null and b/coldfront/components/site/static/images/5IG3BRPL.png differ
diff --git a/coldfront/components/site/static/images/5IX7Q3GK.png b/coldfront/components/site/static/images/5IX7Q3GK.png
new file mode 100644
index 0000000000..526a9295d8
Binary files /dev/null and b/coldfront/components/site/static/images/5IX7Q3GK.png differ
diff --git a/coldfront/components/site/static/images/5JHXF8KS.png b/coldfront/components/site/static/images/5JHXF8KS.png
new file mode 100644
index 0000000000..d65b2db2ff
Binary files /dev/null and b/coldfront/components/site/static/images/5JHXF8KS.png differ
diff --git a/coldfront/components/site/static/images/5JLHKK3V.png b/coldfront/components/site/static/images/5JLHKK3V.png
new file mode 100644
index 0000000000..23d41c60e4
Binary files /dev/null and b/coldfront/components/site/static/images/5JLHKK3V.png differ
diff --git a/coldfront/components/site/static/images/5JPANT76.png b/coldfront/components/site/static/images/5JPANT76.png
new file mode 100644
index 0000000000..754a695e6d
Binary files /dev/null and b/coldfront/components/site/static/images/5JPANT76.png differ
diff --git a/coldfront/components/site/static/images/5KALZDSS.png b/coldfront/components/site/static/images/5KALZDSS.png
new file mode 100644
index 0000000000..dc1d0adfe5
Binary files /dev/null and b/coldfront/components/site/static/images/5KALZDSS.png differ
diff --git a/coldfront/components/site/static/images/5KU4GXWG.png b/coldfront/components/site/static/images/5KU4GXWG.png
new file mode 100644
index 0000000000..7de4decf7c
Binary files /dev/null and b/coldfront/components/site/static/images/5KU4GXWG.png differ
diff --git a/coldfront/components/site/static/images/5ND6IVDD.png b/coldfront/components/site/static/images/5ND6IVDD.png
new file mode 100644
index 0000000000..311db9b1a3
Binary files /dev/null and b/coldfront/components/site/static/images/5ND6IVDD.png differ
diff --git a/coldfront/components/site/static/images/5PNA6DFH.png b/coldfront/components/site/static/images/5PNA6DFH.png
new file mode 100644
index 0000000000..7e18f18e8e
Binary files /dev/null and b/coldfront/components/site/static/images/5PNA6DFH.png differ
diff --git a/coldfront/components/site/static/images/5Q34ZP9H.png b/coldfront/components/site/static/images/5Q34ZP9H.png
new file mode 100644
index 0000000000..16138263fd
Binary files /dev/null and b/coldfront/components/site/static/images/5Q34ZP9H.png differ
diff --git a/coldfront/components/site/static/images/5QJZUIYW.png b/coldfront/components/site/static/images/5QJZUIYW.png
new file mode 100644
index 0000000000..7e14bf6790
Binary files /dev/null and b/coldfront/components/site/static/images/5QJZUIYW.png differ
diff --git a/coldfront/components/site/static/images/5QXNCUCU.png b/coldfront/components/site/static/images/5QXNCUCU.png
new file mode 100644
index 0000000000..d0f99afc24
Binary files /dev/null and b/coldfront/components/site/static/images/5QXNCUCU.png differ
diff --git a/coldfront/components/site/static/images/5RVWMZWZ.png b/coldfront/components/site/static/images/5RVWMZWZ.png
new file mode 100644
index 0000000000..4906f3eae2
Binary files /dev/null and b/coldfront/components/site/static/images/5RVWMZWZ.png differ
diff --git a/coldfront/components/site/static/images/5SF4EWC5.png b/coldfront/components/site/static/images/5SF4EWC5.png
new file mode 100644
index 0000000000..f408dd97a2
Binary files /dev/null and b/coldfront/components/site/static/images/5SF4EWC5.png differ
diff --git a/coldfront/components/site/static/images/5SFQP6JE.png b/coldfront/components/site/static/images/5SFQP6JE.png
new file mode 100644
index 0000000000..8c1464db74
Binary files /dev/null and b/coldfront/components/site/static/images/5SFQP6JE.png differ
diff --git a/coldfront/components/site/static/images/5SINRRWN.png b/coldfront/components/site/static/images/5SINRRWN.png
new file mode 100644
index 0000000000..d76af6337b
Binary files /dev/null and b/coldfront/components/site/static/images/5SINRRWN.png differ
diff --git a/coldfront/components/site/static/images/5SR9S4WY.png b/coldfront/components/site/static/images/5SR9S4WY.png
new file mode 100644
index 0000000000..7ecaee4d74
Binary files /dev/null and b/coldfront/components/site/static/images/5SR9S4WY.png differ
diff --git a/coldfront/components/site/static/images/5TK6JHLQ.png b/coldfront/components/site/static/images/5TK6JHLQ.png
new file mode 100644
index 0000000000..8d925a3f18
Binary files /dev/null and b/coldfront/components/site/static/images/5TK6JHLQ.png differ
diff --git a/coldfront/components/site/static/images/5UEY9K8G.png b/coldfront/components/site/static/images/5UEY9K8G.png
new file mode 100644
index 0000000000..86e15be8f8
Binary files /dev/null and b/coldfront/components/site/static/images/5UEY9K8G.png differ
diff --git a/coldfront/components/site/static/images/5VR4LX9I.png b/coldfront/components/site/static/images/5VR4LX9I.png
new file mode 100644
index 0000000000..3e47d7f554
Binary files /dev/null and b/coldfront/components/site/static/images/5VR4LX9I.png differ
diff --git a/coldfront/components/site/static/images/5W6DUXB8.png b/coldfront/components/site/static/images/5W6DUXB8.png
new file mode 100644
index 0000000000..8f07049794
Binary files /dev/null and b/coldfront/components/site/static/images/5W6DUXB8.png differ
diff --git a/coldfront/components/site/static/images/5YBIDUYS.png b/coldfront/components/site/static/images/5YBIDUYS.png
new file mode 100644
index 0000000000..b8d9afe3e0
Binary files /dev/null and b/coldfront/components/site/static/images/5YBIDUYS.png differ
diff --git a/coldfront/components/site/static/images/62B2ZBY5.png b/coldfront/components/site/static/images/62B2ZBY5.png
new file mode 100644
index 0000000000..669a944e41
Binary files /dev/null and b/coldfront/components/site/static/images/62B2ZBY5.png differ
diff --git a/coldfront/components/site/static/images/62F2V2GV.png b/coldfront/components/site/static/images/62F2V2GV.png
new file mode 100644
index 0000000000..72fc7961a9
Binary files /dev/null and b/coldfront/components/site/static/images/62F2V2GV.png differ
diff --git a/coldfront/components/site/static/images/62J5WZUB.png b/coldfront/components/site/static/images/62J5WZUB.png
new file mode 100644
index 0000000000..08ca1d2faa
Binary files /dev/null and b/coldfront/components/site/static/images/62J5WZUB.png differ
diff --git a/coldfront/components/site/static/images/62RWLX2P.png b/coldfront/components/site/static/images/62RWLX2P.png
new file mode 100644
index 0000000000..d0fbfd3100
Binary files /dev/null and b/coldfront/components/site/static/images/62RWLX2P.png differ
diff --git a/coldfront/components/site/static/images/63B6AUFA.png b/coldfront/components/site/static/images/63B6AUFA.png
new file mode 100644
index 0000000000..e9e903e2c3
Binary files /dev/null and b/coldfront/components/site/static/images/63B6AUFA.png differ
diff --git a/coldfront/components/site/static/images/64TMYYNG.png b/coldfront/components/site/static/images/64TMYYNG.png
new file mode 100644
index 0000000000..f051e23ffd
Binary files /dev/null and b/coldfront/components/site/static/images/64TMYYNG.png differ
diff --git a/coldfront/components/site/static/images/66DCA4PD.png b/coldfront/components/site/static/images/66DCA4PD.png
new file mode 100644
index 0000000000..851639ea36
Binary files /dev/null and b/coldfront/components/site/static/images/66DCA4PD.png differ
diff --git a/coldfront/components/site/static/images/66J3HQQ6.png b/coldfront/components/site/static/images/66J3HQQ6.png
new file mode 100644
index 0000000000..225bd9063f
Binary files /dev/null and b/coldfront/components/site/static/images/66J3HQQ6.png differ
diff --git a/coldfront/components/site/static/images/685R7SEQ.png b/coldfront/components/site/static/images/685R7SEQ.png
new file mode 100644
index 0000000000..f1ed907985
Binary files /dev/null and b/coldfront/components/site/static/images/685R7SEQ.png differ
diff --git a/coldfront/components/site/static/images/688IQMYN.png b/coldfront/components/site/static/images/688IQMYN.png
new file mode 100644
index 0000000000..2ca62ead10
Binary files /dev/null and b/coldfront/components/site/static/images/688IQMYN.png differ
diff --git a/coldfront/components/site/static/images/694M62J3.png b/coldfront/components/site/static/images/694M62J3.png
new file mode 100644
index 0000000000..fc09317bb1
Binary files /dev/null and b/coldfront/components/site/static/images/694M62J3.png differ
diff --git a/coldfront/components/site/static/images/6962V9HC.png b/coldfront/components/site/static/images/6962V9HC.png
new file mode 100644
index 0000000000..9c6ba92d17
Binary files /dev/null and b/coldfront/components/site/static/images/6962V9HC.png differ
diff --git a/coldfront/components/site/static/images/69WJSJAU.png b/coldfront/components/site/static/images/69WJSJAU.png
new file mode 100644
index 0000000000..cd71a98af5
Binary files /dev/null and b/coldfront/components/site/static/images/69WJSJAU.png differ
diff --git a/coldfront/components/site/static/images/6DZLJL3E.png b/coldfront/components/site/static/images/6DZLJL3E.png
new file mode 100644
index 0000000000..2c8251bbf9
Binary files /dev/null and b/coldfront/components/site/static/images/6DZLJL3E.png differ
diff --git a/coldfront/components/site/static/images/6EAZQ7MB.png b/coldfront/components/site/static/images/6EAZQ7MB.png
new file mode 100644
index 0000000000..6b7472e783
Binary files /dev/null and b/coldfront/components/site/static/images/6EAZQ7MB.png differ
diff --git a/coldfront/components/site/static/images/6EY5MPBD.png b/coldfront/components/site/static/images/6EY5MPBD.png
new file mode 100644
index 0000000000..859bdb041f
Binary files /dev/null and b/coldfront/components/site/static/images/6EY5MPBD.png differ
diff --git a/coldfront/components/site/static/images/6F2YCR9H.png b/coldfront/components/site/static/images/6F2YCR9H.png
new file mode 100644
index 0000000000..b1aed145fd
Binary files /dev/null and b/coldfront/components/site/static/images/6F2YCR9H.png differ
diff --git a/coldfront/components/site/static/images/6GWRDIHT.png b/coldfront/components/site/static/images/6GWRDIHT.png
new file mode 100644
index 0000000000..0e3f1cd8a9
Binary files /dev/null and b/coldfront/components/site/static/images/6GWRDIHT.png differ
diff --git a/coldfront/components/site/static/images/6HFD4T9P.png b/coldfront/components/site/static/images/6HFD4T9P.png
new file mode 100644
index 0000000000..72c73a6565
Binary files /dev/null and b/coldfront/components/site/static/images/6HFD4T9P.png differ
diff --git a/coldfront/components/site/static/images/6HPZHHWB.png b/coldfront/components/site/static/images/6HPZHHWB.png
new file mode 100644
index 0000000000..3acac0e724
Binary files /dev/null and b/coldfront/components/site/static/images/6HPZHHWB.png differ
diff --git a/coldfront/components/site/static/images/6IEA5ABG.png b/coldfront/components/site/static/images/6IEA5ABG.png
new file mode 100644
index 0000000000..776932f9c5
Binary files /dev/null and b/coldfront/components/site/static/images/6IEA5ABG.png differ
diff --git a/coldfront/components/site/static/images/6JLX8JWJ.png b/coldfront/components/site/static/images/6JLX8JWJ.png
new file mode 100644
index 0000000000..1ca5b6ecd9
Binary files /dev/null and b/coldfront/components/site/static/images/6JLX8JWJ.png differ
diff --git a/coldfront/components/site/static/images/6LK9ZYT6.png b/coldfront/components/site/static/images/6LK9ZYT6.png
new file mode 100644
index 0000000000..476ddc2e74
Binary files /dev/null and b/coldfront/components/site/static/images/6LK9ZYT6.png differ
diff --git a/coldfront/components/site/static/images/6MBMJ88Z.png b/coldfront/components/site/static/images/6MBMJ88Z.png
new file mode 100644
index 0000000000..de898fe12b
Binary files /dev/null and b/coldfront/components/site/static/images/6MBMJ88Z.png differ
diff --git a/coldfront/components/site/static/images/6MSR35XM.png b/coldfront/components/site/static/images/6MSR35XM.png
new file mode 100644
index 0000000000..0524fb2186
Binary files /dev/null and b/coldfront/components/site/static/images/6MSR35XM.png differ
diff --git a/coldfront/components/site/static/images/6NEF7ERL.png b/coldfront/components/site/static/images/6NEF7ERL.png
new file mode 100644
index 0000000000..423f2cdf40
Binary files /dev/null and b/coldfront/components/site/static/images/6NEF7ERL.png differ
diff --git a/coldfront/components/site/static/images/6PGX2Q34.png b/coldfront/components/site/static/images/6PGX2Q34.png
new file mode 100644
index 0000000000..3869fd153a
Binary files /dev/null and b/coldfront/components/site/static/images/6PGX2Q34.png differ
diff --git a/coldfront/components/site/static/images/6QAGQU2K.png b/coldfront/components/site/static/images/6QAGQU2K.png
new file mode 100644
index 0000000000..55f12f5a34
Binary files /dev/null and b/coldfront/components/site/static/images/6QAGQU2K.png differ
diff --git a/coldfront/components/site/static/images/6QRY9XKT.png b/coldfront/components/site/static/images/6QRY9XKT.png
new file mode 100644
index 0000000000..b6a05f44ca
Binary files /dev/null and b/coldfront/components/site/static/images/6QRY9XKT.png differ
diff --git a/coldfront/components/site/static/images/6RT2D8UD.png b/coldfront/components/site/static/images/6RT2D8UD.png
new file mode 100644
index 0000000000..71b440ac1a
Binary files /dev/null and b/coldfront/components/site/static/images/6RT2D8UD.png differ
diff --git a/coldfront/components/site/static/images/6U32MRQ4.png b/coldfront/components/site/static/images/6U32MRQ4.png
new file mode 100644
index 0000000000..0d32dbf260
Binary files /dev/null and b/coldfront/components/site/static/images/6U32MRQ4.png differ
diff --git a/coldfront/components/site/static/images/6U55QJ9R.png b/coldfront/components/site/static/images/6U55QJ9R.png
new file mode 100644
index 0000000000..2063167efa
Binary files /dev/null and b/coldfront/components/site/static/images/6U55QJ9R.png differ
diff --git a/coldfront/components/site/static/images/6UCVLTYJ.png b/coldfront/components/site/static/images/6UCVLTYJ.png
new file mode 100644
index 0000000000..25c9204127
Binary files /dev/null and b/coldfront/components/site/static/images/6UCVLTYJ.png differ
diff --git a/coldfront/components/site/static/images/6UXM7Z7Y.png b/coldfront/components/site/static/images/6UXM7Z7Y.png
new file mode 100644
index 0000000000..b914d984d1
Binary files /dev/null and b/coldfront/components/site/static/images/6UXM7Z7Y.png differ
diff --git a/coldfront/components/site/static/images/6VA4C5N3.png b/coldfront/components/site/static/images/6VA4C5N3.png
new file mode 100644
index 0000000000..4227d370b0
Binary files /dev/null and b/coldfront/components/site/static/images/6VA4C5N3.png differ
diff --git a/coldfront/components/site/static/images/6WVW3RAA.png b/coldfront/components/site/static/images/6WVW3RAA.png
new file mode 100644
index 0000000000..cea2306484
Binary files /dev/null and b/coldfront/components/site/static/images/6WVW3RAA.png differ
diff --git a/coldfront/components/site/static/images/6XYDEAPZ.png b/coldfront/components/site/static/images/6XYDEAPZ.png
new file mode 100644
index 0000000000..562495645d
Binary files /dev/null and b/coldfront/components/site/static/images/6XYDEAPZ.png differ
diff --git a/coldfront/components/site/static/images/6YTGWQKY.png b/coldfront/components/site/static/images/6YTGWQKY.png
new file mode 100644
index 0000000000..0389b496c3
Binary files /dev/null and b/coldfront/components/site/static/images/6YTGWQKY.png differ
diff --git a/coldfront/components/site/static/images/72PKE6BQ.png b/coldfront/components/site/static/images/72PKE6BQ.png
new file mode 100644
index 0000000000..4ca5772f40
Binary files /dev/null and b/coldfront/components/site/static/images/72PKE6BQ.png differ
diff --git a/coldfront/components/site/static/images/72TJG5ZD.png b/coldfront/components/site/static/images/72TJG5ZD.png
new file mode 100644
index 0000000000..82a31f5da4
Binary files /dev/null and b/coldfront/components/site/static/images/72TJG5ZD.png differ
diff --git a/coldfront/components/site/static/images/73HHM3SR.png b/coldfront/components/site/static/images/73HHM3SR.png
new file mode 100644
index 0000000000..2dfc6ff115
Binary files /dev/null and b/coldfront/components/site/static/images/73HHM3SR.png differ
diff --git a/coldfront/components/site/static/images/73NB2N55.png b/coldfront/components/site/static/images/73NB2N55.png
new file mode 100644
index 0000000000..4077b1e55c
Binary files /dev/null and b/coldfront/components/site/static/images/73NB2N55.png differ
diff --git a/coldfront/components/site/static/images/74VIKXNE.png b/coldfront/components/site/static/images/74VIKXNE.png
new file mode 100644
index 0000000000..17d8f27aea
Binary files /dev/null and b/coldfront/components/site/static/images/74VIKXNE.png differ
diff --git a/coldfront/components/site/static/images/754ZYWCV.png b/coldfront/components/site/static/images/754ZYWCV.png
new file mode 100644
index 0000000000..e5697fa497
Binary files /dev/null and b/coldfront/components/site/static/images/754ZYWCV.png differ
diff --git a/coldfront/components/site/static/images/75QDLD3K.png b/coldfront/components/site/static/images/75QDLD3K.png
new file mode 100644
index 0000000000..e18afd596a
Binary files /dev/null and b/coldfront/components/site/static/images/75QDLD3K.png differ
diff --git a/coldfront/components/site/static/images/75TA2EQI.png b/coldfront/components/site/static/images/75TA2EQI.png
new file mode 100644
index 0000000000..971aac9bb9
Binary files /dev/null and b/coldfront/components/site/static/images/75TA2EQI.png differ
diff --git a/coldfront/components/site/static/images/795KFJ6U.png b/coldfront/components/site/static/images/795KFJ6U.png
new file mode 100644
index 0000000000..0fa39c4b0d
Binary files /dev/null and b/coldfront/components/site/static/images/795KFJ6U.png differ
diff --git a/coldfront/components/site/static/images/79E4TMBV.png b/coldfront/components/site/static/images/79E4TMBV.png
new file mode 100644
index 0000000000..60a0a26309
Binary files /dev/null and b/coldfront/components/site/static/images/79E4TMBV.png differ
diff --git a/coldfront/components/site/static/images/7B5KSPFW.png b/coldfront/components/site/static/images/7B5KSPFW.png
new file mode 100644
index 0000000000..b8094fff89
Binary files /dev/null and b/coldfront/components/site/static/images/7B5KSPFW.png differ
diff --git a/coldfront/components/site/static/images/7CBJKUYY.png b/coldfront/components/site/static/images/7CBJKUYY.png
new file mode 100644
index 0000000000..6af0ef49d9
Binary files /dev/null and b/coldfront/components/site/static/images/7CBJKUYY.png differ
diff --git a/coldfront/components/site/static/images/7DE5HEKS.png b/coldfront/components/site/static/images/7DE5HEKS.png
new file mode 100644
index 0000000000..a676c1f7c7
Binary files /dev/null and b/coldfront/components/site/static/images/7DE5HEKS.png differ
diff --git a/coldfront/components/site/static/images/7FTD746R.png b/coldfront/components/site/static/images/7FTD746R.png
new file mode 100644
index 0000000000..8f7256c912
Binary files /dev/null and b/coldfront/components/site/static/images/7FTD746R.png differ
diff --git a/coldfront/components/site/static/images/7G82M8P3.png b/coldfront/components/site/static/images/7G82M8P3.png
new file mode 100644
index 0000000000..1cd6d9c47c
Binary files /dev/null and b/coldfront/components/site/static/images/7G82M8P3.png differ
diff --git a/coldfront/components/site/static/images/7GE54FF9.png b/coldfront/components/site/static/images/7GE54FF9.png
new file mode 100644
index 0000000000..8a5880f60b
Binary files /dev/null and b/coldfront/components/site/static/images/7GE54FF9.png differ
diff --git a/coldfront/components/site/static/images/7H2LEC5P.png b/coldfront/components/site/static/images/7H2LEC5P.png
new file mode 100644
index 0000000000..a342ef5701
Binary files /dev/null and b/coldfront/components/site/static/images/7H2LEC5P.png differ
diff --git a/coldfront/components/site/static/images/7ISLCL2S.png b/coldfront/components/site/static/images/7ISLCL2S.png
new file mode 100644
index 0000000000..ca9a2e6b3a
Binary files /dev/null and b/coldfront/components/site/static/images/7ISLCL2S.png differ
diff --git a/coldfront/components/site/static/images/7MLLW3UK.png b/coldfront/components/site/static/images/7MLLW3UK.png
new file mode 100644
index 0000000000..0e3f1cd8a9
Binary files /dev/null and b/coldfront/components/site/static/images/7MLLW3UK.png differ
diff --git a/coldfront/components/site/static/images/7MYDDIDJ.png b/coldfront/components/site/static/images/7MYDDIDJ.png
new file mode 100644
index 0000000000..80bd89263d
Binary files /dev/null and b/coldfront/components/site/static/images/7MYDDIDJ.png differ
diff --git a/coldfront/components/site/static/images/7NUQDYEZ.png b/coldfront/components/site/static/images/7NUQDYEZ.png
new file mode 100644
index 0000000000..007b45e311
Binary files /dev/null and b/coldfront/components/site/static/images/7NUQDYEZ.png differ
diff --git a/coldfront/components/site/static/images/7QBYWKMU.png b/coldfront/components/site/static/images/7QBYWKMU.png
new file mode 100644
index 0000000000..49dc04686c
Binary files /dev/null and b/coldfront/components/site/static/images/7QBYWKMU.png differ
diff --git a/coldfront/components/site/static/images/7QQPALFS.png b/coldfront/components/site/static/images/7QQPALFS.png
new file mode 100644
index 0000000000..e2568788f2
Binary files /dev/null and b/coldfront/components/site/static/images/7QQPALFS.png differ
diff --git a/coldfront/components/site/static/images/7QSC7X9V.png b/coldfront/components/site/static/images/7QSC7X9V.png
new file mode 100644
index 0000000000..ec796241a4
Binary files /dev/null and b/coldfront/components/site/static/images/7QSC7X9V.png differ
diff --git a/coldfront/components/site/static/images/7QYUIRI5.png b/coldfront/components/site/static/images/7QYUIRI5.png
new file mode 100644
index 0000000000..e72f45d8ec
Binary files /dev/null and b/coldfront/components/site/static/images/7QYUIRI5.png differ
diff --git a/coldfront/components/site/static/images/7RKPNTQA.png b/coldfront/components/site/static/images/7RKPNTQA.png
new file mode 100644
index 0000000000..ddd147b135
Binary files /dev/null and b/coldfront/components/site/static/images/7RKPNTQA.png differ
diff --git a/coldfront/components/site/static/images/7SM9F7A3.png b/coldfront/components/site/static/images/7SM9F7A3.png
new file mode 100644
index 0000000000..8251724ff0
Binary files /dev/null and b/coldfront/components/site/static/images/7SM9F7A3.png differ
diff --git a/coldfront/components/site/static/images/7URIW76U.png b/coldfront/components/site/static/images/7URIW76U.png
new file mode 100644
index 0000000000..b3059d34a0
Binary files /dev/null and b/coldfront/components/site/static/images/7URIW76U.png differ
diff --git a/coldfront/components/site/static/images/7V7T5W6C.png b/coldfront/components/site/static/images/7V7T5W6C.png
new file mode 100644
index 0000000000..338334bf12
Binary files /dev/null and b/coldfront/components/site/static/images/7V7T5W6C.png differ
diff --git a/coldfront/components/site/static/images/7VDECZMC.png b/coldfront/components/site/static/images/7VDECZMC.png
new file mode 100644
index 0000000000..4f97f2c0bd
Binary files /dev/null and b/coldfront/components/site/static/images/7VDECZMC.png differ
diff --git a/coldfront/components/site/static/images/7WL7HGCB.png b/coldfront/components/site/static/images/7WL7HGCB.png
new file mode 100644
index 0000000000..5c7df4100e
Binary files /dev/null and b/coldfront/components/site/static/images/7WL7HGCB.png differ
diff --git a/coldfront/components/site/static/images/7WM3MEP8.png b/coldfront/components/site/static/images/7WM3MEP8.png
new file mode 100644
index 0000000000..e35b0502f1
Binary files /dev/null and b/coldfront/components/site/static/images/7WM3MEP8.png differ
diff --git a/coldfront/components/site/static/images/7XYZ7TGC.png b/coldfront/components/site/static/images/7XYZ7TGC.png
new file mode 100644
index 0000000000..b51c538c37
Binary files /dev/null and b/coldfront/components/site/static/images/7XYZ7TGC.png differ
diff --git a/coldfront/components/site/static/images/7ZQF6WIX.png b/coldfront/components/site/static/images/7ZQF6WIX.png
new file mode 100644
index 0000000000..3ac3656006
Binary files /dev/null and b/coldfront/components/site/static/images/7ZQF6WIX.png differ
diff --git a/coldfront/components/site/static/images/82G2GZQJ.png b/coldfront/components/site/static/images/82G2GZQJ.png
new file mode 100644
index 0000000000..7a644c53de
Binary files /dev/null and b/coldfront/components/site/static/images/82G2GZQJ.png differ
diff --git a/coldfront/components/site/static/images/82PFWKC7.png b/coldfront/components/site/static/images/82PFWKC7.png
new file mode 100644
index 0000000000..02de867ef4
Binary files /dev/null and b/coldfront/components/site/static/images/82PFWKC7.png differ
diff --git a/coldfront/components/site/static/images/83WZAG4Q.png b/coldfront/components/site/static/images/83WZAG4Q.png
new file mode 100644
index 0000000000..a8fbfb2a8f
Binary files /dev/null and b/coldfront/components/site/static/images/83WZAG4Q.png differ
diff --git a/coldfront/components/site/static/images/84RDWEND.png b/coldfront/components/site/static/images/84RDWEND.png
new file mode 100644
index 0000000000..a676c1f7c7
Binary files /dev/null and b/coldfront/components/site/static/images/84RDWEND.png differ
diff --git a/coldfront/components/site/static/images/8579C83A.png b/coldfront/components/site/static/images/8579C83A.png
new file mode 100644
index 0000000000..0022215b1c
Binary files /dev/null and b/coldfront/components/site/static/images/8579C83A.png differ
diff --git a/coldfront/components/site/static/images/85LUQ656.png b/coldfront/components/site/static/images/85LUQ656.png
new file mode 100644
index 0000000000..6491e8fdd3
Binary files /dev/null and b/coldfront/components/site/static/images/85LUQ656.png differ
diff --git a/coldfront/components/site/static/images/86JFNQ8I.png b/coldfront/components/site/static/images/86JFNQ8I.png
new file mode 100644
index 0000000000..ac9d0d84ba
Binary files /dev/null and b/coldfront/components/site/static/images/86JFNQ8I.png differ
diff --git a/coldfront/components/site/static/images/879F4TNK.png b/coldfront/components/site/static/images/879F4TNK.png
new file mode 100644
index 0000000000..3084ac9983
Binary files /dev/null and b/coldfront/components/site/static/images/879F4TNK.png differ
diff --git a/coldfront/components/site/static/images/87RYSBNF.png b/coldfront/components/site/static/images/87RYSBNF.png
new file mode 100644
index 0000000000..f8e8a52ffa
Binary files /dev/null and b/coldfront/components/site/static/images/87RYSBNF.png differ
diff --git a/coldfront/components/site/static/images/8882S3IJ.png b/coldfront/components/site/static/images/8882S3IJ.png
new file mode 100644
index 0000000000..d199a08d15
Binary files /dev/null and b/coldfront/components/site/static/images/8882S3IJ.png differ
diff --git a/coldfront/components/site/static/images/88RSD3SQ.png b/coldfront/components/site/static/images/88RSD3SQ.png
new file mode 100644
index 0000000000..c1b2d3964e
Binary files /dev/null and b/coldfront/components/site/static/images/88RSD3SQ.png differ
diff --git a/coldfront/components/site/static/images/892VGBQ9.png b/coldfront/components/site/static/images/892VGBQ9.png
new file mode 100644
index 0000000000..57631cca92
Binary files /dev/null and b/coldfront/components/site/static/images/892VGBQ9.png differ
diff --git a/coldfront/components/site/static/images/8AFGR246.png b/coldfront/components/site/static/images/8AFGR246.png
new file mode 100644
index 0000000000..a81e013c82
Binary files /dev/null and b/coldfront/components/site/static/images/8AFGR246.png differ
diff --git a/coldfront/components/site/static/images/8D56PYFS.png b/coldfront/components/site/static/images/8D56PYFS.png
new file mode 100644
index 0000000000..bf82e4b11c
Binary files /dev/null and b/coldfront/components/site/static/images/8D56PYFS.png differ
diff --git a/coldfront/components/site/static/images/8DLECT5F.png b/coldfront/components/site/static/images/8DLECT5F.png
new file mode 100644
index 0000000000..5c7df4100e
Binary files /dev/null and b/coldfront/components/site/static/images/8DLECT5F.png differ
diff --git a/coldfront/components/site/static/images/8DNUUUI3.png b/coldfront/components/site/static/images/8DNUUUI3.png
new file mode 100644
index 0000000000..b7bff5ea57
Binary files /dev/null and b/coldfront/components/site/static/images/8DNUUUI3.png differ
diff --git a/coldfront/components/site/static/images/8DZKAL5Q.png b/coldfront/components/site/static/images/8DZKAL5Q.png
new file mode 100644
index 0000000000..56da572ec1
Binary files /dev/null and b/coldfront/components/site/static/images/8DZKAL5Q.png differ
diff --git a/coldfront/components/site/static/images/8F829PIF.png b/coldfront/components/site/static/images/8F829PIF.png
new file mode 100644
index 0000000000..442fc623a4
Binary files /dev/null and b/coldfront/components/site/static/images/8F829PIF.png differ
diff --git a/coldfront/components/site/static/images/8FVWTVIA.png b/coldfront/components/site/static/images/8FVWTVIA.png
new file mode 100644
index 0000000000..4b6bdcb21e
Binary files /dev/null and b/coldfront/components/site/static/images/8FVWTVIA.png differ
diff --git a/coldfront/components/site/static/images/8G7FBRNV.png b/coldfront/components/site/static/images/8G7FBRNV.png
new file mode 100644
index 0000000000..92831b857c
Binary files /dev/null and b/coldfront/components/site/static/images/8G7FBRNV.png differ
diff --git a/coldfront/components/site/static/images/8GTPACN3.png b/coldfront/components/site/static/images/8GTPACN3.png
new file mode 100644
index 0000000000..1cfdbed8ba
Binary files /dev/null and b/coldfront/components/site/static/images/8GTPACN3.png differ
diff --git a/coldfront/components/site/static/images/8HZ6LLHN.png b/coldfront/components/site/static/images/8HZ6LLHN.png
new file mode 100644
index 0000000000..57ae4289bd
Binary files /dev/null and b/coldfront/components/site/static/images/8HZ6LLHN.png differ
diff --git a/coldfront/components/site/static/images/8IF27M3P.png b/coldfront/components/site/static/images/8IF27M3P.png
new file mode 100644
index 0000000000..eb05dcad2c
Binary files /dev/null and b/coldfront/components/site/static/images/8IF27M3P.png differ
diff --git a/coldfront/components/site/static/images/8IGQFYJL.png b/coldfront/components/site/static/images/8IGQFYJL.png
new file mode 100644
index 0000000000..8101d45953
Binary files /dev/null and b/coldfront/components/site/static/images/8IGQFYJL.png differ
diff --git a/coldfront/components/site/static/images/8JRIT6A4.png b/coldfront/components/site/static/images/8JRIT6A4.png
new file mode 100644
index 0000000000..3fbc4db220
Binary files /dev/null and b/coldfront/components/site/static/images/8JRIT6A4.png differ
diff --git a/coldfront/components/site/static/images/8NJBWR6Q.png b/coldfront/components/site/static/images/8NJBWR6Q.png
new file mode 100644
index 0000000000..180f86f62b
Binary files /dev/null and b/coldfront/components/site/static/images/8NJBWR6Q.png differ
diff --git a/coldfront/components/site/static/images/8PWTTB59.png b/coldfront/components/site/static/images/8PWTTB59.png
new file mode 100644
index 0000000000..772b6f4411
Binary files /dev/null and b/coldfront/components/site/static/images/8PWTTB59.png differ
diff --git a/coldfront/components/site/static/images/8Q8PXUJZ.png b/coldfront/components/site/static/images/8Q8PXUJZ.png
new file mode 100644
index 0000000000..1964cb38f7
Binary files /dev/null and b/coldfront/components/site/static/images/8Q8PXUJZ.png differ
diff --git a/coldfront/components/site/static/images/8RCUN6C7.png b/coldfront/components/site/static/images/8RCUN6C7.png
new file mode 100644
index 0000000000..f3cb139572
Binary files /dev/null and b/coldfront/components/site/static/images/8RCUN6C7.png differ
diff --git a/coldfront/components/site/static/images/8RRNEDDA.png b/coldfront/components/site/static/images/8RRNEDDA.png
new file mode 100644
index 0000000000..9b54534cd3
Binary files /dev/null and b/coldfront/components/site/static/images/8RRNEDDA.png differ
diff --git a/coldfront/components/site/static/images/8S2EBMZ7.png b/coldfront/components/site/static/images/8S2EBMZ7.png
new file mode 100644
index 0000000000..8eecbf3830
Binary files /dev/null and b/coldfront/components/site/static/images/8S2EBMZ7.png differ
diff --git a/coldfront/components/site/static/images/8T6M6S6K.png b/coldfront/components/site/static/images/8T6M6S6K.png
new file mode 100644
index 0000000000..34bfda8daf
Binary files /dev/null and b/coldfront/components/site/static/images/8T6M6S6K.png differ
diff --git a/coldfront/components/site/static/images/8UZ74UFR.png b/coldfront/components/site/static/images/8UZ74UFR.png
new file mode 100644
index 0000000000..6a003438bf
Binary files /dev/null and b/coldfront/components/site/static/images/8UZ74UFR.png differ
diff --git a/coldfront/components/site/static/images/8WE2QPHC.png b/coldfront/components/site/static/images/8WE2QPHC.png
new file mode 100644
index 0000000000..e683afaf8f
Binary files /dev/null and b/coldfront/components/site/static/images/8WE2QPHC.png differ
diff --git a/coldfront/components/site/static/images/8XWTKDWM.png b/coldfront/components/site/static/images/8XWTKDWM.png
new file mode 100644
index 0000000000..b5b93f0fa2
Binary files /dev/null and b/coldfront/components/site/static/images/8XWTKDWM.png differ
diff --git a/coldfront/components/site/static/images/8Y52LCFK.png b/coldfront/components/site/static/images/8Y52LCFK.png
new file mode 100644
index 0000000000..08ca1d2faa
Binary files /dev/null and b/coldfront/components/site/static/images/8Y52LCFK.png differ
diff --git a/coldfront/components/site/static/images/8Y8MVIY2.png b/coldfront/components/site/static/images/8Y8MVIY2.png
new file mode 100644
index 0000000000..b518b4f018
Binary files /dev/null and b/coldfront/components/site/static/images/8Y8MVIY2.png differ
diff --git a/coldfront/components/site/static/images/92F9W3D3.png b/coldfront/components/site/static/images/92F9W3D3.png
new file mode 100644
index 0000000000..cdf01721c5
Binary files /dev/null and b/coldfront/components/site/static/images/92F9W3D3.png differ
diff --git a/coldfront/components/site/static/images/92MZIFU7.png b/coldfront/components/site/static/images/92MZIFU7.png
new file mode 100644
index 0000000000..0a34285ed1
Binary files /dev/null and b/coldfront/components/site/static/images/92MZIFU7.png differ
diff --git a/coldfront/components/site/static/images/94L9TPEU.png b/coldfront/components/site/static/images/94L9TPEU.png
new file mode 100644
index 0000000000..133206f005
Binary files /dev/null and b/coldfront/components/site/static/images/94L9TPEU.png differ
diff --git a/coldfront/components/site/static/images/973YN44H.png b/coldfront/components/site/static/images/973YN44H.png
new file mode 100644
index 0000000000..6068637c5c
Binary files /dev/null and b/coldfront/components/site/static/images/973YN44H.png differ
diff --git a/coldfront/components/site/static/images/9BSD27GG.png b/coldfront/components/site/static/images/9BSD27GG.png
new file mode 100644
index 0000000000..81f0b1c934
Binary files /dev/null and b/coldfront/components/site/static/images/9BSD27GG.png differ
diff --git a/coldfront/components/site/static/images/9BSYBIRE.png b/coldfront/components/site/static/images/9BSYBIRE.png
new file mode 100644
index 0000000000..5830b248c5
Binary files /dev/null and b/coldfront/components/site/static/images/9BSYBIRE.png differ
diff --git a/coldfront/components/site/static/images/9CM73QYS.png b/coldfront/components/site/static/images/9CM73QYS.png
new file mode 100644
index 0000000000..d7670b29be
Binary files /dev/null and b/coldfront/components/site/static/images/9CM73QYS.png differ
diff --git a/coldfront/components/site/static/images/9CTYZMS5.png b/coldfront/components/site/static/images/9CTYZMS5.png
new file mode 100644
index 0000000000..6c1268c72a
Binary files /dev/null and b/coldfront/components/site/static/images/9CTYZMS5.png differ
diff --git a/coldfront/components/site/static/images/9D4NP5C5.png b/coldfront/components/site/static/images/9D4NP5C5.png
new file mode 100644
index 0000000000..6f66309aa7
Binary files /dev/null and b/coldfront/components/site/static/images/9D4NP5C5.png differ
diff --git a/coldfront/components/site/static/images/9DI2FSK9.png b/coldfront/components/site/static/images/9DI2FSK9.png
new file mode 100644
index 0000000000..f2848412a6
Binary files /dev/null and b/coldfront/components/site/static/images/9DI2FSK9.png differ
diff --git a/coldfront/components/site/static/images/9DQMJ2RR.png b/coldfront/components/site/static/images/9DQMJ2RR.png
new file mode 100644
index 0000000000..b99737013d
Binary files /dev/null and b/coldfront/components/site/static/images/9DQMJ2RR.png differ
diff --git a/coldfront/components/site/static/images/9DXN27DV.png b/coldfront/components/site/static/images/9DXN27DV.png
new file mode 100644
index 0000000000..8d94384de3
Binary files /dev/null and b/coldfront/components/site/static/images/9DXN27DV.png differ
diff --git a/coldfront/components/site/static/images/9EJJQ9KQ.png b/coldfront/components/site/static/images/9EJJQ9KQ.png
new file mode 100644
index 0000000000..98a78ff152
Binary files /dev/null and b/coldfront/components/site/static/images/9EJJQ9KQ.png differ
diff --git a/coldfront/components/site/static/images/9FWNP3TT.png b/coldfront/components/site/static/images/9FWNP3TT.png
new file mode 100644
index 0000000000..bb3d4f1815
Binary files /dev/null and b/coldfront/components/site/static/images/9FWNP3TT.png differ
diff --git a/coldfront/components/site/static/images/9FXQG3GV.png b/coldfront/components/site/static/images/9FXQG3GV.png
new file mode 100644
index 0000000000..ef3ab0105f
Binary files /dev/null and b/coldfront/components/site/static/images/9FXQG3GV.png differ
diff --git a/coldfront/components/site/static/images/9GB3LDXK.png b/coldfront/components/site/static/images/9GB3LDXK.png
new file mode 100644
index 0000000000..58bc2f6b97
Binary files /dev/null and b/coldfront/components/site/static/images/9GB3LDXK.png differ
diff --git a/coldfront/components/site/static/images/9GT48PZK.png b/coldfront/components/site/static/images/9GT48PZK.png
new file mode 100644
index 0000000000..6ccb0fcd5d
Binary files /dev/null and b/coldfront/components/site/static/images/9GT48PZK.png differ
diff --git a/coldfront/components/site/static/images/9GUZZC9W.png b/coldfront/components/site/static/images/9GUZZC9W.png
new file mode 100644
index 0000000000..f43a57bb2c
Binary files /dev/null and b/coldfront/components/site/static/images/9GUZZC9W.png differ
diff --git a/coldfront/components/site/static/images/9HVWR3XF.png b/coldfront/components/site/static/images/9HVWR3XF.png
new file mode 100644
index 0000000000..6c1268c72a
Binary files /dev/null and b/coldfront/components/site/static/images/9HVWR3XF.png differ
diff --git a/coldfront/components/site/static/images/9KQGR8Y4.png b/coldfront/components/site/static/images/9KQGR8Y4.png
new file mode 100644
index 0000000000..b5b93f0fa2
Binary files /dev/null and b/coldfront/components/site/static/images/9KQGR8Y4.png differ
diff --git a/coldfront/components/site/static/images/9L7P3AGI.png b/coldfront/components/site/static/images/9L7P3AGI.png
new file mode 100644
index 0000000000..e33a3bc500
Binary files /dev/null and b/coldfront/components/site/static/images/9L7P3AGI.png differ
diff --git a/coldfront/components/site/static/images/9LCCUIY7.png b/coldfront/components/site/static/images/9LCCUIY7.png
new file mode 100644
index 0000000000..3e47d7f554
Binary files /dev/null and b/coldfront/components/site/static/images/9LCCUIY7.png differ
diff --git a/coldfront/components/site/static/images/9LXEPPYB.png b/coldfront/components/site/static/images/9LXEPPYB.png
new file mode 100644
index 0000000000..e3c4545378
Binary files /dev/null and b/coldfront/components/site/static/images/9LXEPPYB.png differ
diff --git a/coldfront/components/site/static/images/9MDYIGVW.png b/coldfront/components/site/static/images/9MDYIGVW.png
new file mode 100644
index 0000000000..40ccb5156e
Binary files /dev/null and b/coldfront/components/site/static/images/9MDYIGVW.png differ
diff --git a/coldfront/components/site/static/images/9NUU6N7M.png b/coldfront/components/site/static/images/9NUU6N7M.png
new file mode 100644
index 0000000000..76e3fa84d0
Binary files /dev/null and b/coldfront/components/site/static/images/9NUU6N7M.png differ
diff --git a/coldfront/components/site/static/images/9NY3B92X.png b/coldfront/components/site/static/images/9NY3B92X.png
new file mode 100644
index 0000000000..21f57c8a58
Binary files /dev/null and b/coldfront/components/site/static/images/9NY3B92X.png differ
diff --git a/coldfront/components/site/static/images/9P4PDPAK.png b/coldfront/components/site/static/images/9P4PDPAK.png
new file mode 100644
index 0000000000..3bfacb0a2a
Binary files /dev/null and b/coldfront/components/site/static/images/9P4PDPAK.png differ
diff --git a/coldfront/components/site/static/images/9PAFQJJB.png b/coldfront/components/site/static/images/9PAFQJJB.png
new file mode 100644
index 0000000000..7a6b5fe19c
Binary files /dev/null and b/coldfront/components/site/static/images/9PAFQJJB.png differ
diff --git a/coldfront/components/site/static/images/9PMF953D.png b/coldfront/components/site/static/images/9PMF953D.png
new file mode 100644
index 0000000000..7a644c53de
Binary files /dev/null and b/coldfront/components/site/static/images/9PMF953D.png differ
diff --git a/coldfront/components/site/static/images/9RBE84RU.png b/coldfront/components/site/static/images/9RBE84RU.png
new file mode 100644
index 0000000000..029b10f6b4
Binary files /dev/null and b/coldfront/components/site/static/images/9RBE84RU.png differ
diff --git a/coldfront/components/site/static/images/9RL848QN.png b/coldfront/components/site/static/images/9RL848QN.png
new file mode 100644
index 0000000000..6500c3f47d
Binary files /dev/null and b/coldfront/components/site/static/images/9RL848QN.png differ
diff --git a/coldfront/components/site/static/images/9SS95WT9.png b/coldfront/components/site/static/images/9SS95WT9.png
new file mode 100644
index 0000000000..1e34fda25d
Binary files /dev/null and b/coldfront/components/site/static/images/9SS95WT9.png differ
diff --git a/coldfront/components/site/static/images/9SYESS76.png b/coldfront/components/site/static/images/9SYESS76.png
new file mode 100644
index 0000000000..64f1b89760
Binary files /dev/null and b/coldfront/components/site/static/images/9SYESS76.png differ
diff --git a/coldfront/components/site/static/images/9US2KXIA.png b/coldfront/components/site/static/images/9US2KXIA.png
new file mode 100644
index 0000000000..ef8a6f4c03
Binary files /dev/null and b/coldfront/components/site/static/images/9US2KXIA.png differ
diff --git a/coldfront/components/site/static/images/9WCFPW23.png b/coldfront/components/site/static/images/9WCFPW23.png
new file mode 100644
index 0000000000..f6e67c7177
Binary files /dev/null and b/coldfront/components/site/static/images/9WCFPW23.png differ
diff --git a/coldfront/components/site/static/images/9WPIWWVE.png b/coldfront/components/site/static/images/9WPIWWVE.png
new file mode 100644
index 0000000000..aa35bdba58
Binary files /dev/null and b/coldfront/components/site/static/images/9WPIWWVE.png differ
diff --git a/coldfront/components/site/static/images/9WU9RYBY.png b/coldfront/components/site/static/images/9WU9RYBY.png
new file mode 100644
index 0000000000..2973617d48
Binary files /dev/null and b/coldfront/components/site/static/images/9WU9RYBY.png differ
diff --git a/coldfront/components/site/static/images/9YFC9YHD.png b/coldfront/components/site/static/images/9YFC9YHD.png
new file mode 100644
index 0000000000..3e4b537269
Binary files /dev/null and b/coldfront/components/site/static/images/9YFC9YHD.png differ
diff --git a/coldfront/components/site/static/images/A2N2AF2H.png b/coldfront/components/site/static/images/A2N2AF2H.png
new file mode 100644
index 0000000000..34bfda8daf
Binary files /dev/null and b/coldfront/components/site/static/images/A2N2AF2H.png differ
diff --git a/coldfront/components/site/static/images/A4R42GL5.png b/coldfront/components/site/static/images/A4R42GL5.png
new file mode 100644
index 0000000000..acc8fd6024
Binary files /dev/null and b/coldfront/components/site/static/images/A4R42GL5.png differ
diff --git a/coldfront/components/site/static/images/A6SC3KES.png b/coldfront/components/site/static/images/A6SC3KES.png
new file mode 100644
index 0000000000..fe3ab38817
Binary files /dev/null and b/coldfront/components/site/static/images/A6SC3KES.png differ
diff --git a/coldfront/components/site/static/images/A7EBGDD9.png b/coldfront/components/site/static/images/A7EBGDD9.png
new file mode 100644
index 0000000000..13566367ad
Binary files /dev/null and b/coldfront/components/site/static/images/A7EBGDD9.png differ
diff --git a/coldfront/components/site/static/images/A7ZXIBEY.png b/coldfront/components/site/static/images/A7ZXIBEY.png
new file mode 100644
index 0000000000..3340bc2d82
Binary files /dev/null and b/coldfront/components/site/static/images/A7ZXIBEY.png differ
diff --git a/coldfront/components/site/static/images/A87CQITG.png b/coldfront/components/site/static/images/A87CQITG.png
new file mode 100644
index 0000000000..3cd3d658b6
Binary files /dev/null and b/coldfront/components/site/static/images/A87CQITG.png differ
diff --git a/coldfront/components/site/static/images/AAJJPQR8.png b/coldfront/components/site/static/images/AAJJPQR8.png
new file mode 100644
index 0000000000..1e34fda25d
Binary files /dev/null and b/coldfront/components/site/static/images/AAJJPQR8.png differ
diff --git a/coldfront/components/site/static/images/ADPMM7YG.png b/coldfront/components/site/static/images/ADPMM7YG.png
new file mode 100644
index 0000000000..e90618c25f
Binary files /dev/null and b/coldfront/components/site/static/images/ADPMM7YG.png differ
diff --git a/coldfront/components/site/static/images/AGMJQWGP.png b/coldfront/components/site/static/images/AGMJQWGP.png
new file mode 100644
index 0000000000..4298e86eea
Binary files /dev/null and b/coldfront/components/site/static/images/AGMJQWGP.png differ
diff --git a/coldfront/components/site/static/images/AJ3NDHGB.png b/coldfront/components/site/static/images/AJ3NDHGB.png
new file mode 100644
index 0000000000..84907da0a7
Binary files /dev/null and b/coldfront/components/site/static/images/AJ3NDHGB.png differ
diff --git a/coldfront/components/site/static/images/AKIZ547W.png b/coldfront/components/site/static/images/AKIZ547W.png
new file mode 100644
index 0000000000..62d33b4887
Binary files /dev/null and b/coldfront/components/site/static/images/AKIZ547W.png differ
diff --git a/coldfront/components/site/static/images/ALB6ESQR.png b/coldfront/components/site/static/images/ALB6ESQR.png
new file mode 100644
index 0000000000..76f899f404
Binary files /dev/null and b/coldfront/components/site/static/images/ALB6ESQR.png differ
diff --git a/coldfront/components/site/static/images/ANUITDTM.png b/coldfront/components/site/static/images/ANUITDTM.png
new file mode 100644
index 0000000000..65530491d6
Binary files /dev/null and b/coldfront/components/site/static/images/ANUITDTM.png differ
diff --git a/coldfront/components/site/static/images/AR327GT6.png b/coldfront/components/site/static/images/AR327GT6.png
new file mode 100644
index 0000000000..3cd3d658b6
Binary files /dev/null and b/coldfront/components/site/static/images/AR327GT6.png differ
diff --git a/coldfront/components/site/static/images/ASWQ7FVU.png b/coldfront/components/site/static/images/ASWQ7FVU.png
new file mode 100644
index 0000000000..35c8c8fd80
Binary files /dev/null and b/coldfront/components/site/static/images/ASWQ7FVU.png differ
diff --git a/coldfront/components/site/static/images/ASYJNGAJ.png b/coldfront/components/site/static/images/ASYJNGAJ.png
new file mode 100644
index 0000000000..fc09317bb1
Binary files /dev/null and b/coldfront/components/site/static/images/ASYJNGAJ.png differ
diff --git a/coldfront/components/site/static/images/AWLDKHJG.png b/coldfront/components/site/static/images/AWLDKHJG.png
new file mode 100644
index 0000000000..653959ecd5
Binary files /dev/null and b/coldfront/components/site/static/images/AWLDKHJG.png differ
diff --git a/coldfront/components/site/static/images/AWYBFKST.png b/coldfront/components/site/static/images/AWYBFKST.png
new file mode 100644
index 0000000000..683a53ab10
Binary files /dev/null and b/coldfront/components/site/static/images/AWYBFKST.png differ
diff --git a/coldfront/components/site/static/images/AX7FNLFS.png b/coldfront/components/site/static/images/AX7FNLFS.png
new file mode 100644
index 0000000000..f92cff2258
Binary files /dev/null and b/coldfront/components/site/static/images/AX7FNLFS.png differ
diff --git a/coldfront/components/site/static/images/AXVFLDFP.png b/coldfront/components/site/static/images/AXVFLDFP.png
new file mode 100644
index 0000000000..15f0bf53a2
Binary files /dev/null and b/coldfront/components/site/static/images/AXVFLDFP.png differ
diff --git a/coldfront/components/site/static/images/AYYQU9KY.png b/coldfront/components/site/static/images/AYYQU9KY.png
new file mode 100644
index 0000000000..b99ba51d6d
Binary files /dev/null and b/coldfront/components/site/static/images/AYYQU9KY.png differ
diff --git a/coldfront/components/site/static/images/AZCSAFZK.png b/coldfront/components/site/static/images/AZCSAFZK.png
new file mode 100644
index 0000000000..6707fe9853
Binary files /dev/null and b/coldfront/components/site/static/images/AZCSAFZK.png differ
diff --git a/coldfront/components/site/static/images/AZDLRC32.png b/coldfront/components/site/static/images/AZDLRC32.png
new file mode 100644
index 0000000000..baefa2be07
Binary files /dev/null and b/coldfront/components/site/static/images/AZDLRC32.png differ
diff --git a/coldfront/components/site/static/images/AZHNAVJE.png b/coldfront/components/site/static/images/AZHNAVJE.png
new file mode 100644
index 0000000000..82a31f5da4
Binary files /dev/null and b/coldfront/components/site/static/images/AZHNAVJE.png differ
diff --git a/coldfront/components/site/static/images/AZVAA72P.png b/coldfront/components/site/static/images/AZVAA72P.png
new file mode 100644
index 0000000000..52d46e5db9
Binary files /dev/null and b/coldfront/components/site/static/images/AZVAA72P.png differ
diff --git a/coldfront/components/site/static/images/B34K6AUA.png b/coldfront/components/site/static/images/B34K6AUA.png
new file mode 100644
index 0000000000..1a7f0d9825
Binary files /dev/null and b/coldfront/components/site/static/images/B34K6AUA.png differ
diff --git a/coldfront/components/site/static/images/B3YXV5D9.png b/coldfront/components/site/static/images/B3YXV5D9.png
new file mode 100644
index 0000000000..a0a0eb0fe6
Binary files /dev/null and b/coldfront/components/site/static/images/B3YXV5D9.png differ
diff --git a/coldfront/components/site/static/images/B59MPAXA.png b/coldfront/components/site/static/images/B59MPAXA.png
new file mode 100644
index 0000000000..3fbc4db220
Binary files /dev/null and b/coldfront/components/site/static/images/B59MPAXA.png differ
diff --git a/coldfront/components/site/static/images/B62VMAML.png b/coldfront/components/site/static/images/B62VMAML.png
new file mode 100644
index 0000000000..f52c5924e0
Binary files /dev/null and b/coldfront/components/site/static/images/B62VMAML.png differ
diff --git a/coldfront/components/site/static/images/B74LZ9SH.png b/coldfront/components/site/static/images/B74LZ9SH.png
new file mode 100644
index 0000000000..4b6bdcb21e
Binary files /dev/null and b/coldfront/components/site/static/images/B74LZ9SH.png differ
diff --git a/coldfront/components/site/static/images/B7FE8EFG.png b/coldfront/components/site/static/images/B7FE8EFG.png
new file mode 100644
index 0000000000..acc8fd6024
Binary files /dev/null and b/coldfront/components/site/static/images/B7FE8EFG.png differ
diff --git a/coldfront/components/site/static/images/B8QWSHUJ.png b/coldfront/components/site/static/images/B8QWSHUJ.png
new file mode 100644
index 0000000000..aa35bdba58
Binary files /dev/null and b/coldfront/components/site/static/images/B8QWSHUJ.png differ
diff --git a/coldfront/components/site/static/images/B9LWJQ3X.png b/coldfront/components/site/static/images/B9LWJQ3X.png
new file mode 100644
index 0000000000..c40ce0bdc1
Binary files /dev/null and b/coldfront/components/site/static/images/B9LWJQ3X.png differ
diff --git a/coldfront/components/site/static/images/B9UCXYTT.png b/coldfront/components/site/static/images/B9UCXYTT.png
new file mode 100644
index 0000000000..876059d1ff
Binary files /dev/null and b/coldfront/components/site/static/images/B9UCXYTT.png differ
diff --git a/coldfront/components/site/static/images/BCVRVD9K.png b/coldfront/components/site/static/images/BCVRVD9K.png
new file mode 100644
index 0000000000..9b724eea83
Binary files /dev/null and b/coldfront/components/site/static/images/BCVRVD9K.png differ
diff --git a/coldfront/components/site/static/images/BDDKS3GX.png b/coldfront/components/site/static/images/BDDKS3GX.png
new file mode 100644
index 0000000000..f851f6daf3
Binary files /dev/null and b/coldfront/components/site/static/images/BDDKS3GX.png differ
diff --git a/coldfront/components/site/static/images/BEYXLBNC.png b/coldfront/components/site/static/images/BEYXLBNC.png
new file mode 100644
index 0000000000..3aff5e9650
Binary files /dev/null and b/coldfront/components/site/static/images/BEYXLBNC.png differ
diff --git a/coldfront/components/site/static/images/BFI7NIJ8.png b/coldfront/components/site/static/images/BFI7NIJ8.png
new file mode 100644
index 0000000000..c4aca8e6b7
Binary files /dev/null and b/coldfront/components/site/static/images/BFI7NIJ8.png differ
diff --git a/coldfront/components/site/static/images/BFU4HD4N.png b/coldfront/components/site/static/images/BFU4HD4N.png
new file mode 100644
index 0000000000..311db9b1a3
Binary files /dev/null and b/coldfront/components/site/static/images/BFU4HD4N.png differ
diff --git a/coldfront/components/site/static/images/BGIX8CE5.png b/coldfront/components/site/static/images/BGIX8CE5.png
new file mode 100644
index 0000000000..cbf411fb7e
Binary files /dev/null and b/coldfront/components/site/static/images/BGIX8CE5.png differ
diff --git a/coldfront/components/site/static/images/BGQAI2D9.png b/coldfront/components/site/static/images/BGQAI2D9.png
new file mode 100644
index 0000000000..d89fcd4b1c
Binary files /dev/null and b/coldfront/components/site/static/images/BGQAI2D9.png differ
diff --git a/coldfront/components/site/static/images/BHNQ9G4T.png b/coldfront/components/site/static/images/BHNQ9G4T.png
new file mode 100644
index 0000000000..171bd89291
Binary files /dev/null and b/coldfront/components/site/static/images/BHNQ9G4T.png differ
diff --git a/coldfront/components/site/static/images/BIP7WFHS.png b/coldfront/components/site/static/images/BIP7WFHS.png
new file mode 100644
index 0000000000..d0fbfd3100
Binary files /dev/null and b/coldfront/components/site/static/images/BIP7WFHS.png differ
diff --git a/coldfront/components/site/static/images/BJ7ATIFV.png b/coldfront/components/site/static/images/BJ7ATIFV.png
new file mode 100644
index 0000000000..55f12f5a34
Binary files /dev/null and b/coldfront/components/site/static/images/BJ7ATIFV.png differ
diff --git a/coldfront/components/site/static/images/BKLISHDE.png b/coldfront/components/site/static/images/BKLISHDE.png
new file mode 100644
index 0000000000..5830b248c5
Binary files /dev/null and b/coldfront/components/site/static/images/BKLISHDE.png differ
diff --git a/coldfront/components/site/static/images/BNQ3IPAL.png b/coldfront/components/site/static/images/BNQ3IPAL.png
new file mode 100644
index 0000000000..0a34285ed1
Binary files /dev/null and b/coldfront/components/site/static/images/BNQ3IPAL.png differ
diff --git a/coldfront/components/site/static/images/BQAUXP89.png b/coldfront/components/site/static/images/BQAUXP89.png
new file mode 100644
index 0000000000..5f4ffa13b2
Binary files /dev/null and b/coldfront/components/site/static/images/BQAUXP89.png differ
diff --git a/coldfront/components/site/static/images/BQDPD5Z5.png b/coldfront/components/site/static/images/BQDPD5Z5.png
new file mode 100644
index 0000000000..5f4ffa13b2
Binary files /dev/null and b/coldfront/components/site/static/images/BQDPD5Z5.png differ
diff --git a/coldfront/components/site/static/images/BS4PMN9P.png b/coldfront/components/site/static/images/BS4PMN9P.png
new file mode 100644
index 0000000000..0742e0f5ca
Binary files /dev/null and b/coldfront/components/site/static/images/BS4PMN9P.png differ
diff --git a/coldfront/components/site/static/images/BT873DV2.png b/coldfront/components/site/static/images/BT873DV2.png
new file mode 100644
index 0000000000..135873755e
Binary files /dev/null and b/coldfront/components/site/static/images/BT873DV2.png differ
diff --git a/coldfront/components/site/static/images/BTFRKQRH.png b/coldfront/components/site/static/images/BTFRKQRH.png
new file mode 100644
index 0000000000..7179d8563a
Binary files /dev/null and b/coldfront/components/site/static/images/BTFRKQRH.png differ
diff --git a/coldfront/components/site/static/images/BVX8SKQ2.png b/coldfront/components/site/static/images/BVX8SKQ2.png
new file mode 100644
index 0000000000..5a3c4c19d9
Binary files /dev/null and b/coldfront/components/site/static/images/BVX8SKQ2.png differ
diff --git a/coldfront/components/site/static/images/BWJ3GQ8J.png b/coldfront/components/site/static/images/BWJ3GQ8J.png
new file mode 100644
index 0000000000..ef3ab0105f
Binary files /dev/null and b/coldfront/components/site/static/images/BWJ3GQ8J.png differ
diff --git a/coldfront/components/site/static/images/BWMIG7D3.png b/coldfront/components/site/static/images/BWMIG7D3.png
new file mode 100644
index 0000000000..b99ba51d6d
Binary files /dev/null and b/coldfront/components/site/static/images/BWMIG7D3.png differ
diff --git a/coldfront/components/site/static/images/BXE3T2EV.png b/coldfront/components/site/static/images/BXE3T2EV.png
new file mode 100644
index 0000000000..fd7f99a05e
Binary files /dev/null and b/coldfront/components/site/static/images/BXE3T2EV.png differ
diff --git a/coldfront/components/site/static/images/BY6LLRHL.png b/coldfront/components/site/static/images/BY6LLRHL.png
new file mode 100644
index 0000000000..e6011829ce
Binary files /dev/null and b/coldfront/components/site/static/images/BY6LLRHL.png differ
diff --git a/coldfront/components/site/static/images/BZ2FUFAT.png b/coldfront/components/site/static/images/BZ2FUFAT.png
new file mode 100644
index 0000000000..57e5af7315
Binary files /dev/null and b/coldfront/components/site/static/images/BZ2FUFAT.png differ
diff --git a/coldfront/components/site/static/images/C3I6K9XQ.png b/coldfront/components/site/static/images/C3I6K9XQ.png
new file mode 100644
index 0000000000..0e8129bd09
Binary files /dev/null and b/coldfront/components/site/static/images/C3I6K9XQ.png differ
diff --git a/coldfront/components/site/static/images/C6Y8WDLR.png b/coldfront/components/site/static/images/C6Y8WDLR.png
new file mode 100644
index 0000000000..5a3255930c
Binary files /dev/null and b/coldfront/components/site/static/images/C6Y8WDLR.png differ
diff --git a/coldfront/components/site/static/images/C7WV2ZB2.png b/coldfront/components/site/static/images/C7WV2ZB2.png
new file mode 100644
index 0000000000..2fe4a54390
Binary files /dev/null and b/coldfront/components/site/static/images/C7WV2ZB2.png differ
diff --git a/coldfront/components/site/static/images/C8GNXCHN.png b/coldfront/components/site/static/images/C8GNXCHN.png
new file mode 100644
index 0000000000..4ec61b28b8
Binary files /dev/null and b/coldfront/components/site/static/images/C8GNXCHN.png differ
diff --git a/coldfront/components/site/static/images/C8H8ADK2.png b/coldfront/components/site/static/images/C8H8ADK2.png
new file mode 100644
index 0000000000..3bfacb0a2a
Binary files /dev/null and b/coldfront/components/site/static/images/C8H8ADK2.png differ
diff --git a/coldfront/components/site/static/images/CBNRFL9H.png b/coldfront/components/site/static/images/CBNRFL9H.png
new file mode 100644
index 0000000000..ef3ab0105f
Binary files /dev/null and b/coldfront/components/site/static/images/CBNRFL9H.png differ
diff --git a/coldfront/components/site/static/images/CEJECQ92.png b/coldfront/components/site/static/images/CEJECQ92.png
new file mode 100644
index 0000000000..7670107ffa
Binary files /dev/null and b/coldfront/components/site/static/images/CEJECQ92.png differ
diff --git a/coldfront/components/site/static/images/CEJRUBPK.png b/coldfront/components/site/static/images/CEJRUBPK.png
new file mode 100644
index 0000000000..1a7f0d9825
Binary files /dev/null and b/coldfront/components/site/static/images/CEJRUBPK.png differ
diff --git a/coldfront/components/site/static/images/CF6ENJYZ.png b/coldfront/components/site/static/images/CF6ENJYZ.png
new file mode 100644
index 0000000000..1c73c1a6b3
Binary files /dev/null and b/coldfront/components/site/static/images/CF6ENJYZ.png differ
diff --git a/coldfront/components/site/static/images/CFEPHH3N.png b/coldfront/components/site/static/images/CFEPHH3N.png
new file mode 100644
index 0000000000..029b10f6b4
Binary files /dev/null and b/coldfront/components/site/static/images/CFEPHH3N.png differ
diff --git a/coldfront/components/site/static/images/CGM5TKEQ.png b/coldfront/components/site/static/images/CGM5TKEQ.png
new file mode 100644
index 0000000000..92831b857c
Binary files /dev/null and b/coldfront/components/site/static/images/CGM5TKEQ.png differ
diff --git a/coldfront/components/site/static/images/CHZ3TQLG.png b/coldfront/components/site/static/images/CHZ3TQLG.png
new file mode 100644
index 0000000000..1785597487
Binary files /dev/null and b/coldfront/components/site/static/images/CHZ3TQLG.png differ
diff --git a/coldfront/components/site/static/images/CJ8HSHM8.png b/coldfront/components/site/static/images/CJ8HSHM8.png
new file mode 100644
index 0000000000..a77e0cea9e
Binary files /dev/null and b/coldfront/components/site/static/images/CJ8HSHM8.png differ
diff --git a/coldfront/components/site/static/images/CJACLNAC.png b/coldfront/components/site/static/images/CJACLNAC.png
new file mode 100644
index 0000000000..4b66548ac4
Binary files /dev/null and b/coldfront/components/site/static/images/CJACLNAC.png differ
diff --git a/coldfront/components/site/static/images/CJJTDQGF.png b/coldfront/components/site/static/images/CJJTDQGF.png
new file mode 100644
index 0000000000..e92b4a6f08
Binary files /dev/null and b/coldfront/components/site/static/images/CJJTDQGF.png differ
diff --git a/coldfront/components/site/static/images/CLAICFRK.png b/coldfront/components/site/static/images/CLAICFRK.png
new file mode 100644
index 0000000000..7f6d44ffb8
Binary files /dev/null and b/coldfront/components/site/static/images/CLAICFRK.png differ
diff --git a/coldfront/components/site/static/images/CLGTUG3P.png b/coldfront/components/site/static/images/CLGTUG3P.png
new file mode 100644
index 0000000000..8448f95fa2
Binary files /dev/null and b/coldfront/components/site/static/images/CLGTUG3P.png differ
diff --git a/coldfront/components/site/static/images/CLZGG4XE.png b/coldfront/components/site/static/images/CLZGG4XE.png
new file mode 100644
index 0000000000..4227d370b0
Binary files /dev/null and b/coldfront/components/site/static/images/CLZGG4XE.png differ
diff --git a/coldfront/components/site/static/images/CM9HBV3S.png b/coldfront/components/site/static/images/CM9HBV3S.png
new file mode 100644
index 0000000000..0742e0f5ca
Binary files /dev/null and b/coldfront/components/site/static/images/CM9HBV3S.png differ
diff --git a/coldfront/components/site/static/images/CPDI2MLB.png b/coldfront/components/site/static/images/CPDI2MLB.png
new file mode 100644
index 0000000000..34023b8c71
Binary files /dev/null and b/coldfront/components/site/static/images/CPDI2MLB.png differ
diff --git a/coldfront/components/site/static/images/CS8FALBN.png b/coldfront/components/site/static/images/CS8FALBN.png
new file mode 100644
index 0000000000..330f72107b
Binary files /dev/null and b/coldfront/components/site/static/images/CS8FALBN.png differ
diff --git a/coldfront/components/site/static/images/CSARASIE.png b/coldfront/components/site/static/images/CSARASIE.png
new file mode 100644
index 0000000000..da87e19a87
Binary files /dev/null and b/coldfront/components/site/static/images/CSARASIE.png differ
diff --git a/coldfront/components/site/static/images/CSVLMUL2.png b/coldfront/components/site/static/images/CSVLMUL2.png
new file mode 100644
index 0000000000..34bfda8daf
Binary files /dev/null and b/coldfront/components/site/static/images/CSVLMUL2.png differ
diff --git a/coldfront/components/site/static/images/CTNUJ9X4.png b/coldfront/components/site/static/images/CTNUJ9X4.png
new file mode 100644
index 0000000000..784c11638b
Binary files /dev/null and b/coldfront/components/site/static/images/CTNUJ9X4.png differ
diff --git a/coldfront/components/site/static/images/CWABLAYY.png b/coldfront/components/site/static/images/CWABLAYY.png
new file mode 100644
index 0000000000..562495645d
Binary files /dev/null and b/coldfront/components/site/static/images/CWABLAYY.png differ
diff --git a/coldfront/components/site/static/images/CWDYSJNK.png b/coldfront/components/site/static/images/CWDYSJNK.png
new file mode 100644
index 0000000000..ef2f02820e
Binary files /dev/null and b/coldfront/components/site/static/images/CWDYSJNK.png differ
diff --git a/coldfront/components/site/static/images/CY2FL47H.png b/coldfront/components/site/static/images/CY2FL47H.png
new file mode 100644
index 0000000000..555dd70f4c
Binary files /dev/null and b/coldfront/components/site/static/images/CY2FL47H.png differ
diff --git a/coldfront/components/site/static/images/CY4626ZJ.png b/coldfront/components/site/static/images/CY4626ZJ.png
new file mode 100644
index 0000000000..2a2fe10d02
Binary files /dev/null and b/coldfront/components/site/static/images/CY4626ZJ.png differ
diff --git a/coldfront/components/site/static/images/CZBBLUAH.png b/coldfront/components/site/static/images/CZBBLUAH.png
new file mode 100644
index 0000000000..e818cb005a
Binary files /dev/null and b/coldfront/components/site/static/images/CZBBLUAH.png differ
diff --git a/coldfront/components/site/static/images/CZDDFQD5.png b/coldfront/components/site/static/images/CZDDFQD5.png
new file mode 100644
index 0000000000..713aaeb93b
Binary files /dev/null and b/coldfront/components/site/static/images/CZDDFQD5.png differ
diff --git a/coldfront/components/site/static/images/CZVPPMEN.png b/coldfront/components/site/static/images/CZVPPMEN.png
new file mode 100644
index 0000000000..ea435f1cde
Binary files /dev/null and b/coldfront/components/site/static/images/CZVPPMEN.png differ
diff --git a/coldfront/components/site/static/images/D26U77IQ.png b/coldfront/components/site/static/images/D26U77IQ.png
new file mode 100644
index 0000000000..8b8a88e747
Binary files /dev/null and b/coldfront/components/site/static/images/D26U77IQ.png differ
diff --git a/coldfront/components/site/static/images/D2RJ6L8M.png b/coldfront/components/site/static/images/D2RJ6L8M.png
new file mode 100644
index 0000000000..12235a0f8b
Binary files /dev/null and b/coldfront/components/site/static/images/D2RJ6L8M.png differ
diff --git a/coldfront/components/site/static/images/D4TWK2RB.png b/coldfront/components/site/static/images/D4TWK2RB.png
new file mode 100644
index 0000000000..23de4e9bfe
Binary files /dev/null and b/coldfront/components/site/static/images/D4TWK2RB.png differ
diff --git a/coldfront/components/site/static/images/D4ZNFI2W.png b/coldfront/components/site/static/images/D4ZNFI2W.png
new file mode 100644
index 0000000000..7bcf62059b
Binary files /dev/null and b/coldfront/components/site/static/images/D4ZNFI2W.png differ
diff --git a/coldfront/components/site/static/images/D56NWMIT.png b/coldfront/components/site/static/images/D56NWMIT.png
new file mode 100644
index 0000000000..a1f812c902
Binary files /dev/null and b/coldfront/components/site/static/images/D56NWMIT.png differ
diff --git a/coldfront/components/site/static/images/D57YR9CX.png b/coldfront/components/site/static/images/D57YR9CX.png
new file mode 100644
index 0000000000..6500c3f47d
Binary files /dev/null and b/coldfront/components/site/static/images/D57YR9CX.png differ
diff --git a/coldfront/components/site/static/images/D6P54Y6L.png b/coldfront/components/site/static/images/D6P54Y6L.png
new file mode 100644
index 0000000000..3d8a31f65e
Binary files /dev/null and b/coldfront/components/site/static/images/D6P54Y6L.png differ
diff --git a/coldfront/components/site/static/images/D8S5YNWF.png b/coldfront/components/site/static/images/D8S5YNWF.png
new file mode 100644
index 0000000000..5b2414ea83
Binary files /dev/null and b/coldfront/components/site/static/images/D8S5YNWF.png differ
diff --git a/coldfront/components/site/static/images/D9ZPUZRM.png b/coldfront/components/site/static/images/D9ZPUZRM.png
new file mode 100644
index 0000000000..4ec61b28b8
Binary files /dev/null and b/coldfront/components/site/static/images/D9ZPUZRM.png differ
diff --git a/coldfront/components/site/static/images/DA69QJCH.png b/coldfront/components/site/static/images/DA69QJCH.png
new file mode 100644
index 0000000000..c867f557e6
Binary files /dev/null and b/coldfront/components/site/static/images/DA69QJCH.png differ
diff --git a/coldfront/components/site/static/images/DATERCB8.png b/coldfront/components/site/static/images/DATERCB8.png
new file mode 100644
index 0000000000..6308970762
Binary files /dev/null and b/coldfront/components/site/static/images/DATERCB8.png differ
diff --git a/coldfront/components/site/static/images/DAUQLN9E.png b/coldfront/components/site/static/images/DAUQLN9E.png
new file mode 100644
index 0000000000..dbcd5b139c
Binary files /dev/null and b/coldfront/components/site/static/images/DAUQLN9E.png differ
diff --git a/coldfront/components/site/static/images/DAY2NW2S.png b/coldfront/components/site/static/images/DAY2NW2S.png
new file mode 100644
index 0000000000..9b54534cd3
Binary files /dev/null and b/coldfront/components/site/static/images/DAY2NW2S.png differ
diff --git a/coldfront/components/site/static/images/DCFSHTKP.png b/coldfront/components/site/static/images/DCFSHTKP.png
new file mode 100644
index 0000000000..fb59c01f3d
Binary files /dev/null and b/coldfront/components/site/static/images/DCFSHTKP.png differ
diff --git a/coldfront/components/site/static/images/DCTEYWSQ.png b/coldfront/components/site/static/images/DCTEYWSQ.png
new file mode 100644
index 0000000000..dbb5302789
Binary files /dev/null and b/coldfront/components/site/static/images/DCTEYWSQ.png differ
diff --git a/coldfront/components/site/static/images/DDCEDMUH.png b/coldfront/components/site/static/images/DDCEDMUH.png
new file mode 100644
index 0000000000..70ce30ccf9
Binary files /dev/null and b/coldfront/components/site/static/images/DDCEDMUH.png differ
diff --git a/coldfront/components/site/static/images/DDIL27IR.png b/coldfront/components/site/static/images/DDIL27IR.png
new file mode 100644
index 0000000000..e8dabfbdb3
Binary files /dev/null and b/coldfront/components/site/static/images/DDIL27IR.png differ
diff --git a/coldfront/components/site/static/images/DDWWESR6.png b/coldfront/components/site/static/images/DDWWESR6.png
new file mode 100644
index 0000000000..7e3a4ab48c
Binary files /dev/null and b/coldfront/components/site/static/images/DDWWESR6.png differ
diff --git a/coldfront/components/site/static/images/DEVD3RV5.png b/coldfront/components/site/static/images/DEVD3RV5.png
new file mode 100644
index 0000000000..1e841e7c76
Binary files /dev/null and b/coldfront/components/site/static/images/DEVD3RV5.png differ
diff --git a/coldfront/components/site/static/images/DF3YS8TM.png b/coldfront/components/site/static/images/DF3YS8TM.png
new file mode 100644
index 0000000000..ce19508d8a
Binary files /dev/null and b/coldfront/components/site/static/images/DF3YS8TM.png differ
diff --git a/coldfront/components/site/static/images/DHN7HH6N.png b/coldfront/components/site/static/images/DHN7HH6N.png
new file mode 100644
index 0000000000..2b44d55a6b
Binary files /dev/null and b/coldfront/components/site/static/images/DHN7HH6N.png differ
diff --git a/coldfront/components/site/static/images/DIMJTVYK.png b/coldfront/components/site/static/images/DIMJTVYK.png
new file mode 100644
index 0000000000..0f0825e4fc
Binary files /dev/null and b/coldfront/components/site/static/images/DIMJTVYK.png differ
diff --git a/coldfront/components/site/static/images/DIQM7U4A.png b/coldfront/components/site/static/images/DIQM7U4A.png
new file mode 100644
index 0000000000..5b2414ea83
Binary files /dev/null and b/coldfront/components/site/static/images/DIQM7U4A.png differ
diff --git a/coldfront/components/site/static/images/DKD6QN2A.png b/coldfront/components/site/static/images/DKD6QN2A.png
new file mode 100644
index 0000000000..0549785b0b
Binary files /dev/null and b/coldfront/components/site/static/images/DKD6QN2A.png differ
diff --git a/coldfront/components/site/static/images/DKZ5RCL8.png b/coldfront/components/site/static/images/DKZ5RCL8.png
new file mode 100644
index 0000000000..7f1440e98d
Binary files /dev/null and b/coldfront/components/site/static/images/DKZ5RCL8.png differ
diff --git a/coldfront/components/site/static/images/DLGWWGMD.png b/coldfront/components/site/static/images/DLGWWGMD.png
new file mode 100644
index 0000000000..37c8c8fd69
Binary files /dev/null and b/coldfront/components/site/static/images/DLGWWGMD.png differ
diff --git a/coldfront/components/site/static/images/DNGWEZUI.png b/coldfront/components/site/static/images/DNGWEZUI.png
new file mode 100644
index 0000000000..532bd32515
Binary files /dev/null and b/coldfront/components/site/static/images/DNGWEZUI.png differ
diff --git a/coldfront/components/site/static/images/DNL8J4AL.png b/coldfront/components/site/static/images/DNL8J4AL.png
new file mode 100644
index 0000000000..7670107ffa
Binary files /dev/null and b/coldfront/components/site/static/images/DNL8J4AL.png differ
diff --git a/coldfront/components/site/static/images/DNPE7YUN.png b/coldfront/components/site/static/images/DNPE7YUN.png
new file mode 100644
index 0000000000..f745165658
Binary files /dev/null and b/coldfront/components/site/static/images/DNPE7YUN.png differ
diff --git a/coldfront/components/site/static/images/DP9Z3NWV.png b/coldfront/components/site/static/images/DP9Z3NWV.png
new file mode 100644
index 0000000000..bc4560bad6
Binary files /dev/null and b/coldfront/components/site/static/images/DP9Z3NWV.png differ
diff --git a/coldfront/components/site/static/images/DRCLU9B7.png b/coldfront/components/site/static/images/DRCLU9B7.png
new file mode 100644
index 0000000000..57631cca92
Binary files /dev/null and b/coldfront/components/site/static/images/DRCLU9B7.png differ
diff --git a/coldfront/components/site/static/images/DRQGZBM6.png b/coldfront/components/site/static/images/DRQGZBM6.png
new file mode 100644
index 0000000000..60a0a26309
Binary files /dev/null and b/coldfront/components/site/static/images/DRQGZBM6.png differ
diff --git a/coldfront/components/site/static/images/DSJBXVPF.png b/coldfront/components/site/static/images/DSJBXVPF.png
new file mode 100644
index 0000000000..f61798571f
Binary files /dev/null and b/coldfront/components/site/static/images/DSJBXVPF.png differ
diff --git a/coldfront/components/site/static/images/DVDRZUSH.png b/coldfront/components/site/static/images/DVDRZUSH.png
new file mode 100644
index 0000000000..2a5a552d29
Binary files /dev/null and b/coldfront/components/site/static/images/DVDRZUSH.png differ
diff --git a/coldfront/components/site/static/images/DW9B9SIJ.png b/coldfront/components/site/static/images/DW9B9SIJ.png
new file mode 100644
index 0000000000..da1e3d239b
Binary files /dev/null and b/coldfront/components/site/static/images/DW9B9SIJ.png differ
diff --git a/coldfront/components/site/static/images/DWAMQRCB.png b/coldfront/components/site/static/images/DWAMQRCB.png
new file mode 100644
index 0000000000..92831b857c
Binary files /dev/null and b/coldfront/components/site/static/images/DWAMQRCB.png differ
diff --git a/coldfront/components/site/static/images/DWMCUJYJ.png b/coldfront/components/site/static/images/DWMCUJYJ.png
new file mode 100644
index 0000000000..b610196eb7
Binary files /dev/null and b/coldfront/components/site/static/images/DWMCUJYJ.png differ
diff --git a/coldfront/components/site/static/images/DYDT7SMX.png b/coldfront/components/site/static/images/DYDT7SMX.png
new file mode 100644
index 0000000000..7f1d2957e2
Binary files /dev/null and b/coldfront/components/site/static/images/DYDT7SMX.png differ
diff --git a/coldfront/components/site/static/images/E3KNF9T8.png b/coldfront/components/site/static/images/E3KNF9T8.png
new file mode 100644
index 0000000000..165c50ff82
Binary files /dev/null and b/coldfront/components/site/static/images/E3KNF9T8.png differ
diff --git a/coldfront/components/site/static/images/E423YNAS.png b/coldfront/components/site/static/images/E423YNAS.png
new file mode 100644
index 0000000000..54081febf6
Binary files /dev/null and b/coldfront/components/site/static/images/E423YNAS.png differ
diff --git a/coldfront/components/site/static/images/E4WEIG35.png b/coldfront/components/site/static/images/E4WEIG35.png
new file mode 100644
index 0000000000..d199a08d15
Binary files /dev/null and b/coldfront/components/site/static/images/E4WEIG35.png differ
diff --git a/coldfront/components/site/static/images/E4ZP8U2D.png b/coldfront/components/site/static/images/E4ZP8U2D.png
new file mode 100644
index 0000000000..cbe96d0d30
Binary files /dev/null and b/coldfront/components/site/static/images/E4ZP8U2D.png differ
diff --git a/coldfront/components/site/static/images/E5HSMXJZ.png b/coldfront/components/site/static/images/E5HSMXJZ.png
new file mode 100644
index 0000000000..505c4ca31a
Binary files /dev/null and b/coldfront/components/site/static/images/E5HSMXJZ.png differ
diff --git a/coldfront/components/site/static/images/E5RCJKKH.png b/coldfront/components/site/static/images/E5RCJKKH.png
new file mode 100644
index 0000000000..f0f8cce0a1
Binary files /dev/null and b/coldfront/components/site/static/images/E5RCJKKH.png differ
diff --git a/coldfront/components/site/static/images/E5RMKWAY.png b/coldfront/components/site/static/images/E5RMKWAY.png
new file mode 100644
index 0000000000..4d8e68364d
Binary files /dev/null and b/coldfront/components/site/static/images/E5RMKWAY.png differ
diff --git a/coldfront/components/site/static/images/E6QU9NNR.png b/coldfront/components/site/static/images/E6QU9NNR.png
new file mode 100644
index 0000000000..5c58b79400
Binary files /dev/null and b/coldfront/components/site/static/images/E6QU9NNR.png differ
diff --git a/coldfront/components/site/static/images/E6WMABVN.png b/coldfront/components/site/static/images/E6WMABVN.png
new file mode 100644
index 0000000000..818264eb2c
Binary files /dev/null and b/coldfront/components/site/static/images/E6WMABVN.png differ
diff --git a/coldfront/components/site/static/images/E7SYWT7G.png b/coldfront/components/site/static/images/E7SYWT7G.png
new file mode 100644
index 0000000000..a045e65e45
Binary files /dev/null and b/coldfront/components/site/static/images/E7SYWT7G.png differ
diff --git a/coldfront/components/site/static/images/E8RELL4Q.png b/coldfront/components/site/static/images/E8RELL4Q.png
new file mode 100644
index 0000000000..ea435f1cde
Binary files /dev/null and b/coldfront/components/site/static/images/E8RELL4Q.png differ
diff --git a/coldfront/components/site/static/images/E95N5NQS.png b/coldfront/components/site/static/images/E95N5NQS.png
new file mode 100644
index 0000000000..2b44d55a6b
Binary files /dev/null and b/coldfront/components/site/static/images/E95N5NQS.png differ
diff --git a/coldfront/components/site/static/images/E9YBW6TU.png b/coldfront/components/site/static/images/E9YBW6TU.png
new file mode 100644
index 0000000000..73a63a558c
Binary files /dev/null and b/coldfront/components/site/static/images/E9YBW6TU.png differ
diff --git a/coldfront/components/site/static/images/EBLEPM2S.png b/coldfront/components/site/static/images/EBLEPM2S.png
new file mode 100644
index 0000000000..ef2f02820e
Binary files /dev/null and b/coldfront/components/site/static/images/EBLEPM2S.png differ
diff --git a/coldfront/components/site/static/images/EC2CEVPM.png b/coldfront/components/site/static/images/EC2CEVPM.png
new file mode 100644
index 0000000000..84445c4f84
Binary files /dev/null and b/coldfront/components/site/static/images/EC2CEVPM.png differ
diff --git a/coldfront/components/site/static/images/EC8GPQE7.png b/coldfront/components/site/static/images/EC8GPQE7.png
new file mode 100644
index 0000000000..26c0687a08
Binary files /dev/null and b/coldfront/components/site/static/images/EC8GPQE7.png differ
diff --git a/coldfront/components/site/static/images/ECJE53T5.png b/coldfront/components/site/static/images/ECJE53T5.png
new file mode 100644
index 0000000000..0dc50c0ffc
Binary files /dev/null and b/coldfront/components/site/static/images/ECJE53T5.png differ
diff --git a/coldfront/components/site/static/images/ED6CMUSH.png b/coldfront/components/site/static/images/ED6CMUSH.png
new file mode 100644
index 0000000000..02de867ef4
Binary files /dev/null and b/coldfront/components/site/static/images/ED6CMUSH.png differ
diff --git a/coldfront/components/site/static/images/EFYBWXLL.png b/coldfront/components/site/static/images/EFYBWXLL.png
new file mode 100644
index 0000000000..d278413701
Binary files /dev/null and b/coldfront/components/site/static/images/EFYBWXLL.png differ
diff --git a/coldfront/components/site/static/images/EG5VRFI4.png b/coldfront/components/site/static/images/EG5VRFI4.png
new file mode 100644
index 0000000000..55b5f90250
Binary files /dev/null and b/coldfront/components/site/static/images/EG5VRFI4.png differ
diff --git a/coldfront/components/site/static/images/EHKP25IS.png b/coldfront/components/site/static/images/EHKP25IS.png
new file mode 100644
index 0000000000..ba87758ed6
Binary files /dev/null and b/coldfront/components/site/static/images/EHKP25IS.png differ
diff --git a/coldfront/components/site/static/images/EHUPLFKQ.png b/coldfront/components/site/static/images/EHUPLFKQ.png
new file mode 100644
index 0000000000..ab51bc2080
Binary files /dev/null and b/coldfront/components/site/static/images/EHUPLFKQ.png differ
diff --git a/coldfront/components/site/static/images/EIM4E32J.png b/coldfront/components/site/static/images/EIM4E32J.png
new file mode 100644
index 0000000000..0022215b1c
Binary files /dev/null and b/coldfront/components/site/static/images/EIM4E32J.png differ
diff --git a/coldfront/components/site/static/images/ELSX6DRQ.png b/coldfront/components/site/static/images/ELSX6DRQ.png
new file mode 100644
index 0000000000..6b7472e783
Binary files /dev/null and b/coldfront/components/site/static/images/ELSX6DRQ.png differ
diff --git a/coldfront/components/site/static/images/EPNZG7CE.png b/coldfront/components/site/static/images/EPNZG7CE.png
new file mode 100644
index 0000000000..2997e274b1
Binary files /dev/null and b/coldfront/components/site/static/images/EPNZG7CE.png differ
diff --git a/coldfront/components/site/static/images/EPVHNVGS.png b/coldfront/components/site/static/images/EPVHNVGS.png
new file mode 100644
index 0000000000..9e46da4c2a
Binary files /dev/null and b/coldfront/components/site/static/images/EPVHNVGS.png differ
diff --git a/coldfront/components/site/static/images/EQG6DBPD.png b/coldfront/components/site/static/images/EQG6DBPD.png
new file mode 100644
index 0000000000..0feea1b707
Binary files /dev/null and b/coldfront/components/site/static/images/EQG6DBPD.png differ
diff --git a/coldfront/components/site/static/images/EQN34AUA.png b/coldfront/components/site/static/images/EQN34AUA.png
new file mode 100644
index 0000000000..1c60625006
Binary files /dev/null and b/coldfront/components/site/static/images/EQN34AUA.png differ
diff --git a/coldfront/components/site/static/images/ETI5WJ5K.png b/coldfront/components/site/static/images/ETI5WJ5K.png
new file mode 100644
index 0000000000..e818cb005a
Binary files /dev/null and b/coldfront/components/site/static/images/ETI5WJ5K.png differ
diff --git a/coldfront/components/site/static/images/EU3T36ER.png b/coldfront/components/site/static/images/EU3T36ER.png
new file mode 100644
index 0000000000..2c4fab8f82
Binary files /dev/null and b/coldfront/components/site/static/images/EU3T36ER.png differ
diff --git a/coldfront/components/site/static/images/EWD4AV2I.png b/coldfront/components/site/static/images/EWD4AV2I.png
new file mode 100644
index 0000000000..62d33b4887
Binary files /dev/null and b/coldfront/components/site/static/images/EWD4AV2I.png differ
diff --git a/coldfront/components/site/static/images/F2V3MF8R.png b/coldfront/components/site/static/images/F2V3MF8R.png
new file mode 100644
index 0000000000..0ef918b90e
Binary files /dev/null and b/coldfront/components/site/static/images/F2V3MF8R.png differ
diff --git a/coldfront/components/site/static/images/F35YR5DN.png b/coldfront/components/site/static/images/F35YR5DN.png
new file mode 100644
index 0000000000..e33a3bc500
Binary files /dev/null and b/coldfront/components/site/static/images/F35YR5DN.png differ
diff --git a/coldfront/components/site/static/images/F3IPE5YE.png b/coldfront/components/site/static/images/F3IPE5YE.png
new file mode 100644
index 0000000000..7670107ffa
Binary files /dev/null and b/coldfront/components/site/static/images/F3IPE5YE.png differ
diff --git a/coldfront/components/site/static/images/F3QPURUN.png b/coldfront/components/site/static/images/F3QPURUN.png
new file mode 100644
index 0000000000..36233a2206
Binary files /dev/null and b/coldfront/components/site/static/images/F3QPURUN.png differ
diff --git a/coldfront/components/site/static/images/F6I7M4QP.png b/coldfront/components/site/static/images/F6I7M4QP.png
new file mode 100644
index 0000000000..93929f71f4
Binary files /dev/null and b/coldfront/components/site/static/images/F6I7M4QP.png differ
diff --git a/coldfront/components/site/static/images/F6QSXXMC.png b/coldfront/components/site/static/images/F6QSXXMC.png
new file mode 100644
index 0000000000..23d41c60e4
Binary files /dev/null and b/coldfront/components/site/static/images/F6QSXXMC.png differ
diff --git a/coldfront/components/site/static/images/F6QWK5EH.png b/coldfront/components/site/static/images/F6QWK5EH.png
new file mode 100644
index 0000000000..0b87d8ede8
Binary files /dev/null and b/coldfront/components/site/static/images/F6QWK5EH.png differ
diff --git a/coldfront/components/site/static/images/F82D7XN8.png b/coldfront/components/site/static/images/F82D7XN8.png
new file mode 100644
index 0000000000..16b129b630
Binary files /dev/null and b/coldfront/components/site/static/images/F82D7XN8.png differ
diff --git a/coldfront/components/site/static/images/F8DZ4DCZ.png b/coldfront/components/site/static/images/F8DZ4DCZ.png
new file mode 100644
index 0000000000..9e36bd5973
Binary files /dev/null and b/coldfront/components/site/static/images/F8DZ4DCZ.png differ
diff --git a/coldfront/components/site/static/images/F9HUB2VI.png b/coldfront/components/site/static/images/F9HUB2VI.png
new file mode 100644
index 0000000000..f555ed5758
Binary files /dev/null and b/coldfront/components/site/static/images/F9HUB2VI.png differ
diff --git a/coldfront/components/site/static/images/FA5HQ5LF.png b/coldfront/components/site/static/images/FA5HQ5LF.png
new file mode 100644
index 0000000000..b15e7bdad9
Binary files /dev/null and b/coldfront/components/site/static/images/FA5HQ5LF.png differ
diff --git a/coldfront/components/site/static/images/FADAUAQ5.png b/coldfront/components/site/static/images/FADAUAQ5.png
new file mode 100644
index 0000000000..70ce30ccf9
Binary files /dev/null and b/coldfront/components/site/static/images/FADAUAQ5.png differ
diff --git a/coldfront/components/site/static/images/FBJ3DWKX.png b/coldfront/components/site/static/images/FBJ3DWKX.png
new file mode 100644
index 0000000000..dab7827c02
Binary files /dev/null and b/coldfront/components/site/static/images/FBJ3DWKX.png differ
diff --git a/coldfront/components/site/static/images/FCQG945G.png b/coldfront/components/site/static/images/FCQG945G.png
new file mode 100644
index 0000000000..b0bfbbffa3
Binary files /dev/null and b/coldfront/components/site/static/images/FCQG945G.png differ
diff --git a/coldfront/components/site/static/images/FCRNWPPP.png b/coldfront/components/site/static/images/FCRNWPPP.png
new file mode 100644
index 0000000000..3cd3d658b6
Binary files /dev/null and b/coldfront/components/site/static/images/FCRNWPPP.png differ
diff --git a/coldfront/components/site/static/images/FDA9SKED.png b/coldfront/components/site/static/images/FDA9SKED.png
new file mode 100644
index 0000000000..d8935de16e
Binary files /dev/null and b/coldfront/components/site/static/images/FDA9SKED.png differ
diff --git a/coldfront/components/site/static/images/FDDHZLL4.png b/coldfront/components/site/static/images/FDDHZLL4.png
new file mode 100644
index 0000000000..3015b81aa8
Binary files /dev/null and b/coldfront/components/site/static/images/FDDHZLL4.png differ
diff --git a/coldfront/components/site/static/images/FDGYRGV3.png b/coldfront/components/site/static/images/FDGYRGV3.png
new file mode 100644
index 0000000000..b4d735d053
Binary files /dev/null and b/coldfront/components/site/static/images/FDGYRGV3.png differ
diff --git a/coldfront/components/site/static/images/FH3KHWB5.png b/coldfront/components/site/static/images/FH3KHWB5.png
new file mode 100644
index 0000000000..30f783c24c
Binary files /dev/null and b/coldfront/components/site/static/images/FH3KHWB5.png differ
diff --git a/coldfront/components/site/static/images/FHBPJVKG.png b/coldfront/components/site/static/images/FHBPJVKG.png
new file mode 100644
index 0000000000..1a3dce87d9
Binary files /dev/null and b/coldfront/components/site/static/images/FHBPJVKG.png differ
diff --git a/coldfront/components/site/static/images/FHBUAIAW.png b/coldfront/components/site/static/images/FHBUAIAW.png
new file mode 100644
index 0000000000..baefa2be07
Binary files /dev/null and b/coldfront/components/site/static/images/FHBUAIAW.png differ
diff --git a/coldfront/components/site/static/images/FHQYFEHY.png b/coldfront/components/site/static/images/FHQYFEHY.png
new file mode 100644
index 0000000000..706c46d556
Binary files /dev/null and b/coldfront/components/site/static/images/FHQYFEHY.png differ
diff --git a/coldfront/components/site/static/images/FJSN3WHC.png b/coldfront/components/site/static/images/FJSN3WHC.png
new file mode 100644
index 0000000000..2dfb50c475
Binary files /dev/null and b/coldfront/components/site/static/images/FJSN3WHC.png differ
diff --git a/coldfront/components/site/static/images/FKW9B7TU.png b/coldfront/components/site/static/images/FKW9B7TU.png
new file mode 100644
index 0000000000..ff56a6f698
Binary files /dev/null and b/coldfront/components/site/static/images/FKW9B7TU.png differ
diff --git a/coldfront/components/site/static/images/FMGJ2MDT.png b/coldfront/components/site/static/images/FMGJ2MDT.png
new file mode 100644
index 0000000000..33a466d1ec
Binary files /dev/null and b/coldfront/components/site/static/images/FMGJ2MDT.png differ
diff --git a/coldfront/components/site/static/images/FMLM9ISP.png b/coldfront/components/site/static/images/FMLM9ISP.png
new file mode 100644
index 0000000000..b51587851f
Binary files /dev/null and b/coldfront/components/site/static/images/FMLM9ISP.png differ
diff --git a/coldfront/components/site/static/images/FPEQ2TUA.png b/coldfront/components/site/static/images/FPEQ2TUA.png
new file mode 100644
index 0000000000..67b5ecbede
Binary files /dev/null and b/coldfront/components/site/static/images/FPEQ2TUA.png differ
diff --git a/coldfront/components/site/static/images/FPPCJN4U.png b/coldfront/components/site/static/images/FPPCJN4U.png
new file mode 100644
index 0000000000..b8402fd2d8
Binary files /dev/null and b/coldfront/components/site/static/images/FPPCJN4U.png differ
diff --git a/coldfront/components/site/static/images/FQKYKPQY.png b/coldfront/components/site/static/images/FQKYKPQY.png
new file mode 100644
index 0000000000..e6da4d9b84
Binary files /dev/null and b/coldfront/components/site/static/images/FQKYKPQY.png differ
diff --git a/coldfront/components/site/static/images/FRV8PVRY.png b/coldfront/components/site/static/images/FRV8PVRY.png
new file mode 100644
index 0000000000..f097750ca2
Binary files /dev/null and b/coldfront/components/site/static/images/FRV8PVRY.png differ
diff --git a/coldfront/components/site/static/images/FSASD23K.png b/coldfront/components/site/static/images/FSASD23K.png
new file mode 100644
index 0000000000..0dc50c0ffc
Binary files /dev/null and b/coldfront/components/site/static/images/FSASD23K.png differ
diff --git a/coldfront/components/site/static/images/FT8FGT6B.png b/coldfront/components/site/static/images/FT8FGT6B.png
new file mode 100644
index 0000000000..713b3f3b93
Binary files /dev/null and b/coldfront/components/site/static/images/FT8FGT6B.png differ
diff --git a/coldfront/components/site/static/images/FTF5RUS8.png b/coldfront/components/site/static/images/FTF5RUS8.png
new file mode 100644
index 0000000000..879538b02d
Binary files /dev/null and b/coldfront/components/site/static/images/FTF5RUS8.png differ
diff --git a/coldfront/components/site/static/images/FUQGR8LW.png b/coldfront/components/site/static/images/FUQGR8LW.png
new file mode 100644
index 0000000000..15f0bf53a2
Binary files /dev/null and b/coldfront/components/site/static/images/FUQGR8LW.png differ
diff --git a/coldfront/components/site/static/images/FV6M8HTB.png b/coldfront/components/site/static/images/FV6M8HTB.png
new file mode 100644
index 0000000000..d873553e57
Binary files /dev/null and b/coldfront/components/site/static/images/FV6M8HTB.png differ
diff --git a/coldfront/components/site/static/images/FVP8J8QY.png b/coldfront/components/site/static/images/FVP8J8QY.png
new file mode 100644
index 0000000000..3032a70411
Binary files /dev/null and b/coldfront/components/site/static/images/FVP8J8QY.png differ
diff --git a/coldfront/components/site/static/images/FVPGSI9N.png b/coldfront/components/site/static/images/FVPGSI9N.png
new file mode 100644
index 0000000000..950ffb980f
Binary files /dev/null and b/coldfront/components/site/static/images/FVPGSI9N.png differ
diff --git a/coldfront/components/site/static/images/FWF4UDYU.png b/coldfront/components/site/static/images/FWF4UDYU.png
new file mode 100644
index 0000000000..15f0bf53a2
Binary files /dev/null and b/coldfront/components/site/static/images/FWF4UDYU.png differ
diff --git a/coldfront/components/site/static/images/FWYZPVTK.png b/coldfront/components/site/static/images/FWYZPVTK.png
new file mode 100644
index 0000000000..8234d5302f
Binary files /dev/null and b/coldfront/components/site/static/images/FWYZPVTK.png differ
diff --git a/coldfront/components/site/static/images/FXIPAPB4.png b/coldfront/components/site/static/images/FXIPAPB4.png
new file mode 100644
index 0000000000..2eb8fc6f32
Binary files /dev/null and b/coldfront/components/site/static/images/FXIPAPB4.png differ
diff --git a/coldfront/components/site/static/images/FZS2TRC9.png b/coldfront/components/site/static/images/FZS2TRC9.png
new file mode 100644
index 0000000000..90eb12d099
Binary files /dev/null and b/coldfront/components/site/static/images/FZS2TRC9.png differ
diff --git a/coldfront/components/site/static/images/G257K84K.png b/coldfront/components/site/static/images/G257K84K.png
new file mode 100644
index 0000000000..65e8ba16c3
Binary files /dev/null and b/coldfront/components/site/static/images/G257K84K.png differ
diff --git a/coldfront/components/site/static/images/G5WWTFS5.png b/coldfront/components/site/static/images/G5WWTFS5.png
new file mode 100644
index 0000000000..d4b2abcd6d
Binary files /dev/null and b/coldfront/components/site/static/images/G5WWTFS5.png differ
diff --git a/coldfront/components/site/static/images/G6MVAXT5.png b/coldfront/components/site/static/images/G6MVAXT5.png
new file mode 100644
index 0000000000..d7670b29be
Binary files /dev/null and b/coldfront/components/site/static/images/G6MVAXT5.png differ
diff --git a/coldfront/components/site/static/images/G7J4E2ZC.png b/coldfront/components/site/static/images/G7J4E2ZC.png
new file mode 100644
index 0000000000..67ffa349b5
Binary files /dev/null and b/coldfront/components/site/static/images/G7J4E2ZC.png differ
diff --git a/coldfront/components/site/static/images/G9IP3QF9.png b/coldfront/components/site/static/images/G9IP3QF9.png
new file mode 100644
index 0000000000..cec8df2da6
Binary files /dev/null and b/coldfront/components/site/static/images/G9IP3QF9.png differ
diff --git a/coldfront/components/site/static/images/GC422TSZ.png b/coldfront/components/site/static/images/GC422TSZ.png
new file mode 100644
index 0000000000..da761eb177
Binary files /dev/null and b/coldfront/components/site/static/images/GC422TSZ.png differ
diff --git a/coldfront/components/site/static/images/GD5CNV3G.png b/coldfront/components/site/static/images/GD5CNV3G.png
new file mode 100644
index 0000000000..4c76ee1997
Binary files /dev/null and b/coldfront/components/site/static/images/GD5CNV3G.png differ
diff --git a/coldfront/components/site/static/images/GET2MA83.png b/coldfront/components/site/static/images/GET2MA83.png
new file mode 100644
index 0000000000..0e8129bd09
Binary files /dev/null and b/coldfront/components/site/static/images/GET2MA83.png differ
diff --git a/coldfront/components/site/static/images/GF725DRW.png b/coldfront/components/site/static/images/GF725DRW.png
new file mode 100644
index 0000000000..51575a1c00
Binary files /dev/null and b/coldfront/components/site/static/images/GF725DRW.png differ
diff --git a/coldfront/components/site/static/images/GG9UCERD.png b/coldfront/components/site/static/images/GG9UCERD.png
new file mode 100644
index 0000000000..02159e0810
Binary files /dev/null and b/coldfront/components/site/static/images/GG9UCERD.png differ
diff --git a/coldfront/components/site/static/images/GH6TAWP6.png b/coldfront/components/site/static/images/GH6TAWP6.png
new file mode 100644
index 0000000000..49dc04686c
Binary files /dev/null and b/coldfront/components/site/static/images/GH6TAWP6.png differ
diff --git a/coldfront/components/site/static/images/GH7IRYZZ.png b/coldfront/components/site/static/images/GH7IRYZZ.png
new file mode 100644
index 0000000000..7584b16137
Binary files /dev/null and b/coldfront/components/site/static/images/GH7IRYZZ.png differ
diff --git a/coldfront/components/site/static/images/GJCBPNP9.png b/coldfront/components/site/static/images/GJCBPNP9.png
new file mode 100644
index 0000000000..7e14bf6790
Binary files /dev/null and b/coldfront/components/site/static/images/GJCBPNP9.png differ
diff --git a/coldfront/components/site/static/images/GJWVPZEW.png b/coldfront/components/site/static/images/GJWVPZEW.png
new file mode 100644
index 0000000000..da87e19a87
Binary files /dev/null and b/coldfront/components/site/static/images/GJWVPZEW.png differ
diff --git a/coldfront/components/site/static/images/GRJLFICY.png b/coldfront/components/site/static/images/GRJLFICY.png
new file mode 100644
index 0000000000..d83953537c
Binary files /dev/null and b/coldfront/components/site/static/images/GRJLFICY.png differ
diff --git a/coldfront/components/site/static/images/GRT5MA28.png b/coldfront/components/site/static/images/GRT5MA28.png
new file mode 100644
index 0000000000..a045e65e45
Binary files /dev/null and b/coldfront/components/site/static/images/GRT5MA28.png differ
diff --git a/coldfront/components/site/static/images/GRZSH7BS.png b/coldfront/components/site/static/images/GRZSH7BS.png
new file mode 100644
index 0000000000..8a5880f60b
Binary files /dev/null and b/coldfront/components/site/static/images/GRZSH7BS.png differ
diff --git a/coldfront/components/site/static/images/GSUT5T8L.png b/coldfront/components/site/static/images/GSUT5T8L.png
new file mode 100644
index 0000000000..e72f45d8ec
Binary files /dev/null and b/coldfront/components/site/static/images/GSUT5T8L.png differ
diff --git a/coldfront/components/site/static/images/GT372DC7.png b/coldfront/components/site/static/images/GT372DC7.png
new file mode 100644
index 0000000000..49dc04686c
Binary files /dev/null and b/coldfront/components/site/static/images/GT372DC7.png differ
diff --git a/coldfront/components/site/static/images/GTUFX52S.png b/coldfront/components/site/static/images/GTUFX52S.png
new file mode 100644
index 0000000000..8c64a50e22
Binary files /dev/null and b/coldfront/components/site/static/images/GTUFX52S.png differ
diff --git a/coldfront/components/site/static/images/GVTRHMAU.png b/coldfront/components/site/static/images/GVTRHMAU.png
new file mode 100644
index 0000000000..11179afe6e
Binary files /dev/null and b/coldfront/components/site/static/images/GVTRHMAU.png differ
diff --git a/coldfront/components/site/static/images/GXDJT4DQ.png b/coldfront/components/site/static/images/GXDJT4DQ.png
new file mode 100644
index 0000000000..cdf01721c5
Binary files /dev/null and b/coldfront/components/site/static/images/GXDJT4DQ.png differ
diff --git a/coldfront/components/site/static/images/GXI43IVY.png b/coldfront/components/site/static/images/GXI43IVY.png
new file mode 100644
index 0000000000..0742e0f5ca
Binary files /dev/null and b/coldfront/components/site/static/images/GXI43IVY.png differ
diff --git a/coldfront/components/site/static/images/GY9YDG8J.png b/coldfront/components/site/static/images/GY9YDG8J.png
new file mode 100644
index 0000000000..a777f13f4d
Binary files /dev/null and b/coldfront/components/site/static/images/GY9YDG8J.png differ
diff --git a/coldfront/components/site/static/images/GYPTN6FM.png b/coldfront/components/site/static/images/GYPTN6FM.png
new file mode 100644
index 0000000000..b99737013d
Binary files /dev/null and b/coldfront/components/site/static/images/GYPTN6FM.png differ
diff --git a/coldfront/components/site/static/images/GYY6FBQH.png b/coldfront/components/site/static/images/GYY6FBQH.png
new file mode 100644
index 0000000000..8c1464db74
Binary files /dev/null and b/coldfront/components/site/static/images/GYY6FBQH.png differ
diff --git a/coldfront/components/site/static/images/GZQVN62C.png b/coldfront/components/site/static/images/GZQVN62C.png
new file mode 100644
index 0000000000..233375faae
Binary files /dev/null and b/coldfront/components/site/static/images/GZQVN62C.png differ
diff --git a/coldfront/components/site/static/images/H257PWKR.png b/coldfront/components/site/static/images/H257PWKR.png
new file mode 100644
index 0000000000..93929f71f4
Binary files /dev/null and b/coldfront/components/site/static/images/H257PWKR.png differ
diff --git a/coldfront/components/site/static/images/H2PPL72I.png b/coldfront/components/site/static/images/H2PPL72I.png
new file mode 100644
index 0000000000..b8b7c7ac61
Binary files /dev/null and b/coldfront/components/site/static/images/H2PPL72I.png differ
diff --git a/coldfront/components/site/static/images/H2RFIBRM.png b/coldfront/components/site/static/images/H2RFIBRM.png
new file mode 100644
index 0000000000..f3fe14b730
Binary files /dev/null and b/coldfront/components/site/static/images/H2RFIBRM.png differ
diff --git a/coldfront/components/site/static/images/H3R4UEJR.png b/coldfront/components/site/static/images/H3R4UEJR.png
new file mode 100644
index 0000000000..1ec9e3ab9f
Binary files /dev/null and b/coldfront/components/site/static/images/H3R4UEJR.png differ
diff --git a/coldfront/components/site/static/images/H68A929G.png b/coldfront/components/site/static/images/H68A929G.png
new file mode 100644
index 0000000000..f6e67c7177
Binary files /dev/null and b/coldfront/components/site/static/images/H68A929G.png differ
diff --git a/coldfront/components/site/static/images/H7Y9IKGL.png b/coldfront/components/site/static/images/H7Y9IKGL.png
new file mode 100644
index 0000000000..5463532e96
Binary files /dev/null and b/coldfront/components/site/static/images/H7Y9IKGL.png differ
diff --git a/coldfront/components/site/static/images/H8EBDQDG.png b/coldfront/components/site/static/images/H8EBDQDG.png
new file mode 100644
index 0000000000..2dfb50c475
Binary files /dev/null and b/coldfront/components/site/static/images/H8EBDQDG.png differ
diff --git a/coldfront/components/site/static/images/H954JPE2.png b/coldfront/components/site/static/images/H954JPE2.png
new file mode 100644
index 0000000000..90eac93791
Binary files /dev/null and b/coldfront/components/site/static/images/H954JPE2.png differ
diff --git a/coldfront/components/site/static/images/H9C9R22H.png b/coldfront/components/site/static/images/H9C9R22H.png
new file mode 100644
index 0000000000..1d79e9fd19
Binary files /dev/null and b/coldfront/components/site/static/images/H9C9R22H.png differ
diff --git a/coldfront/components/site/static/images/H9UC2V5Z.png b/coldfront/components/site/static/images/H9UC2V5Z.png
new file mode 100644
index 0000000000..7068bc4924
Binary files /dev/null and b/coldfront/components/site/static/images/H9UC2V5Z.png differ
diff --git a/coldfront/components/site/static/images/HBE2R9ZG.png b/coldfront/components/site/static/images/HBE2R9ZG.png
new file mode 100644
index 0000000000..956790baaf
Binary files /dev/null and b/coldfront/components/site/static/images/HBE2R9ZG.png differ
diff --git a/coldfront/components/site/static/images/HBJ7E5UL.png b/coldfront/components/site/static/images/HBJ7E5UL.png
new file mode 100644
index 0000000000..d76af6337b
Binary files /dev/null and b/coldfront/components/site/static/images/HBJ7E5UL.png differ
diff --git a/coldfront/components/site/static/images/HCE8DFLH.png b/coldfront/components/site/static/images/HCE8DFLH.png
new file mode 100644
index 0000000000..e92b4a6f08
Binary files /dev/null and b/coldfront/components/site/static/images/HCE8DFLH.png differ
diff --git a/coldfront/components/site/static/images/HDMFHQXK.png b/coldfront/components/site/static/images/HDMFHQXK.png
new file mode 100644
index 0000000000..c7223e5926
Binary files /dev/null and b/coldfront/components/site/static/images/HDMFHQXK.png differ
diff --git a/coldfront/components/site/static/images/HE5GB9VK.png b/coldfront/components/site/static/images/HE5GB9VK.png
new file mode 100644
index 0000000000..a0a9b80e9d
Binary files /dev/null and b/coldfront/components/site/static/images/HE5GB9VK.png differ
diff --git a/coldfront/components/site/static/images/HE6JDQ73.png b/coldfront/components/site/static/images/HE6JDQ73.png
new file mode 100644
index 0000000000..56a2beaea9
Binary files /dev/null and b/coldfront/components/site/static/images/HE6JDQ73.png differ
diff --git a/coldfront/components/site/static/images/HEJMXCBM.png b/coldfront/components/site/static/images/HEJMXCBM.png
new file mode 100644
index 0000000000..3aff5e9650
Binary files /dev/null and b/coldfront/components/site/static/images/HEJMXCBM.png differ
diff --git a/coldfront/components/site/static/images/HF5QITRZ.png b/coldfront/components/site/static/images/HF5QITRZ.png
new file mode 100644
index 0000000000..e5697fa497
Binary files /dev/null and b/coldfront/components/site/static/images/HF5QITRZ.png differ
diff --git a/coldfront/components/site/static/images/HH59QIQV.png b/coldfront/components/site/static/images/HH59QIQV.png
new file mode 100644
index 0000000000..9def16e683
Binary files /dev/null and b/coldfront/components/site/static/images/HH59QIQV.png differ
diff --git a/coldfront/components/site/static/images/HIJU66ZC.png b/coldfront/components/site/static/images/HIJU66ZC.png
new file mode 100644
index 0000000000..24ba8f2efc
Binary files /dev/null and b/coldfront/components/site/static/images/HIJU66ZC.png differ
diff --git a/coldfront/components/site/static/images/HIYJ9EUX.png b/coldfront/components/site/static/images/HIYJ9EUX.png
new file mode 100644
index 0000000000..a8fbb5b44b
Binary files /dev/null and b/coldfront/components/site/static/images/HIYJ9EUX.png differ
diff --git a/coldfront/components/site/static/images/HJL3MTCS.png b/coldfront/components/site/static/images/HJL3MTCS.png
new file mode 100644
index 0000000000..8101d45953
Binary files /dev/null and b/coldfront/components/site/static/images/HJL3MTCS.png differ
diff --git a/coldfront/components/site/static/images/HJW2EICD.png b/coldfront/components/site/static/images/HJW2EICD.png
new file mode 100644
index 0000000000..b1aed145fd
Binary files /dev/null and b/coldfront/components/site/static/images/HJW2EICD.png differ
diff --git a/coldfront/components/site/static/images/HK37DCT6.png b/coldfront/components/site/static/images/HK37DCT6.png
new file mode 100644
index 0000000000..c4c58313e3
Binary files /dev/null and b/coldfront/components/site/static/images/HK37DCT6.png differ
diff --git a/coldfront/components/site/static/images/HKQZPI6C.png b/coldfront/components/site/static/images/HKQZPI6C.png
new file mode 100644
index 0000000000..8d925a3f18
Binary files /dev/null and b/coldfront/components/site/static/images/HKQZPI6C.png differ
diff --git a/coldfront/components/site/static/images/HMXUCMRV.png b/coldfront/components/site/static/images/HMXUCMRV.png
new file mode 100644
index 0000000000..57e7e9dfa5
Binary files /dev/null and b/coldfront/components/site/static/images/HMXUCMRV.png differ
diff --git a/coldfront/components/site/static/images/HPFMNHZY.png b/coldfront/components/site/static/images/HPFMNHZY.png
new file mode 100644
index 0000000000..25c9204127
Binary files /dev/null and b/coldfront/components/site/static/images/HPFMNHZY.png differ
diff --git a/coldfront/components/site/static/images/HPHIPYRM.png b/coldfront/components/site/static/images/HPHIPYRM.png
new file mode 100644
index 0000000000..931ec79bdb
Binary files /dev/null and b/coldfront/components/site/static/images/HPHIPYRM.png differ
diff --git a/coldfront/components/site/static/images/HPWQPNN9.png b/coldfront/components/site/static/images/HPWQPNN9.png
new file mode 100644
index 0000000000..0e3f1cd8a9
Binary files /dev/null and b/coldfront/components/site/static/images/HPWQPNN9.png differ
diff --git a/coldfront/components/site/static/images/HQE6NRS9.png b/coldfront/components/site/static/images/HQE6NRS9.png
new file mode 100644
index 0000000000..3e4b537269
Binary files /dev/null and b/coldfront/components/site/static/images/HQE6NRS9.png differ
diff --git a/coldfront/components/site/static/images/HRE92A7X.png b/coldfront/components/site/static/images/HRE92A7X.png
new file mode 100644
index 0000000000..56a2beaea9
Binary files /dev/null and b/coldfront/components/site/static/images/HRE92A7X.png differ
diff --git a/coldfront/components/site/static/images/HREM3P93.png b/coldfront/components/site/static/images/HREM3P93.png
new file mode 100644
index 0000000000..c2b35708d6
Binary files /dev/null and b/coldfront/components/site/static/images/HREM3P93.png differ
diff --git a/coldfront/components/site/static/images/HRLJTP2A.png b/coldfront/components/site/static/images/HRLJTP2A.png
new file mode 100644
index 0000000000..7e18f18e8e
Binary files /dev/null and b/coldfront/components/site/static/images/HRLJTP2A.png differ
diff --git a/coldfront/components/site/static/images/HTP9AVV6.png b/coldfront/components/site/static/images/HTP9AVV6.png
new file mode 100644
index 0000000000..8c35e7806a
Binary files /dev/null and b/coldfront/components/site/static/images/HTP9AVV6.png differ
diff --git a/coldfront/components/site/static/images/HTS6QZJC.png b/coldfront/components/site/static/images/HTS6QZJC.png
new file mode 100644
index 0000000000..a313dcf45f
Binary files /dev/null and b/coldfront/components/site/static/images/HTS6QZJC.png differ
diff --git a/coldfront/components/site/static/images/HUZ8QQGU.png b/coldfront/components/site/static/images/HUZ8QQGU.png
new file mode 100644
index 0000000000..ec796241a4
Binary files /dev/null and b/coldfront/components/site/static/images/HUZ8QQGU.png differ
diff --git a/coldfront/components/site/static/images/HX3Z4ETW.png b/coldfront/components/site/static/images/HX3Z4ETW.png
new file mode 100644
index 0000000000..055fd29bd5
Binary files /dev/null and b/coldfront/components/site/static/images/HX3Z4ETW.png differ
diff --git a/coldfront/components/site/static/images/HZ7CDA58.png b/coldfront/components/site/static/images/HZ7CDA58.png
new file mode 100644
index 0000000000..029b10f6b4
Binary files /dev/null and b/coldfront/components/site/static/images/HZ7CDA58.png differ
diff --git a/coldfront/components/site/static/images/I22SWWQ5.png b/coldfront/components/site/static/images/I22SWWQ5.png
new file mode 100644
index 0000000000..713b3f3b93
Binary files /dev/null and b/coldfront/components/site/static/images/I22SWWQ5.png differ
diff --git a/coldfront/components/site/static/images/I2TCRSZD.png b/coldfront/components/site/static/images/I2TCRSZD.png
new file mode 100644
index 0000000000..1ebcfe96c6
Binary files /dev/null and b/coldfront/components/site/static/images/I2TCRSZD.png differ
diff --git a/coldfront/components/site/static/images/I355HIII.png b/coldfront/components/site/static/images/I355HIII.png
new file mode 100644
index 0000000000..1ea11e5a49
Binary files /dev/null and b/coldfront/components/site/static/images/I355HIII.png differ
diff --git a/coldfront/components/site/static/images/I3G8Q8SX.png b/coldfront/components/site/static/images/I3G8Q8SX.png
new file mode 100644
index 0000000000..a1f812c902
Binary files /dev/null and b/coldfront/components/site/static/images/I3G8Q8SX.png differ
diff --git a/coldfront/components/site/static/images/I4AQHDY2.png b/coldfront/components/site/static/images/I4AQHDY2.png
new file mode 100644
index 0000000000..d84c5e94b3
Binary files /dev/null and b/coldfront/components/site/static/images/I4AQHDY2.png differ
diff --git a/coldfront/components/site/static/images/I4KWPS94.png b/coldfront/components/site/static/images/I4KWPS94.png
new file mode 100644
index 0000000000..ab1d59955e
Binary files /dev/null and b/coldfront/components/site/static/images/I4KWPS94.png differ
diff --git a/coldfront/components/site/static/images/I5ACR765.png b/coldfront/components/site/static/images/I5ACR765.png
new file mode 100644
index 0000000000..d92042acf6
Binary files /dev/null and b/coldfront/components/site/static/images/I5ACR765.png differ
diff --git a/coldfront/components/site/static/images/I5Q52XEE.png b/coldfront/components/site/static/images/I5Q52XEE.png
new file mode 100644
index 0000000000..27b1855f66
Binary files /dev/null and b/coldfront/components/site/static/images/I5Q52XEE.png differ
diff --git a/coldfront/components/site/static/images/I67YQADF.png b/coldfront/components/site/static/images/I67YQADF.png
new file mode 100644
index 0000000000..3ac3656006
Binary files /dev/null and b/coldfront/components/site/static/images/I67YQADF.png differ
diff --git a/coldfront/components/site/static/images/I6YZ5WSK.png b/coldfront/components/site/static/images/I6YZ5WSK.png
new file mode 100644
index 0000000000..f9d131cfd9
Binary files /dev/null and b/coldfront/components/site/static/images/I6YZ5WSK.png differ
diff --git a/coldfront/components/site/static/images/I7AZBRQZ.png b/coldfront/components/site/static/images/I7AZBRQZ.png
new file mode 100644
index 0000000000..e3d5edaf48
Binary files /dev/null and b/coldfront/components/site/static/images/I7AZBRQZ.png differ
diff --git a/coldfront/components/site/static/images/I7UI6I5E.png b/coldfront/components/site/static/images/I7UI6I5E.png
new file mode 100644
index 0000000000..67ffa349b5
Binary files /dev/null and b/coldfront/components/site/static/images/I7UI6I5E.png differ
diff --git a/coldfront/components/site/static/images/I7VEDV8N.png b/coldfront/components/site/static/images/I7VEDV8N.png
new file mode 100644
index 0000000000..4f5cf0721f
Binary files /dev/null and b/coldfront/components/site/static/images/I7VEDV8N.png differ
diff --git a/coldfront/components/site/static/images/I922X2TU.png b/coldfront/components/site/static/images/I922X2TU.png
new file mode 100644
index 0000000000..23b260c3bc
Binary files /dev/null and b/coldfront/components/site/static/images/I922X2TU.png differ
diff --git a/coldfront/components/site/static/images/IA2AKR5J.png b/coldfront/components/site/static/images/IA2AKR5J.png
new file mode 100644
index 0000000000..35ee1031ea
Binary files /dev/null and b/coldfront/components/site/static/images/IA2AKR5J.png differ
diff --git a/coldfront/components/site/static/images/IA5JUTMD.png b/coldfront/components/site/static/images/IA5JUTMD.png
new file mode 100644
index 0000000000..e6da4d9b84
Binary files /dev/null and b/coldfront/components/site/static/images/IA5JUTMD.png differ
diff --git a/coldfront/components/site/static/images/IBYEC5LK.png b/coldfront/components/site/static/images/IBYEC5LK.png
new file mode 100644
index 0000000000..f4722969bb
Binary files /dev/null and b/coldfront/components/site/static/images/IBYEC5LK.png differ
diff --git a/coldfront/components/site/static/images/ICN484QM.png b/coldfront/components/site/static/images/ICN484QM.png
new file mode 100644
index 0000000000..fc3fa8b4ef
Binary files /dev/null and b/coldfront/components/site/static/images/ICN484QM.png differ
diff --git a/coldfront/components/site/static/images/IEL29GC6.png b/coldfront/components/site/static/images/IEL29GC6.png
new file mode 100644
index 0000000000..2ca62ead10
Binary files /dev/null and b/coldfront/components/site/static/images/IEL29GC6.png differ
diff --git a/coldfront/components/site/static/images/IER2DDP9.png b/coldfront/components/site/static/images/IER2DDP9.png
new file mode 100644
index 0000000000..5fba2b52a4
Binary files /dev/null and b/coldfront/components/site/static/images/IER2DDP9.png differ
diff --git a/coldfront/components/site/static/images/IESRG7KY.png b/coldfront/components/site/static/images/IESRG7KY.png
new file mode 100644
index 0000000000..653959ecd5
Binary files /dev/null and b/coldfront/components/site/static/images/IESRG7KY.png differ
diff --git a/coldfront/components/site/static/images/IEXBJGGV.png b/coldfront/components/site/static/images/IEXBJGGV.png
new file mode 100644
index 0000000000..cbe96d0d30
Binary files /dev/null and b/coldfront/components/site/static/images/IEXBJGGV.png differ
diff --git a/coldfront/components/site/static/images/IG6J352M.png b/coldfront/components/site/static/images/IG6J352M.png
new file mode 100644
index 0000000000..ba71d1d198
Binary files /dev/null and b/coldfront/components/site/static/images/IG6J352M.png differ
diff --git a/coldfront/components/site/static/images/IH43BBJF.png b/coldfront/components/site/static/images/IH43BBJF.png
new file mode 100644
index 0000000000..74e527a31d
Binary files /dev/null and b/coldfront/components/site/static/images/IH43BBJF.png differ
diff --git a/coldfront/components/site/static/images/IKF5ERYX.png b/coldfront/components/site/static/images/IKF5ERYX.png
new file mode 100644
index 0000000000..af5a3aac32
Binary files /dev/null and b/coldfront/components/site/static/images/IKF5ERYX.png differ
diff --git a/coldfront/components/site/static/images/IKYGVDWL.png b/coldfront/components/site/static/images/IKYGVDWL.png
new file mode 100644
index 0000000000..5d88877212
Binary files /dev/null and b/coldfront/components/site/static/images/IKYGVDWL.png differ
diff --git a/coldfront/components/site/static/images/IL56565Z.png b/coldfront/components/site/static/images/IL56565Z.png
new file mode 100644
index 0000000000..70ce30ccf9
Binary files /dev/null and b/coldfront/components/site/static/images/IL56565Z.png differ
diff --git a/coldfront/components/site/static/images/IL5RFIFF.png b/coldfront/components/site/static/images/IL5RFIFF.png
new file mode 100644
index 0000000000..8b8a88e747
Binary files /dev/null and b/coldfront/components/site/static/images/IL5RFIFF.png differ
diff --git a/coldfront/components/site/static/images/IN26KTMW.png b/coldfront/components/site/static/images/IN26KTMW.png
new file mode 100644
index 0000000000..1c9dac6e47
Binary files /dev/null and b/coldfront/components/site/static/images/IN26KTMW.png differ
diff --git a/coldfront/components/site/static/images/INTM6QLK.png b/coldfront/components/site/static/images/INTM6QLK.png
new file mode 100644
index 0000000000..d9686d4a87
Binary files /dev/null and b/coldfront/components/site/static/images/INTM6QLK.png differ
diff --git a/coldfront/components/site/static/images/IQC8TGVB.png b/coldfront/components/site/static/images/IQC8TGVB.png
new file mode 100644
index 0000000000..4e64bfbf3c
Binary files /dev/null and b/coldfront/components/site/static/images/IQC8TGVB.png differ
diff --git a/coldfront/components/site/static/images/IQHI8LUV.png b/coldfront/components/site/static/images/IQHI8LUV.png
new file mode 100644
index 0000000000..ba9b7fd9ab
Binary files /dev/null and b/coldfront/components/site/static/images/IQHI8LUV.png differ
diff --git a/coldfront/components/site/static/images/IRIMFU77.png b/coldfront/components/site/static/images/IRIMFU77.png
new file mode 100644
index 0000000000..417e2fd363
Binary files /dev/null and b/coldfront/components/site/static/images/IRIMFU77.png differ
diff --git a/coldfront/components/site/static/images/IS7BVQ77.png b/coldfront/components/site/static/images/IS7BVQ77.png
new file mode 100644
index 0000000000..553946f125
Binary files /dev/null and b/coldfront/components/site/static/images/IS7BVQ77.png differ
diff --git a/coldfront/components/site/static/images/ISIBN6KS.png b/coldfront/components/site/static/images/ISIBN6KS.png
new file mode 100644
index 0000000000..cd71a98af5
Binary files /dev/null and b/coldfront/components/site/static/images/ISIBN6KS.png differ
diff --git a/coldfront/components/site/static/images/ISVIWD9C.png b/coldfront/components/site/static/images/ISVIWD9C.png
new file mode 100644
index 0000000000..c4bf56866a
Binary files /dev/null and b/coldfront/components/site/static/images/ISVIWD9C.png differ
diff --git a/coldfront/components/site/static/images/ITGGVHQV.png b/coldfront/components/site/static/images/ITGGVHQV.png
new file mode 100644
index 0000000000..fc3fa8b4ef
Binary files /dev/null and b/coldfront/components/site/static/images/ITGGVHQV.png differ
diff --git a/coldfront/components/site/static/images/ITNAJ56K.png b/coldfront/components/site/static/images/ITNAJ56K.png
new file mode 100644
index 0000000000..e818cb005a
Binary files /dev/null and b/coldfront/components/site/static/images/ITNAJ56K.png differ
diff --git a/coldfront/components/site/static/images/IX8XY392.png b/coldfront/components/site/static/images/IX8XY392.png
new file mode 100644
index 0000000000..e715a882ba
Binary files /dev/null and b/coldfront/components/site/static/images/IX8XY392.png differ
diff --git a/coldfront/components/site/static/images/IXWVXJ8F.png b/coldfront/components/site/static/images/IXWVXJ8F.png
new file mode 100644
index 0000000000..d9686d4a87
Binary files /dev/null and b/coldfront/components/site/static/images/IXWVXJ8F.png differ
diff --git a/coldfront/components/site/static/images/IZJHZIX7.png b/coldfront/components/site/static/images/IZJHZIX7.png
new file mode 100644
index 0000000000..e7a55b3a57
Binary files /dev/null and b/coldfront/components/site/static/images/IZJHZIX7.png differ
diff --git a/coldfront/components/site/static/images/J2AWTWKN.png b/coldfront/components/site/static/images/J2AWTWKN.png
new file mode 100644
index 0000000000..4123a5c930
Binary files /dev/null and b/coldfront/components/site/static/images/J2AWTWKN.png differ
diff --git a/coldfront/components/site/static/images/J3FLY8M7.png b/coldfront/components/site/static/images/J3FLY8M7.png
new file mode 100644
index 0000000000..451c946bb7
Binary files /dev/null and b/coldfront/components/site/static/images/J3FLY8M7.png differ
diff --git a/coldfront/components/site/static/images/J44YF2VC.png b/coldfront/components/site/static/images/J44YF2VC.png
new file mode 100644
index 0000000000..3340bc2d82
Binary files /dev/null and b/coldfront/components/site/static/images/J44YF2VC.png differ
diff --git a/coldfront/components/site/static/images/J4A3WP77.png b/coldfront/components/site/static/images/J4A3WP77.png
new file mode 100644
index 0000000000..a0a0eb0fe6
Binary files /dev/null and b/coldfront/components/site/static/images/J4A3WP77.png differ
diff --git a/coldfront/components/site/static/images/J4BZFFD5.png b/coldfront/components/site/static/images/J4BZFFD5.png
new file mode 100644
index 0000000000..27ad75a34b
Binary files /dev/null and b/coldfront/components/site/static/images/J4BZFFD5.png differ
diff --git a/coldfront/components/site/static/images/J5EJT2NX.png b/coldfront/components/site/static/images/J5EJT2NX.png
new file mode 100644
index 0000000000..3242a18228
Binary files /dev/null and b/coldfront/components/site/static/images/J5EJT2NX.png differ
diff --git a/coldfront/components/site/static/images/J5PVJZSK.png b/coldfront/components/site/static/images/J5PVJZSK.png
new file mode 100644
index 0000000000..235710e118
Binary files /dev/null and b/coldfront/components/site/static/images/J5PVJZSK.png differ
diff --git a/coldfront/components/site/static/images/J6P4EG6C.png b/coldfront/components/site/static/images/J6P4EG6C.png
new file mode 100644
index 0000000000..8c64a50e22
Binary files /dev/null and b/coldfront/components/site/static/images/J6P4EG6C.png differ
diff --git a/coldfront/components/site/static/images/J6PS4BJL.png b/coldfront/components/site/static/images/J6PS4BJL.png
new file mode 100644
index 0000000000..5621ae8b18
Binary files /dev/null and b/coldfront/components/site/static/images/J6PS4BJL.png differ
diff --git a/coldfront/components/site/static/images/J7CFUTI2.png b/coldfront/components/site/static/images/J7CFUTI2.png
new file mode 100644
index 0000000000..a20f845885
Binary files /dev/null and b/coldfront/components/site/static/images/J7CFUTI2.png differ
diff --git a/coldfront/components/site/static/images/J8WWT4CI.png b/coldfront/components/site/static/images/J8WWT4CI.png
new file mode 100644
index 0000000000..d4b2abcd6d
Binary files /dev/null and b/coldfront/components/site/static/images/J8WWT4CI.png differ
diff --git a/coldfront/components/site/static/images/JA5RT9PR.png b/coldfront/components/site/static/images/JA5RT9PR.png
new file mode 100644
index 0000000000..ffdf121c18
Binary files /dev/null and b/coldfront/components/site/static/images/JA5RT9PR.png differ
diff --git a/coldfront/components/site/static/images/JAXEHFDU.png b/coldfront/components/site/static/images/JAXEHFDU.png
new file mode 100644
index 0000000000..2a18a8c423
Binary files /dev/null and b/coldfront/components/site/static/images/JAXEHFDU.png differ
diff --git a/coldfront/components/site/static/images/JB8VNT2B.png b/coldfront/components/site/static/images/JB8VNT2B.png
new file mode 100644
index 0000000000..1462b29f06
Binary files /dev/null and b/coldfront/components/site/static/images/JB8VNT2B.png differ
diff --git a/coldfront/components/site/static/images/JBWMWABC.png b/coldfront/components/site/static/images/JBWMWABC.png
new file mode 100644
index 0000000000..c4aafd62fe
Binary files /dev/null and b/coldfront/components/site/static/images/JBWMWABC.png differ
diff --git a/coldfront/components/site/static/images/JCIDZLME.png b/coldfront/components/site/static/images/JCIDZLME.png
new file mode 100644
index 0000000000..83296b5b2d
Binary files /dev/null and b/coldfront/components/site/static/images/JCIDZLME.png differ
diff --git a/coldfront/components/site/static/images/JDB2ZAEW.png b/coldfront/components/site/static/images/JDB2ZAEW.png
new file mode 100644
index 0000000000..57e7e9dfa5
Binary files /dev/null and b/coldfront/components/site/static/images/JDB2ZAEW.png differ
diff --git a/coldfront/components/site/static/images/JGSNZL73.png b/coldfront/components/site/static/images/JGSNZL73.png
new file mode 100644
index 0000000000..3b2e084998
Binary files /dev/null and b/coldfront/components/site/static/images/JGSNZL73.png differ
diff --git a/coldfront/components/site/static/images/JGVXGES2.png b/coldfront/components/site/static/images/JGVXGES2.png
new file mode 100644
index 0000000000..0dc50c0ffc
Binary files /dev/null and b/coldfront/components/site/static/images/JGVXGES2.png differ
diff --git a/coldfront/components/site/static/images/JINGMWHW.png b/coldfront/components/site/static/images/JINGMWHW.png
new file mode 100644
index 0000000000..39d887ade9
Binary files /dev/null and b/coldfront/components/site/static/images/JINGMWHW.png differ
diff --git a/coldfront/components/site/static/images/JINLHKZL.png b/coldfront/components/site/static/images/JINLHKZL.png
new file mode 100644
index 0000000000..bea8c21a00
Binary files /dev/null and b/coldfront/components/site/static/images/JINLHKZL.png differ
diff --git a/coldfront/components/site/static/images/JKDMSEZX.png b/coldfront/components/site/static/images/JKDMSEZX.png
new file mode 100644
index 0000000000..0ef918b90e
Binary files /dev/null and b/coldfront/components/site/static/images/JKDMSEZX.png differ
diff --git a/coldfront/components/site/static/images/JLL4JEJL.png b/coldfront/components/site/static/images/JLL4JEJL.png
new file mode 100644
index 0000000000..706c46d556
Binary files /dev/null and b/coldfront/components/site/static/images/JLL4JEJL.png differ
diff --git a/coldfront/components/site/static/images/JLSRDN4U.png b/coldfront/components/site/static/images/JLSRDN4U.png
new file mode 100644
index 0000000000..d9686d4a87
Binary files /dev/null and b/coldfront/components/site/static/images/JLSRDN4U.png differ
diff --git a/coldfront/components/site/static/images/JM89NE6K.png b/coldfront/components/site/static/images/JM89NE6K.png
new file mode 100644
index 0000000000..6139848a44
Binary files /dev/null and b/coldfront/components/site/static/images/JM89NE6K.png differ
diff --git a/coldfront/components/site/static/images/JMT6BJPP.png b/coldfront/components/site/static/images/JMT6BJPP.png
new file mode 100644
index 0000000000..56a2beaea9
Binary files /dev/null and b/coldfront/components/site/static/images/JMT6BJPP.png differ
diff --git a/coldfront/components/site/static/images/JR75RFIU.png b/coldfront/components/site/static/images/JR75RFIU.png
new file mode 100644
index 0000000000..663141cda6
Binary files /dev/null and b/coldfront/components/site/static/images/JR75RFIU.png differ
diff --git a/coldfront/components/site/static/images/JTQUEW9L.png b/coldfront/components/site/static/images/JTQUEW9L.png
new file mode 100644
index 0000000000..40ccb5156e
Binary files /dev/null and b/coldfront/components/site/static/images/JTQUEW9L.png differ
diff --git a/coldfront/components/site/static/images/JUCAQTAV.png b/coldfront/components/site/static/images/JUCAQTAV.png
new file mode 100644
index 0000000000..1c73c1a6b3
Binary files /dev/null and b/coldfront/components/site/static/images/JUCAQTAV.png differ
diff --git a/coldfront/components/site/static/images/JYGIGPCL.png b/coldfront/components/site/static/images/JYGIGPCL.png
new file mode 100644
index 0000000000..851639ea36
Binary files /dev/null and b/coldfront/components/site/static/images/JYGIGPCL.png differ
diff --git a/coldfront/components/site/static/images/JYUSL6SW.png b/coldfront/components/site/static/images/JYUSL6SW.png
new file mode 100644
index 0000000000..746db6463f
Binary files /dev/null and b/coldfront/components/site/static/images/JYUSL6SW.png differ
diff --git a/coldfront/components/site/static/images/JZM4Y9KC.png b/coldfront/components/site/static/images/JZM4Y9KC.png
new file mode 100644
index 0000000000..4cf9d8675a
Binary files /dev/null and b/coldfront/components/site/static/images/JZM4Y9KC.png differ
diff --git a/coldfront/components/site/static/images/K2E2AXJE.png b/coldfront/components/site/static/images/K2E2AXJE.png
new file mode 100644
index 0000000000..67b5ecbede
Binary files /dev/null and b/coldfront/components/site/static/images/K2E2AXJE.png differ
diff --git a/coldfront/components/site/static/images/K36W4DDY.png b/coldfront/components/site/static/images/K36W4DDY.png
new file mode 100644
index 0000000000..8d94384de3
Binary files /dev/null and b/coldfront/components/site/static/images/K36W4DDY.png differ
diff --git a/coldfront/components/site/static/images/K4696QCN.png b/coldfront/components/site/static/images/K4696QCN.png
new file mode 100644
index 0000000000..155a051f6a
Binary files /dev/null and b/coldfront/components/site/static/images/K4696QCN.png differ
diff --git a/coldfront/components/site/static/images/K4NJ58GC.png b/coldfront/components/site/static/images/K4NJ58GC.png
new file mode 100644
index 0000000000..f91833dc63
Binary files /dev/null and b/coldfront/components/site/static/images/K4NJ58GC.png differ
diff --git a/coldfront/components/site/static/images/K5EKB82C.png b/coldfront/components/site/static/images/K5EKB82C.png
new file mode 100644
index 0000000000..6d33d9b05e
Binary files /dev/null and b/coldfront/components/site/static/images/K5EKB82C.png differ
diff --git a/coldfront/components/site/static/images/K65NX3EW.png b/coldfront/components/site/static/images/K65NX3EW.png
new file mode 100644
index 0000000000..b8b7c7ac61
Binary files /dev/null and b/coldfront/components/site/static/images/K65NX3EW.png differ
diff --git a/coldfront/components/site/static/images/K8LB2Y6D.png b/coldfront/components/site/static/images/K8LB2Y6D.png
new file mode 100644
index 0000000000..72236bf1b3
Binary files /dev/null and b/coldfront/components/site/static/images/K8LB2Y6D.png differ
diff --git a/coldfront/components/site/static/images/KAWUFQ9W.png b/coldfront/components/site/static/images/KAWUFQ9W.png
new file mode 100644
index 0000000000..34181b7a2b
Binary files /dev/null and b/coldfront/components/site/static/images/KAWUFQ9W.png differ
diff --git a/coldfront/components/site/static/images/KBMX86HZ.png b/coldfront/components/site/static/images/KBMX86HZ.png
new file mode 100644
index 0000000000..3cd3d658b6
Binary files /dev/null and b/coldfront/components/site/static/images/KBMX86HZ.png differ
diff --git a/coldfront/components/site/static/images/KDL5U39P.png b/coldfront/components/site/static/images/KDL5U39P.png
new file mode 100644
index 0000000000..ca9a2e6b3a
Binary files /dev/null and b/coldfront/components/site/static/images/KDL5U39P.png differ
diff --git a/coldfront/components/site/static/images/KE634BYR.png b/coldfront/components/site/static/images/KE634BYR.png
new file mode 100644
index 0000000000..258305777c
Binary files /dev/null and b/coldfront/components/site/static/images/KE634BYR.png differ
diff --git a/coldfront/components/site/static/images/KEWIBTXR.png b/coldfront/components/site/static/images/KEWIBTXR.png
new file mode 100644
index 0000000000..7ec75542df
Binary files /dev/null and b/coldfront/components/site/static/images/KEWIBTXR.png differ
diff --git a/coldfront/components/site/static/images/KH6IDWX7.png b/coldfront/components/site/static/images/KH6IDWX7.png
new file mode 100644
index 0000000000..a81e013c82
Binary files /dev/null and b/coldfront/components/site/static/images/KH6IDWX7.png differ
diff --git a/coldfront/components/site/static/images/KJ6JYPR4.png b/coldfront/components/site/static/images/KJ6JYPR4.png
new file mode 100644
index 0000000000..7f1d2957e2
Binary files /dev/null and b/coldfront/components/site/static/images/KJ6JYPR4.png differ
diff --git a/coldfront/components/site/static/images/KJKEJJXH.png b/coldfront/components/site/static/images/KJKEJJXH.png
new file mode 100644
index 0000000000..225bd9063f
Binary files /dev/null and b/coldfront/components/site/static/images/KJKEJJXH.png differ
diff --git a/coldfront/components/site/static/images/KJL5FH6G.png b/coldfront/components/site/static/images/KJL5FH6G.png
new file mode 100644
index 0000000000..0c38473786
Binary files /dev/null and b/coldfront/components/site/static/images/KJL5FH6G.png differ
diff --git a/coldfront/components/site/static/images/KLAR4E92.png b/coldfront/components/site/static/images/KLAR4E92.png
new file mode 100644
index 0000000000..2938351f22
Binary files /dev/null and b/coldfront/components/site/static/images/KLAR4E92.png differ
diff --git a/coldfront/components/site/static/images/KM9SZ58H.png b/coldfront/components/site/static/images/KM9SZ58H.png
new file mode 100644
index 0000000000..7f6bfd6a37
Binary files /dev/null and b/coldfront/components/site/static/images/KM9SZ58H.png differ
diff --git a/coldfront/components/site/static/images/KN6KJ8F4.png b/coldfront/components/site/static/images/KN6KJ8F4.png
new file mode 100644
index 0000000000..165c50ff82
Binary files /dev/null and b/coldfront/components/site/static/images/KN6KJ8F4.png differ
diff --git a/coldfront/components/site/static/images/KPP5Q5MQ.png b/coldfront/components/site/static/images/KPP5Q5MQ.png
new file mode 100644
index 0000000000..402d83e6d7
Binary files /dev/null and b/coldfront/components/site/static/images/KPP5Q5MQ.png differ
diff --git a/coldfront/components/site/static/images/KRRLE7B9.png b/coldfront/components/site/static/images/KRRLE7B9.png
new file mode 100644
index 0000000000..a313dcf45f
Binary files /dev/null and b/coldfront/components/site/static/images/KRRLE7B9.png differ
diff --git a/coldfront/components/site/static/images/KS57IPTL.png b/coldfront/components/site/static/images/KS57IPTL.png
new file mode 100644
index 0000000000..a0922f6df1
Binary files /dev/null and b/coldfront/components/site/static/images/KS57IPTL.png differ
diff --git a/coldfront/components/site/static/images/KSIWJDFH.png b/coldfront/components/site/static/images/KSIWJDFH.png
new file mode 100644
index 0000000000..8b26e07545
Binary files /dev/null and b/coldfront/components/site/static/images/KSIWJDFH.png differ
diff --git a/coldfront/components/site/static/images/KVM764EB.png b/coldfront/components/site/static/images/KVM764EB.png
new file mode 100644
index 0000000000..455dcb615d
Binary files /dev/null and b/coldfront/components/site/static/images/KVM764EB.png differ
diff --git a/coldfront/components/site/static/images/KWS3SIKG.png b/coldfront/components/site/static/images/KWS3SIKG.png
new file mode 100644
index 0000000000..cdf01721c5
Binary files /dev/null and b/coldfront/components/site/static/images/KWS3SIKG.png differ
diff --git a/coldfront/components/site/static/images/KYIVF3RU.png b/coldfront/components/site/static/images/KYIVF3RU.png
new file mode 100644
index 0000000000..562495645d
Binary files /dev/null and b/coldfront/components/site/static/images/KYIVF3RU.png differ
diff --git a/coldfront/components/site/static/images/KYIXLX8X.png b/coldfront/components/site/static/images/KYIXLX8X.png
new file mode 100644
index 0000000000..c7a5fb0140
Binary files /dev/null and b/coldfront/components/site/static/images/KYIXLX8X.png differ
diff --git a/coldfront/components/site/static/images/L26QSQGK.png b/coldfront/components/site/static/images/L26QSQGK.png
new file mode 100644
index 0000000000..e8dabfbdb3
Binary files /dev/null and b/coldfront/components/site/static/images/L26QSQGK.png differ
diff --git a/coldfront/components/site/static/images/L3Q8DVAT.png b/coldfront/components/site/static/images/L3Q8DVAT.png
new file mode 100644
index 0000000000..16138263fd
Binary files /dev/null and b/coldfront/components/site/static/images/L3Q8DVAT.png differ
diff --git a/coldfront/components/site/static/images/L4NFKPEG.png b/coldfront/components/site/static/images/L4NFKPEG.png
new file mode 100644
index 0000000000..e2568788f2
Binary files /dev/null and b/coldfront/components/site/static/images/L4NFKPEG.png differ
diff --git a/coldfront/components/site/static/images/L8GCXQ72.png b/coldfront/components/site/static/images/L8GCXQ72.png
new file mode 100644
index 0000000000..ab468ee3d6
Binary files /dev/null and b/coldfront/components/site/static/images/L8GCXQ72.png differ
diff --git a/coldfront/components/site/static/images/LC72CU7H.png b/coldfront/components/site/static/images/LC72CU7H.png
new file mode 100644
index 0000000000..67b5ecbede
Binary files /dev/null and b/coldfront/components/site/static/images/LC72CU7H.png differ
diff --git a/coldfront/components/site/static/images/LC7XJ23I.png b/coldfront/components/site/static/images/LC7XJ23I.png
new file mode 100644
index 0000000000..f9d131cfd9
Binary files /dev/null and b/coldfront/components/site/static/images/LC7XJ23I.png differ
diff --git a/coldfront/components/site/static/images/LCBA4MP4.png b/coldfront/components/site/static/images/LCBA4MP4.png
new file mode 100644
index 0000000000..aa35bdba58
Binary files /dev/null and b/coldfront/components/site/static/images/LCBA4MP4.png differ
diff --git a/coldfront/components/site/static/images/LF83PFAQ.png b/coldfront/components/site/static/images/LF83PFAQ.png
new file mode 100644
index 0000000000..233375faae
Binary files /dev/null and b/coldfront/components/site/static/images/LF83PFAQ.png differ
diff --git a/coldfront/components/site/static/images/LGUZ7QCQ.png b/coldfront/components/site/static/images/LGUZ7QCQ.png
new file mode 100644
index 0000000000..a0a9b80e9d
Binary files /dev/null and b/coldfront/components/site/static/images/LGUZ7QCQ.png differ
diff --git a/coldfront/components/site/static/images/LMFF3BL4.png b/coldfront/components/site/static/images/LMFF3BL4.png
new file mode 100644
index 0000000000..a81e013c82
Binary files /dev/null and b/coldfront/components/site/static/images/LMFF3BL4.png differ
diff --git a/coldfront/components/site/static/images/LNAKZRWE.png b/coldfront/components/site/static/images/LNAKZRWE.png
new file mode 100644
index 0000000000..0fa39c4b0d
Binary files /dev/null and b/coldfront/components/site/static/images/LNAKZRWE.png differ
diff --git a/coldfront/components/site/static/images/LNFZ39ZX.png b/coldfront/components/site/static/images/LNFZ39ZX.png
new file mode 100644
index 0000000000..b15e7bdad9
Binary files /dev/null and b/coldfront/components/site/static/images/LNFZ39ZX.png differ
diff --git a/coldfront/components/site/static/images/LNY8WKB7.png b/coldfront/components/site/static/images/LNY8WKB7.png
new file mode 100644
index 0000000000..392f9ba644
Binary files /dev/null and b/coldfront/components/site/static/images/LNY8WKB7.png differ
diff --git a/coldfront/components/site/static/images/LP2DH8WX.png b/coldfront/components/site/static/images/LP2DH8WX.png
new file mode 100644
index 0000000000..726290d38d
Binary files /dev/null and b/coldfront/components/site/static/images/LP2DH8WX.png differ
diff --git a/coldfront/components/site/static/images/LQMTBV9X.png b/coldfront/components/site/static/images/LQMTBV9X.png
new file mode 100644
index 0000000000..81d153dc69
Binary files /dev/null and b/coldfront/components/site/static/images/LQMTBV9X.png differ
diff --git a/coldfront/components/site/static/images/LQVIDQKJ.png b/coldfront/components/site/static/images/LQVIDQKJ.png
new file mode 100644
index 0000000000..50bec34aa0
Binary files /dev/null and b/coldfront/components/site/static/images/LQVIDQKJ.png differ
diff --git a/coldfront/components/site/static/images/LR4PNBTW.png b/coldfront/components/site/static/images/LR4PNBTW.png
new file mode 100644
index 0000000000..fab07837b7
Binary files /dev/null and b/coldfront/components/site/static/images/LR4PNBTW.png differ
diff --git a/coldfront/components/site/static/images/LRUSGG24.png b/coldfront/components/site/static/images/LRUSGG24.png
new file mode 100644
index 0000000000..f1296d9874
Binary files /dev/null and b/coldfront/components/site/static/images/LRUSGG24.png differ
diff --git a/coldfront/components/site/static/images/LRWN8XIT.png b/coldfront/components/site/static/images/LRWN8XIT.png
new file mode 100644
index 0000000000..ec796241a4
Binary files /dev/null and b/coldfront/components/site/static/images/LRWN8XIT.png differ
diff --git a/coldfront/components/site/static/images/LS97JMKY.png b/coldfront/components/site/static/images/LS97JMKY.png
new file mode 100644
index 0000000000..b5b93f0fa2
Binary files /dev/null and b/coldfront/components/site/static/images/LS97JMKY.png differ
diff --git a/coldfront/components/site/static/images/LSRTB9ZU.png b/coldfront/components/site/static/images/LSRTB9ZU.png
new file mode 100644
index 0000000000..668fff9af2
Binary files /dev/null and b/coldfront/components/site/static/images/LSRTB9ZU.png differ
diff --git a/coldfront/components/site/static/images/LU3E8KG8.png b/coldfront/components/site/static/images/LU3E8KG8.png
new file mode 100644
index 0000000000..b746bd9086
Binary files /dev/null and b/coldfront/components/site/static/images/LU3E8KG8.png differ
diff --git a/coldfront/components/site/static/images/LV7IIBGH.png b/coldfront/components/site/static/images/LV7IIBGH.png
new file mode 100644
index 0000000000..7f6d44ffb8
Binary files /dev/null and b/coldfront/components/site/static/images/LV7IIBGH.png differ
diff --git a/coldfront/components/site/static/images/LVBIYIIS.png b/coldfront/components/site/static/images/LVBIYIIS.png
new file mode 100644
index 0000000000..d25fc66e19
Binary files /dev/null and b/coldfront/components/site/static/images/LVBIYIIS.png differ
diff --git a/coldfront/components/site/static/images/LVIZK66G.png b/coldfront/components/site/static/images/LVIZK66G.png
new file mode 100644
index 0000000000..6aa7a78e98
Binary files /dev/null and b/coldfront/components/site/static/images/LVIZK66G.png differ
diff --git a/coldfront/components/site/static/images/LY2QD9TN.png b/coldfront/components/site/static/images/LY2QD9TN.png
new file mode 100644
index 0000000000..f50abbbb9c
Binary files /dev/null and b/coldfront/components/site/static/images/LY2QD9TN.png differ
diff --git a/coldfront/components/site/static/images/LYEIND5Y.png b/coldfront/components/site/static/images/LYEIND5Y.png
new file mode 100644
index 0000000000..ebbaa9c975
Binary files /dev/null and b/coldfront/components/site/static/images/LYEIND5Y.png differ
diff --git a/coldfront/components/site/static/images/M3Y42RH3.png b/coldfront/components/site/static/images/M3Y42RH3.png
new file mode 100644
index 0000000000..bc4dc6204f
Binary files /dev/null and b/coldfront/components/site/static/images/M3Y42RH3.png differ
diff --git a/coldfront/components/site/static/images/M3YPX67T.png b/coldfront/components/site/static/images/M3YPX67T.png
new file mode 100644
index 0000000000..b99ba51d6d
Binary files /dev/null and b/coldfront/components/site/static/images/M3YPX67T.png differ
diff --git a/coldfront/components/site/static/images/M445BCAU.png b/coldfront/components/site/static/images/M445BCAU.png
new file mode 100644
index 0000000000..e92b4a6f08
Binary files /dev/null and b/coldfront/components/site/static/images/M445BCAU.png differ
diff --git a/coldfront/components/site/static/images/M465DVI4.png b/coldfront/components/site/static/images/M465DVI4.png
new file mode 100644
index 0000000000..8c64a50e22
Binary files /dev/null and b/coldfront/components/site/static/images/M465DVI4.png differ
diff --git a/coldfront/components/site/static/images/M4C3PENI.png b/coldfront/components/site/static/images/M4C3PENI.png
new file mode 100644
index 0000000000..9debb2aceb
Binary files /dev/null and b/coldfront/components/site/static/images/M4C3PENI.png differ
diff --git a/coldfront/components/site/static/images/M5RGU5ZI.png b/coldfront/components/site/static/images/M5RGU5ZI.png
new file mode 100644
index 0000000000..1e670bfc9e
Binary files /dev/null and b/coldfront/components/site/static/images/M5RGU5ZI.png differ
diff --git a/coldfront/components/site/static/images/M6B2HCN7.png b/coldfront/components/site/static/images/M6B2HCN7.png
new file mode 100644
index 0000000000..11179afe6e
Binary files /dev/null and b/coldfront/components/site/static/images/M6B2HCN7.png differ
diff --git a/coldfront/components/site/static/images/M753UEK2.png b/coldfront/components/site/static/images/M753UEK2.png
new file mode 100644
index 0000000000..f3c9513c9f
Binary files /dev/null and b/coldfront/components/site/static/images/M753UEK2.png differ
diff --git a/coldfront/components/site/static/images/M7W4LD8R.png b/coldfront/components/site/static/images/M7W4LD8R.png
new file mode 100644
index 0000000000..9debb2aceb
Binary files /dev/null and b/coldfront/components/site/static/images/M7W4LD8R.png differ
diff --git a/coldfront/components/site/static/images/M84VU9RK.png b/coldfront/components/site/static/images/M84VU9RK.png
new file mode 100644
index 0000000000..6068637c5c
Binary files /dev/null and b/coldfront/components/site/static/images/M84VU9RK.png differ
diff --git a/coldfront/components/site/static/images/M8Q7VUM3.png b/coldfront/components/site/static/images/M8Q7VUM3.png
new file mode 100644
index 0000000000..2189b23729
Binary files /dev/null and b/coldfront/components/site/static/images/M8Q7VUM3.png differ
diff --git a/coldfront/components/site/static/images/M9TQFH5B.png b/coldfront/components/site/static/images/M9TQFH5B.png
new file mode 100644
index 0000000000..17d8f27aea
Binary files /dev/null and b/coldfront/components/site/static/images/M9TQFH5B.png differ
diff --git a/coldfront/components/site/static/images/MDUH4NAF.png b/coldfront/components/site/static/images/MDUH4NAF.png
new file mode 100644
index 0000000000..42ef5b2a74
Binary files /dev/null and b/coldfront/components/site/static/images/MDUH4NAF.png differ
diff --git a/coldfront/components/site/static/images/MEUK2BCD.png b/coldfront/components/site/static/images/MEUK2BCD.png
new file mode 100644
index 0000000000..c2b35708d6
Binary files /dev/null and b/coldfront/components/site/static/images/MEUK2BCD.png differ
diff --git a/coldfront/components/site/static/images/MFMIJHF6.png b/coldfront/components/site/static/images/MFMIJHF6.png
new file mode 100644
index 0000000000..46bbfc53bd
Binary files /dev/null and b/coldfront/components/site/static/images/MFMIJHF6.png differ
diff --git a/coldfront/components/site/static/images/MGQCZ8WZ.png b/coldfront/components/site/static/images/MGQCZ8WZ.png
new file mode 100644
index 0000000000..b15e7bdad9
Binary files /dev/null and b/coldfront/components/site/static/images/MGQCZ8WZ.png differ
diff --git a/coldfront/components/site/static/images/MJ34KDJS.png b/coldfront/components/site/static/images/MJ34KDJS.png
new file mode 100644
index 0000000000..0d92e08e9b
Binary files /dev/null and b/coldfront/components/site/static/images/MJ34KDJS.png differ
diff --git a/coldfront/components/site/static/images/MJ433T6R.png b/coldfront/components/site/static/images/MJ433T6R.png
new file mode 100644
index 0000000000..6869e6ae80
Binary files /dev/null and b/coldfront/components/site/static/images/MJ433T6R.png differ
diff --git a/coldfront/components/site/static/images/MJ6G883H.png b/coldfront/components/site/static/images/MJ6G883H.png
new file mode 100644
index 0000000000..bc9738886c
Binary files /dev/null and b/coldfront/components/site/static/images/MJ6G883H.png differ
diff --git a/coldfront/components/site/static/images/MJ6IU8ND.png b/coldfront/components/site/static/images/MJ6IU8ND.png
new file mode 100644
index 0000000000..36233a2206
Binary files /dev/null and b/coldfront/components/site/static/images/MJ6IU8ND.png differ
diff --git a/coldfront/components/site/static/images/MJKFBQDF.png b/coldfront/components/site/static/images/MJKFBQDF.png
new file mode 100644
index 0000000000..d83953537c
Binary files /dev/null and b/coldfront/components/site/static/images/MJKFBQDF.png differ
diff --git a/coldfront/components/site/static/images/MMGSCNPB.png b/coldfront/components/site/static/images/MMGSCNPB.png
new file mode 100644
index 0000000000..7b023d587d
Binary files /dev/null and b/coldfront/components/site/static/images/MMGSCNPB.png differ
diff --git a/coldfront/components/site/static/images/MMHZRBXI.png b/coldfront/components/site/static/images/MMHZRBXI.png
new file mode 100644
index 0000000000..fcfa825442
Binary files /dev/null and b/coldfront/components/site/static/images/MMHZRBXI.png differ
diff --git a/coldfront/components/site/static/images/MMN8Z9ZJ.png b/coldfront/components/site/static/images/MMN8Z9ZJ.png
new file mode 100644
index 0000000000..7e425700a9
Binary files /dev/null and b/coldfront/components/site/static/images/MMN8Z9ZJ.png differ
diff --git a/coldfront/components/site/static/images/MMZ6Z5JX.png b/coldfront/components/site/static/images/MMZ6Z5JX.png
new file mode 100644
index 0000000000..f097750ca2
Binary files /dev/null and b/coldfront/components/site/static/images/MMZ6Z5JX.png differ
diff --git a/coldfront/components/site/static/images/MMZE8ZR5.png b/coldfront/components/site/static/images/MMZE8ZR5.png
new file mode 100644
index 0000000000..285ece2cad
Binary files /dev/null and b/coldfront/components/site/static/images/MMZE8ZR5.png differ
diff --git a/coldfront/components/site/static/images/MN9NE57I.png b/coldfront/components/site/static/images/MN9NE57I.png
new file mode 100644
index 0000000000..8d9ac68fb6
Binary files /dev/null and b/coldfront/components/site/static/images/MN9NE57I.png differ
diff --git a/coldfront/components/site/static/images/MNK8VUTT.png b/coldfront/components/site/static/images/MNK8VUTT.png
new file mode 100644
index 0000000000..510f01633e
Binary files /dev/null and b/coldfront/components/site/static/images/MNK8VUTT.png differ
diff --git a/coldfront/components/site/static/images/MNLV5RP2.png b/coldfront/components/site/static/images/MNLV5RP2.png
new file mode 100644
index 0000000000..a5ee40d80f
Binary files /dev/null and b/coldfront/components/site/static/images/MNLV5RP2.png differ
diff --git a/coldfront/components/site/static/images/MNUWS2WV.png b/coldfront/components/site/static/images/MNUWS2WV.png
new file mode 100644
index 0000000000..ae46bd247d
Binary files /dev/null and b/coldfront/components/site/static/images/MNUWS2WV.png differ
diff --git a/coldfront/components/site/static/images/MPISGHEC.png b/coldfront/components/site/static/images/MPISGHEC.png
new file mode 100644
index 0000000000..418bf5df2d
Binary files /dev/null and b/coldfront/components/site/static/images/MPISGHEC.png differ
diff --git a/coldfront/components/site/static/images/MQCTUGW7.png b/coldfront/components/site/static/images/MQCTUGW7.png
new file mode 100644
index 0000000000..26f3eeaa90
Binary files /dev/null and b/coldfront/components/site/static/images/MQCTUGW7.png differ
diff --git a/coldfront/components/site/static/images/MRB2GQMI.png b/coldfront/components/site/static/images/MRB2GQMI.png
new file mode 100644
index 0000000000..c0c605f727
Binary files /dev/null and b/coldfront/components/site/static/images/MRB2GQMI.png differ
diff --git a/coldfront/components/site/static/images/MRSEQA4V.png b/coldfront/components/site/static/images/MRSEQA4V.png
new file mode 100644
index 0000000000..6d621e7ddd
Binary files /dev/null and b/coldfront/components/site/static/images/MRSEQA4V.png differ
diff --git a/coldfront/components/site/static/images/MTAUR86Y.png b/coldfront/components/site/static/images/MTAUR86Y.png
new file mode 100644
index 0000000000..c55255af95
Binary files /dev/null and b/coldfront/components/site/static/images/MTAUR86Y.png differ
diff --git a/coldfront/components/site/static/images/MUH7SEAZ.png b/coldfront/components/site/static/images/MUH7SEAZ.png
new file mode 100644
index 0000000000..63aa125c66
Binary files /dev/null and b/coldfront/components/site/static/images/MUH7SEAZ.png differ
diff --git a/coldfront/components/site/static/images/MUL4JYFV.png b/coldfront/components/site/static/images/MUL4JYFV.png
new file mode 100644
index 0000000000..76e3fa84d0
Binary files /dev/null and b/coldfront/components/site/static/images/MUL4JYFV.png differ
diff --git a/coldfront/components/site/static/images/MUT7Y55M.png b/coldfront/components/site/static/images/MUT7Y55M.png
new file mode 100644
index 0000000000..b51c538c37
Binary files /dev/null and b/coldfront/components/site/static/images/MUT7Y55M.png differ
diff --git a/coldfront/components/site/static/images/MVN7HNSA.png b/coldfront/components/site/static/images/MVN7HNSA.png
new file mode 100644
index 0000000000..1ebcfe96c6
Binary files /dev/null and b/coldfront/components/site/static/images/MVN7HNSA.png differ
diff --git a/coldfront/components/site/static/images/MYD5D2UY.png b/coldfront/components/site/static/images/MYD5D2UY.png
new file mode 100644
index 0000000000..6068637c5c
Binary files /dev/null and b/coldfront/components/site/static/images/MYD5D2UY.png differ
diff --git a/coldfront/components/site/static/images/MYEZBMSD.png b/coldfront/components/site/static/images/MYEZBMSD.png
new file mode 100644
index 0000000000..efc5cc5994
Binary files /dev/null and b/coldfront/components/site/static/images/MYEZBMSD.png differ
diff --git a/coldfront/components/site/static/images/MZ2C4VQR.png b/coldfront/components/site/static/images/MZ2C4VQR.png
new file mode 100644
index 0000000000..c867f557e6
Binary files /dev/null and b/coldfront/components/site/static/images/MZ2C4VQR.png differ
diff --git a/coldfront/components/site/static/images/MZ5XRJWU.png b/coldfront/components/site/static/images/MZ5XRJWU.png
new file mode 100644
index 0000000000..b82441b6c9
Binary files /dev/null and b/coldfront/components/site/static/images/MZ5XRJWU.png differ
diff --git a/coldfront/components/site/static/images/N3MV3MQH.png b/coldfront/components/site/static/images/N3MV3MQH.png
new file mode 100644
index 0000000000..a550edef98
Binary files /dev/null and b/coldfront/components/site/static/images/N3MV3MQH.png differ
diff --git a/coldfront/components/site/static/images/N3TNUY8C.png b/coldfront/components/site/static/images/N3TNUY8C.png
new file mode 100644
index 0000000000..8d94384de3
Binary files /dev/null and b/coldfront/components/site/static/images/N3TNUY8C.png differ
diff --git a/coldfront/components/site/static/images/N4L9ZUK8.png b/coldfront/components/site/static/images/N4L9ZUK8.png
new file mode 100644
index 0000000000..37c8c8fd69
Binary files /dev/null and b/coldfront/components/site/static/images/N4L9ZUK8.png differ
diff --git a/coldfront/components/site/static/images/N4ZREJI8.png b/coldfront/components/site/static/images/N4ZREJI8.png
new file mode 100644
index 0000000000..e298afe284
Binary files /dev/null and b/coldfront/components/site/static/images/N4ZREJI8.png differ
diff --git a/coldfront/components/site/static/images/N7KCTC3G.png b/coldfront/components/site/static/images/N7KCTC3G.png
new file mode 100644
index 0000000000..80aaab2b41
Binary files /dev/null and b/coldfront/components/site/static/images/N7KCTC3G.png differ
diff --git a/coldfront/components/site/static/images/N85WIHLW.png b/coldfront/components/site/static/images/N85WIHLW.png
new file mode 100644
index 0000000000..35ee1031ea
Binary files /dev/null and b/coldfront/components/site/static/images/N85WIHLW.png differ
diff --git a/coldfront/components/site/static/images/N949J392.png b/coldfront/components/site/static/images/N949J392.png
new file mode 100644
index 0000000000..1ec9e3ab9f
Binary files /dev/null and b/coldfront/components/site/static/images/N949J392.png differ
diff --git a/coldfront/components/site/static/images/N9DFRBXL.png b/coldfront/components/site/static/images/N9DFRBXL.png
new file mode 100644
index 0000000000..e8dabfbdb3
Binary files /dev/null and b/coldfront/components/site/static/images/N9DFRBXL.png differ
diff --git a/coldfront/components/site/static/images/NAEFYKKB.png b/coldfront/components/site/static/images/NAEFYKKB.png
new file mode 100644
index 0000000000..6f3cd04f82
Binary files /dev/null and b/coldfront/components/site/static/images/NAEFYKKB.png differ
diff --git a/coldfront/components/site/static/images/NCDQQ7BX.png b/coldfront/components/site/static/images/NCDQQ7BX.png
new file mode 100644
index 0000000000..1964cb38f7
Binary files /dev/null and b/coldfront/components/site/static/images/NCDQQ7BX.png differ
diff --git a/coldfront/components/site/static/images/NCKKBL7R.png b/coldfront/components/site/static/images/NCKKBL7R.png
new file mode 100644
index 0000000000..56da572ec1
Binary files /dev/null and b/coldfront/components/site/static/images/NCKKBL7R.png differ
diff --git a/coldfront/components/site/static/images/ND4ZLDA3.png b/coldfront/components/site/static/images/ND4ZLDA3.png
new file mode 100644
index 0000000000..080d424ff7
Binary files /dev/null and b/coldfront/components/site/static/images/ND4ZLDA3.png differ
diff --git a/coldfront/components/site/static/images/NDBAVWR9.png b/coldfront/components/site/static/images/NDBAVWR9.png
new file mode 100644
index 0000000000..17d5db3381
Binary files /dev/null and b/coldfront/components/site/static/images/NDBAVWR9.png differ
diff --git a/coldfront/components/site/static/images/NFGCKY5V.png b/coldfront/components/site/static/images/NFGCKY5V.png
new file mode 100644
index 0000000000..efc5cc5994
Binary files /dev/null and b/coldfront/components/site/static/images/NFGCKY5V.png differ
diff --git a/coldfront/components/site/static/images/NFTG44KA.png b/coldfront/components/site/static/images/NFTG44KA.png
new file mode 100644
index 0000000000..253626feaa
Binary files /dev/null and b/coldfront/components/site/static/images/NFTG44KA.png differ
diff --git a/coldfront/components/site/static/images/NG6WYJ73.png b/coldfront/components/site/static/images/NG6WYJ73.png
new file mode 100644
index 0000000000..5d8b055373
Binary files /dev/null and b/coldfront/components/site/static/images/NG6WYJ73.png differ
diff --git a/coldfront/components/site/static/images/NGZ5KTPS.png b/coldfront/components/site/static/images/NGZ5KTPS.png
new file mode 100644
index 0000000000..021f83d512
Binary files /dev/null and b/coldfront/components/site/static/images/NGZ5KTPS.png differ
diff --git a/coldfront/components/site/static/images/NHPWFVHJ.png b/coldfront/components/site/static/images/NHPWFVHJ.png
new file mode 100644
index 0000000000..d89fcd4b1c
Binary files /dev/null and b/coldfront/components/site/static/images/NHPWFVHJ.png differ
diff --git a/coldfront/components/site/static/images/NHUEWDPN.png b/coldfront/components/site/static/images/NHUEWDPN.png
new file mode 100644
index 0000000000..4077b1e55c
Binary files /dev/null and b/coldfront/components/site/static/images/NHUEWDPN.png differ
diff --git a/coldfront/components/site/static/images/NIN4ZN8A.png b/coldfront/components/site/static/images/NIN4ZN8A.png
new file mode 100644
index 0000000000..671a05560a
Binary files /dev/null and b/coldfront/components/site/static/images/NIN4ZN8A.png differ
diff --git a/coldfront/components/site/static/images/NIQSYU66.png b/coldfront/components/site/static/images/NIQSYU66.png
new file mode 100644
index 0000000000..8159cd11a8
Binary files /dev/null and b/coldfront/components/site/static/images/NIQSYU66.png differ
diff --git a/coldfront/components/site/static/images/NJHXTNWF.png b/coldfront/components/site/static/images/NJHXTNWF.png
new file mode 100644
index 0000000000..a342ef5701
Binary files /dev/null and b/coldfront/components/site/static/images/NJHXTNWF.png differ
diff --git a/coldfront/components/site/static/images/NJPU6PY6.png b/coldfront/components/site/static/images/NJPU6PY6.png
new file mode 100644
index 0000000000..1cd6d9c47c
Binary files /dev/null and b/coldfront/components/site/static/images/NJPU6PY6.png differ
diff --git a/coldfront/components/site/static/images/NL8MWFXD.png b/coldfront/components/site/static/images/NL8MWFXD.png
new file mode 100644
index 0000000000..9c6ba92d17
Binary files /dev/null and b/coldfront/components/site/static/images/NL8MWFXD.png differ
diff --git a/coldfront/components/site/static/images/NL8V8MZ2.png b/coldfront/components/site/static/images/NL8V8MZ2.png
new file mode 100644
index 0000000000..6139848a44
Binary files /dev/null and b/coldfront/components/site/static/images/NL8V8MZ2.png differ
diff --git a/coldfront/components/site/static/images/NLFEUFPW.png b/coldfront/components/site/static/images/NLFEUFPW.png
new file mode 100644
index 0000000000..4acca2340d
Binary files /dev/null and b/coldfront/components/site/static/images/NLFEUFPW.png differ
diff --git a/coldfront/components/site/static/images/NLZCQ9M8.png b/coldfront/components/site/static/images/NLZCQ9M8.png
new file mode 100644
index 0000000000..da1e3d239b
Binary files /dev/null and b/coldfront/components/site/static/images/NLZCQ9M8.png differ
diff --git a/coldfront/components/site/static/images/NM5QVE8K.png b/coldfront/components/site/static/images/NM5QVE8K.png
new file mode 100644
index 0000000000..8448f95fa2
Binary files /dev/null and b/coldfront/components/site/static/images/NM5QVE8K.png differ
diff --git a/coldfront/components/site/static/images/NND5FHVD.png b/coldfront/components/site/static/images/NND5FHVD.png
new file mode 100644
index 0000000000..6cf0dc10c4
Binary files /dev/null and b/coldfront/components/site/static/images/NND5FHVD.png differ
diff --git a/coldfront/components/site/static/images/NQ9M2Z3Y.png b/coldfront/components/site/static/images/NQ9M2Z3Y.png
new file mode 100644
index 0000000000..86e15be8f8
Binary files /dev/null and b/coldfront/components/site/static/images/NQ9M2Z3Y.png differ
diff --git a/coldfront/components/site/static/images/NQKUDYND.png b/coldfront/components/site/static/images/NQKUDYND.png
new file mode 100644
index 0000000000..db386c6285
Binary files /dev/null and b/coldfront/components/site/static/images/NQKUDYND.png differ
diff --git a/coldfront/components/site/static/images/NR3IPS3U.png b/coldfront/components/site/static/images/NR3IPS3U.png
new file mode 100644
index 0000000000..1ce3abec24
Binary files /dev/null and b/coldfront/components/site/static/images/NR3IPS3U.png differ
diff --git a/coldfront/components/site/static/images/NS9ZRS8U.png b/coldfront/components/site/static/images/NS9ZRS8U.png
new file mode 100644
index 0000000000..f3fe14b730
Binary files /dev/null and b/coldfront/components/site/static/images/NS9ZRS8U.png differ
diff --git a/coldfront/components/site/static/images/NTQ326KE.png b/coldfront/components/site/static/images/NTQ326KE.png
new file mode 100644
index 0000000000..038c26f588
Binary files /dev/null and b/coldfront/components/site/static/images/NTQ326KE.png differ
diff --git a/coldfront/components/site/static/images/NVH9X52N.png b/coldfront/components/site/static/images/NVH9X52N.png
new file mode 100644
index 0000000000..e9e9f86c77
Binary files /dev/null and b/coldfront/components/site/static/images/NVH9X52N.png differ
diff --git a/coldfront/components/site/static/images/NW88LLED.png b/coldfront/components/site/static/images/NW88LLED.png
new file mode 100644
index 0000000000..d278413701
Binary files /dev/null and b/coldfront/components/site/static/images/NW88LLED.png differ
diff --git a/coldfront/components/site/static/images/NXFHQIA2.png b/coldfront/components/site/static/images/NXFHQIA2.png
new file mode 100644
index 0000000000..c3b64f28d5
Binary files /dev/null and b/coldfront/components/site/static/images/NXFHQIA2.png differ
diff --git a/coldfront/components/site/static/images/NXS3FZJH.png b/coldfront/components/site/static/images/NXS3FZJH.png
new file mode 100644
index 0000000000..cef7ecf80f
Binary files /dev/null and b/coldfront/components/site/static/images/NXS3FZJH.png differ
diff --git a/coldfront/components/site/static/images/NYBI3BLQ.png b/coldfront/components/site/static/images/NYBI3BLQ.png
new file mode 100644
index 0000000000..cd71a98af5
Binary files /dev/null and b/coldfront/components/site/static/images/NYBI3BLQ.png differ
diff --git a/coldfront/components/site/static/images/NYCB3YFT.png b/coldfront/components/site/static/images/NYCB3YFT.png
new file mode 100644
index 0000000000..72fc7961a9
Binary files /dev/null and b/coldfront/components/site/static/images/NYCB3YFT.png differ
diff --git a/coldfront/components/site/static/images/NYG9TAVP.png b/coldfront/components/site/static/images/NYG9TAVP.png
new file mode 100644
index 0000000000..cb69f08c9a
Binary files /dev/null and b/coldfront/components/site/static/images/NYG9TAVP.png differ
diff --git a/coldfront/components/site/static/images/NZTA3W9E.png b/coldfront/components/site/static/images/NZTA3W9E.png
new file mode 100644
index 0000000000..510f01633e
Binary files /dev/null and b/coldfront/components/site/static/images/NZTA3W9E.png differ
diff --git a/coldfront/components/site/static/images/P8GQIUJR.png b/coldfront/components/site/static/images/P8GQIUJR.png
new file mode 100644
index 0000000000..d92042acf6
Binary files /dev/null and b/coldfront/components/site/static/images/P8GQIUJR.png differ
diff --git a/coldfront/components/site/static/images/P9PN9A2S.png b/coldfront/components/site/static/images/P9PN9A2S.png
new file mode 100644
index 0000000000..ef5e06c699
Binary files /dev/null and b/coldfront/components/site/static/images/P9PN9A2S.png differ
diff --git a/coldfront/components/site/static/images/PAN6VBWG.png b/coldfront/components/site/static/images/PAN6VBWG.png
new file mode 100644
index 0000000000..754a695e6d
Binary files /dev/null and b/coldfront/components/site/static/images/PAN6VBWG.png differ
diff --git a/coldfront/components/site/static/images/PCRRPHPG.png b/coldfront/components/site/static/images/PCRRPHPG.png
new file mode 100644
index 0000000000..0ed7d8ffa4
Binary files /dev/null and b/coldfront/components/site/static/images/PCRRPHPG.png differ
diff --git a/coldfront/components/site/static/images/PEDPLKNU.png b/coldfront/components/site/static/images/PEDPLKNU.png
new file mode 100644
index 0000000000..18124701d6
Binary files /dev/null and b/coldfront/components/site/static/images/PEDPLKNU.png differ
diff --git a/coldfront/components/site/static/images/PF2EQTHU.png b/coldfront/components/site/static/images/PF2EQTHU.png
new file mode 100644
index 0000000000..efa1573b6c
Binary files /dev/null and b/coldfront/components/site/static/images/PF2EQTHU.png differ
diff --git a/coldfront/components/site/static/images/PFIGFVLY.png b/coldfront/components/site/static/images/PFIGFVLY.png
new file mode 100644
index 0000000000..d0f99afc24
Binary files /dev/null and b/coldfront/components/site/static/images/PFIGFVLY.png differ
diff --git a/coldfront/components/site/static/images/PGKCMC27.png b/coldfront/components/site/static/images/PGKCMC27.png
new file mode 100644
index 0000000000..7bcf62059b
Binary files /dev/null and b/coldfront/components/site/static/images/PGKCMC27.png differ
diff --git a/coldfront/components/site/static/images/PHTENJMV.png b/coldfront/components/site/static/images/PHTENJMV.png
new file mode 100644
index 0000000000..f555ed5758
Binary files /dev/null and b/coldfront/components/site/static/images/PHTENJMV.png differ
diff --git a/coldfront/components/site/static/images/PKN4ZQ5P.png b/coldfront/components/site/static/images/PKN4ZQ5P.png
new file mode 100644
index 0000000000..fcb2cc1d90
Binary files /dev/null and b/coldfront/components/site/static/images/PKN4ZQ5P.png differ
diff --git a/coldfront/components/site/static/images/PL3ZHZ9J.png b/coldfront/components/site/static/images/PL3ZHZ9J.png
new file mode 100644
index 0000000000..c79d4f3cc2
Binary files /dev/null and b/coldfront/components/site/static/images/PL3ZHZ9J.png differ
diff --git a/coldfront/components/site/static/images/PPAMY6W9.png b/coldfront/components/site/static/images/PPAMY6W9.png
new file mode 100644
index 0000000000..5e1c6b2a32
Binary files /dev/null and b/coldfront/components/site/static/images/PPAMY6W9.png differ
diff --git a/coldfront/components/site/static/images/PQ498YZ5.png b/coldfront/components/site/static/images/PQ498YZ5.png
new file mode 100644
index 0000000000..0d32dbf260
Binary files /dev/null and b/coldfront/components/site/static/images/PQ498YZ5.png differ
diff --git a/coldfront/components/site/static/images/PQKCLKTJ.png b/coldfront/components/site/static/images/PQKCLKTJ.png
new file mode 100644
index 0000000000..409a3b69ce
Binary files /dev/null and b/coldfront/components/site/static/images/PQKCLKTJ.png differ
diff --git a/coldfront/components/site/static/images/PR8QXAUK.png b/coldfront/components/site/static/images/PR8QXAUK.png
new file mode 100644
index 0000000000..d83953537c
Binary files /dev/null and b/coldfront/components/site/static/images/PR8QXAUK.png differ
diff --git a/coldfront/components/site/static/images/PS2II5XL.png b/coldfront/components/site/static/images/PS2II5XL.png
new file mode 100644
index 0000000000..d9cd3570e3
Binary files /dev/null and b/coldfront/components/site/static/images/PS2II5XL.png differ
diff --git a/coldfront/components/site/static/images/PTCAZUHU.png b/coldfront/components/site/static/images/PTCAZUHU.png
new file mode 100644
index 0000000000..fb59fb7374
Binary files /dev/null and b/coldfront/components/site/static/images/PTCAZUHU.png differ
diff --git a/coldfront/components/site/static/images/PUPCT8EJ.png b/coldfront/components/site/static/images/PUPCT8EJ.png
new file mode 100644
index 0000000000..81f0b1c934
Binary files /dev/null and b/coldfront/components/site/static/images/PUPCT8EJ.png differ
diff --git a/coldfront/components/site/static/images/PVEHP5JH.png b/coldfront/components/site/static/images/PVEHP5JH.png
new file mode 100644
index 0000000000..c4aafd62fe
Binary files /dev/null and b/coldfront/components/site/static/images/PVEHP5JH.png differ
diff --git a/coldfront/components/site/static/images/PVP3EHBB.png b/coldfront/components/site/static/images/PVP3EHBB.png
new file mode 100644
index 0000000000..9e0ed7d59a
Binary files /dev/null and b/coldfront/components/site/static/images/PVP3EHBB.png differ
diff --git a/coldfront/components/site/static/images/PVTJFQHF.png b/coldfront/components/site/static/images/PVTJFQHF.png
new file mode 100644
index 0000000000..550bd698fc
Binary files /dev/null and b/coldfront/components/site/static/images/PVTJFQHF.png differ
diff --git a/coldfront/components/site/static/images/PW9CX6WB.png b/coldfront/components/site/static/images/PW9CX6WB.png
new file mode 100644
index 0000000000..c0f87a8eae
Binary files /dev/null and b/coldfront/components/site/static/images/PW9CX6WB.png differ
diff --git a/coldfront/components/site/static/images/PWYYAAMM.png b/coldfront/components/site/static/images/PWYYAAMM.png
new file mode 100644
index 0000000000..0013d07f40
Binary files /dev/null and b/coldfront/components/site/static/images/PWYYAAMM.png differ
diff --git a/coldfront/components/site/static/images/Q2GSMWGL.png b/coldfront/components/site/static/images/Q2GSMWGL.png
new file mode 100644
index 0000000000..57e5af7315
Binary files /dev/null and b/coldfront/components/site/static/images/Q2GSMWGL.png differ
diff --git a/coldfront/components/site/static/images/Q2HUAHZN.png b/coldfront/components/site/static/images/Q2HUAHZN.png
new file mode 100644
index 0000000000..2938351f22
Binary files /dev/null and b/coldfront/components/site/static/images/Q2HUAHZN.png differ
diff --git a/coldfront/components/site/static/images/Q3CCBIST.png b/coldfront/components/site/static/images/Q3CCBIST.png
new file mode 100644
index 0000000000..d8935de16e
Binary files /dev/null and b/coldfront/components/site/static/images/Q3CCBIST.png differ
diff --git a/coldfront/components/site/static/images/Q46N25ZH.png b/coldfront/components/site/static/images/Q46N25ZH.png
new file mode 100644
index 0000000000..f9d131cfd9
Binary files /dev/null and b/coldfront/components/site/static/images/Q46N25ZH.png differ
diff --git a/coldfront/components/site/static/images/Q5WRUW8Q.png b/coldfront/components/site/static/images/Q5WRUW8Q.png
new file mode 100644
index 0000000000..2dfc6ff115
Binary files /dev/null and b/coldfront/components/site/static/images/Q5WRUW8Q.png differ
diff --git a/coldfront/components/site/static/images/Q7IDWTVC.png b/coldfront/components/site/static/images/Q7IDWTVC.png
new file mode 100644
index 0000000000..80aaab2b41
Binary files /dev/null and b/coldfront/components/site/static/images/Q7IDWTVC.png differ
diff --git a/coldfront/components/site/static/images/Q83AR6Z6.png b/coldfront/components/site/static/images/Q83AR6Z6.png
new file mode 100644
index 0000000000..417e2fd363
Binary files /dev/null and b/coldfront/components/site/static/images/Q83AR6Z6.png differ
diff --git a/coldfront/components/site/static/images/Q8E6XD3I.png b/coldfront/components/site/static/images/Q8E6XD3I.png
new file mode 100644
index 0000000000..0a34285ed1
Binary files /dev/null and b/coldfront/components/site/static/images/Q8E6XD3I.png differ
diff --git a/coldfront/components/site/static/images/Q8J39MXB.png b/coldfront/components/site/static/images/Q8J39MXB.png
new file mode 100644
index 0000000000..76e3fa84d0
Binary files /dev/null and b/coldfront/components/site/static/images/Q8J39MXB.png differ
diff --git a/coldfront/components/site/static/images/QA35BRVJ.png b/coldfront/components/site/static/images/QA35BRVJ.png
new file mode 100644
index 0000000000..ff56a6f698
Binary files /dev/null and b/coldfront/components/site/static/images/QA35BRVJ.png differ
diff --git a/coldfront/components/site/static/images/QAWUFFDU.png b/coldfront/components/site/static/images/QAWUFFDU.png
new file mode 100644
index 0000000000..5b5d42ff02
Binary files /dev/null and b/coldfront/components/site/static/images/QAWUFFDU.png differ
diff --git a/coldfront/components/site/static/images/QCMD6Q99.png b/coldfront/components/site/static/images/QCMD6Q99.png
new file mode 100644
index 0000000000..2938351f22
Binary files /dev/null and b/coldfront/components/site/static/images/QCMD6Q99.png differ
diff --git a/coldfront/components/site/static/images/QFVVXKJF.png b/coldfront/components/site/static/images/QFVVXKJF.png
new file mode 100644
index 0000000000..2eebc0bc83
Binary files /dev/null and b/coldfront/components/site/static/images/QFVVXKJF.png differ
diff --git a/coldfront/components/site/static/images/QI65PCEE.png b/coldfront/components/site/static/images/QI65PCEE.png
new file mode 100644
index 0000000000..f94694a7ce
Binary files /dev/null and b/coldfront/components/site/static/images/QI65PCEE.png differ
diff --git a/coldfront/components/site/static/images/QI974TVF.png b/coldfront/components/site/static/images/QI974TVF.png
new file mode 100644
index 0000000000..e76d5232da
Binary files /dev/null and b/coldfront/components/site/static/images/QI974TVF.png differ
diff --git a/coldfront/components/site/static/images/QK65IL5D.png b/coldfront/components/site/static/images/QK65IL5D.png
new file mode 100644
index 0000000000..d409d4be75
Binary files /dev/null and b/coldfront/components/site/static/images/QK65IL5D.png differ
diff --git a/coldfront/components/site/static/images/QL6XEGF6.png b/coldfront/components/site/static/images/QL6XEGF6.png
new file mode 100644
index 0000000000..20cd9a51be
Binary files /dev/null and b/coldfront/components/site/static/images/QL6XEGF6.png differ
diff --git a/coldfront/components/site/static/images/QLZ8HT8N.png b/coldfront/components/site/static/images/QLZ8HT8N.png
new file mode 100644
index 0000000000..1e670bfc9e
Binary files /dev/null and b/coldfront/components/site/static/images/QLZ8HT8N.png differ
diff --git a/coldfront/components/site/static/images/QMNAKG2K.png b/coldfront/components/site/static/images/QMNAKG2K.png
new file mode 100644
index 0000000000..d89fcd4b1c
Binary files /dev/null and b/coldfront/components/site/static/images/QMNAKG2K.png differ
diff --git a/coldfront/components/site/static/images/QMZTXH76.png b/coldfront/components/site/static/images/QMZTXH76.png
new file mode 100644
index 0000000000..12235a0f8b
Binary files /dev/null and b/coldfront/components/site/static/images/QMZTXH76.png differ
diff --git a/coldfront/components/site/static/images/QN8YPQL9.png b/coldfront/components/site/static/images/QN8YPQL9.png
new file mode 100644
index 0000000000..b610196eb7
Binary files /dev/null and b/coldfront/components/site/static/images/QN8YPQL9.png differ
diff --git a/coldfront/components/site/static/images/QNAZ4XE3.png b/coldfront/components/site/static/images/QNAZ4XE3.png
new file mode 100644
index 0000000000..95e6ac738c
Binary files /dev/null and b/coldfront/components/site/static/images/QNAZ4XE3.png differ
diff --git a/coldfront/components/site/static/images/QPFSJ7FS.png b/coldfront/components/site/static/images/QPFSJ7FS.png
new file mode 100644
index 0000000000..6af0ef49d9
Binary files /dev/null and b/coldfront/components/site/static/images/QPFSJ7FS.png differ
diff --git a/coldfront/components/site/static/images/QQBWUJES.png b/coldfront/components/site/static/images/QQBWUJES.png
new file mode 100644
index 0000000000..d975d6a72f
Binary files /dev/null and b/coldfront/components/site/static/images/QQBWUJES.png differ
diff --git a/coldfront/components/site/static/images/QQRQDXID.png b/coldfront/components/site/static/images/QQRQDXID.png
new file mode 100644
index 0000000000..35c7258f49
Binary files /dev/null and b/coldfront/components/site/static/images/QQRQDXID.png differ
diff --git a/coldfront/components/site/static/images/QQVC38NH.png b/coldfront/components/site/static/images/QQVC38NH.png
new file mode 100644
index 0000000000..984cf35091
Binary files /dev/null and b/coldfront/components/site/static/images/QQVC38NH.png differ
diff --git a/coldfront/components/site/static/images/QSXMWQFH.png b/coldfront/components/site/static/images/QSXMWQFH.png
new file mode 100644
index 0000000000..17d8f27aea
Binary files /dev/null and b/coldfront/components/site/static/images/QSXMWQFH.png differ
diff --git a/coldfront/components/site/static/images/QTSKNKZY.png b/coldfront/components/site/static/images/QTSKNKZY.png
new file mode 100644
index 0000000000..52d46e5db9
Binary files /dev/null and b/coldfront/components/site/static/images/QTSKNKZY.png differ
diff --git a/coldfront/components/site/static/images/QV5CUAFR.png b/coldfront/components/site/static/images/QV5CUAFR.png
new file mode 100644
index 0000000000..5519715461
Binary files /dev/null and b/coldfront/components/site/static/images/QV5CUAFR.png differ
diff --git a/coldfront/components/site/static/images/QVKLSVLM.png b/coldfront/components/site/static/images/QVKLSVLM.png
new file mode 100644
index 0000000000..055fd29bd5
Binary files /dev/null and b/coldfront/components/site/static/images/QVKLSVLM.png differ
diff --git a/coldfront/components/site/static/images/QW3FDIE6.png b/coldfront/components/site/static/images/QW3FDIE6.png
new file mode 100644
index 0000000000..f6e67c7177
Binary files /dev/null and b/coldfront/components/site/static/images/QW3FDIE6.png differ
diff --git a/coldfront/components/site/static/images/QW4568P7.png b/coldfront/components/site/static/images/QW4568P7.png
new file mode 100644
index 0000000000..f353a008d9
Binary files /dev/null and b/coldfront/components/site/static/images/QW4568P7.png differ
diff --git a/coldfront/components/site/static/images/QYNQTAGV.png b/coldfront/components/site/static/images/QYNQTAGV.png
new file mode 100644
index 0000000000..476ddc2e74
Binary files /dev/null and b/coldfront/components/site/static/images/QYNQTAGV.png differ
diff --git a/coldfront/components/site/static/images/R2VBLF3L.png b/coldfront/components/site/static/images/R2VBLF3L.png
new file mode 100644
index 0000000000..137cbe0a05
Binary files /dev/null and b/coldfront/components/site/static/images/R2VBLF3L.png differ
diff --git a/coldfront/components/site/static/images/R3GTNXAE.png b/coldfront/components/site/static/images/R3GTNXAE.png
new file mode 100644
index 0000000000..fe3ab38817
Binary files /dev/null and b/coldfront/components/site/static/images/R3GTNXAE.png differ
diff --git a/coldfront/components/site/static/images/R5ECG53F.png b/coldfront/components/site/static/images/R5ECG53F.png
new file mode 100644
index 0000000000..27b1855f66
Binary files /dev/null and b/coldfront/components/site/static/images/R5ECG53F.png differ
diff --git a/coldfront/components/site/static/images/R5JFMZVK.png b/coldfront/components/site/static/images/R5JFMZVK.png
new file mode 100644
index 0000000000..f8e8a52ffa
Binary files /dev/null and b/coldfront/components/site/static/images/R5JFMZVK.png differ
diff --git a/coldfront/components/site/static/images/R6E694BW.png b/coldfront/components/site/static/images/R6E694BW.png
new file mode 100644
index 0000000000..2063167efa
Binary files /dev/null and b/coldfront/components/site/static/images/R6E694BW.png differ
diff --git a/coldfront/components/site/static/images/R6ITXDPA.png b/coldfront/components/site/static/images/R6ITXDPA.png
new file mode 100644
index 0000000000..713b3f3b93
Binary files /dev/null and b/coldfront/components/site/static/images/R6ITXDPA.png differ
diff --git a/coldfront/components/site/static/images/R6LCTMU7.png b/coldfront/components/site/static/images/R6LCTMU7.png
new file mode 100644
index 0000000000..34eae14b49
Binary files /dev/null and b/coldfront/components/site/static/images/R6LCTMU7.png differ
diff --git a/coldfront/components/site/static/images/R9GM42P4.png b/coldfront/components/site/static/images/R9GM42P4.png
new file mode 100644
index 0000000000..c3c793e802
Binary files /dev/null and b/coldfront/components/site/static/images/R9GM42P4.png differ
diff --git a/coldfront/components/site/static/images/R9RWPY6T.png b/coldfront/components/site/static/images/R9RWPY6T.png
new file mode 100644
index 0000000000..3092001d93
Binary files /dev/null and b/coldfront/components/site/static/images/R9RWPY6T.png differ
diff --git a/coldfront/components/site/static/images/RA8HDPW6.png b/coldfront/components/site/static/images/RA8HDPW6.png
new file mode 100644
index 0000000000..f52c5924e0
Binary files /dev/null and b/coldfront/components/site/static/images/RA8HDPW6.png differ
diff --git a/coldfront/components/site/static/images/RBMGWLL4.png b/coldfront/components/site/static/images/RBMGWLL4.png
new file mode 100644
index 0000000000..9c6546fb82
Binary files /dev/null and b/coldfront/components/site/static/images/RBMGWLL4.png differ
diff --git a/coldfront/components/site/static/images/RC5ELAXN.png b/coldfront/components/site/static/images/RC5ELAXN.png
new file mode 100644
index 0000000000..505c4ca31a
Binary files /dev/null and b/coldfront/components/site/static/images/RC5ELAXN.png differ
diff --git a/coldfront/components/site/static/images/RCEU8ELH.png b/coldfront/components/site/static/images/RCEU8ELH.png
new file mode 100644
index 0000000000..e3c4545378
Binary files /dev/null and b/coldfront/components/site/static/images/RCEU8ELH.png differ
diff --git a/coldfront/components/site/static/images/RFEVMZ9I.png b/coldfront/components/site/static/images/RFEVMZ9I.png
new file mode 100644
index 0000000000..950ffb980f
Binary files /dev/null and b/coldfront/components/site/static/images/RFEVMZ9I.png differ
diff --git a/coldfront/components/site/static/images/RH62H5BR.png b/coldfront/components/site/static/images/RH62H5BR.png
new file mode 100644
index 0000000000..a308357443
Binary files /dev/null and b/coldfront/components/site/static/images/RH62H5BR.png differ
diff --git a/coldfront/components/site/static/images/RIMV8A7A.png b/coldfront/components/site/static/images/RIMV8A7A.png
new file mode 100644
index 0000000000..ef8a6f4c03
Binary files /dev/null and b/coldfront/components/site/static/images/RIMV8A7A.png differ
diff --git a/coldfront/components/site/static/images/RJDT87SK.png b/coldfront/components/site/static/images/RJDT87SK.png
new file mode 100644
index 0000000000..3cc9aebeca
Binary files /dev/null and b/coldfront/components/site/static/images/RJDT87SK.png differ
diff --git a/coldfront/components/site/static/images/RJILWKTM.png b/coldfront/components/site/static/images/RJILWKTM.png
new file mode 100644
index 0000000000..721fcbde17
Binary files /dev/null and b/coldfront/components/site/static/images/RJILWKTM.png differ
diff --git a/coldfront/components/site/static/images/RMA5MCQ4.png b/coldfront/components/site/static/images/RMA5MCQ4.png
new file mode 100644
index 0000000000..ab1d59955e
Binary files /dev/null and b/coldfront/components/site/static/images/RMA5MCQ4.png differ
diff --git a/coldfront/components/site/static/images/RNTDXQS4.png b/coldfront/components/site/static/images/RNTDXQS4.png
new file mode 100644
index 0000000000..73a63a558c
Binary files /dev/null and b/coldfront/components/site/static/images/RNTDXQS4.png differ
diff --git a/coldfront/components/site/static/images/RP7DALNM.png b/coldfront/components/site/static/images/RP7DALNM.png
new file mode 100644
index 0000000000..b85c6ff470
Binary files /dev/null and b/coldfront/components/site/static/images/RP7DALNM.png differ
diff --git a/coldfront/components/site/static/images/RRS952DV.png b/coldfront/components/site/static/images/RRS952DV.png
new file mode 100644
index 0000000000..7925bf2456
Binary files /dev/null and b/coldfront/components/site/static/images/RRS952DV.png differ
diff --git a/coldfront/components/site/static/images/RRWSDCUV.png b/coldfront/components/site/static/images/RRWSDCUV.png
new file mode 100644
index 0000000000..79e20fee7e
Binary files /dev/null and b/coldfront/components/site/static/images/RRWSDCUV.png differ
diff --git a/coldfront/components/site/static/images/RT8QIUZB.png b/coldfront/components/site/static/images/RT8QIUZB.png
new file mode 100644
index 0000000000..9b54534cd3
Binary files /dev/null and b/coldfront/components/site/static/images/RT8QIUZB.png differ
diff --git a/coldfront/components/site/static/images/RU6TTIG3.png b/coldfront/components/site/static/images/RU6TTIG3.png
new file mode 100644
index 0000000000..cea2306484
Binary files /dev/null and b/coldfront/components/site/static/images/RU6TTIG3.png differ
diff --git a/coldfront/components/site/static/images/RU7XZURX.png b/coldfront/components/site/static/images/RU7XZURX.png
new file mode 100644
index 0000000000..da87e19a87
Binary files /dev/null and b/coldfront/components/site/static/images/RU7XZURX.png differ
diff --git a/coldfront/components/site/static/images/RUAST49P.png b/coldfront/components/site/static/images/RUAST49P.png
new file mode 100644
index 0000000000..4de9684b25
Binary files /dev/null and b/coldfront/components/site/static/images/RUAST49P.png differ
diff --git a/coldfront/components/site/static/images/RWATN9WD.png b/coldfront/components/site/static/images/RWATN9WD.png
new file mode 100644
index 0000000000..6c5899545b
Binary files /dev/null and b/coldfront/components/site/static/images/RWATN9WD.png differ
diff --git a/coldfront/components/site/static/images/RX7PMX26.png b/coldfront/components/site/static/images/RX7PMX26.png
new file mode 100644
index 0000000000..7de4decf7c
Binary files /dev/null and b/coldfront/components/site/static/images/RX7PMX26.png differ
diff --git a/coldfront/components/site/static/images/RXY4BI6Q.png b/coldfront/components/site/static/images/RXY4BI6Q.png
new file mode 100644
index 0000000000..721fcbde17
Binary files /dev/null and b/coldfront/components/site/static/images/RXY4BI6Q.png differ
diff --git a/coldfront/components/site/static/images/RY3JCCR6.png b/coldfront/components/site/static/images/RY3JCCR6.png
new file mode 100644
index 0000000000..5621ae8b18
Binary files /dev/null and b/coldfront/components/site/static/images/RY3JCCR6.png differ
diff --git a/coldfront/components/site/static/images/RY9AI325.png b/coldfront/components/site/static/images/RY9AI325.png
new file mode 100644
index 0000000000..c2ae25577f
Binary files /dev/null and b/coldfront/components/site/static/images/RY9AI325.png differ
diff --git a/coldfront/components/site/static/images/RYZXDSBT.png b/coldfront/components/site/static/images/RYZXDSBT.png
new file mode 100644
index 0000000000..b4d735d053
Binary files /dev/null and b/coldfront/components/site/static/images/RYZXDSBT.png differ
diff --git a/coldfront/components/site/static/images/S4GW5SBQ.png b/coldfront/components/site/static/images/S4GW5SBQ.png
new file mode 100644
index 0000000000..455dcb615d
Binary files /dev/null and b/coldfront/components/site/static/images/S4GW5SBQ.png differ
diff --git a/coldfront/components/site/static/images/S5I8BR3J.png b/coldfront/components/site/static/images/S5I8BR3J.png
new file mode 100644
index 0000000000..7c7482ae76
Binary files /dev/null and b/coldfront/components/site/static/images/S5I8BR3J.png differ
diff --git a/coldfront/components/site/static/images/S6JHGMNQ.png b/coldfront/components/site/static/images/S6JHGMNQ.png
new file mode 100644
index 0000000000..4b66548ac4
Binary files /dev/null and b/coldfront/components/site/static/images/S6JHGMNQ.png differ
diff --git a/coldfront/components/site/static/images/S6TBC5T6.png b/coldfront/components/site/static/images/S6TBC5T6.png
new file mode 100644
index 0000000000..30f783c24c
Binary files /dev/null and b/coldfront/components/site/static/images/S6TBC5T6.png differ
diff --git a/coldfront/components/site/static/images/S8LKXPFV.png b/coldfront/components/site/static/images/S8LKXPFV.png
new file mode 100644
index 0000000000..73a63a558c
Binary files /dev/null and b/coldfront/components/site/static/images/S8LKXPFV.png differ
diff --git a/coldfront/components/site/static/images/S8YWPTR9.png b/coldfront/components/site/static/images/S8YWPTR9.png
new file mode 100644
index 0000000000..58bc2f6b97
Binary files /dev/null and b/coldfront/components/site/static/images/S8YWPTR9.png differ
diff --git a/coldfront/components/site/static/images/S9T6A7MF.png b/coldfront/components/site/static/images/S9T6A7MF.png
new file mode 100644
index 0000000000..84098aed8d
Binary files /dev/null and b/coldfront/components/site/static/images/S9T6A7MF.png differ
diff --git a/coldfront/components/site/static/images/S9TMVJYI.png b/coldfront/components/site/static/images/S9TMVJYI.png
new file mode 100644
index 0000000000..8d9ac68fb6
Binary files /dev/null and b/coldfront/components/site/static/images/S9TMVJYI.png differ
diff --git a/coldfront/components/site/static/images/SAN44Q7J.png b/coldfront/components/site/static/images/SAN44Q7J.png
new file mode 100644
index 0000000000..2973617d48
Binary files /dev/null and b/coldfront/components/site/static/images/SAN44Q7J.png differ
diff --git a/coldfront/components/site/static/images/SBBDG74P.png b/coldfront/components/site/static/images/SBBDG74P.png
new file mode 100644
index 0000000000..c13a2dba0f
Binary files /dev/null and b/coldfront/components/site/static/images/SBBDG74P.png differ
diff --git a/coldfront/components/site/static/images/SBHE9U5F.png b/coldfront/components/site/static/images/SBHE9U5F.png
new file mode 100644
index 0000000000..6068637c5c
Binary files /dev/null and b/coldfront/components/site/static/images/SBHE9U5F.png differ
diff --git a/coldfront/components/site/static/images/SCRL6Z98.png b/coldfront/components/site/static/images/SCRL6Z98.png
new file mode 100644
index 0000000000..f4722969bb
Binary files /dev/null and b/coldfront/components/site/static/images/SCRL6Z98.png differ
diff --git a/coldfront/components/site/static/images/SERPUQTN.png b/coldfront/components/site/static/images/SERPUQTN.png
new file mode 100644
index 0000000000..225bd9063f
Binary files /dev/null and b/coldfront/components/site/static/images/SERPUQTN.png differ
diff --git a/coldfront/components/site/static/images/SF57WBRD.png b/coldfront/components/site/static/images/SF57WBRD.png
new file mode 100644
index 0000000000..6f66309aa7
Binary files /dev/null and b/coldfront/components/site/static/images/SF57WBRD.png differ
diff --git a/coldfront/components/site/static/images/SFMKEIUK.png b/coldfront/components/site/static/images/SFMKEIUK.png
new file mode 100644
index 0000000000..ccb1fd2708
Binary files /dev/null and b/coldfront/components/site/static/images/SFMKEIUK.png differ
diff --git a/coldfront/components/site/static/images/SGINWM8K.png b/coldfront/components/site/static/images/SGINWM8K.png
new file mode 100644
index 0000000000..0f88d0f7e6
Binary files /dev/null and b/coldfront/components/site/static/images/SGINWM8K.png differ
diff --git a/coldfront/components/site/static/images/SJJN8LN4.png b/coldfront/components/site/static/images/SJJN8LN4.png
new file mode 100644
index 0000000000..d71f49fc75
Binary files /dev/null and b/coldfront/components/site/static/images/SJJN8LN4.png differ
diff --git a/coldfront/components/site/static/images/SJRXZFV6.png b/coldfront/components/site/static/images/SJRXZFV6.png
new file mode 100644
index 0000000000..0acbca5b72
Binary files /dev/null and b/coldfront/components/site/static/images/SJRXZFV6.png differ
diff --git a/coldfront/components/site/static/images/SK3XURCP.png b/coldfront/components/site/static/images/SK3XURCP.png
new file mode 100644
index 0000000000..c40ce0bdc1
Binary files /dev/null and b/coldfront/components/site/static/images/SK3XURCP.png differ
diff --git a/coldfront/components/site/static/images/SKIXTKX5.png b/coldfront/components/site/static/images/SKIXTKX5.png
new file mode 100644
index 0000000000..1cfdbed8ba
Binary files /dev/null and b/coldfront/components/site/static/images/SKIXTKX5.png differ
diff --git a/coldfront/components/site/static/images/SLEEE8PW.png b/coldfront/components/site/static/images/SLEEE8PW.png
new file mode 100644
index 0000000000..39b6b87605
Binary files /dev/null and b/coldfront/components/site/static/images/SLEEE8PW.png differ
diff --git a/coldfront/components/site/static/images/SNEF62TE.png b/coldfront/components/site/static/images/SNEF62TE.png
new file mode 100644
index 0000000000..fe3ab38817
Binary files /dev/null and b/coldfront/components/site/static/images/SNEF62TE.png differ
diff --git a/coldfront/components/site/static/images/SNQ77TD6.png b/coldfront/components/site/static/images/SNQ77TD6.png
new file mode 100644
index 0000000000..a5f681da82
Binary files /dev/null and b/coldfront/components/site/static/images/SNQ77TD6.png differ
diff --git a/coldfront/components/site/static/images/SNQIRHM3.png b/coldfront/components/site/static/images/SNQIRHM3.png
new file mode 100644
index 0000000000..9e46da4c2a
Binary files /dev/null and b/coldfront/components/site/static/images/SNQIRHM3.png differ
diff --git a/coldfront/components/site/static/images/SP8N2CYV.png b/coldfront/components/site/static/images/SP8N2CYV.png
new file mode 100644
index 0000000000..526a9295d8
Binary files /dev/null and b/coldfront/components/site/static/images/SP8N2CYV.png differ
diff --git a/coldfront/components/site/static/images/SPTSI5VK.png b/coldfront/components/site/static/images/SPTSI5VK.png
new file mode 100644
index 0000000000..2189b23729
Binary files /dev/null and b/coldfront/components/site/static/images/SPTSI5VK.png differ
diff --git a/coldfront/components/site/static/images/SSFF3GGF.png b/coldfront/components/site/static/images/SSFF3GGF.png
new file mode 100644
index 0000000000..c82b7f11bb
Binary files /dev/null and b/coldfront/components/site/static/images/SSFF3GGF.png differ
diff --git a/coldfront/components/site/static/images/SSNLUW9T.png b/coldfront/components/site/static/images/SSNLUW9T.png
new file mode 100644
index 0000000000..0549785b0b
Binary files /dev/null and b/coldfront/components/site/static/images/SSNLUW9T.png differ
diff --git a/coldfront/components/site/static/images/SSP3UZQW.png b/coldfront/components/site/static/images/SSP3UZQW.png
new file mode 100644
index 0000000000..65e8ba16c3
Binary files /dev/null and b/coldfront/components/site/static/images/SSP3UZQW.png differ
diff --git a/coldfront/components/site/static/images/STVRS9KV.png b/coldfront/components/site/static/images/STVRS9KV.png
new file mode 100644
index 0000000000..65530491d6
Binary files /dev/null and b/coldfront/components/site/static/images/STVRS9KV.png differ
diff --git a/coldfront/components/site/static/images/SU4H63VY.png b/coldfront/components/site/static/images/SU4H63VY.png
new file mode 100644
index 0000000000..2db2fd8bce
Binary files /dev/null and b/coldfront/components/site/static/images/SU4H63VY.png differ
diff --git a/coldfront/components/site/static/images/SU4N5NB2.png b/coldfront/components/site/static/images/SU4N5NB2.png
new file mode 100644
index 0000000000..0ed7d8ffa4
Binary files /dev/null and b/coldfront/components/site/static/images/SU4N5NB2.png differ
diff --git a/coldfront/components/site/static/images/SVRFMK7H.png b/coldfront/components/site/static/images/SVRFMK7H.png
new file mode 100644
index 0000000000..2fe4a54390
Binary files /dev/null and b/coldfront/components/site/static/images/SVRFMK7H.png differ
diff --git a/coldfront/components/site/static/images/SWA8JZ9M.png b/coldfront/components/site/static/images/SWA8JZ9M.png
new file mode 100644
index 0000000000..0e8129bd09
Binary files /dev/null and b/coldfront/components/site/static/images/SWA8JZ9M.png differ
diff --git a/coldfront/components/site/static/images/SWB6FY9Z.png b/coldfront/components/site/static/images/SWB6FY9Z.png
new file mode 100644
index 0000000000..294656efee
Binary files /dev/null and b/coldfront/components/site/static/images/SWB6FY9Z.png differ
diff --git a/coldfront/components/site/static/images/SXLBS8TB.png b/coldfront/components/site/static/images/SXLBS8TB.png
new file mode 100644
index 0000000000..f353a008d9
Binary files /dev/null and b/coldfront/components/site/static/images/SXLBS8TB.png differ
diff --git a/coldfront/components/site/static/images/SYLXMSAJ.png b/coldfront/components/site/static/images/SYLXMSAJ.png
new file mode 100644
index 0000000000..b914d984d1
Binary files /dev/null and b/coldfront/components/site/static/images/SYLXMSAJ.png differ
diff --git a/coldfront/components/site/static/images/T4XSVC3V.png b/coldfront/components/site/static/images/T4XSVC3V.png
new file mode 100644
index 0000000000..1e34fda25d
Binary files /dev/null and b/coldfront/components/site/static/images/T4XSVC3V.png differ
diff --git a/coldfront/components/site/static/images/T54ZZYPX.png b/coldfront/components/site/static/images/T54ZZYPX.png
new file mode 100644
index 0000000000..423f2cdf40
Binary files /dev/null and b/coldfront/components/site/static/images/T54ZZYPX.png differ
diff --git a/coldfront/components/site/static/images/T58BN5GY.png b/coldfront/components/site/static/images/T58BN5GY.png
new file mode 100644
index 0000000000..6d621e7ddd
Binary files /dev/null and b/coldfront/components/site/static/images/T58BN5GY.png differ
diff --git a/coldfront/components/site/static/images/T5VXR344.png b/coldfront/components/site/static/images/T5VXR344.png
new file mode 100644
index 0000000000..e988bb2c05
Binary files /dev/null and b/coldfront/components/site/static/images/T5VXR344.png differ
diff --git a/coldfront/components/site/static/images/T64QEK8I.png b/coldfront/components/site/static/images/T64QEK8I.png
new file mode 100644
index 0000000000..8a9257e26f
Binary files /dev/null and b/coldfront/components/site/static/images/T64QEK8I.png differ
diff --git a/coldfront/components/site/static/images/T746TUTS.png b/coldfront/components/site/static/images/T746TUTS.png
new file mode 100644
index 0000000000..cc56e8b98c
Binary files /dev/null and b/coldfront/components/site/static/images/T746TUTS.png differ
diff --git a/coldfront/components/site/static/images/T9IMIK7W.png b/coldfront/components/site/static/images/T9IMIK7W.png
new file mode 100644
index 0000000000..57e5af7315
Binary files /dev/null and b/coldfront/components/site/static/images/T9IMIK7W.png differ
diff --git a/coldfront/components/site/static/images/T9YBCRTP.png b/coldfront/components/site/static/images/T9YBCRTP.png
new file mode 100644
index 0000000000..18124701d6
Binary files /dev/null and b/coldfront/components/site/static/images/T9YBCRTP.png differ
diff --git a/coldfront/components/site/static/images/TBTBX96W.png b/coldfront/components/site/static/images/TBTBX96W.png
new file mode 100644
index 0000000000..c4bf56866a
Binary files /dev/null and b/coldfront/components/site/static/images/TBTBX96W.png differ
diff --git a/coldfront/components/site/static/images/TBYFGZ9Q.png b/coldfront/components/site/static/images/TBYFGZ9Q.png
new file mode 100644
index 0000000000..0529da17ca
Binary files /dev/null and b/coldfront/components/site/static/images/TBYFGZ9Q.png differ
diff --git a/coldfront/components/site/static/images/TD6W7DR8.png b/coldfront/components/site/static/images/TD6W7DR8.png
new file mode 100644
index 0000000000..859bdb041f
Binary files /dev/null and b/coldfront/components/site/static/images/TD6W7DR8.png differ
diff --git a/coldfront/components/site/static/images/TE55AEV6.png b/coldfront/components/site/static/images/TE55AEV6.png
new file mode 100644
index 0000000000..79e20fee7e
Binary files /dev/null and b/coldfront/components/site/static/images/TE55AEV6.png differ
diff --git a/coldfront/components/site/static/images/TEQ3F68U.png b/coldfront/components/site/static/images/TEQ3F68U.png
new file mode 100644
index 0000000000..012dcb58c3
Binary files /dev/null and b/coldfront/components/site/static/images/TEQ3F68U.png differ
diff --git a/coldfront/components/site/static/images/TF6IWRNX.png b/coldfront/components/site/static/images/TF6IWRNX.png
new file mode 100644
index 0000000000..8b7fb9c83c
Binary files /dev/null and b/coldfront/components/site/static/images/TF6IWRNX.png differ
diff --git a/coldfront/components/site/static/images/TFE78RJU.png b/coldfront/components/site/static/images/TFE78RJU.png
new file mode 100644
index 0000000000..294656efee
Binary files /dev/null and b/coldfront/components/site/static/images/TFE78RJU.png differ
diff --git a/coldfront/components/site/static/images/TFRNV8ZJ.png b/coldfront/components/site/static/images/TFRNV8ZJ.png
new file mode 100644
index 0000000000..3e47d7f554
Binary files /dev/null and b/coldfront/components/site/static/images/TFRNV8ZJ.png differ
diff --git a/coldfront/components/site/static/images/TFT5ZPUB.png b/coldfront/components/site/static/images/TFT5ZPUB.png
new file mode 100644
index 0000000000..cbf411fb7e
Binary files /dev/null and b/coldfront/components/site/static/images/TFT5ZPUB.png differ
diff --git a/coldfront/components/site/static/images/TJZKXPAL.png b/coldfront/components/site/static/images/TJZKXPAL.png
new file mode 100644
index 0000000000..20d707cdd8
Binary files /dev/null and b/coldfront/components/site/static/images/TJZKXPAL.png differ
diff --git a/coldfront/components/site/static/images/TNUDY4P8.png b/coldfront/components/site/static/images/TNUDY4P8.png
new file mode 100644
index 0000000000..23b260c3bc
Binary files /dev/null and b/coldfront/components/site/static/images/TNUDY4P8.png differ
diff --git a/coldfront/components/site/static/images/TQA3QQGX.png b/coldfront/components/site/static/images/TQA3QQGX.png
new file mode 100644
index 0000000000..7f1440e98d
Binary files /dev/null and b/coldfront/components/site/static/images/TQA3QQGX.png differ
diff --git a/coldfront/components/site/static/images/TSP9MIXP.png b/coldfront/components/site/static/images/TSP9MIXP.png
new file mode 100644
index 0000000000..a523c3ce97
Binary files /dev/null and b/coldfront/components/site/static/images/TSP9MIXP.png differ
diff --git a/coldfront/components/site/static/images/TT7IYNC5.png b/coldfront/components/site/static/images/TT7IYNC5.png
new file mode 100644
index 0000000000..a1f812c902
Binary files /dev/null and b/coldfront/components/site/static/images/TT7IYNC5.png differ
diff --git a/coldfront/components/site/static/images/TU9N5FBR.png b/coldfront/components/site/static/images/TU9N5FBR.png
new file mode 100644
index 0000000000..83296b5b2d
Binary files /dev/null and b/coldfront/components/site/static/images/TU9N5FBR.png differ
diff --git a/coldfront/components/site/static/images/TUUIT96E.png b/coldfront/components/site/static/images/TUUIT96E.png
new file mode 100644
index 0000000000..a8fbfb2a8f
Binary files /dev/null and b/coldfront/components/site/static/images/TUUIT96E.png differ
diff --git a/coldfront/components/site/static/images/TVXLHA5J.png b/coldfront/components/site/static/images/TVXLHA5J.png
new file mode 100644
index 0000000000..a20f845885
Binary files /dev/null and b/coldfront/components/site/static/images/TVXLHA5J.png differ
diff --git a/coldfront/components/site/static/images/TWDWXJJM.png b/coldfront/components/site/static/images/TWDWXJJM.png
new file mode 100644
index 0000000000..241b11c890
Binary files /dev/null and b/coldfront/components/site/static/images/TWDWXJJM.png differ
diff --git a/coldfront/components/site/static/images/TXQ5WZ6F.png b/coldfront/components/site/static/images/TXQ5WZ6F.png
new file mode 100644
index 0000000000..47e40c950f
Binary files /dev/null and b/coldfront/components/site/static/images/TXQ5WZ6F.png differ
diff --git a/coldfront/components/site/static/images/TXTVR9MJ.png b/coldfront/components/site/static/images/TXTVR9MJ.png
new file mode 100644
index 0000000000..f753151f15
Binary files /dev/null and b/coldfront/components/site/static/images/TXTVR9MJ.png differ
diff --git a/coldfront/components/site/static/images/TZTW23IH.png b/coldfront/components/site/static/images/TZTW23IH.png
new file mode 100644
index 0000000000..1c60625006
Binary files /dev/null and b/coldfront/components/site/static/images/TZTW23IH.png differ
diff --git a/coldfront/components/site/static/images/U29TD33Q.png b/coldfront/components/site/static/images/U29TD33Q.png
new file mode 100644
index 0000000000..1c60625006
Binary files /dev/null and b/coldfront/components/site/static/images/U29TD33Q.png differ
diff --git a/coldfront/components/site/static/images/U2GUH8T8.png b/coldfront/components/site/static/images/U2GUH8T8.png
new file mode 100644
index 0000000000..42bbe6c7d6
Binary files /dev/null and b/coldfront/components/site/static/images/U2GUH8T8.png differ
diff --git a/coldfront/components/site/static/images/U36SEK6W.png b/coldfront/components/site/static/images/U36SEK6W.png
new file mode 100644
index 0000000000..1f3bbc059a
Binary files /dev/null and b/coldfront/components/site/static/images/U36SEK6W.png differ
diff --git a/coldfront/components/site/static/images/U6LPBMQP.png b/coldfront/components/site/static/images/U6LPBMQP.png
new file mode 100644
index 0000000000..5fba2b52a4
Binary files /dev/null and b/coldfront/components/site/static/images/U6LPBMQP.png differ
diff --git a/coldfront/components/site/static/images/U7CLQF9N.png b/coldfront/components/site/static/images/U7CLQF9N.png
new file mode 100644
index 0000000000..d7670b29be
Binary files /dev/null and b/coldfront/components/site/static/images/U7CLQF9N.png differ
diff --git a/coldfront/components/site/static/images/U7GC9B8L.png b/coldfront/components/site/static/images/U7GC9B8L.png
new file mode 100644
index 0000000000..a43bdddec3
Binary files /dev/null and b/coldfront/components/site/static/images/U7GC9B8L.png differ
diff --git a/coldfront/components/site/static/images/U7H4LCZL.png b/coldfront/components/site/static/images/U7H4LCZL.png
new file mode 100644
index 0000000000..1ca5b6ecd9
Binary files /dev/null and b/coldfront/components/site/static/images/U7H4LCZL.png differ
diff --git a/coldfront/components/site/static/images/U9C6FD3D.png b/coldfront/components/site/static/images/U9C6FD3D.png
new file mode 100644
index 0000000000..7925bf2456
Binary files /dev/null and b/coldfront/components/site/static/images/U9C6FD3D.png differ
diff --git a/coldfront/components/site/static/images/UASBWZRA.png b/coldfront/components/site/static/images/UASBWZRA.png
new file mode 100644
index 0000000000..4b2bed8716
Binary files /dev/null and b/coldfront/components/site/static/images/UASBWZRA.png differ
diff --git a/coldfront/components/site/static/images/UBAJKQ5D.png b/coldfront/components/site/static/images/UBAJKQ5D.png
new file mode 100644
index 0000000000..3d8a31f65e
Binary files /dev/null and b/coldfront/components/site/static/images/UBAJKQ5D.png differ
diff --git a/coldfront/components/site/static/images/UBPC4XD4.png b/coldfront/components/site/static/images/UBPC4XD4.png
new file mode 100644
index 0000000000..a777f13f4d
Binary files /dev/null and b/coldfront/components/site/static/images/UBPC4XD4.png differ
diff --git a/coldfront/components/site/static/images/UDGIEIYH.png b/coldfront/components/site/static/images/UDGIEIYH.png
new file mode 100644
index 0000000000..61693d266f
Binary files /dev/null and b/coldfront/components/site/static/images/UDGIEIYH.png differ
diff --git a/coldfront/components/site/static/images/UIUH6HDM.png b/coldfront/components/site/static/images/UIUH6HDM.png
new file mode 100644
index 0000000000..50bec34aa0
Binary files /dev/null and b/coldfront/components/site/static/images/UIUH6HDM.png differ
diff --git a/coldfront/components/site/static/images/UJ3L82ZP.png b/coldfront/components/site/static/images/UJ3L82ZP.png
new file mode 100644
index 0000000000..cabcd13025
Binary files /dev/null and b/coldfront/components/site/static/images/UJ3L82ZP.png differ
diff --git a/coldfront/components/site/static/images/UK84AGIE.png b/coldfront/components/site/static/images/UK84AGIE.png
new file mode 100644
index 0000000000..669a944e41
Binary files /dev/null and b/coldfront/components/site/static/images/UK84AGIE.png differ
diff --git a/coldfront/components/site/static/images/UKIY92CG.png b/coldfront/components/site/static/images/UKIY92CG.png
new file mode 100644
index 0000000000..070d39b452
Binary files /dev/null and b/coldfront/components/site/static/images/UKIY92CG.png differ
diff --git a/coldfront/components/site/static/images/UL5P6DG5.png b/coldfront/components/site/static/images/UL5P6DG5.png
new file mode 100644
index 0000000000..c0f87a8eae
Binary files /dev/null and b/coldfront/components/site/static/images/UL5P6DG5.png differ
diff --git a/coldfront/components/site/static/images/ULE82D2H.png b/coldfront/components/site/static/images/ULE82D2H.png
new file mode 100644
index 0000000000..130a9d7880
Binary files /dev/null and b/coldfront/components/site/static/images/ULE82D2H.png differ
diff --git a/coldfront/components/site/static/images/ULEX5IF8.png b/coldfront/components/site/static/images/ULEX5IF8.png
new file mode 100644
index 0000000000..e76d5232da
Binary files /dev/null and b/coldfront/components/site/static/images/ULEX5IF8.png differ
diff --git a/coldfront/components/site/static/images/ULRS8GXS.png b/coldfront/components/site/static/images/ULRS8GXS.png
new file mode 100644
index 0000000000..783fe210f9
Binary files /dev/null and b/coldfront/components/site/static/images/ULRS8GXS.png differ
diff --git a/coldfront/components/site/static/images/UMHPQSU4.png b/coldfront/components/site/static/images/UMHPQSU4.png
new file mode 100644
index 0000000000..c0bb35bb74
Binary files /dev/null and b/coldfront/components/site/static/images/UMHPQSU4.png differ
diff --git a/coldfront/components/site/static/images/UMMLEY74.png b/coldfront/components/site/static/images/UMMLEY74.png
new file mode 100644
index 0000000000..ca2a4e16c9
Binary files /dev/null and b/coldfront/components/site/static/images/UMMLEY74.png differ
diff --git a/coldfront/components/site/static/images/UMRGE7D2.png b/coldfront/components/site/static/images/UMRGE7D2.png
new file mode 100644
index 0000000000..5edc2e058d
Binary files /dev/null and b/coldfront/components/site/static/images/UMRGE7D2.png differ
diff --git a/coldfront/components/site/static/images/UMZ5CLQ4.png b/coldfront/components/site/static/images/UMZ5CLQ4.png
new file mode 100644
index 0000000000..080d424ff7
Binary files /dev/null and b/coldfront/components/site/static/images/UMZ5CLQ4.png differ
diff --git a/coldfront/components/site/static/images/URB2XIX4.png b/coldfront/components/site/static/images/URB2XIX4.png
new file mode 100644
index 0000000000..7d82fff10f
Binary files /dev/null and b/coldfront/components/site/static/images/URB2XIX4.png differ
diff --git a/coldfront/components/site/static/images/URK6EFHN.png b/coldfront/components/site/static/images/URK6EFHN.png
new file mode 100644
index 0000000000..52d46e5db9
Binary files /dev/null and b/coldfront/components/site/static/images/URK6EFHN.png differ
diff --git a/coldfront/components/site/static/images/USAA62Z2.png b/coldfront/components/site/static/images/USAA62Z2.png
new file mode 100644
index 0000000000..c59546e8dc
Binary files /dev/null and b/coldfront/components/site/static/images/USAA62Z2.png differ
diff --git a/coldfront/components/site/static/images/USS8KEB6.png b/coldfront/components/site/static/images/USS8KEB6.png
new file mode 100644
index 0000000000..0f0825e4fc
Binary files /dev/null and b/coldfront/components/site/static/images/USS8KEB6.png differ
diff --git a/coldfront/components/site/static/images/UU9FRVAE.png b/coldfront/components/site/static/images/UU9FRVAE.png
new file mode 100644
index 0000000000..64843cdfa0
Binary files /dev/null and b/coldfront/components/site/static/images/UU9FRVAE.png differ
diff --git a/coldfront/components/site/static/images/UUF53E78.png b/coldfront/components/site/static/images/UUF53E78.png
new file mode 100644
index 0000000000..4acca2340d
Binary files /dev/null and b/coldfront/components/site/static/images/UUF53E78.png differ
diff --git a/coldfront/components/site/static/images/UVP46KC4.png b/coldfront/components/site/static/images/UVP46KC4.png
new file mode 100644
index 0000000000..21f57c8a58
Binary files /dev/null and b/coldfront/components/site/static/images/UVP46KC4.png differ
diff --git a/coldfront/components/site/static/images/UVSNGE4V.png b/coldfront/components/site/static/images/UVSNGE4V.png
new file mode 100644
index 0000000000..47dfa56b36
Binary files /dev/null and b/coldfront/components/site/static/images/UVSNGE4V.png differ
diff --git a/coldfront/components/site/static/images/UWYTCZ8Q.png b/coldfront/components/site/static/images/UWYTCZ8Q.png
new file mode 100644
index 0000000000..cb8a63ef81
Binary files /dev/null and b/coldfront/components/site/static/images/UWYTCZ8Q.png differ
diff --git a/coldfront/components/site/static/images/UXYBE7C2.png b/coldfront/components/site/static/images/UXYBE7C2.png
new file mode 100644
index 0000000000..cc2a5433e1
Binary files /dev/null and b/coldfront/components/site/static/images/UXYBE7C2.png differ
diff --git a/coldfront/components/site/static/images/UYBDAEYP.png b/coldfront/components/site/static/images/UYBDAEYP.png
new file mode 100644
index 0000000000..a342ef5701
Binary files /dev/null and b/coldfront/components/site/static/images/UYBDAEYP.png differ
diff --git a/coldfront/components/site/static/images/UYPTWMBM.png b/coldfront/components/site/static/images/UYPTWMBM.png
new file mode 100644
index 0000000000..95e6ac738c
Binary files /dev/null and b/coldfront/components/site/static/images/UYPTWMBM.png differ
diff --git a/coldfront/components/site/static/images/UYR3EBWB.png b/coldfront/components/site/static/images/UYR3EBWB.png
new file mode 100644
index 0000000000..3d8a31f65e
Binary files /dev/null and b/coldfront/components/site/static/images/UYR3EBWB.png differ
diff --git a/coldfront/components/site/static/images/UZWUX4YD.png b/coldfront/components/site/static/images/UZWUX4YD.png
new file mode 100644
index 0000000000..130a9d7880
Binary files /dev/null and b/coldfront/components/site/static/images/UZWUX4YD.png differ
diff --git a/coldfront/components/site/static/images/V2Z4SAMV.png b/coldfront/components/site/static/images/V2Z4SAMV.png
new file mode 100644
index 0000000000..5b571e1845
Binary files /dev/null and b/coldfront/components/site/static/images/V2Z4SAMV.png differ
diff --git a/coldfront/components/site/static/images/V36ENIRJ.png b/coldfront/components/site/static/images/V36ENIRJ.png
new file mode 100644
index 0000000000..84e0b0fc31
Binary files /dev/null and b/coldfront/components/site/static/images/V36ENIRJ.png differ
diff --git a/coldfront/components/site/static/images/V3JRI7F9.png b/coldfront/components/site/static/images/V3JRI7F9.png
new file mode 100644
index 0000000000..bbd85ddf95
Binary files /dev/null and b/coldfront/components/site/static/images/V3JRI7F9.png differ
diff --git a/coldfront/components/site/static/images/V4D7SIC8.png b/coldfront/components/site/static/images/V4D7SIC8.png
new file mode 100644
index 0000000000..2fe4a54390
Binary files /dev/null and b/coldfront/components/site/static/images/V4D7SIC8.png differ
diff --git a/coldfront/components/site/static/images/V4YNDWAQ.png b/coldfront/components/site/static/images/V4YNDWAQ.png
new file mode 100644
index 0000000000..f8e8a52ffa
Binary files /dev/null and b/coldfront/components/site/static/images/V4YNDWAQ.png differ
diff --git a/coldfront/components/site/static/images/V6BWTMX8.png b/coldfront/components/site/static/images/V6BWTMX8.png
new file mode 100644
index 0000000000..c0c605f727
Binary files /dev/null and b/coldfront/components/site/static/images/V6BWTMX8.png differ
diff --git a/coldfront/components/site/static/images/V7JBYLH8.png b/coldfront/components/site/static/images/V7JBYLH8.png
new file mode 100644
index 0000000000..e6da4d9b84
Binary files /dev/null and b/coldfront/components/site/static/images/V7JBYLH8.png differ
diff --git a/coldfront/components/site/static/images/V8W5SIXH.png b/coldfront/components/site/static/images/V8W5SIXH.png
new file mode 100644
index 0000000000..e95f5c4173
Binary files /dev/null and b/coldfront/components/site/static/images/V8W5SIXH.png differ
diff --git a/coldfront/components/site/static/images/V8W8I7TB.png b/coldfront/components/site/static/images/V8W8I7TB.png
new file mode 100644
index 0000000000..c3b64f28d5
Binary files /dev/null and b/coldfront/components/site/static/images/V8W8I7TB.png differ
diff --git a/coldfront/components/site/static/images/V9RNKVPN.png b/coldfront/components/site/static/images/V9RNKVPN.png
new file mode 100644
index 0000000000..984cf35091
Binary files /dev/null and b/coldfront/components/site/static/images/V9RNKVPN.png differ
diff --git a/coldfront/components/site/static/images/VAMJK2CA.png b/coldfront/components/site/static/images/VAMJK2CA.png
new file mode 100644
index 0000000000..409a3b69ce
Binary files /dev/null and b/coldfront/components/site/static/images/VAMJK2CA.png differ
diff --git a/coldfront/components/site/static/images/VB3RJVC3.png b/coldfront/components/site/static/images/VB3RJVC3.png
new file mode 100644
index 0000000000..f43a57bb2c
Binary files /dev/null and b/coldfront/components/site/static/images/VB3RJVC3.png differ
diff --git a/coldfront/components/site/static/images/VCSGSALS.png b/coldfront/components/site/static/images/VCSGSALS.png
new file mode 100644
index 0000000000..a0922f6df1
Binary files /dev/null and b/coldfront/components/site/static/images/VCSGSALS.png differ
diff --git a/coldfront/components/site/static/images/VCVFI9HW.png b/coldfront/components/site/static/images/VCVFI9HW.png
new file mode 100644
index 0000000000..6306b86468
Binary files /dev/null and b/coldfront/components/site/static/images/VCVFI9HW.png differ
diff --git a/coldfront/components/site/static/images/VDQHFNHW.png b/coldfront/components/site/static/images/VDQHFNHW.png
new file mode 100644
index 0000000000..8251724ff0
Binary files /dev/null and b/coldfront/components/site/static/images/VDQHFNHW.png differ
diff --git a/coldfront/components/site/static/images/VGM4RU9M.png b/coldfront/components/site/static/images/VGM4RU9M.png
new file mode 100644
index 0000000000..e346bf102c
Binary files /dev/null and b/coldfront/components/site/static/images/VGM4RU9M.png differ
diff --git a/coldfront/components/site/static/images/VGVXR22Z.png b/coldfront/components/site/static/images/VGVXR22Z.png
new file mode 100644
index 0000000000..5b2414ea83
Binary files /dev/null and b/coldfront/components/site/static/images/VGVXR22Z.png differ
diff --git a/coldfront/components/site/static/images/VHNCLY72.png b/coldfront/components/site/static/images/VHNCLY72.png
new file mode 100644
index 0000000000..bea565440b
Binary files /dev/null and b/coldfront/components/site/static/images/VHNCLY72.png differ
diff --git a/coldfront/components/site/static/images/VI4FRHUF.png b/coldfront/components/site/static/images/VI4FRHUF.png
new file mode 100644
index 0000000000..60a0a26309
Binary files /dev/null and b/coldfront/components/site/static/images/VI4FRHUF.png differ
diff --git a/coldfront/components/site/static/images/VJGKRSIU.png b/coldfront/components/site/static/images/VJGKRSIU.png
new file mode 100644
index 0000000000..4ca5772f40
Binary files /dev/null and b/coldfront/components/site/static/images/VJGKRSIU.png differ
diff --git a/coldfront/components/site/static/images/VJIDUJY5.png b/coldfront/components/site/static/images/VJIDUJY5.png
new file mode 100644
index 0000000000..8234d5302f
Binary files /dev/null and b/coldfront/components/site/static/images/VJIDUJY5.png differ
diff --git a/coldfront/components/site/static/images/VKVLIRUE.png b/coldfront/components/site/static/images/VKVLIRUE.png
new file mode 100644
index 0000000000..7180226855
Binary files /dev/null and b/coldfront/components/site/static/images/VKVLIRUE.png differ
diff --git a/coldfront/components/site/static/images/VL4FH4NG.png b/coldfront/components/site/static/images/VL4FH4NG.png
new file mode 100644
index 0000000000..a552876a06
Binary files /dev/null and b/coldfront/components/site/static/images/VL4FH4NG.png differ
diff --git a/coldfront/components/site/static/images/VLREQFVL.png b/coldfront/components/site/static/images/VLREQFVL.png
new file mode 100644
index 0000000000..1b2dcbdb67
Binary files /dev/null and b/coldfront/components/site/static/images/VLREQFVL.png differ
diff --git a/coldfront/components/site/static/images/VMINUZSD.png b/coldfront/components/site/static/images/VMINUZSD.png
new file mode 100644
index 0000000000..6091a08bff
Binary files /dev/null and b/coldfront/components/site/static/images/VMINUZSD.png differ
diff --git a/coldfront/components/site/static/images/VMUE3U7K.png b/coldfront/components/site/static/images/VMUE3U7K.png
new file mode 100644
index 0000000000..9080a625d3
Binary files /dev/null and b/coldfront/components/site/static/images/VMUE3U7K.png differ
diff --git a/coldfront/components/site/static/images/VN7AP7LP.png b/coldfront/components/site/static/images/VN7AP7LP.png
new file mode 100644
index 0000000000..7f6d44ffb8
Binary files /dev/null and b/coldfront/components/site/static/images/VN7AP7LP.png differ
diff --git a/coldfront/components/site/static/images/VNZCPDYC.png b/coldfront/components/site/static/images/VNZCPDYC.png
new file mode 100644
index 0000000000..2a82a52678
Binary files /dev/null and b/coldfront/components/site/static/images/VNZCPDYC.png differ
diff --git a/coldfront/components/site/static/images/VPDKV8Z4.png b/coldfront/components/site/static/images/VPDKV8Z4.png
new file mode 100644
index 0000000000..5e1c6b2a32
Binary files /dev/null and b/coldfront/components/site/static/images/VPDKV8Z4.png differ
diff --git a/coldfront/components/site/static/images/VPWLVYK5.png b/coldfront/components/site/static/images/VPWLVYK5.png
new file mode 100644
index 0000000000..3e4b537269
Binary files /dev/null and b/coldfront/components/site/static/images/VPWLVYK5.png differ
diff --git a/coldfront/components/site/static/images/VQKBA7QE.png b/coldfront/components/site/static/images/VQKBA7QE.png
new file mode 100644
index 0000000000..895d47d7bf
Binary files /dev/null and b/coldfront/components/site/static/images/VQKBA7QE.png differ
diff --git a/coldfront/components/site/static/images/VSRQ39PE.png b/coldfront/components/site/static/images/VSRQ39PE.png
new file mode 100644
index 0000000000..92a1d0ea3c
Binary files /dev/null and b/coldfront/components/site/static/images/VSRQ39PE.png differ
diff --git a/coldfront/components/site/static/images/VVV2344W.png b/coldfront/components/site/static/images/VVV2344W.png
new file mode 100644
index 0000000000..f92cff2258
Binary files /dev/null and b/coldfront/components/site/static/images/VVV2344W.png differ
diff --git a/coldfront/components/site/static/images/VVWXJ9BS.png b/coldfront/components/site/static/images/VVWXJ9BS.png
new file mode 100644
index 0000000000..0b87d8ede8
Binary files /dev/null and b/coldfront/components/site/static/images/VVWXJ9BS.png differ
diff --git a/coldfront/components/site/static/images/VVZ4H54D.png b/coldfront/components/site/static/images/VVZ4H54D.png
new file mode 100644
index 0000000000..d65b2db2ff
Binary files /dev/null and b/coldfront/components/site/static/images/VVZ4H54D.png differ
diff --git a/coldfront/components/site/static/images/W28YUM7C.png b/coldfront/components/site/static/images/W28YUM7C.png
new file mode 100644
index 0000000000..3cd3d658b6
Binary files /dev/null and b/coldfront/components/site/static/images/W28YUM7C.png differ
diff --git a/coldfront/components/site/static/images/W2CC5ENB.png b/coldfront/components/site/static/images/W2CC5ENB.png
new file mode 100644
index 0000000000..a71031e122
Binary files /dev/null and b/coldfront/components/site/static/images/W2CC5ENB.png differ
diff --git a/coldfront/components/site/static/images/W46HNT66.png b/coldfront/components/site/static/images/W46HNT66.png
new file mode 100644
index 0000000000..505c4ca31a
Binary files /dev/null and b/coldfront/components/site/static/images/W46HNT66.png differ
diff --git a/coldfront/components/site/static/images/W4NY8VZH.png b/coldfront/components/site/static/images/W4NY8VZH.png
new file mode 100644
index 0000000000..5fe27d0a28
Binary files /dev/null and b/coldfront/components/site/static/images/W4NY8VZH.png differ
diff --git a/coldfront/components/site/static/images/W564PHSH.png b/coldfront/components/site/static/images/W564PHSH.png
new file mode 100644
index 0000000000..68058b2f7c
Binary files /dev/null and b/coldfront/components/site/static/images/W564PHSH.png differ
diff --git a/coldfront/components/site/static/images/W5LJPKRU.png b/coldfront/components/site/static/images/W5LJPKRU.png
new file mode 100644
index 0000000000..d71f49fc75
Binary files /dev/null and b/coldfront/components/site/static/images/W5LJPKRU.png differ
diff --git a/coldfront/components/site/static/images/W6N3S4RY.png b/coldfront/components/site/static/images/W6N3S4RY.png
new file mode 100644
index 0000000000..fb59fb7374
Binary files /dev/null and b/coldfront/components/site/static/images/W6N3S4RY.png differ
diff --git a/coldfront/components/site/static/images/W6WKFJ4G.png b/coldfront/components/site/static/images/W6WKFJ4G.png
new file mode 100644
index 0000000000..15a6ec0b5a
Binary files /dev/null and b/coldfront/components/site/static/images/W6WKFJ4G.png differ
diff --git a/coldfront/components/site/static/images/W7CXM9FX.png b/coldfront/components/site/static/images/W7CXM9FX.png
new file mode 100644
index 0000000000..d7baae4010
Binary files /dev/null and b/coldfront/components/site/static/images/W7CXM9FX.png differ
diff --git a/coldfront/components/site/static/images/W7FMZL57.png b/coldfront/components/site/static/images/W7FMZL57.png
new file mode 100644
index 0000000000..12235a0f8b
Binary files /dev/null and b/coldfront/components/site/static/images/W7FMZL57.png differ
diff --git a/coldfront/components/site/static/images/W8ZUXS9Y.png b/coldfront/components/site/static/images/W8ZUXS9Y.png
new file mode 100644
index 0000000000..0144113ba1
Binary files /dev/null and b/coldfront/components/site/static/images/W8ZUXS9Y.png differ
diff --git a/coldfront/components/site/static/images/WAMPP3V6.png b/coldfront/components/site/static/images/WAMPP3V6.png
new file mode 100644
index 0000000000..84e0b0fc31
Binary files /dev/null and b/coldfront/components/site/static/images/WAMPP3V6.png differ
diff --git a/coldfront/components/site/static/images/WAZ4S77T.png b/coldfront/components/site/static/images/WAZ4S77T.png
new file mode 100644
index 0000000000..9d851878cd
Binary files /dev/null and b/coldfront/components/site/static/images/WAZ4S77T.png differ
diff --git a/coldfront/components/site/static/images/WCE6NMNP.png b/coldfront/components/site/static/images/WCE6NMNP.png
new file mode 100644
index 0000000000..5e1c6b2a32
Binary files /dev/null and b/coldfront/components/site/static/images/WCE6NMNP.png differ
diff --git a/coldfront/components/site/static/images/WDM3YCPL.png b/coldfront/components/site/static/images/WDM3YCPL.png
new file mode 100644
index 0000000000..03c102f284
Binary files /dev/null and b/coldfront/components/site/static/images/WDM3YCPL.png differ
diff --git a/coldfront/components/site/static/images/WF8CAHAG.png b/coldfront/components/site/static/images/WF8CAHAG.png
new file mode 100644
index 0000000000..235710e118
Binary files /dev/null and b/coldfront/components/site/static/images/WF8CAHAG.png differ
diff --git a/coldfront/components/site/static/images/WKQ42KBU.png b/coldfront/components/site/static/images/WKQ42KBU.png
new file mode 100644
index 0000000000..25c9204127
Binary files /dev/null and b/coldfront/components/site/static/images/WKQ42KBU.png differ
diff --git a/coldfront/components/site/static/images/WLSNBM2J.png b/coldfront/components/site/static/images/WLSNBM2J.png
new file mode 100644
index 0000000000..876059d1ff
Binary files /dev/null and b/coldfront/components/site/static/images/WLSNBM2J.png differ
diff --git a/coldfront/components/site/static/images/WLXCJJ7E.png b/coldfront/components/site/static/images/WLXCJJ7E.png
new file mode 100644
index 0000000000..18124701d6
Binary files /dev/null and b/coldfront/components/site/static/images/WLXCJJ7E.png differ
diff --git a/coldfront/components/site/static/images/WMEJCDPW.png b/coldfront/components/site/static/images/WMEJCDPW.png
new file mode 100644
index 0000000000..e2ceadc5fe
Binary files /dev/null and b/coldfront/components/site/static/images/WMEJCDPW.png differ
diff --git a/coldfront/components/site/static/images/WMJ4GW36.png b/coldfront/components/site/static/images/WMJ4GW36.png
new file mode 100644
index 0000000000..81d153dc69
Binary files /dev/null and b/coldfront/components/site/static/images/WMJ4GW36.png differ
diff --git a/coldfront/components/site/static/images/WPBV58L2.png b/coldfront/components/site/static/images/WPBV58L2.png
new file mode 100644
index 0000000000..663141cda6
Binary files /dev/null and b/coldfront/components/site/static/images/WPBV58L2.png differ
diff --git a/coldfront/components/site/static/images/WPD8H7VE.png b/coldfront/components/site/static/images/WPD8H7VE.png
new file mode 100644
index 0000000000..8234d5302f
Binary files /dev/null and b/coldfront/components/site/static/images/WPD8H7VE.png differ
diff --git a/coldfront/components/site/static/images/WPVSEPXL.png b/coldfront/components/site/static/images/WPVSEPXL.png
new file mode 100644
index 0000000000..683a53ab10
Binary files /dev/null and b/coldfront/components/site/static/images/WPVSEPXL.png differ
diff --git a/coldfront/components/site/static/images/WR2DLD7F.png b/coldfront/components/site/static/images/WR2DLD7F.png
new file mode 100644
index 0000000000..663141cda6
Binary files /dev/null and b/coldfront/components/site/static/images/WR2DLD7F.png differ
diff --git a/coldfront/components/site/static/images/WSTKXK53.png b/coldfront/components/site/static/images/WSTKXK53.png
new file mode 100644
index 0000000000..76ad16dee5
Binary files /dev/null and b/coldfront/components/site/static/images/WSTKXK53.png differ
diff --git a/coldfront/components/site/static/images/WUAKBDZB.png b/coldfront/components/site/static/images/WUAKBDZB.png
new file mode 100644
index 0000000000..c6d93d356c
Binary files /dev/null and b/coldfront/components/site/static/images/WUAKBDZB.png differ
diff --git a/coldfront/components/site/static/images/WUBDS492.png b/coldfront/components/site/static/images/WUBDS492.png
new file mode 100644
index 0000000000..dab7827c02
Binary files /dev/null and b/coldfront/components/site/static/images/WUBDS492.png differ
diff --git a/coldfront/components/site/static/images/WVXCKA5W.png b/coldfront/components/site/static/images/WVXCKA5W.png
new file mode 100644
index 0000000000..fbb9ccac0d
Binary files /dev/null and b/coldfront/components/site/static/images/WVXCKA5W.png differ
diff --git a/coldfront/components/site/static/images/WWHPTXXK.png b/coldfront/components/site/static/images/WWHPTXXK.png
new file mode 100644
index 0000000000..55b5f90250
Binary files /dev/null and b/coldfront/components/site/static/images/WWHPTXXK.png differ
diff --git a/coldfront/components/site/static/images/WX3NR4ZA.png b/coldfront/components/site/static/images/WX3NR4ZA.png
new file mode 100644
index 0000000000..c041c3296c
Binary files /dev/null and b/coldfront/components/site/static/images/WX3NR4ZA.png differ
diff --git a/coldfront/components/site/static/images/WX7K7EWI.png b/coldfront/components/site/static/images/WX7K7EWI.png
new file mode 100644
index 0000000000..f5e5cad990
Binary files /dev/null and b/coldfront/components/site/static/images/WX7K7EWI.png differ
diff --git a/coldfront/components/site/static/images/WXXEIIKE.png b/coldfront/components/site/static/images/WXXEIIKE.png
new file mode 100644
index 0000000000..8a5880f60b
Binary files /dev/null and b/coldfront/components/site/static/images/WXXEIIKE.png differ
diff --git a/coldfront/components/site/static/images/WYZ6FGFJ.png b/coldfront/components/site/static/images/WYZ6FGFJ.png
new file mode 100644
index 0000000000..18124701d6
Binary files /dev/null and b/coldfront/components/site/static/images/WYZ6FGFJ.png differ
diff --git a/coldfront/components/site/static/images/X2RPAA67.png b/coldfront/components/site/static/images/X2RPAA67.png
new file mode 100644
index 0000000000..b518b4f018
Binary files /dev/null and b/coldfront/components/site/static/images/X2RPAA67.png differ
diff --git a/coldfront/components/site/static/images/X4S55QZ4.png b/coldfront/components/site/static/images/X4S55QZ4.png
new file mode 100644
index 0000000000..2189b23729
Binary files /dev/null and b/coldfront/components/site/static/images/X4S55QZ4.png differ
diff --git a/coldfront/components/site/static/images/X4W3PRMX.png b/coldfront/components/site/static/images/X4W3PRMX.png
new file mode 100644
index 0000000000..423f2cdf40
Binary files /dev/null and b/coldfront/components/site/static/images/X4W3PRMX.png differ
diff --git a/coldfront/components/site/static/images/X637LF5I.png b/coldfront/components/site/static/images/X637LF5I.png
new file mode 100644
index 0000000000..5a3c4c19d9
Binary files /dev/null and b/coldfront/components/site/static/images/X637LF5I.png differ
diff --git a/coldfront/components/site/static/images/X6ACFCGB.png b/coldfront/components/site/static/images/X6ACFCGB.png
new file mode 100644
index 0000000000..80bd89263d
Binary files /dev/null and b/coldfront/components/site/static/images/X6ACFCGB.png differ
diff --git a/coldfront/components/site/static/images/X6ETE5JU.png b/coldfront/components/site/static/images/X6ETE5JU.png
new file mode 100644
index 0000000000..ffdf121c18
Binary files /dev/null and b/coldfront/components/site/static/images/X6ETE5JU.png differ
diff --git a/coldfront/components/site/static/images/X6GL78JF.png b/coldfront/components/site/static/images/X6GL78JF.png
new file mode 100644
index 0000000000..b1aed145fd
Binary files /dev/null and b/coldfront/components/site/static/images/X6GL78JF.png differ
diff --git a/coldfront/components/site/static/images/X8XWCZI7.png b/coldfront/components/site/static/images/X8XWCZI7.png
new file mode 100644
index 0000000000..5d88877212
Binary files /dev/null and b/coldfront/components/site/static/images/X8XWCZI7.png differ
diff --git a/coldfront/components/site/static/images/XA32YK2Z.png b/coldfront/components/site/static/images/XA32YK2Z.png
new file mode 100644
index 0000000000..772b6f4411
Binary files /dev/null and b/coldfront/components/site/static/images/XA32YK2Z.png differ
diff --git a/coldfront/components/site/static/images/XA4NSBQ6.png b/coldfront/components/site/static/images/XA4NSBQ6.png
new file mode 100644
index 0000000000..f408dd97a2
Binary files /dev/null and b/coldfront/components/site/static/images/XA4NSBQ6.png differ
diff --git a/coldfront/components/site/static/images/XAYZGQ3B.png b/coldfront/components/site/static/images/XAYZGQ3B.png
new file mode 100644
index 0000000000..39b6b87605
Binary files /dev/null and b/coldfront/components/site/static/images/XAYZGQ3B.png differ
diff --git a/coldfront/components/site/static/images/XC9SCGB8.png b/coldfront/components/site/static/images/XC9SCGB8.png
new file mode 100644
index 0000000000..c2ae25577f
Binary files /dev/null and b/coldfront/components/site/static/images/XC9SCGB8.png differ
diff --git a/coldfront/components/site/static/images/XCHIIA4A.png b/coldfront/components/site/static/images/XCHIIA4A.png
new file mode 100644
index 0000000000..5409a9135e
Binary files /dev/null and b/coldfront/components/site/static/images/XCHIIA4A.png differ
diff --git a/coldfront/components/site/static/images/XCL7WUAS.png b/coldfront/components/site/static/images/XCL7WUAS.png
new file mode 100644
index 0000000000..c13a2dba0f
Binary files /dev/null and b/coldfront/components/site/static/images/XCL7WUAS.png differ
diff --git a/coldfront/components/site/static/images/XE4R59B8.png b/coldfront/components/site/static/images/XE4R59B8.png
new file mode 100644
index 0000000000..8b89ff6dfb
Binary files /dev/null and b/coldfront/components/site/static/images/XE4R59B8.png differ
diff --git a/coldfront/components/site/static/images/XEED8WLL.png b/coldfront/components/site/static/images/XEED8WLL.png
new file mode 100644
index 0000000000..9cabecd6f4
Binary files /dev/null and b/coldfront/components/site/static/images/XEED8WLL.png differ
diff --git a/coldfront/components/site/static/images/XFXX72DV.png b/coldfront/components/site/static/images/XFXX72DV.png
new file mode 100644
index 0000000000..2063167efa
Binary files /dev/null and b/coldfront/components/site/static/images/XFXX72DV.png differ
diff --git a/coldfront/components/site/static/images/XG8GAZY4.png b/coldfront/components/site/static/images/XG8GAZY4.png
new file mode 100644
index 0000000000..8d925a3f18
Binary files /dev/null and b/coldfront/components/site/static/images/XG8GAZY4.png differ
diff --git a/coldfront/components/site/static/images/XH4KVMLN.png b/coldfront/components/site/static/images/XH4KVMLN.png
new file mode 100644
index 0000000000..a8fbb5b44b
Binary files /dev/null and b/coldfront/components/site/static/images/XH4KVMLN.png differ
diff --git a/coldfront/components/site/static/images/XHR98RMP.png b/coldfront/components/site/static/images/XHR98RMP.png
new file mode 100644
index 0000000000..4077b1e55c
Binary files /dev/null and b/coldfront/components/site/static/images/XHR98RMP.png differ
diff --git a/coldfront/components/site/static/images/XI2KIRMP.png b/coldfront/components/site/static/images/XI2KIRMP.png
new file mode 100644
index 0000000000..1c73c1a6b3
Binary files /dev/null and b/coldfront/components/site/static/images/XI2KIRMP.png differ
diff --git a/coldfront/components/site/static/images/XIJ5T6R7.png b/coldfront/components/site/static/images/XIJ5T6R7.png
new file mode 100644
index 0000000000..ba9b7fd9ab
Binary files /dev/null and b/coldfront/components/site/static/images/XIJ5T6R7.png differ
diff --git a/coldfront/components/site/static/images/XIXYDWIC.png b/coldfront/components/site/static/images/XIXYDWIC.png
new file mode 100644
index 0000000000..133206f005
Binary files /dev/null and b/coldfront/components/site/static/images/XIXYDWIC.png differ
diff --git a/coldfront/components/site/static/images/XJB3Q4JH.png b/coldfront/components/site/static/images/XJB3Q4JH.png
new file mode 100644
index 0000000000..396bdb537a
Binary files /dev/null and b/coldfront/components/site/static/images/XJB3Q4JH.png differ
diff --git a/coldfront/components/site/static/images/XK7AT24Z.png b/coldfront/components/site/static/images/XK7AT24Z.png
new file mode 100644
index 0000000000..2b32e8693d
Binary files /dev/null and b/coldfront/components/site/static/images/XK7AT24Z.png differ
diff --git a/coldfront/components/site/static/images/XL6U8RCL.png b/coldfront/components/site/static/images/XL6U8RCL.png
new file mode 100644
index 0000000000..83296b5b2d
Binary files /dev/null and b/coldfront/components/site/static/images/XL6U8RCL.png differ
diff --git a/coldfront/components/site/static/images/XNGUW3TW.png b/coldfront/components/site/static/images/XNGUW3TW.png
new file mode 100644
index 0000000000..1964cb38f7
Binary files /dev/null and b/coldfront/components/site/static/images/XNGUW3TW.png differ
diff --git a/coldfront/components/site/static/images/XNINJCIA.png b/coldfront/components/site/static/images/XNINJCIA.png
new file mode 100644
index 0000000000..133206f005
Binary files /dev/null and b/coldfront/components/site/static/images/XNINJCIA.png differ
diff --git a/coldfront/components/site/static/images/XNJ7GNFV.png b/coldfront/components/site/static/images/XNJ7GNFV.png
new file mode 100644
index 0000000000..041c3a7b65
Binary files /dev/null and b/coldfront/components/site/static/images/XNJ7GNFV.png differ
diff --git a/coldfront/components/site/static/images/XP88ALR6.png b/coldfront/components/site/static/images/XP88ALR6.png
new file mode 100644
index 0000000000..2dfb50c475
Binary files /dev/null and b/coldfront/components/site/static/images/XP88ALR6.png differ
diff --git a/coldfront/components/site/static/images/XQQLUVMS.png b/coldfront/components/site/static/images/XQQLUVMS.png
new file mode 100644
index 0000000000..42bbe6c7d6
Binary files /dev/null and b/coldfront/components/site/static/images/XQQLUVMS.png differ
diff --git a/coldfront/components/site/static/images/XQSRUFIS.png b/coldfront/components/site/static/images/XQSRUFIS.png
new file mode 100644
index 0000000000..b775434b3f
Binary files /dev/null and b/coldfront/components/site/static/images/XQSRUFIS.png differ
diff --git a/coldfront/components/site/static/images/XQUUQMYA.png b/coldfront/components/site/static/images/XQUUQMYA.png
new file mode 100644
index 0000000000..8f7256c912
Binary files /dev/null and b/coldfront/components/site/static/images/XQUUQMYA.png differ
diff --git a/coldfront/components/site/static/images/XQWI9R53.png b/coldfront/components/site/static/images/XQWI9R53.png
new file mode 100644
index 0000000000..3cd3d658b6
Binary files /dev/null and b/coldfront/components/site/static/images/XQWI9R53.png differ
diff --git a/coldfront/components/site/static/images/XRSAHMAR.png b/coldfront/components/site/static/images/XRSAHMAR.png
new file mode 100644
index 0000000000..1e670bfc9e
Binary files /dev/null and b/coldfront/components/site/static/images/XRSAHMAR.png differ
diff --git a/coldfront/components/site/static/images/XSQY79NA.png b/coldfront/components/site/static/images/XSQY79NA.png
new file mode 100644
index 0000000000..5163626611
Binary files /dev/null and b/coldfront/components/site/static/images/XSQY79NA.png differ
diff --git a/coldfront/components/site/static/images/XTD2HJP9.png b/coldfront/components/site/static/images/XTD2HJP9.png
new file mode 100644
index 0000000000..ef75d56cd7
Binary files /dev/null and b/coldfront/components/site/static/images/XTD2HJP9.png differ
diff --git a/coldfront/components/site/static/images/XUC7ZSR2.png b/coldfront/components/site/static/images/XUC7ZSR2.png
new file mode 100644
index 0000000000..e715a882ba
Binary files /dev/null and b/coldfront/components/site/static/images/XUC7ZSR2.png differ
diff --git a/coldfront/components/site/static/images/XV56YQ64.png b/coldfront/components/site/static/images/XV56YQ64.png
new file mode 100644
index 0000000000..74f698b07d
Binary files /dev/null and b/coldfront/components/site/static/images/XV56YQ64.png differ
diff --git a/coldfront/components/site/static/images/XV7ZKX5D.png b/coldfront/components/site/static/images/XV7ZKX5D.png
new file mode 100644
index 0000000000..3b71f2cb37
Binary files /dev/null and b/coldfront/components/site/static/images/XV7ZKX5D.png differ
diff --git a/coldfront/components/site/static/images/XXAHPSLS.png b/coldfront/components/site/static/images/XXAHPSLS.png
new file mode 100644
index 0000000000..c71893bf49
Binary files /dev/null and b/coldfront/components/site/static/images/XXAHPSLS.png differ
diff --git a/coldfront/components/site/static/images/XXEA92HG.png b/coldfront/components/site/static/images/XXEA92HG.png
new file mode 100644
index 0000000000..8101d45953
Binary files /dev/null and b/coldfront/components/site/static/images/XXEA92HG.png differ
diff --git a/coldfront/components/site/static/images/XXVCILLL.png b/coldfront/components/site/static/images/XXVCILLL.png
new file mode 100644
index 0000000000..2ef2f81afa
Binary files /dev/null and b/coldfront/components/site/static/images/XXVCILLL.png differ
diff --git a/coldfront/components/site/static/images/XZGQQM68.png b/coldfront/components/site/static/images/XZGQQM68.png
new file mode 100644
index 0000000000..5c7df4100e
Binary files /dev/null and b/coldfront/components/site/static/images/XZGQQM68.png differ
diff --git a/coldfront/components/site/static/images/Y28R65HC.png b/coldfront/components/site/static/images/Y28R65HC.png
new file mode 100644
index 0000000000..78922a08b9
Binary files /dev/null and b/coldfront/components/site/static/images/Y28R65HC.png differ
diff --git a/coldfront/components/site/static/images/Y9BBHA6D.png b/coldfront/components/site/static/images/Y9BBHA6D.png
new file mode 100644
index 0000000000..e95f5c4173
Binary files /dev/null and b/coldfront/components/site/static/images/Y9BBHA6D.png differ
diff --git a/coldfront/components/site/static/images/Y9C2ZE8E.png b/coldfront/components/site/static/images/Y9C2ZE8E.png
new file mode 100644
index 0000000000..dc1d0adfe5
Binary files /dev/null and b/coldfront/components/site/static/images/Y9C2ZE8E.png differ
diff --git a/coldfront/components/site/static/images/Y9STZIEG.png b/coldfront/components/site/static/images/Y9STZIEG.png
new file mode 100644
index 0000000000..2ca62ead10
Binary files /dev/null and b/coldfront/components/site/static/images/Y9STZIEG.png differ
diff --git a/coldfront/components/site/static/images/YB8H5DHJ.png b/coldfront/components/site/static/images/YB8H5DHJ.png
new file mode 100644
index 0000000000..3b7838bc4a
Binary files /dev/null and b/coldfront/components/site/static/images/YB8H5DHJ.png differ
diff --git a/coldfront/components/site/static/images/YBNXJTGT.png b/coldfront/components/site/static/images/YBNXJTGT.png
new file mode 100644
index 0000000000..9cabecd6f4
Binary files /dev/null and b/coldfront/components/site/static/images/YBNXJTGT.png differ
diff --git a/coldfront/components/site/static/images/YCRBA6SG.png b/coldfront/components/site/static/images/YCRBA6SG.png
new file mode 100644
index 0000000000..241b11c890
Binary files /dev/null and b/coldfront/components/site/static/images/YCRBA6SG.png differ
diff --git a/coldfront/components/site/static/images/YDJPGPCJ.png b/coldfront/components/site/static/images/YDJPGPCJ.png
new file mode 100644
index 0000000000..12f5c5e3ee
Binary files /dev/null and b/coldfront/components/site/static/images/YDJPGPCJ.png differ
diff --git a/coldfront/components/site/static/images/YEAAC9IC.png b/coldfront/components/site/static/images/YEAAC9IC.png
new file mode 100644
index 0000000000..6cb789ab32
Binary files /dev/null and b/coldfront/components/site/static/images/YEAAC9IC.png differ
diff --git a/coldfront/components/site/static/images/YEER59WC.png b/coldfront/components/site/static/images/YEER59WC.png
new file mode 100644
index 0000000000..3869fd153a
Binary files /dev/null and b/coldfront/components/site/static/images/YEER59WC.png differ
diff --git a/coldfront/components/site/static/images/YEESM8YS.png b/coldfront/components/site/static/images/YEESM8YS.png
new file mode 100644
index 0000000000..81f0b1c934
Binary files /dev/null and b/coldfront/components/site/static/images/YEESM8YS.png differ
diff --git a/coldfront/components/site/static/images/YFHXEYSP.png b/coldfront/components/site/static/images/YFHXEYSP.png
new file mode 100644
index 0000000000..0326cc3f17
Binary files /dev/null and b/coldfront/components/site/static/images/YFHXEYSP.png differ
diff --git a/coldfront/components/site/static/images/YG47Z2ZQ.png b/coldfront/components/site/static/images/YG47Z2ZQ.png
new file mode 100644
index 0000000000..71b440ac1a
Binary files /dev/null and b/coldfront/components/site/static/images/YG47Z2ZQ.png differ
diff --git a/coldfront/components/site/static/images/YHQF8LCL.png b/coldfront/components/site/static/images/YHQF8LCL.png
new file mode 100644
index 0000000000..5928deef63
Binary files /dev/null and b/coldfront/components/site/static/images/YHQF8LCL.png differ
diff --git a/coldfront/components/site/static/images/YKGPYFUS.png b/coldfront/components/site/static/images/YKGPYFUS.png
new file mode 100644
index 0000000000..7e2a716ec1
Binary files /dev/null and b/coldfront/components/site/static/images/YKGPYFUS.png differ
diff --git a/coldfront/components/site/static/images/YKWPSKFN.png b/coldfront/components/site/static/images/YKWPSKFN.png
new file mode 100644
index 0000000000..8fa39f285a
Binary files /dev/null and b/coldfront/components/site/static/images/YKWPSKFN.png differ
diff --git a/coldfront/components/site/static/images/YKZ93Q3E.png b/coldfront/components/site/static/images/YKZ93Q3E.png
new file mode 100644
index 0000000000..15bb4ef6ad
Binary files /dev/null and b/coldfront/components/site/static/images/YKZ93Q3E.png differ
diff --git a/coldfront/components/site/static/images/YL8MBD2P.png b/coldfront/components/site/static/images/YL8MBD2P.png
new file mode 100644
index 0000000000..65e8ba16c3
Binary files /dev/null and b/coldfront/components/site/static/images/YL8MBD2P.png differ
diff --git a/coldfront/components/site/static/images/YLAMAC5Q.png b/coldfront/components/site/static/images/YLAMAC5Q.png
new file mode 100644
index 0000000000..fad2877bc4
Binary files /dev/null and b/coldfront/components/site/static/images/YLAMAC5Q.png differ
diff --git a/coldfront/components/site/static/images/YMK75TBE.png b/coldfront/components/site/static/images/YMK75TBE.png
new file mode 100644
index 0000000000..180f86f62b
Binary files /dev/null and b/coldfront/components/site/static/images/YMK75TBE.png differ
diff --git a/coldfront/components/site/static/images/YMV7B5CF.png b/coldfront/components/site/static/images/YMV7B5CF.png
new file mode 100644
index 0000000000..9debb2aceb
Binary files /dev/null and b/coldfront/components/site/static/images/YMV7B5CF.png differ
diff --git a/coldfront/components/site/static/images/YN49DD4Q.png b/coldfront/components/site/static/images/YN49DD4Q.png
new file mode 100644
index 0000000000..8c1464db74
Binary files /dev/null and b/coldfront/components/site/static/images/YN49DD4Q.png differ
diff --git a/coldfront/components/site/static/images/YNHXWSZK.png b/coldfront/components/site/static/images/YNHXWSZK.png
new file mode 100644
index 0000000000..3db9d63afe
Binary files /dev/null and b/coldfront/components/site/static/images/YNHXWSZK.png differ
diff --git a/coldfront/components/site/static/images/YP2PY43M.png b/coldfront/components/site/static/images/YP2PY43M.png
new file mode 100644
index 0000000000..7180226855
Binary files /dev/null and b/coldfront/components/site/static/images/YP2PY43M.png differ
diff --git a/coldfront/components/site/static/images/YPCRPN3X.png b/coldfront/components/site/static/images/YPCRPN3X.png
new file mode 100644
index 0000000000..6c2bb635ca
Binary files /dev/null and b/coldfront/components/site/static/images/YPCRPN3X.png differ
diff --git a/coldfront/components/site/static/images/YPS5JYGY.png b/coldfront/components/site/static/images/YPS5JYGY.png
new file mode 100644
index 0000000000..4934b959f6
Binary files /dev/null and b/coldfront/components/site/static/images/YPS5JYGY.png differ
diff --git a/coldfront/components/site/static/images/YQ6RKXDD.png b/coldfront/components/site/static/images/YQ6RKXDD.png
new file mode 100644
index 0000000000..9e7e48c015
Binary files /dev/null and b/coldfront/components/site/static/images/YQ6RKXDD.png differ
diff --git a/coldfront/components/site/static/images/YRWV8YQV.png b/coldfront/components/site/static/images/YRWV8YQV.png
new file mode 100644
index 0000000000..7a6b5fe19c
Binary files /dev/null and b/coldfront/components/site/static/images/YRWV8YQV.png differ
diff --git a/coldfront/components/site/static/images/YT4LE4AJ.png b/coldfront/components/site/static/images/YT4LE4AJ.png
new file mode 100644
index 0000000000..8fa39f285a
Binary files /dev/null and b/coldfront/components/site/static/images/YT4LE4AJ.png differ
diff --git a/coldfront/components/site/static/images/YTCHPGT4.png b/coldfront/components/site/static/images/YTCHPGT4.png
new file mode 100644
index 0000000000..da1e3d239b
Binary files /dev/null and b/coldfront/components/site/static/images/YTCHPGT4.png differ
diff --git a/coldfront/components/site/static/images/YUK6ZH9E.png b/coldfront/components/site/static/images/YUK6ZH9E.png
new file mode 100644
index 0000000000..4cf9d8675a
Binary files /dev/null and b/coldfront/components/site/static/images/YUK6ZH9E.png differ
diff --git a/coldfront/components/site/static/images/YWCG7BTB.png b/coldfront/components/site/static/images/YWCG7BTB.png
new file mode 100644
index 0000000000..e72f45d8ec
Binary files /dev/null and b/coldfront/components/site/static/images/YWCG7BTB.png differ
diff --git a/coldfront/components/site/static/images/YWQ666YM.png b/coldfront/components/site/static/images/YWQ666YM.png
new file mode 100644
index 0000000000..1d67333f13
Binary files /dev/null and b/coldfront/components/site/static/images/YWQ666YM.png differ
diff --git a/coldfront/components/site/static/images/YXSV9DV9.png b/coldfront/components/site/static/images/YXSV9DV9.png
new file mode 100644
index 0000000000..0dc33f762e
Binary files /dev/null and b/coldfront/components/site/static/images/YXSV9DV9.png differ
diff --git a/coldfront/components/site/static/images/YY8YTLUS.png b/coldfront/components/site/static/images/YY8YTLUS.png
new file mode 100644
index 0000000000..1ea573e28e
Binary files /dev/null and b/coldfront/components/site/static/images/YY8YTLUS.png differ
diff --git a/coldfront/components/site/static/images/Z2GFSIGB.png b/coldfront/components/site/static/images/Z2GFSIGB.png
new file mode 100644
index 0000000000..ee1158d967
Binary files /dev/null and b/coldfront/components/site/static/images/Z2GFSIGB.png differ
diff --git a/coldfront/components/site/static/images/Z34PDH5P.png b/coldfront/components/site/static/images/Z34PDH5P.png
new file mode 100644
index 0000000000..fbb9ccac0d
Binary files /dev/null and b/coldfront/components/site/static/images/Z34PDH5P.png differ
diff --git a/coldfront/components/site/static/images/Z3GIHJZP.png b/coldfront/components/site/static/images/Z3GIHJZP.png
new file mode 100644
index 0000000000..4934b959f6
Binary files /dev/null and b/coldfront/components/site/static/images/Z3GIHJZP.png differ
diff --git a/coldfront/components/site/static/images/Z3ICBNTC.png b/coldfront/components/site/static/images/Z3ICBNTC.png
new file mode 100644
index 0000000000..c59546e8dc
Binary files /dev/null and b/coldfront/components/site/static/images/Z3ICBNTC.png differ
diff --git a/coldfront/components/site/static/images/Z4BNJJIK.png b/coldfront/components/site/static/images/Z4BNJJIK.png
new file mode 100644
index 0000000000..0a7f029708
Binary files /dev/null and b/coldfront/components/site/static/images/Z4BNJJIK.png differ
diff --git a/coldfront/components/site/static/images/Z64QKAK9.png b/coldfront/components/site/static/images/Z64QKAK9.png
new file mode 100644
index 0000000000..b85c6ff470
Binary files /dev/null and b/coldfront/components/site/static/images/Z64QKAK9.png differ
diff --git a/coldfront/components/site/static/images/Z7AERU27.png b/coldfront/components/site/static/images/Z7AERU27.png
new file mode 100644
index 0000000000..22e7048d4a
Binary files /dev/null and b/coldfront/components/site/static/images/Z7AERU27.png differ
diff --git a/coldfront/components/site/static/images/Z7S6TSJ7.png b/coldfront/components/site/static/images/Z7S6TSJ7.png
new file mode 100644
index 0000000000..4934b959f6
Binary files /dev/null and b/coldfront/components/site/static/images/Z7S6TSJ7.png differ
diff --git a/coldfront/components/site/static/images/Z92D4QX4.png b/coldfront/components/site/static/images/Z92D4QX4.png
new file mode 100644
index 0000000000..9080a625d3
Binary files /dev/null and b/coldfront/components/site/static/images/Z92D4QX4.png differ
diff --git a/coldfront/components/site/static/images/Z9BAFJKI.png b/coldfront/components/site/static/images/Z9BAFJKI.png
new file mode 100644
index 0000000000..baefa2be07
Binary files /dev/null and b/coldfront/components/site/static/images/Z9BAFJKI.png differ
diff --git a/coldfront/components/site/static/images/ZAH9GZED.png b/coldfront/components/site/static/images/ZAH9GZED.png
new file mode 100644
index 0000000000..87605ec847
Binary files /dev/null and b/coldfront/components/site/static/images/ZAH9GZED.png differ
diff --git a/coldfront/components/site/static/images/ZBCDZJ7X.png b/coldfront/components/site/static/images/ZBCDZJ7X.png
new file mode 100644
index 0000000000..442fc623a4
Binary files /dev/null and b/coldfront/components/site/static/images/ZBCDZJ7X.png differ
diff --git a/coldfront/components/site/static/images/ZBFGUS6Q.png b/coldfront/components/site/static/images/ZBFGUS6Q.png
new file mode 100644
index 0000000000..bc4dc6204f
Binary files /dev/null and b/coldfront/components/site/static/images/ZBFGUS6Q.png differ
diff --git a/coldfront/components/site/static/images/ZBZJEQIB.png b/coldfront/components/site/static/images/ZBZJEQIB.png
new file mode 100644
index 0000000000..5fe27d0a28
Binary files /dev/null and b/coldfront/components/site/static/images/ZBZJEQIB.png differ
diff --git a/coldfront/components/site/static/images/ZC4MUTBH.png b/coldfront/components/site/static/images/ZC4MUTBH.png
new file mode 100644
index 0000000000..2346ab293b
Binary files /dev/null and b/coldfront/components/site/static/images/ZC4MUTBH.png differ
diff --git a/coldfront/components/site/static/images/ZDMKIUWC.png b/coldfront/components/site/static/images/ZDMKIUWC.png
new file mode 100644
index 0000000000..d8935de16e
Binary files /dev/null and b/coldfront/components/site/static/images/ZDMKIUWC.png differ
diff --git a/coldfront/components/site/static/images/ZF5HBMT6.png b/coldfront/components/site/static/images/ZF5HBMT6.png
new file mode 100644
index 0000000000..73f43fe9b8
Binary files /dev/null and b/coldfront/components/site/static/images/ZF5HBMT6.png differ
diff --git a/coldfront/components/site/static/images/ZG55JBTG.png b/coldfront/components/site/static/images/ZG55JBTG.png
new file mode 100644
index 0000000000..e9e903e2c3
Binary files /dev/null and b/coldfront/components/site/static/images/ZG55JBTG.png differ
diff --git a/coldfront/components/site/static/images/ZH8GJ4IN.png b/coldfront/components/site/static/images/ZH8GJ4IN.png
new file mode 100644
index 0000000000..94abd44b7c
Binary files /dev/null and b/coldfront/components/site/static/images/ZH8GJ4IN.png differ
diff --git a/coldfront/components/site/static/images/ZHW7FI2T.png b/coldfront/components/site/static/images/ZHW7FI2T.png
new file mode 100644
index 0000000000..b99159e681
Binary files /dev/null and b/coldfront/components/site/static/images/ZHW7FI2T.png differ
diff --git a/coldfront/components/site/static/images/ZIBLEYW4.png b/coldfront/components/site/static/images/ZIBLEYW4.png
new file mode 100644
index 0000000000..0013d07f40
Binary files /dev/null and b/coldfront/components/site/static/images/ZIBLEYW4.png differ
diff --git a/coldfront/components/site/static/images/ZJ8LFIAD.png b/coldfront/components/site/static/images/ZJ8LFIAD.png
new file mode 100644
index 0000000000..d0fbfd3100
Binary files /dev/null and b/coldfront/components/site/static/images/ZJ8LFIAD.png differ
diff --git a/coldfront/components/site/static/images/ZK7SS28X.png b/coldfront/components/site/static/images/ZK7SS28X.png
new file mode 100644
index 0000000000..acc8fd6024
Binary files /dev/null and b/coldfront/components/site/static/images/ZK7SS28X.png differ
diff --git a/coldfront/components/site/static/images/ZKHNFLI8.png b/coldfront/components/site/static/images/ZKHNFLI8.png
new file mode 100644
index 0000000000..af39f2bad3
Binary files /dev/null and b/coldfront/components/site/static/images/ZKHNFLI8.png differ
diff --git a/coldfront/components/site/static/images/ZMFXT7BH.png b/coldfront/components/site/static/images/ZMFXT7BH.png
new file mode 100644
index 0000000000..2a5a552d29
Binary files /dev/null and b/coldfront/components/site/static/images/ZMFXT7BH.png differ
diff --git a/coldfront/components/site/static/images/ZNDAFVKK.png b/coldfront/components/site/static/images/ZNDAFVKK.png
new file mode 100644
index 0000000000..db67061e9b
Binary files /dev/null and b/coldfront/components/site/static/images/ZNDAFVKK.png differ
diff --git a/coldfront/components/site/static/images/ZNWFYDCX.png b/coldfront/components/site/static/images/ZNWFYDCX.png
new file mode 100644
index 0000000000..4515d2df95
Binary files /dev/null and b/coldfront/components/site/static/images/ZNWFYDCX.png differ
diff --git a/coldfront/components/site/static/images/ZPHSH2I4.png b/coldfront/components/site/static/images/ZPHSH2I4.png
new file mode 100644
index 0000000000..2a5cb0f969
Binary files /dev/null and b/coldfront/components/site/static/images/ZPHSH2I4.png differ
diff --git a/coldfront/components/site/static/images/ZQW7PLAY.png b/coldfront/components/site/static/images/ZQW7PLAY.png
new file mode 100644
index 0000000000..c4bbe9d3e8
Binary files /dev/null and b/coldfront/components/site/static/images/ZQW7PLAY.png differ
diff --git a/coldfront/components/site/static/images/ZR6TCEXC.png b/coldfront/components/site/static/images/ZR6TCEXC.png
new file mode 100644
index 0000000000..5fe27d0a28
Binary files /dev/null and b/coldfront/components/site/static/images/ZR6TCEXC.png differ
diff --git a/coldfront/components/site/static/images/ZRIA3SC3.png b/coldfront/components/site/static/images/ZRIA3SC3.png
new file mode 100644
index 0000000000..b3059d34a0
Binary files /dev/null and b/coldfront/components/site/static/images/ZRIA3SC3.png differ
diff --git a/coldfront/components/site/static/images/ZS2SWBYP.png b/coldfront/components/site/static/images/ZS2SWBYP.png
new file mode 100644
index 0000000000..a20f845885
Binary files /dev/null and b/coldfront/components/site/static/images/ZS2SWBYP.png differ
diff --git a/coldfront/components/site/static/images/ZS3HVKBU.png b/coldfront/components/site/static/images/ZS3HVKBU.png
new file mode 100644
index 0000000000..1785597487
Binary files /dev/null and b/coldfront/components/site/static/images/ZS3HVKBU.png differ
diff --git a/coldfront/components/site/static/images/ZVNI3BWF.png b/coldfront/components/site/static/images/ZVNI3BWF.png
new file mode 100644
index 0000000000..0b87d8ede8
Binary files /dev/null and b/coldfront/components/site/static/images/ZVNI3BWF.png differ
diff --git a/coldfront/components/site/static/images/ZVP7N2IL.png b/coldfront/components/site/static/images/ZVP7N2IL.png
new file mode 100644
index 0000000000..235710e118
Binary files /dev/null and b/coldfront/components/site/static/images/ZVP7N2IL.png differ
diff --git a/coldfront/components/site/static/images/ZY2TY2UA.png b/coldfront/components/site/static/images/ZY2TY2UA.png
new file mode 100644
index 0000000000..cc2a5433e1
Binary files /dev/null and b/coldfront/components/site/static/images/ZY2TY2UA.png differ
diff --git a/coldfront/components/site/static/images/ZY43WIZA.png b/coldfront/components/site/static/images/ZY43WIZA.png
new file mode 100644
index 0000000000..74632e43de
Binary files /dev/null and b/coldfront/components/site/static/images/ZY43WIZA.png differ
diff --git a/coldfront/components/site/static/links.txt b/coldfront/components/site/static/links.txt
new file mode 100644
index 0000000000..e6ce29a46b
--- /dev/null
+++ b/coldfront/components/site/static/links.txt
@@ -0,0 +1,1872 @@
+N4ZREJI8 https://www.mdpi.com/1999-4915/15/8/1672 Molecular Dynamics Simulations of Deformable Viral Capsomers
+QW3FDIE6 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023EF003851 The Choice of Baseline Period Influences the Assessments of the Outcomes of Stratospheric Aerosol Injection
+TXTVR9MJ https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022JD037067 The Shortwave Radiative Flux Response to an Injection of Sea Salt Aerosols in the Gulf of Mexico
+SRIIEXWF https://jov.arvojournals.org/article.aspx?articleid=2791809 Slow change: An analysis of infant egocentric visual experience
+2BR6U46Q https://onlinelibrary.wiley.com/doi/10.1111/mmi.14969 Roles of RodZ and class A PBP1b in the assembly and regulation of the peripheral peptidoglycan elongasome in ovoid‐shaped cells of Streptococcus pneumoniaeD39
+ITNAJ56K https://www.nature.com/articles/s41467-023-41216-7 Multimaterial fiber as a physical simulator of a capillary instability
+3I85KTEL https://www.spiedigitallibrary.org/conference-proceedings-of-spie/12433/2644870/Creating-fiber-embedded-photonic-circuitry-by-liquid-phase-structuring-of/10.1117/12.2644870.full Creating fiber-embedded photonic circuitry by liquid-phase structuring of multi-material cores
+XXVCILLL https://xlink.rsc.org/?DOI=C8SC03677B Mechanistic study of styrene aziridination by iron( iv ) nitrides
+R6ITXDPA https://pubs.acs.org/doi/10.1021/jacs.9b04389 A Dimeric Hydride-Bridged Complex with Geometrically Distinct Iron Centers Giving Rise to an S = 3 Ground State
+4HZCFGX6 https://pubs.acs.org/doi/10.1021/jacs.0c07300 Two-State Reactivity in Iron-Catalyzed Alkene Isomerization Confers σ-Base Resistance
+SNEF62TE https://pubs.acs.org/doi/10.1021/acs.inorgchem.0c02575 Iron(II) Complexes of an Anionic Bis(ylide)diphenylborate Ligand
+5YDJMAVJ https://www.science.org/doi/10.1126/science.abd3054 Structural and spectroscopic characterization of an Fe(VI) bis(imido) complex
+6XYDEAPZ https://pubs.acs.org/doi/10.1021/jacs.1c02068 Catalytic Carbodiimide Guanylation by a Nucleophilic, High Spin Iron(II) Imido Complex
+B9LWJQ3X https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/ejic.202200675 Heteroleptic Square Planar Cobalt(I/II) Complexes
+228QL2PR https://linkinghub.elsevier.com/retrieve/pii/S2451929423002395 Hydrogen atom abstraction by a high-spin [FeIII=S] complex
+NLZCQ9M8 https://pubs.acs.org/doi/10.1021/jacs.1c11429 Alkali Metal Ions Dictate the Structure and Reactivity of an Iron(II) Imido Complex
+JGBFY7DF https://pubs.acs.org/doi/10.1021/jacs.2c03487 A Spectroscopically Observed Iron Nitrosyl Intermediate in the Reduction of Nitrate by a Surface-Conjugated Electrocatalyst
+XTW58RE6 https://pubs.acs.org/doi/10.1021/jacs.2c13350 Catalytic 1,3-Proton Transfer in Alkenes Enabled by Fe═NR Bond Cooperativity: A Strategy for p Ka -Dictated Regioselective Transposition of C═C Double Bonds
+2WIPR99L https://pubs.acs.org/doi/10.1021/acscentsci.1c00890 Hydrocarbon Oxidation by an Exposed, Multiply Bonded Iron(III) Oxo Complex
+9P4PDPAK https://linkinghub.elsevier.com/retrieve/pii/S0021925820335560 Non-growing Rhodopseudomonas palustris Increases the Hydrogen Gas Yield from Acetate by Shifting from the Glyoxylate Shunt to the Tricarboxylic Acid Cycle
+7V7T5W6C http://link.springer.com/10.1007/s11682-015-9500-7 Neural correlates of emotion reappraisal in individuals with externalizing psychopathology
+Q8E6XD3I https://onlinelibrary.wiley.com/doi/10.1002/brb3.3312 Impact of aversive affect on neural mechanisms of categorization decisions
+STVRS9KV https://onlinelibrary.wiley.com/doi/10.1002/hbm.26648 Dynamic threat–reward neural processing under semi‐naturalistic ecologically relevant scenarios
+GT372DC7 https://linkinghub.elsevier.com/retrieve/pii/S2589004220308476 Tumor Phylogeny Topology Inference via Deep Learning
+Q2HUAHZN https://www.ijcai.org/proceedings/2023/591 DiSProD: Differentiable Symbolic Propagation of Distributions for Planning
+3AWWNUNM https://linkinghub.elsevier.com/retrieve/pii/S2352673421000639 Occupy Wall Street ten years on: How its disruptive institutional entrepreneurship spread and why it fizzled
+GJWVPZEW https://www.aanda.org/10.1051/0004-6361/202346095 Ongoing hierarchical massive cluster assembly: The LISCA II structure in the Perseus complex
+5VR4LX9I https://www.aanda.org/10.1051/0004-6361/202346792 The structural properties of multiple populations in the dynamically young globular cluster NGC 2419
+3TM2E3JG https://www.aanda.org/10.1051/0004-6361/202347420 Young, wild, and free: The early expansion of star clusters
+AZDLRC32 https://www.aanda.org/10.1051/0004-6361/202349021 The structural properties of multiple populations in globular clusters: The instructive case of NGC 3201
+TU9N5FBR https://academic.oup.com/mnras/article/516/4/5914/6691715 Sub-parsec resolution cosmological simulations of star-forming clumps at high redshift with feedback of individual stars
+8WE2QPHC https://academic.oup.com/mnras/article/512/2/2584/6546161 Long-term evolution of multimass rotating star clusters
+R6LCTMU7 https://academic.oup.com/mnras/article/525/2/3136/7243400 Effects of massive central objects on the degree of energy equipartition of globular clusters
+ZHW7FI2T https://academic.oup.com/mnras/article/526/1/1428/7271420 Shaping the unseen: the influence of baryons and environment on low-mass, high-redshift dark matter haloes in the SIEGE simulations
+XQWI9R53 https://academic.oup.com/mnras/article/521/3/4395/7080163 Evolution of binary stars in the early evolutionary phases of ultra-faint dwarf galaxies
+ZVP7N2IL https://academic.oup.com/mnrasl/article/522/1/L61/7086132 First observational evidence of a relation between globular clusters’ internal rotation and stellar masses
+6P7XBKS9 https://pubs.acs.org/doi/10.1021/acs.jctc.6b00001 Hybrid Extended Lagrangian, Post-Hartree–Fock Born–Oppenheimer ab Initio Molecular Dynamics Using Fragment-Based Electronic Structure
+SAR9SFJP https://pubs.acs.org/doi/10.1021/acs.jctc.6b01107 Efficient, “On-the-Fly”, Born–Oppenheimer and Car–Parrinello-type Dynamics with Coupled Cluster Accuracy through Fragment Based Electronic Structure
+93HZWE6D https://pubs.acs.org/doi/10.1021/acs.jctc.7b00927 Efficient and Adaptive Methods for Computing Accurate Potential Surfaces for Quantum Nuclear Effects: Applications to Hydrogen-Transfer Reactions
+BUW2WF9J https://pubs.acs.org/doi/10.1021/acs.jctc.8b00186 Adaptive, Geometric Networks for Efficient Coarse-Grained Ab Initio Molecular Dynamics with Post-Hartree–Fock Accuracy
+XL9E3S3G https://pubs.acs.org/doi/10.1021/acs.jctc.8b00803 Efficiently Capturing Weak Interactions in ab Initio Molecular Dynamics with on-the-Fly Basis Set Extrapolation
+KX4N8JST https://pubs.acs.org/doi/10.1021/acs.jctc.9b00608 Fragment-Based Electronic Structure for Potential Energy Surfaces Using a Superposition of Fragmentation Topologies
+HJ9H8MCP https://onlinelibrary.wiley.com/doi/10.1002/qua.26244 Embedded, graph‐theoretically defined many‐body approximations for wavefunction‐in‐DFT and DFT‐in‐DFT : Applications to gas‐ and condensed‐phase ab initio molecular dynamics, and potential surfaces for quantum nuclear effects
+LPTPLX8M https://pubs.acs.org/doi/10.1021/acs.jctc.9b01089 Efficient and Accurate Approach To Estimate Hybrid Functional and Large Basis-Set Contributions to Condensed-Phase Systems and Molecule–Surface Interactions
+QLDUJLB4 https://pubs.acs.org/doi/10.1021/acs.jctc.0c01287 Weighted-Graph-Theoretic Methods for Many-Body Corrections within ONIOM: Smooth AIMD and the Role of High-Order Many-Body Terms
+JCWVSDJ7 https://pubs.acs.org/doi/10.1021/acs.jctc.5b00433 Ab Initio Molecular Dynamics Using Recursive, Spatially Separated, Overlapping Model Subsystems Mixed within an ONIOM-Based Fragmentation Energy Extrapolation Technique
+2EWFAKGL https://aacrjournals.org/cancerres/article/83/7_Supplement/5874/720067/Abstract-5874-HSF1-downregulation-of-CCL5-reduces Abstract 5874: HSF1 downregulation of CCL5 reduces CD8 T cell trafficking in breast cancer
+K8LB2Y6D https://www.mdpi.com/2072-6694/15/13/3309 MCAK Inhibitors Induce Aneuploidy in Triple-Negative Breast Cancer Models
+ZH8GJ4IN https://aacrjournals.org/cancerres/article/84/2/276/733116/HSF1-Inhibits-Antitumor-Immune-Activity-in-Breast HSF1 Inhibits Antitumor Immune Activity in Breast Cancer by Suppressing CCL5 to Block CD8+ T-cell Recruitment
+WL78YP5D http://journals.ametsoc.org/doi/10.1175/JCLI-D-15-0439.1 The Influence of Climate Model Biases on Projections of Aridity and Drought
+GX6NTUAD https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2016GL069121 Impacts of recent climate change on trends in baseflow and stormflow in United States watersheds
+JKJ723P8 https://linkinghub.elsevier.com/retrieve/pii/S0034425716301900 Mapping spatial distribution and biomass of coastal wetland vegetation in Indonesian Papua by combining active and passive remotely sensed data
+KRCU6LPD https://www.tandfonline.com/doi/full/10.1080/01431161.2016.1183834 Revisiting empirical ocean-colour algorithms for remote estimation of chlorophyll- a content on a global scale
+9H5KZ8CW https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2015GL064593 Revisiting the recent California drought as an extreme value
+5IG3BRPL https://linkinghub.elsevier.com/retrieve/pii/S0167715218303407 Intrinsic random functions on the sphere
+Z2M2X725 https://rmets.onlinelibrary.wiley.com/doi/10.1002/joc.2419 A refined index of model performance
+E4FDNW56 https://linkinghub.elsevier.com/retrieve/pii/S2212095521001929 Climate change impacts and urban green space adaptation efforts: Evidence from U.S. municipal parks and recreation departments
+EC2CEVPM https://linkinghub.elsevier.com/retrieve/pii/S0022169421010222 Incorporating rain-on-snow into the SWAT model results in more accurate simulations of hydrologic extremes
+2LB7X4Z3 https://rmets.onlinelibrary.wiley.com/doi/10.1002/gdj3.188 A convection‐permitting dynamically downscaled dataset over the Midwestern United States
+CPBNR7D3 https://dl.acm.org/doi/10.1145/3491418.3535171 HPC Data Analysis Pipeline for Neuronal Cluster Detection
+GXDJT4DQ https://onlinelibrary.wiley.com/doi/10.1002/ajpa.24712 Updated imaging and phylogenetic comparative methods reassess relative temporal lobe size in anthropoids and modern humans
+9B3SVACY https://academic.oup.com/zoolinnean/article/199/3/567/7226103 Notes from the Anatolian underground: two new mole taxa from Eastern Turkey, together with a revised phylogeny of the genus Talpa (Mammalia: Eulipotyphla: Talpidae)
+NND5FHVD https://linkinghub.elsevier.com/retrieve/pii/S0167278915000573 Continuous data assimilation for the 2D Bénard convection through velocity measurements alone
+6Y5S47HQ https://www.aimsciences.org//article/doi/10.3934/jcd.2019006 Numerical efficacy study of data assimilation for the 2D magnetohydrodynamic equations
+2WDP6PRM https://asmedigitalcollection.asme.org/computationalnonlinear/article/doi/10.1115/1.4002088/465846/Numerical-Techniques-for-Approximating-Lyapunov Numerical Techniques for Approximating Lyapunov Exponents and Their Implementation
+ALB6ESQR https://academic.oup.com/biometrics/article/79/4/3294/7587573 Bayesian Functional Data Analysis Over Dependent Regions and Its Application for Identification of Differentially Methylated Regions
+CGM5TKEQ https://journals.sagepub.com/doi/10.1177/1545968315584004 Dynamic Changes in White Matter Abnormalities Correlate With Late Improvement and Deterioration Following TBI: A Diffusion Tensor Imaging Study
+8IGQFYJL https://www.nature.com/articles/s41598-020-78780-7 Impact of tumor-parenchyma biomechanics on liver metastatic progression: a multi-model approach
+9NUU6N7M https://gigabytejournal.com/articles/22 DAPT: A package enabling distributed automated parameter testing
+ABPVXK7M https://dl.acm.org/doi/10.1145/3588983.3596679 HQ-Sim: High-performance State Vector Simulation of Quantum Circuits on Heterogeneous HPC Systems
+3BB2YMVJ https://dl.acm.org/doi/10.1145/3624062.3624217 MEMQSim: Highly Memory-Efficient and Modularized Quantum State-Vector Simulation
+KAWUFQ9W https://dl.acm.org/doi/10.1145/3624062.3624257 Benchmarking and In-depth Performance Study of Large Language Models on Habana Gaudi Processors
+5W6DUXB8 https://dl.acm.org/doi/10.1145/3624062.3625123 Analyzing Impact of Data Reduction Techniques on Visualization for AMR Applications Using AMReX Framework
+QYWVAXP8 https://pubs.acs.org/doi/10.1021/acs.jpca.3c03738 Electronic Structure of Heteronuclear Cerium-Platinum Clusters
+4MUJD9IH https://ideals.illinois.edu/handle/2142/107392 PROBING THE EFFECTS OF ELECTRON CORRELATION: THE NOT-SO-SIMPLE CASE OF Gd2O
+SWA8JZ9M https://hdl.handle.net/2142/116827 A SPECTROSCOPIC INVESTIGATION OF THE EFFECTS OF SPIN STRAIN ON LN3O− CLUSTERS
+VGVXR22Z https://hdl.handle.net/2142/116854 ZINC OXIDE ELECTRONIC STRUCTURE STUDY USING PES
+TLR3DF5P https://pubs.acs.org/doi/10.1021/acs.jpca.1c04253 Lanthanide Oxides: From Diatomics to High-Spin, Strongly Correlated Homo- and Heterometallic Clusters
+D5E67MPG https://pubs.acs.org/doi/10.1021/acs.jpca.3c04327 Trend in the Electron Affinities of Fluorophenyl Radicals ·C6 H5-x Fx (1 ≤ x ≤ 4)
+MNA5FE63 https://pubs.acs.org/doi/10.1021/acs.jpca.3c04016 Anion Photoelectron Imaging Spectroscopy of C6 HF5– , C6 F6– , and the Absence of C6 H2 F4–
+A25GKM62 https://pubs.acs.org/doi/10.1021/jacs.4c00556 Isomer-Dependent Electron Affinities of Fluorophenyl Radicals,• C6 H 5– x Fx (2 ≤ x ≤ 4)
+9T7T5W4N http://link.springer.com/10.1007/11960669_14 An Approximate de Bruijn Graph Approach to Multiple Local Alignment and Motif Discovery in Protein Sequences
+MFMIJHF6 https://linkinghub.elsevier.com/retrieve/pii/S1054139X14007137 Feasibility of Functional Neuroimaging to Understand Adolescent Women's Sexual Decision Making
+GASZ8VYT https://linkinghub.elsevier.com/retrieve/pii/S0028393223002294 Neural segregation and integration of sensory, decision, and action processes during object categorization
+VQ74YJYQ https://link.springer.com/10.1007/s11682-020-00308-4 Neural Modulation in Approach-Avoidance Conflicts in Externalizing Psychopathology
+TSIUC6IS https://link.springer.com/10.1007/s00213-021-05815-w Neural mechanisms of sexual decision-making in women with alcohol use disorder
+BY6LLRHL https://onlinelibrary.wiley.com/doi/10.1111/adb.12121 Neural mechanisms of high‐risk decisions‐to‐drink in alcohol‐dependent women
+7X25ZJ2Q https://www.liebertpub.com/doi/10.1089/brain.2023.0048 Increased Segregation in Functional Connectivity Networks When Watching Unpleasant Arousing Videos: A Generalized Psychophysiological Interaction Analysis
+M9N97B9D https://journals.lww.com/10.1249/01.mss.0000875844.04195.62 Test-retest Reliability And Efficacy Of Individual Symptoms In Concussion Management: 266
+W7CXM9FX https://linkinghub.elsevier.com/retrieve/pii/S2213158224000858 Diffusion tensor analysis of white matter tracts is prognostic of persisting post-concussion symptoms in collegiate athletes
+AWLDKHJG https://www.nature.com/articles/s41592-024-02237-2 brainlife.io: a decentralized and open-source cloud platform to support neuroscience research
+EPVHNVGS https://www.nature.com/articles/s41592-024-02296-5 Author Correction: brainlife.io: a decentralized and open-source cloud platform to support neuroscience research
+3HX5TD29 https://bjsm.bmj.com/lookup/doi/10.1136/bjsports-2023-concussion.279 6.1 Predicting the time to return to play and persistent post concussion symptoms utilizing machine learning of behavior and diffusion weighted MR imaging: findings from the NCAA/DOD CARE consortium
+PDFS3M33 https://bjsm.bmj.com/lookup/doi/10.1136/bjsports-2023-concussion.293 6.15 Protective and risk factors for persistent post concussion symptoms and return to play of NCAA collegiate athletes: findings from the NCAA-DOD CARE consortium
+2UK7G3EU https://bjsm.bmj.com/lookup/doi/10.1136/bjsports-2023-concussion.90 7.2 A deep learning neural network predicts return-to-play time-point groups utilizing the vestibular/ocular-motor screening and SCAT3: an NCAA-DoD CARE consortium analysis
+TSP9MIXP https://iopscience.iop.org/article/10.3847/1538-4357/acb434 New Parameters for Star Cluster Dynamics: The Effect of Primordial Binaries and Dark Remnants
+4P7PJAF8 https://iopscience.iop.org/article/10.3847/1538-4357/ad3dec New Parameters for Star Cluster Dynamics: The Role of Clusters’ Initial Conditions
+4CCJFJBF https://ieeexplore.ieee.org/document/10821233/ Entangled Meanings: Classification and Ambiguity Resolution in QNLP
+RXPDGNNN https://ieeexplore.ieee.org/document/10821048/ Semantic Similarities Using Classical Embeddings in Quantum NLP
+IYBWZI6T https://ieeexplore.ieee.org/document/10821150/ Entangled Meanings: Classification and Ambiguity Resolution in Near-Term QNLP
+TF6IWRNX https://linkinghub.elsevier.com/retrieve/pii/S0167278918300599 Turbulence in vertically averaged convection
+UMMLEY74 https://iopscience.iop.org/article/10.1088/1361-6544/abb1c6 Algebraic bounds on the Rayleigh–Bénard attractor
+EBLEPM2S https://epubs.siam.org/doi/10.1137/20M136058X Data Assimilation for the Navier--Stokes Equations Using Local Observables
+2HZ4ZGSM https://onlinelibrary.wiley.com/doi/10.1002/fld.5152 Data assimilation with higher order finite element interpolants
+2PUFN5S6 https://www.aimsciences.org//article/doi/10.3934/dcds.2023078 Convergence of a mobile data assimilation scheme for the 2D Navier-Stokes equations
+2X9HTNFX https://iopscience.iop.org/article/10.1088/1361-648X/accd38 Metal–insulator transition in composition-tuned nickel oxide films
+STSIG8Y4 https://pubs.acs.org/doi/10.1021/om401221v Iridium-Promoted, Palladium-Catalyzed Direct Arylation of Unactivated Arenes
+JTQUEW9L https://www.nature.com/articles/ncomms8789 Engineering a dirhodium artificial metalloenzyme for selective olefin cyclopropanation
+DATERCB8 https://linkinghub.elsevier.com/retrieve/pii/S2667109322003463 Analysis of laboratory-evolved flavin-dependent halogenases affords a computational model for predicting halogenase site selectivity
+MA7XCL8M https://pubs.acs.org/doi/10.1021/jacs.2c07422 Directed Evolution of Flavin-Dependent Halogenases for Site- and Atroposelective Halogenation of 3-Aryl-4(3 H )-Quinazolinones via Kinetic or Dynamic Kinetic Resolution
+SZCJCVZE https://pubs.acs.org/doi/10.1021/acscatal.2c03383 Expanding the Reactivity of Flavin-Dependent Halogenases toward Olefins via Enantioselective Intramolecular Haloetherification and Chemoenzymatic Oxidative Rearrangements
+S7K4FDYT https://pubs.acs.org/doi/10.1021/acs.chemrev.3c00215 Non-Native Site-Selective Enzyme Catalysis
+9RL848QN https://rmets.onlinelibrary.wiley.com/doi/10.1002/joc.8668 A Multiscalar Standardized Vapor Pressure Deficit Index for Drought Monitoring and Impacts
+NAEFYKKB http://link.springer.com/10.1007/s00021-019-0478-6 Tracer Turbulence: The Batchelor–Howells–Townsend Spectrum Revisited
+KELPMD25 https://jov.arvojournals.org/article.aspx?articleid=2792416 The statistics of infants’ natural visual experience are shaped by motor development.
+NR3IPS3U https://linkinghub.elsevier.com/retrieve/pii/S1053811909012889 Neural processing of asynchronous audiovisual speech perception
+8XMY76KU https://jov.arvojournals.org/article.aspx?articleid=2749967 Alcoholic drink preferences modulate acquired salience
+NDBAVWR9 https://linkinghub.elsevier.com/retrieve/pii/S0741832918300922 Risky drinking decisions: The influence of party music and alcohol abuse in young adult women
+WYZ6FGFJ https://academic.oup.com/mnrasl/article/504/1/L12/6217434 New insights into star cluster evolution towards energy equipartition
+IL56565Z https://academic.oup.com/mnras/article/509/3/3815/6425755 Evolution towards energy equipartition in star clusters: effects of the tidal field, primordial binaries, and internal velocity anisotropy
+LV7IIBGH https://academic.oup.com/mnras/article/515/2/1830/6618562 Mass segregation and dynamics of primordial binaries in star clusters with a radially anisotropic velocity distribution
+GC422TSZ https://www.aanda.org/10.1051/0004-6361/202450270 Dynamics of star clusters with tangentially anisotropic velocity distribution
+XXMHSNUB https://direct.mit.edu/artl/article/22/2/153-171/2832 Exploring the Space of Viable Configurations in a Model of Metabolism–Boundary Co-construction
+C6Y8WDLR https://linkinghub.elsevier.com/retrieve/pii/S0959438816300691 The whole worm: brain–body–environment models of C. elegans
+XC9SCGB8 https://pubs.aip.org/cha/article/27/11/111104/136041/Computing-aggregate-properties-of-preimages-for-2D Computing aggregate properties of preimages for 2D cellular automata
+IS7BVQ77 https://www.frontiersin.org/articles/10.3389/fncom.2021.572339/full A Neuromechanical Model of Multiple Network Rhythmic Pattern Generators for Forward Locomotion in C. elegans
+LY2QD9TN https://link.springer.com/10.1007/s00422-022-00938-5 Codimension-2 parameter space structure of continuous-time recurrent neural networks
+M3JPCB6T https://linkinghub.elsevier.com/retrieve/pii/S0303264722002040 The theoretical foundations of enaction: Precariousness
+KEWIBTXR https://onlinelibrary.wiley.com/doi/10.1111/tops.12686 On the Proper Treatment of Dynamics in Cognitive Science
+FP8QJZLA https://onlinelibrary.wiley.com/doi/10.1111/cogs.12142 Information Processing and Dynamics in Minimally Cognitive Agents
+UT9JLDH2 https://direct.mit.edu/artl/article/21/1/1-19/2792 Characterizing Autopoiesis in the Game of Life
+HQQSVR54 https://journals.sagepub.com/doi/10.1177/1059712310363163 Fitness Space Structure of a Neuromechanical System
+F9HUB2VI https://dx.plos.org/10.1371/journal.pcbi.1002890 Connecting a Connectome to Behavior: An Ensemble of Neuroanatomical Models of C. elegans Klinotaxis
+9HP94MQA http://link.springer.com/10.1007/s00359-006-0124-7 Mechanical reconfiguration mediates swallowing and rejection in Aplysia californica
+VUZKXZ5K http://link.springer.com/10.1007/s00422-004-0517-z Neural control exploits changing mechanical advantage and context dependence to generate different feeding responses in Aplysia
+QUQKXSPG https://onlinelibrary.wiley.com/doi/10.1111/j.1525-142X.2008.00245.x Developmental bias in evolution: evolutionary accessibility of phenotypes in a model evo‐devo system
+W7X96ZNF https://ieeexplore.ieee.org/document/1650256/ Design and Implementation of Multipattern Generators in Analog VLSI
+5YBIDUYS http://www.scholarpedia.org/article/Computational_neuroethology Computational neuroethology
+ZGFNVBPH http://link.springer.com/10.1007/978-3-642-15193-4_4 Information Dynamics of Evolved Agents
+R96YFKBG http://link.springer.com/10.1007/978-3-642-15193-4_52 The Dependence of Braking Strategies on Optical Variables in an Evolved Model of Visually-Guided Braking
+VCVFI9HW https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-33936-0-ch087 Propagation of rhythmic dorsoventral wave in a neuromechanical model of locomotion in Caernohabditis elegans
+E6WMABVN https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_008 Structural coupling of a Potts model cell
+V2Z4SAMV https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_040 An evolutionary robotics model of visually-guided braking: Testing optical variables
+N3MV3MQH https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_00019 On the Origin of Gliders
+D89WEHTM https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_00598 The Sun Always Rises: Behavioral Attunement to Abiotic Reins
+2TN4IZS6 https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_00599 Characterizing the Role of Homeostatic Plasticity in Central Pattern Generators
+4DSUFRY9 https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-31709-2-ch008 Analysis of Ultrastability in Small Dynamical Recurrent Neural Networks
+EZYQERCA https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-31709-2-ch041 Environmental Feedback Drives Multiple Behaviors from the Same Neural Circuit
+SF7IJ3R3 https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-32621-6-ch082 Quantifying Robustness in a Spatial Model of Metabolism-Boundary Co-Construction
+J7XCQWQN https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-33027-5-ch040 An Integrated Neuromechanical Model of Steering in C. elegans
+69IMEMPH https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-33027-5-ch043 Ontogeny and adaptivity in a model protocell
+GFP4XA7V https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-33936-0-ch087 Propagation of rhythmic dorsoventral wave in a neuromechanical model of locomotion in Caernohabditis elegans
+89X3SEYC https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_00738 Deriving Community Models with Evolutionary Robotics: A Case Study of Sensory Pollution
+9QZSZTGJ https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-31709-2-ch008 Analysis of Ultrastability in Small Dynamical Recurrent Neural Networks
+WLIIZ8RF https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-31709-2-ch041 Environmental Feedback Drives Multiple Behaviors from the Same Neural Circuit
+YDMVCJ9P https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-32621-6-ch082 Quantifying Robustness in a Spatial Model of Metabolism-Boundary Co-Construction
+IKF5ERYX https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-33027-5-ch043 Ontogeny and adaptivity in a model protocell
+9FWNP3TT https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-33027-5-ch040 An Integrated Neuromechanical Model of Steering in C. elegans
+U36SEK6W https://pnas.org/doi/full/10.1073/pnas.2202230119 Scenarios for modeling solar radiation modification
+7URIW76U https://gmd.copernicus.org/articles/8/3379/2015/gmd-8-3379-2015-discussion.html The Geoengineering Model Intercomparison Project Phase 6 (GeoMIP6): simulation design and preliminary results
+7CBJKUYY https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2013JD020569 An overview of the Geoengineering Model Intercomparison Project (GeoMIP)
+534HF7QE https://onlinelibrary.wiley.com/doi/10.1111/mmi.15122 Negative regulation of MurZ and MurA underlies the essentiality of GpsB ‐ and StkP ‐mediated protein phosphorylation in Streptococcus pneumoniaeD39
+F7DGM9SK https://www.journals.uchicago.edu/doi/10.1086/716197 Tracking Public and Private Responses to the COVID-19 Epidemic: Evidence from State and Local Government Actions
+EDNXLHB5 https://dx.plos.org/10.1371/journal.pbio.3003015 Unprecedented female mutation bias in the aye-aye, a highly unusual lemur from Madagascar
+U6LPBMQP https://peerj.com/articles/cs-38 Measuring online social bubbles
+I355HIII https://dl.acm.org/doi/10.1145/2818717 The rise of social bots
+V8W8I7TB https://peerj.com/articles/cs-87 OSoMe: the IUNI observatory on social media
+7WM3MEP8 https://link.aps.org/doi/10.1103/PhysRevE.98.042304 Weight thresholding on complex networks
+XH4KVMLN https://asistdl.onlinelibrary.wiley.com/doi/10.1002/asi.24121 Quantifying Biases in Online Information Exposure
+YDJPGPCJ https://direct.mit.edu/qss/article/1/3/1298-1308/96112 Recency predicts bursts in the evolution of author citations
+MNK8VUTT https://link.aps.org/doi/10.1103/PhysRevResearch.2.033171 Classes of critical avalanche dynamics in complex networks
+V8W5SIXH https://epjdatascience.springeropen.com/articles/10.1140/epjds/s13688-023-00410-9 A language framework for modeling social media account behavior
+FH3KHWB5 http://link.springer.com/10.1007/s13278-014-0237-x Clustering memes in social media streams
+XSQY79NA https://www.nature.com/articles/nphys209 Detecting rich-club ordering in complex networks
+PVTJFQHF http://dl.acm.org/citation.cfm?doid=2872518.2889302 BotOrNot: A System to Evaluate Social Bots
+W6N3S4RY http://dl.acm.org/citation.cfm?doid=2872518.2890098 Hoaxy: A Platform for Tracking Online Misinformation
+4GS76GGJ https://dl.acm.org/doi/10.1145/3366424.3385775 Unveiling Coordinated Groups Behind White Helmets Disinformation
+2459AVAB https://dl.acm.org/doi/10.1145/2997657 Mining for Topics to Suggest Knowledge Model Extensions
+NS9ZRS8U http://www.epjdatascience.com/content/5/1/5 Women through the glass ceiling: gender asymmetries in Wikipedia
+4HN3BCVE https://onlinelibrary.wiley.com/doi/10.1609/aimag.v29i3.2155 Intelligent Peer Networks for Collaborative Web Search
+BCVRVD9K https://onlinelibrary.wiley.com/doi/10.1609/aimag.v38i4.2772 Reports of the Workshops Held at the 2017 International AAAI Conference on Web and Social Media
+SGINWM8K https://ieeexplore.ieee.org/document/8248802/ Ultra High-Dimensional Nonlinear Feature Selection for Big Biological Data
+84RDWEND https://www.nature.com/articles/s41467-021-25738-6 Neutral bots probe political bias on social media
+UUF53E78 https://www.nature.com/articles/s41467-021-27855-8 Publisher Correction: Neutral bots probe political bias on social media
+4J7HN9UT https://www.nature.com/articles/srep02522 Virality Prediction and Community Structure in Social Networks
+ED6CMUSH https://link.springer.com/10.1007/s42001-022-00177-5 Botometer 101: social bot practicum for computational social scientists
+MZ2C4VQR https://peerj.com/articles/cs-1025 How Twitter data sampling biases U.S. voter behavior characterizations
+GVTRHMAU https://ojs.aaai.org/index.php/ICWSM/article/view/7370 BotSlayer: DIY Real-Time Influence Campaign Detection
+35K2D2BH https://ojs.aaai.org/index.php/ICWSM/article/view/18122 CoVaxxy: A Collection of English-Language Twitter Posts About COVID-19 Vaccines
+4E62RKGB https://ojs.aaai.org/index.php/ICWSM/article/view/19354 The Manufacture of Partisan Echo Chambers by Follow Train Abuse on Twitter
+SWB6FY9Z https://infodemiology.jmir.org/2023/1/e44207 Measuring the Burden of Infodemics: Summary of the Methods and Results of the Fifth WHO Infodemic Management Conference
+KBCSHYEZ https://dl.acm.org/doi/10.1145/1944339.1944342 Properties and Evolution of Internet Traffic Networks from Anonymized Flow Data
+UJG8G5W8 https://dl.acm.org/doi/10.1145/2037676.2037689 Contextual tag inference
+E5RCJKKH https://dl.acm.org/doi/10.1145/2180861.2180866 Friendship prediction and homophily in social media
+YCRBA6SG https://dx.plos.org/10.1371/journal.pone.0043235 Scholarometer: A Social Framework for Analyzing Impact across Disciplines
+BGIX8CE5 https://dx.plos.org/10.1371/journal.pone.0118410 Topicality and Impact in Social Media: Diverse Messages, Focused Messengers
+93S2KAIX https://dl.acm.org/doi/10.1145/2389661.2389663 The diffusion of political memes in social media: keynote abstract
+FZ5UBX9C https://dl.acm.org/doi/10.1145/2441955.2441962 Truthy: enabling the study of online social networks
+K354RZDT http://dl.acm.org/citation.cfm?doid=2872518.2890092 The Spread of Misinformation in Social Media
+PW9CX6WB https://link.springer.com/10.1007/978-3-319-47874-6_19 On the Influence of Social Bots in Online Protests: Preliminary Findings of a Mexican Case Study
+SNQ77TD6 https://dl.acm.org/doi/10.1145/3308560.3316499 Bot Electioneering Volume: Visualizing Social Bot Activity During Elections
+SFF22XQC https://ieeexplore.ieee.org/document/10068635/ Ukraine as a Political Tool in Facebook Sponsored Content
+QHPDBY8N https://aclanthology.org/2024.findings-naacl.64 REMATCH: Robust and Efficient Matching of Local Knowledge Graphs to Improve Structural and Semantic Similarity
+U9C6FD3D https://www.nature.com/articles/s41467-018-06930-7 The spread of low-credibility content by social bots
+RWATN9WD https://onlinelibrary.wiley.com/doi/10.1002/hbe2.115 Arming the public with artificial intelligence to counter social bots
+U7H4LCZL https://www.nature.com/articles/s41598-022-10070-w Online misinformation is linked to early COVID-19 vaccination hesitancy and refusal
+H257PWKR https://dl.acm.org/doi/10.1145/3340531.3412698 Detection of Novel Social Bots by Ensembles of Specialized Classifiers
+I5Q52XEE https://joss.theoj.org/papers/10.21105/joss.01706 BotSlayer: real-time detection of bot amplification on Twitter
+3JS64SHG https://ojs.aaai.org/index.php/AAAI/article/view/5460 Scalable and Generalizable Social Bot Detection through Data Selection
+VMINUZSD https://journals.sagepub.com/doi/10.1177/1461444820942744 Asymmetrical perceptions of partisan political bots
+BKLISHDE https://www.jmir.org/2023/1/e42227 One Year of COVID-19 Vaccine Misinformation on Twitter: Longitudinal Study
+4EH4XNV8 https://www.nature.com/articles/s41598-023-46630-x Exposure to social bots amplifies perceptual biases and regulation propensity
+ZC4MUTBH https://pnas.org/doi/10.1073/pnas.2322823121 Fact-checking information from large language models can decrease headline discernment
+JM89NE6K https://ojs.aaai.org/index.php/ICWSM/article/view/22205 A Multi-Platform Collection of Social Media Posts about the 2022 U.S. Midterm Elections
+X2RPAA67 https://dx.plos.org/10.1371/journal.pone.0302201 Identifying and characterizing superspreaders of low-credibility content on Twitter
+4ILEI93C https://link.springer.com/10.1007/978-3-031-78541-2_26 The Dawn of Decentralized Social Media: An Exploration of Bluesky’s Public Opening
+6962V9HC https://ojs.aaai.org/index.php/ICWSM/article/view/18075 Uncovering Coordinated Networks on Social Media: Methods and Case Studies
+QI65PCEE https://academic.oup.com/pnasnexus/article/doi/10.1093/pnasnexus/pgae258/7701371 Quantifying the vulnerabilities of the online public square to adversarial manipulation tactics
+YKWPSKFN https://epjdatascience.springeropen.com/articles/10.1140/epjds/s13688-024-00450-9 Account credibility inference based on news-sharing networks
+MN9NE57I https://journals.sagepub.com/doi/10.1177/20539517211013861 The COVID-19 Infodemic: Twitter versus Facebook
+VDQHFNHW https://ojs.aaai.org/index.php/ICWSM/article/view/19355 Manipulating Twitter through Deletions
+G7J4E2ZC https://dx.plos.org/10.1371/journal.pone.0196087 Anatomy of an online misinformation network
+J5EJT2NX https://appliednetsci.springeropen.com/articles/10.1007/s41109-021-00357-8 On the challenges of predicting microscopic dynamics of online conversations
+YMK75TBE https://ojs.aaai.org/index.php/ICWSM/article/view/14986 The Hoaxy Misinformation and Fact-Checking Diffusion Network
+ULRS8GXS https://linkinghub.elsevier.com/retrieve/pii/S2589004225003645 From initial formation to developmental refinement: GABAergic inputs shape neuronal subnetworks in the primary somatosensory cortex
+5EXYLNRM https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020JB020833 New Insights Into the Slip Budget at Nankai: An Iterative Approach to Estimate Coseismic Slip and Afterslip
+J3FLY8M7 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JB029346 Locating Boundaries Between Locked and Creeping Regions at Nankai and Cascadia Subduction Zones
+MDUH4NAF https://aacrjournals.org/cancerres/article/76/17/4970/613885/Activation-of-the-c-Met-Pathway-Mobilizes-an Activation of the c-Met Pathway Mobilizes an Inflammatory Network in the Brain Microenvironment to Promote Brain Metastasis of Breast Cancer
+9D4NP5C5 https://febs.onlinelibrary.wiley.com/doi/10.1111/febs.16375 AKT1 mediates multiple phosphorylation events that functionally promote HSF1 activation
+AW4XKFWZ https://www.embopress.org/doi/10.1038/embor.2012.162 Reactive oxygen species regulate ERBB2 and ERBB3 expression via miR‐199a/125b and DNA methylation
+4822GD75 https://www.nature.com/articles/onc2013582 Akt phosphorylates and activates HSF-1 independent of heat shock, leading to Slug overexpression and epithelial–mesenchymal transition (EMT) of HER2-overexpressing breast cancer cells
+B59MPAXA https://www.cambridge.org/core/product/identifier/S2059866123003497/type/journal_article 294 Identification of MCAK Inhibitors that Induce Aneuploidy in Triple Negative Breast Cancer Models
+UK84AGIE https://journals.iupui.edu/index.php/IMPRS/article/view/27850 Inhibition of HSF1 as a Mechanism for Overcoming Hsp90 Treatment Resistance
+4376ISP3 https://aacrjournals.org/cancerres/article/84/5_Supplement_2/B031/734568/Abstract-B031-The-PLK1-inhibitor-Volasertib-as-a Abstract B031: The PLK1 inhibitor Volasertib as a treatment for HSF1 and MYC coamplified ovarian cancer
+REAMAWZ6 https://aacrjournals.org/cancerres/article/79/13_Supplement/2602/634546/Abstract-2602-AKT1-mediated-activation-of-HSF1-by Abstract 2602: AKT1-mediated activation of HSF1 by phosphorylation and an association with metastasis-free survival
+YVM4A2RD http://www.ssrn.com/abstract=2863094 Firm Scope and the Value of One-Stop Shopping in Washington State's Deregulated Liquor Market
+WCVWGXSF https://www.journals.uchicago.edu/doi/10.17310/ntj.2020.2.07 TAXING THE POTENCY OF SIN GOODS: EVIDENCE FROM RECREATIONAL CANNABIS AND LIQUOR MARKETS
+HNQCP5BV https://ieeexplore.ieee.org/document/10190998/ Representing Latent Dimensions Using Compressed Number Lines
+99TQ7BIB https://ieeexplore.ieee.org/document/10191578/ Characterizing neural activity in cognitively inspired RL agents during an evidence accumulation task
+7JFZ8GNS https://pubs.acs.org/doi/10.1021/acsami.4c11537 Controlled Vapor–Liquid–Solid Growth of Long and Remarkably Thin Pb 1– x Snx Te Nanowires with Strain-Tunable Ferroelectric Phase Transition
+Y4CEKQAP https://pubs.acs.org/doi/10.1021/acsanm.4c01612 Anisotropic Straintronic Transport in Topological Semimetal Nanoflakes
+L9EP2M7A https://ieeexplore.ieee.org/document/10142120/ Building and Testing a Network of Social Trust in an Underground Forum: Robust Connections and Overlapping Criminal Domains
+9G7B96KL https://ieeexplore.ieee.org/document/10190691/ An Argument for Linguistic Expertise in Cyberthreat Analysis: LOLSec in Russian Language eCrime Landscape
+R48ED6JB https://aclanthology.org/2024.c3nlp-1.9 Computational Language Documentation: Designing a Modular Annotation and Data Management Tool for Cross-cultural Applicability
+DHN7HH6N https://linkinghub.elsevier.com/retrieve/pii/S2211124719304346 Disruption in A-to-I Editing Levels Affects C. elegans Development More Than a Complete Lack of Editing
+LGUZ7QCQ https://www.tandfonline.com/doi/full/10.1080/10409238.2020.1856768 To protect and modify double-stranded RNA – the critical roles of ADARs in development, immunity and oncogenesis
+FVP8J8QY http://genome.cshlp.org/lookup/doi/10.1101/gr.267575.120 Profiling neural editomes reveals a molecular mechanism to regulate RNA editing during development
+WUX7NDQV https://faseb.onlinelibrary.wiley.com/doi/10.1096/fasebj.2018.32.1_supplement.650.11 Dimerization of ADARs Expands The Range of Substrates That Can Undergo A‐to‐I RNA Editing
+E6QU9NNR https://www.nature.com/articles/nbt.2452 The difficult calls in RNA editing
+2DA5YSFJ https://academic.oup.com/genetics/article/doi/10.1093/genetics/iyac099/6619166 The RNA-binding protein Swm is critical for Drosophila melanogaster intestinal progenitor cell maintenance
+DEVD3RV5 https://www.nature.com/articles/s41598-022-17559-4 ADAR3 activates NF-κB signaling and promotes glioblastoma cell resistance to temozolomide
+5KU4GXWG https://linkinghub.elsevier.com/retrieve/pii/S2211124722013456 MicroRNA mediated regulation of the onset of enteroblast differentiation in the Drosophila adult intestine
+AKIZ547W https://bmcbiol.biomedcentral.com/articles/10.1186/s12915-024-01840-1 ADARs regulate cuticle collagen expression and promote survival to pathogen infection
+WSTKXK53 https://link.aps.org/doi/10.1103/PhysRevD.81.013005 Measurement of ν μ and ν ¯ μ induced neutral current single π 0 production cross sections on mineral oil at E ν ∼ O (1 GeV)
+H954JPE2 https://link.aps.org/doi/10.1103/PhysRevD.81.092005 First measurement of the muon neutrino charged current quasielastic double differential cross section
+3MTPWPQD https://link.aps.org/doi/10.1103/PhysRevD.82.092005 Measurement of the neutrino neutral-current elastic differential cross section on mineral oil at E ν ∼ 1 GeV
+MTAUR86Y https://link.aps.org/doi/10.1103/PhysRevLett.102.101802 Unexplained Excess of Electronlike Events from a 1-GeV Neutrino Beam
+YNHXWSZK https://link.aps.org/doi/10.1103/PhysRevLett.103.061802 Search for Muon Neutrino and Antineutrino Disappearance in MiniBooNE
+64TMYYNG https://linkinghub.elsevier.com/retrieve/pii/S0370269312012592 Test of Lorentz and CPT violation with short baseline neutrino oscillation excesses
+N949J392 https://link.aps.org/doi/10.1103/PhysRevD.72.076004 Tests of Lorentz violation in ν ¯ μ → ν ¯ e oscillations
+VGM4RU9M https://link.aps.org/doi/10.1103/PhysRevD.81.033004 Measurement of inclusive neutral current π 0 production on carbon in a few-GeV neutrino beam
+HPHIPYRM https://link.aps.org/doi/10.1103/PhysRevD.84.072005 Measurement of the neutrino component of an antineutrino beam observed by a nonmagnetized detector
+8DNUUUI3 https://link.aps.org/doi/10.1103/PhysRevD.86.052009 Dual baseline search for muon antineutrino disappearance at 0.1 eV 2 < Δ m 2 < 100 eV 2
+LNY8WKB7 https://link.aps.org/doi/10.1103/PhysRevD.88.032001 First measurement of the muon antineutrino double-differential charged-current quasielastic cross section
+DIMJTVYK https://link.aps.org/doi/10.1103/PhysRevD.89.072004 A method for measuring coherent elastic neutrino-nucleus scattering at a far off-axis high-energy neutrino beam target
+TJZKXPAL https://link.aps.org/doi/10.1103/PhysRevD.91.012004 Measurement of the antineutrino neutral-current elastic differential cross section
+3A4WIGFN https://link.aps.org/doi/10.1103/PhysRevLett.103.111801 Search for Electron Antineutrino Appearance at the Δ m 2 ∼ 1 eV 2 Scale
+LP2DH8WX https://link.aps.org/doi/10.1103/PhysRevLett.110.161801 Improved Search for ν ¯ μ → ν ¯ e Oscillations in the MiniBooNE Experiment
+WQYXC9F8 https://linkinghub.elsevier.com/retrieve/pii/S0920563211007080 Neutrino cross section measurements with MiniBooNE
+BFI7NIJ8 https://linkinghub.elsevier.com/retrieve/pii/S0920563211007481 Global three-parameter model for neutrino oscillations using Lorentz violation
+ITGYR9SA https://pubs.aip.org/aip/acp/article/842/1/748-755/988264 Neutrinos, Oscillations and New Physics: An Introduction
+KZDZALVH https://pubs.aip.org/aip/acp/article/967/1/39-44/776276 Measuring Neutrino Interactions with MiniBooNE
+MNLV5RP2 https://pubs.aip.org/aip/acp/article/1189/1/175-180/799718 Measurement of Neutrino-Nucleon Neutral Current Elastic Scattering in MiniBooNE
+YPCRPN3X https://pubs.aip.org/aip/acp/article/1189/1/291-296/799821 The Path Forward: Neutrino Quasi-Elastic Scattering Discussion
+7RKPNTQA https://pubs.aip.org/aip/acp/article/1222/1/191-195/666707 Quasielastic Neutrino Scattering at E[sub ν]≈1 GeV: Recent Measurements and Interpretations
+VQKBA7QE http://ieeexplore.ieee.org/document/1462277/ Study of scintillation, fluorescence and scattering in mineral oil for the miniboone neutrino detector
+EUY6KHHE http://www.worldscientific.com/doi/abs/10.1142/9789812779519_0012 NEUTRINO OSCILLATIONS AND LORENTZ VIOLATION WITH MINIBOONE
+LFWLKN5W http://www.worldscientific.com/doi/abs/10.1142/9789812779519_0048 TEST FOR LORENTZ VIOLATION IN THE MINIBOONE NEUTRINO OSCILLATION EXPERIMENT
+A6I2JZWR http://www.worldscientific.com/doi/abs/10.1142/9789814327688_0047 RECENT RESULTS FROM $\bar \nu _\mu \, \to \,\bar \nu _e$ WITH MINIBOONE
+MRB2GQMI https://linkinghub.elsevier.com/retrieve/pii/S0168900208015404 The MiniBooNE detector
+FCQG945G https://aacrjournals.org/cancerres/article/81/14/3791/670249/LSD1-and-Aberrant-DNA-Methylation-Mediate LSD1 and Aberrant DNA Methylation Mediate Persistence of Enteroendocrine Progenitors That Support BRAF -Mutant Colorectal Cancer
+L3UA8SN3 https://aacrjournals.org/cancerres/article/85/1/52/750634/LSD1-and-CoREST2-Potentiate-STAT3-Activity-to LSD1 and CoREST2 Potentiate STAT3 Activity to Promote Enteroendocrine Cell Differentiation in Mucinous Colorectal Cancer
+IJNYHCJE https://linkinghub.elsevier.com/retrieve/pii/S2212267222005184 Adding Walnuts to The Regular Diet Improved the Diet Quality Among U.S. Adults: Results of An NHANES Modeling Study
+22KCX6VA https://linkinghub.elsevier.com/retrieve/pii/S0167923613001851 Capital markets valuation and accounting performance of Most Admired Knowledge Enterprise (MAKE) award winners
+6QRY9XKT https://ieeexplore.ieee.org/document/10701477/ Bias-Corrected Joint Spectral Embedding for Multilayer Networks With Invariant Subspace: Entrywise Eigenvector Perturbation and Inference
+NN3Z2ZNH https://www.ssrn.com/abstract=3375922 The Impact of Trade Credit Provision on Retail Inventory: An Empirical Investigation Using Synthetic Controls
+MU8RXHVZ https://pubsonline.informs.org/doi/10.1287/mnsc.2022.4600 The Impact of Trade Credit Provision on Retail Inventory: An Empirical Investigation Using Synthetic Controls
+NIQSYU66 https://linkinghub.elsevier.com/retrieve/pii/S0166445X18305885 Profiling microRNA expression in Atlantic killifish (Fundulus heteroclitus) gill and responses to arsenic and hyperosmotic stress
+YWQ666YM https://linkinghub.elsevier.com/retrieve/pii/S0048969712007899 Adaptive iterative design (AID): A novel approach for evaluating the interactive effects of multiple stressors on aquatic organisms
+F82D7XN8 https://ehp.niehs.nih.gov/doi/10.1289/EHP8932 Genome-Wide Analysis of Cadmium-Induced, Germline Mutations in a Long-Term Daphnia pulex Mutation-Accumulation Experiment
+8I46EME8 https://onlinelibrary.wiley.com/doi/10.1111/mec.13148 Conserved transcriptional responses to cyanobacterial stressors are mediated by alternate regulation of paralogous genes in Daphnia
+Z2GFSIGB http://genome.cshlp.org/lookup/doi/10.1101/gr.191338.115 High mutational rates of large-scale duplication and deletion in Daphnia pulex
+UMRGE7D2 https://linkinghub.elsevier.com/retrieve/pii/S0306456516301772 Thermal variation and factors influencing vertical migration behavior in Daphnia populations
+KYIXLX8X http://academic.oup.com/gbe/article/9/3/659/2992614 The Landscape of Extreme Genomic Variation in the Highly Adaptable Atlantic Killifish
+GIQ74HMB https://pubs.acs.org/doi/10.1021/acs.est.8b06720 Genome-Wide Stress Responses to Copper and Arsenic in a Field Population of Daphnia
+K4696QCN https://pubs.acs.org/doi/10.1021/acs.est.9b05006 Dynamics of Cadmium Acclimation in Daphnia pulex : Linking Fitness Costs, Cross-Tolerance, and Hyper-Induction of Metallothionein
+BT873DV2 https://academic.oup.com/mbe/article-lookup/doi/10.1093/molbev/msu241 Natural Selection Canalizes Expression Variation of Environmentally Induced Plasticity-Enabling Genes
+LRUSGG24 https://academic.oup.com/mbe/article-lookup/doi/10.1093/molbev/msv190 Hybridization and the Origin of Contagious Asexuality in Daphnia pulex
+FZS2TRC9 http://bmcgenomics.biomedcentral.com/articles/10.1186/1471-2164-8-477 Gene response profiles for Daphnia pulex exposed to the environmental stressor cadmium reveals novel crustacean metallothioneins
+YQ6RKXDD https://linkinghub.elsevier.com/retrieve/pii/S1532045615000216 A novel variant of aquaporin 3 is expressed in killifish (Fundulus heteroclitus) intestine
+6LK9ZYT6 https://link.aps.org/doi/10.1103/PhysRevD.100.115020 First constraint on coherent elastic neutrino-nucleus scattering in argon
+CY2FL47H https://link.aps.org/doi/10.1103/PhysRevLett.126.012002 First Measurement of Coherent Elastic Neutrino-Nucleus Scattering on Argon
+46P3MTJD https://iopscience.iop.org/article/10.1088/1748-0221/16/04/P04002 Development of a83 mKr source for the calibration of the CENNS-10 liquid argon detector
+754ZYWCV https://iopscience.iop.org/article/10.1088/1748-0221/16/08/P08048 A D2 O detector for flux normalization of a pion decay-at-rest neutrino source
+PGKCMC27 https://iopscience.iop.org/article/10.1088/1748-0221/17/03/P03021 Monitoring the SNS basement neutron background with the MARS detector
+C8GNXCHN https://link.aps.org/doi/10.1103/PhysRevD.106.032003 Simulating the neutrino flux from the Spallation Neutron Source for the COHERENT experiment
+NFTG44KA https://link.aps.org/doi/10.1103/PhysRevLett.129.081801 Measurement of the Coherent Elastic Neutrino-Nucleus Scattering Cross Section on CsI by COHERENT
+MMZE8ZR5 https://iopscience.iop.org/article/10.1088/1742-6596/798/1/012213 COHERENT Experiment: current status
+2TGHSZBH https://link.aps.org/doi/10.1103/PhysRevD.102.052007 Sensitivity of the COHERENT experiment to accelerator-produced dark matter
+RJILWKTM https://www.science.org/doi/10.1126/science.aao0990 Observation of coherent elastic neutrino-nucleus scattering
+JLL4JEJL https://link.aps.org/doi/10.1103/PhysRevLett.130.051803 First Probe of Sub-GeV Dark Matter beyond the Cosmological Expectation with the COHERENT CsI Detector at the SNS
+TD6W7DR8 https://link.aps.org/doi/10.1103/PhysRevD.108.072001 Measurement of Pb n a t ( ν e , X n ) production with a stopped-pion neutrino source
+63B6AUFA https://link.aps.org/doi/10.1103/PhysRevLett.131.221801 Measurement of Electron-Neutrino Charged-Current Cross Sections on I 127 with the COHERENT NaI ν E Detector
+UZWUX4YD https://link.aps.org/doi/10.1103/PhysRevD.109.092005 Accessing new physics with an undoped, cryogenic CsI CEvNS detector for COHERENT at the SNS
+EYQP7NXU https://link.springer.com/10.1007/978-3-031-63646-2_26 On Implementing Case-Based Reasoning with Large Language Models
+JZM4Y9KC https://onlinelibrary.wiley.com/doi/10.1111/1475-679X.12590 Silent Suffering: Using Machine Learning to Measure CEO Depression
+3S5FFLEQ https://www.nature.com/articles/s41562-024-01910-y Improving academic mentorship practices
+2EM56CXT https://linkinghub.elsevier.com/retrieve/pii/S0022519306005649 Nonlinear simulation of the effect of microenvironment on tumor growth
+4B937CDP https://pubs.acs.org/doi/10.1021/acs.jctc.1c00245 Reaction Path-Force Matching in Collective Variables: Determining Ab Initio QM/MM Free Energy Profiles by Fitting Mean Force
+CY4626ZJ https://pubs.acs.org/doi/10.1021/acs.jctc.1c00565 Machine-Learning-Assisted Free Energy Simulation of Solution-Phase and Enzyme Reactions
+GGTLEAGW https://pubs.acs.org/doi/10.1021/acs.jctc.1c00567 Doubly Polarized QM/MM with Machine Learning Chaperone Polarizability
+RQG3C66A https://pubs.acs.org/doi/10.1021/acs.jpcb.2c02262 Accelerating Ab Initio Quantum Mechanical and Molecular Mechanical (QM/MM) Molecular Dynamics Simulations with Multiple Time Step Integration and a Recalibrated Semiempirical QM/MM Hamiltonian
+TLBEJTNG https://xlink.rsc.org/?DOI=D2CP02820D Facilitating ab initio QM/MM free energy simulations by Gaussian process regression with derivative observations
+ZQW7PLAY https://xlink.rsc.org/?DOI=D2RA08180F Machine learning based implicit solvent model for aqueous-solution alanine dipeptide molecular dynamics simulations
+KEJ4HNEX https://pubs.aip.org/jcp/article/159/5/054107/2905186/Bridging-semiempirical-and-ab-initio-QM-MM Bridging semiempirical and ab initio QM/MM potentials by Gaussian process regression and its sparse variants for free energy simulation
+HPIW2ET9 https://pubs.acs.org/doi/10.1021/acsnano.3c06047 Hybrid Metal–Ligand Interfacial Dipole Engineering of Functional Plasmonic Nanostructures for Extraordinary Responses of Optoelectronic Properties
+BDDKS3GX https://academic.oup.com/nar/article/52/D1/D1400/7327073 PancanQTLv2.0: a comprehensive resource for expression quantitative trait loci across human cancers
+UVADH5IP https://pubs.acs.org/doi/10.1021/acs.jctc.3c00973 Free Energy Profile Decomposition Analysis for QM/MM Simulations of Enzymatic Reactions
+I7VEDV8N https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023JD039434 Stratospheric Aerosol Injection Can Reduce Risks to Antarctic Ice Loss Depending on Injection Location and Amount
+Y5N7X37K https://iopscience.iop.org/article/10.1088/2515-7620/acf441 Transboundary effects from idealized regional geoengineering
+GSARUURJ https://onlinelibrary.wiley.com/doi/10.1002/jcc.27269 Training machine learning potentials for reactive systems: A Colab tutorial on basic models
+86JFNQ8I https://linkinghub.elsevier.com/retrieve/pii/S0010465523002783 Polyrate 2023: A computer program for the calculation of chemical reaction rates for polyatomics. New version announcement
+NG6WYJ73 https://linkinghub.elsevier.com/retrieve/pii/S0301462223000431 Revealing intrinsic changes of DNA induced by spore photoproduct lesion through computer simulation
+HK37DCT6 https://linkinghub.elsevier.com/retrieve/pii/S1452398123001049 Photoactivities of thiophene monomer/polymer transition in gel–based photoelectrochemical assembly: A theoretical/experimental approach
+FXGSNSU4 https://pubs.acs.org/doi/10.1021/acscatal.2c02993 Photoinduced Site-Selective Functionalization of Aliphatic C–H Bonds by Pyridine N -oxide Based HAT Catalysts
+IZJHZIX7 https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.13319 A simulative deep learning model of SNP interactions on chromosome 19 for predicting Alzheimer's disease risk and rates of disease progression
+JYUSL6SW https://onlinelibrary.wiley.com/doi/10.1002/ece3.8429 Low base‐substitution mutation rate and predominance of insertion‐deletion events in the acidophilic bacterium Acidobacterium capsulatum
+IH43BBJF https://academic.oup.com/g3journal/article/doi/10.1093/g3journal/jkac303/6905443 Similar mutation rates but different mutation spectra in moderate and extremely halophilic archaea
+DP9Z3NWV https://ieeexplore.ieee.org/document/9375950/ CondenseNeXt: An Ultra-Efficient Deep Neural Network for Embedded Systems
+MNUWS2WV https://www.mdpi.com/1999-5903/14/12/355 NextDet: Efficient Sparse-to-Dense Object Detection with Attentive Feature Aggregation
+WMEJCDPW https://ieeexplore.ieee.org/document/9422541/ Image Classification with CondenseNeXt for ARM-Based Computing Platforms
+R9RWPY6T https://www.mdpi.com/2079-9268/13/3/49 An Improved Lightweight Network Using Attentive Feature Aggregation for Object Detection in Autonomous Driving
+IN26KTMW https://www.mdpi.com/2079-9268/12/1/8 CondenseNeXtV2: Light-Weight Modern Image Classifier Utilizing Self-Querying Augmentation Policies
+8RCUN6C7 http://www.sciencepublishinggroup.com/journal/paperinfo?journalid=523&doi=10.11648/j.ajece.20210502.15 EffCNet: An Efficient CondenseNet for Image Classification on NXP BlueBox
+VSPFYJB4 https://link.springer.com/10.1007/s00775-024-02046-0 Probing calmodulin–NO synthase interactions via site-specific infrared spectroscopy: an introductory investigation
+5WRM3AIW https://linkinghub.elsevier.com/retrieve/pii/S1384107624000241 Photometric study of the overcontact binary NSVS2910034
+HVHFG4AB https://linkinghub.elsevier.com/retrieve/pii/S1384107623000209 Photometric study of the overcontact binary V826 Aur
+44QGKKRU https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/chem.202304006 Towards Amplified Probing of Weak Intermolecular Interactions on the External Surfaces of Molecular Capsules
+3INJHFWM https://pubs.acs.org/doi/10.1021/acs.jpca.3c08476 Mechanism of the Sharpless Epoxidation Reaction: A DFT Study
+R45KX4ZW https://pubs.acs.org/doi/10.1021/acsanm.3c01721 Discrete Cu-Metalloporous Polycarbazole as a Nanoelectromediator for Effective Electrocarboxylation of Benzyl Bromide with CO2
+3JPL6XZA https://onlinelibrary.wiley.com/doi/10.1002/vjch.202200210 HO● ‐ initiated oxidation of isoleucine amino acid in the aqueous phase
+V39KIVM9 https://pubs.acs.org/doi/10.1021/acs.jpca.3c02322 Mg-Containing Zn3 O3 Structures for Detection of CO2 : A DFT Study on CHEM Effects of SERS and Electronic Properties
+6HPZHHWB https://royalsocietypublishing.org/doi/10.1098/rsos.230114 Revisiting the HO● -initiated oxidation of L-proline amino acid in the aqueous phase: influence of transition metal ions
+X925CU5T https://pubs.acs.org/doi/10.1021/acs.jpca.2c06549 Vector Correlations in the 225 nm Photodissociation of Co(CO)3 NO
+6HFD4T9P https://linkinghub.elsevier.com/retrieve/pii/S2213343723006802 Theoretical insights into the oxidation of quinmerac herbicide initiated by HO• radical in aqueous media: Mechanism, kinetics, and ecotoxicity
+BTFRKQRH https://linkinghub.elsevier.com/retrieve/pii/S0045653522037274 Hydroxyl radical-initiated decomposition of metazachlor herbicide in the gaseous and aqueous phases: Mechanism, kinetics, and toxicity evaluation
+GMRWUY2Y https://xlink.rsc.org/?DOI=D3EM00325F New insight into environmental oxidation of phosmet insecticide initiated by HO˙ radicals in gas and water – a theoretical study
+SCHYCGIQ https://linkinghub.elsevier.com/retrieve/pii/S0167732222024655 Experimental and theoretical calculation of pKa values of substituted-2,4,6-trinitrodiphenylamines
+NPDLPFE3 https://link.springer.com/10.1007/s40997-023-00676-4 Toward Directional Motion on Graphene by Uniaxial Strain
+RUAST49P https://xlink.rsc.org/?DOI=D2RA07044H Computational study of the interaction of the psychoactive amphetamine with 1,2-indanedione and 1,8-diazafluoren-9-one as fingerprinting reagents
+8IF27M3P https://www.degruyter.com/document/doi/10.1515/pac-2022-1104/html Electrophilic substitution reactions of thiophene and thieno[2,3- b ]thiophene heterocycles: a DFT study
+GD5CNV3G https://xlink.rsc.org/?DOI=D2CP05814F A study of the thermodynamics and mechanisms of the atmospherically relevant reaction dimethyl sulphide (DMS) with atomic chlorine (Cl) in the absence and presence of water, using electronic structure methods
+NYX66EEZ https://linkinghub.elsevier.com/retrieve/pii/S001945222200485X Synthesis, structural, spectral, computational, docking and biological activities of Schiff base (E)-4-bromo-2-hydroxybenzylidene) amino)-N-(pyrimidin-2-yl) benzenesulfonamide from 5-bromosalicylaldehyde and sulfadiazine
+S6ZETR7Y https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202302135 Theoretical Study of the Photophysical and Photochemical Properties of 1H‐Benzimidazole and 2‐Ethyl‐7‐nitro‐5‐Substituted 1H‐Benzimidazoles
+SGNFSCHC https://linkinghub.elsevier.com/retrieve/pii/S0019452222004976 Synthesis, computational, molecular docking studies and photophysical properties of (Z)-N-(pyrimidin-2-yl)-4-(thiophen-2-ylmethylene)amino) benzenesulfonamide
+YZLWG6B2 https://linkinghub.elsevier.com/retrieve/pii/S001945222300033X (E)-4-((4-chlorobenzylidene)amino)-N-(thiazole-2yl) benzenesulfonamide: Synthesis, characterization and electronic structure theory and docking studies
+WUWR4L9E https://linkinghub.elsevier.com/retrieve/pii/S0019452222004988 Synthesis, Computational, Electronic spectra, and molecular docking studies of 4-((diphenylmethylene)amino)-N-(pyrimidin-2-yl)benzenesulfonamide
+PWSEYLLN https://linkinghub.elsevier.com/retrieve/pii/S0167732222025946 Schiff bases from chlorine substituted anilines and salicylaldehyde: Synthesis, characterization, fluorescence, thermal features, biological studies and electronic structure investigations
+UMHPQSU4 https://pnas.org/doi/full/10.1073/pnas.2115899118 Structure and RNA template requirements of Arabidopsis RNA-DEPENDENT RNA POLYMERASE 2
+Q7IDWTVC https://www.nature.com/articles/s41564-023-01579-5 Double-stranded RNA sequencing reveals distinct riboviruses associated with thermoacidophilic bacteria from hot springs in Japan
+36XUHUBJ https://link.springer.com/10.1007/s40264-023-01373-6 SGLT2 Inhibitor Use and Risk of Breast Cancer Among Adult Women with Type 2 Diabetes
+UIUH6HDM https://www.nature.com/articles/s41467-023-44208-9 Fast free energy estimates from λ-dynamics with bias-updated Gibbs sampling
+X6ACFCGB https://linkinghub.elsevier.com/retrieve/pii/S0021925823002934 Identification of nonhistone substrates of the lysine methyltransferase PRDM9
+DVDRZUSH https://onlinelibrary.wiley.com/doi/10.1002/anie.202114813 Exploring Unconventional SAM Analogues To Build Cell‐Potent Bisubstrate Inhibitors for Nicotinamide N ‐Methyltransferase
+ZKHNFLI8 https://linkinghub.elsevier.com/retrieve/pii/S1387380621000294 Gas-phase ion/ion chemistry for structurally sensitive probes of gaseous protein ion structure: Electrostatic and electrostatic to covalent cross-linking
+WX7K7EWI https://www.mdpi.com/1420-3049/27/4/1381 Improved Cell-Potent and Selective Peptidomimetic Inhibitors of Protein N-Terminal Methyltransferase 1
+SJRXZFV6 https://linkinghub.elsevier.com/retrieve/pii/S0021925817504457 Mutant thermal proteome profiling for characterization of missense protein variants and their associated phenotypes within the proteome
+EFYBWXLL http://medrxiv.org/lookup/doi/10.1101/2023.04.18.23288742 Gut community structure as a risk factor for infection in Klebsiella -colonized patients
+W2CC5ENB https://academic.oup.com/nar/article/52/D1/D426/7337615 DescribePROT in 2023: more, higher-quality and experimental annotations and improved data download options
+UKIY92CG https://journals.asm.org/doi/10.1128/mbio.03125-22 Haemophilus ducreyi Infection Induces Oxidative Stress, Central Metabolic Changes, and a Mixed Pro- and Anti-inflammatory Environment in the Human Host
+QW74CRRC https://academic.oup.com/jid/article/227/3/317/6649666 Dispensability of Ascorbic Acid Uptake and Utilization Encoded by ulaABCD for the Virulence of Haemophilus ducreyi in Humans
+2NRZPZE3 https://journals.asm.org/doi/10.1128/iai.00176-23 Formate production is dispensable for Haemophilus ducreyi virulence in human volunteers
+LPIPWTHB https://journals.asm.org/doi/10.1128/jb.00005-22 Genes Differentially Expressed by Haemophilus ducreyi during Anaerobic Growth Significantly Overlap Those Differentially Expressed during Experimental Infection of Human Volunteers
+F2WMHT4C https://journals.asm.org/doi/10.1128/iai.00058-24 A Haemophilus ducreyi strain lacking the yfeABCD iron transport system is virulent in human volunteers
+RU6TTIG3 https://www.nature.com/articles/s41467-024-45159-5 The role of interdecadal climate oscillations in driving Arctic atmospheric river trends
+ZVNI3BWF https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL104417 Quantifying the Efficiency of Stratospheric Aerosol Geoengineering at Different Altitudes
+5EHIL72X https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL107702 The Potential of Stratospheric Aerosol Injection to Reduce the Climatic Risks of Explosive Volcanic Eruptions
+GYY6FBQH https://esd.copernicus.org/articles/13/201/2022/ How large is the design space for stratospheric aerosol geoengineering?
+CEJECQ92 https://acp.copernicus.org/articles/23/13665/2023/ Injection strategy – a driver of atmospheric circulation and ozone response to stratospheric aerosol geoengineering
+5TT4JJEQ https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020GL088337 Seasonally Modulated Stratospheric Aerosol Geoengineering Alters the Climate Outcomes
+DCFSHTKP https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020JD033952 Is Turning Down the Sun a Good Proxy for Stratospheric Sulfate Geoengineering?
+CM9HBV3S https://acp.copernicus.org/articles/23/687/2023/ Climate response to off-equatorial stratospheric sulfur injections in three Earth system models – Part 2: Stratospheric and free-tropospheric response
+ZMUCJA82 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL094058 Sensitivity of Total Column Ozone to Stratospheric Sulfur Injection Strategies
+XXAHPSLS https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL092696 High‐Latitude Stratospheric Aerosol Geoengineering Can Be More Effective if Injection Is Limited to Spring
+8E3ANJ4D https://gmd.copernicus.org/articles/17/2583/2024/ G6-1.5K-SAI: a new Geoengineering Model Intercomparison Project (GeoMIP) experiment integrating recent advances in solar radiation modification studies
+I6YZ5WSK https://rmets.onlinelibrary.wiley.com/doi/10.1002/joc.7391 Impact of solar geoengineering on temperatures over the Indonesian Maritime Continent
+B7FE8EFG https://esd.copernicus.org/articles/11/1051/2020/ Expanding the design space of stratospheric aerosol geoengineering to include precipitation-based objectives and explore trade-offs
+HTP9AVV6 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020GL089470 Reduced Poleward Transport Due to Stratospheric Heating Under Stratospheric Aerosols Geoengineering
+73NB2N55 https://www.nature.com/articles/s41598-021-89249-6 Response of the Indian summer monsoon to global warming, solar geoengineering and its termination
+6MBMJ88Z http://www.emerald.com/ijccsm/article/14/4/399-423/123536 Influence of stratospheric aerosol geoengineering on temperature mean and precipitation extremes indices in Africa
+NYBI3BLQ https://acp.copernicus.org/articles/21/1287/2021/ North Atlantic Oscillation response in GeoMIP experiments G6solar and G6sulfur: why detailed modelling is needed for understanding regional implications of solar radiation management
+R5JFMZVK https://acp.copernicus.org/articles/21/8845/2021/ Harnessing stratospheric diffusion barriers for enhanced climate geoengineering
+4KTLCYP7 https://linkinghub.elsevier.com/retrieve/pii/S0048969722079098 Implication of stratospheric aerosol geoengineering on compound precipitation and temperature extremes in Africa
+T4XSVC3V https://www.nature.com/articles/s41612-022-00254-6 Changes in Hadley circulation and intertropical convergence zone under strategic stratospheric aerosol geoengineering
+LNFZ39ZX https://acp.copernicus.org/articles/23/663/2023/ Climate response to off-equatorial stratospheric sulfur injections in three Earth system models – Part 1: Experimental protocols and surface changes
+GCRLPSS7 https://iopscience.iop.org/article/10.1088/1748-9326/abacf7 Assessing terrestrial biogeochemical feedbacks in a strategically geoengineered climate
+R6E694BW https://esd.copernicus.org/articles/13/1233/2022/ Indices of extremes: geographic patterns of change in extremes and associated vegetation impacts under climate intervention
+LS97JMKY https://acp.copernicus.org/articles/22/2999/2022/ The impact of stratospheric aerosol intervention on the North Atlantic and Quasi-Biennial Oscillations in the Geoengineering Model Intercomparison Project (GeoMIP) G6sulfur experiment
+6NEF7ERL https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022EF003052 High‐Latitude Stratospheric Aerosol Injection to Preserve the Arctic
+JR75RFIU https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL104726 Potential Non‐Linearities in the High Latitude Circulation and Ozone Response to Stratospheric Aerosol Injection
+42Y3IR2A https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022GL098773 The Overlooked Role of the Stratosphere Under a Solar Constant Reduction
+TNGQYQ7F https://acp.copernicus.org/articles/23/5149/2023/ Opinion: The scientific and community-building roles of the Geoengineering Model Intercomparison Project (GeoMIP) – past, present, and future
+T9IMIK7W https://acp.copernicus.org/articles/21/4231/2021/ Comparing different generations of idealized solar geoengineering simulations in the Geoengineering Model Intercomparison Project (GeoMIP)
+4UHHSK3D https://acp.copernicus.org/articles/22/1739/2022/ Limitations of assuming internal mixing between different aerosol species: a case study with sulfate geoengineering simulations
+FWYZPVTK https://acp.copernicus.org/articles/22/5757/2022/ An approach to sulfate geoengineering with surface emissions of carbonyl sulfide
+FMLM9ISP https://iopscience.iop.org/article/10.3847/2041-8213/ad0fea TOI-1670 c, a 40 day Orbital Period Warm Jupiter in a Compact System, Is Well Aligned
+MMN8Z9ZJ https://iopscience.iop.org/article/10.3847/1538-3881/ad09de Evidence for Low-level Dynamical Excitation in Near-resonant Exoplanet Systems*
+RPGFUK2G http://biorxiv.org/lookup/doi/10.1101/2024.04.27.591458 xSiGra: Explainable model for single-cell spatial data elucidation
+NHPWFVHJ https://pos.sissa.it/453/292 Update on the gradient flow scale on the 2+1+1 HISQ ensembles
+D26U77IQ https://link.aps.org/doi/10.1103/PhysRevD.107.114514 Light-quark connected intermediate-window contributions to the muon g − 2 hadronic vacuum polarization from lattice QCD
+D4TWK2RB https://linkinghub.elsevier.com/retrieve/pii/S1468121822000839 Continuous data assimilation for the 3D Ladyzhenskaya model: analysis and computations
+XV7ZKX5D https://linkinghub.elsevier.com/retrieve/pii/S0021999122004570 Continuous data assimilation for two-phase flow: Analysis and simulations
+NCDQQ7BX https://www.mdpi.com/2072-6694/15/17/4411 Genetic Regulation of Human isomiR Biogenesis
+QFVVXKJF http://biorxiv.org/lookup/doi/10.1101/2023.11.04.565623 Exploring building blocks of cell organization by estimating network motifs using graph isomorphism network
+DAY2NW2S http://biorxiv.org/lookup/doi/10.1101/2024.05.06.592851 scBSP: A fast and accurate tool for identifying spatially variable genes from spatial transcriptomic data
+NQKUDYND http://biorxiv.org/lookup/doi/10.1101/2023.11.09.566479 Exploring the Mosaic-like Tissue Architecture of Kidney Diseases Using Relation Equivariant Graph Neural Networks on Spatially Resolved Transcriptomics
+GH7IRYZZ https://www.eneuro.org/lookup/doi/10.1523/ENEURO.0385-23.2024 Proactive Versus Reactive Control Strategies Differentially Mediate Alcohol Drinking in Male Wistars and P Rats
+B62VMAML https://www.nature.com/articles/s41467-022-31731-4 Compulsive alcohol drinking in rodents is associated with altered representations of behavioral control and seeking in dorsal medial prefrontal cortex
+DDWWESR6 http://biorxiv.org/lookup/doi/10.1101/2023.06.15.545101 Flexible coding schemes in dorsomedial prefrontal cortex underlie decision-making during delay discounting
+EC8GPQE7 https://www.jneurosci.org/lookup/doi/10.1523/JNEUROSCI.1490-23.2023 Neural activity in anterior insula at drinking onset and licking relates to compulsion-like alcohol consumption
+26UII4UB https://dx.plos.org/10.1371/journal.pone.0279841 Distinct cortico-striatal compartments drive competition between adaptive and automatized behavior
+QKN7D6RX https://academic.oup.com/cercor/article/doi/10.1093/cercor/bhae172/7658636 Longitudinal MRI of the developing ferret brain reveals regional variations in timing and rate of growth
+WAZ4S77T https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020JD033746 Constraining and Characterizing the Size of Atmospheric Rivers: A Perspective Independent From the Detection Algorithm
+GAVIU5P4 https://gmd.copernicus.org/articles/17/301/2024/ Scalable Feature Extraction and Tracking (SCAFET): a general framework for feature extraction from large climate data sets
+GG9UCERD https://journals.ametsoc.org/view/journals/clim/35/12/JCLI-D-21-0590.1.xml Exploratory Precipitation Metrics: Spatiotemporal Characteristics, Process-Oriented, and Phenomena-Based
+MJ34KDJS https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL095335 Extreme Water Vapor Transport During the March 2021 Sydney Floods in the Context of Climate Projections
+MYD5D2UY https://www.researchsquare.com/article/rs-2038838/v1 Anthropogenic aerosols mask increases in US rainfall by greenhouse gases
+VLREQFVL https://link.springer.com/10.1007/s00382-021-05638-7 Quantifying the influence of natural climate variability on in situ measurements of seasonal total and extreme daily precipitation
+7JSWGINK https://gmd.copernicus.org/articles/17/3533/2024/ Identifying atmospheric rivers and their poleward latent heat transport with generalizable neural networks: ARCNNv1
+RY3JCCR6 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022JD037105 Characteristics and Variability of Winter Northern Pacific Atmospheric River Flavors
+WCE6NMNP https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022GL102091 Future Atmospheric Rivers and Impacts on Precipitation: Overview of the ARTMIP Tier 2 High‐Resolution Global Warming Experiment
+SBHE9U5F https://www.nature.com/articles/s41467-024-45504-8 Anthropogenic aerosols mask increases in US rainfall by greenhouse gases
+49NCF3AA https://link.springer.com/10.1007/s00382-022-06321-1 A framework for detection and attribution of regional precipitation change: Application to the United States historical record
+PCRRPHPG https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022GL099186 Sign of Observed California Temperature Trends Depends on Data Set Homogenization: Implications for Weighting and Downscaling
+EJEY7FUM https://journals.sagepub.com/doi/full/10.3233/JAD-231286 Associations Between Neuroinflammation-Related Conditions and Alzheimer’s Disease: A Study of US Insurance Claims Data
+LM2UI92T https://link.springer.com/10.1007/s40264-023-01370-9 Application of an Innovative Data Mining Approach Towards Safe Polypharmacy Practice in Older Adults
+8HZ6LLHN http://biorxiv.org/lookup/doi/10.1101/2023.12.20.572422 Measure of major contents in animal and plant genomes, using Gnodes, finds under-assemblies of model plant, Daphnia, fire ant and others
+YSYZVQHR http://biorxiv.org/lookup/doi/10.1101/2022.05.13.491861 Genes ruler for genomes, Gnodes, measures assembly accuracy in animals and plants
+ZJ8LFIAD https://peerj.com/articles/6374 Genes of the pig, Sus scrofa , reconstructed with EvidentialGene
+879F4TNK http://biorxiv.org/lookup/doi/10.1101/829184 Longest protein, longest transcript or most expression, for accurate gene reconstruction of transcriptomes?
+JQYUJUIJ https://ieeexplore.ieee.org/document/10271940/ Data-To-Question Generation Using Deep Learning
+TXQ5WZ6F https://journals.biologists.com/dev/article/150/18/dev201872/329481/Polycomb-safeguards-imaginal-disc-specification Polycomb safeguards imaginal disc specification through control of the Vestigial–Scalloped complex
+Y28R65HC http://biorxiv.org/lookup/doi/10.1101/2024.04.09.588498 Drug-loaded nanoparticles for cancer therapy: a high-throughput multicellular agent-based modeling study
+DRCLU9B7 http://biorxiv.org/lookup/doi/10.1101/2023.10.17.562733 A multiscale model of immune surveillance in micrometastases: towards cancer patient digital twins
+M5RGU5ZI https://www.nature.com/articles/s41467-024-48484-x Effects of SPI1-mediated transcriptome remodeling on Alzheimer’s disease-related phenotypes in mouse models of Aβ amyloidosis
+I4AQHDY2 http://www.actaphys.uj.edu.pl/findarticle?series=Sup&vol=16&aid=8-A22 Confining Potential in Coulomb-gauge Lattice QCD
+WUBDS492 https://link.aps.org/doi/10.1103/PhysRevD.108.076001 Ambiguities in partial wave analysis of two spinless meson photoproduction
+LCBA4MP4 https://link.aps.org/doi/10.1103/PhysRevD.108.054018 Dynamics in near-threshold J / ψ photoproduction
+RDY93W5L https://dl.acm.org/doi/10.1145/3674829.3675060 AAVE Corpus Generation and Low-Resource Dialect Machine Translation
+ZY43WIZA https://iopscience.iop.org/article/10.3847/1538-3881/ad61d8 Evidence for Primordial Alignment: Insights from Stellar Obliquity Measurements for Compact Sub-Saturn Systems
+V3YU6Q5X https://iopscience.iop.org/article/10.3847/2041-8213/ad7469 Single-star Warm-Jupiter Systems Tend to Be Aligned, Even around Hot Stellar Hosts: No Teff –λ Dependency*
+7MLLW3UK https://ijpds.org/article/view/2395 A statewide system for maternal-infant linked longitudinal surveillance: Indiana's model for improving maternal and child health
+EHKP25IS https://bmjopen.bmj.com/lookup/doi/10.1136/bmjopen-2023-073791 Using electronic health records to enhance surveillance of diabetes in children, adolescents and young adults: a study protocol for the DiCAYA Network
+5HKVXA27 https://bmcpublichealth.biomedcentral.com/articles/10.1186/s12889-024-19772-4 Tracking the burden, distribution, and impact of Post-COVID conditions in diverse populations for children, adolescents, and adults (Track PCC): passive and active surveillance protocols
+YKGPYFUS https://link.aps.org/doi/10.1103/PhysRevD.110.094509 Coulomb confinement in the Hamiltonian limit
+CZDDFQD5 https://academic.oup.com/mnras/article/537/2/1518/7965979 A dusty dawn: galactic dust buildup at z ≳ 5
+2JKVX9B2 https://onlinelibrary.wiley.com/doi/10.1002/adom.202400801 Design of Light‐Induced Solid‐State Plasmonic Rulers via Tethering Photoswitchable Molecular Machines to Gold Nanostructures Displaying Angstrom Length Resolution
+LXUFPSDW https://pubs.acs.org/doi/10.1021/acs.jpcb.4c04100 CHARMM at 45: Enhancements in Accessibility, Functionality, and Speed
+Z3GIHJZP https://link.springer.com/10.1007/s00401-024-02775-1 Enhanced microglial dynamics and a paucity of tau seeding in the amyloid plaque microenvironment contribute to cognitive resilience in Alzheimer’s disease
+YFHXEYSP https://iopscience.iop.org/article/10.3847/1538-3881/ad6b7f SOLES XII. The Aligned Orbit of TOI-2533 b, a Transiting Brown Dwarf Orbiting an F8-type Star
+X2TXCJHN https://scholarworks.iu.edu/journals/index.php/thst/article/view/37892 Incorporating Climate Engineering into Secondary Education: A New Direction for Indiana’s Science Classrooms
+32KBT36E https://iopscience.iop.org/article/10.3847/2041-8213/adc129 From Misaligned Sub-Saturns to Aligned Brown Dwarfs: The Highest Mp / M* Systems Exhibit Low Obliquities, Even around Hot Stars*
+HREM3P93 https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.13901 Loss of Inpp5d has disease‐relevant and sex‐specific effects on glial transcriptomes
+5RVWMZWZ https://www.aanda.org/10.1051/0004-6361/202450954 Inference of black-hole mass fraction in Galactic globular clusters: A multi-dimensional approach to break the initial-condition degeneracies
+VUZVT8R6 https://www.aanda.org/10.1051/0004-6361/202451054 A 3D view of multiple populations’ kinematics in Galactic globular clusters
+TEQ3F68U https://academic.oup.com/mnras/article/534/3/2397/7775518 Energy equipartition in multiple-population globular clusters
+ECDQDXAN https://www.aanda.org/10.1051/0004-6361/202452786 Exploring the formation environment and dynamics of multiple stellar populations in globular clusters through binary systems
+I7AZBRQZ https://www.aanda.org/10.1051/0004-6361/202348653 MOCCA: Global properties of tidally filling and underfilling globular star clusters with multiple stellar populations
+TKIKJEQI https://www.atsjournals.org/doi/10.1164/ajrccm.2025.211.Abstracts.A7716 Novel Insights Into Right Ventricular Dysfunction in Pulmonary Arterial Hypertension: The Role of Mitochondrial Dysfunction and Cell Cycle Arrest
+DNPE7YUN https://dl.acm.org/doi/10.1145/3703157 Scaling Terrain-Aware Spatial Machine Learning for Flood Mapping on Large Scale Earth Imagery Data
+Q9H69JLM https://linkinghub.elsevier.com/retrieve/pii/S0168169924008184 CattleAssigner: A framework for accurate assignment of individuals to cattle lineages and populations using minimum informative markers
+5WCF58N2 https://molecular-cancer.biomedcentral.com/articles/10.1186/s12943-025-02311-z LSD1 inhibition attenuates targeted therapy-induced lineage plasticity in BRAF mutant colorectal cancer
+QQVC38NH https://www.mdpi.com/2072-6694/16/11/2040 Single-Cell Profiling Reveals the Impact of Genetic Alterations on the Differentiation of Inflammation-Induced Murine Colon Tumors
+QJMRSMMY https://onlinelibrary.wiley.com/doi/10.1111/ede.70004 A Conserved Somatic Sex Determination Cascade Instructs Trait‐Specific Sexual Dimorphism in Horned Dung Beetles
+7QYUIRI5 https://www.cambridge.org/core/product/identifier/S002214302500036X/type/journal_article The effect of melt-channel geometry on ice-shelf flow
+Z64QKAK9 https://www.frontiersin.org/articles/10.3389/fmed.2022.1029227/full Predicting melanoma survival and metastasis with interpretable histopathological features and machine learning models
+T6T5Y8AP https://elifesciences.org/articles/97981 Robust single-nucleus RNA sequencing reveals depot-specific cell population dynamics in adipose tissue remodeling during obesity
+5YIZS4WR https://bmcpublichealth.biomedcentral.com/articles/10.1186/s12889-025-22425-9 Equivalence of electronic health record data for measuring hypertension prevalence: a retrospective comparison to BRFSS with data from two Indiana health systems, 2021
+NZY6GMGA https://link.aps.org/doi/10.1103/PhysRevD.111.094508 Hadronic vacuum polarization for the muon g − 2 from lattice QCD: Complete short and intermediate windows
+6Z3ADSY4 https://linkinghub.elsevier.com/retrieve/pii/S0893395225000936 Multimodal Explainable Artificial Intelligence for Prognostic Stratification of Patients With Glioblastoma
+8P6CZP35 https://aacrjournals.org/cancerres/article/85/8_Supplement_1/6247/758662/Abstract-6247-Artificial-intelligence-predicts Abstract 6247: Artificial intelligence predicts 2021 WHO glioma subtypes from whole slide images
+SPAAF9A5 https://meridian.allenpress.com/aplm/article/doi/10.5858/arpa.2024-0374-OA/505697/Artificial-Intelligence-Based-Classification-of Artificial Intelligence–Based Classification of Renal Oncocytic Neoplasms: Advancing From a 2-Class Model of Renal Oncocytoma and Low-Grade Oncocytic Tumor to a 3-Class Model Including Chromophobe Renal Cell Carcinoma
+UAM3LZYJ https://pos.sissa.it/466/412 Lattice gauge ensembles and data management
+66J3HQQ6 https://www.frontiersin.org/articles/10.3389/fnins.2024.1304191/full Prognostic stratification of glioblastoma patients by unsupervised clustering of morphology patterns on whole slide images furthering our disease understanding
+XW9DXLER https://ieeexplore.ieee.org/document/10635869/ Weakly Supervised IDH-Status Glioma Classification from H&E-Stained Whole Slide Images
+V7QWPM4D https://academic.oup.com/neuro-oncology/article/26/Supplement_8/viii187/7890259 PATH-39. AI-BASED IDENTIFICATION OF GLIOMA IDH MUTATIONAL STATUS FROM H&E-STAINED WHOLE SLIDE IMAGES
+EHUPLFKQ http://biorxiv.org/lookup/doi/10.1101/2025.03.25.645306 Comparative analysis of nuclei isolation methods for brain single-nucleus RNA sequencing
+T64QEK8I https://rupress.org/jem/article/220/11/e20230180/276197/Network-analysis-identifies-strain-dependent Network analysis identifies strain-dependent response to tau and tau seeding-associated genes
+QV5CUAFR https://www.science.org/doi/10.1126/sciadv.abe3954 Deletion of Abi3 gene locus exacerbates neuropathological features of Alzheimer’s disease in a mouse model of Aβ amyloidosis
+UYPTWMBM https://dx.plos.org/10.1371/journal.ppat.1013128 The molecular basis for DNA-binding by competence T4P is distinct in a representative Gram-positive and Gram-negative species
+6YTGWQKY https://pnas.org/doi/10.1073/pnas.2421764122 DprA recruits ComM to facilitate recombination during natural transformation in Gram-negative bacteria
+LRWN8XIT https://www.jci.org/articles/view/180117 Inflammation primes the murine kidney for recovery by activating AZIN1 adenosine-to-inosine editing
+PQRZNCFI https://direct.mit.edu/imag/article/doi/10.1162/imag_a_00504/128177/Individual-patterns-of-functional-connectivity-in Individual patterns of functional connectivity in neonates as revealed by surface-based Bayesian modeling
+6M5LGZ3T https://royalsocietypublishing.org/doi/10.1098/rsfs.2024.0024 Robust data-driven segmentation of pulsatile cerebral vessels using functional magnetic resonance imaging
+X3VILUIQ https://pnas.org/doi/10.1073/pnas.2421277122 The world through infant eyes: Evidence for the early emergence of the cardinal orientation bias
+RSKIEX5M http://biorxiv.org/lookup/doi/10.1101/2025.04.08.647882 Application of Whole Proteome Thermal Shift Assays to Define PERK-dependent Changes in Protein Homeostasis during the Unfolded Protein Response
+5HF2Z6B8 http://biorxiv.org/lookup/doi/10.1101/2024.05.15.594427 Unraveling systemic responses to NQO1-activated IB-DNQ and Rucaparib single and dual agent therapy in triple-negative breast cancers
+A35LI94C https://www.ahajournals.org/doi/10.1161/JAHA.124.037197 Relationship Between Health Care Team Segregation and Receipt of Care by a Cardiologist According to Patient Race in a Midwestern State
+92GPA2R5 https://www.ahajournals.org/doi/10.1161/CIRCOUTCOMES.124.011643 Relationship Between Race, Predelivery Cardiology Care, and Cardiovascular Outcomes in Preeclampsia/Eclampsia Among a Commercially Insured Population
+UM9ELXNP https://linkinghub.elsevier.com/retrieve/pii/S2666602224000132 Association between social vulnerability index and admission urgency for transcatheter aortic valve replacement
+BJ7ATIFV https://onlinelibrary.wiley.com/doi/10.1002/ehf2.15078 Association between clinician team segregation, receipt of cardiovascular care and outcomes in valvular heart diseases
+UNBAJLWM https://link.springer.com/10.1007/s40615-023-01838-5 Association Between Race, Cardiology Care, and the Receipt of Guideline-Directed Medical Therapy in Peripartum Cardiomyopathy
+R3U5T8CS https://pubs.acs.org/doi/10.1021/acs.jpca.5c02839 Photoelectron Spectroscopy of Fulvenallenyl and Fluorine-Substituted Fulvenallenyl Anions
+RDNKZW9Q https://pubs.acs.org/doi/10.1021/acs.jpca.4c03434 Anion Photoelectron Imaging Spectroscopy of C6 F5 X– (X = F, Cl, Br, I)
+JGVXGES2 https://direct.mit.edu/netn/article/9/1/38/124897/Tangent-space-functional-reconfigurations-in Tangent space functional reconfigurations in individuals at risk for alcohol use disorder
+A5JJSV67 https://pubs.aip.org/jcp/article/162/5/054301/3333271/Electronic-structures-and-spin-frustration-in-Ln3O Electronic structures and spin frustration in Ln3O (Ln = Ce, Sm, Gd) neutrals and anions determined by anion photoelectron spectroscopy
+3UXTFYYB https://onlinelibrary.wiley.com/doi/10.1111/ejn.70150 Left Ventral Caudate Functional Connectivity Mediates the Relationship Between Habitual Responding and Alcohol Use
+GNPAMFEJ https://www.cambridge.org/core/product/identifier/S2040174424000333/type/journal_article PedBE age and age acceleration in umbilical vein endothelial cells: an examination of infant birth outcomes
+FHBPJVKG https://www.nature.com/articles/s41380-024-02652-z DNA methylation profiles of cancer-related fatigue associated with markers of inflammation and immunometabolism
+5TD9TZU9 https://onlinelibrary.wiley.com/doi/10.1002/dev.22464 Maternal childhood adversity and infant epigenetic aging: Moderation by restless sleep during pregnancy
+CJAILKQD https://linkinghub.elsevier.com/retrieve/pii/S0022399923003756 Associations of differentially expressed genes with psychoneurological symptoms in patients with head and neck cancer: A longitudinal study
+XDHB56LB https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.70238 Tau depletion diminishes vascular amyloid‐related deficits in a mouse model of cerebral amyloid angiopathy
+Y9STZIEG https://academic.oup.com/jbmrplus/article/7479137 L‐BAIBA Synergizes with Sub‐Optimal Mechanical Loading to Promote New Bone Formation
+8T6M6S6K https://elifesciences.org/articles/92263 Deletion of FNDC5/irisin modifies murine osteocyte function in a sex-specific manner
+LYEIND5Y https://academic.oup.com/jbmrplus/article/doi/10.1093/jbmrpl/ziae054/7651121 Sex dimorphic response to osteocyte miR21 deletion in murine calvaria bone as determined by RNAseq analysis
+7Q62FRVY https://iopscience.iop.org/article/10.3847/1538-3881/ad9dd5 Evidence for Primordial Alignment II: Insights from Stellar Obliquity Measurements for Hot Jupiters in Compact Multiplanet Systems
+5TKQF2PB https://link.aps.org/doi/10.1103/PhysRevLett.133.135301 Universal Diffusion in Coulomb Crystals
+H8IRZPLK https://linkinghub.elsevier.com/retrieve/pii/S0167732223026272 Synthesis, characterization, and electronic structure of bioactive vanillin based fluorescent Schiff bases
+SUZ5RBXF https://linkinghub.elsevier.com/retrieve/pii/S0925346724017336 Controlled synthesis of Ag–Au alloy nanoparticles for optimizing surface enhanced Raman scattering-based detection of antibiotic and pesticide residues
+63E22X98 https://xlink.rsc.org/?DOI=D4EM00606B A theoretical study on the environmental oxidation of fenpyrazamine fungicide initiated by hydroxyl radicals in the aqueous phase
+SPTSI5VK https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202401487 Exploring the Hydrogen Storage Potential of Allylamine Borane Using Density Functional Theory
+L26QSQGK https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202403990 Rhodamine‐Based Fluorescence Probe for Monitoring of Lysosomal pH: Spectroscopic Insights and Cellular Applications
+9YZZZWS5 https://linkinghub.elsevier.com/retrieve/pii/S2468823124008903 Silver- and gold-catalyzed azide−alkyne cycloaddition by functionalized NHC-based polynuclear catalysts: Computational investigation and mechanistic insights
+IG6J352M https://linkinghub.elsevier.com/retrieve/pii/S001623612400396X Monte-Carlo simulations on H2 adsorption in kaolinite nanopore in the presence of CO2 and CH4 gases
+E8VJV7NC https://linkinghub.elsevier.com/retrieve/pii/S0045206825000860 Design, Synthesis, Biocompatibility, molecular docking and molecular dynamics studies of novel Benzo[b]thiophene-2-carbaldehyde derivatives targeting human IgM Fc Domains
+DIELQB63 https://onlinelibrary.wiley.com/doi/10.1111/adb.70008 Intra‐striatal dopaminergic inter‐subject covariance in social drinkers and non‐treatment‐seeking alcohol use disorder participants
+M95SCGVY https://dl.acm.org/doi/10.1145/3491418.3530297 Scholarly Data Share: A Model for Sharing Big Data in Academic Research
+A9AVUYIW https://dl.acm.org/doi/10.1145/3569951.3597585 Scholarly Data Share 2.0: Granular Access to Research Data
+B5WIRUL3 https://onlinelibrary.wiley.com/doi/10.1002/pro.70148 Chemically induced partial unfolding of the multifunctional apurinic/apyrimidinic endonuclease 1
+5PG6U7EH https://academic.oup.com/nar/article/doi/10.1093/nar/gkaf166/8069167 In silico λ-dynamics predicts protein binding specificities to modified RNAs
+3V96MZHW https://link.springer.com/10.1007/s10456-024-09966-0 Ref-1 is overexpressed in neovascular eye disease and targetable with a novel inhibitor
+9NJMMASZ https://pubs.acs.org/doi/10.1021/acs.jpcb.4c04805 Superimposing Ligands with a Ligand Overlay as an Alternate Topology Model for λ-Dynamics-Based Calculations
+Z86QC74Q https://pubs.acs.org/doi/10.1021/acs.jcim.4c00662 A λ-Dynamics Investigation of Insulin Wakayama and Other A3 Variant Binding Affinities to the Insulin Receptor
+4MQRR47H https://www.science.org/doi/10.1126/sciadv.adj4509 Sequence and epigenetic landscapes of active and silent nucleolus organizer regions in Arabidopsis
+HJW2EICD https://humgenomics.biomedcentral.com/articles/10.1186/s40246-024-00655-z Rapid discrimination between deleterious and benign missense mutations in the CAGI 6 experiment
+MPJWATEX https://link.springer.com/10.1007/978-1-0716-4196-5_8 AlphaFold2, SPINE-X, and Seder on Four Hard CASP Targets
+6SHS4A46 https://link.springer.com/10.1007/s00439-025-02731-3 Evaluation of enzyme activity predictions for variants of unknown significance in Arylsulfatase A
+WKAY453L https://link.springer.com/10.1007/978-3-031-81596-6_25 Machine Learning-Based Tool for Efficient Discrimination Between Deleterious and Neutral Missense Mutations
+VFPRKMBX https://www.mdpi.com/2071-1050/16/23/10206 A Novel Hybrid Approach: Integrating Bayesian SPDE and Deep Learning for Enhanced Spatiotemporal Modeling of PM2.5 Concentrations in Urban Airsheds for Sustainable Climate Action and Public Health
+PSFETXPD https://pubs.acs.org/doi/10.1021/jacs.4c17874 Reversible Interconversion of Nitrate and Nitrite Catalyzed by Periplasmic Nitrate Reductase from Campylobacter jejuni
+9LXEPPYB https://linkinghub.elsevier.com/retrieve/pii/S2666247724000939 Non-coding cause of congenital heart defects: Abnormal RNA splicing with multiple isoforms as a mechanism for heterotaxy
+RYZXDSBT https://journals.biologists.com/bio/article/14/3/bio061677/367400/A-CRISPR-mis-insertion-in-the-Zic3-5-UTR-inhibits A CRISPR mis-insertion in the Zic3 5′UTR inhibits in vivo translation and is predicted to result in formation of an mRNA stem-loop hairpin
+CJ8HSHM8 https://www.ahajournals.org/doi/10.1161/JAHA.124.039177 Identification of Long Noncoding RNA Candidate Disease Genes Associated With Clinically Reported Copy Number Variants in Congenital Heart Disease
+NPHJCGKK https://www.nature.com/articles/s41390-025-03819-2 Genomics of pediatric cardiomyopathy
+ZQLXQUY4 https://ojs.aaai.org/index.php/AAAI/article/view/32124 Deep Reinforcement Learning with Time-Scale Invariant Memory
+FV6M8HTB https://dl.acm.org/doi/10.1145/3626203.3670545 Automated Transcription Service: Enabling Transcription at Scale for Social Science Research
+GZJIVN32 https://academic.oup.com/g3journal/article/doi/10.1093/g3journal/jkaf107/8132832 Gene expression and pollen performance indicate altered postmating selection between Solanum species with different mating systems
+LMXMDQJZ https://academic.oup.com/cercor/article/doi/10.1093/cercor/bhaf131/8157445 Functional reconfiguration between rest and movie watching relates to theory-of-mind performance among young and older adults
+P9PN9A2S https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JH000496 Recommendations for Comprehensive and Independent Evaluation of Machine Learning‐Based Earth System Models
+3QD3LWCF https://gmd.copernicus.org/articles/18/961/2025/ A new metrics framework for quantifying and intercomparing atmospheric rivers in observations, reanalyses, and climate models
+UJ3L82ZP https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JD042222 Atmospheric River Detection Under Changing Seasonality and Mean‐State Climate: ARTMIP Tier 2 Paleoclimate Experiments
+NIK9K2PM https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JD042163 Similarities in Meteorological Composites Among Different Atmospheric River Detection Tools During Landfall Over Western Coastal North America
+6U32MRQ4 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL107236 Atmospheric Rivers in the Eastern and Midwestern United States Associated With Baroclinic Waves
+J8WWT4CI https://gmd.copernicus.org/articles/18/787/2025/ Moving beyond post hoc explainable artificial intelligence: a perspective paper on lessons learned from dynamical climate modeling
+L3Q8DVAT https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JD041687 Co‐Occurring Atmospheric Features and Their Contributions to Precipitation Extremes
+VCSGSALS https://insight.jci.org/articles/view/167408 Innate immune activation restricts priming and protective efficacy of the radiation-attenuated PfSPZ malaria vaccine
+TUUIT96E https://linkinghub.elsevier.com/retrieve/pii/S1074761319303358 A Molecular Signature in Blood Reveals a Role for p53 in Regulating Malaria-Induced Inflammation
+B8LXAQGF http://biorxiv.org/lookup/doi/10.1101/2025.05.31.657176 EXOSC3 S1-domain variants implicated in PCH1b alter RNA exosome cap subunit abundance and thermal stability disrupting rRNA processing and targeting of AU-rich mRNA
+LLK9HKQ7 https://linkinghub.elsevier.com/retrieve/pii/S0021925825002856 Spt6-Spn1 interaction is required for RNA polymerase II association and precise nucleosome positioning along transcribed genes
+VVV2344W https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.14243 Deletion of miR‐33, a regulator of the ABCA1–APOE pathway, ameliorates neuropathological phenotypes in APP/PS1 mice
+NVH9X52N https://academic.oup.com/g3journal/article/doi/10.1093/g3journal/jkaf101/8126571 QTL identification and characterization of the recombination landscape of the mountain pine beetle ( Dendroctonus ponderosae )
+HEU6S726 https://www.nature.com/articles/s41467-025-60618-3 An archaeal nucleoid-associated protein binds an essential motif in DNA replication origins
+4QEQ5DLT https://www.nature.com/articles/s41591-024-03011-9 Single-nucleus chromatin accessibility and transcriptomic map of breast tissues of women of diverse genetic ancestry
+UU9FRVAE https://aacrjournals.org/cancerrescommun/article/4/1/38/732408/Signaling-Pathway-Alterations-Driven-by-BRCA1-and Signaling Pathway Alterations Driven by BRCA1 and BRCA2 Germline Mutations are Sufficient to Initiate Breast Tumorigenesis by the PIK3CAH1047R Oncogene
+E4WEIG35 https://ascpt.onlinelibrary.wiley.com/doi/10.1002/psp4.13295 Population Pharmacokinetics and Transfer of Gabapentin When Used as a Pain Adjunct for Cesarean Deliveries
+XCHIIA4A https://ascopubs.org/doi/10.1200/GO.23.00311 Real-World Cervical Cancer Screening Uptake and Predictors of Visual Inspection With Acetic Acid Positivity Among Women Living With HIV in Care Programs in Western Kenya
+VSAKIFHX https://journals.lww.com/10.1097/QAI.0000000000003413 Modeling the HIV Cascade of Care Using Routinely Collected Clinical Data to Guide Programmatic Interventions and Policy Decisions
+G3XMMVVT https://mchandaids.org/impact-of-maternal-viral-suppression-on-growth-patterns-for-hiv-exposed-uninfected-infants-in-kenya/ Impact of Maternal Viral Suppression on Growth Patterns for HIV-Exposed Uninfected Infants in Kenya
+6UXM7Z7Y https://dx.plos.org/10.1371/journal.pgph.0001756 Adaptation of the Client Diagnostic Questionnaire for East Africa
+BUMS7QKZ https://journals.lww.com/10.1097/QAI.0000000000003487 Outcomes After Loss to Follow-Up for Pregnant and Postpartum Women Living With HIV and Their Children in Kenya: A Prospective Cohort Study
+8I5GLXE4 https://link.springer.com/10.1007/s10461-024-04483-z Effects of Alcohol Use on Patient Retention in HIV Care in East Africa
+WZD6GM3C https://journals.lww.com/10.1097/QAI.0000000000003330 Mortality Among HIV-Infected Adults on Antiretroviral Therapy in Southern Uganda
+CV2L3BV6 https://www.spiedigitallibrary.org/conference-proceedings-of-spie/13302/3042513/Anesthetic-effects-on-functional-connectivity-fingerprinting-in-mice/10.1117/12.3042513.full Anesthetic effects on functional connectivity fingerprinting in mice
+NWLUSQM7 https://karger.com/article/doi/10.1159/000544824 Quantifying the timing of gyral and sulcal formation relative to growth in the ferret cerebral cortex
+B5E4V5EM https://link.springer.com/10.1007/s42001-023-00219-6 The value of manual annotation in assessing trends of hate speech on social media: was antisemitism on the rise during the tumultuous weeks of Elon Musk’s Twitter takeover?
+3W7TBD52 https://link.springer.com/10.1007/s10588-022-09363-2 Differences between antisemitic and non-antisemitic English language tweets
+BN3X4ZPT https://link.springer.com/10.1007/s42001-024-00251-0 Annotating live messages on social media. Testing the efficiency of the AnnotHate – live data annotation portal
+3PLACMPN https://www.nature.com/articles/s41467-024-52355-w Network community detection via neural embeddings
+9GT48PZK https://pnas.org/doi/10.1073/pnas.2305414120 Unsupervised embedding of trajectories captures the latent structure of scientific migration
+6MSR35XM http://biorxiv.org/lookup/doi/10.1101/2024.10.06.616888 Measuring DNA contents of animal and plant genomes with Gnodes, the long and short of it
+38NIQMPJ https://linkinghub.elsevier.com/retrieve/pii/S0021925825021490 In vivo pulse-chase in Caenorhabditis elegans reveals intestinal histone turnover changes upon starvation
+2ALP83LZ https://xlink.rsc.org/?DOI=D4SM01370K Multilayered ordered arrays self-assembled from a mixed population of nanoparticles
+JAXEHFDU https://academic.oup.com/schizophreniabulletin/advance-article/doi/10.1093/schbul/sbae147/7754917 Cognitive Mechanisms of Aberrant Self-Referential Social Perception in Psychosis and Bipolar Disorder: Insights From Computational Modeling
+CKNF9LZQ https://pubs.acs.org/doi/10.1021/jasms.4c00388 Comparison of Partially Denatured Cytochrome c Structural Ensembles in Solution and Gas Phases Using Cross-Linking Mass Spectrometry
+Z7AERU27 https://xlink.rsc.org/?DOI=D3AN01680C The role of solvation on the conformational landscape of α-synuclein
+SVMVKDN8 https://iopscience.iop.org/article/10.3847/2515-5172/ad9f60 An Exploration of Molecular Lines for Abundance Analysis in M-dwarf IR Spectra
+SBLNNK6K https://pubs.acs.org/doi/10.1021/acsami.4c19673 Anisotropically Shaped Plasmonic WO 3– x Nanostructure-Driven Ultrasensitive SERS Detection and Machine Learning-Based Differentiation of Nitro-Explosives
+NYG9TAVP https://www.eneuro.org/lookup/doi/10.1523/ENEURO.0379-24.2024 Impulsive Choices Emerge When the Anterior Cingulate Cortex Fails to Encode Deliberative Strategies
+AGMJQWGP http://biorxiv.org/lookup/doi/10.1101/2024.06.07.597894 Neural basis of cognitive control signals in anterior cingulate cortex during delay discounting
+3QYSUUB4 https://linkinghub.elsevier.com/retrieve/pii/S0028390823003520 Non-consummatory behavior signals predict aversion-resistant alcohol drinking in head-fixed mice
+G25H3WMI https://www.jci.org/articles/view/180417 Addiction of primary cutaneous γδ T cell lymphomas to JAK/STAT signaling
+FIV2V2FV https://linkinghub.elsevier.com/retrieve/pii/S2666979X25001028 Deciphering genetic regulation at single-cell resolution in gastric cancer
+2GL9L75C https://elifesciences.org/articles/81083 GCN2 eIF2 kinase promotes prostate cancer by maintaining amino acid homeostasis
+WJ7WKCLK https://www.science.org/doi/10.1126/scisignal.adp1375 Coordination between the eIF2 kinase GCN2 and p53 signaling supports purine metabolism and the progression of prostate cancer
+NJEZI68Q https://journals.asm.org/doi/10.1128/msystems.00786-24 Gut community structure as a risk factor for infection in Klebsiella pneumoniae -colonized patients
+DH3UQYKC https://www.science.org/doi/10.1126/sciadv.adn1927 Comprehensive characterization of the transcriptional landscape in Alzheimer’s disease (AD) brains
+CX8KB4HB https://www.liebertpub.com/doi/10.1089/hum.2025.002 Bioinformatic Analysis of the Genetic Basis of Differential Adeno-Associated Virus Production Capability of 293 Variants
+L6IASUC5 https://linkinghub.elsevier.com/retrieve/pii/S0002944025001543 The Patatin-Like Phospholipase Domain–Containing 3 148M Variant Exacerbates Alcohol-Induced Liver Injury and Tumorigenesis in Mice
+YG47Z2ZQ https://link.aps.org/doi/10.1103/PhysRevD.111.014002 Studying π + π − photoproduction beyond Pomeron exchange
+5W2SN35J https://pos.sissa.it/465/041 A Comprehensive Study of Double pion Photoproduction: A Regge Approach
+NIN4ZN8A https://www.mdpi.com/2504-2289/9/3/66 PK-Judge: Enhancing IP Protection of Neural Network Models Using an Asymmetric Approach
+V4ANPGV2 https://aacrjournals.org/cancerdiscovery/article/15/3/511/752115/Ancestral-Differences-in-Anticancer-Treatment Ancestral Differences in Anticancer Treatment Efficacy and Their Underlying Genomic and Molecular Alterations
+GMSH5KGE https://linkinghub.elsevier.com/retrieve/pii/S0304383524006992 The pharmacogenomic and immune landscape of snoRNAs in human cancers
+B3YXV5D9 https://www.nature.com/articles/s41380-023-02111-1 RNA alternative splicing impacts the risk for alcohol use disorder
+I2TCRSZD https://genomebiology.biomedcentral.com/articles/10.1186/s13059-019-1847-4 RegSNPs-intron: a computational framework for predicting pathogenic impact of intronic single nucleotide variants
+IQC8TGVB https://ascpt.onlinelibrary.wiley.com/doi/10.1002/cpt.2018 Circulating miRNAs as Biomarkers for CYP2B6 Enzyme Activity
+P3D8JQBL https://www.science.org/doi/10.1126/sciadv.adu0772 TGFβ-dependent signaling drives tumor growth and aberrant extracellular matrix dynamics in NF1-associated plexiform neurofibroma
+KR2LIBHB https://aacrjournals.org/clincancerres/article/31/10/1988/762200/DLK1-Distinguishes-Subsets-of-NF1-Associated DLK1 Distinguishes Subsets of NF1-Associated Malignant Peripheral Nerve Sheath Tumors with Divergent Molecular Signatures
+LVIZK66G https://aacrjournals.org/clincancerres/article/30/5/1038/734307/Spatial-Gene-Expression-Profiling-Unveils-Immuno Spatial Gene-Expression Profiling Unveils Immuno-oncogenic Programs of NF1-Associated Peripheral Nerve Sheath Tumor Progression
+4VRALQEP https://linkinghub.elsevier.com/retrieve/pii/S221287782400139X Glucose intolerance as a consequence of hematopoietic stem cell dysfunction in offspring of obese mice
+NRLLK7C9 https://www.nature.com/articles/s41375-024-02312-9 Combination of menin and kinase inhibitors as an effective treatment for leukemia with NUP98 translocations
+UCWATD7V https://linkinghub.elsevier.com/retrieve/pii/S1532046425000887 A trajectory-informed model for detecting drug-drug-host interaction from real-world data
+SSP3UZQW https://www.nature.com/articles/s41598-025-98528-5 A theoretical model for detecting drug interaction with awareness of timing of exposure
+FPDDF5WC https://journals.lww.com/10.2215/CJN.0000000687 Risk of Urinary Tract Infections with Sodium-Glucose Transport Protein-2 Inhibitors in Subpopulations with Abnormal Genitourinary Pathology
+82ALL98E https://onlinelibrary.wiley.com/doi/10.1002/sim.10216 A Precision Mixture Risk Model to Identify Adverse Drug Events in Subpopulations Using a Case‐Crossover Design
+GPFVQZ24 https://link.springer.com/10.1007/s11538-024-01408-8 A Simple Framework for Agent-Based Modeling with Extracellular Matrix
+V4D7SIC8 https://www.nature.com/articles/s44401-025-00018-3 Enhancing medical coding efficiency through domain-specific fine-tuned large language models
+YIIZWMBP https://www.aanda.org/10.1051/0004-6361/202453155 Phase-space mixing of multiple stellar populations in globular clusters
+KEMPE84T https://www.aanda.org/10.1051/0004-6361/202453252 SIEGE: IV. Compact star clusters in cosmological simulations with a high star formation efficiency and subparsec resolution
+UEXPW4MS https://www.aanda.org/10.1051/0004-6361/202452876 SIEGE: III. The formation of dense stellar clusters in sub-parsec resolution cosmological simulations with individual star feedback
+K3M7XX26 https://www.aanda.org/10.1051/0004-6361/202554038 A JWST project on 47 Tucanae: Kinematics, energy equipartition, and anisotropy of multiple populations
+CK73VLEI https://linkinghub.elsevier.com/retrieve/pii/S0899707125001561 Comparative analysis of machine learning-derived nomogram and biomarkers in predicting side-specific extraprostatic extension: Preliminary findings
+NLLSSHC6 https://www.mdpi.com/1999-4915/15/8/1672 Molecular Dynamics Simulations of Deformable Viral Capsomers
+9WCFPW23 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023EF003851 The Choice of Baseline Period Influences the Assessments of the Outcomes of Stratospheric Aerosol Injection
+BVX8SKQ2 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022JD037067 The Shortwave Radiative Flux Response to an Injection of Sea Salt Aerosols in the Gulf of Mexico
+WVJUQEBB https://jov.arvojournals.org/article.aspx?articleid=2791809 Slow change: An analysis of infant egocentric visual experience
+62F2V2GV https://onlinelibrary.wiley.com/doi/10.1111/mmi.14969 Roles of RodZ and class A PBP1b in the assembly and regulation of the peripheral peptidoglycan elongasome in ovoid‐shaped cells of Streptococcus pneumoniaeD39
+CZBBLUAH https://www.nature.com/articles/s41467-023-41216-7 Multimaterial fiber as a physical simulator of a capillary instability
+PUE4NCUQ https://www.spiedigitallibrary.org/conference-proceedings-of-spie/12433/2644870/Creating-fiber-embedded-photonic-circuitry-by-liquid-phase-structuring-of/10.1117/12.2644870.full Creating fiber-embedded photonic circuitry by liquid-phase structuring of multi-material cores
+2CVDDCI3 https://pubs.rsc.org/sc/article/9/45/8542-8552/622367 Mechanistic study of styrene aziridination by iron( iv ) nitrides
+I22SWWQ5 https://pubs.acs.org/doi/10.1021/jacs.9b04389 A Dimeric Hydride-Bridged Complex with Geometrically Distinct Iron Centers Giving Rise to an S = 3 Ground State
+XE4R59B8 https://pubs.acs.org/doi/10.1021/jacs.0c07300 Two-State Reactivity in Iron-Catalyzed Alkene Isomerization Confers σ-Base Resistance
+R3GTNXAE https://pubs.acs.org/doi/10.1021/acs.inorgchem.0c02575 Iron(II) Complexes of an Anionic Bis(ylide)diphenylborate Ligand
+M4QQPEQW https://www.science.org/doi/10.1126/science.abd3054 Structural and spectroscopic characterization of an Fe(VI) bis(imido) complex
+CWABLAYY https://pubs.acs.org/doi/10.1021/jacs.1c02068 Catalytic Carbodiimide Guanylation by a Nucleophilic, High Spin Iron(II) Imido Complex
+4LE2V4NF https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/ejic.202200675 Heteroleptic Square Planar Cobalt(I/II) Complexes
+HI6X8PLQ https://linkinghub.elsevier.com/retrieve/pii/S2451929423002395 Hydrogen atom abstraction by a high-spin [FeIII=S] complex
+YTCHPGT4 https://pubs.acs.org/doi/10.1021/jacs.1c11429 Alkali Metal Ions Dictate the Structure and Reactivity of an Iron(II) Imido Complex
+GI4MY7RL https://pubs.acs.org/doi/10.1021/jacs.2c03487 A Spectroscopically Observed Iron Nitrosyl Intermediate in the Reduction of Nitrate by a Surface-Conjugated Electrocatalyst
+YLAMAC5Q https://pubs.acs.org/doi/10.1021/jacs.2c13350 Catalytic 1,3-Proton Transfer in Alkenes Enabled by Fe═NR Bond Cooperativity: A Strategy for p Ka -Dictated Regioselective Transposition of C═C Double Bonds
+AZHNAVJE https://pubs.acs.org/doi/10.1021/acscentsci.1c00890 Hydrocarbon Oxidation by an Exposed, Multiply Bonded Iron(III) Oxo Complex
+C8H8ADK2 https://linkinghub.elsevier.com/retrieve/pii/S0021925820335560 Non-growing Rhodopseudomonas palustris Increases the Hydrogen Gas Yield from Acetate by Shifting from the Glyoxylate Shunt to the Tricarboxylic Acid Cycle
+5BTQICZT http://link.springer.com/10.1007/s11682-015-9500-7 Neural correlates of emotion reappraisal in individuals with externalizing psychopathology
+BNQ3IPAL https://onlinelibrary.wiley.com/doi/10.1002/brb3.3312 Impact of aversive affect on neural mechanisms of categorization decisions
+232WG868 https://onlinelibrary.wiley.com/doi/10.1002/hbm.26648 Dynamic threat–reward neural processing under semi‐naturalistic ecologically relevant scenarios
+GH6TAWP6 https://linkinghub.elsevier.com/retrieve/pii/S2589004220308476 Tumor Phylogeny Topology Inference via Deep Learning
+KLAR4E92 https://www.ijcai.org/proceedings/2023/591 DiSProD: Differentiable Symbolic Propagation of Distributions for Planning
+XIJ5T6R7 https://linkinghub.elsevier.com/retrieve/pii/S2352673421000639 Occupy Wall Street ten years on: How its disruptive institutional entrepreneurship spread and why it fizzled
+RU7XZURX https://www.aanda.org/10.1051/0004-6361/202346095 Ongoing hierarchical massive cluster assembly: The LISCA II structure in the Perseus complex
+TFRNV8ZJ https://www.aanda.org/10.1051/0004-6361/202346792 The structural properties of multiple populations in the dynamically young globular cluster NGC 2419
+8FVWTVIA https://www.aanda.org/10.1051/0004-6361/202347420 Young, wild, and free: The early expansion of star clusters
+FHBUAIAW https://www.aanda.org/10.1051/0004-6361/202349021 The structural properties of multiple populations in globular clusters: The instructive case of NGC 3201
+XL6U8RCL https://academic.oup.com/mnras/article/516/4/5914/6691715 Sub-parsec resolution cosmological simulations of star-forming clumps at high redshift with feedback of individual stars
+XJB3Q4JH https://academic.oup.com/mnras/article/512/2/2584/6546161 Long-term evolution of multimass rotating star clusters
+Z4I7PDZ2 https://academic.oup.com/mnras/article/525/2/3136/7243400 Effects of massive central objects on the degree of energy equipartition of globular clusters
+DC7NWJGW https://academic.oup.com/mnras/article/526/1/1428/7271420 Shaping the unseen: the influence of baryons and environment on low-mass, high-redshift dark matter haloes in the SIEGE simulations
+KBMX86HZ https://academic.oup.com/mnras/article/521/3/4395/7080163 Evolution of binary stars in the early evolutionary phases of ultra-faint dwarf galaxies
+WF8CAHAG https://academic.oup.com/mnrasl/article/522/1/L61/7086132 First observational evidence of a relation between globular clusters’ internal rotation and stellar masses
+WMALW3SF https://pubs.acs.org/doi/10.1021/acs.jctc.6b00001 Hybrid Extended Lagrangian, Post-Hartree–Fock Born–Oppenheimer ab Initio Molecular Dynamics Using Fragment-Based Electronic Structure
+WLCQGQBP https://pubs.acs.org/doi/10.1021/acs.jctc.6b01107 Efficient, “On-the-Fly”, Born–Oppenheimer and Car–Parrinello-type Dynamics with Coupled Cluster Accuracy through Fragment Based Electronic Structure
+2AJDVKGQ https://pubs.acs.org/doi/10.1021/acs.jctc.7b00927 Efficient and Adaptive Methods for Computing Accurate Potential Surfaces for Quantum Nuclear Effects: Applications to Hydrogen-Transfer Reactions
+ISSV5D4T https://pubs.acs.org/doi/10.1021/acs.jctc.8b00186 Adaptive, Geometric Networks for Efficient Coarse-Grained Ab Initio Molecular Dynamics with Post-Hartree–Fock Accuracy
+CB3MKSUL https://pubs.acs.org/doi/10.1021/acs.jctc.8b00803 Efficiently Capturing Weak Interactions in ab Initio Molecular Dynamics with on-the-Fly Basis Set Extrapolation
+6VH5QI5V https://pubs.acs.org/doi/10.1021/acs.jctc.9b00608 Fragment-Based Electronic Structure for Potential Energy Surfaces Using a Superposition of Fragmentation Topologies
+NY25UM7H https://onlinelibrary.wiley.com/doi/10.1002/qua.26244 Embedded, graph‐theoretically defined many‐body approximations for wavefunction‐in‐DFT and DFT‐in‐DFT : Applications to gas‐ and condensed‐phase ab initio molecular dynamics, and potential surfaces for quantum nuclear effects
+BUXCZ64H https://pubs.acs.org/doi/10.1021/acs.jctc.9b01089 Efficient and Accurate Approach To Estimate Hybrid Functional and Large Basis-Set Contributions to Condensed-Phase Systems and Molecule–Surface Interactions
+CCDJ49GE https://pubs.acs.org/doi/10.1021/acs.jctc.0c01287 Weighted-Graph-Theoretic Methods for Many-Body Corrections within ONIOM: Smooth AIMD and the Role of High-Order Many-Body Terms
+NCSFTMJF https://pubs.acs.org/doi/10.1021/acs.jctc.5b00433 Ab Initio Molecular Dynamics Using Recursive, Spatially Separated, Overlapping Model Subsystems Mixed within an ONIOM-Based Fragmentation Energy Extrapolation Technique
+MDVQ3YR2 https://aacrjournals.org/cancerres/article/83/7_Supplement/5874/720067/Abstract-5874-HSF1-downregulation-of-CCL5-reduces Abstract 5874: HSF1 downregulation of CCL5 reduces CD8 T cell trafficking in breast cancer
+37NENZXB https://www.mdpi.com/2072-6694/15/13/3309 MCAK Inhibitors Induce Aneuploidy in Triple-Negative Breast Cancer Models
+V6EXVJMV https://aacrjournals.org/cancerres/article/84/2/276/733116/HSF1-Inhibits-Antitumor-Immune-Activity-in-Breast HSF1 Inhibits Antitumor Immune Activity in Breast Cancer by Suppressing CCL5 to Block CD8+ T-cell Recruitment
+BPZSUEF2 https://www.mdpi.com/1999-4915/15/8/1672 Molecular Dynamics Simulations of Deformable Viral Capsomers
+H68A929G https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023EF003851 The Choice of Baseline Period Influences the Assessments of the Outcomes of Stratospheric Aerosol Injection
+X637LF5I https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022JD037067 The Shortwave Radiative Flux Response to an Injection of Sea Salt Aerosols in the Gulf of Mexico
+VD36ZXAS https://jov.arvojournals.org/article.aspx?articleid=2791809 Slow change: An analysis of infant egocentric visual experience
+NYCB3YFT https://onlinelibrary.wiley.com/doi/10.1111/mmi.14969 Roles of RodZ and class A PBP1b in the assembly and regulation of the peripheral peptidoglycan elongasome in ovoid‐shaped cells of Streptococcus pneumoniaeD39
+ETI5WJ5K https://www.nature.com/articles/s41467-023-41216-7 Multimaterial fiber as a physical simulator of a capillary instability
+M9TEH7IL https://www.spiedigitallibrary.org/conference-proceedings-of-spie/12433/2644870/Creating-fiber-embedded-photonic-circuitry-by-liquid-phase-structuring-of/10.1117/12.2644870.full Creating fiber-embedded photonic circuitry by liquid-phase structuring of multi-material cores
+LG7NTHPX https://pubs.rsc.org/sc/article/9/45/8542-8552/622367 Mechanistic study of styrene aziridination by iron( iv ) nitrides
+FT8FGT6B https://pubs.acs.org/doi/10.1021/jacs.9b04389 A Dimeric Hydride-Bridged Complex with Geometrically Distinct Iron Centers Giving Rise to an S = 3 Ground State
+2UNTVIQP https://pubs.acs.org/doi/10.1021/jacs.0c07300 Two-State Reactivity in Iron-Catalyzed Alkene Isomerization Confers σ-Base Resistance
+A6SC3KES https://pubs.acs.org/doi/10.1021/acs.inorgchem.0c02575 Iron(II) Complexes of an Anionic Bis(ylide)diphenylborate Ligand
+D38PRCYI https://www.science.org/doi/10.1126/science.abd3054 Structural and spectroscopic characterization of an Fe(VI) bis(imido) complex
+KYIVF3RU https://pubs.acs.org/doi/10.1021/jacs.1c02068 Catalytic Carbodiimide Guanylation by a Nucleophilic, High Spin Iron(II) Imido Complex
+SK3XURCP https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/ejic.202200675 Heteroleptic Square Planar Cobalt(I/II) Complexes
+K8YP4PLM https://linkinghub.elsevier.com/retrieve/pii/S2451929423002395 Hydrogen atom abstraction by a high-spin [FeIII=S] complex
+DW9B9SIJ https://pubs.acs.org/doi/10.1021/jacs.1c11429 Alkali Metal Ions Dictate the Structure and Reactivity of an Iron(II) Imido Complex
+Z3B7CBP7 https://pubs.acs.org/doi/10.1021/jacs.2c03487 A Spectroscopically Observed Iron Nitrosyl Intermediate in the Reduction of Nitrate by a Surface-Conjugated Electrocatalyst
+3YMW5Q2K https://pubs.acs.org/doi/10.1021/jacs.2c13350 Catalytic 1,3-Proton Transfer in Alkenes Enabled by Fe═NR Bond Cooperativity: A Strategy for p Ka -Dictated Regioselective Transposition of C═C Double Bonds
+72TJG5ZD https://pubs.acs.org/doi/10.1021/acscentsci.1c00890 Hydrocarbon Oxidation by an Exposed, Multiply Bonded Iron(III) Oxo Complex
+23KGFE7P https://linkinghub.elsevier.com/retrieve/pii/S0021925820335560 Non-growing Rhodopseudomonas palustris Increases the Hydrogen Gas Yield from Acetate by Shifting from the Glyoxylate Shunt to the Tricarboxylic Acid Cycle
+8UJD3ARM http://link.springer.com/10.1007/s11682-015-9500-7 Neural correlates of emotion reappraisal in individuals with externalizing psychopathology
+92MZIFU7 https://onlinelibrary.wiley.com/doi/10.1002/brb3.3312 Impact of aversive affect on neural mechanisms of categorization decisions
+ANUITDTM https://onlinelibrary.wiley.com/doi/10.1002/hbm.26648 Dynamic threat–reward neural processing under semi‐naturalistic ecologically relevant scenarios
+7QBYWKMU https://linkinghub.elsevier.com/retrieve/pii/S2589004220308476 Tumor Phylogeny Topology Inference via Deep Learning
+QCMD6Q99 https://www.ijcai.org/proceedings/2023/591 DiSProD: Differentiable Symbolic Propagation of Distributions for Planning
+IQHI8LUV https://linkinghub.elsevier.com/retrieve/pii/S2352673421000639 Occupy Wall Street ten years on: How its disruptive institutional entrepreneurship spread and why it fizzled
+CSARASIE https://www.aanda.org/10.1051/0004-6361/202346095 Ongoing hierarchical massive cluster assembly: The LISCA II structure in the Perseus complex
+9LCCUIY7 https://www.aanda.org/10.1051/0004-6361/202346792 The structural properties of multiple populations in the dynamically young globular cluster NGC 2419
+B74LZ9SH https://www.aanda.org/10.1051/0004-6361/202347420 Young, wild, and free: The early expansion of star clusters
+Z9BAFJKI https://www.aanda.org/10.1051/0004-6361/202349021 The structural properties of multiple populations in globular clusters: The instructive case of NGC 3201
+JCIDZLME https://academic.oup.com/mnras/article/516/4/5914/6691715 Sub-parsec resolution cosmological simulations of star-forming clumps at high redshift with feedback of individual stars
+4AU9DZ84 https://academic.oup.com/mnras/article/512/2/2584/6546161 Long-term evolution of multimass rotating star clusters
+V9Z5NNK4 https://academic.oup.com/mnras/article/525/2/3136/7243400 Effects of massive central objects on the degree of energy equipartition of globular clusters
+QQL4VLDX https://academic.oup.com/mnras/article/526/1/1428/7271420 Shaping the unseen: the influence of baryons and environment on low-mass, high-redshift dark matter haloes in the SIEGE simulations
+A87CQITG https://academic.oup.com/mnras/article/521/3/4395/7080163 Evolution of binary stars in the early evolutionary phases of ultra-faint dwarf galaxies
+J5PVJZSK https://academic.oup.com/mnrasl/article/522/1/L61/7086132 First observational evidence of a relation between globular clusters’ internal rotation and stellar masses
+ZHAKFC45 https://pubs.acs.org/doi/10.1021/acs.jctc.6b00001 Hybrid Extended Lagrangian, Post-Hartree–Fock Born–Oppenheimer ab Initio Molecular Dynamics Using Fragment-Based Electronic Structure
+XCBNYU9W https://pubs.acs.org/doi/10.1021/acs.jctc.6b01107 Efficient, “On-the-Fly”, Born–Oppenheimer and Car–Parrinello-type Dynamics with Coupled Cluster Accuracy through Fragment Based Electronic Structure
+YYB2KJGE https://pubs.acs.org/doi/10.1021/acs.jctc.7b00927 Efficient and Adaptive Methods for Computing Accurate Potential Surfaces for Quantum Nuclear Effects: Applications to Hydrogen-Transfer Reactions
+YZBQFTMM https://pubs.acs.org/doi/10.1021/acs.jctc.8b00186 Adaptive, Geometric Networks for Efficient Coarse-Grained Ab Initio Molecular Dynamics with Post-Hartree–Fock Accuracy
+VUR7Z9QD https://pubs.acs.org/doi/10.1021/acs.jctc.8b00803 Efficiently Capturing Weak Interactions in ab Initio Molecular Dynamics with on-the-Fly Basis Set Extrapolation
+LV43VL6X https://pubs.acs.org/doi/10.1021/acs.jctc.9b00608 Fragment-Based Electronic Structure for Potential Energy Surfaces Using a Superposition of Fragmentation Topologies
+8TFSHK5U https://onlinelibrary.wiley.com/doi/10.1002/qua.26244 Embedded, graph‐theoretically defined many‐body approximations for wavefunction‐in‐DFT and DFT‐in‐DFT : Applications to gas‐ and condensed‐phase ab initio molecular dynamics, and potential surfaces for quantum nuclear effects
+LCSWTS3F https://pubs.acs.org/doi/10.1021/acs.jctc.9b01089 Efficient and Accurate Approach To Estimate Hybrid Functional and Large Basis-Set Contributions to Condensed-Phase Systems and Molecule–Surface Interactions
+CJBQVIGU https://pubs.acs.org/doi/10.1021/acs.jctc.0c01287 Weighted-Graph-Theoretic Methods for Many-Body Corrections within ONIOM: Smooth AIMD and the Role of High-Order Many-Body Terms
+CI9KHZQ9 https://pubs.acs.org/doi/10.1021/acs.jctc.5b00433 Ab Initio Molecular Dynamics Using Recursive, Spatially Separated, Overlapping Model Subsystems Mixed within an ONIOM-Based Fragmentation Energy Extrapolation Technique
+ID7UW3NH https://aacrjournals.org/cancerres/article/83/7_Supplement/5874/720067/Abstract-5874-HSF1-downregulation-of-CCL5-reduces Abstract 5874: HSF1 downregulation of CCL5 reduces CD8 T cell trafficking in breast cancer
+VASTQZ6J https://www.mdpi.com/2072-6694/15/13/3309 MCAK Inhibitors Induce Aneuploidy in Triple-Negative Breast Cancer Models
+NU2Y62RR http://journals.ametsoc.org/doi/10.1175/JCLI-D-15-0439.1 The Influence of Climate Model Biases on Projections of Aridity and Drought
+B8FQIBPK https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2016GL069121 Impacts of recent climate change on trends in baseflow and stormflow in United States watersheds
+MHTZWVY3 https://linkinghub.elsevier.com/retrieve/pii/S0034425716301900 Mapping spatial distribution and biomass of coastal wetland vegetation in Indonesian Papua by combining active and passive remotely sensed data
+ZL66JFPY https://www.tandfonline.com/doi/full/10.1080/01431161.2016.1183834 Revisiting empirical ocean-colour algorithms for remote estimation of chlorophyll- a content on a global scale
+NB8HPEL6 https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2015GL064593 Revisiting the recent California drought as an extreme value
+65EHXLG3 https://linkinghub.elsevier.com/retrieve/pii/S0167715218303407 Intrinsic random functions on the sphere
+476AIANY https://rmets.onlinelibrary.wiley.com/doi/10.1002/joc.2419 A refined index of model performance
+N546BKV3 https://linkinghub.elsevier.com/retrieve/pii/S2212095521001929 Climate change impacts and urban green space adaptation efforts: Evidence from U.S. municipal parks and recreation departments
+FKEPNWV8 https://linkinghub.elsevier.com/retrieve/pii/S0022169421010222 Incorporating rain-on-snow into the SWAT model results in more accurate simulations of hydrologic extremes
+K2E2AXJE https://rmets.onlinelibrary.wiley.com/doi/10.1002/gdj3.188 A convection‐permitting dynamically downscaled dataset over the Midwestern United States
+6YBJI5XC https://dl.acm.org/doi/10.1145/3491418.3535171 HPC Data Analysis Pipeline for Neuronal Cluster Detection
+92F9W3D3 https://onlinelibrary.wiley.com/doi/10.1002/ajpa.24712 Updated imaging and phylogenetic comparative methods reassess relative temporal lobe size in anthropoids and modern humans
+74C4M8FD https://academic.oup.com/zoolinnean/article/199/3/567/7226103 Notes from the Anatolian underground: two new mole taxa from Eastern Turkey, together with a revised phylogeny of the genus Talpa (Mammalia: Eulipotyphla: Talpidae)
+3QEW5DCR https://linkinghub.elsevier.com/retrieve/pii/S0167278915000573 Continuous data assimilation for the 2D Bénard convection through velocity measurements alone
+4P4YN5FZ https://www.aimsciences.org//article/doi/10.3934/jcd.2019006 Numerical efficacy study of data assimilation for the 2D magnetohydrodynamic equations
+4ETHHMFW https://asmedigitalcollection.asme.org/computationalnonlinear/article/doi/10.1115/1.4002088/465846/Numerical-Techniques-for-Approximating-Lyapunov Numerical Techniques for Approximating Lyapunov Exponents and Their Implementation
+8Y52LCFK https://academic.oup.com/biometrics/article/79/4/3294/7587573 Bayesian Functional Data Analysis Over Dependent Regions and Its Application for Identification of Differentially Methylated Regions
+8G7FBRNV https://journals.sagepub.com/doi/10.1177/1545968315584004 Dynamic Changes in White Matter Abnormalities Correlate With Late Improvement and Deterioration Following TBI: A Diffusion Tensor Imaging Study
+HJL3MTCS https://www.nature.com/articles/s41598-020-78780-7 Impact of tumor-parenchyma biomechanics on liver metastatic progression: a multi-model approach
+MUL4JYFV https://gigabytejournal.com/articles/22 DAPT: A package enabling distributed automated parameter testing
+9ZUXZEPF https://dl.acm.org/doi/10.1145/3588983.3596679 HQ-Sim: High-performance State Vector Simulation of Quantum Circuits on Heterogeneous HPC Systems
+U38AVMWS https://dl.acm.org/doi/10.1145/3624062.3624217 MEMQSim: Highly Memory-Efficient and Modularized Quantum State-Vector Simulation
+SAKCLZJ8 https://dl.acm.org/doi/10.1145/3624062.3624257 Benchmarking and In-depth Performance Study of Large Language Models on Habana Gaudi Processors
+SCAAZHU5 https://dl.acm.org/doi/10.1145/3624062.3625123 Analyzing Impact of Data Reduction Techniques on Visualization for AMR Applications Using AMReX Framework
+LQMNHG97 https://pubs.acs.org/doi/10.1021/acs.jpca.3c03738 Electronic Structure of Heteronuclear Cerium-Platinum Clusters
+2E687EU7 https://ideals.illinois.edu/handle/2142/107392 PROBING THE EFFECTS OF ELECTRON CORRELATION: THE NOT-SO-SIMPLE CASE OF Gd2O
+C3I6K9XQ https://hdl.handle.net/2142/116827 A SPECTROSCOPIC INVESTIGATION OF THE EFFECTS OF SPIN STRAIN ON LN3O− CLUSTERS
+D8S5YNWF https://hdl.handle.net/2142/116854 ZINC OXIDE ELECTRONIC STRUCTURE STUDY USING PES
+TF7VP7QQ https://pubs.acs.org/doi/10.1021/acs.jpca.1c04253 Lanthanide Oxides: From Diatomics to High-Spin, Strongly Correlated Homo- and Heterometallic Clusters
+LGICC6XC https://pubs.acs.org/doi/10.1021/acs.jpca.3c04327 Trend in the Electron Affinities of Fluorophenyl Radicals ·C6 H5-x Fx (1 ≤ x ≤ 4)
+TNTHZ7UH https://pubs.acs.org/doi/10.1021/acs.jpca.3c04016 Anion Photoelectron Imaging Spectroscopy of C6 HF5– , C6 F6– , and the Absence of C6 H2 F4–
+F8X88Y82 https://pubs.acs.org/doi/10.1021/jacs.4c00556 Isomer-Dependent Electron Affinities of Fluorophenyl Radicals,• C6 H 5– x Fx (2 ≤ x ≤ 4)
+6MVEWKRD http://link.springer.com/10.1007/11960669_14 An Approximate de Bruijn Graph Approach to Multiple Local Alignment and Motif Discovery in Protein Sequences
+Z2ULVPFV https://linkinghub.elsevier.com/retrieve/pii/S1054139X14007137 Feasibility of Functional Neuroimaging to Understand Adolescent Women's Sexual Decision Making
+SP32F32J https://linkinghub.elsevier.com/retrieve/pii/S0028393223002294 Neural segregation and integration of sensory, decision, and action processes during object categorization
+KSIWJDFH https://link.springer.com/10.1007/s11682-020-00308-4 Neural Modulation in Approach-Avoidance Conflicts in Externalizing Psychopathology
+7ENA3AV2 https://link.springer.com/10.1007/s00213-021-05815-w Neural mechanisms of sexual decision-making in women with alcohol use disorder
+2V8ECPYB https://onlinelibrary.wiley.com/doi/10.1111/adb.12121 Neural mechanisms of high‐risk decisions‐to‐drink in alcohol‐dependent women
+9C8H3ZT2 https://journals.sagepub.com/doi/10.1089/brain.2023.0048 Increased Segregation in Functional Connectivity Networks When Watching Unpleasant Arousing Videos: A Generalized Psychophysiological Interaction Analysis
+SB2JA9JP https://journals.lww.com/10.1249/01.mss.0000875844.04195.62 Test-retest Reliability And Efficacy Of Individual Symptoms In Concussion Management: 266
+75TA2EQI https://linkinghub.elsevier.com/retrieve/pii/S2213158224000858 Diffusion tensor analysis of white matter tracts is prognostic of persisting post-concussion symptoms in collegiate athletes
+IESRG7KY https://www.nature.com/articles/s41592-024-02237-2 brainlife.io: a decentralized and open-source cloud platform to support neuroscience research
+4G98B36J https://rmets.onlinelibrary.wiley.com/doi/10.1002/gdj3.188 A convection‐permitting dynamically downscaled dataset over the Midwestern United States
+VVWXJ9BS https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL104417 Quantifying the Efficiency of Stratospheric Aerosol Geoengineering at Different Altitudes
+A4I3LHP2 https://pnas.org/doi/full/10.1073/pnas.2202230119 Scenarios for modeling solar radiation modification
+QXT8H9MS https://aacrjournals.org/cancerres/article/84/2/276/733116/HSF1-Inhibits-Antitumor-Immune-Activity-in-Breast HSF1 Inhibits Antitumor Immune Activity in Breast Cancer by Suppressing CCL5 to Block CD8+ T-cell Recruitment
+RFEVMZ9I https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL107702 The Potential of Stratospheric Aerosol Injection to Reduce the Climatic Risks of Explosive Volcanic Eruptions
+5SFQP6JE https://esd.copernicus.org/articles/13/201/2022/ How large is the design space for stratospheric aerosol geoengineering?
+F3IPE5YE https://acp.copernicus.org/articles/23/13665/2023/ Injection strategy – a driver of atmospheric circulation and ozone response to stratospheric aerosol geoengineering
+KT4SR94P http://journals.ametsoc.org/doi/10.1175/JCLI-D-15-0439.1 The Influence of Climate Model Biases on Projections of Aridity and Drought
+WW73F5I9 https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2016GL069121 Impacts of recent climate change on trends in baseflow and stormflow in United States watersheds
+8V9PH5UA https://linkinghub.elsevier.com/retrieve/pii/S0034425716301900 Mapping spatial distribution and biomass of coastal wetland vegetation in Indonesian Papua by combining active and passive remotely sensed data
+3CIMJ8Z9 https://www.tandfonline.com/doi/full/10.1080/01431161.2016.1183834 Revisiting empirical ocean-colour algorithms for remote estimation of chlorophyll- a content on a global scale
+9VN8FZ58 https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2015GL064593 Revisiting the recent California drought as an extreme value
+6KSB4P49 https://linkinghub.elsevier.com/retrieve/pii/S0167715218303407 Intrinsic random functions on the sphere
+ATWBQ2RK https://rmets.onlinelibrary.wiley.com/doi/10.1002/joc.2419 A refined index of model performance
+ZYJG94PS https://linkinghub.elsevier.com/retrieve/pii/S2212095521001929 Climate change impacts and urban green space adaptation efforts: Evidence from U.S. municipal parks and recreation departments
+MDNR758E https://linkinghub.elsevier.com/retrieve/pii/S0022169421010222 Incorporating rain-on-snow into the SWAT model results in more accurate simulations of hydrologic extremes
+FPEQ2TUA https://rmets.onlinelibrary.wiley.com/doi/10.1002/gdj3.188 A convection‐permitting dynamically downscaled dataset over the Midwestern United States
+HQJ87CKJ https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020GL088337 Seasonally Modulated Stratospheric Aerosol Geoengineering Alters the Climate Outcomes
+XHKGTQBI https://dl.acm.org/doi/10.1145/3491418.3535171 HPC Data Analysis Pipeline for Neuronal Cluster Detection
+KWS3SIKG https://onlinelibrary.wiley.com/doi/10.1002/ajpa.24712 Updated imaging and phylogenetic comparative methods reassess relative temporal lobe size in anthropoids and modern humans
+222R4ZNY https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020JD033952 Is Turning Down the Sun a Good Proxy for Stratospheric Sulfate Geoengineering?
+D8DHDUHW https://academic.oup.com/zoolinnean/article/199/3/567/7226103 Notes from the Anatolian underground: two new mole taxa from Eastern Turkey, together with a revised phylogeny of the genus Talpa (Mammalia: Eulipotyphla: Talpidae)
+BS4PMN9P https://acp.copernicus.org/articles/23/687/2023/ Climate response to off-equatorial stratospheric sulfur injections in three Earth system models – Part 2: Stratospheric and free-tropospheric response
+85LUQ656 https://linkinghub.elsevier.com/retrieve/pii/S0167278915000573 Continuous data assimilation for the 2D Bénard convection through velocity measurements alone
+NY4LTIPP https://www.aimsciences.org//article/doi/10.3934/jcd.2019006 Numerical efficacy study of data assimilation for the 2D magnetohydrodynamic equations
+RIFUU65J https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL094058 Sensitivity of Total Column Ozone to Stratospheric Sulfur Injection Strategies
+4QFBKZ3H https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL092696 High‐Latitude Stratospheric Aerosol Geoengineering Can Be More Effective if Injection Is Limited to Spring
+YJF639VJ https://asmedigitalcollection.asme.org/computationalnonlinear/article/doi/10.1115/1.4002088/465846/Numerical-Techniques-for-Approximating-Lyapunov Numerical Techniques for Approximating Lyapunov Exponents and Their Implementation
+62J5WZUB https://academic.oup.com/biometrics/article/79/4/3294/7587573 Bayesian Functional Data Analysis Over Dependent Regions and Its Application for Identification of Differentially Methylated Regions
+DWAMQRCB https://journals.sagepub.com/doi/10.1177/1545968315584004 Dynamic Changes in White Matter Abnormalities Correlate With Late Improvement and Deterioration Following TBI: A Diffusion Tensor Imaging Study
+XXEA92HG https://www.nature.com/articles/s41598-020-78780-7 Impact of tumor-parenchyma biomechanics on liver metastatic progression: a multi-model approach
+Q8J39MXB https://gigabytejournal.com/articles/22 DAPT: A package enabling distributed automated parameter testing
+SKIXTKX5 https://gmd.copernicus.org/articles/17/2583/2024/ G6-1.5K-SAI: a new Geoengineering Model Intercomparison Project (GeoMIP) experiment integrating recent advances in solar radiation modification studies
+GQ2UL4YI https://dl.acm.org/doi/10.1145/3588983.3596679 HQ-Sim: High-performance State Vector Simulation of Quantum Circuits on Heterogeneous HPC Systems
+IDCXUSU6 https://dl.acm.org/doi/10.1145/3624062.3624217 MEMQSim: Highly Memory-Efficient and Modularized Quantum State-Vector Simulation
+RKSUYQF3 https://dl.acm.org/doi/10.1145/3624062.3624257 Benchmarking and In-depth Performance Study of Large Language Models on Habana Gaudi Processors
+TAW4DGG5 https://dl.acm.org/doi/10.1145/3624062.3625123 Analyzing Impact of Data Reduction Techniques on Visualization for AMR Applications Using AMReX Framework
+2KRWQR2F https://pubs.acs.org/doi/10.1021/acs.jpca.3c03738 Electronic Structure of Heteronuclear Cerium-Platinum Clusters
+538T87A3 https://ideals.illinois.edu/handle/2142/107392 PROBING THE EFFECTS OF ELECTRON CORRELATION: THE NOT-SO-SIMPLE CASE OF Gd2O
+GET2MA83 https://hdl.handle.net/2142/116827 A SPECTROSCOPIC INVESTIGATION OF THE EFFECTS OF SPIN STRAIN ON LN3O− CLUSTERS
+DIQM7U4A https://hdl.handle.net/2142/116854 ZINC OXIDE ELECTRONIC STRUCTURE STUDY USING PES
+LC7XJ23I https://rmets.onlinelibrary.wiley.com/doi/10.1002/joc.7391 Impact of solar geoengineering on temperatures over the Indonesian Maritime Continent
+GV8GY7L2 https://pubs.acs.org/doi/10.1021/acs.jpca.1c04253 Lanthanide Oxides: From Diatomics to High-Spin, Strongly Correlated Homo- and Heterometallic Clusters
+GVMR455K https://pubs.acs.org/doi/10.1021/acs.jpca.3c04327 Trend in the Electron Affinities of Fluorophenyl Radicals ·C6 H5-x Fx (1 ≤ x ≤ 4)
+WTFLUMS5 https://pubs.acs.org/doi/10.1021/acs.jpca.3c04016 Anion Photoelectron Imaging Spectroscopy of C6 HF5– , C6 F6– , and the Absence of C6 H2 F4–
+7ZKLGHN8 https://pubs.acs.org/doi/10.1021/jacs.4c00556 Isomer-Dependent Electron Affinities of Fluorophenyl Radicals,• C6 H 5– x Fx (2 ≤ x ≤ 4)
+Q8W43HK8 http://link.springer.com/10.1007/11960669_14 An Approximate de Bruijn Graph Approach to Multiple Local Alignment and Motif Discovery in Protein Sequences
+47TZWZQW https://linkinghub.elsevier.com/retrieve/pii/S1054139X14007137 Feasibility of Functional Neuroimaging to Understand Adolescent Women's Sexual Decision Making
+ZYNDCPBL https://linkinghub.elsevier.com/retrieve/pii/S0028393223002294 Neural segregation and integration of sensory, decision, and action processes during object categorization
+D82YEZKL https://link.springer.com/10.1007/s11682-020-00308-4 Neural Modulation in Approach-Avoidance Conflicts in Externalizing Psychopathology
+VZSM6MJP https://link.springer.com/10.1007/s00213-021-05815-w Neural mechanisms of sexual decision-making in women with alcohol use disorder
+U4KW3XMS https://onlinelibrary.wiley.com/doi/10.1111/adb.12121 Neural mechanisms of high‐risk decisions‐to‐drink in alcohol‐dependent women
+3B8BIZBI https://journals.sagepub.com/doi/10.1089/brain.2023.0048 Increased Segregation in Functional Connectivity Networks When Watching Unpleasant Arousing Videos: A Generalized Psychophysiological Interaction Analysis
+WFZ9TKBN https://journals.lww.com/10.1249/01.mss.0000875844.04195.62 Test-retest Reliability And Efficacy Of Individual Symptoms In Concussion Management: 266
+JNN55XPG https://linkinghub.elsevier.com/retrieve/pii/S2213158224000858 Diffusion tensor analysis of white matter tracts is prognostic of persisting post-concussion symptoms in collegiate athletes
+ZK7SS28X https://esd.copernicus.org/articles/11/1051/2020/ Expanding the design space of stratospheric aerosol geoengineering to include precipitation-based objectives and explore trade-offs
+AK5AQ7PP https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020GL089470 Reduced Poleward Transport Due to Stratospheric Heating Under Stratospheric Aerosols Geoengineering
+XHR98RMP https://www.nature.com/articles/s41598-021-89249-6 Response of the Indian summer monsoon to global warming, solar geoengineering and its termination
+3DFWX8M5 https://www.nature.com/articles/s41592-024-02237-2 brainlife.io: a decentralized and open-source cloud platform to support neuroscience research
+NFGCKY5V http://www.emerald.com/ijccsm/article/14/4/399-423/123536 Influence of stratospheric aerosol geoengineering on temperature mean and precipitation extremes indices in Africa
+SNQIRHM3 https://www.nature.com/articles/s41592-024-02296-5 Author Correction: brainlife.io: a decentralized and open-source cloud platform to support neuroscience research
+XV56YQ64 https://bjsm.bmj.com/lookup/doi/10.1136/bjsports-2023-concussion.279 6.1 Predicting the time to return to play and persistent post concussion symptoms utilizing machine learning of behavior and diffusion weighted MR imaging: findings from the NCAA/DOD CARE consortium
+69WJSJAU https://acp.copernicus.org/articles/21/1287/2021/ North Atlantic Oscillation response in GeoMIP experiments G6solar and G6sulfur: why detailed modelling is needed for understanding regional implications of solar radiation management
+87RYSBNF https://acp.copernicus.org/articles/21/8845/2021/ Harnessing stratospheric diffusion barriers for enhanced climate geoengineering
+AXAQ2FF4 https://bjsm.bmj.com/lookup/doi/10.1136/bjsports-2023-concussion.293 6.15 Protective and risk factors for persistent post concussion symptoms and return to play of NCAA collegiate athletes: findings from the NCAA-DOD CARE consortium
+QA35BRVJ https://linkinghub.elsevier.com/retrieve/pii/S0048969722079098 Implication of stratospheric aerosol geoengineering on compound precipitation and temperature extremes in Africa
+3RKL53R2 https://bjsm.bmj.com/lookup/doi/10.1136/bjsports-2023-concussion.90 7.2 A deep learning neural network predicts return-to-play time-point groups utilizing the vestibular/ocular-motor screening and SCAT3: an NCAA-DoD CARE consortium analysis
+3XDI2KPH https://iopscience.iop.org/article/10.3847/1538-4357/acb434 New Parameters for Star Cluster Dynamics: The Effect of Primordial Binaries and Dark Remnants
+AAJJPQR8 https://www.nature.com/articles/s41612-022-00254-6 Changes in Hadley circulation and intertropical convergence zone under strategic stratospheric aerosol geoengineering
+BP6JPQFF https://iopscience.iop.org/article/10.3847/1538-4357/ad3dec New Parameters for Star Cluster Dynamics: The Role of Clusters’ Initial Conditions
+FA5HQ5LF https://acp.copernicus.org/articles/23/663/2023/ Climate response to off-equatorial stratospheric sulfur injections in three Earth system models – Part 1: Experimental protocols and surface changes
+M753UEK2 https://iopscience.iop.org/article/10.1088/1748-9326/abacf7 Assessing terrestrial biogeochemical feedbacks in a strategically geoengineered climate
+VNJBXNBX https://ieeexplore.ieee.org/document/10821233/ Entangled Meanings: Classification and Ambiguity Resolution in QNLP
+S4I4HFS8 https://ieeexplore.ieee.org/document/10821048/ Semantic Similarities Using Classical Embeddings in Quantum NLP
+D2TQLTTU https://ieeexplore.ieee.org/document/10821150/ Entangled Meanings: Classification and Ambiguity Resolution in Near-Term QNLP
+E3PLAXKH https://linkinghub.elsevier.com/retrieve/pii/S0167278918300599 Turbulence in vertically averaged convection
+UDGIEIYH https://iopscience.iop.org/article/10.1088/1361-6544/abb1c6 Algebraic bounds on the Rayleigh–Bénard attractor
+XFXX72DV https://esd.copernicus.org/articles/13/1233/2022/ Indices of extremes: geographic patterns of change in extremes and associated vegetation impacts under climate intervention
+CWDYSJNK https://epubs.siam.org/doi/10.1137/20M136058X Data Assimilation for the Navier--Stokes Equations Using Local Observables
+YGNPQGUI https://onlinelibrary.wiley.com/doi/10.1002/fld.5152 Data assimilation with higher order finite element interpolants
+RH62H5BR https://www.aimsciences.org//article/doi/10.3934/dcds.2023078 Convergence of a mobile data assimilation scheme for the 2D Navier-Stokes equations
+33DVUR7Z https://iopscience.iop.org/article/10.1088/1361-648X/accd38 Metal–insulator transition in composition-tuned nickel oxide films
+JXV8BUV4 https://pubs.acs.org/doi/10.1021/om401221v Iridium-Promoted, Palladium-Catalyzed Direct Arylation of Unactivated Arenes
+9MDYIGVW https://www.nature.com/articles/ncomms8789 Engineering a dirhodium artificial metalloenzyme for selective olefin cyclopropanation
+MA7Y8XI8 https://linkinghub.elsevier.com/retrieve/pii/S2667109322003463 Analysis of laboratory-evolved flavin-dependent halogenases affords a computational model for predicting halogenase site selectivity
+8XWTKDWM https://acp.copernicus.org/articles/22/2999/2022/ The impact of stratospheric aerosol intervention on the North Atlantic and Quasi-Biennial Oscillations in the Geoengineering Model Intercomparison Project (GeoMIP) G6sulfur experiment
+4XXCQL72 https://pubs.acs.org/doi/10.1021/jacs.2c07422 Directed Evolution of Flavin-Dependent Halogenases for Site- and Atroposelective Halogenation of 3-Aryl-4(3 H )-Quinazolinones via Kinetic or Dynamic Kinetic Resolution
+SH3EIFDX https://pubs.acs.org/doi/10.1021/acscatal.2c03383 Expanding the Reactivity of Flavin-Dependent Halogenases toward Olefins via Enantioselective Intramolecular Haloetherification and Chemoenzymatic Oxidative Rearrangements
+3BB7ZBTN https://pubs.acs.org/doi/10.1021/acs.chemrev.3c00215 Non-Native Site-Selective Enzyme Catalysis
+D57YR9CX https://rmets.onlinelibrary.wiley.com/doi/10.1002/joc.8668 A Multiscalar Standardized Vapor Pressure Deficit Index for Drought Monitoring and Impacts
+T54ZZYPX https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022EF003052 High‐Latitude Stratospheric Aerosol Injection to Preserve the Arctic
+WR2DLD7F https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL104726 Potential Non‐Linearities in the High Latitude Circulation and Ozone Response to Stratospheric Aerosol Injection
+S6JHGMNQ https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022GL098773 The Overlooked Role of the Stratosphere Under a Solar Constant Reduction
+YP2PY43M https://acp.copernicus.org/articles/23/5149/2023/ Opinion: The scientific and community-building roles of the Geoengineering Model Intercomparison Project (GeoMIP) – past, present, and future
+Q2GSMWGL https://acp.copernicus.org/articles/21/4231/2021/ Comparing different generations of idealized solar geoengineering simulations in the Geoengineering Model Intercomparison Project (GeoMIP)
+J44YF2VC https://acp.copernicus.org/articles/22/1739/2022/ Limitations of assuming internal mixing between different aerosol species: a case study with sulfate geoengineering simulations
+VJIDUJY5 https://acp.copernicus.org/articles/22/5757/2022/ An approach to sulfate geoengineering with surface emissions of carbonyl sulfide
+7NUQDYEZ http://link.springer.com/10.1007/s00021-019-0478-6 Tracer Turbulence: The Batchelor–Howells–Townsend Spectrum Revisited
+FJV92TQC https://jov.arvojournals.org/article.aspx?articleid=2792416 The statistics of infants’ natural visual experience are shaped by motor development.
+WMJ4GW36 https://iopscience.iop.org/article/10.3847/2041-8213/ad0fea TOI-1670 c, a 40 day Orbital Period Warm Jupiter in a Compact System, Is Well Aligned
+3ZCZLY84 https://linkinghub.elsevier.com/retrieve/pii/S1053811909012889 Neural processing of asynchronous audiovisual speech perception
+TNUDY4P8 https://iopscience.iop.org/article/10.3847/1538-3881/ad09de Evidence for Low-level Dynamical Excitation in Near-resonant Exoplanet Systems*
+J928YRG2 https://jov.arvojournals.org/article.aspx?articleid=2749967 Alcoholic drink preferences modulate acquired salience
+3UCF7A9E https://linkinghub.elsevier.com/retrieve/pii/S0741832918300922 Risky drinking decisions: The influence of party music and alcohol abuse in young adult women
+UHZFV8TX http://biorxiv.org/lookup/doi/10.1101/2024.04.27.591458 xSiGra: Explainable model for single-cell spatial data elucidation
+3RTXE55N https://www.aanda.org/10.1051/0004-6361/202450270 Dynamics of star clusters with tangentially anisotropic velocity distribution
+QMNAKG2K https://pos.sissa.it/453/292 Update on the gradient flow scale on the 2+1+1 HISQ ensembles
+97ZH4FDW https://direct.mit.edu/artl/article/22/2/153-171/2832 Exploring the Space of Viable Configurations in a Model of Metabolism–Boundary Co-construction
+2EELEG3J https://linkinghub.elsevier.com/retrieve/pii/S0959438816300691 The whole worm: brain–body–environment models of C. elegans
+RY9AI325 https://pubs.aip.org/cha/article/27/11/111104/136041/Computing-aggregate-properties-of-preimages-for-2D Computing aggregate properties of preimages for 2D cellular automata
+3EN43KY7 https://www.frontiersin.org/articles/10.3389/fncom.2021.572339/full A Neuromechanical Model of Multiple Network Rhythmic Pattern Generators for Forward Locomotion in C. elegans
+234T9V7T https://link.aps.org/doi/10.1103/PhysRevD.107.114514 Light-quark connected intermediate-window contributions to the muon g − 2 hadronic vacuum polarization from lattice QCD
+8DHUHZPZ https://link.springer.com/10.1007/s00422-022-00938-5 Codimension-2 parameter space structure of continuous-time recurrent neural networks
+IH698IZI https://linkinghub.elsevier.com/retrieve/pii/S0303264722002040 The theoretical foundations of enaction: Precariousness
+FDDHZLL4 https://onlinelibrary.wiley.com/doi/10.1111/tops.12686 On the Proper Treatment of Dynamics in Cognitive Science
+VD8YTXPY https://onlinelibrary.wiley.com/doi/10.1111/cogs.12142 Information Processing and Dynamics in Minimally Cognitive Agents
+XKUV28NH https://direct.mit.edu/artl/article/21/1/1-19/2792 Characterizing Autopoiesis in the Game of Life
+IY5FYZRY https://journals.sagepub.com/doi/10.1177/1059712310363163 Fitness Space Structure of a Neuromechanical System
+PHTENJMV https://dx.plos.org/10.1371/journal.pcbi.1002890 Connecting a Connectome to Behavior: An Ensemble of Neuroanatomical Models of C. elegans Klinotaxis
+964HCSBP http://link.springer.com/10.1007/s00359-006-0124-7 Mechanical reconfiguration mediates swallowing and rejection in Aplysia californica
+XFHK93PX http://link.springer.com/10.1007/s00422-004-0517-z Neural control exploits changing mechanical advantage and context dependence to generate different feeding responses in Aplysia
+KI3QQBZ5 https://onlinelibrary.wiley.com/doi/10.1111/j.1525-142X.2008.00245.x Developmental bias in evolution: evolutionary accessibility of phenotypes in a model evo‐devo system
+7AZ7P2MY https://ieeexplore.ieee.org/document/1650256/ Design and Implementation of Multipattern Generators in Analog VLSI
+WJZMP4R5 http://www.scholarpedia.org/article/Computational_neuroethology Computational neuroethology
+R4RUXHGU http://link.springer.com/10.1007/978-3-642-15193-4_4 Information Dynamics of Evolved Agents
+X9KMD7V5 http://link.springer.com/10.1007/978-3-642-15193-4_52 The Dependence of Braking Strategies on Optical Variables in an Evolved Model of Visually-Guided Braking
+PFVSY2F9 https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-33936-0-ch087 Propagation of rhythmic dorsoventral wave in a neuromechanical model of locomotion in Caernohabditis elegans
+XBKCNGTG https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_008 Structural coupling of a Potts model cell
+HP84LXIW https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_040 An evolutionary robotics model of visually-guided braking: Testing optical variables
+QL6RMBIR https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_00019 On the Origin of Gliders
+RSZ8EUND https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_00598 The Sun Always Rises: Behavioral Attunement to Abiotic Reins
+CSYTB5MR https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_00599 Characterizing the Role of Homeostatic Plasticity in Central Pattern Generators
+GVB77BE3 https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-31709-2-ch008 Analysis of Ultrastability in Small Dynamical Recurrent Neural Networks
+4AZPN8JL https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-31709-2-ch041 Environmental Feedback Drives Multiple Behaviors from the Same Neural Circuit
+VZWCJWDA https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-32621-6-ch082 Quantifying Robustness in a Spatial Model of Metabolism-Boundary Co-Construction
+LIGLXN9Z https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-33027-5-ch040 An Integrated Neuromechanical Model of Steering in C. elegans
+CBFMK6M3 https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-33027-5-ch043 Ontogeny and adaptivity in a model protocell
+MA5VKHHH https://direct.mit.edu/isal/article-abstract/doi/10.1162/978-0-262-33936-0-ch087 Propagation of rhythmic dorsoventral wave in a neuromechanical model of locomotion in Caernohabditis elegans
+YV78PM4L https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_00738 Deriving Community Models with Evolutionary Robotics: A Case Study of Sensory Pollution
+8F8PNR8Y https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-31709-2-ch008 Analysis of Ultrastability in Small Dynamical Recurrent Neural Networks
+GPF2RINC https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-31709-2-ch041 Environmental Feedback Drives Multiple Behaviors from the Same Neural Circuit
+CTL253KL https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-32621-6-ch082 Quantifying Robustness in a Spatial Model of Metabolism-Boundary Co-Construction
+MTM68RNP https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-33027-5-ch043 Ontogeny and adaptivity in a model protocell
+TVGCFZAD https://www.mitpressjournals.org/doi/abs/10.1162/978-0-262-33027-5-ch040 An Integrated Neuromechanical Model of Steering in C. elegans
+5ST5DJKI https://pnas.org/doi/full/10.1073/pnas.2202230119 Scenarios for modeling solar radiation modification
+ZRIA3SC3 https://gmd.copernicus.org/articles/8/3379/2015/gmd-8-3379-2015-discussion.html The Geoengineering Model Intercomparison Project Phase 6 (GeoMIP6): simulation design and preliminary results
+QPFSJ7FS https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2013JD020569 An overview of the Geoengineering Model Intercomparison Project (GeoMIP)
+BXE3T2EV https://onlinelibrary.wiley.com/doi/10.1111/mmi.15122 Negative regulation of MurZ and MurA underlies the essentiality of GpsB ‐ and StkP ‐mediated protein phosphorylation in Streptococcus pneumoniaeD39
+2TJBRVQS https://www.journals.uchicago.edu/doi/10.1086/716197 Tracking Public and Private Responses to the COVID-19 Epidemic: Evidence from State and Local Government Actions
+YB8H5DHJ https://dx.plos.org/10.1371/journal.pbio.3003015 Unprecedented female mutation bias in the aye-aye, a highly unusual lemur from Madagascar
+FWRQGC4W https://onlinelibrary.wiley.com/doi/10.1002/fld.5152 Data assimilation with higher order finite element interpolants
+2IBKCB9X https://linkinghub.elsevier.com/retrieve/pii/S1468121822000839 Continuous data assimilation for the 3D Ladyzhenskaya model: analysis and computations
+GQMZWQKB https://linkinghub.elsevier.com/retrieve/pii/S0021999122004570 Continuous data assimilation for two-phase flow: Analysis and simulations
+IER2DDP9 https://peerj.com/articles/cs-38 Measuring online social bubbles
+XNGUW3TW https://www.mdpi.com/2072-6694/15/17/4411 Genetic Regulation of Human isomiR Biogenesis
+EU3T36ER https://dl.acm.org/doi/10.1145/2818717 The rise of social bots
+NXFHQIA2 https://peerj.com/articles/cs-87 OSoMe: the IUNI observatory on social media
+QAWUFFDU https://link.aps.org/doi/10.1103/PhysRevE.98.042304 Weight thresholding on complex networks
+HIYJ9EUX https://asistdl.onlinelibrary.wiley.com/doi/10.1002/asi.24121 Quantifying Biases in Online Information Exposure
+JINGMWHW https://direct.mit.edu/qss/article/1/3/1298-1308/96112 Recency predicts bursts in the evolution of author citations
+NZTA3W9E https://link.aps.org/doi/10.1103/PhysRevResearch.2.033171 Classes of critical avalanche dynamics in complex networks
+Y9BBHA6D https://epjdatascience.springeropen.com/articles/10.1140/epjds/s13688-023-00410-9 A language framework for modeling social media account behavior
+S6TBC5T6 http://link.springer.com/10.1007/s13278-014-0237-x Clustering memes in social media streams
+HH59QIQV https://www.nature.com/articles/nphys209 Detecting rich-club ordering in complex networks
+G9IP3QF9 https://dl.acm.org/doi/10.1145/2872518.2889302 BotOrNot: A System to Evaluate Social Bots
+PTCAZUHU http://dl.acm.org/citation.cfm?doid=2872518.2890098 Hoaxy: A Platform for Tracking Online Misinformation
+DNGWEZUI https://dl.acm.org/doi/10.1145/3366424.3385775 Unveiling Coordinated Groups Behind White Helmets Disinformation
+K4NJ58GC http://biorxiv.org/lookup/doi/10.1101/2023.11.04.565623 Exploring building blocks of cell organization by estimating network motifs using graph isomorphism network
+DSJBXVPF https://dl.acm.org/doi/10.1145/2997657 Mining for Topics to Suggest Knowledge Model Extensions
+RT8QIUZB http://biorxiv.org/lookup/doi/10.1101/2024.05.06.592851 scBSP: A fast and accurate tool for identifying spatially variable genes from spatial transcriptomic data
+WUAKBDZB http://biorxiv.org/lookup/doi/10.1101/2023.11.09.566479 Exploring the Mosaic-like Tissue Architecture of Kidney Diseases Using Relation Equivariant Graph Neural Networks on Spatially Resolved Transcriptomics
+537RJ5BY https://www.eneuro.org/lookup/doi/10.1523/ENEURO.0385-23.2024 Proactive Versus Reactive Control Strategies Differentially Mediate Alcohol Drinking in Male Wistars and P Rats
+RA8HDPW6 https://www.nature.com/articles/s41467-022-31731-4 Compulsive alcohol drinking in rodents is associated with altered representations of behavioral control and seeking in dorsal medial prefrontal cortex
+H2RFIBRM http://www.epjdatascience.com/content/5/1/5 Women through the glass ceiling: gender asymmetries in Wikipedia
+2FIBCL25 http://biorxiv.org/lookup/doi/10.1101/2023.06.15.545101 Flexible coding schemes in dorsomedial prefrontal cortex underlie decision-making during delay discounting
+WIYEF4WK https://onlinelibrary.wiley.com/doi/10.1609/aimag.v29i3.2155 Intelligent Peer Networks for Collaborative Web Search
+BFRGXES7 https://www.jneurosci.org/lookup/doi/10.1523/JNEUROSCI.1490-23.2023 Neural activity in anterior insula at drinking onset and licking relates to compulsion-like alcohol consumption
+KPP5Q5MQ https://dx.plos.org/10.1371/journal.pone.0279841 Distinct cortico-striatal compartments drive competition between adaptive and automatized behavior
+9DXTHU36 https://onlinelibrary.wiley.com/doi/10.1609/aimag.v38i4.2772 Reports of the Workshops Held at the 2017 International AAAI Conference on Web and Social Media
+FG4G548A https://academic.oup.com/cercor/article/doi/10.1093/cercor/bhae172/7658636 Longitudinal MRI of the developing ferret brain reveals regional variations in timing and rate of growth
+FXIPAPB4 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020JD033746 Constraining and Characterizing the Size of Atmospheric Rivers: A Perspective Independent From the Detection Algorithm
+7UKRF5BP https://ieeexplore.ieee.org/document/8248802/ Ultra High-Dimensional Nonlinear Feature Selection for Big Biological Data
+7DE5HEKS https://www.nature.com/articles/s41467-021-25738-6 Neutral bots probe political bias on social media
+NTQ326KE https://gmd.copernicus.org/articles/17/301/2024/ Scalable Feature Extraction and Tracking (SCAFET): a general framework for feature extraction from large climate data sets
+NLFEUFPW https://www.nature.com/articles/s41467-021-27855-8 Publisher Correction: Neutral bots probe political bias on social media
+WX3NR4ZA https://www.nature.com/articles/srep02522 Virality Prediction and Community Structure in Social Networks
+82PFWKC7 https://link.springer.com/10.1007/s42001-022-00177-5 Botometer 101: social bot practicum for computational social scientists
+DA69QJCH https://peerj.com/articles/cs-1025 How Twitter data sampling biases U.S. voter behavior characterizations
+M6B2HCN7 https://ojs.aaai.org/index.php/ICWSM/article/view/7370 BotSlayer: DIY Real-Time Influence Campaign Detection
+9SYESS76 https://ojs.aaai.org/index.php/ICWSM/article/view/18122 CoVaxxy: A Collection of English-Language Twitter Posts About COVID-19 Vaccines
+MMHZRBXI https://ojs.aaai.org/index.php/ICWSM/article/view/19354 The Manufacture of Partisan Echo Chambers by Follow Train Abuse on Twitter
+TFE78RJU https://infodemiology.jmir.org/2023/1/e44207 Measuring the Burden of Infodemics: Summary of the Methods and Results of the Fifth WHO Infodemic Management Conference
+M3QECT4P https://dl.acm.org/doi/10.1145/1944339.1944342 Properties and Evolution of Internet Traffic Networks from Anonymized Flow Data
+BY52DBKU https://dl.acm.org/doi/10.1145/2037676.2037689 Contextual tag inference
+88RSD3SQ https://dl.acm.org/doi/10.1145/2180861.2180866 Friendship prediction and homophily in social media
+49MPBUX8 https://journals.ametsoc.org/view/journals/clim/35/12/JCLI-D-21-0590.1.xml Exploratory Precipitation Metrics: Spatiotemporal Characteristics, Process-Oriented, and Phenomena-Based
+TWDWXJJM https://dx.plos.org/10.1371/journal.pone.0043235 Scholarometer: A Social Framework for Analyzing Impact across Disciplines
+TFT5ZPUB https://dx.plos.org/10.1371/journal.pone.0118410 Topicality and Impact in Social Media: Diverse Messages, Focused Messengers
+FZCAIQIH https://dl.acm.org/doi/10.1145/2389661.2389663 The diffusion of political memes in social media: keynote abstract
+I7XVFJAX https://dl.acm.org/doi/10.1145/2441955.2441962 Truthy: enabling the study of online social networks
+3KJ4A3XT https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL095335 Extreme Water Vapor Transport During the March 2021 Sydney Floods in the Context of Climate Projections
+EBFHU38J https://dl.acm.org/doi/10.1145/2872518.2890092 The Spread of Misinformation in Social Media
+UL5P6DG5 https://link.springer.com/10.1007/978-3-319-47874-6_19 On the Influence of Social Bots in Online Protests: Preliminary Findings of a Mexican Case Study
+XQSRUFIS https://dl.acm.org/doi/10.1145/3308560.3316499 Bot Electioneering Volume: Visualizing Social Bot Activity During Elections
+9WU9RYBY https://www.researchsquare.com/article/rs-2038838/v1 Anthropogenic aerosols mask increases in US rainfall by greenhouse gases
+CZSIBF2C https://ieeexplore.ieee.org/document/10068635/ Ukraine as a Political Tool in Facebook Sponsored Content
+W6WKFJ4G https://aclanthology.org/2024.findings-naacl.64 REMATCH: Robust and Efficient Matching of Local Knowledge Graphs to Improve Structural and Semantic Similarity
+RRS952DV https://www.nature.com/articles/s41467-018-06930-7 The spread of low-credibility content by social bots
+RJDT87SK https://link.springer.com/10.1007/s00382-021-05638-7 Quantifying the influence of natural climate variability on in situ measurements of seasonal total and extreme daily precipitation
+MJ433T6R https://onlinelibrary.wiley.com/doi/10.1002/hbe2.115 Arming the public with artificial intelligence to counter social bots
+6JLX8JWJ https://www.nature.com/articles/s41598-022-10070-w Online misinformation is linked to early COVID-19 vaccination hesitancy and refusal
+F6I7M4QP https://dl.acm.org/doi/10.1145/3340531.3412698 Detection of Novel Social Bots by Ensembles of Specialized Classifiers
+3VR2RZBD https://gmd.copernicus.org/articles/17/3533/2024/ Identifying atmospheric rivers and their poleward latent heat transport with generalizable neural networks: ARCNNv1
+R5ECG53F https://joss.theoj.org/papers/10.21105/joss.01706 BotSlayer: real-time detection of bot amplification on Twitter
+MUH7SEAZ https://ojs.aaai.org/index.php/AAAI/article/view/5460 Scalable and Generalizable Social Bot Detection through Data Selection
+AK3Q9KHE https://journals.sagepub.com/doi/10.1177/1461444820942744 Asymmetrical perceptions of partisan political bots
+9BSYBIRE https://www.jmir.org/2023/1/e42227 One Year of COVID-19 Vaccine Misinformation on Twitter: Longitudinal Study
+7B5KSPFW https://www.nature.com/articles/s41598-023-46630-x Exposure to social bots amplifies perceptual biases and regulation propensity
+H9C9R22H https://pnas.org/doi/10.1073/pnas.2322823121 Fact-checking information from large language models can decrease headline discernment
+NL8V8MZ2 https://ojs.aaai.org/index.php/ICWSM/article/view/22205 A Multi-Platform Collection of Social Media Posts about the 2022 U.S. Midterm Elections
+8Y8MVIY2 https://dx.plos.org/10.1371/journal.pone.0302201 Identifying and characterizing superspreaders of low-credibility content on Twitter
+TY4AF24U https://link.springer.com/10.1007/978-3-031-78541-2_26 The Dawn of Decentralized Social Media: An Exploration of Bluesky’s Public Opening
+NL8MWFXD https://ojs.aaai.org/index.php/ICWSM/article/view/18075 Uncovering Coordinated Networks on Social Media: Methods and Case Studies
+CJZMEIXA https://academic.oup.com/pnasnexus/article/doi/10.1093/pnasnexus/pgae258/7701371 Quantifying the vulnerabilities of the online public square to adversarial manipulation tactics
+YT4LE4AJ https://epjdatascience.springeropen.com/articles/10.1140/epjds/s13688-024-00450-9 Account credibility inference based on news-sharing networks
+J6PS4BJL https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022JD037105 Characteristics and Variability of Winter Northern Pacific Atmospheric River Flavors
+S9TMVJYI https://journals.sagepub.com/doi/10.1177/20539517211013861 The COVID-19 Infodemic: Twitter versus Facebook
+7SM9F7A3 https://ojs.aaai.org/index.php/ICWSM/article/view/19355 Manipulating Twitter through Deletions
+PPAMY6W9 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022GL102091 Future Atmospheric Rivers and Impacts on Precipitation: Overview of the ARTMIP Tier 2 High‐Resolution Global Warming Experiment
+I7UI6I5E https://dx.plos.org/10.1371/journal.pone.0196087 Anatomy of an online misinformation network
+973YN44H https://www.nature.com/articles/s41467-024-45504-8 Anthropogenic aerosols mask increases in US rainfall by greenhouse gases
+4MJGI4FL https://appliednetsci.springeropen.com/articles/10.1007/s41109-021-00357-8 On the challenges of predicting microscopic dynamics of online conversations
+ZS3HVKBU https://link.springer.com/10.1007/s00382-022-06321-1 A framework for detection and attribution of regional precipitation change: Application to the United States historical record
+8NJBWR6Q https://ojs.aaai.org/index.php/ICWSM/article/view/14986 The Hoaxy Misinformation and Fact-Checking Diffusion Network
+HDTCGX63 https://linkinghub.elsevier.com/retrieve/pii/S2589004225003645 From initial formation to developmental refinement: GABAergic inputs shape neuronal subnetworks in the primary somatosensory cortex
+SU4N5NB2 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022GL099186 Sign of Observed California Temperature Trends Depends on Data Set Homogenization: Implications for Weighting and Downscaling
+Q2FI67JP https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020JB020833 New Insights Into the Slip Budget at Nankai: An Iterative Approach to Estimate Coseismic Slip and Afterslip
+9HVWR3XF https://journals.sagepub.com/doi/full/10.3233/JAD-231286 Associations Between Neuroinflammation-Related Conditions and Alzheimer’s Disease: A Study of US Insurance Claims Data
+QA2MYB2L https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JB029346 Locating Boundaries Between Locked and Creeping Regions at Nankai and Cascadia Subduction Zones
+KZA4RF9I https://aacrjournals.org/cancerres/article/76/17/4970/613885/Activation-of-the-c-Met-Pathway-Mobilizes-an Activation of the c-Met Pathway Mobilizes an Inflammatory Network in the Brain Microenvironment to Promote Brain Metastasis of Breast Cancer
+UDFMUZHH https://link.springer.com/10.1007/s40264-023-01370-9 Application of an Innovative Data Mining Approach Towards Safe Polypharmacy Practice in Older Adults
+SF57WBRD https://febs.onlinelibrary.wiley.com/doi/10.1111/febs.16375 AKT1 mediates multiple phosphorylation events that functionally promote HSF1 activation
+Z3ICBNTC http://biorxiv.org/lookup/doi/10.1101/2023.12.20.572422 Measure of major contents in animal and plant genomes, using Gnodes, finds under-assemblies of model plant, Daphnia, fire ant and others
+DYDT7SMX http://biorxiv.org/lookup/doi/10.1101/2022.05.13.491861 Genes ruler for genomes, Gnodes, measures assembly accuracy in animals and plants
+62RWLX2P https://peerj.com/articles/6374 Genes of the pig, Sus scrofa , reconstructed with EvidentialGene
+29BF9TLG https://link.springer.com/10.1038/embor.2012.162 Reactive oxygen species regulate ERBB2 and ERBB3 expression via miR‐199a/125b and DNA methylation
+5KALZDSS http://biorxiv.org/lookup/doi/10.1101/829184 Longest protein, longest transcript or most expression, for accurate gene reconstruction of transcriptomes?
+82G2GZQJ https://ieeexplore.ieee.org/document/10271940/ Data-To-Question Generation Using Deep Learning
+FL2PQG66 https://www.nature.com/articles/onc2013582 Akt phosphorylates and activates HSF-1 independent of heat shock, leading to Slug overexpression and epithelial–mesenchymal transition (EMT) of HER2-overexpressing breast cancer cells
+8JRIT6A4 https://www.cambridge.org/core/product/identifier/S2059866123003497/type/journal_article 294 Identification of MCAK Inhibitors that Induce Aneuploidy in Triple Negative Breast Cancer Models
+62B2ZBY5 https://journals.iupui.edu/index.php/IMPRS/article/view/27850 Inhibition of HSF1 as a Mechanism for Overcoming Hsp90 Treatment Resistance
+X4FLCJPP https://aacrjournals.org/cancerres/article/84/5_Supplement_2/B031/734568/Abstract-B031-The-PLK1-inhibitor-Volasertib-as-a Abstract B031: The PLK1 inhibitor Volasertib as a treatment for HSF1 and MYC coamplified ovarian cancer
+CVIIU7IP https://aacrjournals.org/cancerres/article/79/13_Supplement/2602/634546/Abstract-2602-AKT1-mediated-activation-of-HSF1-by Abstract 2602: AKT1-mediated activation of HSF1 by phosphorylation and an association with metastasis-free survival
+IGR5F9RU https://aacrjournals.org/cancerres/article/79/13_Supplement/2602/634546/Abstract-2602-AKT1-mediated-activation-of-HSF1-by Abstract 2602: AKT1-mediated activation of HSF1 by phosphorylation and an association with metastasis-free survival
+UU6VD53C http://www.ssrn.com/abstract=2863094 Firm Scope and the Value of One-Stop Shopping in Washington State's Deregulated Liquor Market
+YRARSLCC https://www.journals.uchicago.edu/doi/10.17310/ntj.2020.2.07 TAXING THE POTENCY OF SIN GOODS: EVIDENCE FROM RECREATIONAL CANNABIS AND LIQUOR MARKETS
+HK9GHS9Q https://ieeexplore.ieee.org/document/10190998/ Representing Latent Dimensions Using Compressed Number Lines
+ENMTQVLZ https://ieeexplore.ieee.org/document/10191578/ Characterizing neural activity in cognitively inspired RL agents during an evidence accumulation task
+SJX9JGR8 https://pubs.acs.org/doi/10.1021/acsami.4c11537 Controlled Vapor–Liquid–Solid Growth of Long and Remarkably Thin Pb 1– x Snx Te Nanowires with Strain-Tunable Ferroelectric Phase Transition
+6I8CZU6V https://pubs.acs.org/doi/10.1021/acsanm.4c01612 Anisotropic Straintronic Transport in Topological Semimetal Nanoflakes
+NA6DV732 https://ieeexplore.ieee.org/document/10142120/ Building and Testing a Network of Social Trust in an Underground Forum: Robust Connections and Overlapping Criminal Domains
+88H2RXM3 https://ieeexplore.ieee.org/document/10190691/ An Argument for Linguistic Expertise in Cyberthreat Analysis: LOLSec in Russian Language eCrime Landscape
+SFMKEIUK https://aclanthology.org/2024.c3nlp-1.9 Computational Language Documentation: Designing a Modular Annotation and Data Management Tool for Cross-cultural Applicability
+E95N5NQS https://linkinghub.elsevier.com/retrieve/pii/S2211124719304346 Disruption in A-to-I Editing Levels Affects C. elegans Development More Than a Complete Lack of Editing
+HE5GB9VK https://www.tandfonline.com/doi/full/10.1080/10409238.2020.1856768 To protect and modify double-stranded RNA – the critical roles of ADARs in development, immunity and oncogenesis
+66LWMI7W https://journals.biologists.com/dev/article/150/18/dev201872/329481/Polycomb-safeguards-imaginal-disc-specification Polycomb safeguards imaginal disc specification through control of the Vestigial–Scalloped complex
+HBJ7E5UL http://biorxiv.org/lookup/doi/10.1101/2024.04.09.588498 Drug-loaded nanoparticles for cancer therapy: a high-throughput multicellular agent-based modeling study
+FZS6E3ZK http://genome.cshlp.org/lookup/doi/10.1101/gr.267575.120 Profiling neural editomes reveals a molecular mechanism to regulate RNA editing during development
+892VGBQ9 http://biorxiv.org/lookup/doi/10.1101/2023.10.17.562733 A multiscale model of immune surveillance in micrometastases: towards cancer patient digital twins
+QLZ8HT8N https://www.nature.com/articles/s41467-024-48484-x Effects of SPI1-mediated transcriptome remodeling on Alzheimer’s disease-related phenotypes in mouse models of Aβ amyloidosis
+847TAP24 http://www.actaphys.uj.edu.pl/findarticle?series=Sup&vol=16&aid=8-A22 Confining Potential in Coulomb-gauge Lattice QCD
+4BZUNGQK https://link.aps.org/doi/10.1103/PhysRevD.108.076001 Ambiguities in partial wave analysis of two spinless meson photoproduction
+9WPIWWVE https://link.aps.org/doi/10.1103/PhysRevD.108.054018 Dynamics in near-threshold J / ψ photoproduction
+RJUES6Z7 https://dl.acm.org/doi/10.1145/3674829.3675060 AAVE Corpus Generation and Low-Resource Dialect Machine Translation
+S4GW5SBQ https://iopscience.iop.org/article/10.3847/1538-3881/ad61d8 Evidence for Primordial Alignment: Insights from Stellar Obliquity Measurements for Compact Sub-Saturn Systems
+248BBMXH https://faseb.onlinelibrary.wiley.com/doi/10.1096/fasebj.2018.32.1_supplement.650.11 Dimerization of ADARs Expands The Range of Substrates That Can Undergo A‐to‐I RNA Editing
+2ZZNMDLD https://www.nature.com/articles/nbt.2452 The difficult calls in RNA editing
+5UEY9K8G https://iopscience.iop.org/article/10.3847/2041-8213/ad7469 Single-star Warm-Jupiter Systems Tend to Be Aligned, Even around Hot Stellar Hosts: No Teff –λ Dependency*
+YKP3CGBW https://academic.oup.com/genetics/article/doi/10.1093/genetics/iyac099/6619166 The RNA-binding protein Swm is critical for Drosophila melanogaster intestinal progenitor cell maintenance
+4VZ9ZHGY https://www.nature.com/articles/s41598-022-17559-4 ADAR3 activates NF-κB signaling and promotes glioblastoma cell resistance to temozolomide
+RX7PMX26 https://linkinghub.elsevier.com/retrieve/pii/S2211124722013456 MicroRNA mediated regulation of the onset of enteroblast differentiation in the Drosophila adult intestine
+L4NFKPEG https://bmjopen.bmj.com/lookup/doi/10.1136/bmjopen-2023-073791 Using electronic health records to enhance surveillance of diabetes in children, adolescents and young adults: a study protocol for the DiCAYA Network
+EWD4AV2I https://bmcbiol.biomedcentral.com/articles/10.1186/s12915-024-01840-1 ADARs regulate cuticle collagen expression and promote survival to pathogen infection
+HX3Z4ETW https://bmcpublichealth.biomedcentral.com/articles/10.1186/s12889-024-19772-4 Tracking the burden, distribution, and impact of Post-COVID conditions in diverse populations for children, adolescents, and adults (Track PCC): passive and active surveillance protocols
+CS8FALBN https://link.aps.org/doi/10.1103/PhysRevD.81.013005 Measurement of ν μ and ν ¯ μ induced neutral current single π 0 production cross sections on mineral oil at E ν ∼ O (1 GeV)
+Z92D4QX4 https://link.aps.org/doi/10.1103/PhysRevD.110.094509 Coulomb confinement in the Hamiltonian limit
+ZAH9GZED https://link.aps.org/doi/10.1103/PhysRevD.81.092005 First measurement of the muon neutrino charged current quasielastic double differential cross section
+URB2XIX4 https://academic.oup.com/mnras/article/537/2/1518/7965979 A dusty dawn: galactic dust buildup at z ≳ 5
+9EJJQ9KQ https://link.aps.org/doi/10.1103/PhysRevD.82.092005 Measurement of the neutrino neutral-current elastic differential cross section on mineral oil at E ν ∼ 1 GeV
+EPNZG7CE https://link.aps.org/doi/10.1103/PhysRevLett.102.101802 Unexplained Excess of Electronlike Events from a 1-GeV Neutrino Beam
+E423YNAS https://link.aps.org/doi/10.1103/PhysRevLett.103.061802 Search for Muon Neutrino and Antineutrino Disappearance in MiniBooNE
+2J9BXQLS https://linkinghub.elsevier.com/retrieve/pii/S0370269312012592 Test of Lorentz and CPT violation with short baseline neutrino oscillation excesses
+SBBDG74P https://advanced.onlinelibrary.wiley.com/doi/10.1002/adom.202400801 Design of Light‐Induced Solid‐State Plasmonic Rulers via Tethering Photoswitchable Molecular Machines to Gold Nanostructures Displaying Angstrom Length Resolution
+E3KNF9T8 https://pubs.acs.org/doi/10.1021/acs.jpcb.4c04100 CHARMM at 45: Enhancements in Accessibility, Functionality, and Speed
+YPS5JYGY https://link.springer.com/10.1007/s00401-024-02775-1 Enhanced microglial dynamics and a paucity of tau seeding in the amyloid plaque microenvironment contribute to cognitive resilience in Alzheimer’s disease
+XA4NSBQ6 https://iopscience.iop.org/article/10.3847/1538-3881/ad6b7f SOLES XII. The Aligned Orbit of TOI-2533 b, a Transiting Brown Dwarf Orbiting an F8-type Star
+BEYXLBNC https://scholarworks.iu.edu/journals/index.php/thst/article/view/37892 Incorporating Climate Engineering into Secondary Education: A New Direction for Indiana’s Science Classrooms
+T58BN5GY https://iopscience.iop.org/article/10.3847/2041-8213/adc129 From Misaligned Sub-Saturns to Aligned Brown Dwarfs: The Highest Mp / M* Systems Exhibit Low Obliquities, Even around Hot Stars*
+3DFFZBGW https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.13901 Loss of Inpp5d has disease‐relevant and sex‐specific effects on glial transcriptomes
+B9UCXYTT https://www.aanda.org/10.1051/0004-6361/202450954 Inference of black-hole mass fraction in Galactic globular clusters: A multi-dimensional approach to break the initial-condition degeneracies
+HRLJTP2A https://www.aanda.org/10.1051/0004-6361/202451054 A 3D view of multiple populations’ kinematics in Galactic globular clusters
+9L7P3AGI https://academic.oup.com/mnras/article/534/3/2397/7775518 Energy equipartition in multiple-population globular clusters
+KDL5U39P https://www.aanda.org/10.1051/0004-6361/202452786 Exploring the formation environment and dynamics of multiple stellar populations in globular clusters through binary systems
+F6QSXXMC https://www.aanda.org/10.1051/0004-6361/202348653 MOCCA: Global properties of tidally filling and underfilling globular star clusters with multiple stellar populations
+CQGZAPFS https://academic.oup.com/ajrccm/article/211/Supplement_1/A7716/8339319 Novel Insights Into Right Ventricular Dysfunction in Pulmonary Arterial Hypertension: The Role of Mitochondrial Dysfunction and Cell Cycle Arrest
+H2PPL72I https://dl.acm.org/doi/10.1145/3703157 Scaling Terrain-Aware Spatial Machine Learning for Flood Mapping on Large Scale Earth Imagery Data
+ZTCVUC6G https://www.aimsciences.org//article/doi/10.3934/jcd.2019006 Numerical efficacy study of data assimilation for the 2D magnetohydrodynamic equations
+SKNG498Z https://linkinghub.elsevier.com/retrieve/pii/S0168169924008184 CattleAssigner: A framework for accurate assignment of individuals to cattle lineages and populations using minimum informative markers
+KRRLE7B9 https://molecular-cancer.biomedcentral.com/articles/10.1186/s12943-025-02311-z LSD1 inhibition attenuates targeted therapy-induced lineage plasticity in BRAF mutant colorectal cancer
+3UBUSXC2 https://www.mdpi.com/2072-6694/16/11/2040 Single-Cell Profiling Reveals the Impact of Genetic Alterations on the Differentiation of Inflammation-Induced Murine Colon Tumors
+5JHXF8KS https://onlinelibrary.wiley.com/doi/10.1111/ede.70004 A Conserved Somatic Sex Determination Cascade Instructs Trait‐Specific Sexual Dimorphism in Horned Dung Beetles
+GSUT5T8L https://www.cambridge.org/core/product/identifier/S002214302500036X/type/journal_article The effect of melt-channel geometry on ice-shelf flow
+J3Y793NC https://www.frontiersin.org/articles/10.3389/fmed.2022.1029227/full Predicting melanoma survival and metastasis with interpretable histopathological features and machine learning models
+H3R4UEJR https://link.aps.org/doi/10.1103/PhysRevD.72.076004 Tests of Lorentz violation in ν ¯ μ → ν ¯ e oscillations
+685R7SEQ https://link.aps.org/doi/10.1103/PhysRevD.81.033004 Measurement of inclusive neutral current π 0 production on carbon in a few-GeV neutrino beam
+YY8YTLUS https://link.aps.org/doi/10.1103/PhysRevD.84.072005 Measurement of the neutrino component of an antineutrino beam observed by a nonmagnetized detector
+ZNWFYDCX https://link.aps.org/doi/10.1103/PhysRevD.86.052009 Dual baseline search for muon antineutrino disappearance at 0.1 eV 2 < Δ m 2 < 100 eV 2
+J2AWTWKN https://link.aps.org/doi/10.1103/PhysRevD.88.032001 First measurement of the muon antineutrino double-differential charged-current quasielastic cross section
+USS8KEB6 https://link.aps.org/doi/10.1103/PhysRevD.89.072004 A method for measuring coherent elastic neutrino-nucleus scattering at a far off-axis high-energy neutrino beam target
+LSRTB9ZU https://link.aps.org/doi/10.1103/PhysRevD.91.012004 Measurement of the antineutrino neutral-current elastic differential cross section
+NXS3FZJH https://link.aps.org/doi/10.1103/PhysRevLett.103.111801 Search for Electron Antineutrino Appearance at the Δ m 2 ∼ 1 eV 2 Scale
+S5I8BR3J https://link.aps.org/doi/10.1103/PhysRevLett.110.161801 Improved Search for ν ¯ μ → ν ¯ e Oscillations in the MiniBooNE Experiment
+UG4WMZTV https://linkinghub.elsevier.com/retrieve/pii/S0920563211007080 Neutrino cross section measurements with MiniBooNE
+DLES7AYM https://linkinghub.elsevier.com/retrieve/pii/S0920563211007481 Global three-parameter model for neutrino oscillations using Lorentz violation
+KI85VFCF https://pubs.aip.org/aip/acp/article/842/1/748-755/988264 Neutrinos, Oscillations and New Physics: An Introduction
+SIJIG5RR https://pubs.aip.org/aip/acp/article/967/1/39-44/776276 Measuring Neutrino Interactions with MiniBooNE
+YKZ93Q3E https://pubs.aip.org/aip/acp/article/1189/1/175-180/799718 Measurement of Neutrino-Nucleon Neutral Current Elastic Scattering in MiniBooNE
+YKPUK6NY https://pubs.aip.org/aip/acp/article/1189/1/291-296/799821 The Path Forward: Neutrino Quasi-Elastic Scattering Discussion
+V4UL4CTT https://pubs.aip.org/aip/acp/article/1222/1/191-195/666707 Quasielastic Neutrino Scattering at E[sub ν]≈1 GeV: Recent Measurements and Interpretations
+SJKHXUMR http://ieeexplore.ieee.org/document/1462277/ Study of scintillation, fluorescence and scattering in mineral oil for the miniboone neutrino detector
+BA357GHK http://www.worldscientific.com/doi/abs/10.1142/9789812779519_0012 NEUTRINO OSCILLATIONS AND LORENTZ VIOLATION WITH MINIBOONE
+R4S6YAG9 http://www.worldscientific.com/doi/abs/10.1142/9789812779519_0048 TEST FOR LORENTZ VIOLATION IN THE MINIBOONE NEUTRINO OSCILLATION EXPERIMENT
+4BVCF2HJ http://www.worldscientific.com/doi/abs/10.1142/9789814327688_0047 RECENT RESULTS FROM $\bar \nu _\mu \, \to \,\bar \nu _e$ WITH MINIBOONE
+V6BWTMX8 https://linkinghub.elsevier.com/retrieve/pii/S0168900208015404 The MiniBooNE detector
+S7ZB3I4A https://aacrjournals.org/cancerres/article/81/14/3791/670249/LSD1-and-Aberrant-DNA-Methylation-Mediate LSD1 and Aberrant DNA Methylation Mediate Persistence of Enteroendocrine Progenitors That Support BRAF -Mutant Colorectal Cancer
+E8RELL4Q https://elifesciences.org/articles/97981 Robust single-nucleus RNA sequencing reveals depot-specific cell population dynamics in adipose tissue remodeling during obesity
+HBE2R9ZG https://bmcpublichealth.biomedcentral.com/articles/10.1186/s12889-025-22425-9 Equivalence of electronic health record data for measuring hypertension prevalence: a retrospective comparison to BRFSS with data from two Indiana health systems, 2021
+VB3RJVC3 https://link.aps.org/doi/10.1103/PhysRevD.111.094508 Hadronic vacuum polarization for the muon g − 2 from lattice QCD: Complete short and intermediate windows
+Q4IA7KYW https://linkinghub.elsevier.com/retrieve/pii/S0893395225000936 Multimodal Explainable Artificial Intelligence for Prognostic Stratification of Patients With Glioblastoma
+952VPKFR https://aacrjournals.org/cancerres/article/85/8_Supplement_1/6247/758662/Abstract-6247-Artificial-intelligence-predicts Abstract 6247: Artificial intelligence predicts 2021 WHO glioma subtypes from whole slide images
+NHJ57SJC https://aplm.kglmeridian.com/view/journals/arpa/149/10/article-p922.xml Artificial Intelligence–Based Classification of Renal Oncocytic Neoplasms: Advancing From a 2-Class Model of Renal Oncocytoma and Low-Grade Oncocytic Tumor to a 3-Class Model Including Chromophobe Renal Cell Carcinoma
+TE55AEV6 https://pos.sissa.it/466/412 Lattice gauge ensembles and data management
+SERPUQTN https://www.frontiersin.org/articles/10.3389/fnins.2024.1304191/full Prognostic stratification of glioblastoma patients by unsupervised clustering of morphology patterns on whole slide images furthering our disease understanding
+KU6RXISW https://ieeexplore.ieee.org/document/10635869/ Weakly Supervised IDH-Status Glioma Classification from H&E-Stained Whole Slide Images
+QYIUMP3Y https://academic.oup.com/neuro-oncology/article/26/Supplement_8/viii187/7890259 PATH-39. AI-BASED IDENTIFICATION OF GLIOMA IDH MUTATIONAL STATUS FROM H&E-STAINED WHOLE SLIDE IMAGES
+ZXKAPBWB https://rupress.org/jem/article/220/11/e20230180/276197/Network-analysis-identifies-strain-dependent Network analysis identifies strain-dependent response to tau and tau seeding-associated genes
+3I253NIX https://aacrjournals.org/cancerres/article/85/1/52/750634/LSD1-and-CoREST2-Potentiate-STAT3-Activity-to LSD1 and CoREST2 Potentiate STAT3 Activity to Promote Enteroendocrine Cell Differentiation in Mucinous Colorectal Cancer
+WDM3YCPL https://www.science.org/doi/10.1126/sciadv.abe3954 Deletion of Abi3 gene locus exacerbates neuropathological features of Alzheimer’s disease in a mouse model of Aβ amyloidosis
+2NNL2LSC https://dx.plos.org/10.1371/journal.ppat.1013128 The molecular basis for DNA-binding by competence T4P is distinct in a representative Gram-positive and Gram-negative species
+JYGIGPCL https://pnas.org/doi/10.1073/pnas.2421764122 DprA recruits ComM to facilitate recombination during natural transformation in Gram-negative bacteria
+7QSC7X9V https://www.jci.org/articles/view/180117 Inflammation primes the murine kidney for recovery by activating AZIN1 adenosine-to-inosine editing
+ZYMANSVZ https://direct.mit.edu/imag/article/doi/10.1162/imag_a_00504/128177/Individual-patterns-of-functional-connectivity-in Individual patterns of functional connectivity in neonates as revealed by surface-based Bayesian modeling
+JBD5CAPS https://royalsocietypublishing.org/doi/10.1098/rsfs.2024.0024 Robust data-driven segmentation of pulsatile cerebral vessels using functional magnetic resonance imaging
+4UMWL2DR https://linkinghub.elsevier.com/retrieve/pii/S2212267222005184 Adding Walnuts to The Regular Diet Improved the Diet Quality Among U.S. Adults: Results of An NHANES Modeling Study
+LR4PNBTW https://linkinghub.elsevier.com/retrieve/pii/S0167923613001851 Capital markets valuation and accounting performance of Most Admired Knowledge Enterprise (MAKE) award winners
+7RIR59L7 https://ieeexplore.ieee.org/document/10701477/ Bias-Corrected Joint Spectral Embedding for Multilayer Networks With Invariant Subspace: Entrywise Eigenvector Perturbation and Inference
+QL6XEGF6 https://www.ssrn.com/abstract=3375922 The Impact of Trade Credit Provision on Retail Inventory: An Empirical Investigation Using Synthetic Controls
+H46ABYPL https://pubsonline.informs.org/doi/10.1287/mnsc.2022.4600 The Impact of Trade Credit Provision on Retail Inventory: An Empirical Investigation Using Synthetic Controls
+YFMB4G7R https://linkinghub.elsevier.com/retrieve/pii/S0166445X18305885 Profiling microRNA expression in Atlantic killifish (Fundulus heteroclitus) gill and responses to arsenic and hyperosmotic stress
+6M3Z8E47 https://linkinghub.elsevier.com/retrieve/pii/S0048969712007899 Adaptive iterative design (AID): A novel approach for evaluating the interactive effects of multiple stressors on aquatic organisms
+83FT6PI6 https://pubs.acs.org/page/evhpaz/EHP-legacy-content Genome-Wide Analysis of Cadmium-Induced, Germline Mutations in a Long-Term Daphnia pulex Mutation-Accumulation Experiment
+D6GWT7XX https://onlinelibrary.wiley.com/doi/10.1111/mec.13148 Conserved transcriptional responses to cyanobacterial stressors are mediated by alternate regulation of paralogous genes in Daphnia
+YXSV9DV9 http://genome.cshlp.org/lookup/doi/10.1101/gr.191338.115 High mutational rates of large-scale duplication and deletion in Daphnia pulex
+XG8GAZY4 https://pnas.org/doi/10.1073/pnas.2421277122 The world through infant eyes: Evidence for the early emergence of the cardinal orientation bias
+2TWCT5FY https://linkinghub.elsevier.com/retrieve/pii/S0306456516301772 Thermal variation and factors influencing vertical migration behavior in Daphnia populations
+FPPCJN4U http://academic.oup.com/gbe/article/9/3/659/2992614 The Landscape of Extreme Genomic Variation in the Highly Adaptable Atlantic Killifish
+GYPTN6FM http://biorxiv.org/lookup/doi/10.1101/2025.04.08.647882 Application of Whole Proteome Thermal Shift Assays to Define PERK-dependent Changes in Protein Homeostasis during the Unfolded Protein Response
+RSKM3BBL https://pubs.acs.org/doi/10.1021/acs.est.8b06720 Genome-Wide Stress Responses to Copper and Arsenic in a Field Population of Daphnia
+T5VXR344 https://pubs.acs.org/doi/10.1021/acs.est.9b05006 Dynamics of Cadmium Acclimation in Daphnia pulex : Linking Fitness Costs, Cross-Tolerance, and Hyper-Induction of Metallothionein
+KDYZH8JL https://academic.oup.com/mbe/article-lookup/doi/10.1093/molbev/msu241 Natural Selection Canalizes Expression Variation of Environmentally Induced Plasticity-Enabling Genes
+VT7ETXHI https://academic.oup.com/mbe/article-lookup/doi/10.1093/molbev/msv190 Hybridization and the Origin of Contagious Asexuality in Daphnia pulex
+3RF45BR8 http://bmcgenomics.biomedcentral.com/articles/10.1186/1471-2164-8-477 Gene response profiles for Daphnia pulex exposed to the environmental stressor cadmium reveals novel crustacean metallothioneins
+UVP46KC4 http://biorxiv.org/lookup/doi/10.1101/2024.05.15.594427 Unraveling systemic responses to NQO1-activated IB-DNQ and Rucaparib single and dual agent therapy in triple-negative breast cancers
+7IY6CTNH https://linkinghub.elsevier.com/retrieve/pii/S1532045615000216 A novel variant of aquaporin 3 is expressed in killifish (Fundulus heteroclitus) intestine
+QYNQTAGV https://link.aps.org/doi/10.1103/PhysRevD.100.115020 First constraint on coherent elastic neutrino-nucleus scattering in argon
+3N58LGEL https://www.ahajournals.org/doi/10.1161/JAHA.124.037197 Relationship Between Health Care Team Segregation and Receipt of Care by a Cardiologist According to Patient Race in a Midwestern State
+4I9Z5VPN https://link.aps.org/doi/10.1103/PhysRevLett.126.012002 First Measurement of Coherent Elastic Neutrino-Nucleus Scattering on Argon
+XK7AT24Z https://iopscience.iop.org/article/10.1088/1748-0221/16/04/P04002 Development of a83 mKr source for the calibration of the CENNS-10 liquid argon detector
+HF5QITRZ https://iopscience.iop.org/article/10.1088/1748-0221/16/08/P08048 A D2 O detector for flux normalization of a pion decay-at-rest neutrino source
+D4ZNFI2W https://iopscience.iop.org/article/10.1088/1748-0221/17/03/P03021 Monitoring the SNS basement neutron background with the MARS detector
+D9ZPUZRM https://link.aps.org/doi/10.1103/PhysRevD.106.032003 Simulating the neutrino flux from the Spallation Neutron Source for the COHERENT experiment
+LWWIQZNU https://www.ahajournals.org/doi/10.1161/CIRCOUTCOMES.124.011643 Relationship Between Race, Predelivery Cardiology Care, and Cardiovascular Outcomes in Preeclampsia/Eclampsia Among a Commercially Insured Population
+4DYH5A98 https://link.aps.org/doi/10.1103/PhysRevLett.129.081801 Measurement of the Coherent Elastic Neutrino-Nucleus Scattering Cross Section on CsI by COHERENT
+M5684IGT https://linkinghub.elsevier.com/retrieve/pii/S2666602224000132 Association between social vulnerability index and admission urgency for transcatheter aortic valve replacement
+CPDI2MLB https://iopscience.iop.org/article/10.1088/1742-6596/798/1/012213 COHERENT Experiment: current status
+PS2II5XL https://link.aps.org/doi/10.1103/PhysRevD.102.052007 Sensitivity of the COHERENT experiment to accelerator-produced dark matter
+RXY4BI6Q https://www.science.org/doi/10.1126/science.aao0990 Observation of coherent elastic neutrino-nucleus scattering
+FHQYFEHY https://link.aps.org/doi/10.1103/PhysRevLett.130.051803 First Probe of Sub-GeV Dark Matter beyond the Cosmological Expectation with the COHERENT CsI Detector at the SNS
+6EY5MPBD https://link.aps.org/doi/10.1103/PhysRevD.108.072001 Measurement of Pb n a t ( ν e , X n ) production with a stopped-pion neutrino source
+ZG55JBTG https://link.aps.org/doi/10.1103/PhysRevLett.131.221801 Measurement of Electron-Neutrino Charged-Current Cross Sections on I 127 with the COHERENT NaI ν E Detector
+ULE82D2H https://link.aps.org/doi/10.1103/PhysRevD.109.092005 Accessing new physics with an undoped, cryogenic CsI CEvNS detector for COHERENT at the SNS
+8QPTKUUQ https://link.springer.com/10.1007/978-3-031-63646-2_26 On Implementing Case-Based Reasoning with Large Language Models
+YUK6ZH9E https://onlinelibrary.wiley.com/doi/10.1111/1475-679X.12590 Silent Suffering: Using Machine Learning to Measure CEO Depression
+878MUQF8 https://www.nature.com/articles/s41562-024-01910-y Improving academic mentorship practices
+QQBWUJES https://linkinghub.elsevier.com/retrieve/pii/S0022519306005649 Nonlinear simulation of the effect of microenvironment on tumor growth
+R2VBLF3L https://dx.plos.org/10.1371/journal.ppat.1013353 Spatio-genetically coordinated TPR domain-containing proteins modulate c-di-GMP signaling in Vibrio vulnificus
+UVSNGE4V https://journals.asm.org/doi/10.1128/mbio.01536-23 PlzD modifies Vibrio vulnificus foraging behavior and virulence in response to elevated c-di-GMP
+Q92LP8L3 https://lrec.elra.info/lrec2024-main-0807 Introducing a Parsed Corpus of Historical High German
+CXHABPVC https://linkinghub.elsevier.com/retrieve/pii/S2211695824000941 Context in abusive language detection: On the interdependence of context and annotation of user comments
+HDMFHQXK https://acl-bg.org/proceedings/2025/RANLP%202025/pdf/2025.ranlp-1.83.pdf Investigating Polarization in YouTube Comments via Aspect-Based Sentiment Analysis
+VHNCLY72 https://www.cambridge.org/core/product/identifier/S2977042424000219/type/journal_article Cross-lingual dependency parsing for a language with a unique script
+49E4GPZJ https://aclanthology.org/2024.arabicnlp-1.16 Out-of-Domain Dependency Parsing for Dialects of Arabic: A Case Study
+PKYXCSD4 https://lrec.elra.info/lrec2024-main-0215 Bits and Pieces: Investigating the Effects of Subwords in Multi-task Parsing across Languages and Domains
+4DMTJCZ6 https://pubs.acs.org/doi/10.1021/acs.biochem.6b00412 Structural and Enzymatic Analysis of Tumor-Targeted Antifolates That Inhibit Glycinamide Ribonucleotide Formyltransferase
+E5RMKWAY https://pubs.acs.org/doi/10.1021/acs.jmedchem.6b00594 Tumor Targeting with Novel 6-Substituted Pyrrolo [2,3- d ] Pyrimidine Antifolates with Heteroatom Bridge Substitutions via Cellular Uptake by Folate Receptor α and the Proton-Coupled Folate Transporter and Inhibition of de Novo Purine Nucleotide Biosynthesis
+MZ5XRJWU https://pnas.org/doi/full/10.1073/pnas.1716231114 MotI (DgrA) acts as a molecular clutch on the flagellar stator protein MotA in Bacillus subtilis
+UT2BEUTG https://linkinghub.elsevier.com/retrieve/pii/S002228360901167X Coronavirus N Protein N-Terminal Domain (NTD) Specifically Binds the Transcriptional Regulatory Sequence (TRS) and Melts TRS-cTRS RNA Duplexes
+G5FB7PFF https://linkinghub.elsevier.com/retrieve/pii/S002228361300034X Allosteric Inhibition of a Zinc-Sensing Transcriptional Repressor: Insights into the Arsenic Repressor (ArsR) Family
+AY9T2MP7 https://aacrjournals.org/mct/article/18/10/1787/92572/Novel-Pyrrolo-3-2-d-pyrimidine-Compounds-Target Novel Pyrrolo[3,2- d ]pyrimidine Compounds Target Mitochondrial and Cytosolic One-carbon Metabolism with Broad-spectrum Antitumor Efficacy
+BRMQPPAK https://linkinghub.elsevier.com/retrieve/pii/S0968089621001012 Discovery of 6-substituted thieno[2,3-d]pyrimidine analogs as dual inhibitors of glycinamide ribonucleotide formyltransferase and 5-aminoimidazole-4-carboxamide ribonucleotide formyltransferase in de novo purine nucleotide biosynthesis in folate receptor expressing human tumors
+UPTVH5RF https://pubs.acs.org/doi/10.1021/acs.jmedchem.5b00801 6-Substituted Pyrrolo[2,3- d ]pyrimidine Thienoyl Regioisomers as Targeted Antifolates for Folate Receptor α and the Proton-Coupled Folate Transporter in Human Tumors
+K5V9E7YM https://pubs.acs.org/doi/10.1021/ja2080532 Crystal Structure of the Zinc-Dependent MarR Family Transcriptional Regulator AdcR in the Zn(II)-Bound State
+W564PHSH https://pubs.acs.org/doi/10.1021/acsptsci.3c00020 Multitargeted 6-Substituted Thieno[2,3- d ]pyrimidines as Folate Receptor-Selective Anticancer Agents that Inhibit Cytosolic and Mitochondrial One-Carbon Metabolism
+RBMGWLL4 https://pnas.org/doi/full/10.1073/pnas.1308827110 Structures of human folate receptors reveal biological trafficking states and diversity in folate and antifolate recognition
+K5EKB82C https://pubs.acs.org/doi/10.1021/acs.jmedchem.3c00763 Structure-Based Design of Transport-Specific Multitargeted One-Carbon Metabolism Inhibitors in Cytosol and Mitochondria
+VZVM3CNV https://pubs.acs.org/doi/10.1021/acs.biochem.3c00613 Structural Characterization of 5-Substituted Pyrrolo[3,2- d ]pyrimidine Antifolate Inhibitors in Complex with Human Serine Hydroxymethyl Transferase 2
+U7GC9B8L https://pnas.org/doi/full/10.1073/pnas.1811022116 Mission-driven research for stratospheric aerosol geoengineering
+MMGSCNPB https://journals.ametsoc.org/view/journals/bams/99/11/bams-d-17-0267.1.xml CESM1(WACCM) Stratospheric Aerosol Geoengineering Large Ensemble Project
+8S2EBMZ7 http://doi.wiley.com/10.1002/2013JD020716 Key factors governing uncertainty in the response to sunshade geoengineering from a comparison of the GeoMIP ensemble and a perturbed parameter ensemble
+L8GCXQ72 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL094707 Detecting Climate Teleconnections With Granger Causality
+DAUQLN9E https://hess.copernicus.org/articles/26/1727/2022/ Technical note: Using long short-term memory models to fill data gaps in hydrological monitoring networks
+2JK2T9DB https://jamanetwork.com/journals/jamanetworkopen/fullarticle/2792844 Racial and Ethnic Disparities in Buprenorphine and Extended-Release Naltrexone Filled Prescriptions During the COVID-19 Pandemic
+3VVP5CJD https://academic.oup.com/eschf/article/12/1/564/8261124 Association Between Clinician Team Segregation, Receipt of Cardiovascular Care and Outcomes in Valvular Heart Diseases
+NNRGU754 https://link.springer.com/10.1007/s40615-023-01838-5 Association Between Race, Cardiology Care, and the Receipt of Guideline-Directed Medical Therapy in Peripartum Cardiomyopathy
+ZKT6TBKP https://pubs.acs.org/doi/10.1021/acs.est.8b01550 Arsenic Reduces Gene Expression Response to Changing Salinity in Killifish
+BHNQ9G4T https://www.nature.com/articles/s41467-021-24581-z Extensive standing genetic variation from a small number of founders enables rapid adaptation in Daphnia
+22LPVHZE https://linkinghub.elsevier.com/retrieve/pii/S0166445X11003444 Functional characterization of four metallothionein genes in Daphnia pulex exposed to environmental stressors
+3UKXNI9C https://linkinghub.elsevier.com/retrieve/pii/S1355814525000185 Amyloidogenesis promotes HSF1 activity enhancing cell survival during breast cancer metastatic colonization
+B8KPNK7P https://pubs.acs.org/doi/10.1021/acs.jpca.5c02839 Photoelectron Spectroscopy of Fulvenallenyl and Fluorine-Substituted Fulvenallenyl Anions
+SN698AJU https://pubs.acs.org/doi/10.1021/acs.jpca.4c03434 Anion Photoelectron Imaging Spectroscopy of C6 F5 X– (X = F, Cl, Br, I)
+FSASD23K https://direct.mit.edu/netn/article/9/1/38/124897/Tangent-space-functional-reconfigurations-in Tangent space functional reconfigurations in individuals at risk for alcohol use disorder
+7L7TQ95W https://pubs.aip.org/jcp/article/162/5/054301/3333271/Electronic-structures-and-spin-frustration-in-Ln3O Electronic structures and spin frustration in Ln3O (Ln = Ce, Sm, Gd) neutrals and anions determined by anion photoelectron spectroscopy
+PQKCLKTJ https://onlinelibrary.wiley.com/doi/10.1111/ejn.70150 Left Ventral Caudate Functional Connectivity Mediates the Relationship Between Habitual Responding and Alcohol Use
+AX3KAJ2C https://www.cambridge.org/core/product/identifier/S2040174424000333/type/journal_article PedBE age and age acceleration in umbilical vein endothelial cells: an examination of infant birth outcomes
+6I7HLW54 https://www.nature.com/articles/s41380-024-02652-z DNA methylation profiles of cancer-related fatigue associated with markers of inflammation and immunometabolism
+3ZG5GRR5 https://onlinelibrary.wiley.com/doi/10.1002/dev.22464 Maternal childhood adversity and infant epigenetic aging: Moderation by restless sleep during pregnancy
+Z6MT2YRC https://linkinghub.elsevier.com/retrieve/pii/S0022399923003756 Associations of differentially expressed genes with psychoneurological symptoms in patients with head and neck cancer: A longitudinal study
+3L3UMMDA https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.70238 Tau depletion diminishes vascular amyloid‐related deficits in a mouse model of cerebral amyloid angiopathy
+IEL29GC6 https://academic.oup.com/jbmrplus/article/7479137 L‐BAIBA Synergizes with Sub‐Optimal Mechanical Loading to Promote New Bone Formation
+A2N2AF2H https://elifesciences.org/articles/92263 Deletion of FNDC5/irisin modifies murine osteocyte function in a sex-specific manner
+BBIRDPKE https://academic.oup.com/jbmrplus/article/doi/10.1093/jbmrpl/ziae054/7651121 Sex dimorphic response to osteocyte miR21 deletion in murine calvaria bone as determined by RNAseq analysis
+G2MC4QAV https://aacrjournals.org/cancerres/article/84/7_Supplement/LB200/742161/Abstract-LB200-Defining-the-mechanisms-of-cancer Abstract LB200: Defining the mechanisms of cancer specific transcription factor, tGLI1
+SZAHKCMY https://aacrjournals.org/cancerres/article/85/8_Supplement_1/1416/756438/Abstract-1416-Defining-the-mechanisms-of-cancer Abstract 1416: Defining the mechanisms of cancer specific transcription factor, tGLI1
+KKFAN9MG https://aacrjournals.org/cancerres/article/85/8_Supplement_1/1496/754760/Abstract-1496-Understanding-a-novel-interaction Abstract 1496: Understanding a novel interaction between HSF1 and ERRα in breast cancer
+GRWACGXT https://aacrjournals.org/cancerres/article/85/8_Supplement_1/4233/761007/Abstract-4233-Ovarian-cancer-treatments-Using-HSF1 Abstract 4233: Ovarian cancer treatments: Using HSF1 and MYC gene amplification as a biomarker
+8ECP985J https://aacrjournals.org/cancerres/article/85/18_Supplement/A040/765166/Abstract-A040-MYC-HSF1-coamplification-as-a Abstract A040: MYC-HSF1 coamplification as a biomarker for treatment sensitivity in high-grade serous ovarian cancer
+ZFIGRCHG https://aacrjournals.org/cancerrescommun/article/5/2/253/751416/MYC-and-HSF1-Cooperate-to-Drive-Sensitivity-to MYC and HSF1 Cooperate to Drive Sensitivity to Polo-like Kinase 1 Inhibitor Volasertib in High-grade Serous Ovarian Cancer
+IRIMFU77 https://iopscience.iop.org/article/10.3847/1538-3881/ad9dd5 Evidence for Primordial Alignment II: Insights from Stellar Obliquity Measurements for Hot Jupiters in Compact Multiplanet Systems
+C7RJSQBG https://link.aps.org/doi/10.1103/PhysRevLett.133.135301 Universal Diffusion in Coulomb Crystals
+35XCVDDH https://linkinghub.elsevier.com/retrieve/pii/S0167732223026272 Synthesis, characterization, and electronic structure of bioactive vanillin based fluorescent Schiff bases
+EWHEZI94 https://linkinghub.elsevier.com/retrieve/pii/S0925346724017336 Controlled synthesis of Ag–Au alloy nanoparticles for optimizing surface enhanced Raman scattering-based detection of antibiotic and pesticide residues
+LGSHDFZ4 https://pubs.rsc.org/em/article/27/1/211-224/849466 A theoretical study on the environmental oxidation of fenpyrazamine fungicide initiated by hydroxyl radicals in the aqueous phase
+X4S55QZ4 https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202401487 Exploring the Hydrogen Storage Potential of Allylamine Borane Using Density Functional Theory
+DDIL27IR https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202403990 Rhodamine‐Based Fluorescence Probe for Monitoring of Lysosomal pH: Spectroscopic Insights and Cellular Applications
+6IKGEZ58 https://linkinghub.elsevier.com/retrieve/pii/S2468823124008903 Silver- and gold-catalyzed azide−alkyne cycloaddition by functionalized NHC-based polynuclear catalysts: Computational investigation and mechanistic insights
+JWGUFZ6G https://linkinghub.elsevier.com/retrieve/pii/S001623612400396X Monte-Carlo simulations on H2 adsorption in kaolinite nanopore in the presence of CO2 and CH4 gases
+QGBPWU9P https://linkinghub.elsevier.com/retrieve/pii/S0045206825000860 Design, Synthesis, Biocompatibility, molecular docking and molecular dynamics studies of novel Benzo[b]thiophene-2-carbaldehyde derivatives targeting human IgM Fc Domains
+7FTD746R https://onlinelibrary.wiley.com/doi/10.1111/adb.70008 Intra‐striatal dopaminergic inter‐subject covariance in social drinkers and non‐treatment‐seeking alcohol use disorder participants
+W4P67HIK https://dl.acm.org/doi/10.1145/3491418.3530297 Scholarly Data Share: A Model for Sharing Big Data in Academic Research
+MSCYXDBT https://dl.acm.org/doi/10.1145/3569951.3597585 Scholarly Data Share 2.0: Granular Access to Research Data
+QW4568P7 https://onlinelibrary.wiley.com/doi/10.1002/pro.70148 Chemically induced partial unfolding of the multifunctional apurinic/apyrimidinic endonuclease 1
+TJ4XIHRH https://academic.oup.com/nar/article/doi/10.1093/nar/gkaf166/8069167 In silico λ-dynamics predicts protein binding specificities to modified RNAs
+ZPHSH2I4 https://spj.science.org/doi/10.1016/j.csbj.2024.12.027 Demystifying the black box: A survey on explainable artificial intelligence (XAI) in bioinformatics
+VL4FH4NG https://linkinghub.elsevier.com/retrieve/pii/S2211124722012013 Microglial control of neuronal development via somatic purinergic junctions
+6IEA5ABG https://www.science.org/doi/10.1126/sciadv.ado0077 Presynaptic nanoscale components of retrograde synaptic signaling
+XNJ7GNFV https://www.science.org/doi/10.1126/sciadv.adq5652 Dynamic overrepresentation of accumbal cues in food- and opioid-seeking rats after prenatal THC exposure
+YHQF8LCL https://pnas.org/doi/10.1073/pnas.2421717122 The endocannabinoid 2-arachidonoylglycerol is released and transported on demand via extracellular microvesicles
+MGMC7BFW https://linkinghub.elsevier.com/retrieve/pii/S1043661825001070 CB1 cannabinoid receptor agonists induce acute respiratory depression in awake mice
+PL3ZHZ9J https://www.frontiersin.org/articles/10.3389/fphar.2025.1553545/full Marked differences in the effects of levetiracetam and its analogue brivaracetam on microglial, astrocytic, and neuronal density in the rat model of kainic acid-induced temporal lobe epilepsy
+NJ78949K https://www.mdpi.com/1422-0067/26/10/4906 Distribution of NECAB1-Positive Neurons in Normal and Epileptic Brain—Expression Changes in Temporal Lobe Epilepsy and Modulation by Levetiracetam and Brivaracetam
+XZDQ8IKC https://linkinghub.elsevier.com/retrieve/pii/S0028390825004101 Genetic deletion of NAPE-PLD alters stress responsiveness and HPA-axis functionality in a context-dependent manner in mice
+HI24QCA8 https://pubs.acs.org/doi/10.1021/acschemneuro.5c00638 Spatially Resolved Mapping of Monoacylglycerol Lipase Activity in the Brain
+UPRXS34R https://academic.oup.com/cercor/article/31/3/1786/5998789 NECAB1 and NECAB2 are Prevalent Calcium-Binding Proteins of CB1/CCK-Positive GABAergic Interneurons
+JGSNZL73 https://www.nature.com/articles/s41467-021-26757-z PharmacoSTORM nanoscale pharmacology reveals cariprazine binding on Islands of Calleja granule cells
+ZYDMLB5B http://www.ssrn.com/abstract=2652994 Operations Strategies in the Presence of Consumer-Driven Bankruptcy Risk
+9F4BXXFT https://linkinghub.elsevier.com/retrieve/pii/S0022480418306243 Role of Post–Acute Care on Hospital Readmission After High-Risk Surgery
+K629M295 https://pubs.rsc.org/sc/article/16/1/255-279/869901 Pronounced electronic modulation of geometrically-regulated metalloenediyne cyclization
+ADPMM7YG https://www.physiology.org/doi/10.1152/jn.00831.2016 Dynamic mechanisms of visually guided 3D motion tracking
+UQKRJG3U http://jov.arvojournals.org/article.aspx?doi=10.1167/18.10.724 Use of continuous 3D target-tracking in VR to measure response latency to changes in depth
+RIEAUYG4 http://iovs.arvojournals.org/article.aspx?doi=10.1167/iovs.17-22990 Longitudinal Evaluation of Accommodation During Treatment for Unilateral Amblyopia
+62GS2DTD http://jov.arvojournals.org/article.aspx?doi=10.1167/18.10.940 Comparison of Vergence and Accommodation Responses of Strabismic and Non-strabismic hyperopic, and emmetropic children
+FTF5RUS8 https://linkinghub.elsevier.com/retrieve/pii/S0021925825015637 Abstract 2524 The kinase GSK-3 regulates the RNA binding protein landscape in the nervous system to control survival to hypoxia
+ASWQ7FVU https://journals.asm.org/doi/10.1128/JB.00190-18 Complex Control of a Genomic Island Governing Biofilm and Rugose Colony Development in Vibrio vulnificus
+FRV8PVRY https://link.springer.com/10.1007/s10456-024-09966-0 Ref-1 is overexpressed in neovascular eye disease and targetable with a novel inhibitor
+SSFF3GGF https://www.nature.com/articles/s42003-025-09475-w Altering chemotaxis as a strategy to enhance the foraging range of motility-restricted bacteria
+C67BVUYF https://academic.oup.com/schizophreniabulletin/article/50/3/642/7198045 Impaired Sleep Mediates the Relationship Between Interpersonal Trauma and Subtypes of Delusional Ideation
+KE634BYR https://www.frontiersin.org/articles/10.3389/frcha.2025.1568829/full Indicators of resource scarcity differentially moderate the impact of threat exposure on psychopathology in a cross-sectional community sample of youth
+DKD6QN2A https://pubs.acs.org/doi/10.1021/acs.jpcb.4c04805 Superimposing Ligands with a Ligand Overlay as an Alternate Topology Model for λ-Dynamics-Based Calculations
+BQAUXP89 https://pubs.acs.org/doi/10.1021/acs.jcim.4c00662 A λ-Dynamics Investigation of Insulin Wakayama and Other A3 Variant Binding Affinities to the Insulin Receptor
+6EAZQ7MB https://www.science.org/doi/10.1126/sciadv.adj4509 Sequence and epigenetic landscapes of active and silent nucleolus organizer regions in Arabidopsis
+X6GL78JF https://humgenomics.biomedcentral.com/articles/10.1186/s40246-024-00655-z Rapid discrimination between deleterious and benign missense mutations in the CAGI 6 experiment
+89CSXFU7 https://link.springer.com/10.1007/978-1-0716-4196-5_8 AlphaFold2, SPINE-X, and Seder on Four Hard CASP Targets
+N778DELH https://link.springer.com/10.1007/s00213-023-06400-z Sex differences in neuroendocrine, sympathetic nervous system, and affect responses to acute stress in cannabis users
+TF373BG9 https://link.springer.com/10.1007/s00439-025-02731-3 Evaluation of enzyme activity predictions for variants of unknown significance in Arylsulfatase A
+C6MTXJLL https://link.springer.com/10.1007/978-3-031-81596-6_25 Machine Learning-Based Tool for Efficient Discrimination Between Deleterious and Neutral Missense Mutations
+DF544LIB https://www.mdpi.com/2071-1050/16/23/10206 A Novel Hybrid Approach: Integrating Bayesian SPDE and Deep Learning for Enhanced Spatiotemporal Modeling of PM2.5 Concentrations in Urban Airsheds for Sustainable Climate Action and Public Health
+Z4WUFVY5 https://pubs.acs.org/doi/10.1021/jacs.4c17874 Reversible Interconversion of Nitrate and Nitrite Catalyzed by Periplasmic Nitrate Reductase from Campylobacter jejuni
+HIYK48A5 https://linkinghub.elsevier.com/retrieve/pii/S2666247724000939 Non-coding cause of congenital heart defects: Abnormal RNA splicing with multiple isoforms as a mechanism for heterotaxy
+PRKPKPJ5 https://linkinghub.elsevier.com/retrieve/pii/S0006322323004730 159. Interactions Between Cannabis Use and Biological Sex on Acute Neuroendocrine, Sympathetic, and Affective Stress Responses
+DVWEA9CA https://journals.biologists.com/bio/article/14/3/bio061677/367400/A-CRISPR-mis-insertion-in-the-Zic3-5-UTR-inhibits A CRISPR mis-insertion in the Zic3 5′UTR inhibits in vivo translation and is predicted to result in formation of an mRNA stem-loop hairpin
+6Z48VGP7 https://linkinghub.elsevier.com/retrieve/pii/S0006322323007746 460. Functional Connectivity Between the Cortex and the Cerebellum: An MRI Analysis in Cannabis Users
+BJJ9HZEK https://www.ahajournals.org/doi/10.1161/JAHA.124.039177 Identification of Long Noncoding RNA Candidate Disease Genes Associated With Clinically Reported Copy Number Variants in Congenital Heart Disease
+MB8TAH55 https://linkinghub.elsevier.com/retrieve/pii/S2213158222003023 Evidence of familial confounding of the association between cannabis use and cerebellar-cortical functional connectivity using a twin study
+VDCKAKV9 https://www.nature.com/articles/s41390-025-03819-2 Genomics of pediatric cardiomyopathy
+IYZ2BWPW https://ojs.aaai.org/index.php/AAAI/article/view/32124 Deep Reinforcement Learning with Time-Scale Invariant Memory
+IEZQUE2G https://academic.oup.com/schizophreniabulletin/article/51/1/133/7750573 Modeling Decision-Making in Schizophrenia: Associations Between Computationally Derived Risk Propensity and Self-Reported Risk Perception
+JWG6TRHG https://dl.acm.org/doi/10.1145/3626203.3670545 Automated Transcription Service: Enabling Transcription at Scale for Social Science Research
+QU23GUW3 https://link.springer.com/10.1186/s13229-025-00676-y Postural sway dynamics in adults across the autism spectrum: a multifactor approach
+NPW4K7VY https://academic.oup.com/g3journal/article/doi/10.1093/g3journal/jkaf107/8132832 Gene expression and pollen performance indicate altered postmating selection between Solanum species with different mating systems
+RJQ5Z99T https://www.frontiersin.org/articles/10.3389/fpsyt.2022.992757/full Emotion regulation and delusion-proneness relate to empathetic tendencies in a transdiagnostic sample
+DH2DFBL4 https://academic.oup.com/cercor/article/doi/10.1093/cercor/bhaf131/8157445 Functional reconfiguration between rest and movie watching relates to theory-of-mind performance among young and older adults
+8U54YKAV https://academic.oup.com/sleep/article/46/Supplement_1/A63/7181608 0139 Impaired Sleep Mediates the Relationship Between Interpersonal Trauma and Subtypes of Delusional Ideation
+W72GPESS https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JH000496 Recommendations for Comprehensive and Independent Evaluation of Machine Learning‐Based Earth System Models
+MH36U8QG https://www.nature.com/articles/s41386-025-02250-9 Moving from isolation to integration: a Bayesian multisensory perspective of interoception and psychosis
+MIUTVV6M https://gmd.copernicus.org/articles/18/961/2025/ A new metrics framework for quantifying and intercomparing atmospheric rivers in observations, reanalyses, and climate models
+6YWZDTXP https://academic.oup.com/bib/article/doi/10.1093/bib/bbaf649/8416446 A novel two-sample Mendelian randomization framework integrating common and rare variants: application to assess the effect of HDL-C on preeclampsia risk
+Z5A3DY92 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JD042222 Atmospheric River Detection Under Changing Seasonality and Mean‐State Climate: ARTMIP Tier 2 Paleoclimate Experiments
+DATFEE2B https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JD042163 Similarities in Meteorological Composites Among Different Atmospheric River Detection Tools During Landfall Over Western Coastal North America
+HULX2ISL https://pubs.acs.org/doi/10.1021/acs.jctc.1c00245 Reaction Path-Force Matching in Collective Variables: Determining Ab Initio QM/MM Free Energy Profiles by Fitting Mean Force
+9ZEITCUC https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL107236 Atmospheric Rivers in the Eastern and Midwestern United States Associated With Baroclinic Waves
+E9UAYTDN https://pubs.acs.org/doi/10.1021/acs.jctc.1c00565 Machine-Learning-Assisted Free Energy Simulation of Solution-Phase and Enzyme Reactions
+NL56HAM3 https://gmd.copernicus.org/articles/18/787/2025/ Moving beyond post hoc explainable artificial intelligence: a perspective paper on lessons learned from dynamical climate modeling
+5CRKAXKZ https://pubs.acs.org/doi/10.1021/acs.jctc.1c00567 Doubly Polarized QM/MM with Machine Learning Chaperone Polarizability
+ILVZ2YTT https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JD041687 Co‐Occurring Atmospheric Features and Their Contributions to Precipitation Extremes
+6DXS3Z9J https://pubs.acs.org/doi/10.1021/acs.jpcb.2c02262 Accelerating Ab Initio Quantum Mechanical and Molecular Mechanical (QM/MM) Molecular Dynamics Simulations with Multiple Time Step Integration and a Recalibrated Semiempirical QM/MM Hamiltonian
+RYMKCWJ2 https://insight.jci.org/articles/view/167408 Innate immune activation restricts priming and protective efficacy of the radiation-attenuated PfSPZ malaria vaccine
+N36HCBIE https://pubs.rsc.org/cp/article/24/41/25134-25143/761769 Facilitating ab initio QM/MM free energy simulations by Gaussian process regression with derivative observations
+9QAZVQ6M https://linkinghub.elsevier.com/retrieve/pii/S1074761319303358 A Molecular Signature in Blood Reveals a Role for p53 in Regulating Malaria-Induced Inflammation
+EI2AJYQY https://pubs.rsc.org/ra/article/13/7/4565-4577/785379 Machine learning based implicit solvent model for aqueous-solution alanine dipeptide molecular dynamics simulations
+YT4DE9WL https://pubs.aip.org/jcp/article/159/5/054107/2905186/Bridging-semiempirical-and-ab-initio-QM-MM Bridging semiempirical and ab initio QM/MM potentials by Gaussian process regression and its sparse variants for free energy simulation
+GEU7SEMG http://biorxiv.org/lookup/doi/10.1101/2025.05.31.657176 EXOSC3 S1-domain variants implicated in PCH1b alter RNA exosome cap subunit abundance and thermal stability disrupting rRNA processing and targeting of AU-rich mRNA
+HNLDXTF3 https://pubs.acs.org/doi/10.1021/acsnano.3c06047 Hybrid Metal–Ligand Interfacial Dipole Engineering of Functional Plasmonic Nanostructures for Extraordinary Responses of Optoelectronic Properties
+9JWNCDUI https://linkinghub.elsevier.com/retrieve/pii/S0021925825002856 Spt6-Spn1 interaction is required for RNA polymerase II association and precise nucleosome positioning along transcribed genes
+G6RVPISH https://www.mitpressjournals.org/doi/abs/10.1162/isal_a_00599 Characterizing the Role of Homeostatic Plasticity in Central Pattern Generators
+VL2MAD6I https://academic.oup.com/nar/article/52/D1/D1400/7327073 PancanQTLv2.0: a comprehensive resource for expression quantitative trait loci across human cancers
+MRF356JL https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.14243 Deletion of miR‐33, a regulator of the ABCA1–APOE pathway, ameliorates neuropathological phenotypes in APP/PS1 mice
+7LRDRVHZ https://pubs.acs.org/doi/10.1021/acs.jctc.3c00973 Free Energy Profile Decomposition Analysis for QM/MM Simulations of Enzymatic Reactions
+I65C9SAA https://academic.oup.com/g3journal/article/doi/10.1093/g3journal/jkaf101/8126571 QTL identification and characterization of the recombination landscape of the mountain pine beetle ( Dendroctonus ponderosae )
+7D6FE9JI https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023JD039434 Stratospheric Aerosol Injection Can Reduce Risks to Antarctic Ice Loss Depending on Injection Location and Amount
+ZBKGU875 https://iopscience.iop.org/article/10.1088/2515-7620/acf441 Transboundary effects from idealized regional geoengineering
+F3B69WGL https://www.nature.com/articles/s41467-025-60618-3 An archaeal nucleoid-associated protein binds an essential motif in DNA replication origins
+ZJMGKJ6P https://onlinelibrary.wiley.com/doi/10.1002/jcc.27269 Training machine learning potentials for reactive systems: A Colab tutorial on basic models
+U78YV7YT https://www.nature.com/articles/s41591-024-03011-9 Single-nucleus chromatin accessibility and transcriptomic map of breast tissues of women of diverse genetic ancestry
+U8JJIDAH https://linkinghub.elsevier.com/retrieve/pii/S0010465523002783 Polyrate 2023: A computer program for the calculation of chemical reaction rates for polyatomics. New version announcement
+PZREXNTY https://aacrjournals.org/cancerrescommun/article/4/1/38/732408/Signaling-Pathway-Alterations-Driven-by-BRCA1-and Signaling Pathway Alterations Driven by BRCA1 and BRCA2 Germline Mutations are Sufficient to Initiate Breast Tumorigenesis by the PIK3CAH1047R Oncogene
+323SE5E2 https://ascpt.onlinelibrary.wiley.com/doi/10.1002/psp4.13295 Population Pharmacokinetics and Transfer of Gabapentin When Used as a Pain Adjunct for Cesarean Deliveries
+WXZBSBQI https://linkinghub.elsevier.com/retrieve/pii/S0301462223000431 Revealing intrinsic changes of DNA induced by spore photoproduct lesion through computer simulation
+WZDT9JNG https://linkinghub.elsevier.com/retrieve/pii/S1452398123001049 Photoactivities of thiophene monomer/polymer transition in gel–based photoelectrochemical assembly: A theoretical/experimental approach
+YVYCEC7Z https://ascopubs.org/doi/10.1200/GO.23.00311 Real-World Cervical Cancer Screening Uptake and Predictors of Visual Inspection With Acetic Acid Positivity Among Women Living With HIV in Care Programs in Western Kenya
+6BQ5LNDL https://journals.lww.com/10.1097/QAI.0000000000003413 Modeling the HIV Cascade of Care Using Routinely Collected Clinical Data to Guide Programmatic Interventions and Policy Decisions
+2NYDLHKQ https://pubs.acs.org/doi/10.1021/acscatal.2c02993 Photoinduced Site-Selective Functionalization of Aliphatic C–H Bonds by Pyridine N -oxide Based HAT Catalysts
+2IHRDRS4 https://mchandaids.org/index.php/ijma/article/view/44 Impact of Maternal Viral Suppression on Growth Patterns for HIV-Exposed Uninfected Infants in Kenya
+AWXGS3DB https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.13319 A simulative deep learning model of SNP interactions on chromosome 19 for predicting Alzheimer's disease risk and rates of disease progression
+ISZP6K4N https://dx.plos.org/10.1371/journal.pgph.0001756 Adaptation of the Client Diagnostic Questionnaire for East Africa
+M7LVMG4J https://onlinelibrary.wiley.com/doi/10.1002/ece3.8429 Low base‐substitution mutation rate and predominance of insertion‐deletion events in the acidophilic bacterium Acidobacterium capsulatum
+KGCYABRF https://journals.lww.com/10.1097/QAI.0000000000003487 Outcomes After Loss to Follow-Up for Pregnant and Postpartum Women Living With HIV and Their Children in Kenya: A Prospective Cohort Study
+9S4F6XEF https://academic.oup.com/g3journal/article/doi/10.1093/g3journal/jkac303/6905443 Similar mutation rates but different mutation spectra in moderate and extremely halophilic archaea
+5UPARY2G https://link.springer.com/10.1007/s10461-024-04483-z Effects of Alcohol Use on Patient Retention in HIV Care in East Africa
+TU68UALN https://ieeexplore.ieee.org/document/9375950/ CondenseNeXt: An Ultra-Efficient Deep Neural Network for Embedded Systems
+SHFDJPSD https://journals.lww.com/10.1097/QAI.0000000000003330 Mortality Among HIV-Infected Adults on Antiretroviral Therapy in Southern Uganda
+3YYBCEE3 https://www.mdpi.com/1999-5903/14/12/355 NextDet: Efficient Sparse-to-Dense Object Detection with Attentive Feature Aggregation
+UEZEIJN9 https://www.spiedigitallibrary.org/conference-proceedings-of-spie/13302/3042513/Anesthetic-effects-on-functional-connectivity-fingerprinting-in-mice/10.1117/12.3042513.full Anesthetic effects on functional connectivity fingerprinting in mice
+HQ3FKM5B https://ieeexplore.ieee.org/document/9422541/ Image Classification with CondenseNeXt for ARM-Based Computing Platforms
+3GC65TPW https://karger.com/article/doi/10.1159/000544824 Quantifying the timing of gyral and sulcal formation relative to growth in the ferret cerebral cortex
+979CAX5T https://www.mdpi.com/2079-9268/13/3/49 An Improved Lightweight Network Using Attentive Feature Aggregation for Object Detection in Autonomous Driving
+IFBYRZTT https://link.springer.com/10.1007/s42001-023-00219-6 The value of manual annotation in assessing trends of hate speech on social media: was antisemitism on the rise during the tumultuous weeks of Elon Musk’s Twitter takeover?
+WVQ8W8KT https://www.mdpi.com/2079-9268/12/1/8 CondenseNeXtV2: Light-Weight Modern Image Classifier Utilizing Self-Querying Augmentation Policies
+VAYDT3AH https://link.springer.com/10.1007/s10588-022-09363-2 Differences between antisemitic and non-antisemitic English language tweets
+NZHJJ87U http://www.sciencepublishinggroup.com/journal/paperinfo?journalid=523&doi=10.11648/j.ajece.20210502.15 EffCNet: An Efficient CondenseNet for Image Classification on NXP BlueBox
+PXVPT7PP https://link.springer.com/10.1007/s00775-024-02046-0 Probing calmodulin–NO synthase interactions via site-specific infrared spectroscopy: an introductory investigation
+L2A4PNEM https://link.springer.com/10.1007/s42001-024-00251-0 Annotating live messages on social media. Testing the efficiency of the AnnotHate – live data annotation portal
+YGCFP8GF https://linkinghub.elsevier.com/retrieve/pii/S1384107624000241 Photometric study of the overcontact binary NSVS2910034
+QI974TVF https://www.nature.com/articles/s41467-024-52355-w Network community detection via neural embeddings
+BTANUB4B https://linkinghub.elsevier.com/retrieve/pii/S1384107623000209 Photometric study of the overcontact binary V826 Aur
+JMFELGDQ https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/chem.202304006 Towards Amplified Probing of Weak Intermolecular Interactions on the External Surfaces of Molecular Capsules
+SR82YWEY https://pubs.acs.org/doi/10.1021/acs.jpca.3c08476 Mechanism of the Sharpless Epoxidation Reaction: A DFT Study
+GCVA4DHB https://pubs.acs.org/doi/10.1021/acsanm.3c01721 Discrete Cu-Metalloporous Polycarbazole as a Nanoelectromediator for Effective Electrocarboxylation of Benzyl Bromide with CO2
+FMGJ2MDT https://onlinelibrary.wiley.com/doi/10.1002/vjch.202200210 HO● ‐ initiated oxidation of isoleucine amino acid in the aqueous phase
+IEXBJGGV https://pnas.org/doi/10.1073/pnas.2305414120 Unsupervised embedding of trajectories captures the latent structure of scientific migration
+WYQT9GBX https://pubs.acs.org/doi/10.1021/acs.jpca.3c02322 Mg-Containing Zn3 O3 Structures for Detection of CO2 : A DFT Study on CHEM Effects of SERS and Electronic Properties
+ZHPVKR4A https://royalsocietypublishing.org/doi/10.1098/rsos.230114 Revisiting the HO● -initiated oxidation of L-proline amino acid in the aqueous phase: influence of transition metal ions
+6DS6LDUR https://pubs.acs.org/doi/10.1021/acs.jpca.2c06549 Vector Correlations in the 225 nm Photodissociation of Co(CO)3 NO
+L9BWTRXP https://linkinghub.elsevier.com/retrieve/pii/S2213343723006802 Theoretical insights into the oxidation of quinmerac herbicide initiated by HO• radical in aqueous media: Mechanism, kinetics, and ecotoxicity
+557BG6H2 https://linkinghub.elsevier.com/retrieve/pii/S0045653522037274 Hydroxyl radical-initiated decomposition of metazachlor herbicide in the gaseous and aqueous phases: Mechanism, kinetics, and toxicity evaluation
+ZZ8S26YH https://pubs.rsc.org/em/article/25/12/2042-2056/807954 New insight into environmental oxidation of phosmet insecticide initiated by HO˙ radicals in gas and water – a theoretical study
+DI9GJ9E4 https://linkinghub.elsevier.com/retrieve/pii/S0167732222024655 Experimental and theoretical calculation of pKa values of substituted-2,4,6-trinitrodiphenylamines
+Q3DWVNT6 https://link.springer.com/10.1007/s40997-023-00676-4 Toward Directional Motion on Graphene by Uniaxial Strain
+NHGIEKKC https://pubs.rsc.org/ra/article/13/6/4077-4088/784943 Computational study of the interaction of the psychoactive amphetamine with 1,2-indanedione and 1,8-diazafluoren-9-one as fingerprinting reagents
+H5KFMA28 https://academic.oup.com/pnasnexus/article/doi/10.1093/pnasnexus/pgae258/7701371 Quantifying the vulnerabilities of the online public square to adversarial manipulation tactics
+KSKVITKE https://www.degruyter.com/document/doi/10.1515/pac-2022-1104/html Electrophilic substitution reactions of thiophene and thieno[2,3- b ]thiophene heterocycles: a DFT study
+YEER59WC http://biorxiv.org/lookup/doi/10.1101/2024.10.06.616888 Measuring DNA contents of animal and plant genomes with Gnodes, the long and short of it
+ITGGVHQV https://linkinghub.elsevier.com/retrieve/pii/S0021925825021490 In vivo pulse-chase in Caenorhabditis elegans reveals intestinal histone turnover changes upon starvation
+46LPBHGW https://pubs.rsc.org/cp/article/25/6/4780-4793/763221 A study of the thermodynamics and mechanisms of the atmospherically relevant reaction dimethyl sulphide (DMS) with atomic chlorine (Cl) in the absence and presence of water, using electronic structure methods
+9TSIZQJM https://linkinghub.elsevier.com/retrieve/pii/S001945222200485X Synthesis, structural, spectral, computational, docking and biological activities of Schiff base (E)-4-bromo-2-hydroxybenzylidene) amino)-N-(pyrimidin-2-yl) benzenesulfonamide from 5-bromosalicylaldehyde and sulfadiazine
+SQIR3YCE https://academic.oup.com/schizophreniabulletin/article/doi/10.1093/schbul/sbae147/7754917 Cognitive Mechanisms of Aberrant Self-Referential Social Perception in Psychosis and Bipolar Disorder: Insights From Computational Modeling
+MJ6G883H https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202302135 Theoretical Study of the Photophysical and Photochemical Properties of 1H‐Benzimidazole and 2‐Ethyl‐7‐nitro‐5‐Substituted 1H‐Benzimidazoles
+4DTU24SP https://pubs.acs.org/doi/10.1021/jasms.4c00388 Comparison of Partially Denatured Cytochrome c Structural Ensembles in Solution and Gas Phases Using Cross-Linking Mass Spectrometry
+ZTBDIACQ https://pubs.rsc.org/an/article/149/1/125-136/795146 The role of solvation on the conformational landscape of α-synuclein
+3UX6TUX7 https://linkinghub.elsevier.com/retrieve/pii/S0019452222004976 Synthesis, computational, molecular docking studies and photophysical properties of (Z)-N-(pyrimidin-2-yl)-4-(thiophen-2-ylmethylene)amino) benzenesulfonamide
+DGS84ELF https://linkinghub.elsevier.com/retrieve/pii/S001945222300033X (E)-4-((4-chlorobenzylidene)amino)-N-(thiazole-2yl) benzenesulfonamide: Synthesis, characterization and electronic structure theory and docking studies
+9657WGY7 https://linkinghub.elsevier.com/retrieve/pii/S0019452222004988 Synthesis, Computational, Electronic spectra, and molecular docking studies of 4-((diphenylmethylene)amino)-N-(pyrimidin-2-yl)benzenesulfonamide
+WRKJQDYQ https://linkinghub.elsevier.com/retrieve/pii/S0167732222025946 Schiff bases from chlorine substituted anilines and salicylaldehyde: Synthesis, characterization, fluorescence, thermal features, biological studies and electronic structure investigations
+UWYTCZ8Q https://pnas.org/doi/full/10.1073/pnas.2115899118 Structure and RNA template requirements of Arabidopsis RNA-DEPENDENT RNA POLYMERASE 2
+N7KCTC3G https://www.nature.com/articles/s41564-023-01579-5 Double-stranded RNA sequencing reveals distinct riboviruses associated with thermoacidophilic bacteria from hot springs in Japan
+PTZBNDEP https://link.springer.com/10.1007/s40264-023-01373-6 SGLT2 Inhibitor Use and Risk of Breast Cancer Among Adult Women with Type 2 Diabetes
+LQVIDQKJ https://www.nature.com/articles/s41467-023-44208-9 Fast free energy estimates from λ-dynamics with bias-updated Gibbs sampling
+7MYDDIDJ https://linkinghub.elsevier.com/retrieve/pii/S0021925823002934 Identification of nonhistone substrates of the lysine methyltransferase PRDM9
+ZMFXT7BH https://onlinelibrary.wiley.com/doi/10.1002/anie.202114813 Exploring Unconventional SAM Analogues To Build Cell‐Potent Bisubstrate Inhibitors for Nicotinamide N ‐Methyltransferase
+MH42LYU7 https://linkinghub.elsevier.com/retrieve/pii/S1387380621000294 Gas-phase ion/ion chemistry for structurally sensitive probes of gaseous protein ion structure: Electrostatic and electrostatic to covalent cross-linking
+H9E5K64X https://www.mdpi.com/1420-3049/27/4/1381 Improved Cell-Potent and Selective Peptidomimetic Inhibitors of Protein N-Terminal Methyltransferase 1
+F5MDMDB4 https://linkinghub.elsevier.com/retrieve/pii/S0021925817504457 Mutant thermal proteome profiling for characterization of missense protein variants and their associated phenotypes within the proteome
+5FLD5PFF https://iopscience.iop.org/article/10.3847/2515-5172/ad9f60 An Exploration of Molecular Lines for Abundance Analysis in M-dwarf IR Spectra
+95B75HUQ https://pubs.acs.org/doi/10.1021/acsami.4c19673 Anisotropically Shaped Plasmonic WO 3– x Nanostructure-Driven Ultrasensitive SERS Detection and Machine Learning-Based Differentiation of Nitro-Explosives
+4FTVALRG https://www.eneuro.org/lookup/doi/10.1523/ENEURO.0379-24.2024 Impulsive Choices Emerge When the Anterior Cingulate Cortex Fails to Encode Deliberative Strategies
+6DZLJL3E http://biorxiv.org/lookup/doi/10.1101/2024.06.07.597894 Neural basis of cognitive control signals in anterior cingulate cortex during delay discounting
+GV3GI356 https://linkinghub.elsevier.com/retrieve/pii/S0028390823003520 Non-consummatory behavior signals predict aversion-resistant alcohol drinking in head-fixed mice
+MPISGHEC https://www.jci.org/articles/view/180417 Addiction of primary cutaneous γδ T cell lymphomas to JAK/STAT signaling
+S7IE4IZU https://linkinghub.elsevier.com/retrieve/pii/S2666979X25001028 Deciphering genetic regulation at single-cell resolution in gastric cancer
+NW88LLED http://medrxiv.org/lookup/doi/10.1101/2023.04.18.23288742 Gut community structure as a risk factor for infection in Klebsiella -colonized patients
+L64FNVBS https://academic.oup.com/nar/article/52/D1/D426/7337615 DescribePROT in 2023: more, higher-quality and experimental annotations and improved data download options
+PF2EQTHU https://journals.asm.org/doi/10.1128/mbio.03125-22 Haemophilus ducreyi Infection Induces Oxidative Stress, Central Metabolic Changes, and a Mixed Pro- and Anti-inflammatory Environment in the Human Host
+WGUN57G2 https://academic.oup.com/jid/article/227/3/317/6649666 Dispensability of Ascorbic Acid Uptake and Utilization Encoded by ulaABCD for the Virulence of Haemophilus ducreyi in Humans
+LAI33KBV https://journals.asm.org/doi/10.1128/iai.00176-23 Formate production is dispensable for Haemophilus ducreyi virulence in human volunteers
+JINLHKZL https://elifesciences.org/articles/81083 GCN2 eIF2 kinase promotes prostate cancer by maintaining amino acid homeostasis
+UJ646HFX https://www.science.org/doi/10.1126/scisignal.adp1375 Coordination between the eIF2 kinase GCN2 and p53 signaling supports purine metabolism and the progression of prostate cancer
+HIJU66ZC https://journals.asm.org/doi/10.1128/msystems.00786-24 Gut community structure as a risk factor for infection in Klebsiella pneumoniae -colonized patients
+DXXJ5BVP https://journals.asm.org/doi/10.1128/jb.00005-22 Genes Differentially Expressed by Haemophilus ducreyi during Anaerobic Growth Significantly Overlap Those Differentially Expressed during Experimental Infection of Human Volunteers
+4TMQLTVL https://journals.asm.org/doi/10.1128/iai.00058-24 A Haemophilus ducreyi strain lacking the yfeABCD iron transport system is virulent in human volunteers
+S9T6A7MF https://www.science.org/doi/10.1126/sciadv.adn1927 Comprehensive characterization of the transcriptional landscape in Alzheimer’s disease (AD) brains
+6WVW3RAA https://www.nature.com/articles/s41467-024-45159-5 The role of interdecadal climate oscillations in driving Arctic atmospheric river trends
+LC72CU7H https://rmets.onlinelibrary.wiley.com/doi/10.1002/gdj3.188 A convection‐permitting dynamically downscaled dataset over the Midwestern United States
+F6QWK5EH https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL104417 Quantifying the Efficiency of Stratospheric Aerosol Geoengineering at Different Altitudes
+KDL6RER3 https://journals.sagepub.com/doi/10.1089/hum.2025.002 Bioinformatic Analysis of the Genetic Basis of Differential Adeno-Associated Virus Production Capability of 293 Variants
+U5PD9PPL https://linkinghub.elsevier.com/retrieve/pii/S0002944025001543 The Patatin-Like Phospholipase Domain–Containing 3 148M Variant Exacerbates Alcohol-Induced Liver Injury and Tumorigenesis in Mice
+E5PZYM9M https://pnas.org/doi/full/10.1073/pnas.2202230119 Scenarios for modeling solar radiation modification
+6RT2D8UD https://link.aps.org/doi/10.1103/PhysRevD.111.014002 Studying π + π − photoproduction beyond Pomeron exchange
+FVPGSI9N https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL107702 The Potential of Stratospheric Aerosol Injection to Reduce the Climatic Risks of Explosive Volcanic Eruptions
+A7EBGDD9 https://pos.sissa.it/465/041 A Comprehensive Study of Double pion Photoproduction: A Regge Approach
+YN49DD4Q https://esd.copernicus.org/articles/13/201/2022/ How large is the design space for stratospheric aerosol geoengineering?
+CDZGB4MP https://www.mdpi.com/2504-2289/9/3/66 PK-Judge: Enhancing IP Protection of Neural Network Models Using an Asymmetric Approach
+N2RDECF7 https://aacrjournals.org/cancerdiscovery/article/15/3/511/752115/Ancestral-Differences-in-Anticancer-Treatment Ancestral Differences in Anticancer Treatment Efficacy and Their Underlying Genomic and Molecular Alterations
+DNL8J4AL https://acp.copernicus.org/articles/23/13665/2023/ Injection strategy – a driver of atmospheric circulation and ozone response to stratospheric aerosol geoengineering
+ZFLNCH59 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020GL088337 Seasonally Modulated Stratospheric Aerosol Geoengineering Alters the Climate Outcomes
+IJD6J6DE https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020JD033952 Is Turning Down the Sun a Good Proxy for Stratospheric Sulfate Geoengineering?
+GXI43IVY https://acp.copernicus.org/articles/23/687/2023/ Climate response to off-equatorial stratospheric sulfur injections in three Earth system models – Part 2: Stratospheric and free-tropospheric response
+7WAJUJ5R https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL094058 Sensitivity of Total Column Ozone to Stratospheric Sulfur Injection Strategies
+AZCSAFZK https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL092696 High‐Latitude Stratospheric Aerosol Geoengineering Can Be More Effective if Injection Is Limited to Spring
+8GTPACN3 https://gmd.copernicus.org/articles/17/2583/2024/ G6-1.5K-SAI: a new Geoengineering Model Intercomparison Project (GeoMIP) experiment integrating recent advances in solar radiation modification studies
+Q46N25ZH https://rmets.onlinelibrary.wiley.com/doi/10.1002/joc.7391 Impact of solar geoengineering on temperatures over the Indonesian Maritime Continent
+A4R42GL5 https://esd.copernicus.org/articles/11/1051/2020/ Expanding the design space of stratospheric aerosol geoengineering to include precipitation-based objectives and explore trade-offs
+CXR8FF38 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020GL089470 Reduced Poleward Transport Due to Stratospheric Heating Under Stratospheric Aerosols Geoengineering
+NHUEWDPN https://www.nature.com/articles/s41598-021-89249-6 Response of the Indian summer monsoon to global warming, solar geoengineering and its termination
+MYEZBMSD http://www.emerald.com/ijccsm/article/14/4/399-423/123536 Influence of stratospheric aerosol geoengineering on temperature mean and precipitation extremes indices in Africa
+ISIBN6KS https://acp.copernicus.org/articles/21/1287/2021/ North Atlantic Oscillation response in GeoMIP experiments G6solar and G6sulfur: why detailed modelling is needed for understanding regional implications of solar radiation management
+V4YNDWAQ https://acp.copernicus.org/articles/21/8845/2021/ Harnessing stratospheric diffusion barriers for enhanced climate geoengineering
+FKW9B7TU https://linkinghub.elsevier.com/retrieve/pii/S0048969722079098 Implication of stratospheric aerosol geoengineering on compound precipitation and temperature extremes in Africa
+9SS95WT9 https://www.nature.com/articles/s41612-022-00254-6 Changes in Hadley circulation and intertropical convergence zone under strategic stratospheric aerosol geoengineering
+MGQCZ8WZ https://acp.copernicus.org/articles/23/663/2023/ Climate response to off-equatorial stratospheric sulfur injections in three Earth system models – Part 1: Experimental protocols and surface changes
+JB8VNT2B https://iopscience.iop.org/article/10.1088/1748-9326/abacf7 Assessing terrestrial biogeochemical feedbacks in a strategically geoengineered climate
+6U55QJ9R https://esd.copernicus.org/articles/13/1233/2022/ Indices of extremes: geographic patterns of change in extremes and associated vegetation impacts under climate intervention
+9KQGR8Y4 https://acp.copernicus.org/articles/22/2999/2022/ The impact of stratospheric aerosol intervention on the North Atlantic and Quasi-Biennial Oscillations in the Geoengineering Model Intercomparison Project (GeoMIP) G6sulfur experiment
+X4W3PRMX https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022EF003052 High‐Latitude Stratospheric Aerosol Injection to Preserve the Arctic
+WPBV58L2 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL104726 Potential Non‐Linearities in the High Latitude Circulation and Ozone Response to Stratospheric Aerosol Injection
+CJACLNAC https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022GL098773 The Overlooked Role of the Stratosphere Under a Solar Constant Reduction
+VKVLIRUE https://acp.copernicus.org/articles/23/5149/2023/ Opinion: The scientific and community-building roles of the Geoengineering Model Intercomparison Project (GeoMIP) – past, present, and future
+BZ2FUFAT https://acp.copernicus.org/articles/21/4231/2021/ Comparing different generations of idealized solar geoengineering simulations in the Geoengineering Model Intercomparison Project (GeoMIP)
+A7ZXIBEY https://acp.copernicus.org/articles/22/1739/2022/ Limitations of assuming internal mixing between different aerosol species: a case study with sulfate geoengineering simulations
+WPD8H7VE https://acp.copernicus.org/articles/22/5757/2022/ An approach to sulfate geoengineering with surface emissions of carbonyl sulfide
+HYS8F7HX https://linkinghub.elsevier.com/retrieve/pii/S0304383524006992 The pharmacogenomic and immune landscape of snoRNAs in human cancers
+LQMTBV9X https://iopscience.iop.org/article/10.3847/2041-8213/ad0fea TOI-1670 c, a 40 day Orbital Period Warm Jupiter in a Compact System, Is Well Aligned
+I922X2TU https://iopscience.iop.org/article/10.3847/1538-3881/ad09de Evidence for Low-level Dynamical Excitation in Near-resonant Exoplanet Systems*
+T6W7RWHV http://biorxiv.org/lookup/doi/10.1101/2024.04.27.591458 xSiGra: Explainable model for single-cell spatial data elucidation
+BGQAI2D9 https://pos.sissa.it/453/292 Update on the gradient flow scale on the 2+1+1 HISQ ensembles
+IL5RFIFF https://link.aps.org/doi/10.1103/PhysRevD.107.114514 Light-quark connected intermediate-window contributions to the muon g − 2 hadronic vacuum polarization from lattice QCD
+C7SS4XYW https://onlinelibrary.wiley.com/doi/10.1002/fld.5152 Data assimilation with higher order finite element interpolants
+FABBEXVP https://linkinghub.elsevier.com/retrieve/pii/S1468121822000839 Continuous data assimilation for the 3D Ladyzhenskaya model: analysis and computations
+GMMF6JFJ https://linkinghub.elsevier.com/retrieve/pii/S0021999122004570 Continuous data assimilation for two-phase flow: Analysis and simulations
+8Q8PXUJZ https://www.mdpi.com/2072-6694/15/17/4411 Genetic Regulation of Human isomiR Biogenesis
+3YZVP5NY http://biorxiv.org/lookup/doi/10.1101/2023.11.04.565623 Exploring building blocks of cell organization by estimating network motifs using graph isomorphism network
+8RRNEDDA http://biorxiv.org/lookup/doi/10.1101/2024.05.06.592851 scBSP: A fast and accurate tool for identifying spatially variable genes from spatial transcriptomic data
+4WZRDWIG http://biorxiv.org/lookup/doi/10.1101/2023.11.09.566479 Exploring the Mosaic-like Tissue Architecture of Kidney Diseases Using Relation Equivariant Graph Neural Networks on Spatially Resolved Transcriptomics
+LU3E8KG8 https://www.eneuro.org/lookup/doi/10.1523/ENEURO.0385-23.2024 Proactive Versus Reactive Control Strategies Differentially Mediate Alcohol Drinking in Male Wistars and P Rats
+36WWGAQ6 https://www.nature.com/articles/s41467-022-31731-4 Compulsive alcohol drinking in rodents is associated with altered representations of behavioral control and seeking in dorsal medial prefrontal cortex
+YEAAC9IC http://biorxiv.org/lookup/doi/10.1101/2023.06.15.545101 Flexible coding schemes in dorsomedial prefrontal cortex underlie decision-making during delay discounting
+8D744EV8 https://www.jneurosci.org/lookup/doi/10.1523/JNEUROSCI.1490-23.2023 Neural activity in anterior insula at drinking onset and licking relates to compulsion-like alcohol consumption
+4X4PVZ6F https://dx.plos.org/10.1371/journal.pone.0279841 Distinct cortico-striatal compartments drive competition between adaptive and automatized behavior
+HFFE2IF5 https://academic.oup.com/cercor/article/doi/10.1093/cercor/bhae172/7658636 Longitudinal MRI of the developing ferret brain reveals regional variations in timing and rate of growth
+2K5YB9WX https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020JD033746 Constraining and Characterizing the Size of Atmospheric Rivers: A Perspective Independent From the Detection Algorithm
+3JAIIVJN https://gmd.copernicus.org/articles/17/301/2024/ Scalable Feature Extraction and Tracking (SCAFET): a general framework for feature extraction from large climate data sets
+ZNDAFVKK https://journals.ametsoc.org/view/journals/clim/35/12/JCLI-D-21-0590.1.xml Exploratory Precipitation Metrics: Spatiotemporal Characteristics, Process-Oriented, and Phenomena-Based
+GF725DRW https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GL095335 Extreme Water Vapor Transport During the March 2021 Sydney Floods in the Context of Climate Projections
+SAN44Q7J https://www.researchsquare.com/article/rs-2038838/v1 Anthropogenic aerosols mask increases in US rainfall by greenhouse gases
+55ARYACY https://link.springer.com/10.1007/s00382-021-05638-7 Quantifying the influence of natural climate variability on in situ measurements of seasonal total and extreme daily precipitation
+LVBIYIIS https://gmd.copernicus.org/articles/17/3533/2024/ Identifying atmospheric rivers and their poleward latent heat transport with generalizable neural networks: ARCNNv1
+2FSFGD8K https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022JD037105 Characteristics and Variability of Winter Northern Pacific Atmospheric River Flavors
+VPDKV8Z4 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022GL102091 Future Atmospheric Rivers and Impacts on Precipitation: Overview of the ARTMIP Tier 2 High‐Resolution Global Warming Experiment
+M84VU9RK https://www.nature.com/articles/s41467-024-45504-8 Anthropogenic aerosols mask increases in US rainfall by greenhouse gases
+CHZ3TQLG https://link.springer.com/10.1007/s00382-022-06321-1 A framework for detection and attribution of regional precipitation change: Application to the United States historical record
+58UBRXB7 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022GL099186 Sign of Observed California Temperature Trends Depends on Data Set Homogenization: Implications for Weighting and Downscaling
+9CTYZMS5 https://journals.sagepub.com/doi/full/10.3233/JAD-231286 Associations Between Neuroinflammation-Related Conditions and Alzheimer’s Disease: A Study of US Insurance Claims Data
+JGF6J33T https://link.springer.com/10.1007/s40264-023-01370-9 Application of an Innovative Data Mining Approach Towards Safe Polypharmacy Practice in Older Adults
+USAA62Z2 http://biorxiv.org/lookup/doi/10.1101/2023.12.20.572422 Measure of major contents in animal and plant genomes, using Gnodes, finds under-assemblies of model plant, Daphnia, fire ant and others
+KJ6JYPR4 http://biorxiv.org/lookup/doi/10.1101/2022.05.13.491861 Genes ruler for genomes, Gnodes, measures assembly accuracy in animals and plants
+BIP7WFHS https://peerj.com/articles/6374 Genes of the pig, Sus scrofa , reconstructed with EvidentialGene
+Y9C2ZE8E http://biorxiv.org/lookup/doi/10.1101/829184 Longest protein, longest transcript or most expression, for accurate gene reconstruction of transcriptomes?
+9PMF953D https://ieeexplore.ieee.org/document/10271940/ Data-To-Question Generation Using Deep Learning
+LRX46SGG https://journals.biologists.com/dev/article/150/18/dev201872/329481/Polycomb-safeguards-imaginal-disc-specification Polycomb safeguards imaginal disc specification through control of the Vestigial–Scalloped complex
+5SINRRWN http://biorxiv.org/lookup/doi/10.1101/2024.04.09.588498 Drug-loaded nanoparticles for cancer therapy: a high-throughput multicellular agent-based modeling study
+3BBE9CG3 http://biorxiv.org/lookup/doi/10.1101/2023.10.17.562733 A multiscale model of immune surveillance in micrometastases: towards cancer patient digital twins
+XRSAHMAR https://www.nature.com/articles/s41467-024-48484-x Effects of SPI1-mediated transcriptome remodeling on Alzheimer’s disease-related phenotypes in mouse models of Aβ amyloidosis
+5V3KW7XY http://www.actaphys.uj.edu.pl/findarticle?series=Sup&vol=16&aid=8-A22 Confining Potential in Coulomb-gauge Lattice QCD
+FBJ3DWKX https://link.aps.org/doi/10.1103/PhysRevD.108.076001 Ambiguities in partial wave analysis of two spinless meson photoproduction
+B8QWSHUJ https://link.aps.org/doi/10.1103/PhysRevD.108.054018 Dynamics in near-threshold J / ψ photoproduction
+TF7G3BMP https://dl.acm.org/doi/10.1145/3674829.3675060 AAVE Corpus Generation and Low-Resource Dialect Machine Translation
+KVM764EB https://iopscience.iop.org/article/10.3847/1538-3881/ad61d8 Evidence for Primordial Alignment: Insights from Stellar Obliquity Measurements for Compact Sub-Saturn Systems
+NQ9M2Z3Y https://iopscience.iop.org/article/10.3847/2041-8213/ad7469 Single-star Warm-Jupiter Systems Tend to Be Aligned, Even around Hot Stellar Hosts: No Teff –λ Dependency*
+6GWRDIHT https://ijpds.org/article/view/2395 A statewide system for maternal-infant linked longitudinal surveillance: Indiana's model for improving maternal and child health
+7QQPALFS https://bmjopen.bmj.com/lookup/doi/10.1136/bmjopen-2023-073791 Using electronic health records to enhance surveillance of diabetes in children, adolescents and young adults: a study protocol for the DiCAYA Network
+QVKLSVLM https://bmcpublichealth.biomedcentral.com/articles/10.1186/s12889-024-19772-4 Tracking the burden, distribution, and impact of Post-COVID conditions in diverse populations for children, adolescents, and adults (Track PCC): passive and active surveillance protocols
+VMUE3U7K https://link.aps.org/doi/10.1103/PhysRevD.110.094509 Coulomb confinement in the Hamiltonian limit
+4DY6M3ZQ https://academic.oup.com/mnras/article/537/2/1518/7965979 A dusty dawn: galactic dust buildup at z ≳ 5
+J4A3WP77 https://www.nature.com/articles/s41380-023-02111-1 RNA alternative splicing impacts the risk for alcohol use disorder
+XCL7WUAS https://advanced.onlinelibrary.wiley.com/doi/10.1002/adom.202400801 Design of Light‐Induced Solid‐State Plasmonic Rulers via Tethering Photoswitchable Molecular Machines to Gold Nanostructures Displaying Angstrom Length Resolution
+KN6KJ8F4 https://pubs.acs.org/doi/10.1021/acs.jpcb.4c04100 CHARMM at 45: Enhancements in Accessibility, Functionality, and Speed
+MVN7HNSA https://genomebiology.biomedcentral.com/articles/10.1186/s13059-019-1847-4 RegSNPs-intron: a computational framework for predicting pathogenic impact of intronic single nucleotide variants
+536GNGE7 https://ascpt.onlinelibrary.wiley.com/doi/10.1002/cpt.2018 Circulating miRNAs as Biomarkers for CYP2B6 Enzyme Activity
+GY9YDG8J https://www.science.org/doi/10.1126/sciadv.adu0772 TGFβ-dependent signaling drives tumor growth and aberrant extracellular matrix dynamics in NF1-associated plexiform neurofibroma
+Z7S6TSJ7 https://link.springer.com/10.1007/s00401-024-02775-1 Enhanced microglial dynamics and a paucity of tau seeding in the amyloid plaque microenvironment contribute to cognitive resilience in Alzheimer’s disease
+5SF4EWC5 https://iopscience.iop.org/article/10.3847/1538-3881/ad6b7f SOLES XII. The Aligned Orbit of TOI-2533 b, a Transiting Brown Dwarf Orbiting an F8-type Star
+2GICQX7M https://aacrjournals.org/clincancerres/article/31/10/1988/762200/DLK1-Distinguishes-Subsets-of-NF1-Associated DLK1 Distinguishes Subsets of NF1-Associated Malignant Peripheral Nerve Sheath Tumors with Divergent Molecular Signatures
+HEJMXCBM https://scholarworks.iu.edu/journals/index.php/thst/article/view/37892 Incorporating Climate Engineering into Secondary Education: A New Direction for Indiana’s Science Classrooms
+QK65IL5D https://aacrjournals.org/clincancerres/article/30/5/1038/734307/Spatial-Gene-Expression-Profiling-Unveils-Immuno Spatial Gene-Expression Profiling Unveils Immuno-oncogenic Programs of NF1-Associated Peripheral Nerve Sheath Tumor Progression
+MRSEQA4V https://iopscience.iop.org/article/10.3847/2041-8213/adc129 From Misaligned Sub-Saturns to Aligned Brown Dwarfs: The Highest Mp / M* Systems Exhibit Low Obliquities, Even around Hot Stars*
+MEUK2BCD https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.13901 Loss of Inpp5d has disease‐relevant and sex‐specific effects on glial transcriptomes
+795KFJ6U https://linkinghub.elsevier.com/retrieve/pii/S221287782400139X Glucose intolerance as a consequence of hematopoietic stem cell dysfunction in offspring of obese mice
+WLSNBM2J https://www.aanda.org/10.1051/0004-6361/202450954 Inference of black-hole mass fraction in Galactic globular clusters: A multi-dimensional approach to break the initial-condition degeneracies
+VSRQ39PE https://www.nature.com/articles/s41375-024-02312-9 Combination of menin and kinase inhibitors as an effective treatment for leukemia with NUP98 translocations
+5PNA6DFH https://www.aanda.org/10.1051/0004-6361/202451054 A 3D view of multiple populations’ kinematics in Galactic globular clusters
+SCRL6Z98 https://linkinghub.elsevier.com/retrieve/pii/S1532046425000887 A trajectory-informed model for detecting drug-drug-host interaction from real-world data
+F35YR5DN https://academic.oup.com/mnras/article/534/3/2397/7775518 Energy equipartition in multiple-population globular clusters
+7ISLCL2S https://www.aanda.org/10.1051/0004-6361/202452786 Exploring the formation environment and dynamics of multiple stellar populations in globular clusters through binary systems
+G257K84K https://www.nature.com/articles/s41598-025-98528-5 A theoretical model for detecting drug interaction with awareness of timing of exposure
+5JLHKK3V https://www.aanda.org/10.1051/0004-6361/202348653 MOCCA: Global properties of tidally filling and underfilling globular star clusters with multiple stellar populations
+DL8NCY27 https://academic.oup.com/ajrccm/article/211/Supplement_1/A7716/8339319 Novel Insights Into Right Ventricular Dysfunction in Pulmonary Arterial Hypertension: The Role of Mitochondrial Dysfunction and Cell Cycle Arrest
+LWSVZFHV https://journals.lww.com/10.2215/CJN.0000000687 Risk of Urinary Tract Infections with Sodium-Glucose Transport Protein-2 Inhibitors in Subpopulations with Abnormal Genitourinary Pathology
+K65NX3EW https://dl.acm.org/doi/10.1145/3703157 Scaling Terrain-Aware Spatial Machine Learning for Flood Mapping on Large Scale Earth Imagery Data
+2Z3YHIPQ https://www.aimsciences.org//article/doi/10.3934/jcd.2019006 Numerical efficacy study of data assimilation for the 2D magnetohydrodynamic equations
+5TTQFNBH https://onlinelibrary.wiley.com/doi/10.1002/sim.10216 A Precision Mixture Risk Model to Identify Adverse Drug Events in Subpopulations Using a Case‐Crossover Design
+GGVRZHQG https://linkinghub.elsevier.com/retrieve/pii/S0168169924008184 CattleAssigner: A framework for accurate assignment of individuals to cattle lineages and populations using minimum informative markers
+HTS6QZJC https://molecular-cancer.biomedcentral.com/articles/10.1186/s12943-025-02311-z LSD1 inhibition attenuates targeted therapy-induced lineage plasticity in BRAF mutant colorectal cancer
+EG5VRFI4 https://link.springer.com/10.1007/s11538-024-01408-8 A Simple Framework for Agent-Based Modeling with Extracellular Matrix
+C7WV2ZB2 https://www.nature.com/articles/s44401-025-00018-3 Enhancing medical coding efficiency through domain-specific fine-tuned large language models
+V9RNKVPN https://www.mdpi.com/2072-6694/16/11/2040 Single-Cell Profiling Reveals the Impact of Genetic Alterations on the Differentiation of Inflammation-Induced Murine Colon Tumors
+RIMV8A7A https://www.aanda.org/10.1051/0004-6361/202453155 Phase-space mixing of multiple stellar populations in globular clusters
+VVZ4H54D https://onlinelibrary.wiley.com/doi/10.1111/ede.70004 A Conserved Somatic Sex Determination Cascade Instructs Trait‐Specific Sexual Dimorphism in Horned Dung Beetles
+YWCG7BTB https://www.cambridge.org/core/product/identifier/S002214302500036X/type/journal_article The effect of melt-channel geometry on ice-shelf flow
+KM9SZ58H https://www.aanda.org/10.1051/0004-6361/202453252 SIEGE: IV. Compact star clusters in cosmological simulations with a high star formation efficiency and subparsec resolution
+RP7DALNM https://www.frontiersin.org/articles/10.3389/fmed.2022.1029227/full Predicting melanoma survival and metastasis with interpretable histopathological features and machine learning models
+5ND6IVDD https://www.aanda.org/10.1051/0004-6361/202452876 SIEGE: III. The formation of dense stellar clusters in sub-parsec resolution cosmological simulations with individual star feedback
+CZVPPMEN https://elifesciences.org/articles/97981 Robust single-nucleus RNA sequencing reveals depot-specific cell population dynamics in adipose tissue remodeling during obesity
+4Y52UEQ8 https://bmcpublichealth.biomedcentral.com/articles/10.1186/s12889-025-22425-9 Equivalence of electronic health record data for measuring hypertension prevalence: a retrospective comparison to BRFSS with data from two Indiana health systems, 2021
+9GUZZC9W https://link.aps.org/doi/10.1103/PhysRevD.111.094508 Hadronic vacuum polarization for the muon g − 2 from lattice QCD: Complete short and intermediate windows
+ND4ZLDA3 https://www.aanda.org/10.1051/0004-6361/202554038 A JWST project on 47 Tucanae: Kinematics, energy equipartition, and anisotropy of multiple populations
+QZTMRUSZ https://linkinghub.elsevier.com/retrieve/pii/S0893395225000936 Multimodal Explainable Artificial Intelligence for Prognostic Stratification of Patients With Glioblastoma
+4U3MJ7SC https://linkinghub.elsevier.com/retrieve/pii/S0899707125001561 Comparative analysis of machine learning-derived nomogram and biomarkers in predicting side-specific extraprostatic extension: Preliminary findings
+UW6TXJXC https://aacrjournals.org/cancerres/article/85/8_Supplement_1/6247/758662/Abstract-6247-Artificial-intelligence-predicts Abstract 6247: Artificial intelligence predicts 2021 WHO glioma subtypes from whole slide images
+KD4ADUVY https://aplm.kglmeridian.com/view/journals/arpa/149/10/article-p922.xml Artificial Intelligence–Based Classification of Renal Oncocytic Neoplasms: Advancing From a 2-Class Model of Renal Oncocytoma and Low-Grade Oncocytic Tumor to a 3-Class Model Including Chromophobe Renal Cell Carcinoma
+MIKU6AFN https://linkinghub.elsevier.com/retrieve/pii/S0022480424006103 Use of Deep Learning to Identify Peripheral Arterial Disease Cases From Narrative Clinical Notes
+DWMCUJYJ http://biorxiv.org/lookup/doi/10.1101/2021.08.20.457158 Chromosomal rearrangements preserve adaptive divergence in ecological speciation
+RRWSDCUV https://pos.sissa.it/466/412 Lattice gauge ensembles and data management
+KJKEJJXH https://www.frontiersin.org/articles/10.3389/fnins.2024.1304191/full Prognostic stratification of glioblastoma patients by unsupervised clustering of morphology patterns on whole slide images furthering our disease understanding
+P95MM677 https://ieeexplore.ieee.org/document/10635869/ Weakly Supervised IDH-Status Glioma Classification from H&E-Stained Whole Slide Images
+XMJVJSCQ https://academic.oup.com/neuro-oncology/article/26/Supplement_8/viii187/7890259 PATH-39. AI-BASED IDENTIFICATION OF GLIOMA IDH MUTATIONAL STATUS FROM H&E-STAINED WHOLE SLIDE IMAGES
+I4KWPS94 https://www.nature.com/articles/s41467-025-64632-3 Gut bacterial dysbiosis in pediatric severe malaria associates with post-discharge mortality
+KJL5FH6G https://rupress.org/jem/article/220/11/e20230180/276197/Network-analysis-identifies-strain-dependent Network analysis identifies strain-dependent response to tau and tau seeding-associated genes
+3PCSHMLJ https://www.science.org/doi/10.1126/sciadv.abe3954 Deletion of Abi3 gene locus exacerbates neuropathological features of Alzheimer’s disease in a mouse model of Aβ amyloidosis
+XIRNPLWK https://chemrxiv.org/doi/full/10.26434/chemrxiv-2025-hg8n7 Enhancing Gaussian process regression-accelerated QM/MM free energy simulations using atomic environment descriptors
+QNAZ4XE3 https://dx.plos.org/10.1371/journal.ppat.1013128 The molecular basis for DNA-binding by competence T4P is distinct in a representative Gram-positive and Gram-negative species
+9PAFQJJB https://linkinghub.elsevier.com/retrieve/pii/S2213158225002128 Resting state functional connectivity patterns associate with alcohol use disorder characteristics: Insights from the triple network model
+66DCA4PD https://pnas.org/doi/10.1073/pnas.2421764122 DprA recruits ComM to facilitate recombination during natural transformation in Gram-negative bacteria
+JTL92NLU https://linkinghub.elsevier.com/retrieve/pii/S0376871625004521 Alcohol-seeking associations with resting state functional connectivity of the amygdala
+HUZ8QQGU https://www.jci.org/articles/view/180117 Inflammation primes the murine kidney for recovery by activating AZIN1 adenosine-to-inosine editing
+8F829PIF https://www.frontiersin.org/articles/10.3389/fenvs.2026.1770260/full A foundation-model GeoAI framework for continuous heat and health risk mapping
+ITL9ZY3R https://direct.mit.edu/imag/article/doi/10.1162/imag_a_00504/128177/Individual-patterns-of-functional-connectivity-in Individual patterns of functional connectivity in neonates as revealed by surface-based Bayesian modeling
+7VDECZMC https://royalsocietypublishing.org/doi/10.1098/rsfs.2024.0024 Robust data-driven segmentation of pulsatile cerebral vessels using functional magnetic resonance imaging
+YBNXJTGT https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021GH000423 Spatiotemporal Associations Between Social Vulnerability, Environmental Measurements, and COVID‐19 in the Conterminous United States
+CIEA3QMH https://linkinghub.elsevier.com/retrieve/pii/S1877584523000606 Examining associations between social vulnerability indices and COVID-19 incidence and mortality with spatial-temporal Bayesian modeling
+W5LJPKRU https://www.frontiersin.org/articles/10.3389/fpubh.2022.876691/full Predicting COVID-19 community infection relative risk with a Dynamic Bayesian Network
+J2X9GEPH https://www.mdpi.com/2813-4168/3/4/33 Evaluating PM2.5 Exposure Disparities Through Agent-Based Geospatial Modeling in an Urban Airshed
+RV8KJNKJ https://linkinghub.elsevier.com/retrieve/pii/S0957582021000586 Artificial intelligence based monitoring system for onsite septic systems failure
+5TK6JHLQ https://pnas.org/doi/10.1073/pnas.2421277122 The world through infant eyes: Evidence for the early emergence of the cardinal orientation bias
+XUC7ZSR2 https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.70949 Deletion of neuronal Idol ameliorates Alzheimer's disease–related pathologies via APOE receptors
+9DQMJ2RR http://biorxiv.org/lookup/doi/10.1101/2025.04.08.647882 Application of Whole Proteome Thermal Shift Assays to Define PERK-dependent Changes in Protein Homeostasis during the Unfolded Protein Response
+S8YWPTR9 https://linkinghub.elsevier.com/retrieve/pii/S2667237526000378 Comparative analysis of nuclei isolation methods for brain single-nucleus RNA sequencing
+DKZ5RCL8 https://linkinghub.elsevier.com/retrieve/pii/S0895435625003373 Theory of clinical therapeutic progress: reconciling equipoise with fat-tailed (skewed) outcomes
+9NY3B92X http://biorxiv.org/lookup/doi/10.1101/2024.05.15.594427 Unraveling systemic responses to NQO1-activated IB-DNQ and Rucaparib single and dual agent therapy in triple-negative breast cancers
+MU2N7BWY https://linkinghub.elsevier.com/retrieve/pii/S0895435625001611 There is no upper limit on the maximum effect that can be detected in randomized trials
+X6ETE5JU https://www.nature.com/articles/s41467-026-72816-8 A retrospective pharmacovigilance analysis based on the FAERS database reveals sex-associated differences in toxicities of CAR T-cell therapy
+558N94CN https://www.ahajournals.org/doi/10.1161/JAHA.124.037197 Relationship Between Health Care Team Segregation and Receipt of Care by a Cardiologist According to Patient Race in a Midwestern State
+L69ISY4U https://pubs.aip.org/jcp/article/164/11/114111/3383857/Enhancing-Gaussian-process-regression-accelerated Enhancing Gaussian process regression-accelerated QM/MM free energy simulations using atomic environment descriptors
+G4V9IVIZ https://link.aps.org/doi/10.1103/4mqg-l8f5 Influence of chromium intercalation in self-intercalated van der Waals magnets C r 1 + δ T e 2
+NU6NFLUU https://pubs.acs.org/doi/10.1021/acs.nanolett.6c00013 Tunable Hidden Altermagnetic Spin Splitting in Layered Ruddlesden–Popper Oxides
+A5UMCLVT https://linkinghub.elsevier.com/retrieve/pii/S2590136226000707 Trust in federal statistical agencies and vaccine uptake among U.S. adults
+WB6WXXAC https://www.ahajournals.org/doi/10.1161/CIRCOUTCOMES.124.011643 Relationship Between Race, Predelivery Cardiology Care, and Cardiovascular Outcomes in Preeclampsia/Eclampsia Among a Commercially Insured Population
+PVEHP5JH https://link.springer.com/10.1007/s10903-026-01896-x Mental Health Treatment Utilization Among Hispanic and Latino Adults in the United States: The Role of Immigration Status, Acculturation, and Socioeconomic Disadvantage
+8UZ74UFR https://linkinghub.elsevier.com/retrieve/pii/S2666602224000132 Association between social vulnerability index and admission urgency for transcatheter aortic valve replacement
+6QAGQU2K https://academic.oup.com/eschf/article/12/1/564/8261124 Association Between Clinician Team Segregation, Receipt of Cardiovascular Care and Outcomes in Valvular Heart Diseases
+SU4H63VY https://link.springer.com/10.1186/s12889-026-27199-2 Comparative evaluation of machine learning models for predicting COVID-19 vaccine uptake in U.S. adults
+3L8UB5AH https://link.springer.com/10.1007/s40615-023-01838-5 Association Between Race, Cardiology Care, and the Receipt of Guideline-Directed Medical Therapy in Peripartum Cardiomyopathy
+8THCC8DC https://pubs.acs.org/doi/10.1021/acs.jpca.5c02839 Photoelectron Spectroscopy of Fulvenallenyl and Fluorine-Substituted Fulvenallenyl Anions
+9V7FEXBK https://pubs.acs.org/doi/10.1021/acs.jpca.4c03434 Anion Photoelectron Imaging Spectroscopy of C6 F5 X– (X = F, Cl, Br, I)
+ECJE53T5 https://direct.mit.edu/netn/article/9/1/38/124897/Tangent-space-functional-reconfigurations-in Tangent space functional reconfigurations in individuals at risk for alcohol use disorder
+QIYG8JZP https://pubs.aip.org/jcp/article/162/5/054301/3333271/Electronic-structures-and-spin-frustration-in-Ln3O Electronic structures and spin frustration in Ln3O (Ln = Ce, Sm, Gd) neutrals and anions determined by anion photoelectron spectroscopy
+VAMJK2CA https://onlinelibrary.wiley.com/doi/10.1111/ejn.70150 Left Ventral Caudate Functional Connectivity Mediates the Relationship Between Habitual Responding and Alcohol Use
+HI8HMT2J https://www.cambridge.org/core/product/identifier/S2040174424000333/type/journal_article PedBE age and age acceleration in umbilical vein endothelial cells: an examination of infant birth outcomes
+IU3U5GNN https://linkinghub.elsevier.com/retrieve/pii/S0967586826000871 Critical radiographic findings and medical comorbidities in the management of thoracolumbar burst fractures
+7XYZ7TGC https://www.mdpi.com/2075-4418/15/5/642 Pain-Related White-Matter Changes Following Mild Traumatic Brain Injury: A Longitudinal Diffusion Tensor Imaging Pilot Study
+8R6AI46E https://www.nature.com/articles/s41380-024-02652-z DNA methylation profiles of cancer-related fatigue associated with markers of inflammation and immunometabolism
+R9GM42P4 https://onlinelibrary.wiley.com/doi/10.1002/dev.22464 Maternal childhood adversity and infant epigenetic aging: Moderation by restless sleep during pregnancy
+T9GXPLXW https://linkinghub.elsevier.com/retrieve/pii/S0022399923003756 Associations of differentially expressed genes with psychoneurological symptoms in patients with head and neck cancer: A longitudinal study
+WSNHW3I4 https://academic.oup.com/jamiaopen/article/doi/10.1093/jamiaopen/ooaf060/8186016 Integrating a risk prediction score in a clinical decision support to identify patients with health-related social needs in the emergency department
+T746TUTS https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.70238 Tau depletion diminishes vascular amyloid‐related deficits in a mouse model of cerebral amyloid angiopathy
+688IQMYN https://academic.oup.com/jbmrplus/article/7479137 L‐BAIBA Synergizes with Sub‐Optimal Mechanical Loading to Promote New Bone Formation
+CSVLMUL2 https://elifesciences.org/articles/92263 Deletion of FNDC5/irisin modifies murine osteocyte function in a sex-specific manner
+U2GUH8T8 https://academic.oup.com/jamiaopen/article/doi/10.1093/jamiaopen/ooae150/7945197 Development and validation of computable social phenotypes for health-related social needs
+H7Y9IKGL https://academic.oup.com/jbmrplus/article/doi/10.1093/jbmrpl/ziae054/7651121 Sex dimorphic response to osteocyte miR21 deletion in murine calvaria bone as determined by RNAseq analysis
+EJEIJNBW https://www.mdpi.com/3042-8807/1/1/6 Auditory Brainstem–Cortical Anatomy Relates to the Magnitude of Frequency-Following Responses (FFRs) and Event-Related Potentials (ERPs) Coding Speech-in-Noise
+Q83AR6Z6 https://iopscience.iop.org/article/10.3847/1538-3881/ad9dd5 Evidence for Primordial Alignment II: Insights from Stellar Obliquity Measurements for Hot Jupiters in Compact Multiplanet Systems
+73HHM3SR http://egastroenterology.bmj.com/lookup/doi/10.1136/egastro-2025-100181 Autophagy related 14 protects against liver injury by inhibiting multiple cell death pathways
+TXKG96I6 https://link.aps.org/doi/10.1103/PhysRevLett.133.135301 Universal Diffusion in Coulomb Crystals
+XLT4WE3G https://linkinghub.elsevier.com/retrieve/pii/S0167732223026272 Synthesis, characterization, and electronic structure of bioactive vanillin based fluorescent Schiff bases
+TL6NKG45 https://linkinghub.elsevier.com/retrieve/pii/S0925346724017336 Controlled synthesis of Ag–Au alloy nanoparticles for optimizing surface enhanced Raman scattering-based detection of antibiotic and pesticide residues
+FRDJYL9M https://www.science.org/doi/10.1126/science.adx3025 Total solar eclipse triggers dawn behavior in birds: Insights from acoustic recordings and community science
+72W9DH3R https://pubs.rsc.org/em/article/27/1/211-224/849466 A theoretical study on the environmental oxidation of fenpyrazamine fungicide initiated by hydroxyl radicals in the aqueous phase
+M8Q7VUM3 https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202401487 Exploring the Hydrogen Storage Potential of Allylamine Borane Using Density Functional Theory
+N9DFRBXL https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202403990 Rhodamine‐Based Fluorescence Probe for Monitoring of Lysosomal pH: Spectroscopic Insights and Cellular Applications
+35WQUJF6 https://journals.asm.org/doi/10.1128/mbio.00434-23 Host Association and Spatial Proximity Shape but Do Not Constrain Population Structure in the Mutualistic Symbiont Xenorhabdus bovienii
+ITQVXG2H https://linkinghub.elsevier.com/retrieve/pii/S2468823124008903 Silver- and gold-catalyzed azide−alkyne cycloaddition by functionalized NHC-based polynuclear catalysts: Computational investigation and mechanistic insights
+PIS47FLH https://linkinghub.elsevier.com/retrieve/pii/S001623612400396X Monte-Carlo simulations on H2 adsorption in kaolinite nanopore in the presence of CO2 and CH4 gases
+HANENQIN https://linkinghub.elsevier.com/retrieve/pii/S0045206825000860 Design, Synthesis, Biocompatibility, molecular docking and molecular dynamics studies of novel Benzo[b]thiophene-2-carbaldehyde derivatives targeting human IgM Fc Domains
+XQUUQMYA https://onlinelibrary.wiley.com/doi/10.1111/adb.70008 Intra‐striatal dopaminergic inter‐subject covariance in social drinkers and non‐treatment‐seeking alcohol use disorder participants
+IUM4WJML https://dl.acm.org/doi/10.1145/3491418.3530297 Scholarly Data Share: A Model for Sharing Big Data in Academic Research
+AV5A54JP https://dl.acm.org/doi/10.1145/3569951.3597585 Scholarly Data Share 2.0: Granular Access to Research Data
+VNZCPDYC https://link.springer.com/10.1186/s13046-026-03661-2 Iron diminishes immunosuppressive macrophages and enhances anti-PD-1 immunotherapy in breast cancer models
+SXLBS8TB https://onlinelibrary.wiley.com/doi/10.1002/pro.70148 Chemically induced partial unfolding of the multifunctional apurinic/apyrimidinic endonuclease 1
+MQCTUGW7 https://academic.oup.com/nar/article/doi/10.1093/nar/gkaf166/8069167 In silico λ-dynamics predicts protein binding specificities to modified RNAs
+MMZ6Z5JX https://link.springer.com/10.1007/s10456-024-09966-0 Ref-1 is overexpressed in neovascular eye disease and targetable with a novel inhibitor
+A6AQ7N29 https://academic.oup.com/ismecommun/article/doi/10.1093/ismeco/ycag050/8512089 Genomic diversification and tailocin-mediated competition in animal-associated Xenorhabdus bacteria
+SSNLUW9T https://pubs.acs.org/doi/10.1021/acs.jpcb.4c04805 Superimposing Ligands with a Ligand Overlay as an Alternate Topology Model for λ-Dynamics-Based Calculations
+BQDPD5Z5 https://pubs.acs.org/doi/10.1021/acs.jcim.4c00662 A λ-Dynamics Investigation of Insulin Wakayama and Other A3 Variant Binding Affinities to the Insulin Receptor
+PVP3EHBB https://academic.oup.com/mnras/article/doi/10.1093/mnras/stag1020/8698771 Ashes of FIRE: modelling dust grain size evolution in the Local Group with fire
+ELSX6DRQ https://www.science.org/doi/10.1126/sciadv.adj4509 Sequence and epigenetic landscapes of active and silent nucleolus organizer regions in Arabidopsis
+6F2YCR9H https://humgenomics.biomedcentral.com/articles/10.1186/s40246-024-00655-z Rapid discrimination between deleterious and benign missense mutations in the CAGI 6 experiment
+XR6HF7AA https://pubs.acs.org/doi/10.1021/acs.jpca.5c06858 Exploring Anomalous Photoelectron Angular Distributions in the Photoelectron Spectra of Gd3 O3– : Study of Gd3 O2– and Gd3 O3– Using Photoelectron Spectroscopy and Density Functional Theory Calculations
+DCTEYWSQ https://link.springer.com/10.1007/978-1-0716-4196-5_8 AlphaFold2, SPINE-X, and Seder on Four Hard CASP Targets
+WDR5DR8N https://pubs.acs.org/doi/10.1021/acs.jpca.5c06090 Evidence of HF Loss in C or C– + C6 Fx H 6– x (1 ≤ x ≤ 5) Reactions
+IC4ZJWBR https://pubs.aip.org/jcp/article/162/6/064304/3334586/Photoelectron-remnant-interaction-effect-on Photoelectron–remnant interaction effect on remnant wavefunction in low-kinetic energy electron detachment events
+T9LWK44S https://link.springer.com/10.1007/s00439-025-02731-3 Evaluation of enzyme activity predictions for variants of unknown significance in Arylsulfatase A
+ISVIWD9C https://ascpt.onlinelibrary.wiley.com/doi/10.1002/psp4.70116 A Population Pharmacokinetic Approach to Understand the Effect of Efavirenz on CYP3A Activity in Healthy Volunteers Using Midazolam as a Probe
+7ZQF6WIX https://www.nature.com/articles/s41409-026-02811-6 Advanced deep learning enables prediction of allogeneic stem cell mobilization success
+WPVSEPXL https://journals.biologists.com/dev/article/150/12/dev201071/320606/Defining-developmental-trajectories-of-prosensory Defining developmental trajectories of prosensory cells in human inner ear organoids at single-cell resolution
+Z34PDH5P https://iopscience.iop.org/article/10.3847/2041-8213/ae18c7 Early Evidence for Polar Orbits of Sub-Saturns around Hot Stars
+PEXLXH3A https://link.springer.com/10.1007/978-3-031-81596-6_25 Machine Learning-Based Tool for Efficient Discrimination Between Deleterious and Neutral Missense Mutations
+HP7SP5UE https://www.mdpi.com/2071-1050/16/23/10206 A Novel Hybrid Approach: Integrating Bayesian SPDE and Deep Learning for Enhanced Spatiotemporal Modeling of PM2.5 Concentrations in Urban Airsheds for Sustainable Climate Action and Public Health
+L6JS6VYU https://pubs.acs.org/doi/10.1021/jacs.4c17874 Reversible Interconversion of Nitrate and Nitrite Catalyzed by Periplasmic Nitrate Reductase from Campylobacter jejuni
+ZY2TY2UA https://iopscience.iop.org/article/10.3847/2041-8213/ae21c5 Unified Kraft Break at ∼6500 K: A Newly Identified Single-star Obliquity Transition Matches the Classical Rotation Break
+RCEU8ELH https://linkinghub.elsevier.com/retrieve/pii/S2666247724000939 Non-coding cause of congenital heart defects: Abnormal RNA splicing with multiple isoforms as a mechanism for heterotaxy
+FDGYRGV3 https://journals.biologists.com/bio/article/14/3/bio061677/367400/A-CRISPR-mis-insertion-in-the-Zic3-5-UTR-inhibits A CRISPR mis-insertion in the Zic3 5′UTR inhibits in vivo translation and is predicted to result in formation of an mRNA stem-loop hairpin
+B34K6AUA https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/trc2.70201 Acute anti‐Aβ antibody exposure induces microglial changes and significantly alters chemokine signaling
+H9UC2V5Z https://www.ahajournals.org/doi/10.1161/JAHA.124.039177 Identification of Long Noncoding RNA Candidate Disease Genes Associated With Clinically Reported Copy Number Variants in Congenital Heart Disease
+J4BZFFD5 https://www.nature.com/articles/s41390-025-03819-2 Genomics of pediatric cardiomyopathy
+352SY3LV https://academic.oup.com/neuro-oncology/article/28/1/282/8245054 AI-driven WHO 2021 classification of gliomas based only on H&E-stained slides
+XIXYDWIC https://academic.oup.com/noa/article/doi/10.1093/noajnl/vdaf140/8198427 Interpretable artificial intelligence based determination of glioma IDH mutation status directly from histology slides
+QQRQDXID https://ojs.aaai.org/index.php/AAAI/article/view/32124 Deep Reinforcement Learning with Time-Scale Invariant Memory
+85CGXSAS https://dl.acm.org/doi/10.1145/3626203.3670545 Automated Transcription Service: Enabling Transcription at Scale for Social Science Research
+RK2E9S6G https://academic.oup.com/g3journal/article/doi/10.1093/g3journal/jkaf107/8132832 Gene expression and pollen performance indicate altered postmating selection between Solanum species with different mating systems
+7VBEYIZL https://academic.oup.com/cercor/article/doi/10.1093/cercor/bhaf131/8157445 Functional reconfiguration between rest and movie watching relates to theory-of-mind performance among young and older adults
+H59H9GD9 https://academic.oup.com/neuro-oncology/article/27/Supplement_5/v256/8319301 PATH-67. AI-based WHO 2021 classification of adult-type diffuse glioma solely from H&E-stained slides
+56W8FPMC https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JH000496 Recommendations for Comprehensive and Independent Evaluation of Machine Learning‐Based Earth System Models
+2AJAUE2J https://academic.oup.com/neuro-oncology/article/27/Supplement_5/v257/8319199 PATH-69. AI-based prognostic risk stratification of adult-type diffuse gliomas using H&E-stained slides
+N99DMQIG https://ieeexplore.ieee.org/document/11316600/ Enhancing Robustness in Deep Convolutional Neural Networks Through Multiresolution Learning
+DKAFY695 https://ebooks.iospress.nl/doi/10.3233/SHTI250793 LLM-Integrated Normalization and Knowledge for FHIR (LINK-FHIR)
+75QDLD3K https://gmd.copernicus.org/articles/18/961/2025/ A new metrics framework for quantifying and intercomparing atmospheric rivers in observations, reanalyses, and climate models
+8DLECT5F http://biorxiv.org/lookup/doi/10.64898/2026.05.14.725274 Resolving the oak tree of life: comparing RADseq and whole genome resequencing methods for oak phylogenetics
+Z4BNJJIK https://pubs.acs.org/doi/10.1021/acs.jpca.5c06778 Experimental and Theoretical Study of the Kinetics of the OH + Methyl Ethyl Ketone Reaction as a Function of Temperature
+3NTPFTFC https://onlinelibrary.wiley.com/doi/10.1002/smll.73690 Peptide‐Ligand Cooperative Interplay Drives Gold Nanoparticle Encapsulation by Protein Cages
+F8DZ4DCZ https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JD042222 Atmospheric River Detection Under Changing Seasonality and Mean‐State Climate: ARTMIP Tier 2 Paleoclimate Experiments
+F96DNLRF https://dl.acm.org/doi/10.1145/3731599.3767347 ROSE: RADICAL Orchestrator for Surrogate Exploration
+JLSRDN4U https://academic.oup.com/jbmrplus/article/doi/10.1093/jbmrpl/ziag051/8541698 High-resolution profiling of osteocyte transcriptomes via single-nucleus RNA sequencing
+CTNUJ9X4 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JD042163 Similarities in Meteorological Composites Among Different Atmospheric River Detection Tools During Landfall Over Western Coastal North America
+PQ498YZ5 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023GL107236 Atmospheric Rivers in the Eastern and Midwestern United States Associated With Baroclinic Waves
+D2RJ6L8M https://onlinelibrary.wiley.com/doi/10.1111/omi.70015 Porphyromonas gingivalis –Derived Virulence Lipids Accelerate Osteoclastogenesis Independently of High Mobility Group Box Protein‐1 Canonical Signaling
+WAMPP3V6 https://pnas.org/doi/10.1073/pnas.2426638123 Neanderthal brain and cognition reconsidered
+G5WWTFS5 https://gmd.copernicus.org/articles/18/787/2025/ Moving beyond post hoc explainable artificial intelligence: a perspective paper on lessons learned from dynamical climate modeling
+S8LKXPFV https://www.aanda.org/10.1051/0004-6361/202556382 Evolution of the kinematic properties of rotating, multiple-population globular clusters
+5Q34ZP9H https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2024JD041687 Co‐Occurring Atmospheric Features and Their Contributions to Precipitation Extremes
+AXVFLDFP https://www.aanda.org/10.1051/0004-6361/202558092 New parameters for star-cluster dynamics: Observational results
+M445BCAU https://www.aanda.org/10.1051/0004-6361/202557826 Exploring the dynamical evolution of binary stars in multiple-population globular clusters
+KAE54CY4 https://www.nature.com/articles/s43588-026-00987-x Modeling context-dependent RNA splicing by deep learning
+8DZKAL5Q https://advanced.onlinelibrary.wiley.com/doi/10.1002/advs.202513414 Functional, Pharmacogenomic, and Immune Landscapes of Long Non‐Coding RNAs in Cancer
+KS57IPTL https://insight.jci.org/articles/view/167408 Innate immune activation restricts priming and protective efficacy of the radiation-attenuated PfSPZ malaria vaccine
+83WZAG4Q https://linkinghub.elsevier.com/retrieve/pii/S1074761319303358 A Molecular Signature in Blood Reveals a Role for p53 in Regulating Malaria-Induced Inflammation
+F3QPURUN http://biorxiv.org/lookup/doi/10.1101/2025.05.31.657176 EXOSC3 S1-domain variants implicated in PCH1b alter RNA exosome cap subunit abundance and thermal stability disrupting rRNA processing and targeting of AU-rich mRNA
+43WPQJLK https://aacrjournals.org/cancerres/article/85/21/4182/766748/Caloric-Restriction-Enhances-the-Efficacy-of Caloric Restriction Enhances the Efficacy of Antiandrogen Therapy in Prostate Cancer by Inhibiting Androgen Receptor Translation
+UYR3EBWB https://www.tandfonline.com/doi/full/10.1080/09581596.2026.2659432 Leveraging real-world data for population health outcomes research: evaluating all-cause mortality in stroke hospitalization using a statewide health information exchange
+W8ZUXS9Y https://linkinghub.elsevier.com/retrieve/pii/S0021925825002856 Spt6-Spn1 interaction is required for RNA polymerase II association and precise nucleosome positioning along transcribed genes
+GJCBPNP9 https://publichealth.jmir.org/2025/1/e79653 Equivalence of Type 2 Diabetes Prevalence Estimates: Comparative Study of Similar Phenotyping Algorithms Using Electronic Health Record Data
+AX7FNLFS https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.14243 Deletion of miR‐33, a regulator of the ABCA1–APOE pathway, ameliorates neuropathological phenotypes in APP/PS1 mice
+AMFLCFK6 https://academic.oup.com/g3journal/article/doi/10.1093/g3journal/jkaf101/8126571 QTL identification and characterization of the recombination landscape of the mountain pine beetle ( Dendroctonus ponderosae )
+DF3YS8TM https://www.nature.com/articles/s41467-025-60618-3 An archaeal nucleoid-associated protein binds an essential motif in DNA replication origins
+5QXNCUCU https://www.tandfonline.com/doi/full/10.1080/16078454.2026.2655477 Comorbidities in sickle cell disease by age in the Indiana sickle cell data collection (IN-SCDC)
+MX9UZCH6 https://www.nature.com/articles/s41591-024-03011-9 Single-nucleus chromatin accessibility and transcriptomic map of breast tissues of women of diverse genetic ancestry
+V3JRI7F9 https://aacrjournals.org/cancerrescommun/article/4/1/38/732408/Signaling-Pathway-Alterations-Driven-by-BRCA1-and Signaling Pathway Alterations Driven by BRCA1 and BRCA2 Germline Mutations are Sufficient to Initiate Breast Tumorigenesis by the PIK3CAH1047R Oncogene
+PKGWXBXZ https://ebooks.iospress.nl/doi/10.3233/SHTI251269 Making SCD Warriors Visible: A Public Health Visualization Project
+XP88ALR6 https://ijpds.org/article/view/2570 Linking Maternal and Child Health Data to Enhance Public Health Surveillance in Indiana
+XV94BDVW https://ebooks.iospress.nl/doi/10.3233/SHTI240801 Linking Maternal and Child Health Data to Enhance Public Health Surveillance and Implement Sustainable Interventions
+M3YPX67T https://onlinelibrary.wiley.com/doi/10.1111/mec.70357 Discovery and Evaluation of Cadmium‐Adapted Daphnia pulex Genotypes in a Region of Historical Mining Reveals Adaptation Protects the Germline From Cadmium‐Induced Mutations
+8882S3IJ https://ascpt.onlinelibrary.wiley.com/doi/10.1002/psp4.13295 Population Pharmacokinetics and Transfer of Gabapentin When Used as a Pain Adjunct for Cesarean Deliveries
+8D56PYFS https://ascopubs.org/doi/10.1200/GO.23.00311 Real-World Cervical Cancer Screening Uptake and Predictors of Visual Inspection With Acetic Acid Positivity Among Women Living With HIV in Care Programs in Western Kenya
+PWJ5D92L https://pubs.acs.org/doi/10.1021/acs.jpclett.5c00467 Multiple Molecule λ-Dynamics: Probing Drug Resistance with Concurrent Protein and Ligand Perturbations
+PKN4ZQ5P https://journals.lww.com/10.1097/QAI.0000000000003413 Modeling the HIV Cascade of Care Using Routinely Collected Clinical Data to Guide Programmatic Interventions and Policy Decisions
+JMT6BJPP https://linkinghub.elsevier.com/retrieve/pii/S2213231725003611 The absence of Peroxiredoxin-1 in human pancreatic ductal adenocarcinoma (PDAC) markedly reduces cell survival and tumor growth when coupled with the inhibition of Ref-1 redox signaling
+EQG6DBPD https://mchandaids.org/index.php/ijma/article/view/44 Impact of Maternal Viral Suppression on Growth Patterns for HIV-Exposed Uninfected Infants in Kenya
+CFEPHH3N http://rnajournal.cshlp.org/lookup/doi/10.1261/rna.080367.124 Accurate in silico predictions of modified RNA interactions to a prototypical RNA-binding protein with λ-dynamics
+SYLXMSAJ https://dx.plos.org/10.1371/journal.pgph.0001756 Adaptation of the Client Diagnostic Questionnaire for East Africa
+TBYFGZ9Q https://journals.lww.com/10.1097/QAI.0000000000003487 Outcomes After Loss to Follow-Up for Pregnant and Postpartum Women Living With HIV and Their Children in Kenya: A Prospective Cohort Study
+UASBWZRA https://link.springer.com/10.1007/s10461-024-04483-z Effects of Alcohol Use on Patient Retention in HIV Care in East Africa
+GRJLFICY https://linkinghub.elsevier.com/retrieve/pii/S0021925826003546 An inhibitor of GCN2 and the integrated stress response directly targets ZAK protein kinase to limit cytotoxicity
+4V773QEL https://journals.lww.com/10.1097/QAI.0000000000003330 Mortality Among HIV-Infected Adults on Antiretroviral Therapy in Southern Uganda
+IDYHVRNR https://www.spiedigitallibrary.org/conference-proceedings-of-spie/13302/3042513/Anesthetic-effects-on-functional-connectivity-fingerprinting-in-mice/10.1117/12.3042513.full Anesthetic effects on functional connectivity fingerprinting in mice
+WK5X9MJE https://karger.com/article/doi/10.1159/000544824 Quantifying the timing of gyral and sulcal formation relative to growth in the ferret cerebral cortex
+59WQWETJ https://www.mdpi.com/2073-4409/14/13/1000 Defining Keypoints to Align H&E Images and Xenium DAPI-Stained Images Automatically
+GL7PUKWL https://link.springer.com/10.1007/s42001-023-00219-6 The value of manual annotation in assessing trends of hate speech on social media: was antisemitism on the rise during the tumultuous weeks of Elon Musk’s Twitter takeover?
+AJ3NDHGB https://link.springer.com/10.1007/s10588-022-09363-2 Differences between antisemitic and non-antisemitic English language tweets
+MMVQV2GE https://link.springer.com/10.1007/s42001-024-00251-0 Annotating live messages on social media. Testing the efficiency of the AnnotHate – live data annotation portal
+ULEX5IF8 https://www.nature.com/articles/s41467-024-52355-w Network community detection via neural embeddings
+E4ZP8U2D https://pnas.org/doi/10.1073/pnas.2305414120 Unsupervised embedding of trajectories captures the latent structure of scientific migration
+WKQ42KBU http://biorxiv.org/lookup/doi/10.1101/2025.11.03.686281 Neuronal subtype-specific metabolic changes in neurodegenerative and neuropsychiatric diseases predicted via a systems biology-based approach
+CBNRFL9H https://academic.oup.com/bioinformatics/article/doi/10.1093/bioinformatics/btaf303/8129567 Relation equivariant graph neural networks to explore the mosaic-like tissue architecture of kidney diseases on spatially resolved transcriptomics
+ILRV6SH4 https://academic.oup.com/pnasnexus/article/doi/10.1093/pnasnexus/pgae258/7701371 Quantifying the vulnerabilities of the online public square to adversarial manipulation tactics
+5IX7Q3GK https://www.nature.com/articles/s41467-025-63141-7 TrimNN: characterizing cellular community motifs for studying multicellular topological organization in complex tissues
+6PGX2Q34 http://biorxiv.org/lookup/doi/10.1101/2024.10.06.616888 Measuring DNA contents of animal and plant genomes with Gnodes, the long and short of it
+M7W4LD8R https://www.nature.com/articles/s41467-025-63050-9 FUSION: a web-based application for in-depth exploration of multi-omics data with brightfield histology
+ICN484QM https://linkinghub.elsevier.com/retrieve/pii/S0021925825021490 In vivo pulse-chase in Caenorhabditis elegans reveals intestinal histone turnover changes upon starvation
+48M6PXI4 https://academic.oup.com/bioinformatics/article/doi/10.1093/bioinformatics/btaf554/8269454 scBSP: a fast and accurate tool for identifying spatially variable features from high-resolution spatial omics data
+XRNUAQT5 https://journals.biologists.com/dev/article/150/12/dev201071/320606/Defining-developmental-trajectories-of-prosensory Defining developmental trajectories of prosensory cells in human inner ear organoids at single-cell resolution
+LFI5PXEM https://iopscience.iop.org/article/10.3847/2041-8213/ae18c7 Early Evidence for Polar Orbits of Sub-Saturns around Hot Stars
+G6TXSCSK https://onlinelibrary.wiley.com/doi/10.1002/epi4.70259 Artificial intelligence in the assessment of epilepsy‐related genetic mutations: Learned from GABAA receptors and GABA transporter 1
+846BH7T9 https://iopscience.iop.org/article/10.3847/2041-8213/ae21c5 Unified Kraft Break at ∼6500 K: A Newly Identified Single-star Obliquity Transition Matches the Classical Rotation Break
+6WGFHQP7 https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/trc2.70201 Acute anti‐Aβ antibody exposure induces microglial changes and significantly alters chemokine signaling
+PAN6VBWG https://www.nature.com/articles/s41598-026-49033-w Network clustering algorithms and preprocessing pipelines for robust cell type identification in single-cell RNA sequencing data
+IB3555ZM https://academic.oup.com/neuro-oncology/article/28/1/282/8245054 AI-driven WHO 2021 classification of gliomas based only on H&E-stained slides
+XNINJCIA https://academic.oup.com/noa/article/doi/10.1093/noajnl/vdaf140/8198427 Interpretable artificial intelligence based determination of glioma IDH mutation status directly from histology slides
+CWGDFAFB https://academic.oup.com/jid/advance-article/doi/10.1093/infdis/jiy468/5060981 Whole-Blood Transcriptional Signatures Composed of Erythropoietic and NRF2-Regulated Genes Differ Between Cerebral Malaria and Severe Malarial Anemia
+LKSX6EJJ https://www.science.org/doi/10.1126/science.adp7290 Direct effects of mountain uplift and topography on biodiversity
+WXXEIIKE https://spj.science.org/doi/10.34133/csbj.0102 SpaGene: A Deep Adversarial Framework for Spatial Gene Imputation
+X4H9B5A8 https://academic.oup.com/neuro-oncology/article/27/Supplement_5/v256/8319301 PATH-67. AI-based WHO 2021 classification of adult-type diffuse glioma solely from H&E-stained slides
+Q5DUXVKL https://academic.oup.com/neuro-oncology/article/27/Supplement_5/v257/8319199 PATH-69. AI-based prognostic risk stratification of adult-type diffuse gliomas using H&E-stained slides
+8ANQFUSH https://ieeexplore.ieee.org/document/11316600/ Enhancing Robustness in Deep Convolutional Neural Networks Through Multiresolution Learning
+QF3PUVVC https://ebooks.iospress.nl/doi/10.3233/SHTI250793 LLM-Integrated Normalization and Knowledge for FHIR (LINK-FHIR)
+XZGQQM68 http://biorxiv.org/lookup/doi/10.64898/2026.05.14.725274 Resolving the oak tree of life: comparing RADseq and whole genome resequencing methods for oak phylogenetics
+59PUEFRG https://pubs.acs.org/doi/10.1021/acs.jpca.5c06778 Experimental and Theoretical Study of the Kinetics of the OH + Methyl Ethyl Ketone Reaction as a Function of Temperature
+NM5QVE8K https://onlinelibrary.wiley.com/doi/10.1002/smll.73690 Peptide‐Ligand Cooperative Interplay Drives Gold Nanoparticle Encapsulation by Protein Cages
+3IF8G8BE https://dl.acm.org/doi/10.1145/3731599.3767347 ROSE: RADICAL Orchestrator for Surrogate Exploration
+INTM6QLK https://academic.oup.com/jbmrplus/article/doi/10.1093/jbmrpl/ziag051/8541698 High-resolution profiling of osteocyte transcriptomes via single-nucleus RNA sequencing
+W7FMZL57 https://onlinelibrary.wiley.com/doi/10.1111/omi.70015 Porphyromonas gingivalis –Derived Virulence Lipids Accelerate Osteoclastogenesis Independently of High Mobility Group Box Protein‐1 Canonical Signaling
+V36ENIRJ https://pnas.org/doi/10.1073/pnas.2426638123 Neanderthal brain and cognition reconsidered
+JDB2ZAEW https://linkinghub.elsevier.com/retrieve/pii/S0002817723002623 Amalgam or composite in pediatric dentistry
+VPWLVYK5 https://onlinelibrary.wiley.com/doi/10.1111/jphd.12561 Trends in dental insurance claims in the United States in the context of the COVID ‐19 pandemic: A 3‐year perspective (2019–2022)
+RNTDXQS4 https://www.aanda.org/10.1051/0004-6361/202556382 Evolution of the kinematic properties of rotating, multiple-population globular clusters
+M9TQFH5B https://dl.acm.org/doi/10.1145/3715335.3735484 Descriptive Analysis of Online Wildlife Products Using Vision Language Models
+FUQGR8LW https://www.aanda.org/10.1051/0004-6361/202558092 New parameters for star-cluster dynamics: Observational results
+CJJTDQGF https://www.aanda.org/10.1051/0004-6361/202557826 Exploring the dynamical evolution of binary stars in multiple-population globular clusters
+27P2UCSP https://dl.acm.org/doi/10.1145/3725256 A Cost-Effective LLM-based Approach to Identify Wildlife Trafficking in Online Marketplaces
+58RV3NAZ https://www.nature.com/articles/s43588-026-00987-x Modeling context-dependent RNA splicing by deep learning
+3Q6A85YY https://advanced.onlinelibrary.wiley.com/doi/10.1002/advs.202513414 Functional, Pharmacogenomic, and Immune Landscapes of Long Non‐Coding RNAs in Cancer
+263JZKN7 https://link.aps.org/doi/10.1103/t18c-bpqy High-precision scale setting with the Ω -baryon mass and gradient flow
+5BVV7DSI https://aacrjournals.org/cancerres/article/85/21/4182/766748/Caloric-Restriction-Enhances-the-Efficacy-of Caloric Restriction Enhances the Efficacy of Antiandrogen Therapy in Prostate Cancer by Inhibiting Androgen Receptor Translation
+ZR6TCEXC https://journals.theunion.org/lookup/doi/10.5588/ijtldopen.24.0687 Trends in prevalent TB among persons enrolling for HIV care before and after ‘Test and Treat’ across East-Africa
+D6P54Y6L https://www.tandfonline.com/doi/full/10.1080/09581596.2026.2659432 Leveraging real-world data for population health outcomes research: evaluating all-cause mortality in stroke hospitalization using a statewide health information exchange
+3NNJL9SJ https://publichealth.jmir.org/2025/1/e79653 Equivalence of Type 2 Diabetes Prevalence Estimates: Comparative Study of Similar Phenotyping Algorithms Using Electronic Health Record Data
+PFIGFVLY https://www.tandfonline.com/doi/full/10.1080/16078454.2026.2655477 Comorbidities in sickle cell disease by age in the Indiana sickle cell data collection (IN-SCDC)
+8AFGR246 https://bmcpediatr.biomedcentral.com/articles/10.1186/s12887-025-05939-4 Rates of adherence, adherence measurement, and support services for children and adolescents living with HIV followed in global sites of the International Epidemiology Databases to Evaluate AIDS (IeDEA)
+TUVH8CH8 https://ebooks.iospress.nl/doi/10.3233/SHTI251269 Making SCD Warriors Visible: A Public Health Visualization Project
+FJSN3WHC https://ijpds.org/article/view/2570 Linking Maternal and Child Health Data to Enhance Public Health Surveillance in Indiana
+F95K6XZ8 https://academic.oup.com/aje/advance-article/doi/10.1093/aje/kwaf264/8342064 Data validation in multinational observational studies with error-prone data: applying an optimal validation sampling strategy in a study of Kaposi sarcoma and HIV
+AYYQU9KY https://onlinelibrary.wiley.com/doi/10.1111/mec.70357 Discovery and Evaluation of Cadmium‐Adapted Daphnia pulex Genotypes in a Region of Historical Mining Reveals Adaptation Protects the Germline From Cadmium‐Induced Mutations
+Y6RLQA3F https://academic.oup.com/aje/advance-article/doi/10.1093/aje/kwag015/8438861 Analysis approaches to combine error-prone data with a subset of validated data: an application to a multinational study of Kaposi sarcoma and HIV
+GRT5MA28 https://onlinelibrary.wiley.com/doi/10.1002/bdr2.70014 Human‐Centered Design of a Contextualized Service Delivery Model for Families of Infants With Major Congenital Anomalies in Kenya
+NY3XILUP https://pubs.acs.org/doi/10.1021/acs.jpclett.5c00467 Multiple Molecule λ-Dynamics: Probing Drug Resistance with Concurrent Protein and Ligand Perturbations
+FDA9SKED https://www.jci.org/articles/view/190853 Cellular profiling identifies targetable T cell phenotypes in lymphocytic variant hypereosinophilic syndrome
+HRE92A7X https://linkinghub.elsevier.com/retrieve/pii/S2213231725003611 The absence of Peroxiredoxin-1 in human pancreatic ductal adenocarcinoma (PDAC) markedly reduces cell survival and tumor growth when coupled with the inhibition of Ref-1 redox signaling
+JKDMSEZX https://www.mdpi.com/1999-4915/18/3/315 Development of a Novel Method to Detect AAV Vector Integration
+HZ7CDA58 http://rnajournal.cshlp.org/lookup/doi/10.1261/rna.080367.124 Accurate in silico predictions of modified RNA interactions to a prototypical RNA-binding protein with λ-dynamics
+MEYL7G3P https://pubs.rsc.org/cp/article/28/23/14300-14310/1225367 Interpretable machine-learning prediction of DFT energies per atom and identification of magic numbers in coinage-metal nanoclusters ( N ≤ 55) from the open quantum cluster database
+PVPSPD8P https://linkinghub.elsevier.com/retrieve/pii/S2950199726000984 Antimicrobial effects, phytochemical profiling and In silico analysis of compounds from Spilanthes filicaulis (Schumach. &Thonn.) C. D. Adams grown in Southern Nigeria
+2QVR5FNT https://pubs.acs.org/doi/10.1021/acs.jpca.5c06393 Protonation-Induced Planarization and Aromaticity Enhancement in Diazahelicenes: A Route to Stronger Bases
+78RWHQHL https://pubs.acs.org/doi/10.1021/acs.jpcb.6c00517 Exploring the Role of Hydrogen Bonding in Cyclodextrin─Naphthalenediimide Binding Orientation
+PFUX8BXE https://www.worldscientific.com/doi/10.1142/S0217984925502859 Dominant non-covalent forces in diphenhydramine-8-chlorotheophylline supramolecular assembly
+IA5JUTMD https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202505824 Investigating the Role of Noncovalent Interactions in Vadadustat's Solubility and Stability With Selected Solvents
+MJKFBQDF https://linkinghub.elsevier.com/retrieve/pii/S0021925826003546 An inhibitor of GCN2 and the integrated stress response directly targets ZAK protein kinase to limit cytotoxicity
+DLGWWGMD https://www.mdpi.com/2073-4409/14/13/1000 Defining Keypoints to Align H&E Images and Xenium DAPI-Stained Images Automatically
+986SZSA4 https://www.nature.com/articles/s41598-026-53566-5 A detailed DFT inspection on the trapping of aspirin from drinking water using B12N12 nanocage
+T9555CRN https://onlinelibrary.wiley.com/doi/10.1002/jcc.70361 A Comparative DFT Study of Pd‐ and Ni‐Based Catalysts in the Narasaka–Heck/C(sp3 )–H Activation Reaction
+YADN92WR https://link.springer.com/10.1007/s10895-026-04756-x Synthesis and Structural Profiling of a Fluorinated Bis Schiff Base: a Comprehensive Study Via DFT and Molecular Topology
+J7CFUTI2 https://nanobioletters.com/wp-content/lianbs/2026/03/LIANBS151.048.pdf Glycolytic Inhibition may not be a Pathway for Covid-19 Inhibition of 2-Deoxyglucose: Evidence from Computational Studies
+6UCVLTYJ http://biorxiv.org/lookup/doi/10.1101/2025.11.03.686281 Neuronal subtype-specific metabolic changes in neurodegenerative and neuropsychiatric diseases predicted via a systems biology-based approach
+B8EX277H https://link.aps.org/doi/10.1103/lz5s-98rc Initial baryon stopping and angular momentum in heavy-ion collisions
+D56NWMIT https://www.researchsquare.com/article/rs-8714153/v1 Eroding asperities imply larger locked regions on subduction megathrusts
+BWJ3GQ8J https://academic.oup.com/bioinformatics/article/doi/10.1093/bioinformatics/btaf303/8129567 Relation equivariant graph neural networks to explore the mosaic-like tissue architecture of kidney diseases on spatially resolved transcriptomics
+552PAF4Y https://www.nature.com/articles/s41467-025-63141-7 TrimNN: characterizing cellular community motifs for studying multicellular topological organization in complex tissues
+M4C3PENI https://www.nature.com/articles/s41467-025-63050-9 FUSION: a web-based application for in-depth exploration of multi-omics data with brightfield histology
+NJPU6PY6 https://academic.oup.com/bioinformatics/article/doi/10.1093/bioinformatics/btaf554/8269454 scBSP: a fast and accurate tool for identifying spatially variable features from high-resolution spatial omics data
+LF83PFAQ https://onlinelibrary.wiley.com/doi/10.1002/epi4.70259 Artificial intelligence in the assessment of epilepsy‐related genetic mutations: Learned from GABAA receptors and GABA transporter 1
+2MCB6V27 https://journals.sagepub.com/doi/full/10.3233/JAD-230510 Identifying Genes Associated with Alzheimer’s Disease Using Gene-Based Polygenic Risk Score
+AMTANWG2 https://academic.oup.com/jimmunol/article/doi/10.1093/jimmun/vkag051/8654360 Folate receptor beta drives NLRP3 inflammasome activation and pyroptosis in macrophages independent of folate binding
+9ZU9AQKP https://linkinghub.elsevier.com/retrieve/pii/S0920996425002774 A longitudinal study on the relationship between delusional ideation and social network
+5JPANT76 https://www.nature.com/articles/s41598-026-49033-w Network clustering algorithms and preprocessing pipelines for robust cell type identification in single-cell RNA sequencing data
+J6P4EG6C https://www.tandfonline.com/doi/full/10.1080/00952990.2024.2332602 Alterations in self-reported sensory gating and interoception in individuals frequently using cannabis
+CF6ENJYZ https://journals.sagepub.com/doi/10.1177/13591053261430272 Exploring the role of negative urgency in body dissatisfaction in young adults
+B9W7DBVA https://academic.oup.com/jid/advance-article/doi/10.1093/infdis/jiy468/5060981 Whole-Blood Transcriptional Signatures Composed of Erythropoietic and NRF2-Regulated Genes Differ Between Cerebral Malaria and Severe Malarial Anemia
+SCTXSJXB https://www.science.org/doi/10.1126/science.adp7290 Direct effects of mountain uplift and topography on biodiversity
+GRZSH7BS https://spj.science.org/doi/10.34133/csbj.0102 SpaGene: A Deep Adversarial Framework for Spatial Gene Imputation
+U29TD33Q https://direct.mit.edu/imag/article/doi/10.1162/IMAG.a.1100/134640/Distinct-neural-signatures-in-a-sensorimotor Distinct neural signatures in a sensorimotor synchronization-continuation task
+DZ7GRGKZ https://linkinghub.elsevier.com/retrieve/pii/S0002817723003884 Topical fluoride impact in future restorative dental procedures
+3CRBNRY6 https://linkinghub.elsevier.com/retrieve/pii/S0002817723002623 Amalgam or composite in pediatric dentistry
+HQE6NRS9 https://onlinelibrary.wiley.com/doi/10.1111/jphd.12561 Trends in dental insurance claims in the United States in the context of the COVID ‐19 pandemic: A 3‐year perspective (2019–2022)
+74VIKXNE https://dl.acm.org/doi/10.1145/3715335.3735484 Descriptive Analysis of Online Wildlife Products Using Vision Language Models
+XA32YK2Z https://dl.acm.org/doi/10.1145/3725256 A Cost-Effective LLM-based Approach to Identify Wildlife Trafficking in Online Marketplaces
+6VA4C5N3 https://link.aps.org/doi/10.1103/t18c-bpqy High-precision scale setting with the Ω -baryon mass and gradient flow
+BRV8SSJ5 https://direct.mit.edu/imag/article/doi/10.1162/IMAG.a.1253/136544/Mapping-the-structural-connections-between-the Mapping the structural connections between the anterior cingulate cortex and the insula/ventrolateral prefrontal cortex
+PEDPLKNU https://academic.oup.com/mnrasl/article/504/1/L12/6217434 New insights into star cluster evolution towards energy equipartition
+W4NY8VZH https://journals.theunion.org/lookup/doi/10.5588/ijtldopen.24.0687 Trends in prevalent TB among persons enrolling for HIV care before and after ‘Test and Treat’ across East-Africa
+W28YUM7C https://academic.oup.com/mnras/article/521/3/4395/7080163 Evolution of binary stars in the early evolutionary phases of ultra-faint dwarf galaxies
+4XPW3KUY https://academic.oup.com/mnras/article/515/2/1830/6618562 Mass segregation and dynamics of primordial binaries in star clusters with a radially anisotropic velocity distribution
+5387FSTA https://academic.oup.com/mnras/article/509/3/3815/6425755 Evolution towards energy equipartition in star clusters: effects of the tidal field, primordial binaries, and internal velocity anisotropy
+LMFF3BL4 https://bmcpediatr.biomedcentral.com/articles/10.1186/s12887-025-05939-4 Rates of adherence, adherence measurement, and support services for children and adolescents living with HIV followed in global sites of the International Epidemiology Databases to Evaluate AIDS (IeDEA)
+FE8X86QR https://academic.oup.com/aje/advance-article/doi/10.1093/aje/kwaf264/8342064 Data validation in multinational observational studies with error-prone data: applying an optimal validation sampling strategy in a study of Kaposi sarcoma and HIV
+2RS6CSAA https://www.nature.com/articles/s41598-026-37692-8 High fat diet remodels the gene regulatory networks in the preoptic area
+BG5NJISQ https://academic.oup.com/aje/advance-article/doi/10.1093/aje/kwag015/8438861 Analysis approaches to combine error-prone data with a subset of validated data: an application to a multinational study of Kaposi sarcoma and HIV
+N85WIHLW https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.71066 Alzheimer's disease polygenic risk in early‐ and late‐onset Alzheimer's disease
+3CVVLTDU https://onlinelibrary.wiley.com/doi/10.1002/bdr2.70014 Human‐Centered Design of a Contextualized Service Delivery Model for Families of Infants With Major Congenital Anomalies in Kenya
+Q3CCBIST https://www.jci.org/articles/view/190853 Cellular profiling identifies targetable T cell phenotypes in lymphocytic variant hypereosinophilic syndrome
+F2V3MF8R https://www.mdpi.com/1999-4915/18/3/315 Development of a Novel Method to Detect AAV Vector Integration
+RC5ELAXN https://dx.plos.org/10.1371/journal.pbio.3003809 Environmental redox conditions and strain variation define phenazine-mediated antagonism in co-infecting bacteria
+XF6RRGGV https://www.spiedigitallibrary.org/conference-proceedings-of-spie/14044/3094907/Validating-satellite-based-communications-sources-under-degraded-radiation-conditions-using/10.1117/12.3094907.full Validating satellite-based communications sources under degraded radiation conditions using specific emitter identification
+QGDS2QJU https://pubs.rsc.org/cp/article/28/23/14300-14310/1225367 Interpretable machine-learning prediction of DFT energies per atom and identification of magic numbers in coinage-metal nanoclusters ( N ≤ 55) from the open quantum cluster database
+4DX4ICQP https://academic.oup.com/bib/article/doi/10.1093/bib/bbaf587/8319948 Uncertainty-aware genomic classification of Alzheimer’s disease: a transformer-based ensemble approach with Monte Carlo dropout
+WLLKQ2XD https://linkinghub.elsevier.com/retrieve/pii/S2950199726000984 Antimicrobial effects, phytochemical profiling and In silico analysis of compounds from Spilanthes filicaulis (Schumach. &Thonn.) C. D. Adams grown in Southern Nigeria
+I4ZSHANW https://pubs.acs.org/doi/10.1021/acs.jpca.5c06393 Protonation-Induced Planarization and Aromaticity Enhancement in Diazahelicenes: A Route to Stronger Bases
+N84RLYBH https://pubs.acs.org/doi/10.1021/acs.jpcb.6c00517 Exploring the Role of Hydrogen Bonding in Cyclodextrin─Naphthalenediimide Binding Orientation
+694M62J3 https://spj.science.org/doi/10.34133/csbj.0010 DuAL-Net: A Dual-Network Approach for Alzheimer’s Disease Risk Prediction Using APOE -Centered Regional Whole-Genome Sequencing Data
+Y9YGDGEB https://www.worldscientific.com/doi/10.1142/S0217984925502859 Dominant non-covalent forces in diphenhydramine-8-chlorotheophylline supramolecular assembly
+V7JBYLH8 https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/slct.202505824 Investigating the Role of Noncovalent Interactions in Vadadustat's Solubility and Stability With Selected Solvents
+T9YVACXS https://www.nature.com/articles/s41598-026-53566-5 A detailed DFT inspection on the trapping of aspirin from drinking water using B12N12 nanocage
+2P7K9WBA https://onlinelibrary.wiley.com/doi/10.1002/jcc.70361 A Comparative DFT Study of Pd‐ and Ni‐Based Catalysts in the Narasaka–Heck/C(sp3 )–H Activation Reaction
+KPJC6YKF https://link.springer.com/10.1007/s10895-026-04756-x Synthesis and Structural Profiling of a Fluorinated Bis Schiff Base: a Comprehensive Study Via DFT and Molecular Topology
+ZS2SWBYP https://nanobioletters.com/wp-content/lianbs/2026/03/LIANBS151.048.pdf Glycolytic Inhibition may not be a Pathway for Covid-19 Inhibition of 2-Deoxyglucose: Evidence from Computational Studies
+PUPCT8EJ https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2025JF008642 O Levee, Where Art Thou? Measuring the Abundance of Natural River Levees Across the Contiguous USA
+AT2D5DM8 https://link.aps.org/doi/10.1103/lz5s-98rc Initial baryon stopping and angular momentum in heavy-ion collisions
+TT7IYNC5 https://www.researchsquare.com/article/rs-8714153/v1 Eroding asperities imply larger locked regions on subduction megathrusts
+XAYZGQ3B https://journals.sagepub.com/doi/full/10.3233/JAD-230510 Identifying Genes Associated with Alzheimer’s Disease Using Gene-Based Polygenic Risk Score
+WE5AABZ9 https://academic.oup.com/jimmunol/article/doi/10.1093/jimmun/vkag051/8654360 Folate receptor beta drives NLRP3 inflammasome activation and pyroptosis in macrophages independent of folate binding
+U8663IWN https://linkinghub.elsevier.com/retrieve/pii/S0920996425002774 A longitudinal study on the relationship between delusional ideation and social network
+GTUFX52S https://www.tandfonline.com/doi/full/10.1080/00952990.2024.2332602 Alterations in self-reported sensory gating and interoception in individuals frequently using cannabis
+XI2KIRMP https://journals.sagepub.com/doi/10.1177/13591053261430272 Exploring the role of negative urgency in body dissatisfaction in young adults
+SZ3B64ED https://academic.oup.com/ismej/article/doi/10.1093/ismejo/wraf139/8185998 “ Paraxenoviridae ”, a putative family of globally distributed marine bacteriophages with double-stranded RNA genomes
+EQN34AUA https://direct.mit.edu/imag/article/doi/10.1162/IMAG.a.1100/134640/Distinct-neural-signatures-in-a-sensorimotor Distinct neural signatures in a sensorimotor synchronization-continuation task
+E7NLDYV7 https://direct.mit.edu/imag/article/doi/10.1162/IMAG.a.1253/136544/Mapping-the-structural-connections-between-the Mapping the structural connections between the anterior cingulate cortex and the insula/ventrolateral prefrontal cortex
+AZVAA72P https://linkinghub.elsevier.com/retrieve/pii/S0168170225000681 Characterization of a multi-segmented rod-shaped mycovirus within the order Martellivirales largely accommodating plant viruses
+T9YBCRTP https://academic.oup.com/mnrasl/article/504/1/L12/6217434 New insights into star cluster evolution towards energy equipartition
+FCRNWPPP https://academic.oup.com/mnras/article/521/3/4395/7080163 Evolution of binary stars in the early evolutionary phases of ultra-faint dwarf galaxies
+VN7AP7LP https://academic.oup.com/mnras/article/515/2/1830/6618562 Mass segregation and dynamics of primordial binaries in star clusters with a radially anisotropic velocity distribution
+DDCEDMUH https://academic.oup.com/mnras/article/509/3/3815/6425755 Evolution towards energy equipartition in star clusters: effects of the tidal field, primordial binaries, and internal velocity anisotropy
+M3Y42RH3 https://www.nature.com/articles/s41598-026-37692-8 High fat diet remodels the gene regulatory networks in the preoptic area
+IA2AKR5J https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.71066 Alzheimer's disease polygenic risk in early‐ and late‐onset Alzheimer's disease
+E5HSMXJZ https://dx.plos.org/10.1371/journal.pbio.3003809 Environmental redox conditions and strain variation define phenazine-mediated antagonism in co-infecting bacteria
+7S7KBI2R https://www.spiedigitallibrary.org/conference-proceedings-of-spie/14044/3094907/Validating-satellite-based-communications-sources-under-degraded-radiation-conditions-using/10.1117/12.3094907.full Validating satellite-based communications sources under degraded radiation conditions using specific emitter identification
+X8XWCZI7 https://academic.oup.com/bib/article/doi/10.1093/bib/bbaf587/8319948 Uncertainty-aware genomic classification of Alzheimer’s disease: a transformer-based ensemble approach with Monte Carlo dropout
+5976VA8P https://spj.science.org/doi/10.34133/csbj.0010 DuAL-Net: A Dual-Network Approach for Alzheimer’s Disease Risk Prediction Using APOE -Centered Regional Whole-Genome Sequencing Data
+K36W4DDY https://www.nature.com/articles/s41467-026-71096-6 Identification of hot spring Obelisk-like RNA replicons and expanded diversity of the Obelisk superfamily
+YEESM8YS https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2025JF008642 O Levee, Where Art Thou? Measuring the Abundance of Natural River Levees Across the Contiguous USA
+VJGKRSIU https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.71025 Amyloid‐related default mode network hyperconnectivity and longitudinal decline in network distinctiveness in preclinical Alzheimer's disease
+XIBG5A47 https://academic.oup.com/ismej/article/doi/10.1093/ismejo/wraf139/8185998 “ Paraxenoviridae ”, a putative family of globally distributed marine bacteriophages with double-stranded RNA genomes
+4M4FHXXY https://linkinghub.elsevier.com/retrieve/pii/S0197458023001288 Amyloid and tau pathology are associated with cerebral blood flow in a mixed sample of nondemented older adults with and without vascular risk factors for Alzheimer’s disease
+URK6EFHN https://linkinghub.elsevier.com/retrieve/pii/S0168170225000681 Characterization of a multi-segmented rod-shaped mycovirus within the order Martellivirales largely accommodating plant viruses
+UYBDAEYP https://alzres.biomedcentral.com/articles/10.1186/s13195-023-01369-5 White matter integrity is associated with cognition and amyloid burden in older adult Koreans along the Alzheimer’s disease continuum
+2WVNAE6V https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.14290 Association of amyloid and cardiovascular risk with cognition: Findings from KBASE
+N3TNUY8C https://www.nature.com/articles/s41467-026-71096-6 Identification of hot spring Obelisk-like RNA replicons and expanded diversity of the Obelisk superfamily
+25ICYTGQ https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.71025 Amyloid‐related default mode network hyperconnectivity and longitudinal decline in network distinctiveness in preclinical Alzheimer's disease
+VI4FRHUF https://insight.jci.org/articles/view/198590 Cannabidiol exerts antiinflammatory effects but maintains T effector memory cell differentiation in humans
+P8GQIUJR https://linkinghub.elsevier.com/retrieve/pii/S0197458023001288 Amyloid and tau pathology are associated with cerebral blood flow in a mixed sample of nondemented older adults with and without vascular risk factors for Alzheimer’s disease
+NJHXTNWF https://alzres.biomedcentral.com/articles/10.1186/s13195-023-01369-5 White matter integrity is associated with cognition and amyloid burden in older adult Koreans along the Alzheimer’s disease continuum
+3W3HQNKZ https://www.mdpi.com/1422-0067/26/2/699 Utilization of Cannabidiol in Post-Organ-Transplant Care
+ZIBLEYW4 https://alz-journals.onlinelibrary.wiley.com/doi/10.1002/alz.14290 Association of amyloid and cardiovascular risk with cognition: Findings from KBASE
+79E4TMBV https://insight.jci.org/articles/view/198590 Cannabidiol exerts antiinflammatory effects but maintains T effector memory cell differentiation in humans
+374BA9I4 https://www.mdpi.com/1422-0067/26/2/699 Utilization of Cannabidiol in Post-Organ-Transplant Care
+9CM73QYS https://ascpt.onlinelibrary.wiley.com/doi/10.1111/cts.70152 Inhibition of Tacrolimus Metabolism by Cannabidiol and Its Metabolites In Vitro
+G6MVAXT5 https://ascpt.onlinelibrary.wiley.com/doi/10.1111/cts.70152 Inhibition of Tacrolimus Metabolism by Cannabidiol and Its Metabolites In Vitro
+EIM4E32J https://ascpt.onlinelibrary.wiley.com/doi/10.1111/cts.70455 Genotype–Specific Safety and Pharmacokinetics of Cannabidiol in Healthy Volunteers
+32GSHIUL https://ascpt.onlinelibrary.wiley.com/doi/10.1111/cts.70455 Genotype–Specific Safety and Pharmacokinetics of Cannabidiol in Healthy Volunteers
diff --git a/coldfront/components/site/static/skipto/skipto.min.js b/coldfront/components/site/static/skipto/skipto.min.js
new file mode 100644
index 0000000000..72a6b582dc
--- /dev/null
+++ b/coldfront/components/site/static/skipto/skipto.min.js
@@ -0,0 +1,18 @@
+/* ========================================================================
+ * Version: 5.10.1
+ * Copyright (c) 2022, 2023, 2024, 2025, 2026 Jon Gunderson; Licensed BSD
+ * Copyright (c) 2021 PayPal Accessibility Team and University of Illinois; Licensed BSD
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of PayPal or any of its subsidiaries or affiliates, nor the name of the University of Illinois, nor the names of any other contributors contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * CDN: https://skipto-landmarks-headings.github.io/page-script-5/dist/skipto.min.js
+ * Documentation: https://skipto-landmarks-headings.github.io/page-script-5
+ * Code: https://github.com/skipto-landmarks-headings/page-script-5
+ * Report Issues: https://github.com/skipto-landmarks-headings/page-script-5/issues
+ * ======================================================================== */
+
+!function(){"use strict";const t={default:{fontFamily:"Arial, Helvetica, sans-serif",fontSize:"16px",positionLeft:"46%",focusBorderColor:"hsl(216, 60%, 18%)",focusBorderDarkColor:"hsl(216, 60%, 72%)",buttonTextColor:" hsl(216, 60%, 18%)",buttonTextDarkColor:" hsl(216, 60%, 72%)",buttonBackgroundColor:"hsl(0, 0%, 96%)",buttonBackgroundDarkColor:"hsl(0, 0%, 4%)",menuTextColor:" hsl(216, 60%, 18%)",menuTextDarkColor:"hsl(216, 60%, 72%)",menuBackgroundColor:"hsl(0, 0%, 96%)",menuBackgroundDarkColor:"hsl(0, 0%, 4%)",menuitemFocusTextColor:"hsl(0, 0%, 100%)",menuitemFocusTextDarkColor:"hsl(0, 0%, 0%)",menuitemFocusBackgroundColor:"hsl(216, 60%, 18%)",menuitemFocusBackgroundDarkColor:"hsl(216, 60%, 72%)",zIndex:"2000000",displayOption:"fixed",highlightTarget:"instant",highlightBorderSize:"small",highlightBorderStyle:"solid"},aria:{hostnameSelector:"w3.org",pathnameSelector:"ARIA/apg",fontFamily:"sans-serif",positionLeft:"7%",menuTextColor:"hsl(0, 0%, 0%)",menuTextDarkColor:"hsl(0, 0%, 100%)",menuBackgroundColor:"hsl(210, 100%, 93%)",menuBackgroundDarkColor:"hsl(210, 100%, 07%)",menuitemFocusTextColor:"hsl(0, 0%, 100%)",menuitemFocusTextDarkColor:"hsl(0, 0%, 0%)",menuitemFocusBackgroundColor:"hsl(205, 100%, 31%)",menuitemFocusBackgroundDarkColor:"hsl(205, 100%, 69%)",focusBorderColor:"hsl(205, 100%, 31%)",focusBorderDarkColor:"hsl(205, 100%, 69%)",buttonTextColor:"hsl(205, 100%, 31%)",buttonTextDarkColor:"hsl(205, 100%, 69%)",buttonBackgroundColor:"hsl(0, 0%, 87%)",buttonBackgroundDarkColor:"hsl(0, 0%, 13%)"},illinois:{hostnameSelector:"illinois.edu",focusBorderColor:"hsl(216, 60%, 18%)",focusBorderDarkColor:"hsl(216, 60%, 72%)",buttonTextColor:" hsl(216, 60%, 18%)",buttonTextDarkColor:" hsl(216, 60%, 72%)",buttonBackgroundColor:"hsl(0, 0%, 96%)",buttonBackgroundDarkColor:"hsl(0, 0%, 4%)",menuTextColor:" hsl(216, 60%, 18%)",menuTextDarkColor:" hsl(216, 60%, 72%)",menuBackgroundColor:"hsl(0, 0%, 96%)",menuBackgroundDarkColor:"hsl(0, 0%, 4%)",menuitemFocusTextColor:"hsl(0, 0%, 100%)",menuitemFocusTextDarkColor:"hsl(0, 0%, 0%)",menuitemFocusBackgroundColor:"hsl(216, 60%, 18%)",menuitemFocusBackgroundDarkColor:"hsl(216, 60%, 72%)",highlightTarget:"disabled"},openweba11y:{hostnameSelector:"openweba11y.com",buttonTextColor:"hsl(216, 60%, 18%)",buttonTextDarkColor:"hsl(216, 60%, 82%)",buttonBackgroundColor:"hsl(0, 0%, 87%)",buttonBackgroundDarkColor:"hsl(0, 0%, 13%)",focusBorderColor:"hsl(358, 95%, 40%)",focusBorderDarkColor:"hsl(358, 95%, 60%)",menuTextColor:"hsl(216, 60%, 18%)",menuTextDarkColor:"hsl(216, 60%, 82%)",menuBackgroundColor:"hsl(0, 0%, 87%)",menuBackgroundDarkColor:"hsl(0, 0%, 13%)",menuitemFocusTextColor:"hsl(0, 0%, 87%)",menuitemFocusTextDarkColor:"hsl(0, 0%, 13%)",menuitemFocusBackgroundColor:" hsl(216, 60%, 18%)",menuitemFocusBackgroundDarkColor:" hsl(216, 60%, 82%)",fontSize:"90%"},skipto:{hostnameSelector:"skipto-landmarks-headings.github.io",positionLeft:"25%",menuTextColor:"hsl(214, 100%, 9%)",menuTextDarkColor:"hsl(214, 100%, 91%)",menuBackgroundColor:"hsl(180, 1%, 87%)",menuBackgroundDarkColor:"hsl(180, 1%, 13%)",menuitemFocusTextColor:"hsl(0, 0%, 93%)",menuitemFocusTextDarkColor:"hsl(0, 0%, 7%)",menuitemFocusBackgroundColor:"hsl(214, 100%, 9%)",menuitemFocusBackgroundDarkColor:"hsl(214, 100%, 91%)",focusBorderColor:"hsl(11, 100%, 59%)",focusBorderDarkColor:"hsl(11, 100%, 41%)",buttonTextColor:"hsl(0, 0%, 27%)",buttonTextDarkColor:"hsl(0, 0%, 73%)",buttonBackgroundColor:"hsl(180, 1%, 87%)",buttonBackgroundDarkColor:"hsl(180, 1%, 13%)"},uic:{hostnameSelector:"uic.edu",menuTextColor:"hsl(222, 100%, 19%)",menuTextDarkColor:"hsl(222, 100%, 81%)",menuBackgroundColor:"hsl(0, 0%, 97%)",menuBackgroundDarkColor:"hsl(0, 0%, 3%)",menuitemFocusTextColor:"hsl(0, 0%, 100%)",menuitemFocusTextDarkColor:"hsl(0, 0%, 0%)",menuitemFocusBackgroundColor:"hsl(222, 100%, 19%)",menuitemFocusBackgroundDarkColor:"hsl(222, 100%, 81%)",focusBorderColor:"hsl(346, 100%, 42%)",focusBorderDarkColor:"hsl(346, 100%, 58%)",buttonTextColor:"hsl(0, 0%, 100%)",buttonTextDarkColor:"hsl(0, 0%, 0%)",buttonBackgroundColor:"hsl(222, 100%, 19%)",buttonBackgroundDarkColor:"hsl(222, 100%, 81%)"},uillinois:{hostnameSelector:"uillinois.edu",menuTextColor:"hsl(222, 100%, 19%)",menuTextDarkColor:"hsl(222, 100%, 81%)",menuBackgroundColor:"hsl(210, 5%, 91%)",menuBackgroundDarkColor:"hsl(210, 5%, 9%)",menuitemFocusTextColor:"hsl(0, 0%, 97%)",menuitemFocusTextDarkColor:"hsl(0, 0%, 3%)",menuitemFocusBackgroundColor:"hsl(216, 60%, 18%)",menuitemFocusBackgroundDarkColor:"hsl(216, 60%, 82%)",focusBorderColor:"hsl(13, 97%, 44%)",focusBorderDarkColor:"hsl(13, 97%, 56%)",buttonTextColor:"hsl(210, 5%, 91%)",buttonTextDarkColor:"hsl(210, 5%, 9%)",buttonBackgroundColor:"hsl(216, 60%, 18%)",buttonBackgroundDarkColor:"hsl(216, 60%, 82%)",highlightTarget:"disabled"},uis:{hostnameSelector:"uis.edu",menuTextColor:"hsl(210, 100%, 20%)",menuTextDarkColor:"hsl(210, 100%, 80%)",menuBackgroundColor:"hsl(0, 0%, 100%)",menuBackgroundDarkColor:"hsl(0, 0%, 0%)",menuitemFocusTextColor:"hsl(0, 0%, 100%)",menuitemFocusTextDarkColor:"hsl(0, 0%, 0%)",menuitemFocusBackgroundColor:"hsl(210, 100%, 20%)",menuitemFocusBackgroundDarkColor:"hsl(210, 100%, 80%)",focusBorderColor:"hsl(354, 71%, 54%)",focusBorderDarkColor:"hsl(354, 71%, 46%)",buttonTextColor:"hsl(0, 0%, 100%)",buttonTextDarkColor:"hsl(0, 0%, 0%)",buttonBackgroundColor:"hsl(210, 100%, 20%)",buttonBackgroundDarkColor:"hsl(210, 100%, 80%)"},walmart:{hostnameSelector:"walmart.com",buttonTextColor:"hsl(0, 0%, 100%)",buttonTextDarkColor:"hsl(0, 0%, 0%)",buttonBackgroundColor:"hsl(215, 100%, 30%)",buttonBackgroundDarkColor:"hsl(215, 100%, 70%)",focusBorderColor:"hsl(44, 100%, 56%)",focusBorderDarkColor:"hsl(44, 100%, 44%)",menuTextColor:"hsl(0, 0%, 100%)",menuTextDarkColor:"hsl(0, 0%, 0%)",menuBackgroundColor:"hsl(209, 100%, 43%)",menuBackgroundDarkColor:"hsl(209, 100%, 57%)",menuitemFocusTextColor:"hsl(215, 100%, 30%)",menuitemFocusTextDarkColor:"hsl(215, 100%, 70%)",menuitemFocusBackgroundColor:"hsl(0, 0%, 100%)",menuitemFocusBackgroundDarkColor:"hsl(0, 0%, 0%)"}};class e{constructor(...t){this._flag=!1,this._label="debug";for(const[e,o]of t.entries())if(e<2)switch(typeof o){case"boolean":this._flag=o;break;case"string":this._label=o}}get flag(){return this._flag}set flag(t){"boolean"==typeof t&&(this._flag=t)}get label(){return this._label}set label(t){"string"==typeof t&&(this._label=t)}log(t,e){const o=e?"\n":"";console.log(`${o}[${this._label}] ${t}`)}tag(t,e){if(t&&t.tagName){const o=t.textContent.trim().replace(/\s+/g," ");this.log(`[${t.tagName}]: ${o.substring(0,40)}`,e)}}separator(t){this.log("-----------------------------",t)}}const o="5.10.1",n=3,i="id-skip-to-ver-5",s="id-skip-to-landmark-group",r="id-skip-to-landmark-group-label",a="id-skip-to-heading-group",l="id-skip-to-heading-group-label",d="id-skip-to-shortcuts-group",u="id-skip-to-shortcuts-group-label",c="id-skip-to-about",h="id-skip-to-menu",g="id-skip-to-dialog",m="id-skip-to-message",p="id-skip-to-highlight-overlay",b="id-skip-to-hidden-element",k="skip-to-content",f="skip-to-content-bookmarklet",v="skip-to-content-extension",y="data-skipto",x="https://skipto-landmarks-headings.github.io/page-script-5/",C="https://skipto-landmarks-headings.github.io/page-script-5/shortcuts.html",L="forceSkipToPopupBehavior";function N(t){let e,o,n,i;switch(t||"small"){case"small":e=2,o=1,n=4,i="12pt";break;case"medium":e=3,o=2,n=4,i="13pt";break;case"large":e=4,o=3,n=6,i="14pt";break;case"x-large":e=6,o=3,n=8,i="16pt";break;default:e=2,o=1,n=4,i="12pt"}return[e,o,n,i]}function w(t,e){let o=t.getAttribute(e);return null===o?"":E(o)}function E(t){return t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"").replace(/\s+/g," ")}function B(t){return"string"==typeof t&&t.length&&t.trim()&&" "!==t}function T(t){let e=window.getComputedStyle(t).getPropertyValue("visibility");return"hidden"!==e&&"collapse"!==e&&!function t(e){if(!e||e.nodeType!==Node.ELEMENT_NODE)return!1;if(e.hasAttribute("hidden"))return!0;return"none"===window.getComputedStyle(e,null).getPropertyValue("display")||!!e.parentNode&&t(e.parentNode)}(t)}new e("Utils",!1).flag=!1,new e("style",!1).flag=!1;const S=document.createElement("template");function D(t,e,o,n,i){let s="";"string"==typeof(s="string"==typeof o&&o?o:"string"==typeof n&&n?n:i)&&s.length&&t.style.setProperty(e,s)}function H(e,o,n=!1){const i=t.default,s=n?function(e){if("object"==typeof t[e])return t[e];let o="",n="",i="";const s=new URL(location.href).hostname,r=location.pathname;for(let e in t){const a=t[e].hostnameSelector,l=t[e].pathnameSelector;let d=!1,u=!1;a&&s.indexOf(a)>=0&&(!o||t[o].hostnameSelector.length=0&&(!n||t[n].pathnameSelector.length=0?o.displayOption=s.displayOption:o.displayOption="popup"),D(e,"--skipto-font-family",o.fontFamily,s.fontFamily,i.fontFamily),D(e,"--skipto-font-size",o.fontSize,s.fontSize,i.fontSize),D(e,"--skipto-position-left",o.positionLeft,s.positionLeft,i.positionLeft),D(e,"--skipto-menu-text-color",o.menuTextColor,s.menuTextColor,i.menuTextColor),D(e,"--skipto-menu-text-dark-color",o.menuTextDarkColor,s.menuTextDarkColor,i.menuTextDarkColor),D(e,"--skipto-menu-background-color",o.menuBackgroundColor,s.menuBackgroundColor,i.menuBackgroundColor),D(e,"--skipto-menu-background-dark-color",o.menuBackgroundDarkColor,s.menuBackgroundDarkColor,i.menuBackgroundDarkColor),D(e,"--skipto-menuitem-focus-text-color",o.menuitemFocusTextColor,s.menuitemFocusTextColor,i.menuitemFocusTextColor),D(e,"--skipto-menuitem-focus-text-dark-color",o.menuitemFocusTextDarkColor,s.menuitemFocusTextDarkColor,i.menuitemFocusTextDarkColor),D(e,"--skipto-menuitem-focus-background-color",o.menuitemFocusBackgroundColor,s.menuitemFocusBackgroundColor,i.menuitemFocusBackgroundColor),D(e,"--skipto-menuitem-focus-background-dark-color",o.menuitemFocusBackgroundDarkColor,s.menuitemFocusBackgroundDarkColor,i.menuitemFocusBackgroundDarkColor),D(e,"--skipto-focus-border-color",o.focusBorderColor,s.focusBorderColor,i.focusBorderColor),D(e,"--skipto-focus-border-dark-color",o.focusBorderDarkColor,s.focusBorderDarkColor,i.focusBorderDarkColor),D(e,"--skipto-button-text-color",o.buttonTextColor,s.buttonTextColor,i.buttonTextColor),D(e,"--skipto-button-text-dark-color",o.buttonTextDarkColor,s.buttonTextDarkColor,i.buttonTextDarkColor),D(e,"--skipto-button-background-color",o.buttonBackgroundColor,s.buttonBackgroundColor,i.buttonBackgroundColor),D(e,"--skipto-button-background-dark-color",o.buttonBackgroundDarkColor,s.buttonBackgroundDarkColor,i.buttonBackgroundDarkColor),D(e,"--skipto-dialog-text-color",o.dialogTextColor,s.dialogTextColorr,i.dialogTextColor),D(e,"--skipto-dialog-text-dark-color",o.dialogTextDarkColor,s.dialogTextDarkColor,i.dialogTextDarkColor),D(e,"--skipto-dialog-background-color",o.dialogBackgroundColor,s.dialogBackgroundColor,i.dialogBackgroundColor),D(e,"--skipto-dialog-background-dark-color",o.dialogBackgroundDarkColor,s.dialogBackgroundDarkColor,i.dialogBackgroundDarkColor),D(e,"--skipto-dialog-background-title-color",o.dialogBackgroundTitleColor,s.dialogBackgroundTitleColor,i.dialogBackgroundTitleColor),D(e,"--skipto-dialog-background-title-dark-color",o.dialogBackgroundTitleDarkColor,s.dialogBackgroundTitleDarkColor,i.dialogBackgroundTitleDarkColor),[r,a,l,d]=N(o.highlightBorderSize);const u=r+2*a;D(e,"--skipto-highlight-offset",`${l}px`,"",""),D(e,"--skipto-highlight-border-width",`${r}px`,"",""),D(e,"--skipto-highlight-font-size",d,"",""),D(e,"--skipto-highlight-shadow-border-width",`${u}px`,"",""),D(e,"--skipto-highlight-border-style",o.highlightBorderStyle,"",""),D(e,"--skipto-hidden-text-color",o.hiddenTextColor,"",i.hiddenTextColor),D(e,"--skipto-hidden-text-dark-color",o.hiddenTextDarkColor,"",i.hiddenTextDarkColor),D(e,"--skipto-hidden-background-color",o.hiddenBackgroundColor,"",i.hiddenBackgroundColor),D(e,"--skipto-hidden-background-dark-color",o.hiddenBackgroundDarkColor,"",i.hiddenBackgroundDarkColor),D(e,"--skipto-z-index-1",o.zIndex,s.zIndex,i.zIndex);const c=e.querySelector(".menu-button"),h=e.querySelector("button").getBoundingClientRect();if(c.classList.contains("show-border")){const t=-1*h.height+3+"px";e.style.setProperty("--skipto-show-border-offset",t)}else if(c.classList.contains("popup")){const t=-1*h.height+"px";e.style.setProperty("--skipto-popup-offset",t)}e.style.setProperty("--skipto-menu-offset",h.height+"px"),D(e,"--skipto-z-index-2",o.zIndex?(parseInt(o.zIndex)+1).toString():"2000001",""),D(e,"--skipto-z-index-highlight",o.zIndex?(parseInt(o.zIndex)-1).toString():"199999",""),"string"==typeof s.highlightTarget&&(o.highlightTarget=s.highlightTarget)}function A(t,e,o=!1){let n=t.querySelector("style");n||(n=document.createElement("style"),t.appendChild(n),n.textContent=S.textContent),H(t.querySelector(".container"),e,o)}S.textContent=`\n.container {\n color-scheme: light dark;\n\n --skipto-popup-offset: -36px;\n --skipto-show-border-offset: -28px;\n --skipto-menu-offset: 36px;\n\n --skipto-font-family: 'inherit';\n --skipto-font-size: 'inherit';\n --skipto-position-left: '46%';\n\n --skipto-button-text-color: '#13294b';\n --skipto-button-text-dark-color: '#ffffff';\n\n --skipto-button-background-color: '#dddddd';\n --skipto-button-background-dark-color: '#013c93';\n\n --skipto-focus-border-color: '#c5050c';\n --skipto-focus-border-dark-color: '#ffffff';\n\n --skipto-menu-text-color: '#13294b';\n --skipto-menu-text-dark-color: '#ffffff';\n\n --skipto-menu-background-color: '#dddddd';\n --skipto-menu-background-dark-color: '#000000';\n\n --skipto-menuitem-focus-text-color: '#dddddd';\n --skipto-menuitem-focus-text-dark-color: '#ffffff';\n\n --skipto-menuitem-focus-background-color: '#13294b';\n --skipto-menuitem-focus-background-dark-color: '#013c93';\n\n --skipto-dialog-text-color: '#000000';\n --skipto-dialog-text-dark-color: '#ffffff';\n\n --skipto-dialog-background-color: '#ffffff';\n --skipto-dialog-background-dark-color: '#000000';\n\n --skipto-dialog-background-title-color: '#eeeeee';\n --skipto-dialog-background-title-dark-color: '#013c93';\n\n --skipto-z-index-1: '2000001';\n --skipto-z-index-2: '20000002';\n --skipto-z-index-highlight: '1999900';\n\n --skipto-highlight-offset: '6px';\n --skipto-highlight-border-width: '4px':\n --skipto-highlight-font-size: '14pt':\n --skipto-highlight-shadow-border-width: '10px';\n --skipto-highlight-border-style: 'dashed';\n\n --skipto-hidden-text-color: '#000000';\n --skipto-hidden-text-dark-color: '#0000000';\n --skipto-hidden-background-color: '#ffcc00';\n --skipto-hidden-background-dark-color: '#ffcc00';\n\n}\n\n.container {\n display: block;\n z-index: var(--skipto-z-index-1);\n}\n\n.menu-button.popup {\n transform: translateY(var(--skipto-popup-offset));\n transition: top 0.35s ease;\n}\n\n.menu-button.popup.show-border {\n transform: translateY(var(--skipto-show-border-offset));\n/* top: var(--skipto-show-border-offset); */\n transition: top 0.35s ease;\n}\n\n.menu-button.popup.mobile button {\n display: none;\n}\n\n.menu-button {\n position: fixed;\n left: var(--skipto-position-left);\n z-index: var(--skipto-z-index-1) !important;\n}\n\n.menu-button button.open {\n margin: 0;\n padding: 2px 4px 4px 4px;\n border-width: 0px 2px 2px 2px;\n border-style: solid;\n border-radius: 0px 0px 6px 6px;\n border-color: light-dark(var(--skipto-button-background-color), var(--skipto-button-background-dark-color));\n color: light-dark(var(--skipto-button-text-color), var(--skipto-button-text-dark-color));\n background-color: light-dark(var(--skipto-button-background-color), var(--skipto-button-background-dark-color));\n font-size: var(--skipto-font-size);\n font-family: var(--skipto-font-family);\n}\n\n.menu-button button.open:focus,\n.menu-button button.open:hover {\n background-color: light-dark(var(--skipto-menu-background-color), var(--skipto-menu-background-dark-color));\n color: light-dark(var(--skipto-menu-text-color), var(--skipto-menu-text-dark-color));\n border-color: light-dark(var(--skipto-focus-border-color), var(--skipto-focus-border-dark-color));\n outline: none;\n}\n\n\n.menu-button button.open .skipto-large,\n.menu-button button.open .skipto-medium,\n.menu-button button.open .skipto-small {\n display: inline-block;\n margin: 0;\n padding: 4px;\n}\n\n.menu-button button.open .skipto-medium {\n display: none;\n}\n\n.menu-button button.open .skipto-small {\n display: none;\n}\n\n.menu-button button.hide {\n position: absolute;\n margin: 0;\n padding: 0;\n background-color: light-dark(var(--skipto-button-background-color), var(--skipto-button-background-dark-color));\n border-style: solid;\n border-width: 1px 1px 1px 1px;\n border-radius: 0px 6px 6px 0px;\n border-color: light-dark(var(--skipto-button-background-color), var(--skipto-button-background-dark-color));\n outline: none;\n}\n\n.menu-button button.hide svg {\n margin: 0;\n padding: 0;\n position: relative;\n top: 1px;\n}\n\n.menu-button button.hide line {\n stroke: light-dark(var(--skipto-button-background-color), var(--skipto-button-background-dark-color));\n}\n\n.menu-button button.hide circle.background {\n fill: light-dark(var(--skipto-button-text-color), var(--skipto-button-text-dark-color));\n stroke: light-dark(var(--skipto-button-text-color), var(--skipto-button-text-dark-color));\n}\n\n.menu-button button.hide circle.background {\n stroke: none;\n fill: light-dark(var(--skipto-button-text-color), var(--skipto-button-text-dark-color));\n}\n\n.menu-button button.hide circle.focus {\n stroke: none;\n}\n\n.menu-button button.hide:focus circle.focus,\n.menu-button button.hide:hover circle.focus {\n stroke: light-dark(var(--skipto-focus-border-color), var(--skipto-focus-border-dark-color));\n}\n\n.menu-button.popup button.hide {\n display: none;\n}\n\n@media only screen and (max-width: 588px) {\n .menu-button:not(.popup) button .skipto-small {\n transition: top 0.35s ease;\n display: inline-block;\n }\n\n .menu-button:not(.popup) button .skipto-large,\n .menu-button:not(.popup) button .skipto-medium {\n transition: top 0.35s ease;\n display: none;\n }\n\n .menu-button:not(.popup) button:focus .skipto-large {\n transition: top 0.35s ease;\n display: inline-block;\n }\n\n .menu-button:not(.popup) button:focus .skipto-small,\n .menu-button:not(.popup) button:focus .skipto-medium {\n transition: top 0.35s ease;\n display: none;\n }\n}\n\n@media only screen and (min-width: 588px) and (max-width: 992px) {\n .menu-button:not(.popup) button .skipto-medium {\n transition: top 0.35s ease;\n display: inline-block;\n }\n\n .menu-button:not(.popup) button .skipto-large,\n .menu-button:not(.popup) button .skipto-small {\n transition: top 0.35s ease;\n display: none;\n }\n\n .menu-button:not(.popup) button:focus .skipto-large {\n transition: top 0.35s ease;\n display: inline-block;\n }\n\n .menu-button:not(.popup) button:focus .skipto-small,\n .menu-button:not(.popup) button:focus .skipto-medium {\n transition: top 0.35s ease;\n display: none;\n }\n}\n\n.menu-button.static {\n position: absolute !important;\n}\n\n.menu-button [role="menu"] {\n min-width: 16em;\n display: none;\n margin: 0;\n padding: 0.25rem;\n background-color: light-dark(var(--skipto-menu-background-color), var(--skipto-menu-background-dark-color));\n border-width: 2px;\n border-style: solid;\n border-color: light-dark(var(--skipto-menu-text-color), var(--skipto-menu-text-dark-color));\n border-radius: 5px;\n z-index: var(--skipto-z-index-1) !important;\n touch-action: none;\n font-size: var(--skipto-font-size);\n font-family: var(--skipto-font-family);\n}\n\n.menu-button [role="group"] {\n display: grid;\n grid-auto-rows: min-content;\n grid-row-gap: 1px;\n}\n\n.menu-button [role="group"].overflow {\n overflow-x: hidden;\n overflow-y: scroll;\n}\n\n.menu-button [role="separator"]:first-child {\n border-radius: 5px 5px 0 0;\n}\n\n.menu-button [role="menuitem"] {\n padding: 3px;\n width: auto;\n border-width: 0px;\n border-style: solid;\n color: light-dark(var(--skipto-menu-text-color), var(--skipto-menu-text-dark-color));\n background-color: light-dark(var(--skipto-menu-background-color), var(--skipto-menu-background-dark-color));\n display: grid;\n overflow-y: clip;\n grid-template-columns: repeat(6, 1.2rem) 1fr;\n grid-column-gap: 2px;\n z-index: var(--skipto-z-index-1);\n}\n\n.menu-button [role="menuitem"].shortcuts,\n.menu-button [role="menuitem"].about {\n z-index: var(--skipto-z-index-2);\n}\n\n\n.menu-button [role="menuitem"] .level,\n.menu-button [role="menuitem"] .label {\n font-size: 100%;\n font-weight: normal;\n color: light-dark(var(--skipto-menu-text-color), var(--skipto-menu-text-dark-color));\n background-color: light-dark(var(--skipto-menu-background-color), var(--skipto-menu-background-dark-color));\n display: inline-block;\n line-height: inherit;\n display: inline-block;\n white-space: nowrap;\n border: none;\n}\n\n.menu-button [role="menuitem"] .level {\n text-align: right;\n padding-right: 4px;\n}\n\n.menu-button [role="menuitem"] .label {\n text-align: left;\n margin: 0;\n padding: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.menu-button [role="menuitem"] .level:first-letter,\n.menu-button [role="menuitem"] .label:first-letter {\n text-decoration: underline;\n text-transform: uppercase;\n}\n\n\n.menu-button [role="menuitem"].skip-to-h1 .level { grid-column: 1; }\n.menu-button [role="menuitem"].skip-to-h2 .level { grid-column: 2; }\n.menu-button [role="menuitem"].skip-to-h3 .level { grid-column: 3; }\n.menu-button [role="menuitem"].skip-to-h4 .level { grid-column: 4; }\n.menu-button [role="menuitem"].skip-to-h5 .level { grid-column: 5; }\n.menu-button [role="menuitem"].skip-to-h6 .level { grid-column: 6;}\n\n.menu-button [role="menuitem"].skip-to-h1 .label { grid-column: 2 / 8; }\n.menu-button [role="menuitem"].skip-to-h2 .label { grid-column: 3 / 8; }\n.menu-button [role="menuitem"].skip-to-h3 .label { grid-column: 4 / 8; }\n.menu-button [role="menuitem"].skip-to-h4 .label { grid-column: 5 / 8; }\n.menu-button [role="menuitem"].skip-to-h5 .label { grid-column: 6 / 8; }\n.menu-button [role="menuitem"].skip-to-h6 .label { grid-column: 7 / 8;}\n\n.menu-button [role="menuitem"].skip-to-h1.no-level .label { grid-column: 1 / 8; }\n.menu-button [role="menuitem"].skip-to-h2.no-level .label { grid-column: 2 / 8; }\n.menu-button [role="menuitem"].skip-to-h3.no-level .label { grid-column: 3 / 8; }\n.menu-button [role="menuitem"].skip-to-h4.no-level .label { grid-column: 4 / 8; }\n.menu-button [role="menuitem"].skip-to-h5.no-level .label { grid-column: 5 / 8; }\n.menu-button [role="menuitem"].skip-to-h6.no-level .label { grid-column: 6 / 8; }\n\n.menu-button [role="menuitem"].skip-to-nesting-level-1 .nesting { grid-column: 1; }\n.menu-button [role="menuitem"].skip-to-nesting-level-2 .nesting { grid-column: 2; }\n.menu-button [role="menuitem"].skip-to-nesting-level-3 .nesting { grid-column: 3; }\n\n.menu-button [role="menuitem"].skip-to-nesting-level-0 .label { grid-column: 1 / 8; }\n.menu-button [role="menuitem"].skip-to-nesting-level-1 .label { grid-column: 2 / 8; }\n.menu-button [role="menuitem"].skip-to-nesting-level-2 .label { grid-column: 3 / 8; }\n.menu-button [role="menuitem"].skip-to-nesting-level-3 .label { grid-column: 4 / 8; }\n\n.menu-button [role="menuitem"].no-items .label,\n.menu-button [role="menuitem"].action .label {\n grid-column: 1 / 8;\n}\n\n.menu-button [role="separator"] {\n margin: 1px 0px 1px 0px;\n padding: 3px;\n display: block;\n width: auto;\n font-weight: bold;\n border-bottom-width: 1px;\n border-bottom-style: solid;\n border-bottom-color: light-dark(var(--skipto-menu-text-color), var(--skipto-menu-text-dark-color));\n background-color: light-dark(var(--skipto-menu-background-color), var(--skipto-menu-background-dark-color));\n color: light-dark(var(--skipto-menu-text-color), var(--skipto-menu-text-dark-color));\n z-index: var(--skipto-z-index-1) !important;\n}\n\n.menu-button [role="separator"] .mofn {\n font-weight: normal;\n font-size: 85%;\n}\n\n.menu-button [role="separator"]:first-child {\n border-radius: 5px 5px 0 0;\n}\n\n.menu-button [role="menuitem"].last {\n border-radius: 0 0 5px 5px;\n}\n\n/* focus styling */\n\n.menu-button.popup.focus,\n.menu-button.popup.menu,\n.menu-button.popup:hover {\n transform: translateY(0);\n display: block;\n transition: left 1s ease;\n z-index: var(--skipto-z-index-1) !important;\n}\n\n.menu-button.popup.mobile.focus button {\n display: block;\n}\n\n.menu-button [role="menuitem"]:focus {\n padding: 1px;\n border-width: 2px;\n border-style: solid;\n border-color: light-dark(var(--skipto-focus-border-color), var(--skipto-focus-border-dark-color));\n outline: none;\n}\n\n.menu-button [role="menuitem"].hover,\n.menu-button [role="menuitem"].hover .level,\n.menu-button [role="menuitem"].hover .label {\n background-color: light-dark(var(--skipto-menuitem-focus-background-color), var(--skipto-menuitem-focus-background-dark-color));\n color: light-dark(var(--skipto-menuitem-focus-text-color), var(--skipto-menuitem-focus-text-dark-color));\n}\n\n.menu-button [role="separator"].shortcuts-disabled,\n.menu-button [role="menuitem"].shortcuts-disabled {\n display: none;\n}\n\n/* Dialog Styling */\n\ndialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%,-50%);\n font-family: var(--skipto-font-family);\n font-size: var(--skipto-font-size);\n max-width: 70%;\n margin: 0;\n padding: 0;\n background-color: light-dark(var(--skipto-dialog-background-color), var(--skipto-dialog-background-dark-color));\n color: light-dark(var(--skipto-dialog-text-color), var(--skipto-dialog-text-dark-color));\n border-width: 2px;\n border-style: solid;\n border-color: light-dark(var(--skipto-focus-border-color), --skipto-focus-border-dark-color));\n border-radius: 5px;\n z-index: 2000001;\n}\n\ndialog .header {\n margin: 0;\n margin-bottom: 0.5em;\n padding: 4px;\n border-width: 0;\n border-bottom-width: 1px;\n border-style: solid;\n border-color: light-dark(--skipto-focus-border-color), --skipto-focus-border-dark-color));\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n font-weight: bold;\n background-color: light-dark(var(--skipto-dialog-background-title-color), var(--skipto-dialog-background-title-dark-color));\n color: light-dark(var(--skipto-dialog-text-color), var(--skipto-dialog-text-dark-color));\n position: relative;\n font-size: 100%;\n}\n\ndialog .header h2 {\n margin: 0;\n padding: 0;\n font-size: 120%;\n}\n\ndialog .header button {\n position: absolute;\n top: 0px;\n right: 2px;\n border: none;\n background: transparent;\n font-weight: bold;\n font-size: 1.75em;\n color: light-dark(var(--skipto-dialog-text-color), var(--skipto-dialog-text-dark-color));\n font-family: var(--skipto-font-family);\n}\n\ndialog .content {\n margin-left: 2em;\n margin-right: 2em;\n margin-top: 0;\n margin-bottom: 2em;\n font-size: 110%;\n}\n\ndialog .content .desc {\n margin: 0.25em;\n text-align: center;\n}\n\ndialog .content .privacy-label {\n margin: 0;\n margin-top: 1em;\n text-align: center;\n font-weight: bold;\n}\n\ndialog .content .privacy {\n text-align: center;\n margin-bottom: 1em;\n}\n\ndialog .content .happy {\n text-align: center;\n font-family: 'Brush Script MT', cursive;\n font-size: 200%;\n letter-spacing: 0.05em;\n}\n\ndialog .content .version,\ndialog .content .copyright {\n margin-top: 0.5em;\n text-align: center;\n}\n\ndialog .content table {\n width: auto;\n border-collapse: collapse;\n}\n\ndialog .content caption {\n margin: 0;\n padding: 0;\n margin-top: 1em;\n text-align: left;\n font-weight: bold;\n font-size: 110%;\n}\n\ndialog .content th {\n margin: 0;\n padding: 0;\n padding-top: 0.125em;\n padding-bottom: 0.125em;\n text-align: left;\n font-weight: bold;\n font-size: 100%;\n}\n\ndialog .content th {\n border-bottom-width: 1px;\n border-bottom-style: solid;\n border-bottom-color: light-dark(#999999, #777777);\n}\n\ndialog .content td.shortcut,\ndialog .content td.desc {\n margin: 0;\n padding-left: 0.25em;\n padding-right: 0.25em;\n padding-top: 0.125em;\n padding-bottom: 0.125em;\n text-align: left;\n font-size: 100%;\n}\n\ndialog .content th.shortcut {\n text-align: left;\n width: 3em;\n}\n\ndialog .content th.desc {\n text-align: left;\n width: 12em;\n}\n\ndialog .content table tr:nth-child(even) {\n background-color: light-dark(#eeeeee, #111111);\n}\n\ndialog .buttons {\n float: right;\n margin-right: 0.5em;\n margin-bottom: 0.5em;\n}\n\ndialog .buttons button {\n margin: 6px;\n min-width: 5em;\n font-family: var(--skipto-font-family);\n font-size: 125%;\n}\n\ndialog button:focus {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n\ndialog button:hover {\n cursor: pointer;\n}\n\n/* Navigation Messages */\n\n#${m} {\n position: fixed;\n display: block;\n opacity: 1;\n top: 50%;\n left: 50%;\n transform: translate(-50%,-50%);\n\n font-family: $fontFamily;\n font-size: $fontSize;\n max-width: 70%;\n margin: 0;\n padding: 0;\n background-color: light-dark(var(--skipto-dialog-background-color), var(--skipto-dialog-background-dark-color));\n border: 2px solid light-dark(var(--skipto-focus-border-color), var(--skipto-focus-border-dark-color));\n border-radius: 5px;\n color: light-dark(var(--skipto-dialog-text-color), var(--skipto-dialog-text-dark-color));\n z-index: 2000001;\n opacity: 1;\n}\n\n#${m} .header {\n margin: 0;\n padding: 4px;\n border-bottom: 1px solid light-dark(var(--skipto-focus-border-color), var(--skipto-focus-border-dark-color));\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n font-weight: bold;\n background-color: light-dark(var(--skipto-dialog-background-title-color), var(--skipto-dialog-background-title-dark-color));\n color light-dark(var(--skipto-dialog-text-color), var(--skipto-dialog-text-dark-color));\n font-size: 100%;\n}\n\n#${m} .content {\n margin-left: 2em;\n margin-right: 2em;\n margin-top: 2em;\n margin-bottom: 2em;\n background-color: light-dark(var(--skipto-dialog-background-color), var(--skipto-dialog-background-dark-color));\n color: light-dark(var(--skipto-dialog-text-color), var(--skipto-dialog-text-dark-color));\n font-size: 110%;\n text-algin: center;\n}\n\n#${m}.hidden {\n display: none;\n}\n\n#${m}.fade {\n opacity: 0;\n transition: visibility 0s 1s, opacity 1s linear;\n}\n\n@media (forced-colors: active) {\n\n #${m} {\n background-color: Canvas;\n color CanvasText;\n border-color: AccentColor;\n }\n\n #${m} .header {\n background-color: Canvas;\n color CanvasText;\n }\n\n #${m} .content {\n background-color: Canvas;\n color: CanvasText;\n }\n}\n\n#${p} {\n margin: 0;\n padding: 0;\n position: absolute;\n border-radius: var(--skipto-highlight-offset);\n border-width: var(--skipto-highlight-shadow-border-width);\n border-style: solid;\n border-color: light-dark(var(--skipto-menu-background-color), var(--skipto-menu-background-dark-color));\n box-sizing: border-box;\n pointer-events:none;\n z-index: var(--skipto-z-index-highlight);\n}\n\n#${p} .overlay-border {\n margin: 0;\n padding: 0;\n position: relative;\n border-radius: var(--skipto-highlight-offset);\n border-width: var(--skipto-highlight-border-width);\n border-style: var(--skipto-highlight-border-style);\n border-color: light-dark(var(--skipto-focus-border-color), var(--skipto-focus-border-dark-color));\n z-index: var(--skipto-z-index-1);\n box-sizing: border-box;\n pointer-events:none;\n background: transparent;\n}\n\n\n@keyframes fadeIn {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n}\n\n#${b} {\n position: absolute;\n margin: 0;\n padding: .25em;\n background-color: light-dark(var(--skipto-hidden-background-color), var(--skipto-hidden-background-dark-color));\n color: light-dark(var(--skipto-hidden-text-color), var(--skipto-hidden-text-dark-color));\n font-family: var(--skipto-font-family);\n font-size: var(--skipto-highlight-font-size);\n font-style: italic;\n font-weight: bold;\n text-align: center;\n animation: fadeIn 1.5s;\n z-index: var(--skipto-z-index-1);\n}\n\n#${p} .overlay-info {\n margin: 0;\n padding: 2px;\n position: relative;\n text-align: left;\n font-size: $fontSize;\n font-family: $fontFamily;\n border: var(--skipto-highlight-border-width) solid light-dark($menuBackgroundColor, $menuBackgroundDarkColor);\n background-color: light-dark(var(--skipto-menu-background-color), var(--skipto-menu-background-dark-color));\n color: light-dark(var(--skipto-menu-text-color), var(--skipto-menu-text-dark-color));\n z-index: var(--skipto-z-index-1);\n overflow: hidden;\n text-overflow: ellipsis;\n pointer-events:none;\n}\n\n#${p} .overlay-info.hasInfoTop {\n border-radius: var(--skipto-highlight-offset) var(--skipto-highlight-offset) 0 0;\n}\n\n#${p} .overlay-info.hasInfoBottom {\n border-radius: 0 0 var(--skipto-highlight-offset) var(--skipto-highlight-offset);\n}\n\n@media (forced-colors: active) {\n\n #${p} {\n border-color: ButtonBorder;\n }\n\n #${p} .overlay-border {\n border-color: ButtonBorder;\n }\n\n #${p} .overlay-border.skip-to-hidden {\n background-color: ButtonFace;\n color: ButtonText;\n }\n\n #${p} .overlay-info {\n border-color: ButtonBorder;\n background-color: ButtonFace;\n color: ButtonText;\n }\n\n}\n\n`;const M=new e("[shortcutsInfoDialog]",!1);M.flag=!1;const F=document.createElement("template");F.innerHTML=`\n \n`;class ${constructor(t){return t.appendChild(F.content.cloneNode(!0)),this.dialogElem=t.querySelector("dialog"),this.closeButtonElem1=t.querySelector(`#${g} .header button`),this.closeButtonElem1.addEventListener("click",this.onCloseButtonClick.bind(this)),this.closeButtonElem1.addEventListener("keydown",this.onKeyDown.bind(this)),this.titleElem=t.querySelector(`#${g} .title`),this.shortcutContentElem=t.querySelector(`#${g} .shortcuts`),this.aboutContentElem=t.querySelector(`#${g} .about`),this.osShortcutElem=t.querySelector(`#${g} #os-shortcut`),t.querySelector(`#${g} .buttons button.more`).addEventListener("click",this.onMoreInfoClick.bind(this)),this.closeButtonElem2=t.querySelector(`#${g} .buttons button.close`),this.closeButtonElem2.addEventListener("click",this.onCloseButtonClick.bind(this)),this.closeButtonElem2.addEventListener("keydown",this.onKeyDown.bind(this)),this}onCloseButtonClick(){this.dialogElem.close()}openDialog(t,e,o){this.content=t,"shortcuts"===t?(this.shortcutContentElem.style.display="block",this.aboutContentElem.style.display="none",this.titleElem.textContent=e):(this.shortcutContentElem.style.display="none",this.aboutContentElem.style.display="block",this.titleElem.textContent=e,this.osShortcutElem.textContent=o),this.dialogElem.showModal(),this.closeButtonElem2.focus()}onMoreInfoClick(){const t="shortcuts"===this.content?C:x;t&&window.open(t,"_blank").focus()}onKeyDown(t){"Tab"!==t.key||t.altKey||t.ctlKey||t.metaKey||(M.log(`shift: ${t.shiftKey} ${t.currentTarget===this.closeButtonElem1} ${t.currentTarget===this.closeButtonElem2}`),t.shiftKey&&t.currentTarget===this.closeButtonElem1&&(this.closeButtonElem2.focus(),t.preventDefault(),t.stopPropagation()),t.shiftKey||t.currentTarget!==this.closeButtonElem2||(this.closeButtonElem1.focus(),t.preventDefault(),t.stopPropagation()))}}new e("[shortcutsMessage]",!1).flag=!1;const I=document.createElement("template");I.innerHTML=`\n
+ For each allocation change request below, there is the option to activate the allocation request and to view the allocation change's detail page.
+ If a change request is only for an extension to the allocation, they can be approved on this page. However if the change request includes changes to
+ the allocation's attributes, the request must be reviewed and acted upon in its detail page.
+
+
+{% if allocation_change_list %}
+
+
+
Allocation change requests with actions to approve or view details.
+
+
+
#
+
Requested
+
Project Title
+
PI
+
Resource
+
Extension
+
Actions
+
+
+
+ {% for change in allocation_change_list %}
+
Request New Allocation Project: {{ project.title }}
+
+
+
The following {% settings_value 'CENTER_NAME' %}
+ resources are available to request for this project. If you need access to
+ more than one of these, please submit a separate allocation request for each
+ resource. For each request you must fill out all required fields.
+
+
+
+
+
+
+
+
+
Resource Description
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Add New Account Name
+
+
+
+
+ *No spaces in account name
+
+
+
+
+
+
+
+
+
+
+
+
+
Data Management Ideas and Best Practices
+
+
+
+
+
+
General Info
+
+
+
+
Store files that naturally group by lab, project, category, date, experiment, meeting, etc…
+
Separate ongoing work from completed work.
+
Organize files so that it’s easy to delete or archive large numbers of files when they are no longer actively worked on or needed.
+
Consider using a group account and or a security group when sharing and storing data with others.
+
+ Review IU's Secure My Research for information on data handling best practices.
+
+
+
+
+
+
+
For Filenames
+
+
+
+
Use consistent file naming conventions and ensure all users of the storage adhere to those conventions.
+
Use a coded naming convention to keep file names, directory names, and subsequently path names as short as possible.
+
Use a file naming scheme that includes the date as the preface of the file to naturally organize files by date. This can be useful when the file name may be the same.
+
Pattern: [YYYY][MM][DD][HR][MIN]-
+
Example: 20201017-team-meeting-notes.txt
+
Example: 20210721-expr14-run5.dat
+
+
+
+
+
+
For Directory Name
+
+
+
+
Use directories and sub-directories to organize your data/files.
+
Organize directories by date, with the intention to keep X number of months or years.
+
Use an index file within a directory to explain the contents of the directory.
+
+
+
+
+
+
Things to Avoid
+
+
+
+
Avoid saving unused, unneeded data/files.
+
Avoid overfilling directories.
+
Avoid directories with a single file.
+
Avoid lengthy file names, directory names, and pathnames. Many storage systems have limits to their length.
+
Avoid spaces in directory and file names. Some search programs can struggle with spaces in names plus it can make coding more difficult.
+
Avoid special characters or Unicode in directory and filenames. Not all storage systems recognize Unicode.
+ {% if is_allowed_to_update_project and not allocation.status.name in 'Denied, Expired, Renewal Denied, Removed, Revoked' %}
+ {% if not allocation.get_parent_resource.name == 'Geode-Project' %}
+
+ Add Users
+
+
+ Remove Users
+
+ {% else %}
+
+ Membership management for this allocation is handled via AD groups.
+
+ {% endif %}
+ {% endif %}
+
+
+
+ {% if allocation.get_parent_resource.name == 'Slate-Project' %}
+
+
+ Below is a list of statuses a Slate-Project user can have:
+
+
Pending - This allocation hasn't been approved yet
+
Active - This user has access to the allocation's space
+
Invited - This user needs to create their Slate-Project account at Create Accounts to get access
+
Disabled - This user's access to this allocation's space has been removed
+
Retired - This user is no longer active in this allocation and likely should be removed
+
+ If a user has an Active status and cannot access the storage space then they most likely need to log out (not disconnect) from all interactive login sessions and log back in for their newly added access to become active.
+
+ {% endif %}
+
+
+
Users in this allocation
+
+
+
Username
+
Name
+
Email
+ {% if allocation_user_roles_enabled %}
+
Role
+ {% endif %}
+
Status
+
Last Modified
+ {% if is_allowed_to_update_project and allocation_user_roles_enabled %}
+
diff --git a/coldfront/components/site/templates/common/navbar_nonadmin_staff.html b/coldfront/components/site/templates/common/navbar_nonadmin_staff.html
new file mode 100644
index 0000000000..2163b87afa
--- /dev/null
+++ b/coldfront/components/site/templates/common/navbar_nonadmin_staff.html
@@ -0,0 +1,114 @@
+{% load common_tags %}
+
+{% comment %}
+ intentionally keeping "navbar-admin" (rather than renaming to navbar-staff),
+ since existing templates use javascript to target it by ID
+{% endcomment %}
+
{% include 'request_forms/navbar_software_request.html' %}
+
{% include 'request_forms/navbar_stats_request.html' %}
+
+
+ {% endif %}
+
+
diff --git a/coldfront/components/site/templates/common/nonauthorized_navbar.html b/coldfront/components/site/templates/common/nonauthorized_navbar.html
new file mode 100644
index 0000000000..7c8bd7425f
--- /dev/null
+++ b/coldfront/components/site/templates/common/nonauthorized_navbar.html
@@ -0,0 +1,54 @@
+{% include 'common/navbar_brand.html' %}
+{% load common_tags %}
+
diff --git a/coldfront/components/site/templates/email/allocation_activated.txt b/coldfront/components/site/templates/email/allocation_activated.txt
new file mode 100644
index 0000000000..287d916f06
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_activated.txt
@@ -0,0 +1,12 @@
+Dear {{center_name}} user,
+
+Your allocation request for {{resource}} has been activated. You now have access to this resource.
+
+Additional Info:
+Project PI: {{ project_pi }}
+Project URL: {{ allocation_url }}
+Allocation URL: {{ allocation_url }}
+{% for type, value in allocation_identifiers %}{{ type }}: {{ value }}{% endfor %}
+
+Thank you,
+{{signature}}
diff --git a/coldfront/components/site/templates/email/allocation_added_users.txt b/coldfront/components/site/templates/email/allocation_added_users.txt
new file mode 100644
index 0000000000..8c06702c85
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_added_users.txt
@@ -0,0 +1,17 @@
+Dear {{ center_name }} user,
+
+These users have been added to an allocation for {{ resource }} in project "{{ project_title }}" by {{ action_user }}.
+{% for user in users %}{{ user.first_name }} {{ user.last_name}} ({{ user.username}})
+{% endfor %}
+Additional Info:
+Project PI: {{ project_pi }}
+Project URL: {{ project_url }}
+Allocation URL: {{ allocation_url }}
+{% for type, value in allocation_identifiers %}{{ type }}: {{ value }}{% endfor %}{% spaceless %}
+{% if allocation_status not in 'Active, Renewal Requested' %}
+Note: This allocation has not been approved yet and is not currently providing access.
+{% endif %}
+{% endspaceless %}
+
+Thank you,
+{{ signature }}
diff --git a/coldfront/components/site/templates/email/allocation_change_approved.txt b/coldfront/components/site/templates/email/allocation_change_approved.txt
new file mode 100644
index 0000000000..d76ede87a6
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_change_approved.txt
@@ -0,0 +1,12 @@
+Dear {{center_name}} user,
+
+Your allocation change request for {{resource}} has been approved. The requested changes are now active.
+
+Additional Info:
+Project PI: {{ project_pi }}
+Project URL: {{ project_url }}
+Allocation URL: {{ allocation_url }}
+{% for type, value in allocation_identifiers %}{{ type }}: {{ value }}{% endfor %}
+
+Thank you,
+{{signature}}
diff --git a/coldfront/components/site/templates/email/allocation_change_denied.txt b/coldfront/components/site/templates/email/allocation_change_denied.txt
new file mode 100644
index 0000000000..4bdb063249
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_change_denied.txt
@@ -0,0 +1,13 @@
+Dear {{center_name}} user,
+
+Your allocation change request for {{resource}} has been denied.
+
+We will be in touch to follow up with you about this, if we haven't already.
+Additional Info:
+Project PI: {{ project_pi }}
+Project URL: {{ project_url }}
+Allocation URL: {{ allocation_url }}
+{% for type, value in allocation_identifiers %}{{ type }}: {{ value }}{% endfor %}
+
+Thank you,
+{{signature}}
diff --git a/coldfront/components/site/templates/email/allocation_denied.txt b/coldfront/components/site/templates/email/allocation_denied.txt
new file mode 100644
index 0000000000..325af4cfb6
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_denied.txt
@@ -0,0 +1,13 @@
+Dear {{center_name}} user,
+
+Your allocation request for {{resource}} has been denied.
+
+We will be in touch to follow up with you about this, if we haven't already.
+Additional Info:
+Project PI: {{ project_pi }}
+Project URL: {{ project_url }}
+Allocation URL: {{ allocation_url }}
+{% for type, value in allocation_identifiers %}{{ type }}: {{ value }}{% endfor %}
+
+Thank you,
+{{signature}}
diff --git a/coldfront/components/site/templates/email/allocation_expired.txt b/coldfront/components/site/templates/email/allocation_expired.txt
new file mode 100644
index 0000000000..5cec10c555
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_expired.txt
@@ -0,0 +1,26 @@
+Dear {{center_name}} user,
+
+Your access to {{center_name}} resources has expired. Any accounts under these allocation(s) are now unable to
+access the associated resource.
+
+If you wish to continue using them, the managers responsible for the following project(s) must renew the expired
+allocations(s) before 7/31, after which the allocations will be terminated and cannot be renewed.
+
+Below is a list of links to your project(s) containing at least one expired allocation:
+{% for project_key, project_url in project_dict.items %}
+Project Title: {{project_key}}
+Project URL: {{ project_url.0 }}
+Project PI: {{ project_url.1 }}
+Project Type: {{ project_url.3 }}
+ {% spaceless %} {% for allocation_key, allocation_value in allocation_dict.items %}{% if allocation_key == project_url.0 %}Expired Allocation(s):{% for allocation in allocation_value %}{% for allocation_url, resource_name in allocation.items %}
+ {{ resource_name }} - {{ allocation_url }}{% endfor %}{% endfor %}{% endif %}{% endfor %}{% endspaceless %}
+{% endfor %}
+The managers in these projects can renew the allocations. If they are not needed anymore you can safely ignore this email.
+For more information about the yearly renewal, visit our knowledge base: {{ project_renewal_help_url }}.
+
+If you are not the PI or a manager under this project, you are receiving this notice as a courtesy.
+
+If you have any questions please email us at {{ help_email }}
+
+Thank you,
+{{ signature }}
diff --git a/coldfront/components/site/templates/email/allocation_expiring.txt b/coldfront/components/site/templates/email/allocation_expiring.txt
new file mode 100644
index 0000000000..8a1410cf70
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_expiring.txt
@@ -0,0 +1,26 @@
+Dear {{center_name}} user,
+
+Your access to Research Technologies resources is expiring soon. To renew, login to RT Projects and
+complete the short renewal process for each expiring allocation. Failure to renew the expiring allocation(s)
+will terminate access to the resource for all users in them
+
+Below is a list of links to your project(s) containing at least one expiring allocation:
+{% for project_key, project_url in project_dict.items %}
+Project Title: {{project_key}}
+Project URL: {{ project_url.0 }}
+Project PI: {{ project_url.1 }}
+Project Type: {{ project_url.3 }}
+ {% spaceless %}{% for days_key, days_value in expiration_dict.items %}
+ Allocation(s) expiring in {{days_key}} days:{% for allocations in days_value %}{% if allocations.0 == project_url.0 %}
+ {% spaceless %}{{ allocations.2 }}{% endspaceless %}{% endif %}{% endfor %}
+ {% endfor %}{% endspaceless %}
+{% endfor %}
+The managers in these projects can renew the allocations. If they are not needed anymore you can safely ignore this email.
+For more information about the yearly renewal, visit our knowledge base: {{ project_renewal_help_url|safe }}
+
+If you are not the PI or a manager under this project, you are receiving this notice as a courtesy.
+
+If you have any questions please email us at {{ help_email }}
+
+Thank you,
+{{ signature }}
diff --git a/coldfront/components/site/templates/email/allocation_removed_users.txt b/coldfront/components/site/templates/email/allocation_removed_users.txt
new file mode 100644
index 0000000000..bc3de35c1b
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_removed_users.txt
@@ -0,0 +1,13 @@
+Dear {{ center_name }} user,
+
+These users have been removed from an allocation for {{ resource }} in project "{{ project_title }}" by {{ action_user }}.
+{% for user in users %}{{ user.first_name }} {{ user.last_name}} ({{ user.username}})
+{% endfor %}
+They no longer have access to the resource in this allocation.
+Additional Info:
+Project PI: {{ project_pi }}
+Project URL: {{ project_url }}
+{% for type, value in allocation_identifiers %}{{ type }}: {{ value }}{% endfor %}
+
+Thank you,
+{{ signature }}
\ No newline at end of file
diff --git a/coldfront/components/site/templates/email/allocation_renewed.txt b/coldfront/components/site/templates/email/allocation_renewed.txt
new file mode 100644
index 0000000000..8c9172c241
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_renewed.txt
@@ -0,0 +1,2 @@
+A request for renewal for an allocation in project "{{project_title}}" with id {{project_id}} has been received for {{pi}} - {{resource}}. Please review the allocation renewal request:
+{{url}}
diff --git a/coldfront/components/site/templates/email/allocation_revoked.txt b/coldfront/components/site/templates/email/allocation_revoked.txt
new file mode 100644
index 0000000000..f355221fe4
--- /dev/null
+++ b/coldfront/components/site/templates/email/allocation_revoked.txt
@@ -0,0 +1,13 @@
+Dear {{center_name}} user,
+
+Your allocation for {{resource}} has been revoked.
+
+We will be in touch to follow up with you about this, if we haven't already.
+Additional Info:
+Project PI: {{ project_pi }}
+Project URL: {{ project_url }}
+Allocation URL: {{ allocation_url }}
+{% for type, value in allocation_identifiers %}{{ type }}: {{ value }}{% endfor %}
+
+Thank you,
+{{signature}}
diff --git a/coldfront/components/site/templates/email/new_allocation_change_request.txt b/coldfront/components/site/templates/email/new_allocation_change_request.txt
new file mode 100644
index 0000000000..e27caa3f79
--- /dev/null
+++ b/coldfront/components/site/templates/email/new_allocation_change_request.txt
@@ -0,0 +1,2 @@
+An allocation change request in project "{{project_title}}" with id {{project_id}} has been made for {{pi}} - {{resource}}. Please review the change request:
+{{url}}
diff --git a/coldfront/components/site/templates/email/new_allocation_request.txt b/coldfront/components/site/templates/email/new_allocation_request.txt
new file mode 100644
index 0000000000..292a047ee8
--- /dev/null
+++ b/coldfront/components/site/templates/email/new_allocation_request.txt
@@ -0,0 +1,2 @@
+A new allocation in project "{{project_title}}" with id {{project_id}} has been requested for {{pi}} - {{resource}}. Please review the allocation:
+{{url}}. Project detail url: {{project_detail_url}}
diff --git a/coldfront/components/site/templates/email/new_project_renewal.txt b/coldfront/components/site/templates/email/new_project_renewal.txt
new file mode 100644
index 0000000000..295765a97b
--- /dev/null
+++ b/coldfront/components/site/templates/email/new_project_renewal.txt
@@ -0,0 +1,2 @@
+Project "{{project_title}}" with id {{project_id}} has a new renewal request. Please review at your earliest convenience:
+{{url}}
diff --git a/coldfront/components/site/templates/email/new_project_request.txt b/coldfront/components/site/templates/email/new_project_request.txt
new file mode 100644
index 0000000000..3e1f5b2e24
--- /dev/null
+++ b/coldfront/components/site/templates/email/new_project_request.txt
@@ -0,0 +1 @@
+A new request for project "{{project_title}}" with id {{project_id}} has been submitted. You can view it here: {{ url }}
\ No newline at end of file
diff --git a/coldfront/components/site/templates/email/pi_project_request.txt b/coldfront/components/site/templates/email/pi_project_request.txt
new file mode 100644
index 0000000000..02b1f8c0e0
--- /dev/null
+++ b/coldfront/components/site/templates/email/pi_project_request.txt
@@ -0,0 +1,9 @@
+Dear {{ center_name }} user,
+
+You have been added as a PI to project {{ project_title }} by {{ requestor_first_name }} {{ requestor_last_name }}, ({{ requestor_username }}). You can view the details here:
+{{ project_url }}
+
+If you have any questions please email us at {{ help_email }}
+
+Thank you,
+{{ signature }}
\ No newline at end of file
diff --git a/coldfront/components/site/templates/email/project_added_users.txt b/coldfront/components/site/templates/email/project_added_users.txt
new file mode 100644
index 0000000000..b4d255a8e6
--- /dev/null
+++ b/coldfront/components/site/templates/email/project_added_users.txt
@@ -0,0 +1,12 @@
+Dear {{ center_name }} user,
+
+These users have been added to the project "{{ project_title }}" by {{ action_user }}.
+{% for project_user in project_users %}{{ project_user.user.first_name }} {{ project_user.user.last_name }} ({{ project_user.user.username }})
+{% endfor %}
+They can view the project here:
+{{ url }}
+
+Resource access is not automatically granted to project users, they must be added to an allocation as well.
+
+Thank you,
+{{ signature }}
\ No newline at end of file
diff --git a/coldfront/components/site/templates/email/project_expired.txt b/coldfront/components/site/templates/email/project_expired.txt
new file mode 100644
index 0000000000..b7810ce7c4
--- /dev/null
+++ b/coldfront/components/site/templates/email/project_expired.txt
@@ -0,0 +1,36 @@
+Dear {{center_name}} user,
+
+Your access to {{center_name}} resources has expired. Any accounts under these RT project(s) and
+allocation(s) are now unable to access the associated resource.
+
+If you wish to continue using them, the managers responsible for the following project(s) must renew the expired
+project(s) and allocation(s) before 7/31, after which the projects will be terminated and cannot be renewed.
+
+Below is your expired project(s):
+{% spaceless %}
+{% for project in project_dict %}
+----------------------------------------------
+Project Title: {{project.project.title}}
+Project URL: {{ project.project_url }}
+Project PI: {{ project.project.pi }}
+Project Type: {{ project.project.type }}
+{% if project.project.type.name == 'Class' %}
+NOTE: This project cannot be renewed. The PI of this project will need to submit a new project.
+{% endif %}
+Allocations expired:
+{% for allocation in project.allocations %} {{ allocation.get_parent_resource }}
+{% empty %} No allocations to list{% endfor %}
+{% endfor %}
+{% endspaceless %}
+
+The managers responsible for these projects are required to renew them unless stated otherwise. The
+expired allocations can be renewed during the project renewal. If they are not they will need to be
+renewed separately.
+For more information about the yearly renewal, visit our knowledge base: {{ project_renewal_help_url|safe }}.
+
+If you are not the PI or a manager under this project, you are receiving this notice as a courtesy.
+
+If you have any questions please email us at {{ help_email }}
+
+Thank you,
+{{ signature }}
diff --git a/coldfront/components/site/templates/email/project_expires_today.txt b/coldfront/components/site/templates/email/project_expires_today.txt
new file mode 100644
index 0000000000..9764348859
--- /dev/null
+++ b/coldfront/components/site/templates/email/project_expires_today.txt
@@ -0,0 +1,12 @@
+Dear {{ center_name }} user,
+
+Your project "{{ project_title }}" on RT Projects expires today. Once expired you will no longer be able to edit your project.
+This project has no allocations in it and is not providing access to any of RT's resources. If you do not need this project to
+give you access to RT's resources then it is recommended to let it expire.
+
+If you are not the PI or a manager in this project you are receiving this notice as a courtesy.
+
+If you have any questions please email us at {{ help_email }}
+
+Thank you,
+{{ signature }}
diff --git a/coldfront/components/site/templates/email/project_expiring.txt b/coldfront/components/site/templates/email/project_expiring.txt
new file mode 100644
index 0000000000..c81ee0b916
--- /dev/null
+++ b/coldfront/components/site/templates/email/project_expiring.txt
@@ -0,0 +1,36 @@
+Dear {{center_name}} user,
+
+Your access to {{center_name}} resources is expiring soon. To renew, login to RT Projects and
+complete the short renewal process for each expiring project. Failure to renew the expiring RT project(s)
+and its allocation(s) on time will terminate access to the resource for all users in the allocation(s).
+
+Below is your expiring project(s):
+{% spaceless %}
+{% for project in project_dict %}
+----------------------------------------------
+Project Title: {{project.project.title}}
+Project URL: {{ project.project_url }}
+Project PI: {{ project.project.pi }}
+Project Type: {{ project.project.type }}
+Project Days Remaining: {{ expiring_in_days }}
+{% if project.project.type.name == 'Class' %}
+NOTE: This project cannot be renewed. The PI of this project will need to submit a new project.
+{% endif %}
+Allocations expiring soon:
+{% for allocation in project.allocations %} {{ allocation.get_parent_resource }}
+{% empty %} No allocations to list{% endfor %}
+{% endfor %}
+{% endspaceless %}
+
+The managers for these projects are required to renew them unless stated otherwise. The expiring allocations can be renewed during the project renewal.
+If they are not they will need to be renewed separately. If you do not need any of these projects anymore we recommend archiving them, doing so will
+expire all allocations with it. You can do so with the archive project button on your project's detail page. You will not receive renewal emails
+for archived projects. Archiving a project does not affect any of the data within the resource allocations it has.
+For more information about the yearly renewal, visit our knowledge base: {{ project_renewal_help_url|safe }}
+
+If you are not the PI or a manager under this project, you are receiving this notice as a courtesy.
+
+If you have any questions please email us at {{ help_email }}
+
+Thank you,
+{{ signature }}
diff --git a/coldfront/components/site/templates/email/project_removed_users.txt b/coldfront/components/site/templates/email/project_removed_users.txt
new file mode 100644
index 0000000000..2a87720295
--- /dev/null
+++ b/coldfront/components/site/templates/email/project_removed_users.txt
@@ -0,0 +1,14 @@
+Dear {{ center_name }} user,
+
+These users have been removed from project "{{ project_title }}" by {{ action_user }}. They no longer have access to any allocations in this project.
+{% for removed_user in removed_users %}{{ removed_user.user.first_name }} {{ removed_user.user.last_name }} ({{ removed_user.user.username }})
+{% endfor %}
+Breakdown of resources each user no longer has access to:
+{% spaceless %}{% for user, allocation_info in removed_users_breakdown.items %}
+{{ user }}
+-----------------
+{% for allocation, identifiers in allocation_info %}{{ allocation }}{% if identifiers %}: {% for identifier in identifiers %}{{ identifier }},{% endfor %}{% endif %}
+{% endfor %}{% endfor %}{% endspaceless %}
+
+Thank you,
+{{ signature }}
\ No newline at end of file
diff --git a/coldfront/components/site/templates/email/project_renewal_approved.txt b/coldfront/components/site/templates/email/project_renewal_approved.txt
new file mode 100644
index 0000000000..e479eea489
--- /dev/null
+++ b/coldfront/components/site/templates/email/project_renewal_approved.txt
@@ -0,0 +1,12 @@
+Dear {{ center_name }} user,
+
+Your project review for "{{ project_title }}" has been approved. You can view your project here: {{ project_url }}
+The allocations you selected to be renewed will be reviewed separately. If you did not select an allocation to be renewed
+with your project you will need to submit a separate renewal request for it.
+
+If you are a student or collaborator under this project, you are receiving this notice as a courtesy.
+
+If you have any questions please email us at {{ help_email }}
+
+Thank you,
+{{signature}}
\ No newline at end of file
diff --git a/coldfront/components/site/templates/email/project_renewal_denied.txt b/coldfront/components/site/templates/email/project_renewal_denied.txt
new file mode 100644
index 0000000000..acb224c6ea
--- /dev/null
+++ b/coldfront/components/site/templates/email/project_renewal_denied.txt
@@ -0,0 +1,12 @@
+Dear {{ center_name }} user,
+
+Your project review for "{{ project_title }}" has been denied. You can view your project here: {{ project_url }}
+
+Any active allocations you have in this project will continue to be active until their end date.
+
+We will be in touch to follow up with you about this, if we haven't already.
+
+If you have any questions please email us at {{ help_email }}
+
+Thank you,
+{{signature}}
\ No newline at end of file
diff --git a/coldfront/components/site/templates/email/project_request_approved.txt b/coldfront/components/site/templates/email/project_request_approved.txt
new file mode 100644
index 0000000000..e718520266
--- /dev/null
+++ b/coldfront/components/site/templates/email/project_request_approved.txt
@@ -0,0 +1,10 @@
+Dear {{ center_name }} user,
+
+Your project request for "{{ project_title }}" has been approved. You can access your project here: {{ project_url }}
+
+If you are a student or collaborator under this project, you are receiving this notice as a courtesy.
+
+If you have any questions please email us at {{ help_email }}
+
+Thank you,
+{{signature}}
\ No newline at end of file
diff --git a/coldfront/components/site/templates/email/project_request_denied.txt b/coldfront/components/site/templates/email/project_request_denied.txt
new file mode 100644
index 0000000000..921123b2a5
--- /dev/null
+++ b/coldfront/components/site/templates/email/project_request_denied.txt
@@ -0,0 +1,8 @@
+Dear {{ center_name }} user,
+
+Your project request for "{{ project_title }}" has been denied. The likely reason is that it was a duplicate.
+If it was not a duplicate or if we have not been in touch with you about this already,
+please contact {{ help_email }} to us to let us know.
+
+Thank you,
+{{ signature }}
\ No newline at end of file
diff --git a/coldfront/components/site/templates/grant/grant_create.html b/coldfront/components/site/templates/grant/grant_create.html
new file mode 100644
index 0000000000..19be8ae19c
--- /dev/null
+++ b/coldfront/components/site/templates/grant/grant_create.html
@@ -0,0 +1,29 @@
+{% extends "common/base.html" %}
+{% load crispy_forms_tags %}
+{% load static %}
+
+
+{% block title %}
+Create Grant
+{% endblock %}
+
+
+
+{% block content %}
+
+
+
+
+
+{% endblock %}
+
diff --git a/coldfront/components/site/templates/grant/grant_delete_grants.html b/coldfront/components/site/templates/grant/grant_delete_grants.html
new file mode 100644
index 0000000000..176d5edf04
--- /dev/null
+++ b/coldfront/components/site/templates/grant/grant_delete_grants.html
@@ -0,0 +1,75 @@
+{% extends "common/base.html" %}
+{% load crispy_forms_tags %}
+{% load static %}
+
+
+{% block title %}
+Delete Grants from Project
+{% endblock %}
+
+
+{% block content %}
+
+ You can add additional users to your project and request a resource allocation as part of the project request.
+ Students should list an IU faculty or staff member as the PI. You can also search for your PI's username and
+ request access to a project they already have.
+ {% if not user.userprofile.title == 'group' %}
+ Request a project »
+ {% endif %}
+
+ You must first have a project to request an allocation. Be sure to review the list of available resources.
+ Users must be added to an allocation in order to gain access to its resource. A project can have multiple storage and
+ compute allocations and each allocation can have its own unique memberships derived from the members of the RT Project.
+
+ RT Projects provides an easy platform to discover and obtain access to high performance computing systems,
+ storage, and other research resources supported by
+ Research Technologies.
+
+
Who can use RT Projects?
+
+ IU faculty, staff, and students are able to create and manage Projects that connect their collaborators and
+ students to the resources they need. Students will need to provide their PI's username when creating a
+ project. Creating a Project is easy - just provide a quick description detailing your research or intended
+ coursework, request the resources you need, and list participants that also need access. Students needing
+ these resources for a class are able to search for their course's Project and view Projects they have been
+ added to.
+
+
+
+ {% include "portal/extra_app_templates.html" %}
+
+
+ RT Projects is designed for labs, groups, and classes. If your group has an existing project then please
+ contact your PI about adding you to that one instead. Limiting projects to groups helps prevent user
+ access fragmentation and simplifies your PI's project management.
+
+ {% if not project.status.name in 'Archived, Denied, Expired, Renewal Denied' and is_allowed_to_update_project %}
+ Update Project Information
+ {% if not project.status.name in 'Waiting For Admin Approval, Review Pending' %}
+ Archive Project
+ {% endif %}
+ {% endif %}
+
+
+
+ {% if not project.status.name in 'Archived, Denied, Expired, Renewal Denied' and is_allowed_to_update_project %}
+ Add Users
+ {% if 'grant' not in project.get_env|get_value_from_dict:'forbidden_features' %}
+ Add Grant
+ {% endif %}
+ {% if 'publication' not in project.get_env|get_value_from_dict:'forbidden_features' %}
+ Add Publication
+ {% endif %}
+ {% if 'research_output' not in project.get_env|get_value_from_dict:'forbidden_features' %}
+ Add Research Output
+ {% endif %}
+ {% if project.needs_review %}
+
+ Renew
+
+ {% endif %}
+ {% else %}
+ {% if not is_allowed_to_update_project %}
+
+
+{% endif %}
+
+{% if 'research_output' not in project.get_env|get_value_from_dict:'forbidden_features' %}
+
+
+
+
Research Outputs
{{ research_outputs.count}}
+
+ {% if not project.status.name in 'Archived, Denied, Expired' and is_allowed_to_update_project %}
+ Add Research Output
+ {% if research_outputs %}
+ Delete Research Outputs
+ {% endif %}
+ {% endif %}
+
+
+
+ {% if research_outputs %}
+
+
+
Research outputs
+
+ {% for research_output in research_outputs %}
+
+
+ This project's PI is no longer eligible to be a PI, possibly due to a change in their IU status.
+ After you submit the renewal we will reach out to you to discuss options (only Staff and Faculty
+ are allowed to be PIs).
+
+{% endif %}
+
+
+
{% settings_value 'CENTER_NAME' %} requires faculty to review their project information annually in order to renew their group's accounts. The information provided by researchers is compiled and used to help make the case to the University for continued investment in {% settings_value 'CENTER_NAME' %}. Up-to-date and accurate information is crucial to our success. Questions? Contact us
+ This is a partial representation of the research supported by RT resources.
+ This list of publications comes from PIs/managers who submitted their publications on
+ RT Projects voluntarily. PIs/managers can add publications to their RT Project by
+ logging into RT Projects > click on your project name > Add Publication.
+
+
+
+
+
+
Last Updated: July 22, 2026
+
+
+{% for k, v in data.items %}
+
+
+ {% for r in v %}
+
+ {% for k in r %}
+ {% if forloop.counter == 1 %}
+ {{k}}
+ {% elif forloop.counter == 2 %}
+ {{k}}
+ {% endif %}
+ {% endfor %}
+
diff --git a/coldfront/core/allocation/tests/test_views.py b/coldfront/core/allocation/tests/test_views.py
index 4180a31d82..6c60218968 100644
--- a/coldfront/core/allocation/tests/test_views.py
+++ b/coldfront/core/allocation/tests/test_views.py
@@ -17,6 +17,7 @@
AllocationAttributeFactory,
AllocationAttributeTypeFactory,
AllocationChangeRequestFactory,
+ AllocationChangeStatusChoiceFactory,
AllocationFactory,
AllocationStatusChoiceFactory,
AllocationUserFactory,
@@ -41,7 +42,7 @@ def setUpTestData(cls):
"""Test Data setup for all allocation view tests."""
AllocationStatusChoiceFactory(name="New")
cls.project = ProjectFactory(status=ProjectStatusChoiceFactory(name="Active"))
- cls.allocation = AllocationFactory(project=cls.project)
+ cls.allocation = AllocationFactory(project=cls.project, end_date=cls.project.end_date)
cls.allocation.resources.add(ResourceFactory(name="holylfs07/tier1"))
# create allocation user that belongs to project
allocation_user = AllocationUserFactory(allocation=cls.allocation)
@@ -134,6 +135,7 @@ class AllocationChangeDetailViewTest(AllocationViewBaseTest):
def setUp(self):
"""create an AllocationChangeRequest to test"""
self.client.force_login(self.admin_user, backend=BACKEND)
+ AllocationChangeStatusChoiceFactory(name="Denied")
AllocationChangeRequestFactory(id=2, allocation=self.allocation)
def test_allocationchangedetailview_access(self):
@@ -165,7 +167,7 @@ def setUp(self):
"attributeform-TOTAL_FORMS": "1",
"end_date_extension": 0,
}
- self.url = "/allocation/1/change-request"
+ self.url = f"/allocation/{self.allocation.pk}/change-request"
def test_allocationchangeview_access(self):
"""Test get request"""
@@ -173,22 +175,22 @@ def test_allocationchangeview_access(self):
utils.test_user_can_access(self, self.pi_user, self.url) # Manager can access
utils.test_user_cannot_access(self, self.allocation_user, self.url) # user can't access
- def test_allocationchangeview_post_extension(self):
- """Test post request to extend end date"""
+ # def test_allocationchangeview_post_extension(self):
+ # """Test post request to extend end date"""
- self.post_data["end_date_extension"] = 90
- self.assertEqual(len(AllocationChangeRequest.objects.all()), 0)
- response = self.client.post("/allocation/1/change-request", data=self.post_data, follow=True)
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, "Allocation change request successfully submitted.")
- self.assertEqual(len(AllocationChangeRequest.objects.all()), 1)
+ # self.post_data["end_date_extension"] = 90
+ # self.assertEqual(len(AllocationChangeRequest.objects.all()), 0)
+ # response = self.client.post(self.url, data=self.post_data, follow=True)
+ # self.assertEqual(response.status_code, 200)
+ # self.assertContains(response, "Allocation change request successfully submitted.")
+ # self.assertEqual(len(AllocationChangeRequest.objects.all()), 1)
def test_allocationchangeview_post_no_change(self):
"""Post request with no change should not go through"""
self.assertEqual(len(AllocationChangeRequest.objects.all()), 0)
- response = self.client.post("/allocation/1/change-request", data=self.post_data, follow=True)
+ response = self.client.post(self.url, data=self.post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "You must request a change")
self.assertEqual(len(AllocationChangeRequest.objects.all()), 0)
diff --git a/coldfront/core/allocation/urls.py b/coldfront/core/allocation/urls.py
index ac269dd413..09197742a1 100644
--- a/coldfront/core/allocation/urls.py
+++ b/coldfront/core/allocation/urls.py
@@ -45,6 +45,11 @@
path(
"/allocationnote/add", allocation_views.AllocationNoteCreateView.as_view(), name="allocation-note-add"
),
+ path(
+ "/allocationnote//update",
+ allocation_views.AllocationNoteUpdateView.as_view(),
+ name="allocation-note-update",
+ ),
path(
"allocation-invoice-list", allocation_views.AllocationInvoiceListView.as_view(), name="allocation-invoice-list"
),
@@ -70,6 +75,11 @@
path(
"allocation-account-list/", allocation_views.AllocationAccountListView.as_view(), name="allocation-account-list"
),
+ path(
+ "/user-detail/",
+ allocation_views.AllocationUserDetailView.as_view(),
+ name="allocation-user-detail",
+ ),
]
if ALLOCATION_EULA_ENABLE:
diff --git a/coldfront/core/allocation/utils.py b/coldfront/core/allocation/utils.py
index d091d0aad4..66b013d44b 100644
--- a/coldfront/core/allocation/utils.py
+++ b/coldfront/core/allocation/utils.py
@@ -3,9 +3,27 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
from django.db.models import Q
+from django.forms.models import model_to_dict
+from django.urls import reverse
-from coldfront.core.allocation.models import AllocationUser, AllocationUserStatusChoice
+from coldfront.core.allocation.models import (
+ AllocationAdminAction,
+ AllocationUser,
+ AllocationUserRoleChoice,
+ AllocationUserStatusChoice,
+)
from coldfront.core.resource.models import Resource
+from coldfront.core.utils.common import get_domain_url, import_from_settings
+from coldfront.core.utils.mail import send_email_template
+
+EMAIL_ENABLED = import_from_settings("EMAIL_ENABLED", False)
+if EMAIL_ENABLED:
+ EMAIL_SENDER = import_from_settings("EMAIL_SENDER")
+ EMAIL_TICKET_SYSTEM_ADDRESS = import_from_settings("EMAIL_TICKET_SYSTEM_ADDRESS")
+ EMAIL_OPT_OUT_INSTRUCTION_URL = import_from_settings("EMAIL_OPT_OUT_INSTRUCTION_URL")
+ EMAIL_SIGNATURE = import_from_settings("EMAIL_SIGNATURE")
+ EMAIL_CENTER_NAME = import_from_settings("CENTER_NAME")
+ EMAIL_RESOURCE_EMAIL_TEMPLATES = import_from_settings("EMAIL_RESOURCE_EMAIL_TEMPLATES", {})
def set_allocation_user_status_to_error(allocation_user_pk):
@@ -66,3 +84,166 @@ def get_user_resources(user_obj):
def test_allocation_function(allocation_pk):
print("test_allocation_function", allocation_pk)
+
+
+def send_added_user_email(request, allocation_obj, users, users_emails):
+ if EMAIL_ENABLED:
+ domain_url = get_domain_url(request)
+ allocation_url = "{}{}".format(domain_url, reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
+ project_obj = allocation_obj.project
+ project_url = "{}{}".format(domain_url, reverse("project-detail", kwargs={"pk": project_obj.pk}))
+ template_context = {
+ "center_name": EMAIL_CENTER_NAME,
+ "resource": allocation_obj.get_parent_resource.name,
+ "users": users,
+ "project_title": project_obj.title,
+ "allocation_url": allocation_url,
+ "project_url": project_url,
+ "action_user": f"{request.user.first_name} {request.user.last_name}",
+ "project_pi": f"{project_obj.pi.first_name} {project_obj.pi.last_name}",
+ "signature": EMAIL_SIGNATURE,
+ "allocation_identifiers": allocation_obj.get_identifiers().items(),
+ "allocation_status": allocation_obj.status.name,
+ }
+
+ send_email_template(
+ "Added to Allocation",
+ EMAIL_RESOURCE_EMAIL_TEMPLATES.get(allocation_obj.get_parent_resource.name, {}).get(
+ "added_user", "email/allocation_added_users.txt"
+ ),
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ users_emails,
+ )
+
+
+def send_removed_user_email(request, allocation_obj, users, users_emails):
+ domain_url = get_domain_url(request)
+ project_obj = allocation_obj.project
+ project_url = "{}{}".format(domain_url, reverse("project-detail", kwargs={"pk": project_obj.pk}))
+ if EMAIL_ENABLED:
+ template_context = {
+ "center_name": EMAIL_CENTER_NAME,
+ "resource": allocation_obj.get_parent_resource.name,
+ "users": users,
+ "project_title": project_obj.title,
+ "project_url": project_url,
+ "action_user": f"{request.user.first_name} {request.user.last_name}",
+ "project_pi": f"{project_obj.pi.first_name} {project_obj.pi.last_name}",
+ "signature": EMAIL_SIGNATURE,
+ "allocation_identifiers": allocation_obj.get_identifiers().items(),
+ }
+
+ send_email_template(
+ "Removed From Allocation",
+ EMAIL_RESOURCE_EMAIL_TEMPLATES.get(allocation_obj.get_parent_resource.name, {}).get(
+ "removed_user", "email/allocation_removed_users.txt"
+ ),
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ users_emails,
+ )
+
+
+def create_admin_action(user, fields_to_check, allocation, base_model=None):
+ if base_model is None:
+ base_model = allocation
+ base_model_dict = model_to_dict(base_model)
+
+ for key, value in fields_to_check.items():
+ base_model_value = base_model_dict.get(key)
+ if type(value) is not type(base_model_value):
+ if key == "status":
+ status_class = base_model._meta.get_field("status").remote_field.model
+ base_model_value = status_class.objects.get(pk=base_model_value).name
+ value = value.name
+ if key == "project":
+ project_class = base_model._meta.get_field("project").remote_field.model
+ base_model_value = project_class.objects.get(pk=base_model_value).pk
+ value = value.pk
+ if value != base_model_value:
+ AllocationAdminAction.objects.create(
+ user=user,
+ allocation=allocation,
+ action=f'For "{base_model}" changed "{key}" from "{base_model_value}" to "{value}"',
+ )
+
+
+def create_admin_action_for_deletion(user, deleted_obj, allocation, base_model=None):
+ if base_model:
+ AllocationAdminAction.objects.create(
+ user=user, allocation=allocation, action=f'Deleted "{deleted_obj}" from "{base_model}"'
+ )
+ else:
+ AllocationAdminAction.objects.create(user=user, allocation=allocation, action=f'Deleted "{deleted_obj}"')
+
+
+def create_admin_action_for_creation(user, created_obj, allocation, base_model=None):
+ if base_model:
+ AllocationAdminAction.objects.create(
+ user=user,
+ allocation=allocation,
+ action=f'Created "{created_obj}" in "{base_model}" in "{allocation}" with value "{created_obj.value}"',
+ )
+ else:
+ AllocationAdminAction.objects.create(
+ user=user,
+ allocation=allocation,
+ action=f'Created "{created_obj}" in "{allocation}" with value "{created_obj.value}"',
+ )
+
+
+def create_admin_action_for_allocation_creation(user, allocation):
+ AllocationAdminAction.objects.create(
+ user=user,
+ allocation=allocation,
+ action=f'Created a {allocation.get_parent_resource.name} allocation with status "{allocation.status.name}"',
+ )
+
+
+def get_allocation_user_emails(allocation_obj, only_project_managers=False):
+ """
+ Returns a list of allocation user emails in the given allocation. Only emails from users with
+ their notifications enabled will be returned.
+
+ :param allocation_obj: The allocation to grab the allocation user emails from
+ :param only_project_managers: Indicates if only the project manager emails should be returned
+ """
+ allocation_users = allocation_obj.allocationuser_set.filter(
+ status__name__in=[
+ "Active",
+ ]
+ ).values_list("user", flat=True)
+ allocation_users = allocation_obj.project.projectuser_set.filter(
+ enable_notifications=True, user__in=list(allocation_users)
+ )
+ if only_project_managers:
+ allocation_users = allocation_users.filter(role__name="Manager")
+ allocation_users = allocation_users.values_list("user__email", flat=True)
+
+ return list(allocation_users)
+
+
+def check_if_roles_are_enabled(allocation_obj):
+ return allocation_obj.get_parent_resource.requires_user_roles
+
+
+def get_default_allocation_user_role(resource, project_obj, user):
+ project_managers = project_obj.projectuser_set.filter(role__name="Manager").values_list("user__username", flat=True)
+ is_manager = user.username in project_managers
+ if resource.requires_user_roles:
+ if is_manager:
+ return AllocationUserRoleChoice.objects.filter(resources=resource, is_manager_default=True).first()
+ else:
+ return AllocationUserRoleChoice.objects.filter(resources=resource, is_user_default=True).first()
+
+ return AllocationUserRoleChoice.objects.none()
+
+
+def set_default_allocation_user_role(resource, allocation_user):
+ role_choice_queryset = get_default_allocation_user_role(
+ resource, allocation_user.allocation.project, allocation_user.user
+ )
+ if role_choice_queryset:
+ allocation_user.role = role_choice_queryset
+ allocation_user.save()
diff --git a/coldfront/core/allocation/views.py b/coldfront/core/allocation/views.py
index 841858292c..98f95a6ac5 100644
--- a/coldfront/core/allocation/views.py
+++ b/coldfront/core/allocation/views.py
@@ -8,9 +8,11 @@
from dateutil.relativedelta import relativedelta
from django import forms
+from django.conf import settings
from django.contrib import messages
from django.contrib.auth import get_user_model
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
+from django.contrib.messages.views import SuccessMessageMixin
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
from django.db.models.query import QuerySet
@@ -27,6 +29,7 @@
from coldfront.core.allocation.forms import (
AllocationAccountForm,
AllocationAddUserForm,
+ AllocationAddUserFormset,
AllocationAttributeChangeForm,
AllocationAttributeCreateForm,
AllocationAttributeDeleteForm,
@@ -41,6 +44,7 @@
AllocationReviewUserForm,
AllocationSearchForm,
AllocationUpdateForm,
+ AllocationUserUpdateForm,
)
from coldfront.core.allocation.models import (
Allocation,
@@ -62,14 +66,31 @@
allocation_attribute_changed,
allocation_change_approved,
allocation_change_created,
+ allocation_change_user_role,
allocation_disable,
allocation_new,
allocation_remove_user,
+ visit_allocation_detail,
+)
+from coldfront.core.allocation.utils import (
+ check_if_roles_are_enabled,
+ create_admin_action,
+ create_admin_action_for_creation,
+ create_admin_action_for_deletion,
+ generate_guauge_data_from_usage,
+ get_user_resources,
+ send_added_user_email,
+ send_removed_user_email,
+)
+from coldfront.core.project.models import (
+ Project,
+ ProjectPermission,
+ ProjectUser,
+ ProjectUserStatusChoice,
)
-from coldfront.core.allocation.utils import generate_guauge_data_from_usage, get_user_resources
-from coldfront.core.project.models import Project, ProjectPermission, ProjectUser, ProjectUserStatusChoice
from coldfront.core.resource.models import Resource
from coldfront.core.utils.common import get_domain_url, import_from_settings
+from coldfront.core.utils.groups import check_if_groups_in_review_groups
from coldfront.core.utils.mail import (
build_link,
send_allocation_admin_email,
@@ -83,6 +104,12 @@
ALLOCATION_ENABLE_CHANGE_REQUESTS_BY_DEFAULT = import_from_settings(
"ALLOCATION_ENABLE_CHANGE_REQUESTS_BY_DEFAULT", True
)
+ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING = import_from_settings("ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING", 30)
+ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING = import_from_settings("ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING", 60)
+ALLOCATION_ATTRIBUTE_IDENTIFIERS = import_from_settings("ALLOCATION_ATTRIBUTE_IDENTIFIERS", [])
+
+EMAIL_TICKET_SYSTEM_ADDRESS = import_from_settings("EMAIL_TICKET_SYSTEM_ADDRESS", "")
+EMAIL_RESOURCE_EMAIL_TEMPLATES = import_from_settings("EMAIL_RESOURCE_EMAIL_TEMPLATES", {})
PROJECT_ENABLE_PROJECT_REVIEW = import_from_settings("PROJECT_ENABLE_PROJECT_REVIEW", False)
INVOICE_ENABLED = import_from_settings("INVOICE_ENABLED", False)
@@ -99,6 +126,10 @@
)
EMAIL_ALLOCATION_EULA_INCLUDE_ACCEPTED_EULA = import_from_settings("EMAIL_ALLOCATION_EULA_INCLUDE_ACCEPTED_EULA", False)
+SLACK_MESSAGING_ENABLED = import_from_settings("SLACK_MESSAGING_ENABLED", False)
+
+ALLOCATION_REMOVAL_REQUESTS_ALLOWED = import_from_settings("ALLOCATION_REMOVAL_REQUESTS_ALLOWED", [""])
+
logger = logging.getLogger(__name__)
@@ -120,6 +151,7 @@ def test_func(self):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
pk = self.kwargs.get("pk")
+ visit_allocation_detail.send(sender=self.__class__, allocation_pk=pk)
allocation_obj = get_object_or_404(Allocation, pk=pk)
allocation_users = allocation_obj.allocationuser_set.exclude(
status__name__in=[
@@ -143,7 +175,7 @@ def get_context_data(self, **kwargs):
context["res_obj"] = allocation_obj.get_parent_resource
# set visible usage attributes
- alloc_attr_set = allocation_obj.get_attribute_set(self.request.user)
+ alloc_attr_set = allocation_obj.get_attribute_set(self.request.user, "view_allocationattribute")
attributes_with_usage = [a for a in alloc_attr_set if hasattr(a, "allocationattributeusage")]
attributes = alloc_attr_set
@@ -174,17 +206,46 @@ def get_context_data(self, **kwargs):
context["attributes_with_usage"] = attributes_with_usage
context["attributes"] = attributes
context["allocation_changes"] = allocation_changes
+ context["allocation_changes_enabled"] = allocation_obj.is_changeable
# Can the user update the project?
context["is_allowed_to_update_project"] = allocation_obj.project.has_perm(
- self.request.user, ProjectPermission.UPDATE
+ self.request.user, ProjectPermission.UPDATE, "change_project"
)
+ context["allocation_user_roles_enabled"] = check_if_roles_are_enabled(allocation_obj)
noteset = allocation_obj.allocationusernote_set
- notes = noteset.all() if self.request.user.is_superuser else noteset.filter(is_private=False)
+ if self.request.user.is_superuser or self.request.user.has_perm("allocation.view_allocationusernote"):
+ notes = noteset.all()
+ else:
+ notes = noteset.filter(is_private=False)
- context["notes"] = notes
+ context["user_has_permissions"] = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(), self.request.user.groups.all(), "change_allocation"
+ )
+
+ if self.request.user.is_superuser:
+ context["user_has_permissions"] = True
+
+ context["user_exists_in_allocation"] = allocation_obj.allocationuser_set.filter(
+ user=self.request.user,
+ status__name__in=["Active", "Invited", "Pending", "Disabled", "Retired"],
+ ).exists()
+
+ context["can_move_allocation"] = False
+ if "coldfront.plugins.movable_allocations" in settings.INSTALLED_APPS:
+ context["can_move_allocation"] = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "can_move_allocations",
+ )
+
+ context["project"] = allocation_obj.project
+ context["notes"] = notes.order_by("-created")
context["ALLOCATION_ENABLE_ALLOCATION_RENEWAL"] = ALLOCATION_ENABLE_ALLOCATION_RENEWAL
+ context["ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING"] = ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING
+ context["ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING"] = ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING
+ context["ALLOCATION_REMOVAL_REQUESTS_ALLOWED"] = ALLOCATION_REMOVAL_REQUESTS_ALLOWED
return context
def get(self, request, *args, **kwargs):
@@ -201,7 +262,11 @@ def get(self, request, *args, **kwargs):
}
form = AllocationUpdateForm(initial=initial_data)
- if not self.request.user.is_superuser:
+ user_has_permissions = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(), self.request.user.groups.all(), "change_allocation"
+ )
+
+ if not self.request.user.is_superuser and not user_has_permissions:
form.fields["is_locked"].disabled = True
form.fields["is_changeable"].disabled = True
@@ -213,13 +278,15 @@ def get(self, request, *args, **kwargs):
def post(self, request, *args, **kwargs):
pk = self.kwargs.get("pk")
allocation_obj = get_object_or_404(Allocation, pk=pk)
- allocation_users = allocation_obj.allocationuser_set.exclude(status__name__in=["Removed"]).order_by(
- "user__username"
- )
-
- if not self.request.user.is_superuser:
- messages.success(request, "You do not have permission to update the allocation")
- return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": pk}))
+ if not request.user.is_superuser:
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "change_allocation",
+ )
+ if not group_exists:
+ messages.error(request, "You do not have permission to update this allocation")
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": pk}))
initial_data = {
"status": allocation_obj.status,
@@ -242,10 +309,10 @@ def post(self, request, *args, **kwargs):
return HttpResponseBadRequest("Invalid request")
form_data = form.cleaned_data
-
old_status = allocation_obj.status.name
if action in ["update", "approve", "deny"]:
+ create_admin_action(request.user, form_data, allocation_obj)
allocation_obj.end_date = form_data.get("end_date")
allocation_obj.start_date = form_data.get("start_date")
allocation_obj.description = form_data.get("description")
@@ -254,17 +321,24 @@ def post(self, request, *args, **kwargs):
allocation_obj.status = form_data.get("status")
if "approve" in action:
- allocation_obj.status = AllocationStatusChoice.objects.get(name="Active")
+ active_status = AllocationStatusChoice.objects.get(name="Active")
+ create_admin_action(request.user, {"status": active_status}, allocation_obj)
+ allocation_obj.status = active_status
elif action == "deny":
- allocation_obj.status = AllocationStatusChoice.objects.get(name="Denied")
+ deny_status = AllocationStatusChoice.objects.get(name="Denied")
+ create_admin_action(request.user, {"status": deny_status}, allocation_obj)
+ allocation_obj.status = deny_status
if old_status != "Active" == allocation_obj.status.name:
+ if allocation_obj.project.status.name != "Active":
+ messages.error(
+ request, "Project must be approved first before you can update this allocation's status!"
+ )
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": pk}))
if not allocation_obj.start_date:
allocation_obj.start_date = datetime.datetime.now()
if "approve" in action or not allocation_obj.end_date:
- allocation_obj.end_date = datetime.datetime.now() + relativedelta(
- days=ALLOCATION_DEFAULT_ALLOCATION_LENGTH
- )
+ allocation_obj.end_date = allocation_obj.project.end_date
allocation_obj.save()
@@ -275,27 +349,39 @@ def post(self, request, *args, **kwargs):
for allocation_user in allocation_users:
allocation_activate_user.send(sender=self.__class__, allocation_user_pk=allocation_user.pk)
+ addtl_context = {"help_url": EMAIL_TICKET_SYSTEM_ADDRESS}
+ email_template = (
+ EMAIL_RESOURCE_EMAIL_TEMPLATES.get(allocation_obj.get_parent_resource.name, {}).get(
+ "allocation_activated", "email/allocation_activated.txt"
+ ),
+ )
send_allocation_customer_email(
+ request,
allocation_obj,
"Allocation Activated",
- "email/allocation_activated.txt",
+ email_template,
domain_url=get_domain_url(self.request),
+ addtl_context=addtl_context,
)
if action != "auto-approve":
messages.success(request, "Allocation Activated!")
+ logger.info(
+ f"Admin {request.user.username} approved a {allocation_obj.get_parent_resource.name} "
+ f"allocation (allocation pk={allocation_obj.pk})"
+ )
- elif old_status != allocation_obj.status.name in ["Denied", "New", "Revoked"]:
- allocation_obj.start_date = None
- allocation_obj.end_date = None
+ elif old_status != allocation_obj.status.name in ["Denied", "New", "Revoked", "Removed"]:
+ allocation_obj.end_date = datetime.datetime.now() if allocation_obj.status.name != "New" else None
allocation_obj.save()
- if allocation_obj.status.name in ["Denied", "Revoked"]:
+ if allocation_obj.status.name in ["Denied", "Revoked", "Removed"]:
allocation_disable.send(sender=self.__class__, allocation_pk=allocation_obj.pk)
allocation_users = allocation_obj.allocationuser_set.exclude(status__name__in=["Removed", "Error"])
for allocation_user in allocation_users:
allocation_remove_user.send(sender=self.__class__, allocation_user_pk=allocation_user.pk)
if allocation_obj.status.name == "Denied":
send_allocation_customer_email(
+ request,
allocation_obj,
"Allocation Denied",
"email/allocation_denied.txt",
@@ -304,14 +390,35 @@ def post(self, request, *args, **kwargs):
messages.success(request, "Allocation Denied!")
elif allocation_obj.status.name == "Revoked":
send_allocation_customer_email(
+ request,
allocation_obj,
"Allocation Revoked",
"email/allocation_revoked.txt",
domain_url=get_domain_url(self.request),
)
messages.success(request, "Allocation Revoked!")
+ elif allocation_obj.status.name == "Removed":
+ if "coldfront.plugins.allocation_removal_requests" in settings.INSTALLED_APPS:
+ from coldfront.plugins.allocation_removal_requests.signals import (
+ allocation_remove,
+ )
+
+ allocation_remove.send(sender=self.__class__, allocation_pk=allocation_obj.pk)
+ send_allocation_customer_email(
+ request,
+ allocation_obj,
+ "Allocation Removed",
+ "allocation_removal_requests/allocation_removed.txt",
+ domain_url=get_domain_url(self.request),
+ )
+ messages.success(request, "Allocation Removed!")
else:
messages.success(request, "Allocation updated!")
+ logger.info(
+ f"Admin {request.user.username} changed the status of a "
+ f"{allocation_obj.get_parent_resource.name} allocation to "
+ f"{allocation_obj.status.name} (allocation pk={allocation_obj.pk})"
+ )
else:
messages.success(request, "Allocation updated!")
allocation_obj.save()
@@ -450,9 +557,7 @@ def get_queryset(self):
if allocation_search_form.is_valid():
data = allocation_search_form.cleaned_data
- if data.get("show_all_allocations") and (
- self.request.user.is_superuser or self.request.user.has_perm("allocation.can_view_all_allocations")
- ):
+ if data.get("show_all_allocations") and self.request.user.is_superuser:
allocations = (
Allocation.objects.prefetch_related(
"project",
@@ -462,6 +567,16 @@ def get_queryset(self):
.all()
.order_by(order_by)
)
+ elif data.get("show_all_allocations") and self.request.user.has_perm("allocation.can_view_all_allocations"):
+ allocations = (
+ Allocation.objects.prefetch_related(
+ "project",
+ "project__pi",
+ "status",
+ )
+ .filter(resources__review_groups__in=list(self.request.user.groups.all()))
+ .order_by(order_by)
+ )
else:
allocations = (
Allocation.objects.prefetch_related(
@@ -470,13 +585,27 @@ def get_queryset(self):
"status",
)
.filter(
- Q(project__status__name__in=["New", "Active"])
- & Q(project__projectuser__status__name__in=["Active"])
+ Q(
+ project__status__name__in=[
+ "New",
+ "Active",
+ ]
+ )
+ & Q(project__projectuser__status__name="Active")
& Q(project__projectuser__user=self.request.user)
& (
Q(project__projectuser__role__name="Manager")
| Q(allocationuser__user=self.request.user)
- & Q(allocationuser__status__name__in=["Active", "PendingEULA"])
+ & Q(
+ allocationuser__status__name__in=[
+ "Active",
+ "Invited",
+ "Pending",
+ "Disabled",
+ "Retired",
+ "PendingEULA",
+ ]
+ )
)
)
.distinct()
@@ -492,7 +621,16 @@ def get_queryset(self):
allocations = allocations.filter(
Q(project__pi__username__icontains=data.get("username"))
| Q(allocationuser__user__username__icontains=data.get("username"))
- & Q(allocationuser__status__name__in=["PendingEULA", "Active"])
+ & Q(
+ allocationuser__status__name__in=[
+ "PendingEULA",
+ "Active",
+ "Invited",
+ "Pending",
+ "Disabled",
+ "Retired",
+ ]
+ )
)
# Resource Type
@@ -536,7 +674,16 @@ def get_queryset(self):
)
.filter(
Q(allocationuser__user=self.request.user)
- & Q(allocationuser__status__name__in=["PendingEULA", "Active"])
+ & Q(
+ allocationuser__status__name__in=[
+ "PendingEULA",
+ "Active",
+ "Invited",
+ "Pending",
+ "Disabled",
+ "Retired",
+ ]
+ )
)
.order_by(order_by)
)
@@ -615,11 +762,17 @@ def dispatch(self, request, *args, **kwargs):
)
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Review Pending",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot request a new allocation to an archived project.")
+ messages.error(
+ request,
+ 'You cannot request a new allocation for a project with status "{}".'.format(project_obj.status.name),
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
return super().dispatch(request, *args, **kwargs)
@@ -768,7 +921,7 @@ class AllocationAddUsersView(LoginRequiredMixin, UserPassesTestMixin, TemplateVi
def test_func(self):
"""UserPassesTestMixin Tests"""
allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
- if allocation_obj.has_perm(self.request.user, AllocationPermission.MANAGER):
+ if allocation_obj.has_perm(self.request.user, AllocationPermission.MANAGER, "add_allocationuser"):
return True
messages.error(self.request, "You do not have permission to add users to the allocation.")
@@ -789,6 +942,8 @@ def dispatch(self, request, *args, **kwargs):
"Paid",
]:
message = f"You cannot add users to an allocation with status {allocation_obj.status.name}."
+ elif allocation_obj.get_parent_resource.name == "Geode-Project":
+ message = "You cannot add users to a Geode-Project allocation."
if message:
messages.error(request, message)
return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
@@ -807,21 +962,50 @@ def get_users_to_add(self, allocation_obj):
)
missing_users = list(set(active_users_in_project) - set(users_already_in_allocation))
- missing_users = (
- get_user_model().objects.filter(username__in=missing_users).exclude(pk=allocation_obj.project.pi.pk)
+ missing_users = get_user_model().objects.filter(username__in=missing_users)
+
+ users_to_add = []
+ for user in missing_users:
+ users_to_add.append(
+ {
+ "username": user.username,
+ "first_name": user.first_name,
+ "last_name": user.last_name,
+ "email": user.email,
+ "role": None,
+ }
+ )
+
+ return users_to_add
+
+ def get_dict_of_users_to_add(self, formset):
+ users = {}
+ for form in formset:
+ user_form_data = form.cleaned_data
+ if user_form_data["selected"]:
+ users[user_form_data.get("username")] = user_form_data.get("role")
+
+ return users
+
+ def get_total_users_in_allocation_if_added(self, allocation_obj, selected_users):
+ total_users = len(
+ list(
+ allocation_obj.allocationuser_set.exclude(status__name__in=["Removed"]).values_list(
+ "user__username", flat=True
+ )
+ )
)
+ total_users += len(selected_users)
- users_to_add = [
- {
- "username": user.username,
- "first_name": user.first_name,
- "last_name": user.last_name,
- "email": user.email,
- }
- for user in missing_users
- ]
+ return total_users
- return users_to_add
+ def get_disable_select_list(self, allocation_obj, usernames):
+ disable_select_list = [False] * len(usernames)
+ user_account_statuses = allocation_obj.get_parent_resource.get_user_account_statuses(usernames)
+ for i, result in enumerate(user_account_statuses.values()):
+ if not result.get("exists"):
+ disable_select_list[i] = True
+ return disable_select_list
def get(self, request, *args, **kwargs):
pk = self.kwargs.get("pk")
@@ -830,13 +1014,31 @@ def get(self, request, *args, **kwargs):
users_to_add = self.get_users_to_add(allocation_obj)
context = {}
+ user_account_statuses = {}
if users_to_add:
- formset = formset_factory(AllocationAddUserForm, max_num=len(users_to_add))
- formset = formset(initial=users_to_add, prefix="userform")
+ formset = formset_factory(
+ AllocationAddUserForm, max_num=len(users_to_add), formset=AllocationAddUserFormset
+ )
+ resource = allocation_obj.get_parent_resource
+ user_account_statuses = resource.get_user_account_statuses([user.get("username") for user in users_to_add])
+ formset = formset(
+ initial=users_to_add,
+ prefix="userform",
+ form_kwargs={
+ "resource": resource,
+ "disable_selected": [not result.get("exists") for result in user_account_statuses.values()],
+ },
+ )
context["formset"] = formset
+ context["allocation_user_roles_enabled"] = check_if_roles_are_enabled(allocation_obj)
context["allocation"] = allocation_obj
+ account_results = {}
+ for username, result in user_account_statuses.items():
+ account_results[username] = result.get("reason")
+ context["account_results"] = account_results
+
user_resources = get_user_resources(self.request.user)
resources_with_eula = {}
for res in user_resources:
@@ -851,6 +1053,10 @@ def get(self, request, *args, **kwargs):
string_accumulator += f"{res}: {value}\n"
context["compiled_eula"] = str(string_accumulator)
+ context["allocation_users"] = allocation_obj.allocationuser_set.filter(
+ status__name__in=["Active", "Invited", "Disabled", "Retired"]
+ ).select_related("user")
+
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
@@ -858,74 +1064,166 @@ def post(self, request, *args, **kwargs):
allocation_obj = get_object_or_404(Allocation, pk=pk)
users_to_add = self.get_users_to_add(allocation_obj)
+ resource = allocation_obj.get_parent_resource
+ allocation_user_limit = resource.get_attribute("user_limit")
formset = formset_factory(AllocationAddUserForm, max_num=len(users_to_add))
- formset = formset(request.POST, initial=users_to_add, prefix="userform")
-
- users_added_count = 0
+ formset = formset(
+ request.POST,
+ initial=users_to_add,
+ prefix="userform",
+ form_kwargs={"resource": resource},
+ )
if formset.is_valid():
allocation_user_active_status_choice = AllocationUserStatusChoice.objects.get(name="Active")
if ALLOCATION_EULA_ENABLE:
allocation_user_pending_status_choice = AllocationUserStatusChoice.objects.get(name="PendingEULA")
+ selected_users = self.get_dict_of_users_to_add(formset)
- for form in formset:
- user_form_data = form.cleaned_data
- if user_form_data["selected"]:
- users_added_count += 1
+ user_account_statuses = resource.get_user_account_statuses(
+ [selected_user for selected_user in selected_users.keys()]
+ )
- user_obj = get_user_model().objects.get(username=user_form_data.get("username"))
+ missing_accounts = []
+ missing_resource_accounts = []
+ for username, result in user_account_statuses.items():
+ if not result.get("exists"):
+ if result.get("reason") == "no_account":
+ missing_accounts.append(username)
+ elif result.get("reason") == "no_resource_account":
+ missing_resource_accounts.append(username)
+ selected_users.pop(username)
+
+ if missing_accounts:
+ message = "The following user does not have an IU account and was not added:"
+ if len(missing_accounts) > 1:
+ message = "The following users do not have IU accounts and were not added:"
+ messages.warning(request, f"{message} {', '.join(missing_accounts)}")
+ logger.info(
+ f"User(s) {', '.join(missing_accounts)} do not have IU accounts and "
+ f"were not added to a {resource.name} "
+ f"allocation (allocation pk={allocation_obj.pk})"
+ )
- if allocation_obj.allocationuser_set.filter(user=user_obj).exists():
- allocation_user_obj = allocation_obj.allocationuser_set.get(user=user_obj)
- if ALLOCATION_EULA_ENABLE and not user_obj.userprofile.is_pi and allocation_obj.get_eula():
- allocation_user_obj.status = allocation_user_pending_status_choice
- send_email_template(
- f"Agree to EULA for {allocation_obj.get_parent_resource.__str__()}",
- "email/allocation_agree_to_eula.txt",
- {
- "resource": allocation_obj.get_parent_resource,
- "url": build_link(
- reverse("allocation-review-eula", kwargs={"pk": allocation_obj.pk}),
- domain_url=get_domain_url(self.request),
- ),
- },
- self.request.user.email,
- [user_obj],
- )
- else:
- allocation_user_obj.status = allocation_user_active_status_choice
- allocation_user_obj.save()
+ if missing_resource_accounts:
+ message = "The following user does not have an account on this resource and was not added:"
+ if len(missing_resource_accounts) > 1:
+ message = "The following users do not have an account on this resource and were not added:"
+ accounts_url = "https://access.iu.edu/Accounts/Create"
+ messages.warning(
+ request,
+ format_html(
+ f"{message} {', '.join(missing_resource_accounts)}. Please direct them "
+ f'to {accounts_url} to create one.'
+ ),
+ )
+
+ logger.info(
+ f"User(s) {', '.join(missing_resource_accounts)} were missing accounts for a "
+ f"{resource.name} allocation (allocation pk={allocation_obj.pk})"
+ )
+
+ if allocation_user_limit:
+ total_users = self.get_total_users_in_allocation_if_added(
+ allocation_obj, [selected_user for selected_user in selected_users.keys()]
+ )
+ if total_users > int(allocation_user_limit):
+ messages.warning(
+ request,
+ f"Only {allocation_user_limit} users are allowed on this resource. Users "
+ f"were not added. (Total users counted: {total_users})",
+ )
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": pk}))
+
+ selected_user_objs = []
+ for username, role in selected_users.items():
+ user_obj = get_user_model().objects.get(username=username)
+ selected_user_objs.append(user_obj)
+
+ if allocation_obj.allocationuser_set.filter(user=user_obj).exists():
+ allocation_user_obj = allocation_obj.allocationuser_set.get(user=user_obj)
+ if ALLOCATION_EULA_ENABLE and not user_obj.userprofile.is_pi and allocation_obj.get_eula():
+ allocation_user_obj.status = allocation_user_pending_status_choice
+ send_email_template(
+ f"Agree to EULA for {resource.__str__()}",
+ "email/allocation_agree_to_eula.txt",
+ {
+ "resource": resource,
+ "url": build_link(
+ reverse("allocation-review-eula", kwargs={"pk": allocation_obj.pk}),
+ domain_url=get_domain_url(self.request),
+ ),
+ },
+ self.request.user.email,
+ [user_obj],
+ )
else:
- if ALLOCATION_EULA_ENABLE and not user_obj.userprofile.is_pi and allocation_obj.get_eula():
- allocation_user_obj = AllocationUser.objects.create(
- allocation=allocation_obj, user=user_obj, status=allocation_user_pending_status_choice
- )
- send_email_template(
- f"Agree to EULA for {allocation_obj.get_parent_resource.__str__()}",
- "email/allocation_agree_to_eula.txt",
- {
- "resource": allocation_obj.get_parent_resource,
- "url": build_link(
- reverse("allocation-review-eula", kwargs={"pk": allocation_obj.pk}),
- domain_url=get_domain_url(self.request),
- ),
- },
- self.request.user.email,
- [user_obj],
- )
- else:
- allocation_user_obj = AllocationUser.objects.create(
- allocation=allocation_obj, user=user_obj, status=allocation_user_active_status_choice
- )
+ allocation_user_obj.status = allocation_user_active_status_choice
+ allocation_user_obj.role = role
+ allocation_user_obj.save()
+ else:
+ if ALLOCATION_EULA_ENABLE and not user_obj.userprofile.is_pi and allocation_obj.get_eula():
+ allocation_user_obj = AllocationUser.objects.create(
+ allocation=allocation_obj,
+ user=user_obj,
+ status=allocation_user_pending_status_choice,
+ role=role,
+ )
+ send_email_template(
+ f"Agree to EULA for {resource.__str__()}",
+ "email/allocation_agree_to_eula.txt",
+ {
+ "resource": resource,
+ "url": build_link(
+ reverse("allocation-review-eula", kwargs={"pk": allocation_obj.pk}),
+ domain_url=get_domain_url(self.request),
+ ),
+ },
+ self.request.user.email,
+ [user_obj],
+ )
+ else:
+ allocation_user_obj = AllocationUser.objects.create(
+ allocation=allocation_obj,
+ user=user_obj,
+ status=allocation_user_active_status_choice,
+ role=role,
+ )
- allocation_activate_user.send(sender=self.__class__, allocation_user_pk=allocation_user_obj.pk)
+ allocation_activate_user.send(sender=self.__class__, allocation_user_pk=allocation_user_obj.pk)
+
+ if selected_users:
+ allocation_added_users_emails = list(
+ allocation_obj.project.projectuser_set.filter(
+ user__in=selected_user_objs, enable_notifications=True
+ ).values_list("user__email", flat=True)
+ )
+ if allocation_obj.project.pi.email not in allocation_added_users_emails:
+ allocation_added_users_emails.append(allocation_obj.project.pi.email)
- user_plural = "user" if users_added_count == 1 else "users"
- messages.success(request, f"Added {users_added_count} {user_plural} to allocation.")
+ send_added_user_email(request, allocation_obj, selected_user_objs, allocation_added_users_emails)
+
+ is_plural = len(selected_users.keys()) > 1
+ messages.success(
+ request,
+ f"User{'s' if is_plural else ''} added to the allocation: {', '.join(selected_users.keys())}",
+ )
+
+ logger.info(
+ f"User {request.user.username} added {', '.join(selected_users.keys())} "
+ f"to a {resource.name} allocation "
+ f"(allocation pk={allocation_obj.pk})"
+ )
else:
for error in formset.errors:
- messages.error(request, error)
+ if error.get("__all__"):
+ messages.error(request, error.get("__all__")[0])
+ logger.warning(
+ f"An error occured when adding users to an allocation (allocation pk={allocation_obj.pk}). "
+ f"Error: {error.get('__all__')[0]}"
+ )
+ return HttpResponseRedirect(reverse("allocation-add-users", kwargs={"pk": pk}))
return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": pk}))
@@ -936,7 +1234,7 @@ class AllocationRemoveUsersView(LoginRequiredMixin, UserPassesTestMixin, Templat
def test_func(self):
"""UserPassesTestMixin Tests"""
allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
- if allocation_obj.has_perm(self.request.user, AllocationPermission.MANAGER):
+ if allocation_obj.has_perm(self.request.user, AllocationPermission.MANAGER, "delete_allocationuser"):
return True
messages.error(self.request, "You do not have permission to remove users from allocation.")
@@ -954,6 +1252,8 @@ def dispatch(self, request, *args, **kwargs):
"Renewal Requested",
]:
message = f"You cannot remove users from a allocation with status {allocation_obj.status.name}."
+ elif allocation_obj.get_parent_resource.name == "Geode-Project":
+ message = "You cannot remove users from a Geode-Project allocation."
if message:
messages.error(request, message)
return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
@@ -1014,6 +1314,9 @@ def post(self, request, *args, **kwargs):
if formset.is_valid():
allocation_user_removed_status_choice = AllocationUserStatusChoice.objects.get(name="Removed")
+ allocation_user_status_choice = allocation_user_removed_status_choice
+
+ removed_user_objs = []
for form in formset:
user_form_data = form.cleaned_data
if user_form_data["selected"]:
@@ -1024,12 +1327,30 @@ def post(self, request, *args, **kwargs):
continue
allocation_user_obj = allocation_obj.allocationuser_set.get(user=user_obj)
- allocation_user_obj.status = allocation_user_removed_status_choice
+ removed_user_objs.append(user_obj)
+
+ allocation_user_obj.status = allocation_user_status_choice
allocation_user_obj.save()
allocation_remove_user.send(sender=self.__class__, allocation_user_pk=allocation_user_obj.pk)
- user_plural = "user" if remove_users_count == 1 else "users"
- messages.success(request, f"Removed {remove_users_count} {user_plural} from allocation.")
+ if removed_user_objs:
+ removed_users = [removed_user_obj.username for removed_user_obj in removed_user_objs]
+ allocation_removed_users_emails = list(
+ allocation_obj.project.projectuser_set.filter(
+ user__in=removed_user_objs, enable_notifications=True
+ ).values_list("user__email", flat=True)
+ )
+ if allocation_obj.project.pi.email not in allocation_removed_users_emails:
+ allocation_removed_users_emails.append(allocation_obj.project.pi.email)
+
+ send_removed_user_email(request, allocation_obj, removed_user_objs, allocation_removed_users_emails)
+ user_plural = "user" if remove_users_count == 1 else "users"
+ messages.success(request, f"Removed {user_plural} {', '.join(removed_users)} from allocation.")
+
+ logger.info(
+ f"User {request.user.username} removed {', '.join(removed_users)} from a "
+ f"{allocation_obj.get_parent_resource.name} allocation (allocation pk={allocation_obj.pk})"
+ )
else:
for error in formset.errors:
messages.error(request, error)
@@ -1044,9 +1365,19 @@ class AllocationAttributeCreateView(LoginRequiredMixin, UserPassesTestMixin, Cre
def test_func(self):
"""UserPassesTestMixin Tests"""
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ user = self.request.user
+ if user.is_superuser:
+ return True
- if self.request.user.is_superuser:
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "add_allocationattribute",
+ )
+ if group_exists:
return True
+
messages.error(self.request, "You do not have permission to add allocation attributes.")
return False
@@ -1068,10 +1399,34 @@ def get_form(self, form_class=None):
"""Return an instance of the form to be used in this view."""
form = super().get_form(form_class)
form.fields["allocation"].widget = forms.HiddenInput()
+
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ current_allocation_attribute_objs = allocation_obj.allocationattribute_set.all()
+ current_allocation_attribute_type_objs = []
+ for allocation_attribute_obj in current_allocation_attribute_objs:
+ current_allocation_attribute_type_objs.append(allocation_attribute_obj.allocation_attribute_type)
+ allocation_attribute_type_objs = AllocationAttributeType.objects.all()
+ allocation_attribute_type_pks = []
+ for allocation_attribute_type_obj in allocation_attribute_type_objs:
+ if allocation_attribute_type_obj in current_allocation_attribute_type_objs:
+ continue
+
+ if allocation_obj.get_parent_resource in allocation_attribute_type_obj.get_linked_resources():
+ allocation_attribute_type_pks.append(allocation_attribute_type_obj.pk)
+ form.fields["allocation_attribute_type"].queryset = AllocationAttributeType.objects.filter(
+ pk__in=allocation_attribute_type_pks
+ )
+
return form
def get_success_url(self):
- return reverse("allocation-detail", kwargs={"pk": self.kwargs.get("pk")})
+ allocation_obj = Allocation.objects.get(pk=self.kwargs.get("pk"))
+ logger.info(
+ f"Admin {self.request.user.username} created a {allocation_obj.get_parent_resource.name} "
+ f"allocation attribute (allocation pk={allocation_obj.pk})"
+ )
+ create_admin_action_for_creation(self.request.user, self.object, allocation_obj)
+ return reverse("allocation-detail", kwargs={"pk": allocation_obj.pk})
class AllocationAttributeDeleteView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
@@ -1079,9 +1434,20 @@ class AllocationAttributeDeleteView(LoginRequiredMixin, UserPassesTestMixin, Tem
def test_func(self):
"""UserPassesTestMixin Tests"""
- if self.request.user.is_superuser:
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ user = self.request.user
+ if user.is_superuser:
return True
- messages.error(self.request, "You do not have permission to delete allocation attributes.")
+
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "delete_allocationattribute",
+ )
+ if group_exists:
+ return True
+
+ messages.error(self.request, "You do not have permission to delete attributes from this allocation.")
return False
def get_allocation_attributes_to_delete(self, allocation_obj):
@@ -1129,6 +1495,15 @@ def post(self, request, *args, **kwargs):
attributes_deleted_count += 1
allocation_attribute = AllocationAttribute.objects.get(pk=form_data["pk"])
+
+ logger.info(
+ f"Admin {request.user.username} deleted a {allocation_obj.get_parent_resource.name} "
+ f"allocation attribute (allocation pk={allocation_obj.pk})"
+ )
+ create_admin_action_for_deletion(
+ request.user, allocation_attribute, allocation_attribute.allocation
+ )
+
allocation_attribute.delete()
messages.success(request, f"Deleted {attributes_deleted_count} attributes from allocation.")
@@ -1146,10 +1521,20 @@ class AllocationNoteCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateVi
def test_func(self):
"""UserPassesTestMixin Tests"""
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ user = self.request.user
+ if user.is_superuser:
+ return True
- if self.request.user.is_superuser:
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "add_allocationusernote",
+ )
+ if group_exists:
return True
- messages.error(self.request, "You do not have permission to add allocation notes.")
+
+ messages.error(self.request, "You do not have permission to add a note to this allocation.")
return False
def get_context_data(self, **kwargs):
@@ -1177,7 +1562,10 @@ def get_form(self, form_class=None):
return form
def get_success_url(self):
- return reverse("allocation-detail", kwargs={"pk": self.kwargs.get("pk")})
+ logger.info(
+ f"Admin {self.request.user.username} created an allocation note (allocation pk={self.object.allocation.pk})"
+ )
+ return reverse("allocation-detail", kwargs={"pk": self.object.allocation.pk})
class AllocationRequestListView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
@@ -1194,30 +1582,48 @@ def test_func(self):
return True
messages.error(self.request, "You do not have permission to review allocation requests.")
- return False
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
- allocation_list = Allocation.objects.filter(
- status__name__in=[
- "New",
- "Renewal Requested",
- "Paid",
- "Approved",
- ]
- )
-
- allocation_renewal_dates = {}
- for allocation in allocation_list.filter(status__name="Renewal Requested"):
- allocation_history = allocation.history.all().order_by("-history_date")
- for history in allocation_history:
- if history.status.name != "Renewal Requested":
- break
- allocation_renewal_dates[allocation.pk] = history.history_date
+ if self.request.user.is_superuser:
+ allocation_list = Allocation.objects.filter(
+ status__name__in=[
+ "New",
+ "Paid",
+ "Billing Information Submitted",
+ "Contacted By Admin",
+ "Waiting For Admin Approval",
+ ]
+ ).exclude(project__status__name__in=["Archived", "Renewal Denied"])
+ allocation_renewal_list = Allocation.objects.filter(status__name="Renewal Requested").exclude(
+ project__status__name__in=["Archived", "Renewal Denied"]
+ )
+ else:
+ allocation_list = (
+ Allocation.objects.filter(
+ status__name__in=[
+ "New",
+ "Paid",
+ "Billing Information Submitted",
+ "Contacted By Admin",
+ "Waiting For Admin Approval",
+ ],
+ resources__review_groups__in=list(self.request.user.groups.all()),
+ )
+ .exclude(project__status__name__in=["Archived", "Renewal Denied"])
+ .distinct()
+ )
+ allocation_renewal_list = (
+ Allocation.objects.filter(
+ status__name="Renewal Requested", resources__review_groups__in=list(self.request.user.groups.all())
+ )
+ .exclude(project__status__name__in=["Archived", "Renewal Denied"])
+ .distinct()
+ )
- context["allocation_renewal_dates"] = allocation_renewal_dates
context["allocation_status_active"] = AllocationStatusChoice.objects.get(name="Active")
context["allocation_list"] = allocation_list
+ context["allocation_renewal_list"] = allocation_renewal_list
context["PROJECT_ENABLE_PROJECT_REVIEW"] = PROJECT_ENABLE_PROJECT_REVIEW
context["ALLOCATION_DEFAULT_ALLOCATION_LENGTH"] = ALLOCATION_DEFAULT_ALLOCATION_LENGTH
return context
@@ -1229,7 +1635,7 @@ class AllocationRenewView(LoginRequiredMixin, UserPassesTestMixin, TemplateView)
def test_func(self):
"""UserPassesTestMixin Tests"""
allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
- if allocation_obj.has_perm(self.request.user, AllocationPermission.MANAGER):
+ if allocation_obj.has_perm(self.request.user, AllocationPermission.MANAGER, "can_review_allocation_requests"):
return True
messages.error(self.request, "You do not have permission to renew allocation.")
@@ -1238,6 +1644,10 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ if not allocation_obj.project.requires_review:
+ messages.error(request, "Your allocation does not need to be renewed.")
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
+
if not ALLOCATION_ENABLE_ALLOCATION_RENEWAL:
messages.error(
request,
@@ -1247,16 +1657,45 @@ def dispatch(self, request, *args, **kwargs):
if allocation_obj.status.name not in [
"Active",
+ "Expired",
+ "Revoked",
]:
messages.error(request, f"You cannot renew a allocation with status {allocation_obj.status.name}.")
return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
+ if allocation_obj.project.status.name in [
+ "Denied",
+ "Expired",
+ "Archived",
+ "Renewal Denied",
+ ]:
+ messages.error(
+ request,
+ 'You cannot renew an allocation with project status "{}".'.format(allocation_obj.project.status.name),
+ )
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
+
+ if not allocation_obj.project.get_env.get("renewable"):
+ messages.error(request, f"You cannot renew allocations in a {allocation_obj.project.type.name} project.")
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
+
if allocation_obj.project.needs_review:
- messages.error(request, "You cannot renew your allocation because you have to review your project first.")
- return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": allocation_obj.project.pk}))
+ messages.error(request, "You cannot renew your allocation until you review your project first.")
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
+
+ if allocation_obj.expires_in > ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING:
+ messages.error(request, "It is too soon to renew your allocation.")
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
+
+ if (
+ ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING > 0
+ and allocation_obj.expires_in < -ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING
+ ):
+ messages.error(request, "It is too late to renew your allocation.")
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
- if allocation_obj.expires_in > 60:
- messages.error(request, "It is too soon to review your allocation.")
+ if allocation_obj.is_locked:
+ messages.error(request, "You cannot renew this allocation.")
return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
return super().dispatch(request, *args, **kwargs)
@@ -1349,6 +1788,10 @@ def post(self, request, *args, **kwargs):
)
):
allocation_user_obj = active_allocation.allocationuser_set.get(user=user_obj)
+
+ if not allocation_user_obj.exists():
+ continue
+ allocation_user_obj = allocation_user_obj[0]
allocation_user_obj.status = allocation_user_removed_status_choice
allocation_user_obj.save()
allocation_remove_user.send(
@@ -1359,13 +1802,24 @@ def post(self, request, *args, **kwargs):
project_user_obj.status = project_user_remove_status_choice
project_user_obj.save()
+ project_obj = allocation_obj.project
+ addtl_context = {
+ "project_title": project_obj.title,
+ "project_id": project_obj.pk,
+ }
send_allocation_admin_email(
allocation_obj,
- "Allocation Renewed",
+ "Allocation Renewal Requested",
"email/allocation_renewed.txt",
domain_url=get_domain_url(self.request),
+ addtl_context=addtl_context,
)
- messages.success(request, "Allocation renewed successfully")
+
+ logger.info(
+ f"User {request.user.username} sent a {allocation_obj.get_parent_resource.name} "
+ f"allocation renewal request (allocation pk={allocation_obj.pk})"
+ )
+ messages.success(request, "Allocation renewal submitted")
else:
if not formset.is_valid():
for error in formset.errors:
@@ -1389,16 +1843,40 @@ def test_func(self):
messages.error(self.request, "You do not have permission to manage invoices.")
return False
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ if self.request.user.is_superuser:
+ resource_objs = Resource.objects.filter(requires_payment=True)
+ else:
+ resource_objs = Resource.objects.filter(
+ review_groups__in=list(self.request.user.groups.all()), requires_payment=True
+ )
+ resources = []
+ for resource in resource_objs:
+ resources.append((resource.name, resource.name))
+
+ return context
+
def get_queryset(self):
- allocations = Allocation.objects.filter(
- status__name__in=[
- "Paid",
- "Payment Pending",
- "Payment Requested",
- "Payment Declined",
- ]
- )
- return allocations
+ if self.request.user.is_superuser:
+ allocations = Allocation.objects.filter(
+ status__name__in=[
+ "Active",
+ ]
+ )
+ else:
+ allocations = Allocation.objects.filter(
+ status__name__in=[
+ "Active",
+ ],
+ resources__review_groups__in=list(self.request.user.groups.all()),
+ )
+ allocations_require_payment = []
+ for allocation in allocations:
+ if allocation.get_parent_resource.requires_payment:
+ allocations_require_payment.append(allocation)
+
+ return allocations_require_payment
# this is the view class thats rendering allocation_invoice_detail.
@@ -1521,12 +1999,13 @@ def test_func(self):
if self.request.user.is_superuser:
return True
- if self.request.user.has_perm("allocation.can_manage_invoice"):
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(), self.request.user.groups.all(), "can_manage_invoice"
+ )
+ if group_exists:
return True
- messages.error(self.request, "You do not have permission to manage invoices.")
- return False
-
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
pk = self.kwargs.get("pk")
@@ -1563,7 +2042,11 @@ def test_func(self):
if self.request.user.is_superuser:
return True
- if self.request.user.has_perm("allocation.can_manage_invoice"):
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(), self.request.user.groups.all(), "can_manage_invoice"
+ )
+ if group_exists:
return True
messages.error(self.request, "You do not have permission to manage invoices.")
@@ -1581,7 +2064,11 @@ def test_func(self):
if self.request.user.is_superuser:
return True
- if self.request.user.has_perm("allocation.can_manage_invoice"):
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(), self.request.user.groups.all(), "can_manage_invoice"
+ )
+ if group_exists:
return True
messages.error(self.request, "You do not have permission to manage invoices.")
@@ -1703,7 +2190,9 @@ def test_func(self):
if self.request.user.has_perm("allocation.can_view_all_allocations"):
return True
- if allocation_change_obj.allocation.has_perm(self.request.user, AllocationPermission.MANAGER):
+ if allocation_change_obj.allocation.has_perm(
+ self.request.user, AllocationPermission.MANAGER, "view_allocationchangerequest"
+ ):
return True
return False
@@ -1718,6 +2207,7 @@ def get_allocation_attributes_to_change(self, allocation_change_obj):
"name": attribute_change.allocation_attribute.allocation_attribute_type.name,
"value": attribute_change.allocation_attribute.value,
"new_value": attribute_change.new_value,
+ "old_value": attribute_change.old_value,
}
for attribute_change in attributes_to_change
]
@@ -1731,13 +2221,40 @@ def get_context_data(self, **kwargs):
allocation_attributes_to_change = self.get_allocation_attributes_to_change(allocation_change_obj)
+ allocation_obj = allocation_change_obj.allocation
if allocation_attributes_to_change:
+ user_can_change = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "change_allocationattributechangerequest",
+ )
formset = formset_factory(self.formset_class, max_num=len(allocation_attributes_to_change))
- formset = formset(initial=allocation_attributes_to_change, prefix="attributeform")
+ formset = formset(
+ initial=allocation_attributes_to_change,
+ prefix="attributeform",
+ form_kwargs={"new_value_disabled": not user_can_change},
+ )
context["formset"] = formset
+ context["user_has_permissions"] = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "view_allocationchangerequest",
+ )
+
+ if self.request.user.is_superuser:
+ context["user_has_permissions"] = True
+
context["allocation_change"] = allocation_change_obj
context["attribute_changes"] = allocation_attributes_to_change
+ context["user_can_delete"] = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "delete_allocationattributechangerequest",
+ )
+ context["identifiers"] = allocation_obj.allocationattribute_set.filter(
+ allocation_attribute_type__name__in=ALLOCATION_ATTRIBUTE_IDENTIFIERS
+ ).values_list("value", flat=True)
return context
@@ -1753,7 +2270,10 @@ def get(self, request, *args, **kwargs):
allocation_change_form.fields["justification"].disabled = True
if allocation_change_obj.status.name != "Pending":
allocation_change_form.fields["end_date_extension"].disabled = True
- if not self.request.user.is_staff and not self.request.user.is_superuser:
+ if (
+ not not self.request.user.has_perm("allocation.can_view_all_allocations")
+ and not self.request.user.is_superuser
+ ):
allocation_change_form.fields["end_date_extension"].disabled = True
note_form = AllocationChangeNoteForm(initial={"notes": allocation_change_obj.notes})
@@ -1766,11 +2286,22 @@ def get(self, request, *args, **kwargs):
def post(self, request, *args, **kwargs):
pk = self.kwargs.get("pk")
- if not self.request.user.is_superuser:
- messages.error(request, "You do not have permission to update an allocation change request")
- return HttpResponseRedirect(reverse("allocation-change-detail", kwargs={"pk": pk}))
-
allocation_change_obj = get_object_or_404(AllocationChangeRequest, pk=pk)
+ allocation_obj = allocation_change_obj.allocation
+ if not request.user.is_superuser:
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "change_allocationchangerequest",
+ )
+ if not group_exists:
+ messages.error(
+ request, "You do not have permission to manage this allocation change request with this resource."
+ )
+ return HttpResponseRedirect(
+ reverse("allocation-change-detail", kwargs={"pk": allocation_change_obj.pk})
+ )
+
allocation_change_form = AllocationChangeForm(
request.POST,
initial={
@@ -1783,8 +2314,18 @@ def post(self, request, *args, **kwargs):
allocation_attributes_to_change = self.get_allocation_attributes_to_change(allocation_change_obj)
if allocation_attributes_to_change:
+ user_can_change = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "change_allocationattributechangerequest",
+ )
formset = formset_factory(self.formset_class, max_num=len(allocation_attributes_to_change))
- formset = formset(request.POST, initial=allocation_attributes_to_change, prefix="attributeform")
+ formset = formset(
+ request.POST,
+ initial=allocation_attributes_to_change,
+ prefix="attributeform",
+ form_kwargs={"new_value_disabled": not user_can_change},
+ )
note_form = AllocationChangeNoteForm(request.POST, initial={"notes": allocation_change_obj.notes})
@@ -1807,6 +2348,7 @@ def post(self, request, *args, **kwargs):
return HttpResponseBadRequest("Invalid request")
if action == "deny":
+ create_admin_action(request.user, {"notes": notes}, allocation_obj, allocation_change_obj)
allocation_change_obj.notes = notes
allocation_change_status_denied_obj = AllocationChangeStatusChoice.objects.get(name="Denied")
@@ -1825,12 +2367,17 @@ def post(self, request, *args, **kwargs):
)
send_allocation_customer_email(
+ request,
allocation_change_obj.allocation,
"Allocation Change Denied",
"email/allocation_change_denied.txt",
domain_url=get_domain_url(self.request),
)
+ logger.info(
+ f"Admin {request.user.username} denied a {allocation_obj.get_parent_resource.name} "
+ f"allocation change request (allocation pk={allocation_obj.pk})"
+ )
return HttpResponseRedirect(reverse("allocation-change-detail", kwargs={"pk": pk}))
if not allocation_change_form.is_valid() or (allocation_attributes_to_change and not formset.is_valid()):
@@ -1849,6 +2396,10 @@ def post(self, request, *args, **kwargs):
if action == "update" and allocation_change_obj.status.name != "Pending":
allocation_change_obj.save()
messages.success(request, "Allocation change request updated!")
+ logger.info(
+ f"Admin {request.user.username} updated a {allocation_obj.get_parent_resource.name} "
+ f"allocation change request (allocation pk={allocation_obj.pk})"
+ )
return HttpResponseRedirect(reverse("allocation-change-detail", kwargs={"pk": pk}))
form_data = allocation_change_form.cleaned_data
@@ -1859,6 +2410,7 @@ def post(self, request, *args, **kwargs):
return HttpResponseRedirect(reverse("allocation-change-detail", kwargs={"pk": pk}))
if end_date_extension != allocation_change_obj.end_date_extension:
+ create_admin_action(request.user, {"end_date": end_date_extension}, allocation_obj)
allocation_change_obj.end_date_extension = end_date_extension
if allocation_attributes_to_change:
@@ -1868,18 +2420,29 @@ def post(self, request, *args, **kwargs):
attribute_change = AllocationAttributeChangeRequest.objects.get(pk=formset_data.get("change_pk"))
if new_value != attribute_change.new_value:
+ create_admin_action(request.user, {"new_value": new_value}, allocation_obj, attribute_change)
attribute_change.new_value = new_value
attribute_change.save()
if action == "update":
allocation_change_obj.save()
messages.success(request, "Allocation change request updated!")
+ logger.info(
+ f"Admin {request.user.username} updated a {allocation_obj.get_parent_resource.name} "
+ f"allocation change request (allocation pk={allocation_obj.pk})"
+ )
elif action == "approve":
allocation_change_status_active_obj = AllocationChangeStatusChoice.objects.get(name="Approved")
allocation_change_obj.status = allocation_change_status_active_obj
if allocation_change_obj.end_date_extension > 0:
+ create_admin_action(
+ request.user,
+ {"end_date_extension": form_data.get("end_date_extension")},
+ allocation_obj,
+ allocation_change_obj,
+ )
new_end_date = allocation_change_obj.allocation.end_date + relativedelta(
days=allocation_change_obj.end_date_extension
)
@@ -1891,12 +2454,15 @@ def post(self, request, *args, **kwargs):
if allocation_attributes_to_change:
attribute_change_list = allocation_change_obj.allocationattributechangerequest_set.all()
for attribute_change in attribute_change_list:
+ create_admin_action(
+ request.user, {"new_value": attribute_change.new_value}, allocation_obj, attribute_change
+ )
attribute_change.allocation_attribute.value = attribute_change.new_value
attribute_change.allocation_attribute.save()
allocation_attribute_changed.send(
sender=self.__class__,
attribute_pk=attribute_change.allocation_attribute.pk,
- allocation_pk=attribute_change.allocation.pk,
+ allocation_pk=allocation_obj,
)
messages.success(
@@ -1916,12 +2482,18 @@ def post(self, request, *args, **kwargs):
)
send_allocation_customer_email(
+ request,
allocation_change_obj.allocation,
"Allocation Change Approved",
"email/allocation_change_approved.txt",
domain_url=get_domain_url(self.request),
)
+ logger.info(
+ f"Admin {request.user.username} approved a {allocation_obj.get_parent_resource.name} "
+ f"allocation change request (allocation pk={allocation_obj.pk})"
+ )
+
return HttpResponseRedirect(reverse("allocation-change-detail", kwargs={"pk": pk}))
@@ -1934,7 +2506,7 @@ def test_func(self):
if self.request.user.is_superuser:
return True
- if self.request.user.has_perm("allocation.can_review_allocation_requests"):
+ if self.request.user.has_perm("allocation.view_allocationchangerequest"):
return True
messages.error(self.request, "You do not have permission to review allocation requests.")
@@ -1943,11 +2515,19 @@ def test_func(self):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
- allocation_change_list = AllocationChangeRequest.objects.filter(
- status__name__in=[
- "Pending",
- ]
- )
+ if self.request.user.is_superuser:
+ allocation_change_list = AllocationChangeRequest.objects.filter(
+ status__name__in=[
+ "Pending",
+ ]
+ )
+ else:
+ allocation_change_list = AllocationChangeRequest.objects.filter(
+ status__name__in=[
+ "Pending",
+ ],
+ allocation__resources__review_groups__in=list(self.request.user.groups.all()),
+ )
context["allocation_change_list"] = allocation_change_list
context["PROJECT_ENABLE_PROJECT_REVIEW"] = PROJECT_ENABLE_PROJECT_REVIEW
return context
@@ -1960,11 +2540,10 @@ class AllocationChangeView(LoginRequiredMixin, UserPassesTestMixin, FormView):
def test_func(self):
"""UserPassesTestMixin Tests"""
allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
- if allocation_obj.has_perm(self.request.user, AllocationPermission.MANAGER):
+ if allocation_obj.has_perm(self.request.user, AllocationPermission.MANAGER, "add_allocationchangerequest"):
return True
messages.error(self.request, "You do not have permission to request changes to this allocation.")
-
return False
def dispatch(self, request, *args, **kwargs):
@@ -1976,11 +2555,17 @@ def dispatch(self, request, *args, **kwargs):
)
return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
- if allocation_obj.project.status.name not in [
- "Active",
- "New",
+ if allocation_obj.project.status.name in [
+ "Denied",
+ "Expired",
+ "Revoked",
]:
- messages.error(request, "You cannot request a change to an allocation in an archived project.")
+ messages.error(
+ request,
+ 'You cannot request a change to an allocation in a project with status "{}".'.format(
+ allocation_obj.project.status.name
+ ),
+ )
return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
if allocation_obj.is_locked:
@@ -1999,6 +2584,10 @@ def dispatch(self, request, *args, **kwargs):
)
return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
+ if allocation_obj.allocationchangerequest_set.filter(status__name="Pending"):
+ messages.error(request, "You cannot request a change to an allocation with a pending change request")
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": allocation_obj.pk}))
+
return super().dispatch(request, *args, **kwargs)
def get_allocation_attributes_to_change(self, allocation_obj):
@@ -2011,6 +2600,7 @@ def get_allocation_attributes_to_change(self, allocation_obj):
"pk": attribute.pk,
"name": attribute.allocation_attribute_type.name,
"value": attribute.value,
+ "old_value": attribute.value,
}
for attribute in attributes_to_change
]
@@ -2033,6 +2623,10 @@ def get(self, request, *args, **kwargs):
context["formset"] = formset
context["allocation"] = allocation_obj
context["attributes"] = allocation_attributes_to_change
+ if allocation_obj.get_parent_resource.name == "Slate Project":
+ context["identifier"] = allocation_obj.allocationattribute_set.get(
+ allocation_attribute_type__name="Slate Project Directory"
+ ).value
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
@@ -2050,79 +2644,141 @@ def post(self, request, *args, **kwargs):
formset = formset_factory(self.formset_class, max_num=len(allocation_attributes_to_change))
formset = formset(request.POST, initial=allocation_attributes_to_change, prefix="attributeform")
- if not form.is_valid() or not formset.is_valid():
- attribute_errors = ""
- for error in form.errors:
- messages.error(request, error)
- for error in formset.errors:
- if error:
- attribute_errors += error.get("__all__")
- messages.error(request, attribute_errors)
- return HttpResponseRedirect(reverse("allocation-change", kwargs={"pk": pk}))
- form_data = form.cleaned_data
+ if form.is_valid() and formset.is_valid():
+ form_data = form.cleaned_data
- if form_data.get("end_date_extension") != 0:
- change_requested = True
+ if form_data.get("end_date_extension") != 0:
+ change_requested = True
- for entry in formset:
- formset_data = entry.cleaned_data
+ for entry in formset:
+ formset_data = entry.cleaned_data
- new_value = formset_data.get("new_value")
+ new_value = formset_data.get("new_value")
- if new_value != "":
- change_requested = True
- allocation_attribute = AllocationAttribute.objects.get(pk=formset_data.get("pk"))
- attribute_changes_to_make.add((allocation_attribute, new_value))
+ if new_value != "":
+ change_requested = True
- if not change_requested:
- messages.error(request, "You must request a change.")
- return HttpResponseRedirect(reverse("allocation-change", kwargs={"pk": pk}))
+ allocation_attribute = AllocationAttribute.objects.get(pk=formset_data.get("pk"))
+ attribute_changes_to_make.add((allocation_attribute, new_value))
- if not form.is_valid():
- for error in form.errors:
- messages.error(request, error)
- return HttpResponseRedirect(reverse("allocation-change", kwargs={"pk": pk}))
+ if change_requested:
+ end_date_extension = form_data.get("end_date_extension")
+ justification = form_data.get("justification")
- form_data = form.cleaned_data
+ change_request_status_obj = AllocationChangeStatusChoice.objects.get(name="Pending")
- if not allocation_attributes_to_change and form_data.get("end_date_extension") == 0:
- messages.error(request, "You must request a change.")
- return HttpResponseRedirect(reverse("allocation-change", kwargs={"pk": pk}))
+ allocation_change_request_obj = AllocationChangeRequest.objects.create(
+ allocation=allocation_obj,
+ end_date_extension=end_date_extension,
+ justification=justification,
+ status=change_request_status_obj,
+ )
- end_date_extension = form_data.get("end_date_extension")
- justification = form_data.get("justification")
- change_request_status_obj = AllocationChangeStatusChoice.objects.get(name="Pending")
+ for attribute in attribute_changes_to_make:
+ attribute_change_request_obj = AllocationAttributeChangeRequest.objects.create(
+ allocation_change_request=allocation_change_request_obj,
+ allocation_attribute=attribute[0],
+ old_value=attribute[0].value,
+ new_value=attribute[1],
+ )
+ messages.success(request, "Allocation change request successfully submitted.")
- allocation_change_request_obj = AllocationChangeRequest.objects.create(
- allocation=allocation_obj,
- end_date_extension=end_date_extension,
- justification=justification,
- status=change_request_status_obj,
- )
+ logger.info(
+ f"User {request.user.username} requested a {allocation_obj.get_parent_resource.name} "
+ f"allocation change (allocation pk={allocation_obj.pk})"
+ )
- for attribute in attribute_changes_to_make:
- AllocationAttributeChangeRequest.objects.create(
- allocation_change_request=allocation_change_request_obj,
- allocation_attribute=attribute[0],
- new_value=attribute[1],
- )
+ # TODO - review this
+ pi_name = "{} {} ({})".format(
+ allocation_obj.project.pi.first_name,
+ allocation_obj.project.pi.last_name,
+ allocation_obj.project.pi.username,
+ )
+ resource_name = allocation_obj.get_parent_resource
- messages.success(request, "Allocation change request successfully submitted.")
+ project_obj = allocation_obj.project
- allocation_change_created.send(
- sender=self.__class__,
- allocation_pk=allocation_obj.pk,
- allocation_change_pk=allocation_change_request_obj.pk,
- )
+ addtl_context = {
+ "project_title": project_obj.title,
+ "project_id": project_obj.pk,
+ }
+ allocation_change_created.send(
+ sender=self.__class__,
+ allocation_pk=allocation_obj.pk,
+ allocation_change_pk=allocation_change_request_obj.pk,
+ )
+ send_allocation_admin_email(
+ allocation_obj,
+ f"New Allocation Change Request: {pi_name} - {resource_name}",
+ "email/new_allocation_change_request.txt",
+ url_path=reverse("allocation-change-list"),
+ domain_url=get_domain_url(self.request),
+ addtl_context=addtl_context,
+ )
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": pk}))
- send_allocation_admin_email(
- allocation_obj,
- "New Allocation Change Request",
- "email/new_allocation_change_request.txt",
- url_path=reverse("allocation-change-list"),
- domain_url=get_domain_url(self.request),
- )
- return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": pk}))
+ else:
+ messages.error(request, "You must request a change.")
+ return HttpResponseRedirect(reverse("allocation-change", kwargs={"pk": pk}))
+
+ else:
+ attribute_errors = []
+ for error in form.errors:
+ messages.error(request, error)
+ for error in formset.errors:
+ if error.get("__all__") is not None:
+ attribute_errors.append(error.get("__all__")[0])
+
+ if attribute_errors:
+ messages.error(request, ", ".join(attribute_errors))
+ return HttpResponseRedirect(reverse("allocation-change", kwargs={"pk": pk}))
+ else:
+ if form.is_valid():
+ form_data = form.cleaned_data
+
+ if form_data.get("end_date_extension") != 0:
+ end_date_extension = form_data.get("end_date_extension")
+ justification = form_data.get("justification")
+
+ change_request_status_obj = AllocationChangeStatusChoice.objects.get(name="Pending")
+
+ allocation_change_request_obj = AllocationChangeRequest.objects.create(
+ allocation=allocation_obj,
+ end_date_extension=end_date_extension,
+ justification=justification,
+ status=change_request_status_obj,
+ )
+ messages.success(request, "Allocation change request successfully submitted.")
+
+ pi_name = "{} {} ({})".format(
+ allocation_obj.project.pi.first_name,
+ allocation_obj.project.pi.last_name,
+ allocation_obj.project.pi.username,
+ )
+ resource_name = allocation_obj.get_parent_resource
+
+ addtl_context = {
+ "project_title": project_obj.title,
+ "project_id": project_obj.pk,
+ }
+ send_allocation_admin_email(
+ allocation_obj,
+ f"New Allocation Change Request: {pi_name} - {resource_name}",
+ "email/new_allocation_change_request.txt",
+ url_path=reverse("allocation-change-list"),
+ domain_url=get_domain_url(self.request),
+ addtl_context=addtl_context,
+ )
+
+ return HttpResponseRedirect(reverse("allocation-detail", kwargs={"pk": pk}))
+ else:
+ messages.error(request, "You must request a change.")
+ return HttpResponseRedirect(reverse("allocation-change", kwargs={"pk": pk}))
+
+ else:
+ for error in form.errors:
+ messages.error(request, error)
+ return HttpResponseRedirect(reverse("allocation-change", kwargs={"pk": pk}))
class AllocationAttributeEditView(LoginRequiredMixin, UserPassesTestMixin, FormView):
@@ -2131,8 +2787,15 @@ class AllocationAttributeEditView(LoginRequiredMixin, UserPassesTestMixin, FormV
def test_func(self):
"""UserPassesTestMixin Tests"""
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
user = self.request.user
- if user.is_superuser or user.is_staff:
+ if user.is_superuser:
+ return True
+
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(), user.groups.all(), "change_allocationattribute"
+ )
+ if group_exists:
return True
messages.error(self.request, "You do not have permission to edit this allocation's attributes.")
@@ -2214,6 +2877,7 @@ def post(self, request, *args, **kwargs):
attribute_changes_to_make.add((allocation_attribute, value))
for allocation_attribute, value in attribute_changes_to_make:
+ create_admin_action(request.user, {"value": value}, allocation_obj, allocation_attribute)
allocation_attribute.value = value
allocation_attribute.save()
allocation_attribute_changed.send(
@@ -2221,6 +2885,13 @@ def post(self, request, *args, **kwargs):
attribute_pk=allocation_attribute.pk,
allocation_pk=pk,
)
+ logger.info(
+ f"Admin {request.user.username} updated a {allocation_obj.get_parent_resource.name} "
+ f"allocation attribute (allocation pk={allocation_obj.pk})"
+ )
+
+ if attribute_changes_to_make:
+ messages.success(request, "Successfully updated allocation attributes.")
return ok_redirect
@@ -2234,17 +2905,194 @@ def test_func(self):
if self.request.user.is_superuser:
return True
- if self.request.user.has_perm("allocation.can_review_allocation_requests"):
+ allocation_attribute_change_obj = get_object_or_404(AllocationAttributeChangeRequest, pk=self.kwargs.get("pk"))
+ allocation_obj = allocation_attribute_change_obj.allocation_change_request.allocation
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "delete_allocationattributechangerequest",
+ )
+ if group_exists:
return True
- messages.error(self.request, "You do not have permission to update an allocation change request.")
+ messages.error(self.request, "You do not have permission to delete an allocation attribute change request.")
return False
def get(self, request, pk):
allocation_attribute_change_obj = get_object_or_404(AllocationAttributeChangeRequest, pk=pk)
allocation_change_pk = allocation_attribute_change_obj.allocation_change_request.pk
+ create_admin_action_for_deletion(
+ request.user,
+ allocation_attribute_change_obj,
+ allocation_attribute_change_obj.allocation_change_request.allocation,
+ allocation_attribute_change_obj.allocation_change_request,
+ )
+
allocation_attribute_change_obj.delete()
+ allocation_pk = allocation_attribute_change_obj.allocation_change_request.allocation.pk
+ allocation_resource_name = (
+ allocation_attribute_change_obj.allocation_change_request.allocation.get_parent_resource.name
+ )
+ logger.info(
+ f"Admin {request.user.username} deleted a {allocation_resource_name} allocation "
+ f"attribute change request (allocation pk={allocation_pk})"
+ )
messages.success(request, "Allocation attribute change request successfully deleted.")
return HttpResponseRedirect(reverse("allocation-change-detail", kwargs={"pk": allocation_change_pk}))
+
+
+class AllocationUserDetailView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
+ template_name = "allocation/allocation_user_detail.html"
+
+ def test_func(self):
+ """UserPassesTestMixin Tests"""
+ if self.request.user.is_superuser:
+ return True
+
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+
+ if allocation_obj.project.pi == self.request.user:
+ return True
+
+ if allocation_obj.project.projectuser_set.filter(
+ user=self.request.user, role__name="Manager", status__name="Active"
+ ).exists():
+ return True
+
+ def get(self, request, *args, **kwargs):
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ allocation_user_pk = self.kwargs.get("allocation_user_pk")
+
+ if allocation_obj.allocationuser_set.filter(pk=allocation_user_pk).exists():
+ allocation_user_obj = allocation_obj.allocationuser_set.get(pk=allocation_user_pk)
+
+ allocation_user_update_form = AllocationUserUpdateForm(
+ resource=allocation_obj.get_parent_resource,
+ initial={
+ "role": allocation_user_obj.role,
+ },
+ )
+
+ context = {}
+ context["can_update"] = not allocation_obj.project.pi == allocation_user_obj.user
+ context["allocation_obj"] = allocation_obj
+ context["allocation_user_update_form"] = allocation_user_update_form
+ context["allocation_user_obj"] = allocation_user_obj
+ context["allocation_user_roles_enabled"] = check_if_roles_are_enabled(allocation_obj)
+
+ return render(request, self.template_name, context)
+
+ def post(self, request, *args, **kwargs):
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("pk"))
+ project_obj = allocation_obj.project
+ allocation_user_pk = self.kwargs.get("allocation_user_pk")
+
+ if allocation_obj.status.name not in ["Active", "Billing Information Submitted", "New", "Renewal Requested"]:
+ messages.error(request, f"You cannot update a user in a(n) {allocation_obj.status.name} allocation.")
+ return HttpResponseRedirect(
+ reverse(
+ "allocation-user-detail", kwargs={"pk": allocation_obj.pk, "allocation_user_pk": allocation_user_pk}
+ )
+ )
+
+ if allocation_obj.allocationuser_set.filter(id=allocation_user_pk).exists():
+ allocation_user_obj = allocation_obj.allocationuser_set.get(pk=allocation_user_pk)
+
+ if allocation_user_obj.user == allocation_user_obj.allocation.project.pi:
+ messages.error(request, "PI role cannot be changed.")
+ return HttpResponseRedirect(
+ reverse(
+ "allocation-user-detail",
+ kwargs={"pk": allocation_obj.pk, "allocation_user_pk": allocation_user_pk},
+ )
+ )
+
+ allocation_user_update_form = AllocationUserUpdateForm(
+ request.POST,
+ resource=allocation_obj.get_parent_resource,
+ initial={
+ "role": allocation_user_obj.role,
+ },
+ )
+
+ if allocation_user_update_form.is_valid():
+ form_data = allocation_user_update_form.cleaned_data
+ if allocation_user_obj.role == form_data.get("role"):
+ return HttpResponseRedirect(
+ reverse(
+ "allocation-user-detail",
+ kwargs={"pk": allocation_obj.pk, "allocation_user_pk": allocation_user_pk},
+ )
+ )
+ allocation_user_obj.role = form_data.get("role")
+ allocation_user_obj.save()
+ allocation_change_user_role.send(
+ sender=self.__class__,
+ allocation_user_pk=allocation_user_pk,
+ )
+
+ logger.info(
+ f"User {request.user.username} updated {allocation_user_obj.user.username}'s "
+ f"role (allocation pk={project_obj.pk})"
+ )
+
+ messages.success(request, "User details updated.")
+ return HttpResponseRedirect(
+ reverse(
+ "allocation-user-detail",
+ kwargs={"pk": allocation_obj.pk, "allocation_user_pk": allocation_user_pk},
+ )
+ )
+ else:
+ messages.error(request, allocation_user_update_form.errors.get("__all__"))
+ return HttpResponseRedirect(
+ reverse(
+ "allocation-user-detail",
+ kwargs={"pk": allocation_obj.pk, "allocation_user_pk": allocation_user_pk},
+ )
+ )
+
+
+class AllocationNoteUpdateView(SuccessMessageMixin, LoginRequiredMixin, UserPassesTestMixin, UpdateView):
+ model = AllocationUserNote
+ template_name = "allocation/allocation_note_update.html"
+ fields = ["is_private", "note"]
+ success_message = "Allocation note updated."
+
+ def test_func(self):
+ """UserPassesTestMixin Tests"""
+ allocation_note_obj = get_object_or_404(AllocationUserNote, pk=self.kwargs.get("pk"))
+ allocation_obj = get_object_or_404(Allocation, pk=self.kwargs.get("allocation_pk"))
+ user = self.request.user
+ if user.is_superuser:
+ return True
+
+ group_exists = check_if_groups_in_review_groups(
+ allocation_obj.get_parent_resource.review_groups.all(),
+ self.request.user.groups.all(),
+ "change_allocationusernote",
+ )
+ if not group_exists:
+ messages.error(self.request, "You do not have permission to update notes in this allocation.")
+ return False
+
+ if user != allocation_note_obj.author:
+ messages.error(self.request, "Only the original author can edit this note.")
+ return False
+
+ return True
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ allocation_pk = self.kwargs.get("allocation_pk")
+ allocation_obj = get_object_or_404(Allocation, pk=allocation_pk)
+ context["allocation"] = allocation_obj
+ return context
+
+ def get_success_url(self):
+ logger.info(
+ f"Admin {self.request.user.username} updated an allocation note (allocation pk={self.object.allocation.pk})"
+ )
+ return reverse("allocation-detail", kwargs={"pk": self.object.allocation.pk})
diff --git a/coldfront/core/grant/migrations/0002_alter_historicalgrant_options_and_more.py b/coldfront/core/grant/migrations/0002_alter_historicalgrant_options_and_more.py
new file mode 100644
index 0000000000..89fa2cdb4a
--- /dev/null
+++ b/coldfront/core/grant/migrations/0002_alter_historicalgrant_options_and_more.py
@@ -0,0 +1,72 @@
+# Generated by Django 4.2.11 on 2024-10-31 13:39
+
+import coldfront.core.grant.models
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("grant", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name="historicalgrant",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical grant",
+ "verbose_name_plural": "historical Grants",
+ },
+ ),
+ migrations.AlterField(
+ model_name="grant",
+ name="direct_funding",
+ field=coldfront.core.grant.models.MoneyField(max_length=100),
+ ),
+ migrations.AlterField(
+ model_name="grant",
+ name="percent_credit",
+ field=coldfront.core.grant.models.PercentField(
+ max_length=100, validators=[django.core.validators.MaxValueValidator(100)]
+ ),
+ ),
+ migrations.AlterField(
+ model_name="grant",
+ name="total_amount_awarded",
+ field=coldfront.core.grant.models.MoneyField(max_length=100),
+ ),
+ migrations.AlterField(
+ model_name="grantfundingagency",
+ name="name",
+ field=models.CharField(max_length=255, unique=True),
+ ),
+ migrations.AlterField(
+ model_name="grantstatuschoice",
+ name="name",
+ field=models.CharField(max_length=64, unique=True),
+ ),
+ migrations.AlterField(
+ model_name="historicalgrant",
+ name="direct_funding",
+ field=coldfront.core.grant.models.MoneyField(max_length=100),
+ ),
+ migrations.AlterField(
+ model_name="historicalgrant",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ migrations.AlterField(
+ model_name="historicalgrant",
+ name="percent_credit",
+ field=coldfront.core.grant.models.PercentField(
+ max_length=100, validators=[django.core.validators.MaxValueValidator(100)]
+ ),
+ ),
+ migrations.AlterField(
+ model_name="historicalgrant",
+ name="total_amount_awarded",
+ field=coldfront.core.grant.models.MoneyField(max_length=100),
+ ),
+ ]
diff --git a/coldfront/core/grant/migrations/0002_auto_20230406_1310.py b/coldfront/core/grant/migrations/0002_auto_20230406_1310.py
deleted file mode 100644
index edcab61213..0000000000
--- a/coldfront/core/grant/migrations/0002_auto_20230406_1310.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# SPDX-FileCopyrightText: (C) ColdFront Authors
-#
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-# Generated by Django 3.2.17 on 2023-04-06 17:10
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
- dependencies = [
- ("grant", "0001_initial"),
- ]
-
- operations = [
- migrations.AlterField(
- model_name="grantfundingagency",
- name="name",
- field=models.CharField(max_length=255, unique=True),
- ),
- migrations.AlterField(
- model_name="grantstatuschoice",
- name="name",
- field=models.CharField(max_length=64, unique=True),
- ),
- ]
diff --git a/coldfront/core/grant/models.py b/coldfront/core/grant/models.py
index d1fa1b28f4..7f4e395157 100644
--- a/coldfront/core/grant/models.py
+++ b/coldfront/core/grant/models.py
@@ -3,7 +3,12 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
from django.core.exceptions import ValidationError
-from django.core.validators import MaxLengthValidator, MaxValueValidator, MinLengthValidator, RegexValidator
+from django.core.validators import (
+ MaxLengthValidator,
+ MaxValueValidator,
+ MinLengthValidator,
+ RegexValidator,
+)
from django.db import models
from model_utils.models import TimeStampedModel
from simple_history.models import HistoricalRecords
diff --git a/coldfront/core/grant/views.py b/coldfront/core/grant/views.py
index ed6f075d53..444defe7d8 100644
--- a/coldfront/core/grant/views.py
+++ b/coldfront/core/grant/views.py
@@ -43,11 +43,15 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("project_pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot add grants to an archived project.")
+ messages.error(
+ request, 'You cannot add grants to a project with status "{}".'.format(project_obj.status.name)
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
diff --git a/coldfront/core/portal/utils.py b/coldfront/core/portal/utils.py
index 5ddacaff98..75de159fe8 100644
--- a/coldfront/core/portal/utils.py
+++ b/coldfront/core/portal/utils.py
@@ -4,7 +4,10 @@
import datetime
-from coldfront.core.allocation.models import Allocation
+from django.contrib.auth.models import User
+
+from coldfront.core.allocation.models import Allocation, AllocationAttribute
+from coldfront.core.project.models import Project, ProjectUser
def generate_publication_by_year_chart_data(publications_by_year):
@@ -31,23 +34,26 @@ def generate_total_grants_by_agency_chart_data(total_grants_by_agency):
def generate_resources_chart_data(allocations_count_by_resource_type):
if allocations_count_by_resource_type:
cluster_label = "Cluster: %d" % (allocations_count_by_resource_type.get("Cluster", 0))
- cloud_label = "Cloud: %d" % (allocations_count_by_resource_type.get("Cloud", 0))
- server_label = "Server: %d" % (allocations_count_by_resource_type.get("Server", 0))
+ # cloud_label = "Cloud: %d" % (allocations_count_by_resource_type.get("Cloud", 0))
+ # server_label = "Server: %d" % (allocations_count_by_resource_type.get("Server", 0))
storage_label = "Storage: %d" % (allocations_count_by_resource_type.get("Storage", 0))
+ service_label = "Service: %d" % (allocations_count_by_resource_type.get("Service", 0))
resource_plot_data = {
"columns": [
[cluster_label, allocations_count_by_resource_type.get("Cluster", 0)],
[storage_label, allocations_count_by_resource_type.get("Storage", 0)],
- [cloud_label, allocations_count_by_resource_type.get("Cloud", 0)],
- [server_label, allocations_count_by_resource_type.get("Server", 0)],
+ [service_label, allocations_count_by_resource_type.get("Service", 0)],
+ # [cloud_label, allocations_count_by_resource_type.get("Cloud", 0)],
+ # [server_label, allocations_count_by_resource_type.get("Server", 0)]
],
"type": "donut",
"colors": {
cluster_label: "#6da04b",
storage_label: "#ffc72c",
- cloud_label: "#2f9fd0",
- server_label: "#e56a54",
+ service_label: "#2f9fd0",
+ # cloud_label: "#2f9fd0",
+ # server_label: "#e56a54",
},
}
else:
@@ -87,3 +93,288 @@ def generate_allocations_chart_data():
}
return allocation_chart_data
+
+
+def generate_project_type_chart_data():
+ num_research_projects_count = Project.objects.filter(
+ status__name__in=[
+ "Active",
+ "Waiting For Admin Approval",
+ "Review Pending",
+ "Contacted By Admin",
+ ],
+ type__name="Research",
+ ).count()
+ num_class_projects_count = Project.objects.filter(
+ status__name__in=[
+ "Active",
+ "Waiting For Admin Approval",
+ "Review Pending",
+ "Contacted By Admin",
+ ],
+ type__name="Class",
+ ).count()
+
+ research_projects_count_label = f"Research: {num_research_projects_count}"
+ class_projects_count_label = f"Class: {num_class_projects_count}"
+
+ project_type_chart_data = {
+ "columns": [
+ [research_projects_count_label, num_research_projects_count],
+ [class_projects_count_label, num_class_projects_count],
+ ],
+ "type": "donut",
+ "colors": {research_projects_count_label: "#673ab7", class_projects_count_label: "#e27602"},
+ }
+
+ return project_type_chart_data
+
+
+def generate_project_user_chart_data():
+ project_statuses = [
+ "Active",
+ "Waiting For Admin Approval",
+ "Review Pending",
+ "Contacted By Admin",
+ ]
+ num_active_research_users = len(
+ ProjectUser.objects.filter(
+ status__name="Active", project__type__name="Research", project__status__name__in=project_statuses
+ )
+ )
+ num_active_class_users = len(
+ ProjectUser.objects.filter(
+ status__name="Active", project__type__name="Class", project__status__name__in=project_statuses
+ )
+ )
+
+ active_research_users_label = f"Research: {num_active_research_users}"
+ active_class_users_label = f"Class: {num_active_class_users}"
+ project_user_chart_data = {
+ "columns": [
+ [active_research_users_label, num_active_research_users],
+ [active_class_users_label, num_active_class_users],
+ ],
+ "type": "donut",
+ "colors": {
+ active_class_users_label: "#e27602",
+ active_research_users_label: "#673ab7",
+ },
+ }
+
+ return project_user_chart_data
+
+
+def generate_project_status_chart_data():
+ num_active_projects = Project.objects.filter(status__name="Active").count()
+ num_requested_projects = Project.objects.filter(
+ status__name__in=[
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ ]
+ ).count()
+ num_renewal_projects = Project.objects.filter(status__name="Review Pending").count()
+
+ active_projects_label = f"Active: {num_active_projects}"
+ requested_projects_label = f"Waiting For Admin Approval: {num_requested_projects}"
+ renewal_projects = f"Renewal Requested: {num_renewal_projects}"
+
+ project_status_chart_data = {
+ "columns": [
+ [active_projects_label, num_active_projects],
+ [requested_projects_label, num_requested_projects],
+ [renewal_projects, num_renewal_projects],
+ ],
+ "type": "donut",
+ "colors": {active_projects_label: "#6da04b", requested_projects_label: "#2f9fd0", renewal_projects: "#ffc72c"},
+ }
+
+ return project_status_chart_data
+
+
+def generate_research_project_status_columns():
+ research_projects = Project.objects.filter(type__name="Research")
+ num_active_projects = research_projects.filter(status__name="Active").count()
+ num_requested_projects = research_projects.filter(
+ status__name__in=[
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ ]
+ ).count()
+ num_renewal_projects = research_projects.filter(status__name="Review Pending").count()
+
+ active_projects_label = f"Active (R): {num_active_projects}"
+ requested_projects_label = f"Waiting For Admin Approval (R): {num_requested_projects}"
+ renewal_projects = f"Renewal Requested (R): {num_renewal_projects}"
+
+ research_project_status_columns = {
+ "columns": [
+ [active_projects_label, num_active_projects],
+ [requested_projects_label, num_requested_projects],
+ [renewal_projects, num_renewal_projects],
+ ],
+ "colors": {active_projects_label: "#6da04b", requested_projects_label: "#2f9fd0", renewal_projects: "#ffc72c"},
+ }
+
+ return research_project_status_columns
+
+
+def generate_class_project_status_columns():
+ research_projects = Project.objects.filter(type__name="Class")
+ num_active_projects = research_projects.filter(status__name="Active").count()
+ num_requested_projects = research_projects.filter(
+ status__name__in=[
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ ]
+ ).count()
+ num_renewal_projects = research_projects.filter(status__name="Review Pending").count()
+
+ active_projects_label = f"Active (C): {num_active_projects}"
+ requested_projects_label = f"Waiting For Admin Approval (C): {num_requested_projects}"
+ renewal_projects = f"Renewal Requested (C): {num_renewal_projects}"
+
+ class_project_status_columns = {
+ "columns": [
+ [active_projects_label, num_active_projects],
+ [requested_projects_label, num_requested_projects],
+ [renewal_projects, num_renewal_projects],
+ ],
+ "colors": {active_projects_label: "#6da04b", requested_projects_label: "#2f9fd0", renewal_projects: "#ffc72c"},
+ }
+
+ return class_project_status_columns
+
+
+def generate_user_counts():
+ project_statuses = [
+ "Active",
+ "Waiting For Admin Approval",
+ "Review Pending",
+ "Contacted By Admin",
+ ]
+ num_unique_active_users = len(
+ set(
+ ProjectUser.objects.filter(status__name="Active", project__status__name__in=project_statuses).values_list(
+ "user", flat=True
+ )
+ )
+ )
+ num_unique_active_pis = len({project.pi for project in Project.objects.filter(status__name__in=project_statuses)})
+
+ unique_user_label = f"Unique Active Users: {num_unique_active_users}"
+ unique_pi_label = f"Unique Active PIs: {num_unique_active_pis}"
+
+ user_counts_chart_data = {
+ "columns": [
+ [unique_user_label, num_unique_active_users],
+ [unique_pi_label, num_unique_active_pis],
+ ],
+ "type": "bar",
+ "colors": {unique_pi_label: "#2f9fd0", unique_user_label: "#6da04b"},
+ }
+
+ return user_counts_chart_data
+
+
+def create_months():
+ months = {
+ "1": 0,
+ "2": 0,
+ "3": 0,
+ "4": 0,
+ "5": 0,
+ "6": 0,
+ "7": 0,
+ "8": 0,
+ "9": 0,
+ "10": 0,
+ "11": 0,
+ "12": 0,
+ }
+
+ return months
+
+
+def create_years(start, stop):
+ years = {}
+ for year in range(start, stop + 1):
+ years[str(year)] = {
+ "months": create_months(),
+ "total_new_users": 0,
+ }
+
+ return years
+
+
+def generate_user_timeline():
+ unique_users = User.objects.all().order_by("date_joined")
+ start_year = unique_users[0].date_joined.year
+ stop_years = unique_users[unique_users.count() - 1].date_joined.year
+ years = create_years(start_year, stop_years)
+ for count, user in enumerate(unique_users, start=1):
+ date_joined = user.date_joined
+ year = str(date_joined.year)
+ month = str(date_joined.month)
+ years[year]["months"][month] = count
+ years[year]["total_new_users"] = count
+
+ year_list = [year + "-01-01" for year in years.keys()]
+ year_list = [f"{start_year - 1}-01-01"] + year_list
+ year_label = "Years"
+ year_new_users_list = [values["total_new_users"] for values in years.values()]
+ year_new_users_list = [0] + year_new_users_list
+ year_new_users_label = "Total Unique Users"
+
+ years_to_months_labels = {}
+ years_to_months_values = {}
+ total_users = 0
+ current_date = datetime.datetime.today()
+ current_month = current_date.month
+ current_year = current_date.year
+ for year, months_and_total in years.items():
+ months = months_and_total["months"]
+ years_to_months_labels[year] = ["Months"]
+ years_to_months_values[year] = [f"Total Unique Users ({year})"]
+ for month, users in months.items():
+ if int(year) == current_year and int(month) > current_month:
+ continue
+ years_to_months_labels[year].append(year + "-" + month + "-01")
+ if users < 1:
+ users = total_users
+ years_to_months_values[year].append(users)
+ total_users = users
+
+ user_timeline_chart_data = {
+ "x": year_label,
+ "columns": [
+ [year_label] + year_list,
+ [year_new_users_label] + year_new_users_list,
+ ],
+ }
+
+ return user_timeline_chart_data, years_to_months_labels, years_to_months_values
+
+
+def get_home_page_slurm_info(user):
+ slurm_account_attribute_objs = AllocationAttribute.objects.filter(
+ allocation__status__name__in=[
+ "Active",
+ "Renewal Requested",
+ ],
+ allocation__allocationuser__user=user,
+ allocation__allocationuser__status__name="Active",
+ allocation_attribute_type__name="slurm_account_name",
+ ).select_related("allocation", "allocation__project")
+ slurm_accounts = {}
+ for slurm_account_obj in slurm_account_attribute_objs:
+ if not slurm_accounts.get(slurm_account_obj.value):
+ slurm_accounts[slurm_account_obj.value] = {
+ "project_pk": slurm_account_obj.allocation.project.pk,
+ "project_title": slurm_account_obj.allocation.project.title,
+ "allocations": {},
+ }
+ resource = slurm_account_obj.allocation.get_parent_resource
+ slurm_accounts[slurm_account_obj.value]["allocations"][slurm_account_obj.allocation.pk] = resource.name
+
+ return slurm_accounts
diff --git a/coldfront/core/portal/views.py b/coldfront/core/portal/views.py
index 63a81004e3..d74f08fcf4 100644
--- a/coldfront/core/portal/views.py
+++ b/coldfront/core/portal/views.py
@@ -16,9 +16,14 @@
from coldfront.core.grant.models import Grant
from coldfront.core.portal.utils import (
generate_allocations_chart_data,
+ generate_project_type_chart_data,
+ generate_project_user_chart_data,
generate_publication_by_year_chart_data,
generate_resources_chart_data,
generate_total_grants_by_agency_chart_data,
+ generate_user_counts,
+ generate_user_timeline,
+ get_home_page_slurm_info,
)
from coldfront.core.project.models import Project
from coldfront.core.publication.models import Publication
@@ -26,10 +31,14 @@
from coldfront.core.utils.common import import_from_settings
ALLOCATION_EULA_ENABLE = import_from_settings("ALLOCATION_EULA_ENABLE", False)
+PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING = import_from_settings("PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING", 30)
+ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING = import_from_settings("ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING", 30)
+ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING = import_from_settings("ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING", 60)
def home(request):
context = {}
+ next_url = ""
if request.user.is_authenticated:
template_name = "portal/authorized_home.html"
project_list = (
@@ -40,6 +49,10 @@ def home(request):
status__name__in=[
"New",
"Active",
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ "Review Pending",
+ "Expired",
]
)
)
@@ -48,6 +61,9 @@ def home(request):
status__name__in=[
"New",
"Active",
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ "Review Pending",
]
)
& Q(projectuser__user=request.user)
@@ -59,19 +75,13 @@ def home(request):
)
)
.distinct()
- .order_by("-created")[:5]
+ .order_by("-created")
)
allocation_list = (
Allocation.objects.filter(
- Q(
- status__name__in=[
- "Active",
- "New",
- "Renewal Requested",
- ]
- )
- & Q(project__status__name__in=["Active", "New"])
+ Q(status__name__in=["Active", "New", "Renewal Requested", "Billing Information Submitted"])
+ & Q(project__status__name__in=["Active", "New", "Review Pending", "Expired"])
& Q(project__projectuser__user=request.user)
& Q(
project__projectuser__status__name__in=[
@@ -79,10 +89,19 @@ def home(request):
]
)
& Q(allocationuser__user=request.user)
- & Q(allocationuser__status__name__in=["Active", "PendingEULA"])
+ & Q(
+ allocationuser__status__name__in=[
+ "Active",
+ "Invited",
+ "Pending",
+ "Disabled",
+ "Retired",
+ "PendingEULA",
+ ]
+ )
)
.distinct()
- .order_by("-created")[:5]
+ .order_by("-created")
)
if ALLOCATION_EULA_ENABLE:
@@ -92,16 +111,21 @@ def home(request):
user_status.append(allocation.allocationuser_set.get(user=request.user).status.name)
context["user_status"] = user_status
+ context["slurm_accounts"] = get_home_page_slurm_info(request.user)
+ context["user"] = request.user
context["project_list"] = project_list
context["allocation_list"] = allocation_list
-
+ context["PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING"] = PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING
+ context["ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING"] = ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING
+ context["ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING"] = ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING
try:
context["ondemand_url"] = settings.ONDEMAND_URL
except AttributeError:
pass
else:
+ next_url = request.get_full_path()[1:]
template_name = "portal/nonauthorized_home.html"
-
+ context["next"] = next_url
context["EXTRA_APPS"] = settings.INSTALLED_APPS
if "coldfront.plugins.system_monitor" in settings.INSTALLED_APPS:
@@ -194,6 +218,9 @@ def allocation_by_fos(request):
list(user_allocations.values_list("allocation__project__field_of_science__description", flat=True))
)
total_allocations_users = user_allocations.values("user").distinct().count()
+ user_allocations = AllocationUser.objects.filter(
+ status__name__in=["Active", "Invited", "Pending", "Disabled", "Retired"], allocation__status__name="Active"
+ )
active_pi_count = (
Project.objects.filter(status__name__in=["Active", "New"])
@@ -231,3 +258,24 @@ def allocation_summary(request):
context["resources_chart_data"] = resources_chart_data
return render(request, "portal/allocation_summary.html", context)
+
+
+@cache_page(60 * 15)
+def project_summary(request):
+ context = {}
+ context["project_user_chart_data"] = generate_project_user_chart_data()
+ context["project_type_chart_data"] = generate_project_type_chart_data()
+
+ return render(request, "portal/project_summary.html", context)
+
+
+@cache_page(60 * 15)
+def user_summary(request):
+ context = {}
+ context["user_counts"] = generate_user_counts()
+ user_timeline_chart_data, years_to_months_labels, years_to_months_values = generate_user_timeline()
+ context["user_timeline"] = user_timeline_chart_data
+ context["years_to_months_labels"] = years_to_months_labels
+ context["years_to_months_values"] = years_to_months_values
+
+ return render(request, "portal/user_summary.html", context)
diff --git a/coldfront/core/project/admin.py b/coldfront/core/project/admin.py
index 400df4824c..d147a11e59 100644
--- a/coldfront/core/project/admin.py
+++ b/coldfront/core/project/admin.py
@@ -11,12 +11,16 @@
from coldfront.core.project.models import (
AttributeType,
Project,
+ ProjectAdminAction,
ProjectAdminComment,
ProjectAttribute,
ProjectAttributeType,
ProjectAttributeUsage,
+ ProjectDescriptionRecord,
ProjectReview,
+ ProjectReviewStatusChoice,
ProjectStatusChoice,
+ ProjectTypeChoice,
ProjectUser,
ProjectUserMessage,
ProjectUserRoleChoice,
@@ -49,6 +53,7 @@ class ProjectUserAdmin(SimpleHistoryAdmin):
"user",
"project",
"role",
+ "enable_notifications",
"status",
"created",
"modified",
@@ -118,6 +123,9 @@ class ProjectUserInline(admin.TabularInline):
]
extra = 0
+ def get_queryset(self, request):
+ return super().get_queryset(request).prefetch_related("user", "project", "role", "status")
+
class ProjectAdminCommentInline(admin.TabularInline):
model = ProjectAdminComment
@@ -310,23 +318,58 @@ def project_pi(self, obj):
return obj.project_attribute.project.pi.username
+class ProjectReviewInline(admin.TabularInline):
+ model = ProjectReview
+ fields = [
+ "status",
+ "project_updates",
+ "allocation_renewals",
+ "created",
+ ]
+ readonly_fields = [
+ "status",
+ "project_updates",
+ "allocation_renewals",
+ "created",
+ ]
+ extra = 0
+
+
+class ProjectAdminActionInline(admin.TabularInline):
+ model = ProjectAdminAction
+ fields = [
+ "user",
+ "action",
+ "created",
+ ]
+ readonly_fields = ["user", "action", "created"]
+ can_delete = False
+ extra = 0
+
+
@admin.register(Project)
class ProjectAdmin(SimpleHistoryAdmin):
fields_change = (
"title",
"pi",
+ "requestor",
"description",
+ "project_code",
+ "private",
+ "type",
"status",
"requires_review",
"force_review",
+ "max_managers",
"created",
+ "end_date",
"modified",
)
readonly_fields_change = (
"created",
"modified",
)
- list_display = ("pk", "title", "PI", "created", "modified", "status")
+ list_display = ("pk", "title", "PI", "created", "modified", "end_date", "type", "status")
search_fields = [
"pi__username",
"projectuser__user__username",
@@ -334,10 +377,17 @@ class ProjectAdmin(SimpleHistoryAdmin):
"projectuser__user__last_name",
"title",
]
- list_filter = ("status", "force_review")
- inlines = [ProjectUserInline, ProjectAdminCommentInline, ProjectUserMessageInline, ProjectAttributeInLine]
+ list_filter = ("status", "force_review", "type")
+ inlines = [
+ ProjectUserInline,
+ ProjectReviewInline,
+ ProjectAdminCommentInline,
+ ProjectUserMessageInline,
+ ProjectAdminActionInline,
+ ]
raw_id_fields = [
"pi",
+ "requestor",
]
def PI(self, obj):
@@ -361,7 +411,23 @@ def get_inline_instances(self, request, obj=None):
# We are adding an object
return []
else:
- return super().get_inline_instances(request)
+ inline_instances = super().get_inline_instances(request)
+ project_user_inline = inline_instances[0]
+ if obj and obj.projectuser_set.all().count() > 200:
+ setattr(
+ project_user_inline,
+ "readonly_fields",
+ [
+ "user",
+ "project",
+ "role",
+ "status",
+ "enable_notifications",
+ ],
+ )
+ setattr(project_user_inline, "can_delete", False)
+ inline_instances[0] = project_user_inline
+ return inline_instances
def get_list_display(self, request):
if not (PROJECT_CODE or PROJECT_INSTITUTION_EMAIL_MAP):
@@ -389,7 +455,7 @@ def save_formset(self, request, form, formset, change):
@admin.register(ProjectReview)
class ProjectReviewAdmin(SimpleHistoryAdmin):
- list_display = ("pk", "project", "PI", "reason_for_not_updating_project", "created", "status")
+ list_display = ("pk", "project", "PI", "allocation_renewals", "project_updates", "created", "status")
search_fields = [
"project__pi__username",
"project__pi__first_name",
@@ -399,3 +465,66 @@ class ProjectReviewAdmin(SimpleHistoryAdmin):
def PI(self, obj):
return "{} {} ({})".format(obj.project.pi.first_name, obj.project.pi.last_name, obj.project.pi.username)
+
+
+@admin.register(ProjectTypeChoice)
+class ProjectTypeChoiceAdmin(admin.ModelAdmin):
+ list_display = ("name",)
+
+
+@admin.register(ProjectReviewStatusChoice)
+class ProjectReviewStatusChoiceAdmin(admin.ModelAdmin):
+ list_display = ("name",)
+
+
+@admin.register(ProjectAdminAction)
+class ProjectAdminActionAdmin(admin.ModelAdmin):
+ list_display = (
+ "pk",
+ "user",
+ "project_pk",
+ "project_title",
+ "action",
+ "created",
+ )
+ fields_change = (
+ "user",
+ "project",
+ "action",
+ "modified",
+ "created",
+ )
+ readonly_fields_change = (
+ "modified",
+ "created",
+ )
+ raw_id_fields = (
+ "user",
+ "project",
+ )
+
+ def project_pk(self, obj):
+ return obj.project.pk
+
+ def project_title(self, obj):
+ return obj.project.title
+
+ def get_fields(self, request, obj):
+ if obj is None:
+ return super().get_fields(request)
+ else:
+ return self.fields_change
+
+ def get_readonly_fields(self, request, obj):
+ if obj is None:
+ # We are adding an object
+ return super().get_readonly_fields(request)
+ else:
+ return self.readonly_fields_change
+
+
+@admin.register(ProjectDescriptionRecord)
+class ProjectDescriptionRecordAdmin(admin.ModelAdmin):
+ list_display = ("pk", "project", "user", "created")
+ readonly_fields = ("project", "user", "description")
+ list_filter = ("project",)
diff --git a/coldfront/core/project/forms.py b/coldfront/core/project/forms.py
index c0e2c9bd7c..ea288ef121 100644
--- a/coldfront/core/project/forms.py
+++ b/coldfront/core/project/forms.py
@@ -2,30 +2,44 @@
#
# SPDX-License-Identifier: AGPL-3.0-or-later
-import datetime
from django import forms
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.core.validators import MinLengthValidator
from django.db.models.functions import Lower
from django.shortcuts import get_object_or_404
-from coldfront.core.project.models import Project, ProjectAttribute, ProjectReview, ProjectUserRoleChoice
-from coldfront.core.utils.common import import_from_settings
+from coldfront.core.project.models import (
+ Project,
+ ProjectAttribute,
+ ProjectReview,
+ ProjectUserRoleChoice,
+)
+from coldfront.core.project.utils import check_if_pis_eligible
+from coldfront.core.utils.common import get_users_info, import_from_settings
+
+if "coldfront.plugins.ldap_misc" in settings.INSTALLED_APPS:
+ from coldfront.plugins.ldap_misc.utils.ldap_user_search import get_users_info
+ from coldfront.plugins.ldap_misc.utils.project import check_if_pis_eligible
EMAIL_DIRECTOR_PENDING_PROJECT_REVIEW_EMAIL = import_from_settings("EMAIL_DIRECTOR_PENDING_PROJECT_REVIEW_EMAIL")
EMAIL_ADMIN_LIST = import_from_settings("EMAIL_ADMIN_LIST", [])
EMAIL_DIRECTOR_EMAIL_ADDRESS = import_from_settings("EMAIL_DIRECTOR_EMAIL_ADDRESS", "")
+ADDITIONAL_USER_SEARCH_CLASSES = import_from_settings("ADDITIONAL_USER_SEARCH_CLASSES", [])
+
class ProjectSearchForm(forms.Form):
"""Search form for the Project list page."""
LAST_NAME = "Last Name"
USERNAME = "Username"
- FIELD_OF_SCIENCE = "Field of Science"
+ # FIELD_OF_SCIENCE = "Field of Science"
last_name = forms.CharField(label=LAST_NAME, max_length=100, required=False)
username = forms.CharField(label=USERNAME, max_length=100, required=False)
- field_of_science = forms.CharField(label=FIELD_OF_SCIENCE, max_length=100, required=False)
+ # field_of_science = forms.CharField(label=FIELD_OF_SCIENCE, max_length=100, required=False)
show_all_projects = forms.BooleanField(initial=False, required=False)
@@ -39,6 +53,16 @@ class ProjectAddUserForm(forms.Form):
selected = forms.BooleanField(initial=False, required=False)
+class ProjectAddUsersToAllocationFormSet(forms.BaseFormSet):
+ def get_form_kwargs(self, index):
+ """
+ Override so allocations can have role selection
+ """
+ kwargs = super().get_form_kwargs(index)
+ roles = kwargs["roles"][index]
+ return {"roles": roles}
+
+
class ProjectAddUsersToAllocationForm(forms.Form):
pk = forms.IntegerField(disabled=True)
selected = forms.BooleanField(initial=False, required=False)
@@ -46,6 +70,14 @@ class ProjectAddUsersToAllocationForm(forms.Form):
details = forms.CharField(max_length=300, disabled=True, required=False)
resource_type = forms.CharField(max_length=50, disabled=True)
status = forms.CharField(max_length=50, disabled=True)
+ role = forms.ChoiceField(choices=(("", "----"),), disabled=True, required=False)
+
+ def __init__(self, *args, **kwargs):
+ roles = kwargs.pop("roles")
+ super().__init__(*args, **kwargs)
+ if roles:
+ self.fields["role"].disabled = False
+ self.fields["role"].choices = tuple([(role, role) for role in roles])
class ProjectRemoveUserForm(forms.Form):
@@ -63,57 +95,36 @@ class ProjectUserUpdateForm(forms.Form):
class ProjectReviewForm(forms.Form):
- reason = forms.CharField(
- label="Reason for not updating project information",
- widget=forms.Textarea(
- attrs={
- "placeholder": "If you have no new information to provide, you are required to provide a statement explaining this in this box. Thank you!"
- }
- ),
- required=False,
- )
+ no_project_updates = forms.BooleanField(label="No new project updates", required=False)
+ project_updates = forms.CharField(label="Project updates", widget=forms.Textarea(), required=False)
acknowledgement = forms.BooleanField(
label="By checking this box I acknowledge that I have updated my project to the best of my knowledge",
initial=False,
required=True,
)
- def __init__(self, project_pk, *args, **kwargs):
- super().__init__(*args, **kwargs)
- project_obj = get_object_or_404(Project, pk=project_pk)
- now = datetime.datetime.now(datetime.timezone.utc)
-
- if project_obj.grant_set.exists():
- latest_grant = project_obj.grant_set.order_by("-modified")[0]
- grant_updated_in_last_year = (now - latest_grant.created).days < 365
- else:
- grant_updated_in_last_year = None
-
- if project_obj.publication_set.exists():
- latest_publication = project_obj.publication_set.order_by("-created")[0]
- publication_updated_in_last_year = (now - latest_publication.created).days < 365
- else:
- publication_updated_in_last_year = None
-
- if grant_updated_in_last_year or publication_updated_in_last_year:
- self.fields["reason"].widget = forms.HiddenInput()
- else:
- self.fields["reason"].required = True
+ def clean(self):
+ cleaned_data = super().clean()
+ project_updates = cleaned_data.get("project_updates")
+ no_project_updates = cleaned_data.get("no_project_updates")
+ if not no_project_updates and project_updates == "":
+ raise forms.ValidationError("Please fill out the project updates field.")
class ProjectReviewEmailForm(forms.Form):
cc = forms.CharField(required=False)
email_body = forms.CharField(required=True, widget=forms.Textarea)
- def __init__(self, pk, *args, **kwargs):
+ def __init__(self, pk, user, *args, **kwargs):
super().__init__(*args, **kwargs)
project_review_obj = get_object_or_404(ProjectReview, pk=int(pk))
- self.fields["email_body"].initial = "Dear {} {} \n{}".format(
- project_review_obj.project.pi.first_name,
- project_review_obj.project.pi.last_name,
- EMAIL_DIRECTOR_PENDING_PROJECT_REVIEW_EMAIL,
+ self.fields["email_body"].initial = EMAIL_DIRECTOR_PENDING_PROJECT_REVIEW_EMAIL.format(
+ first_name=user.first_name, project_name=project_review_obj.project.title
)
- self.fields["cc"].initial = ", ".join([EMAIL_DIRECTOR_EMAIL_ADDRESS] + EMAIL_ADMIN_LIST)
+ cc_list = [project_review_obj.project.pi.email, user.email]
+ if project_review_obj.project.pi == project_review_obj.project.requestor:
+ cc_list.remove(project_review_obj.project.pi.email)
+ self.fields["cc"].initial = ", ".join(cc_list)
class ProjectAttributeAddForm(forms.ModelForm):
@@ -128,7 +139,7 @@ def __init__(self, *args, **kwargs):
super(ProjectAttributeAddForm, self).__init__(*args, **kwargs)
user = (kwargs.get("initial")).get("user")
self.fields["proj_attr_type"].queryset = self.fields["proj_attr_type"].queryset.order_by(Lower("name"))
- if not user.is_superuser:
+ if not user.is_superuser and not user.has_perm("project.delete_projectattribute"):
self.fields["proj_attr_type"].queryset = self.fields["proj_attr_type"].queryset.filter(is_private=False)
@@ -181,6 +192,119 @@ def clean(self):
class ProjectCreationForm(forms.ModelForm):
+ pi_username = forms.CharField(
+ max_length=20,
+ label="PI Username",
+ required=False,
+ help_text=(
+ "Required if you will not be the PI of this project. Only faculty and staff can be the PI. "
+ "They must log onto the site at least once before they can be added."
+ ),
+ )
+ class_number = forms.CharField(max_length=25, required=False)
+
class Meta:
model = Project
- fields = ["title", "description", "field_of_science"]
+ fields = ["title", "description", "pi_username", "type", "class_number", "requestor", "pi"]
+
+ def __init__(self, user, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+
+ self.fields["pi_username"].required = not check_if_pis_eligible([user.username]).get(user.username, False)
+ self.fields["description"].widget.attrs.update(
+ {
+ "placeholder": (
+ "EXAMPLE: Our research involves the collection, storage, and analysis of rat "
+ "colony behaviorial footage to study rat social patterns in natural settings. "
+ "We intend to store the footage in a shared Slate-Project directory, perform "
+ "cleaning of the footage with the Python library Pillow, and then perform "
+ "video classification analysis on the footage using Python libraries such as "
+ "TorchVision using Quartz and Big Red 200."
+ )
+ }
+ )
+ self.fields["requestor"].initial = user
+ self.fields["requestor"].widget = forms.HiddenInput()
+ self.fields["pi"].initial = user
+ self.fields["pi"].widget = forms.HiddenInput()
+
+ def clean(self):
+ cleaned_data = super().clean()
+ requestor = cleaned_data.get("requestor")
+ pi_username = cleaned_data.get("pi_username")
+ if pi_username:
+ pi_obj = User.objects.filter(username=pi_username).first()
+ else:
+ pi_obj = requestor
+ if pi_obj is None:
+ user_info = get_users_info([pi_username]).get(pi_username)
+ if user_info is not None and not user_info:
+ raise forms.ValidationError({"pi_username": "This PI's username does not exist."})
+
+ raise forms.ValidationError(
+ {
+ "pi_username": (
+ "This PI's username could not be found on RT Projects. "
+ "They need to log onto this site for their account to be "
+ "automatically created. Afterwards, they can be added as a PI to this "
+ "project."
+ )
+ }
+ )
+
+ if not check_if_pis_eligible([pi_obj.username]).get(pi_obj.username, True):
+ if pi_username:
+ message = {"pi_username": "Only faculty and staff can be the PI"}
+ else:
+ message = "Only faculty and staff can be the PI"
+ raise forms.ValidationError(message)
+
+ cleaned_data["pi"] = pi_obj
+ return cleaned_data
+
+
+class ProjectRequestEmailForm(forms.Form):
+ cc = forms.CharField(required=False)
+ email_body = forms.CharField(required=True, widget=forms.Textarea)
+
+ def __init__(self, pk, user, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ project_obj = get_object_or_404(Project, pk=int(pk))
+ self.fields["email_body"].initial = EMAIL_DIRECTOR_PENDING_PROJECT_REVIEW_EMAIL.format(
+ first_name=user.first_name, project_name=project_obj.title
+ )
+ cc_list = [project_obj.pi.email, user.email]
+ if project_obj.pi == project_obj.requestor:
+ cc_list.remove(project_obj.pi.email)
+ self.fields["cc"].initial = ", ".join(cc_list)
+
+
+class ProjectReviewAllocationForm(forms.Form):
+ pk = forms.IntegerField(disabled=True)
+ resource = forms.CharField(max_length=100, disabled=True)
+ users = forms.CharField(max_length=2000, disabled=True, required=False)
+ status = forms.CharField(max_length=50, disabled=True)
+ expires_on = forms.DateField(widget=forms.DateInput(attrs={"class": "datepicker"}), disabled=True)
+ renew = forms.BooleanField(initial=True, required=False)
+
+
+class ProjectUpdateForm(forms.Form):
+ title = forms.CharField(
+ max_length=255,
+ )
+ description = forms.CharField(
+ validators=[
+ MinLengthValidator(
+ 10,
+ "The project description must be > 10 characters",
+ )
+ ],
+ widget=forms.Textarea,
+ )
+
+ def __init__(self, project_pk, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ project_obj = get_object_or_404(Project, pk=project_pk)
+
+ self.fields["title"].initial = project_obj.title
+ self.fields["description"].initial = project_obj.description
diff --git a/coldfront/core/project/management/commands/add_default_project_choices.py b/coldfront/core/project/management/commands/add_default_project_choices.py
index 8b06af65d8..0e81d87e08 100644
--- a/coldfront/core/project/management/commands/add_default_project_choices.py
+++ b/coldfront/core/project/management/commands/add_default_project_choices.py
@@ -9,6 +9,7 @@
ProjectAttributeType,
ProjectReviewStatusChoice,
ProjectStatusChoice,
+ ProjectTypeChoice,
ProjectUserRoleChoice,
ProjectUserStatusChoice,
)
@@ -18,29 +19,40 @@ class Command(BaseCommand):
help = "Add default project related choices"
def handle(self, *args, **options):
+ ProjectStatusChoice.objects.all().delete()
for choice in [
"New",
"Active",
"Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
+ "Review Pending",
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
]:
ProjectStatusChoice.objects.get_or_create(name=choice)
+ ProjectReviewStatusChoice.objects.all().delete()
for choice in [
- "Completed",
+ "Approved",
"Pending",
+ "Denied",
+ "Completed",
+ "Contacted By Admin",
]:
ProjectReviewStatusChoice.objects.get_or_create(name=choice)
+ ProjectUserRoleChoice.objects.all().delete()
for choice in [
"User",
"Manager",
+ "Group",
]:
ProjectUserRoleChoice.objects.get_or_create(name=choice)
for choice in [
"Active",
- "Pending - Add",
- "Pending - Remove",
"Denied",
"Removed",
]:
@@ -52,6 +64,7 @@ def handle(self, *args, **options):
for name, attribute_type, has_usage, is_private in (
("Project ID", "Text", False, False),
("Account Number", "Int", False, True),
+ ("Auto Disable User Notifications", "Yes/No", False, True),
):
ProjectAttributeType.objects.get_or_create(
name=name,
@@ -59,3 +72,10 @@ def handle(self, *args, **options):
has_usage=has_usage,
is_private=is_private,
)
+
+ ProjectTypeChoice.objects.all().delete()
+ for choice in [
+ "Research",
+ "Class",
+ ]:
+ ProjectTypeChoice.objects.get_or_create(name=choice)
diff --git a/coldfront/core/project/management/commands/modify_max_managers.py b/coldfront/core/project/management/commands/modify_max_managers.py
new file mode 100644
index 0000000000..0a7f87f304
--- /dev/null
+++ b/coldfront/core/project/management/commands/modify_max_managers.py
@@ -0,0 +1,26 @@
+import logging
+
+from django.core.management.base import BaseCommand, CommandError
+
+from coldfront.core.project.models import Project
+
+logger = logging.getLogger(__name__)
+
+
+class Command(BaseCommand):
+ help = "Changes the allowed number of managers in all projects"
+
+ def add_arguments(self, parser):
+ parser.add_argument("max_managers", type=int)
+
+ def handle(self, *args, **kwargs):
+ max_managers = kwargs.get("max_managers")
+ if max_managers < 1:
+ raise CommandError("Max managers must be > 0")
+
+ project_objs = Project.objects.all()
+ for project_obj in project_objs:
+ project_obj.max_managers = max_managers
+ project_obj.save()
+
+ logger.info(f"All projects' max managers were set to {max_managers}")
diff --git a/coldfront/core/project/migrations/0002_auto_20220721_1202_squashed_0011_alter_project_options_and_more.py b/coldfront/core/project/migrations/0002_auto_20220721_1202_squashed_0011_alter_project_options_and_more.py
new file mode 100644
index 0000000000..1bf32a386f
--- /dev/null
+++ b/coldfront/core/project/migrations/0002_auto_20220721_1202_squashed_0011_alter_project_options_and_more.py
@@ -0,0 +1,806 @@
+# Generated by Django 4.2.11 on 2025-10-16 18:46
+
+import django.core.validators
+import django.db.models.deletion
+import django.utils.timezone
+import model_utils.fields
+import simple_history.models
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("project", "0001_initial"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="ProjectTypeChoice",
+ fields=[
+ (
+ "id",
+ models.AutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ ("name", models.CharField(max_length=64)),
+ ],
+ options={
+ "ordering": ("name",),
+ },
+ ),
+ migrations.AlterModelOptions(
+ name="project",
+ options={
+ "ordering": ["title"],
+ "permissions": (
+ ("can_view_all_projects", "Can view all projects"),
+ (
+ "can_review_pending_projects",
+ "Can review pending project requests/reviews",
+ ),
+ ),
+ },
+ ),
+ migrations.RenameField(
+ model_name="historicalprojectreview",
+ old_name="reason_for_not_updating_project",
+ new_name="project_updates",
+ ),
+ migrations.RenameField(
+ model_name="projectreview",
+ old_name="reason_for_not_updating_project",
+ new_name="project_updates",
+ ),
+ migrations.AddField(
+ model_name="historicalproject",
+ name="end_date",
+ field=models.DateField(default=django.utils.timezone.now),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="historicalproject",
+ name="max_managers",
+ field=models.IntegerField(default=2),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="historicalproject",
+ name="private",
+ field=models.BooleanField(
+ default=False,
+ help_text="A private project will not show up in the PI search results if someone searchs for you/your PI.",
+ ),
+ ),
+ migrations.AddField(
+ model_name="historicalproject",
+ name="requestor",
+ field=models.ForeignKey(
+ blank=True,
+ db_constraint=False,
+ null=True,
+ on_delete=django.db.models.deletion.DO_NOTHING,
+ related_name="+",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ migrations.AddField(
+ model_name="historicalprojectreview",
+ name="allocation_renewals",
+ field=models.TextField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name="project",
+ name="end_date",
+ field=models.DateField(default=django.utils.timezone.now),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="project",
+ name="max_managers",
+ field=models.IntegerField(default=2),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="project",
+ name="private",
+ field=models.BooleanField(
+ default=False,
+ help_text="A private project will not show up in the PI search results if someone searchs for you/your PI.",
+ ),
+ ),
+ migrations.AddField(
+ model_name="project",
+ name="requestor",
+ field=models.ForeignKey(
+ default=1,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="requestor_user",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="projectreview",
+ name="allocation_renewals",
+ field=models.TextField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name="projectusermessage",
+ name="is_private",
+ field=models.BooleanField(default=True),
+ ),
+ migrations.AlterField(
+ model_name="historicalproject",
+ name="description",
+ field=models.TextField(
+ default="",
+ help_text="\nPlease provide a brief description or abstract about your project including any applications or\nworkflows you intend to use, and how you primarily intend to use the system, including if PHI will\nbe stored. Please include your area of research and your department. If this is for a class please\nput the approximate class size.\n",
+ validators=[
+ django.core.validators.MinLengthValidator(10, "The project description must be > 10 characters.")
+ ],
+ ),
+ ),
+ migrations.AddField(
+ model_name="historicalproject",
+ name="slurm_account_name",
+ field=models.CharField(blank=True, db_index=True, max_length=15, null=True),
+ ),
+ migrations.AddField(
+ model_name="historicalproject",
+ name="type",
+ field=models.ForeignKey(
+ blank=True,
+ db_constraint=False,
+ help_text="This cannot be changed once your project is submitted. Class projects expire at the end of every semester. Research projects expire once a year.",
+ null=True,
+ on_delete=django.db.models.deletion.DO_NOTHING,
+ related_name="+",
+ to="project.projecttypechoice",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="project",
+ name="description",
+ field=models.TextField(
+ default="",
+ help_text="\nPlease provide a brief description or abstract about your project including any applications or\nworkflows you intend to use, and how you primarily intend to use the system, including if PHI will\nbe stored. Please include your area of research and your department. If this is for a class please\nput the approximate class size.\n",
+ validators=[
+ django.core.validators.MinLengthValidator(10, "The project description must be > 10 characters.")
+ ],
+ ),
+ ),
+ migrations.AddField(
+ model_name="project",
+ name="pi_username",
+ field=models.CharField(
+ blank=True,
+ help_text="\nRequired if you will not be the PI of this project. Only faculty and staff can be the PI. They are\nrequired to log onto the site at least once before they can be added.\n",
+ max_length=20,
+ verbose_name="PI Username",
+ ),
+ ),
+ migrations.AddField(
+ model_name="project",
+ name="slurm_account_name",
+ field=models.CharField(blank=True, max_length=15, null=True, unique=True),
+ ),
+ migrations.AddField(
+ model_name="project",
+ name="type",
+ field=models.ForeignKey(
+ help_text="This cannot be changed once your project is submitted. Class projects expire at the end of every semester. Research projects expire once a year.",
+ on_delete=django.db.models.deletion.CASCADE,
+ to="project.projecttypechoice",
+ ),
+ ),
+ migrations.AddField(
+ model_name="historicalproject",
+ name="pi_username",
+ field=models.CharField(
+ blank=True,
+ help_text="\nRequired if you will not be the PI of this project. Only faculty and staff can be the PI. They are\nrequired to log onto the site at least once before they can be added.\n",
+ max_length=20,
+ verbose_name="PI Username",
+ ),
+ ),
+ migrations.AddField(
+ model_name="historicalproject",
+ name="class_number",
+ field=models.CharField(blank=True, max_length=25, null=True),
+ ),
+ migrations.AddField(
+ model_name="project",
+ name="class_number",
+ field=models.CharField(blank=True, max_length=25, null=True),
+ ),
+ migrations.CreateModel(
+ name="ProjectDescriptionRecord",
+ fields=[
+ (
+ "id",
+ models.AutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ ("description", models.TextField()),
+ (
+ "project",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to="project.project",
+ ),
+ ),
+ (
+ "user",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ ],
+ options={
+ "abstract": False,
+ },
+ ),
+ migrations.CreateModel(
+ name="AttributeType",
+ fields=[
+ (
+ "id",
+ models.AutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ ("name", models.CharField(max_length=64)),
+ ],
+ options={
+ "ordering": ["name"],
+ },
+ ),
+ migrations.CreateModel(
+ name="ProjectAttribute",
+ fields=[
+ (
+ "id",
+ models.AutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ ("value", models.CharField(max_length=128)),
+ ],
+ options={
+ "abstract": False,
+ },
+ ),
+ migrations.AlterModelOptions(
+ name="historicalproject",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical project",
+ "verbose_name_plural": "historical projects",
+ },
+ ),
+ migrations.AlterModelOptions(
+ name="historicalprojectreview",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical project review",
+ "verbose_name_plural": "historical project reviews",
+ },
+ ),
+ migrations.AlterModelOptions(
+ name="historicalprojectuser",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical project user",
+ "verbose_name_plural": "historical Project User Status",
+ },
+ ),
+ migrations.AlterModelOptions(
+ name="project",
+ options={
+ "ordering": ["title"],
+ "permissions": (
+ ("can_view_all_projects", "Can view all projects"),
+ (
+ "can_review_pending_project_reviews",
+ "Can review pending project reviews",
+ ),
+ ),
+ },
+ ),
+ migrations.AlterField(
+ model_name="historicalproject",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ migrations.AlterField(
+ model_name="historicalprojectreview",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ migrations.AlterField(
+ model_name="historicalprojectuser",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ migrations.AlterField(
+ model_name="projectstatuschoice",
+ name="name",
+ field=models.CharField(max_length=64, unique=True),
+ ),
+ migrations.AlterField(
+ model_name="projectuserrolechoice",
+ name="name",
+ field=models.CharField(max_length=64, unique=True),
+ ),
+ migrations.AlterField(
+ model_name="projectuserstatuschoice",
+ name="name",
+ field=models.CharField(max_length=64, unique=True),
+ ),
+ migrations.CreateModel(
+ name="ProjectAttributeUsage",
+ fields=[
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ (
+ "project_attribute",
+ models.OneToOneField(
+ on_delete=django.db.models.deletion.CASCADE,
+ primary_key=True,
+ serialize=False,
+ to="project.projectattribute",
+ ),
+ ),
+ ("value", models.FloatField(default=0)),
+ ],
+ options={
+ "abstract": False,
+ },
+ ),
+ migrations.CreateModel(
+ name="ProjectAttributeType",
+ fields=[
+ (
+ "id",
+ models.AutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ ("name", models.CharField(max_length=50)),
+ ("has_usage", models.BooleanField(default=False)),
+ ("is_required", models.BooleanField(default=False)),
+ ("is_unique", models.BooleanField(default=False)),
+ ("is_private", models.BooleanField(default=True)),
+ ("is_changeable", models.BooleanField(default=False)),
+ (
+ "attribute_type",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to="project.attributetype",
+ ),
+ ),
+ ],
+ options={
+ "ordering": ["name"],
+ },
+ ),
+ migrations.AddField(
+ model_name="projectattribute",
+ name="proj_attr_type",
+ field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to="project.projectattributetype",
+ ),
+ ),
+ migrations.AddField(
+ model_name="projectattribute",
+ name="project",
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="project.project"),
+ ),
+ migrations.CreateModel(
+ name="HistoricalProjectAttributeUsage",
+ fields=[
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ ("value", models.FloatField(default=0)),
+ ("history_id", models.AutoField(primary_key=True, serialize=False)),
+ ("history_date", models.DateTimeField(db_index=True)),
+ ("history_change_reason", models.CharField(max_length=100, null=True)),
+ (
+ "history_type",
+ models.CharField(
+ choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")],
+ max_length=1,
+ ),
+ ),
+ (
+ "history_user",
+ models.ForeignKey(
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ related_name="+",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ (
+ "project_attribute",
+ models.ForeignKey(
+ blank=True,
+ db_constraint=False,
+ null=True,
+ on_delete=django.db.models.deletion.DO_NOTHING,
+ related_name="+",
+ to="project.projectattribute",
+ ),
+ ),
+ ],
+ options={
+ "verbose_name": "historical project attribute usage",
+ "verbose_name_plural": "historical project attribute usages",
+ "ordering": ("-history_date", "-history_id"),
+ "get_latest_by": ("history_date", "history_id"),
+ },
+ bases=(simple_history.models.HistoricalChanges, models.Model),
+ ),
+ migrations.CreateModel(
+ name="HistoricalProjectAttributeType",
+ fields=[
+ (
+ "id",
+ models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name="ID"),
+ ),
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ ("name", models.CharField(max_length=50)),
+ ("has_usage", models.BooleanField(default=False)),
+ ("is_required", models.BooleanField(default=False)),
+ ("is_unique", models.BooleanField(default=False)),
+ ("is_private", models.BooleanField(default=True)),
+ ("is_changeable", models.BooleanField(default=False)),
+ ("history_id", models.AutoField(primary_key=True, serialize=False)),
+ ("history_date", models.DateTimeField(db_index=True)),
+ ("history_change_reason", models.CharField(max_length=100, null=True)),
+ (
+ "history_type",
+ models.CharField(
+ choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")],
+ max_length=1,
+ ),
+ ),
+ (
+ "attribute_type",
+ models.ForeignKey(
+ blank=True,
+ db_constraint=False,
+ null=True,
+ on_delete=django.db.models.deletion.DO_NOTHING,
+ related_name="+",
+ to="project.attributetype",
+ ),
+ ),
+ (
+ "history_user",
+ models.ForeignKey(
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ related_name="+",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ ],
+ options={
+ "verbose_name": "historical project attribute type",
+ "verbose_name_plural": "historical project attribute types",
+ "ordering": ("-history_date", "-history_id"),
+ "get_latest_by": ("history_date", "history_id"),
+ },
+ bases=(simple_history.models.HistoricalChanges, models.Model),
+ ),
+ migrations.CreateModel(
+ name="HistoricalProjectAttribute",
+ fields=[
+ (
+ "id",
+ models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name="ID"),
+ ),
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ ("value", models.CharField(max_length=128)),
+ ("history_id", models.AutoField(primary_key=True, serialize=False)),
+ ("history_date", models.DateTimeField(db_index=True)),
+ ("history_change_reason", models.CharField(max_length=100, null=True)),
+ (
+ "history_type",
+ models.CharField(
+ choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")],
+ max_length=1,
+ ),
+ ),
+ (
+ "history_user",
+ models.ForeignKey(
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ related_name="+",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ (
+ "proj_attr_type",
+ models.ForeignKey(
+ blank=True,
+ db_constraint=False,
+ null=True,
+ on_delete=django.db.models.deletion.DO_NOTHING,
+ related_name="+",
+ to="project.projectattributetype",
+ ),
+ ),
+ (
+ "project",
+ models.ForeignKey(
+ blank=True,
+ db_constraint=False,
+ null=True,
+ on_delete=django.db.models.deletion.DO_NOTHING,
+ related_name="+",
+ to="project.project",
+ ),
+ ),
+ ],
+ options={
+ "verbose_name": "historical project attribute",
+ "verbose_name_plural": "historical project attributes",
+ "ordering": ("-history_date", "-history_id"),
+ "get_latest_by": ("history_date", "history_id"),
+ },
+ bases=(simple_history.models.HistoricalChanges, models.Model),
+ ),
+ migrations.AlterField(
+ model_name="project",
+ name="description",
+ field=models.TextField(
+ db_collation="utf8mb4_0900_ai_ci",
+ default="",
+ help_text="\nPlease provide a brief description or abstract about your project including any applications or\nworkflows you intend to use, and how you primarily intend to use the system, including if PHI will\nbe stored. Please include your area of research and your department. If this is for a class please\nput the approximate class size.\n",
+ validators=[
+ django.core.validators.MinLengthValidator(10, "The project description must be > 10 characters.")
+ ],
+ ),
+ ),
+ migrations.AlterField(
+ model_name="project",
+ name="title",
+ field=models.CharField(db_collation="utf8mb4_0900_ai_ci", max_length=255),
+ ),
+ migrations.CreateModel(
+ name="ProjectAdminAction",
+ fields=[
+ (
+ "id",
+ models.AutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ (
+ "created",
+ model_utils.fields.AutoCreatedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="created",
+ ),
+ ),
+ (
+ "modified",
+ model_utils.fields.AutoLastModifiedField(
+ default=django.utils.timezone.now,
+ editable=False,
+ verbose_name="modified",
+ ),
+ ),
+ ("action", models.CharField(max_length=256)),
+ (
+ "project",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to="project.project",
+ ),
+ ),
+ (
+ "user",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ ],
+ options={
+ "abstract": False,
+ },
+ ),
+ migrations.AlterModelOptions(
+ name="project",
+ options={
+ "ordering": ["title"],
+ "permissions": (
+ ("can_view_all_projects", "Can view all projects"),
+ (
+ "can_review_pending_projects",
+ "Can review pending project requests/reviews",
+ ),
+ ),
+ },
+ ),
+ migrations.AlterField(
+ model_name="historicalproject",
+ name="max_managers",
+ field=models.IntegerField(default=3),
+ ),
+ migrations.AlterField(
+ model_name="project",
+ name="max_managers",
+ field=models.IntegerField(default=3),
+ ),
+ ]
diff --git a/coldfront/core/project/migrations/0002_projectusermessage_is_private.py b/coldfront/core/project/migrations/0002_projectusermessage_is_private.py
deleted file mode 100644
index 7a7214ce7d..0000000000
--- a/coldfront/core/project/migrations/0002_projectusermessage_is_private.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# SPDX-FileCopyrightText: (C) ColdFront Authors
-#
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-# Generated by Django 3.2.13 on 2022-06-06 15:35
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
- dependencies = [
- ("project", "0001_initial"),
- ]
-
- operations = [
- migrations.AddField(
- model_name="projectusermessage",
- name="is_private",
- field=models.BooleanField(default=True),
- ),
- ]
diff --git a/coldfront/core/project/migrations/0003_auto_20221013_1215.py b/coldfront/core/project/migrations/0003_auto_20221013_1215.py
deleted file mode 100644
index 293b3fae8b..0000000000
--- a/coldfront/core/project/migrations/0003_auto_20221013_1215.py
+++ /dev/null
@@ -1,308 +0,0 @@
-# SPDX-FileCopyrightText: (C) ColdFront Authors
-#
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-# Generated by Django 3.2.15 on 2022-10-13 16:15
-
-import django.db.models.deletion
-import django.utils.timezone
-import model_utils.fields
-import simple_history.models
-from django.conf import settings
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
- dependencies = [
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
- ("project", "0002_projectusermessage_is_private"),
- ]
-
- operations = [
- migrations.CreateModel(
- name="AttributeType",
- fields=[
- ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
- (
- "created",
- model_utils.fields.AutoCreatedField(
- default=django.utils.timezone.now, editable=False, verbose_name="created"
- ),
- ),
- (
- "modified",
- model_utils.fields.AutoLastModifiedField(
- default=django.utils.timezone.now, editable=False, verbose_name="modified"
- ),
- ),
- ("name", models.CharField(max_length=64)),
- ],
- options={
- "ordering": ["name"],
- },
- ),
- migrations.CreateModel(
- name="ProjectAttribute",
- fields=[
- ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
- (
- "created",
- model_utils.fields.AutoCreatedField(
- default=django.utils.timezone.now, editable=False, verbose_name="created"
- ),
- ),
- (
- "modified",
- model_utils.fields.AutoLastModifiedField(
- default=django.utils.timezone.now, editable=False, verbose_name="modified"
- ),
- ),
- ("value", models.CharField(max_length=128)),
- ],
- options={
- "abstract": False,
- },
- ),
- migrations.CreateModel(
- name="ProjectAttributeUsage",
- fields=[
- (
- "created",
- model_utils.fields.AutoCreatedField(
- default=django.utils.timezone.now, editable=False, verbose_name="created"
- ),
- ),
- (
- "modified",
- model_utils.fields.AutoLastModifiedField(
- default=django.utils.timezone.now, editable=False, verbose_name="modified"
- ),
- ),
- (
- "project_attribute",
- models.OneToOneField(
- on_delete=django.db.models.deletion.CASCADE,
- primary_key=True,
- serialize=False,
- to="project.projectattribute",
- ),
- ),
- ("value", models.FloatField(default=0)),
- ],
- options={
- "abstract": False,
- },
- ),
- migrations.CreateModel(
- name="ProjectAttributeType",
- fields=[
- ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
- (
- "created",
- model_utils.fields.AutoCreatedField(
- default=django.utils.timezone.now, editable=False, verbose_name="created"
- ),
- ),
- (
- "modified",
- model_utils.fields.AutoLastModifiedField(
- default=django.utils.timezone.now, editable=False, verbose_name="modified"
- ),
- ),
- ("name", models.CharField(max_length=50)),
- ("has_usage", models.BooleanField(default=False)),
- ("is_required", models.BooleanField(default=False)),
- ("is_unique", models.BooleanField(default=False)),
- ("is_private", models.BooleanField(default=True)),
- ("is_changeable", models.BooleanField(default=False)),
- (
- "attribute_type",
- models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="project.attributetype"),
- ),
- ],
- options={
- "ordering": ["name"],
- },
- ),
- migrations.AddField(
- model_name="projectattribute",
- name="proj_attr_type",
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="project.projectattributetype"),
- ),
- migrations.AddField(
- model_name="projectattribute",
- name="project",
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="project.project"),
- ),
- migrations.CreateModel(
- name="HistoricalProjectAttributeUsage",
- fields=[
- (
- "created",
- model_utils.fields.AutoCreatedField(
- default=django.utils.timezone.now, editable=False, verbose_name="created"
- ),
- ),
- (
- "modified",
- model_utils.fields.AutoLastModifiedField(
- default=django.utils.timezone.now, editable=False, verbose_name="modified"
- ),
- ),
- ("value", models.FloatField(default=0)),
- ("history_id", models.AutoField(primary_key=True, serialize=False)),
- ("history_date", models.DateTimeField()),
- ("history_change_reason", models.CharField(max_length=100, null=True)),
- (
- "history_type",
- models.CharField(choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1),
- ),
- (
- "history_user",
- models.ForeignKey(
- null=True,
- on_delete=django.db.models.deletion.SET_NULL,
- related_name="+",
- to=settings.AUTH_USER_MODEL,
- ),
- ),
- (
- "project_attribute",
- models.ForeignKey(
- blank=True,
- db_constraint=False,
- null=True,
- on_delete=django.db.models.deletion.DO_NOTHING,
- related_name="+",
- to="project.projectattribute",
- ),
- ),
- ],
- options={
- "verbose_name": "historical project attribute usage",
- "ordering": ("-history_date", "-history_id"),
- "get_latest_by": "history_date",
- },
- bases=(simple_history.models.HistoricalChanges, models.Model),
- ),
- migrations.CreateModel(
- name="HistoricalProjectAttributeType",
- fields=[
- ("id", models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name="ID")),
- (
- "created",
- model_utils.fields.AutoCreatedField(
- default=django.utils.timezone.now, editable=False, verbose_name="created"
- ),
- ),
- (
- "modified",
- model_utils.fields.AutoLastModifiedField(
- default=django.utils.timezone.now, editable=False, verbose_name="modified"
- ),
- ),
- ("name", models.CharField(max_length=50)),
- ("has_usage", models.BooleanField(default=False)),
- ("is_required", models.BooleanField(default=False)),
- ("is_unique", models.BooleanField(default=False)),
- ("is_private", models.BooleanField(default=True)),
- ("is_changeable", models.BooleanField(default=False)),
- ("history_id", models.AutoField(primary_key=True, serialize=False)),
- ("history_date", models.DateTimeField()),
- ("history_change_reason", models.CharField(max_length=100, null=True)),
- (
- "history_type",
- models.CharField(choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1),
- ),
- (
- "attribute_type",
- models.ForeignKey(
- blank=True,
- db_constraint=False,
- null=True,
- on_delete=django.db.models.deletion.DO_NOTHING,
- related_name="+",
- to="project.attributetype",
- ),
- ),
- (
- "history_user",
- models.ForeignKey(
- null=True,
- on_delete=django.db.models.deletion.SET_NULL,
- related_name="+",
- to=settings.AUTH_USER_MODEL,
- ),
- ),
- ],
- options={
- "verbose_name": "historical project attribute type",
- "ordering": ("-history_date", "-history_id"),
- "get_latest_by": "history_date",
- },
- bases=(simple_history.models.HistoricalChanges, models.Model),
- ),
- migrations.CreateModel(
- name="HistoricalProjectAttribute",
- fields=[
- ("id", models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name="ID")),
- (
- "created",
- model_utils.fields.AutoCreatedField(
- default=django.utils.timezone.now, editable=False, verbose_name="created"
- ),
- ),
- (
- "modified",
- model_utils.fields.AutoLastModifiedField(
- default=django.utils.timezone.now, editable=False, verbose_name="modified"
- ),
- ),
- ("value", models.CharField(max_length=128)),
- ("history_id", models.AutoField(primary_key=True, serialize=False)),
- ("history_date", models.DateTimeField()),
- ("history_change_reason", models.CharField(max_length=100, null=True)),
- (
- "history_type",
- models.CharField(choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1),
- ),
- (
- "history_user",
- models.ForeignKey(
- null=True,
- on_delete=django.db.models.deletion.SET_NULL,
- related_name="+",
- to=settings.AUTH_USER_MODEL,
- ),
- ),
- (
- "proj_attr_type",
- models.ForeignKey(
- blank=True,
- db_constraint=False,
- null=True,
- on_delete=django.db.models.deletion.DO_NOTHING,
- related_name="+",
- to="project.projectattributetype",
- ),
- ),
- (
- "project",
- models.ForeignKey(
- blank=True,
- db_constraint=False,
- null=True,
- on_delete=django.db.models.deletion.DO_NOTHING,
- related_name="+",
- to="project.project",
- ),
- ),
- ],
- options={
- "verbose_name": "historical project attribute",
- "ordering": ("-history_date", "-history_id"),
- "get_latest_by": "history_date",
- },
- bases=(simple_history.models.HistoricalChanges, models.Model),
- ),
- ]
diff --git a/coldfront/core/project/migrations/0004_auto_20230406_1133.py b/coldfront/core/project/migrations/0004_auto_20230406_1133.py
deleted file mode 100644
index c9bedc5508..0000000000
--- a/coldfront/core/project/migrations/0004_auto_20230406_1133.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# SPDX-FileCopyrightText: (C) ColdFront Authors
-#
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-# Generated by Django 3.2.17 on 2023-04-06 15:33
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
- dependencies = [
- ("project", "0003_auto_20221013_1215"),
- ]
-
- operations = [
- migrations.AlterField(
- model_name="projectstatuschoice",
- name="name",
- field=models.CharField(max_length=64, unique=True),
- ),
- migrations.AlterField(
- model_name="projectuserrolechoice",
- name="name",
- field=models.CharField(max_length=64, unique=True),
- ),
- migrations.AlterField(
- model_name="projectuserstatuschoice",
- name="name",
- field=models.CharField(max_length=64, unique=True),
- ),
- ]
diff --git a/coldfront/core/project/migrations/0005_alter_historicalproject_options_and_more.py b/coldfront/core/project/migrations/0005_alter_historicalproject_options_and_more.py
index e34e2cf50a..c784856a9c 100644
--- a/coldfront/core/project/migrations/0005_alter_historicalproject_options_and_more.py
+++ b/coldfront/core/project/migrations/0005_alter_historicalproject_options_and_more.py
@@ -11,7 +11,7 @@
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
- ("project", "0004_auto_20230406_1133"),
+ ("project", "0002_auto_20220721_1202_squashed_0011_alter_project_options_and_more"),
]
operations = [
@@ -109,8 +109,4 @@ class Migration(migrations.Migration):
name="history_date",
field=models.DateTimeField(db_index=True),
),
- migrations.AlterUniqueTogether(
- name="project",
- unique_together={("title", "pi")},
- ),
]
diff --git a/coldfront/core/project/migrations/0007_remove_historicalproject_class_number_and_more.py b/coldfront/core/project/migrations/0007_remove_historicalproject_class_number_and_more.py
new file mode 100644
index 0000000000..6822ad724a
--- /dev/null
+++ b/coldfront/core/project/migrations/0007_remove_historicalproject_class_number_and_more.py
@@ -0,0 +1,28 @@
+# Generated by Django 4.2.23 on 2025-10-22 17:59
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("project", "0006_historicalproject_institution_project_institution"),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name="historicalproject",
+ name="class_number",
+ ),
+ migrations.RemoveField(
+ model_name="historicalproject",
+ name="pi_username",
+ ),
+ migrations.RemoveField(
+ model_name="project",
+ name="class_number",
+ ),
+ migrations.RemoveField(
+ model_name="project",
+ name="pi_username",
+ ),
+ ]
diff --git a/coldfront/core/project/migrations/0008_alter_project_description_alter_project_title.py b/coldfront/core/project/migrations/0008_alter_project_description_alter_project_title.py
new file mode 100644
index 0000000000..695d63024e
--- /dev/null
+++ b/coldfront/core/project/migrations/0008_alter_project_description_alter_project_title.py
@@ -0,0 +1,33 @@
+# Generated by Django 4.2.23 on 2025-11-20 13:32
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("project", "0007_remove_historicalproject_class_number_and_more"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="project",
+ name="description",
+ field=models.TextField(
+ db_collation="utf8mb4_unicode_ci",
+ default="",
+ help_text="\nPlease provide a brief description or abstract about your project including any applications or\nworkflows you intend to use, and how you primarily intend to use the system, including if PHI will\nbe stored. Please include your area of research and your department. If this is for a class please\nput the approximate class size.\n",
+ validators=[
+ django.core.validators.MinLengthValidator(
+ 10, "The project description must be > 10 characters."
+ )
+ ],
+ ),
+ ),
+ migrations.AlterField(
+ model_name="project",
+ name="title",
+ field=models.CharField(db_collation="utf8mb4_unicode_ci", max_length=255),
+ ),
+ ]
diff --git a/coldfront/core/project/models.py b/coldfront/core/project/models.py
index db2341a531..3373b5937c 100644
--- a/coldfront/core/project/models.py
+++ b/coldfront/core/project/models.py
@@ -17,6 +17,11 @@
from coldfront.core.utils.validate import AttributeValidator
PROJECT_ENABLE_PROJECT_REVIEW = import_from_settings("PROJECT_ENABLE_PROJECT_REVIEW", False)
+PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING = import_from_settings("PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING", 60)
+PROJECT_DAYS_TO_REVIEW_BEFORE_EXPIRING = import_from_settings("PROJECT_DAYS_TO_REVIEW_BEFORE_EXPIRING", 30)
+PROJECT_ENABLE_PERMISSIONS_PER_TYPE = import_from_settings("PROJECT_ENABLE_PERMISSIONS_PER_TYPE", False)
+if PROJECT_ENABLE_PERMISSIONS_PER_TYPE:
+ PROJECT_PERMISSIONS_PER_TYPE = import_from_settings("PROJECT_PERMISSIONS_PER_TYPE")
class ProjectPermission(Enum):
@@ -52,57 +57,96 @@ def natural_key(self):
return (self.name,)
+class ProjectTypeChoice(TimeStampedModel):
+ """A project type choice indicates the type of project. Examples include Research and Class.
+ This can effect the projects end date.
+
+ Attributes:
+ name (str): name of project type
+ """
+
+ name = models.CharField(max_length=64)
+
+ def __str__(self):
+ return self.name
+
+ class Meta:
+ ordering = ("name",)
+
+
class Project(TimeStampedModel):
"""A project is a container that includes users, allocations, publications, grants, and other research output.
Attributes:
title (str): name of the project
pi (User): represents the User object of the project's PI
+ requestor (User): represents the User object of the project's requestor
description (str): description of the project
+ slurm_account_name (str): slurm account assigned to the project
field_of_science (FieldOfScience): represents the field of science for this project
+ type (ProjectTypeChoice): respresents the ProjectTypeChoice of this project
+ private (bool): indicates if the project should be found in the PI search function
status (ProjectStatusChoice): represents the ProjectStatusChoice of this project
force_review (bool): indicates whether or not to force a review for the project
requires_review (bool): indicates whether or not the project requires review
+ max_managers (int): maximum managers allowed in the project
"""
class Meta:
ordering = ["title"]
- unique_together = ("title", "pi")
+ # unique_together = ("title", "pi")
permissions = (
("can_view_all_projects", "Can view all projects"),
- ("can_review_pending_project_reviews", "Can review pending project reviews"),
+ ("can_review_pending_projects", "Can review pending project requests/reviews"),
)
class ProjectManager(models.Manager):
def get_by_natural_key(self, title, pi_username):
return self.get(title=title, pi__username=pi_username)
- DEFAULT_DESCRIPTION = """
-We do not have information about your research. Please provide a detailed description of your work and update your field of science. Thank you!
- """
+ DEFAULT_DESCRIPTION = ""
+ DESCRIPTION_HELP_TEXT = """
+Please provide a brief description or abstract about your project including any applications or
+workflows you intend to use, and how you primarily intend to use the system, including if PHI will
+be stored. Please include your area of research and your department. If this is for a class please
+put the approximate class size.
+"""
- title = models.CharField(
- max_length=255,
- )
+ title = models.CharField(max_length=255, db_collation="utf8mb4_unicode_ci")
pi = models.ForeignKey(
User,
on_delete=models.CASCADE,
)
+ requestor = models.ForeignKey(User, on_delete=models.CASCADE, related_name="requestor_user")
description = models.TextField(
default=DEFAULT_DESCRIPTION,
+ help_text=DESCRIPTION_HELP_TEXT,
validators=[
MinLengthValidator(
10,
"The project description must be > 10 characters.",
)
],
+ db_collation="utf8mb4_unicode_ci",
)
+ slurm_account_name = models.CharField(max_length=15, blank=True, null=True, unique=True)
field_of_science = models.ForeignKey(FieldOfScience, on_delete=models.CASCADE, default=FieldOfScience.DEFAULT_PK)
+ type = models.ForeignKey(
+ ProjectTypeChoice,
+ on_delete=models.CASCADE,
+ help_text="This cannot be changed once your project is submitted. Class projects expire at the end of every semester. Research projects expire once a year.",
+ )
+ private = models.BooleanField(
+ default=False,
+ help_text="A private project will not show up in the PI search results if someone searchs for you/your PI.",
+ )
status = models.ForeignKey(ProjectStatusChoice, on_delete=models.CASCADE)
force_review = models.BooleanField(default=False)
requires_review = models.BooleanField(default=True)
+ end_date = models.DateField()
+ max_managers = models.IntegerField(default=3)
history = HistoricalRecords()
objects = ProjectManager()
project_code = models.CharField(max_length=10, blank=True)
@@ -116,12 +160,6 @@ def clean(self):
'You must update the project title. You cannot have "Auto-Import Project" in the title.'
)
- if (
- "We do not have information about your research. Please provide a detailed description of your work and update your field of science. Thank you!"
- in self.description
- ):
- raise ValidationError("You must update the project description.")
-
@property
def last_project_review(self):
"""
@@ -164,11 +202,16 @@ def needs_review(self):
Returns:
bool: whether or not the project needs review
"""
-
- if self.status.name == "Archived":
+ if not self.get_env.get("renewable"):
return False
- now = datetime.datetime.now(datetime.timezone.utc)
+ if self.status.name in [
+ "Archived",
+ "Denied",
+ "Review Pending",
+ "Renewal Denied",
+ ]:
+ return False
if self.force_review is True:
return True
@@ -179,23 +222,18 @@ def needs_review(self):
if self.requires_review is False:
return False
- if self.projectreview_set.exists():
- last_review = self.projectreview_set.order_by("-created")[0]
- last_review_over_365_days = (now - last_review.created).days > 365
- else:
- last_review = None
-
- days_since_creation = (now - self.created).days
+ if self.status.name == "Active" and self.expires_in <= PROJECT_DAYS_TO_REVIEW_BEFORE_EXPIRING:
+ return True
- if days_since_creation > 365 and last_review is None:
+ if self.status.name == "Expired" and PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING < 0:
return True
- if last_review and last_review_over_365_days:
+ if self.status.name == "Expired" and self.expires_in >= -PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING:
return True
return False
- def user_permissions(self, user):
+ def user_permissions(self, user, permission=None):
"""
Params:
user (User): represents the user whose permissions are to be retrieved
@@ -207,11 +245,13 @@ def user_permissions(self, user):
if user.is_superuser:
return list(ProjectPermission)
+ permissions = [ProjectPermission.USER]
user_conditions = models.Q(status__name__in=("Active", "New")) & models.Q(user=user)
if not self.projectuser_set.filter(user_conditions).exists():
- return []
-
- permissions = [ProjectPermission.USER]
+ if permission and user.has_perm(permission):
+ permissions.append(ProjectPermission.MANAGER)
+ else:
+ return []
if self.projectuser_set.filter(user_conditions & models.Q(role__name="Manager")).exists():
permissions.append(ProjectPermission.MANAGER)
@@ -224,7 +264,7 @@ def user_permissions(self, user):
return permissions
- def has_perm(self, user, perm):
+ def has_perm(self, user, perm, addtl_perm=None):
"""
Params:
user (User): user to check permissions for
@@ -234,15 +274,57 @@ def has_perm(self, user, perm):
bool: whether or not the user has the specified permission
"""
- perms = self.user_permissions(user)
+ perms = self.user_permissions(user, addtl_perm)
return perm in perms
+ @property
+ def expires_in(self):
+ """
+ Returns:
+ bool: number of days until the project expires
+ """
+ return (self.end_date - datetime.date.today()).days
+
+ @property
+ def list_of_manager_usernames(self):
+ """
+ Returns:
+ bool: the list of managers in the project
+ """
+ project_managers = self.projectuser_set.filter(role=ProjectUserRoleChoice.objects.get(name="Manager"))
+ return [manager.user.username for manager in project_managers]
+
+ def get_current_num_managers(self):
+ """
+ Returns:
+ bool: the current number of managers
+ """
+ return self.projectuser_set.filter(
+ role=ProjectUserRoleChoice.objects.get(name="Manager"),
+ status=ProjectUserStatusChoice.objects.get(name="Active"),
+ ).count()
+
+ def check_exceeds_max_managers(self, num_added_managers=0):
+ """
+ Returns:
+ bool: whether or not the number of added managers exceeds the max allowed managers
+ """
+ return (self.get_current_num_managers() + num_added_managers) > self.max_managers
+
def __str__(self):
return self.title
def natural_key(self):
return (self.title,) + self.pi.natural_key()
+ @property
+ def get_env(self):
+ default_env = PROJECT_PERMISSIONS_PER_TYPE.get("Default")
+ if not PROJECT_ENABLE_PERMISSIONS_PER_TYPE or PROJECT_PERMISSIONS_PER_TYPE.get(self.type.name) is None:
+ return default_env
+
+ return default_env | PROJECT_PERMISSIONS_PER_TYPE.get(self.type.name)
+
class ProjectAdminComment(TimeStampedModel):
"""A project admin comment is a comment that an admin can make on a project.
@@ -304,12 +386,14 @@ class ProjectReview(TimeStampedModel):
Attributes:
project (Project): links the project to its review
status (ProjectReviewStatusChoice): links the project review to its status
- reason_for_not_updating_project (str): text input from the user indicating why the project was not updated
+ project_updates (str): text input from the user about what updates their project has
+ allocation_renewals (str): text that contains the IDs of the allocations that should be renewed
"""
project = models.ForeignKey(Project, on_delete=models.CASCADE)
status = models.ForeignKey(ProjectReviewStatusChoice, on_delete=models.CASCADE, verbose_name="Status")
- reason_for_not_updating_project = models.TextField(blank=True, null=True)
+ project_updates = models.TextField(blank=True, null=True)
+ allocation_renewals = models.TextField(blank=True, null=True)
history = HistoricalRecords()
@@ -503,3 +587,31 @@ class ProjectAttributeUsage(TimeStampedModel):
def __str__(self):
return "{}: {}".format(self.project_attribute.proj_attr_type.name, self.value)
+
+
+class ProjectAdminAction(TimeStampedModel):
+ """Project admin action tracks what an admin is doing on the site.
+
+ Attributes:
+ user (User): who the admin was
+ project (Project): the project the action was done on
+ action (str): what the admin did on the site
+ """
+
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
+ project = models.ForeignKey(Project, on_delete=models.CASCADE)
+ action = models.CharField(max_length=256)
+
+
+class ProjectDescriptionRecord(TimeStampedModel):
+ """Project description record keeps a record of previous project descriptions after they are updated.
+
+ Attributes:
+ project (project): projetc that had its description updated
+ user (user): who updated the description
+ description (str): the previous description
+ """
+
+ project = models.ForeignKey(Project, on_delete=models.CASCADE)
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
+ description = models.TextField()
diff --git a/coldfront/core/project/signals.py b/coldfront/core/project/signals.py
index fc4b0c5c87..3e8179d8f8 100644
--- a/coldfront/core/project/signals.py
+++ b/coldfront/core/project/signals.py
@@ -18,3 +18,7 @@
project_remove_user = django.dispatch.Signal()
# providing_args=["project_user_pk"]
+
+project_activate = django.dispatch.Signal()
+
+project_user_role_changed = django.dispatch.Signal()
diff --git a/coldfront/core/project/tasks.py b/coldfront/core/project/tasks.py
new file mode 100644
index 0000000000..58ddaf8449
--- /dev/null
+++ b/coldfront/core/project/tasks.py
@@ -0,0 +1,162 @@
+import datetime
+import logging
+
+from django.conf import settings
+from django.contrib.auth.models import User
+
+from coldfront.core.project.models import Project, ProjectStatusChoice
+from coldfront.core.project.utils import get_ineligible_pis
+from coldfront.core.utils.common import import_from_settings
+from coldfront.core.utils.mail import send_email_template
+
+if "coldfront.plugins.ldap_misc" in settings.INSTALLED_APPS:
+ from coldfront.plugins.ldap_misc.utils.project import get_ineligible_pis
+
+logger = logging.getLogger(__name__)
+
+CENTER_NAME = import_from_settings("CENTER_NAME")
+CENTER_BASE_URL = import_from_settings("CENTER_BASE_URL")
+CENTER_PROJECT_RENEWAL_HELP_URL = import_from_settings("CENTER_PROJECT_RENEWAL_HELP_URL")
+EMAIL_ENABLED = import_from_settings("EMAIL_ENABLED")
+
+if EMAIL_ENABLED:
+ EMAIL_SENDER = import_from_settings("EMAIL_SENDER")
+ EMAIL_OPT_OUT_INSTRUCTION_URL = import_from_settings("EMAIL_OPT_OUT_INSTRUCTION_URL")
+ EMAIL_SIGNATURE = import_from_settings("EMAIL_SIGNATURE")
+ EMAIL_PROJECT_EXPIRING_NOTIFICATION_DAYS = import_from_settings(
+ "EMAIL_PROJECT_EXPIRING_NOTIFICATION_DAYS",
+ [
+ 7,
+ ],
+ )
+ EMAIL_TICKET_SYSTEM_ADDRESS = import_from_settings("EMAIL_TICKET_SYSTEM_ADDRESS")
+
+ADDITIONAL_USER_SEARCH_CLASSES = import_from_settings("ADDITIONAL_USER_SEARCH_CLASSES", [])
+
+
+def update_statuses():
+ expired_status_choice = ProjectStatusChoice.objects.get(name="Expired")
+ projects_to_expire = Project.objects.filter(
+ status__name="Active", end_date__lt=datetime.datetime.now().date(), requires_review=True
+ )
+ for project in projects_to_expire:
+ project.status = expired_status_choice
+ project.save()
+
+ logger.info(f"Projects set to expired: {projects_to_expire.count()}")
+
+
+def send_expiry_emails():
+ if not EMAIL_ENABLED:
+ return
+
+ # Expiring projects
+ for user in User.objects.all():
+ for days_remaining in sorted(set(EMAIL_PROJECT_EXPIRING_NOTIFICATION_DAYS)):
+ projects = []
+ expiring_in_days = (datetime.datetime.today() + datetime.timedelta(days=days_remaining)).date()
+
+ for project_user in user.projectuser_set.filter(status__name="Active"):
+ if not project_user.enable_notifications:
+ continue
+
+ project = project_user.project
+ if project.status.name == "Active" and (project.end_date == expiring_in_days):
+ if not project.requires_review:
+ continue
+
+ project_url = f"{CENTER_BASE_URL.strip('/')}/{'project'}/{project.pk}/"
+
+ allocations = []
+ for allocation in project.allocation_set.filter(status__name="Active"):
+ if not project_user.role.name == "Manager":
+ allocation_user = allocation.allocationuser_set.filter(
+ status__name__in=["Active", "Invited", "Disabled"], user=user
+ )
+ if not allocation_user.exists():
+ continue
+
+ allocations.append(allocation)
+
+ projects.append(
+ {
+ "project": project,
+ "project_url": project_url,
+ "expiring_in_days": expiring_in_days,
+ "allocations": allocations,
+ }
+ )
+
+ if projects:
+ template_context = {
+ "center_name": CENTER_NAME,
+ "expiring_in_days": days_remaining,
+ "project_dict": projects,
+ "project_renewal_help_url": CENTER_PROJECT_RENEWAL_HELP_URL,
+ "help_email": EMAIL_TICKET_SYSTEM_ADDRESS,
+ "signature": EMAIL_SIGNATURE,
+ }
+ send_email_template(
+ f"Access to your {CENTER_NAME} projects is expiring soon",
+ "email/project_expiring.txt",
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ [user.email],
+ )
+
+ logger.debug(f"Project(s) expiring email sent to user {user}.")
+
+ # Expired projects
+ for user in User.objects.all():
+ expiring_in_days = (datetime.datetime.today() + datetime.timedelta(days=-1)).date()
+
+ for project_user in user.projectuser_set.filter(status__name="Active"):
+ projects = []
+ project = project_user.project
+
+ if project.status.name == "Active" and (project.end_date == expiring_in_days):
+ if not project.requires_review:
+ continue
+
+ project_url = f"{CENTER_BASE_URL.strip('/')}/{'project'}/{project.pk}/"
+
+ allocations = []
+ for allocation in project.allocation_set.filter(status__name="Active"):
+ if not project_user.role.name == "Manager":
+ allocation_user = allocation.allocationuser_set.filter(
+ status__name__in=["Active", "Invited", "Disabled"], user=user
+ )
+ if not allocation_user.exists():
+ continue
+
+ allocations.append(allocation)
+
+ projects.append({"project": project, "project_url": project_url, "allocations": allocations})
+
+ if projects:
+ template_context = {
+ "center_name": CENTER_NAME,
+ "project_dict": projects,
+ "project_renewal_help_url": CENTER_PROJECT_RENEWAL_HELP_URL,
+ "help_email": EMAIL_TICKET_SYSTEM_ADDRESS,
+ "signature": EMAIL_SIGNATURE,
+ }
+ send_email_template(
+ f"Access to your {CENTER_NAME} projects has expired",
+ "email/project_expired.txt",
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ [user.email],
+ )
+
+ logger.debug(f"Project(s) expired email sent to user {user}.")
+
+
+def check_ineligible_pis():
+ logger.info("Checking PI eligibilities...")
+ ineligible_pis = get_ineligible_pis(
+ Project.objects.filter(status__name="Active").values_list("pi__username", flat=True)
+ )
+ if ineligible_pis:
+ logger.warning(f"PIs {', '.join(ineligible_pis)} are no longer eligible to be PIs")
+ logger.info("Done checking PI eligibilities")
diff --git a/coldfront/core/project/tests/test_views.py b/coldfront/core/project/tests/test_views.py
index 116fdd2619..a4ef0029a1 100644
--- a/coldfront/core/project/tests/test_views.py
+++ b/coldfront/core/project/tests/test_views.py
@@ -32,8 +32,7 @@ def setUpTestData(cls):
cls.project = ProjectFactory(status=ProjectStatusChoiceFactory(name="Active"))
user_role = ProjectUserRoleChoiceFactory(name="User")
- project_user = ProjectUserFactory(project=cls.project, role=user_role)
- cls.project_user = project_user.user
+ cls.project_user = ProjectUserFactory(project=cls.project, role=user_role)
manager_role = ProjectUserRoleChoiceFactory(name="Manager")
pi_user = ProjectUserFactory(project=cls.project, role=manager_role, user=cls.project.pi)
@@ -70,7 +69,7 @@ def test_projectdetail_access(self):
self.project_access_tstbase(self.url)
# pi and projectuser can access
utils.test_user_can_access(self, self.pi_user, self.url)
- utils.test_user_can_access(self, self.project_user, self.url)
+ utils.test_user_can_access(self, self.project_user.user, self.url)
# user not belonging to project cannot access
utils.test_user_cannot_access(self, self.nonproject_user, self.url)
@@ -83,7 +82,7 @@ def test_projectdetail_permissions(self):
response = utils.login_and_get_page(self.client, self.pi_user, self.url)
self.assertEqual(response.context["is_allowed_to_update_project"], True)
# non-manager user has is_allowed_to_update_project set to False
- response = utils.login_and_get_page(self.client, self.project_user, self.url)
+ response = utils.login_and_get_page(self.client, self.project_user.user, self.url)
self.assertEqual(response.context["is_allowed_to_update_project"], False)
def test_projectdetail_request_allocation_button_visibility(self):
@@ -94,7 +93,7 @@ def test_projectdetail_request_allocation_button_visibility(self):
# pi can see request allocation button
utils.page_contains_for_user(self, self.pi_user, self.url, button_text)
# non-manager user cannot see request allocation button
- utils.page_does_not_contain_for_user(self, self.project_user, self.url, button_text)
+ utils.page_does_not_contain_for_user(self, self.project_user.user, self.url, button_text)
def test_projectdetail_edituser_button_visibility(self):
"""Test visibility of projectdetail edit button across user levels"""
@@ -103,7 +102,7 @@ def test_projectdetail_edituser_button_visibility(self):
# pi can see edit button
utils.page_contains_for_user(self, self.pi_user, self.url, "fa-user-edit")
# non-manager user cannot see edit button
- utils.page_does_not_contain_for_user(self, self.project_user, self.url, "fa-user-edit")
+ utils.page_does_not_contain_for_user(self, self.project_user.user, self.url, "fa-user-edit")
def test_projectdetail_addnotification_button_visibility(self):
"""Test visibility of projectdetail add notification button across user levels"""
@@ -112,7 +111,16 @@ def test_projectdetail_addnotification_button_visibility(self):
# pi cannot see add notification button
utils.page_does_not_contain_for_user(self, self.pi_user, self.url, "Add Notification")
# non-manager user cannot see add notification button
- utils.page_does_not_contain_for_user(self, self.project_user, self.url, "Add Notification")
+ utils.page_does_not_contain_for_user(self, self.project_user.user, self.url, "Add Notification")
+
+ def test_projectdetail_adduser_button_visibility(self):
+ """Test visibility of projectdetail add user button across user levels"""
+ # admin can see add user button
+ utils.page_contains_for_user(self, self.admin_user, self.url, "Add Users")
+ # pi can see add user button
+ utils.page_contains_for_user(self, self.pi_user, self.url, "Add Users")
+ # non-manager user cannot see add user button
+ utils.page_does_not_contain_for_user(self, self.project_user.user, self.url, "Add Users")
class ProjectCreateTest(ProjectViewTestBase):
@@ -130,7 +138,7 @@ def test_project_access(self):
self.project_access_tstbase(self.url)
# pi, projectuser and nonproject user cannot access create page
utils.test_user_cannot_access(self, self.pi_user, self.url)
- utils.test_user_cannot_access(self, self.project_user, self.url)
+ utils.test_user_cannot_access(self, self.project_user.user, self.url)
utils.test_user_cannot_access(self, self.nonproject_user, self.url)
@@ -150,9 +158,9 @@ def test_project_access(self):
# logged-out user gets redirected, admin can access create page
self.project_access_tstbase(self.url)
# pi can access create page
- utils.test_user_can_access(self, self.pi_user, self.url)
+ # utils.test_user_can_access(self, self.pi_user, self.url)
# project user and nonproject user cannot access create page
- utils.test_user_cannot_access(self, self.project_user, self.url)
+ utils.test_user_cannot_access(self, self.project_user.user, self.url)
utils.test_user_cannot_access(self, self.nonproject_user, self.url)
def test_project_attribute_create_post(self):
@@ -207,9 +215,9 @@ def setUpTestData(cls):
def test_project_attribute_update_access(self):
"""Test access to project attribute update page"""
self.project_access_tstbase(self.url)
- utils.test_user_can_access(self, self.pi_user, self.url)
+ # utils.test_user_can_access(self, self.pi_user, self.url)
# project user, pi, and nonproject user cannot access update page
- utils.test_user_cannot_access(self, self.project_user, self.url)
+ utils.test_user_cannot_access(self, self.project_user.user, self.url)
utils.test_user_cannot_access(self, self.nonproject_user, self.url)
@@ -230,9 +238,9 @@ def test_project_attribute_delete_access(self):
# logged-out user gets redirected, admin can access delete page
self.project_access_tstbase(self.url)
# pi can access delete page
- utils.test_user_can_access(self, self.pi_user, self.url)
+ # utils.test_user_can_access(self, self.pi_user, self.url)
# project user and nonproject user cannot access delete page
- utils.test_user_cannot_access(self, self.project_user, self.url)
+ utils.test_user_cannot_access(self, self.project_user.user, self.url)
utils.test_user_cannot_access(self, self.nonproject_user, self.url)
@@ -256,7 +264,7 @@ def test_project_list_access(self):
self.project_access_tstbase(self.url)
# all other users can access list page
utils.test_user_can_access(self, self.pi_user, self.url)
- utils.test_user_can_access(self, self.project_user, self.url)
+ utils.test_user_can_access(self, self.project_user.user, self.url)
utils.test_user_can_access(self, self.nonproject_user, self.url)
### ProjectListView display tests ###
@@ -264,12 +272,12 @@ def test_project_list_access(self):
def test_project_list_display_members(self):
"""Project list displays only projects that user is an active member of"""
# deactivated projectuser won't see project on their page
- response = utils.login_and_get_page(self.client, self.project_user, self.url)
+ response = utils.login_and_get_page(self.client, self.project_user.user, self.url)
self.assertEqual(len(response.context["object_list"]), 1)
- proj_user = self.project.projectuser_set.get(user=self.project_user)
+ proj_user = self.project.projectuser_set.get(user=self.project_user.user)
proj_user.status, _ = ProjectUserStatusChoice.objects.get_or_create(name="Removed")
proj_user.save()
- response = utils.login_and_get_page(self.client, self.project_user, self.url)
+ response = utils.login_and_get_page(self.client, self.project_user.user, self.url)
self.assertEqual(len(response.context["object_list"]), 0)
def test_project_list_displayall_permission_admin(self):
@@ -287,7 +295,7 @@ def test_project_list_displayall_permission_pi(self):
def test_project_list_displayall_permission_project_user(self):
"""Projectlist displayall displays only projects projectuser belongs to"""
url = self.url + "?show_all_projects=on"
- response = utils.login_and_get_page(self.client, self.project_user, url)
+ response = utils.login_and_get_page(self.client, self.project_user.user, url)
self.assertEqual(len(response.context["object_list"]), 1)
### ProjectListView search tests ###
diff --git a/coldfront/core/project/tests/tests.py b/coldfront/core/project/tests/tests.py
index 39a9676833..d294ca9144 100644
--- a/coldfront/core/project/tests/tests.py
+++ b/coldfront/core/project/tests/tests.py
@@ -16,6 +16,7 @@
from coldfront.core.project.utils import (
determine_automated_institution_choice,
generate_project_code,
+ get_new_end_date_from_list,
)
from coldfront.core.test_helpers.factories import (
FieldOfScienceFactory,
@@ -24,6 +25,7 @@
ProjectAttributeTypeFactory,
ProjectFactory,
ProjectStatusChoiceFactory,
+ ProjectTypeChoiceFactory,
UserFactory,
)
@@ -40,14 +42,23 @@ def __init__(self):
field_of_science = FieldOfScienceFactory(description="Chemistry")
status = ProjectStatusChoiceFactory(name="Active")
+ type = ProjectTypeChoiceFactory(name="Research")
+ end_date = get_new_end_date_from_list(
+ [
+ (6, 30),
+ ],
+ )
self.initial_fields = {
"pi": user,
+ "requestor": user,
"title": "Angular momentum in QGP holography",
"description": "We want to estimate the quark chemical potential of a rotating sample of plasma.",
"field_of_science": field_of_science,
"status": status,
+ "type": type,
"force_review": True,
+ "end_date": end_date,
}
self.unsaved_object = Project(**self.initial_fields)
@@ -120,16 +131,16 @@ def test_description_minlength(self):
retrieved_obj = Project.objects.get(pk=project_obj.pk)
self.assertEqual(minimum_description, retrieved_obj.description)
- def test_description_update_required_initially(self):
- """
- Test that project descriptions must be changed from the default value.
- """
- project_obj = self.data.unsaved_object
- assert project_obj.pk is None
+ # def test_description_update_required_initially(self):
+ # """
+ # Test that project descriptions must be changed from the default value.
+ # """
+ # project_obj = self.data.unsaved_object
+ # assert project_obj.pk is None
- project_obj.description = project_obj.DEFAULT_DESCRIPTION
- with self.assertRaises(ValidationError):
- project_obj.clean()
+ # project_obj.description = project_obj.DEFAULT_DESCRIPTION
+ # with self.assertRaises(ValidationError):
+ # project_obj.clean()
def test_pi_foreignkey_on_delete(self):
"""Test that a project is deleted when its PI is deleted."""
@@ -173,6 +184,29 @@ def test_status_foreignkey_on_delete(self):
Project.objects.get(pk=project_obj.pk)
self.assertEqual(0, len(Project.objects.all()))
+ def test_type_foreignkey_on_delete(self):
+ """Test that a project is deleted when its type is deleted."""
+ project_obj = self.data.unsaved_object
+ project_obj.save()
+
+ self.assertEqual(1, len(Project.objects.all()))
+
+ project_obj.type.delete()
+
+ # expecting CASCADE
+ with self.assertRaises(Project.DoesNotExist):
+ Project.objects.get(pk=project_obj.pk)
+ self.assertEqual(0, len(Project.objects.all()))
+
+ # @patch("coldfront.config.core.PROJECT_END_DATE_CARRYOVER_DAYS", 30)
+ # def test_end_date_set_from_type(self):
+ # """Test that a project's end date is set correctly based on its type."""
+ # from coldfront.config.core import PROJECT_END_DATE_CARRYOVER_DAYS
+ # project_obj = self.data.unsaved_object
+ # project_obj.end_date = get_new_end_date_from_list(
+ # project_obj.get_env.get("expiry_dates"), datetime.date(datetime.date.today().year, 2, 10)
+ # )
+
class TestProjectAttribute(TestCase):
@classmethod
@@ -221,6 +255,12 @@ def setUp(self):
self.user = UserFactory(username="capeo")
self.field_of_science = FieldOfScienceFactory(description="Physics")
self.status = ProjectStatusChoiceFactory(name="Active")
+ self.type = ProjectTypeChoiceFactory(name="Research")
+ self.end_date = get_new_end_date_from_list(
+ [
+ (6, 30),
+ ],
+ )
def create_project_with_code(self, title, project_code, project_code_padding=0):
"""Helper method to create a project and a project code with a specific prefix and padding"""
@@ -228,8 +268,11 @@ def create_project_with_code(self, title, project_code, project_code_padding=0):
project = Project.objects.create(
title=title,
pi=self.user,
+ requestor=self.user,
status=self.status,
+ type=self.type,
field_of_science=self.field_of_science,
+ end_date=self.end_date,
)
project.project_code = generate_project_code(project_code, project.pk, project_code_padding)
@@ -247,7 +290,7 @@ def test_project_code_increment_after_deletion(self):
# Create the first project
project_with_code_padding1 = self.create_project_with_code("Project 1", PROJECT_CODE, PROJECT_CODE_PADDING)
- self.assertEqual(project_with_code_padding1, "BFO001")
+ self.assertEqual(project_with_code_padding1, "bfo001")
# Delete the first project
project_obj1 = Project.objects.get(title="Project 1")
@@ -255,7 +298,7 @@ def test_project_code_increment_after_deletion(self):
# Create the second project
project_with_code_padding2 = self.create_project_with_code("Project 2", PROJECT_CODE, PROJECT_CODE_PADDING)
- self.assertEqual(project_with_code_padding2, "BFO002")
+ self.assertEqual(project_with_code_padding2, "bfo002")
@patch("coldfront.config.core.PROJECT_CODE", "BFO")
def test_no_padding(self):
@@ -263,7 +306,7 @@ def test_no_padding(self):
"""Test with code and no padding"""
project_with_code = self.create_project_with_code("Project 1", PROJECT_CODE)
- self.assertEqual(project_with_code, "BFO1") # No padding
+ self.assertEqual(project_with_code, "bfo1") # No padding
@patch("coldfront.config.core.PROJECT_CODE", "BFO")
@patch("coldfront.config.core.PROJECT_CODE_PADDING", 3)
@@ -277,8 +320,8 @@ def test_different_prefix_padding(self):
project_with_code_padding2 = self.create_project_with_code("Project 2", PROJECT_CODE, PROJECT_CODE_PADDING)
# Test the generated project codes
- self.assertEqual(project_with_code_padding1, "BFO001")
- self.assertEqual(project_with_code_padding2, "BFO002")
+ self.assertEqual(project_with_code_padding1, "bfo001")
+ self.assertEqual(project_with_code_padding2, "bfo002")
class TestInstitution(TestCase):
@@ -286,6 +329,12 @@ def setUp(self):
self.user = UserFactory(username="capeo")
self.field_of_science = FieldOfScienceFactory(description="Physics")
self.status = ProjectStatusChoiceFactory(name="Active")
+ self.type = ProjectTypeChoiceFactory(name="Research")
+ self.end_date = get_new_end_date_from_list(
+ [
+ (6, 30),
+ ],
+ )
def create_project_with_institution(self, title, institution_dict=None):
"""Helper method to create a project and assign a institution value based on the argument passed"""
@@ -293,8 +342,11 @@ def create_project_with_institution(self, title, institution_dict=None):
project = Project.objects.create(
title=title,
pi=self.user,
+ requestor=self.user,
status=self.status,
+ type=self.type,
field_of_science=self.field_of_science,
+ end_date=self.end_date,
)
if institution_dict:
@@ -362,9 +414,12 @@ def test_determine_automated_institution_choice_does_not_save_to_database(self):
project = Project.objects.create(
title="Test Project",
pi=self.user,
+ requestor=self.user,
status=self.status,
+ type=self.type,
field_of_science=self.field_of_science,
institution="Default",
+ end_date=self.end_date,
)
original_db_project = Project.objects.get(id=project.id)
diff --git a/coldfront/core/project/urls.py b/coldfront/core/project/urls.py
index 1cf88e85c7..ca8c3e67d7 100644
--- a/coldfront/core/project/urls.py
+++ b/coldfront/core/project/urls.py
@@ -57,4 +57,21 @@
project_views.ProjectAttributeUpdateView.as_view(),
name="project-attribute-update",
),
+ path(
+ "project-request//email", project_views.ProjectRequestEmailView.as_view(), name="project-request-email"
+ ),
+ path(
+ "/project-activate-request/",
+ project_views.ProjectActivateRequestView.as_view(),
+ name="project-activate-request",
+ ),
+ path("/project-deny-request/", project_views.ProjectDenyRequestView.as_view(), name="project-deny-request"),
+ path(
+ "project-review-approve//",
+ project_views.ProjectReviewApproveView.as_view(),
+ name="project-review-approve",
+ ),
+ path("project-review-deny//", project_views.ProjectReviewDenyView.as_view(), name="project-review-deny"),
+ path("project-review-info//", project_views.ProjectReviewInfoView.as_view(), name="project-review-info"),
+ path("denied/", project_views.ProjectDeniedListView.as_view(), name="project-denied-list"),
]
diff --git a/coldfront/core/project/utils.py b/coldfront/core/project/utils.py
index 137ba4ab26..518ce2deba 100644
--- a/coldfront/core/project/utils.py
+++ b/coldfront/core/project/utils.py
@@ -1,6 +1,14 @@
# SPDX-FileCopyrightText: (C) ColdFront Authors
#
# SPDX-License-Identifier: AGPL-3.0-or-later
+import datetime
+import logging
+
+from django.forms.models import model_to_dict
+
+from coldfront.core.project.models import Project, ProjectAdminAction, ProjectUserRoleChoice
+
+logger = logging.getLogger(__name__)
def add_project_status_choices(apps, schema_editor):
@@ -47,7 +55,7 @@ def generate_project_code(project_code: str, project_pk: int, padding: int = 0)
:return: A formatted project code string.
"""
- return f"{project_code.upper()}{str(project_pk).zfill(padding)}"
+ return f"{project_code.lower()}{str(project_pk).zfill(padding)}"
def determine_automated_institution_choice(project, institution_map: dict):
@@ -80,3 +88,132 @@ def determine_automated_institution_choice(project, institution_map: dict):
return indirect_institution_match
return project.institution
+
+
+def get_new_end_date_from_list(raw_expire_dates, check_date=None, buffer_days=0):
+ """
+ Finds a new end date based on the given list of expire dates.
+
+ :param raw_expire_dates: List of expire dates tuples
+ :param check_date: Date that is checked against the list of expire dates. If None then it's
+ set to today
+ :param buffer_days: Number of days before the current expire date where the end date should be
+ set to the next expire date
+ :return: A new end date
+ """
+ if check_date is None:
+ check_date = datetime.date.today()
+
+ if raw_expire_dates:
+ expire_dates = []
+ for date in raw_expire_dates:
+ actual_date = datetime.date(datetime.date.today().year, date[0], date[1])
+ expire_dates.append(actual_date)
+ else:
+ expire_dates = [datetime.date.today() + datetime.timedelta(days=365)]
+
+ expire_dates.sort()
+
+ buffer_dates = [date - datetime.timedelta(days=buffer_days) for date in expire_dates]
+
+ end_date = None
+ total_dates = len(expire_dates)
+ for i in range(total_dates):
+ if check_date < expire_dates[i]:
+ if check_date >= buffer_dates[i]:
+ end_date = expire_dates[(i + 1) % total_dates]
+ if (i + 1) % total_dates == 0:
+ end_date = end_date.replace(end_date.year + 1)
+ else:
+ end_date = expire_dates[i]
+ break
+ elif i == total_dates - 1:
+ expire_date = expire_dates[0]
+ end_date = expire_date.replace(expire_date.year + 1)
+
+ return end_date
+
+
+def create_admin_action(user, fields_to_check, project, base_model=None):
+ if base_model is None:
+ base_model = project
+ base_model_dict = model_to_dict(base_model)
+
+ for key, value in fields_to_check.items():
+ base_model_value = base_model_dict.get(key)
+ if type(value) is not type(base_model_value):
+ if key == "status":
+ status_class = base_model._meta.get_field("status").remote_field.model
+ base_model_value = status_class.objects.get(pk=base_model_value).name
+ value = value.name
+ if value != base_model_value:
+ if type(base_model) is Project:
+ action = f'Changed "{key}" from "{base_model_value}" to "{value}"'
+ else:
+ action = f'For "{base_model}" changed "{key}" from "{base_model_value}" to "{value}"'
+ ProjectAdminAction.objects.create(user=user, project=project, action=action)
+
+
+def get_project_user_emails(project_obj, only_project_managers=False):
+ """
+ Returns a list of project user emails in the given project. Only emails from users with their
+ notifications enabled will be returned.
+
+ :param allocation_obj: The project to grab the project user emails from
+ :param only_project_managers: Indicates if only the project manager emails should be returned
+ """
+ project_users = project_obj.projectuser_set.filter(
+ enable_notifications=True,
+ status__name__in=[
+ "Active",
+ ],
+ )
+ if only_project_managers:
+ project_users = project_users.filter(role__name="Manager")
+ project_users = project_users.values_list("user__email", flat=True)
+
+ return list(project_users)
+
+
+def create_admin_action_for_deletion(user, deleted_obj, project, base_model=None):
+ if base_model:
+ ProjectAdminAction.objects.create(
+ user=user, project=project, action=f'Deleted "{deleted_obj}" from "{base_model}"'
+ )
+ else:
+ ProjectAdminAction.objects.create(user=user, project=project, action=f'Deleted "{deleted_obj}"')
+
+
+def create_admin_action_for_creation(user, created_obj, project, base_model=None):
+ if base_model:
+ ProjectAdminAction.objects.create(
+ user=user,
+ project=project,
+ action=f'Created "{created_obj}" in "{base_model}" with value "{created_obj.value}"',
+ )
+ else:
+ ProjectAdminAction.objects.create(
+ user=user, project=project, action=f'Created "{created_obj}" with value "{created_obj.value}"'
+ )
+
+
+def create_admin_action_for_project_creation(user, project):
+ ProjectAdminAction.objects.create(
+ user=user, project=project, action=f'Created a project with status "{project.status.name}"'
+ )
+
+
+def check_if_pis_eligible(project_pi_usernames):
+ return dict.fromkeys(project_pi_usernames, True)
+
+
+def update_project_user_matches(matches):
+ project_user_role_obj = ProjectUserRoleChoice.objects.get(name="User")
+ for match in matches:
+ match.update({"role": project_user_role_obj})
+
+ return matches
+
+
+def get_ineligible_pis(project_pi_usernames):
+ return None
diff --git a/coldfront/core/project/views.py b/coldfront/core/project/views.py
index 7c164c37d3..136894e638 100644
--- a/coldfront/core/project/views.py
+++ b/coldfront/core/project/views.py
@@ -4,6 +4,7 @@
import datetime
import logging
+import urllib
from django import forms
from django.conf import settings
@@ -15,11 +16,12 @@
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
from django.forms import formset_factory
-from django.http import HttpResponse, HttpResponseRedirect
+from django.http import HttpResponse, HttpResponseForbidden, HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
+from django.utils.html import format_html
from django.views import View
-from django.views.generic import CreateView, DetailView, ListView, UpdateView
+from django.views.generic import CreateView, DetailView, ListView
from django.views.generic.base import TemplateView
from django.views.generic.edit import FormView
@@ -28,27 +30,38 @@
Allocation,
AllocationStatusChoice,
AllocationUser,
+ AllocationUserRoleChoice,
AllocationUserStatusChoice,
)
-from coldfront.core.allocation.signals import allocation_activate_user, allocation_remove_user
-from coldfront.core.allocation.utils import generate_guauge_data_from_usage
+from coldfront.core.allocation.signals import (
+ allocation_activate_user,
+ allocation_expire,
+ allocation_remove_user,
+)
+from coldfront.core.allocation.utils import generate_guauge_data_from_usage, send_added_user_email
from coldfront.core.grant.models import Grant
from coldfront.core.project.forms import (
ProjectAddUserForm,
ProjectAddUsersToAllocationForm,
+ ProjectAddUsersToAllocationFormSet,
ProjectAttributeAddForm,
ProjectAttributeDeleteForm,
ProjectAttributeUpdateForm,
ProjectCreationForm,
ProjectRemoveUserForm,
+ ProjectRequestEmailForm,
+ ProjectReviewAllocationForm,
ProjectReviewEmailForm,
ProjectReviewForm,
ProjectSearchForm,
+ ProjectUpdateForm,
ProjectUserUpdateForm,
)
from coldfront.core.project.models import (
Project,
ProjectAttribute,
+ ProjectAttributeType,
+ ProjectDescriptionRecord,
ProjectReview,
ProjectReviewStatusChoice,
ProjectStatusChoice,
@@ -58,34 +71,68 @@
ProjectUserStatusChoice,
)
from coldfront.core.project.signals import (
+ project_activate,
project_activate_user,
project_archive,
project_new,
project_remove_user,
project_update,
+ project_user_role_changed,
+)
+from coldfront.core.project.utils import (
+ check_if_pis_eligible,
+ create_admin_action,
+ create_admin_action_for_creation,
+ create_admin_action_for_deletion,
+ determine_automated_institution_choice,
+ generate_project_code,
+ get_new_end_date_from_list,
+ get_project_user_emails,
+ update_project_user_matches,
)
-from coldfront.core.project.utils import determine_automated_institution_choice, generate_project_code
from coldfront.core.publication.models import Publication
from coldfront.core.research_output.models import ResearchOutput
from coldfront.core.user.forms import UserSearchForm
from coldfront.core.user.utils import CombinedUserSearch
-from coldfront.core.utils.common import get_domain_url, import_from_settings
+from coldfront.core.utils.common import get_domain_url, get_users_accounts, import_from_settings
from coldfront.core.utils.mail import send_email, send_email_template
+from coldfront.core.utils.slack import send_message
+
+if "coldfront.plugins.ldap_misc" in settings.INSTALLED_APPS:
+ from coldfront.plugins.ldap_misc.utils.project import (
+ check_if_pis_eligible,
+ update_project_user_matches,
+ )
+ from coldfront.plugins.ldap_misc.utils.resource import get_users_accounts
EMAIL_ENABLED = import_from_settings("EMAIL_ENABLED", False)
ALLOCATION_ENABLE_ALLOCATION_RENEWAL = import_from_settings("ALLOCATION_ENABLE_ALLOCATION_RENEWAL", True)
ALLOCATION_DEFAULT_ALLOCATION_LENGTH = import_from_settings("ALLOCATION_DEFAULT_ALLOCATION_LENGTH", 365)
+PROJECT_DEFAULT_PROJECT_LENGTH = import_from_settings("PROJECT_DEFAULT_PROJECT_LENGTH", 365)
+ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING = import_from_settings("ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING", 30)
+ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING = import_from_settings("ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING", 60)
+PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING = import_from_settings("PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING", 60)
+PROJECT_END_DATE_CARRYOVER_DAYS = import_from_settings("PROJECT_END_DATE_CARRYOVER_DAYS", 90)
+PROJECT_DAYS_TO_REVIEW_BEFORE_EXPIRING = import_from_settings("PROJECT_DAYS_TO_REVIEW_BEFORE_EXPIRING", 30)
+PROJECT_CODE = import_from_settings("PROJECT_CODE", False)
+PROJECT_CODE_PADDING = import_from_settings("PROJECT_CODE_PADDING", False)
+SLACK_MESSAGING_ENABLED = import_from_settings("SLACK_MESSAGING_ENABLED", False)
+ENABLE_SLATE_PROJECT_SEARCH = import_from_settings("ENABLE_SLATE_PROJECT_SEARCH", False)
if EMAIL_ENABLED:
EMAIL_DIRECTOR_EMAIL_ADDRESS = import_from_settings("EMAIL_DIRECTOR_EMAIL_ADDRESS")
EMAIL_SENDER = import_from_settings("EMAIL_SENDER")
-
-PROJECT_CODE = import_from_settings("PROJECT_CODE", False)
-PROJECT_CODE_PADDING = import_from_settings("PROJECT_CODE_PADDING", False)
+ EMAIL_SIGNATURE = import_from_settings("EMAIL_SIGNATURE")
+ EMAIL_TICKET_SYSTEM_ADDRESS = import_from_settings("EMAIL_TICKET_SYSTEM_ADDRESS")
+ EMAIL_CENTER_NAME = import_from_settings("CENTER_NAME")
+ EMAIL_OPT_OUT_INSTRUCTION_URL = import_from_settings("EMAIL_OPT_OUT_INSTRUCTION_URL")
+ EMAIL_ALERTS_EMAIL_ADDRESS = import_from_settings("EMAIL_ALERTS_EMAIL_ADDRESS")
logger = logging.getLogger(__name__)
PROJECT_INSTITUTION_EMAIL_MAP = import_from_settings("PROJECT_INSTITUTION_EMAIL_MAP", False)
+ADDITIONAL_USER_SEARCH_CLASSES = import_from_settings("ADDITIONAL_USER_SEARCH_CLASSES", [])
+
class ProjectDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
model = Project
@@ -110,12 +157,17 @@ def test_func(self):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
+
+ is_manager = False
# Can the user update the project?
if self.request.user.is_superuser:
context["is_allowed_to_update_project"] = True
+ elif self.request.user.has_perm("project.change_project"):
+ context["is_allowed_to_update_project"] = True
elif self.object.projectuser_set.filter(user=self.request.user).exists():
project_user = self.object.projectuser_set.get(user=self.request.user)
if project_user.role.name == "Manager":
+ is_manager = True
context["is_allowed_to_update_project"] = True
else:
context["is_allowed_to_update_project"] = False
@@ -125,7 +177,7 @@ def get_context_data(self, **kwargs):
pk = self.kwargs.get("pk")
project_obj = get_object_or_404(Project, pk=pk)
- if self.request.user.is_superuser:
+ if self.request.user.is_superuser or self.request.user.has_perm("project.view_projectattribute"):
attributes_with_usage = [
attribute
for attribute in project_obj.projectattribute_set.all().order_by("proj_attr_type__name")
@@ -168,42 +220,62 @@ def get_context_data(self, **kwargs):
attributes_with_usage.remove(a)
# Only show 'Active Users'
- project_users = self.object.projectuser_set.filter(status__name="Active").order_by("user__username")
+ project_users = self.object.projectuser_set.filter(
+ status__name__in=[
+ "Active",
+ ]
+ ).order_by("user__username")
context["mailto"] = "mailto:" + ",".join([user.user.email for user in project_users])
- if self.request.user.is_superuser or self.request.user.has_perm("allocation.can_view_all_allocations"):
+ if (
+ self.request.user.is_superuser
+ or is_manager
+ or self.request.user.has_perm("allocation.can_view_all_allocations")
+ ):
allocations = (
- Allocation.objects.prefetch_related("resources").filter(project=self.object).order_by("-end_date")
+ Allocation.objects.prefetch_related("resources")
+ .filter(
+ project=self.object,
+ )
+ .order_by("-end_date")
)
+
else:
- if self.object.status.name in [
- "Active",
- "New",
- ]:
- allocations = (
- Allocation.objects.filter(
- Q(project=self.object)
- & Q(project__projectuser__user=self.request.user)
- & Q(
- project__projectuser__status__name__in=[
- "Active",
- ]
- )
- & Q(allocationuser__user=self.request.user)
- & Q(allocationuser__status__name__in=["Active", "PendingEULA"])
+ allocations = (
+ Allocation.objects.filter(
+ Q(project=self.object)
+ & Q(project__projectuser__user=self.request.user)
+ & Q(
+ project__projectuser__status__name__in=[
+ "Active",
+ ]
+ )
+ & Q(allocationuser__user=self.request.user)
+ & Q(
+ allocationuser__status__name__in=[
+ "Active",
+ "Invited",
+ "Pending",
+ "Disabled",
+ "Retired",
+ "PendingEULA",
+ ]
)
- .distinct()
- .order_by("-end_date")
)
- else:
- allocations = Allocation.objects.prefetch_related("resources").filter(project=self.object)
+ .distinct()
+ .order_by("-end_date")
+ )
user_status = []
for allocation in allocations:
if allocation.allocationuser_set.filter(user=self.request.user).exists():
user_status.append(allocation.allocationuser_set.get(user=self.request.user).status.name)
+ allocation_submitted = self.request.GET.get("allocation_submitted") == "true"
+ after_project_creation = self.request.GET.get("after_project_creation") == "true"
+ context["display_modal"] = str(allocation_submitted).lower() if not after_project_creation else "false"
+ context["display_project_created_modal"] = str(after_project_creation).lower()
context["publications"] = Publication.objects.filter(project=self.object, status="Active").order_by("-year")
context["research_outputs"] = ResearchOutput.objects.filter(project=self.object).order_by("-created")
context["grants"] = Grant.objects.filter(
@@ -216,13 +288,24 @@ def get_context_data(self, **kwargs):
context["attributes_with_usage"] = attributes_with_usage
context["project_users"] = project_users
context["ALLOCATION_ENABLE_ALLOCATION_RENEWAL"] = ALLOCATION_ENABLE_ALLOCATION_RENEWAL
- context["PROJECT_INSTITUTION_EMAIL_MAP"] = PROJECT_INSTITUTION_EMAIL_MAP
+ context["PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING"] = PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING
+ context["ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING"] = ALLOCATION_DAYS_TO_REVIEW_BEFORE_EXPIRING
+ context["ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING"] = ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING
+ context["enable_customizable_forms"] = "coldfront.plugins.customizable_forms" in settings.INSTALLED_APPS
+ project_messages = project_obj.projectusermessage_set
+ if self.request.user.is_superuser or self.request.user.has_perm("project.view_projectusermessage"):
+ project_messages = project_messages.all()
+ else:
+ project_messages = project_messages.filter(is_private=False)
+ context["project_messages"] = project_messages.order_by("-created")
try:
context["ondemand_url"] = settings.ONDEMAND_URL
except AttributeError:
pass
+ context["expand_accordion"] = "show" if context["is_allowed_to_update_project"] else ""
+
return context
@@ -264,6 +347,10 @@ def get_queryset(self):
status__name__in=[
"New",
"Active",
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ "Review Pending",
+ "Expired",
]
)
.order_by(order_by)
@@ -280,6 +367,10 @@ def get_queryset(self):
status__name__in=[
"New",
"Active",
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ "Review Pending",
+ "Expired",
]
)
& Q(projectuser__user=self.request.user)
@@ -301,8 +392,9 @@ def get_queryset(self):
)
# Field of Science
- if data.get("field_of_science"):
- projects = projects.filter(field_of_science__description__icontains=data.get("field_of_science"))
+ # if data.get('field_of_science'):
+ # projects = projects.filter(
+ # field_of_science__description__icontains=data.get('field_of_science'))
else:
projects = (
@@ -316,6 +408,10 @@ def get_queryset(self):
status__name__in=[
"New",
"Active",
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ "Review Pending",
+ "Expired",
]
)
& Q(projectuser__user=self.request.user)
@@ -331,6 +427,9 @@ def get_context_data(self, **kwargs):
projects_count = self.get_queryset().count()
context["projects_count"] = projects_count
+ context["enabled_pi_search"] = "coldfront.plugins.pi_search" in settings.INSTALLED_APPS
+ context["enabled_slate_project_search"] = ENABLE_SLATE_PROJECT_SEARCH
+
project_search_form = ProjectSearchForm(self.request.GET)
if project_search_form.is_valid():
context["project_search_form"] = project_search_form
@@ -361,6 +460,7 @@ def get_context_data(self, **kwargs):
context["filter_parameters"] = filter_parameters
context["filter_parameters_with_order_by"] = filter_parameters_with_order_by
context["PROJECT_INSTITUTION_EMAIL_MAP"] = PROJECT_INSTITUTION_EMAIL_MAP
+ context["PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING"] = PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING
project_list = context.get("project_list")
paginator = Paginator(project_list, self.paginate_by)
@@ -444,8 +544,8 @@ def get_queryset(self):
projects = projects.filter(pi__username__icontains=data.get("username"))
# Field of Science
- if data.get("field_of_science"):
- projects = projects.filter(field_of_science__description__icontains=data.get("field_of_science"))
+ # if data.get("field_of_science"):
+ # projects = projects.filter(field_of_science__description__icontains=data.get("field_of_science"))
else:
projects = (
@@ -519,107 +619,180 @@ def get_context_data(self, **kwargs):
return context
-class ProjectArchiveProjectView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
- template_name = "project/project_archive.html"
+class ProjectCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView):
+ model = Project
+ template_name_suffix = "_create_form"
+ form_class = ProjectCreationForm
def test_func(self):
"""UserPassesTestMixin Tests"""
if self.request.user.is_superuser:
return True
- project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
-
- if project_obj.pi == self.request.user:
+ if self.request.user.userprofile.is_pi:
return True
- if project_obj.projectuser_set.filter(
- user=self.request.user, role__name="Manager", status__name="Active"
- ).exists():
- return True
+ def get_form(self, form_class=None):
+ if form_class is None:
+ form_class = self.get_form_class()
+ return form_class(self.request.user, **self.get_form_kwargs())
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
- pk = self.kwargs.get("pk")
- project = get_object_or_404(Project, pk=pk)
-
- context["project"] = project
+ context["pi_search_url"] = ""
+ if "coldfront.plugins.pi_search" in settings.INSTALLED_APPS:
+ context["pi_search_url"] = reverse("pi-search-results")
return context
- def post(self, request, *args, **kwargs):
- pk = self.kwargs.get("pk")
- project = get_object_or_404(Project, pk=pk)
- project_status_archive = ProjectStatusChoice.objects.get(name="Archived")
- allocation_status_expired = AllocationStatusChoice.objects.get(name="Expired")
- end_date = datetime.datetime.now()
- project.status = project_status_archive
- project.save()
+ def check_max_project_type_count_reached(self, project_obj, pi_obj):
+ limit = project_obj.get_env.get("allowed_per_pi")
- # project signals
- project_archive.send(sender=self.__class__, project_obj=project)
+ if limit is not None:
+ pi_projects_count = pi_obj.project_set.filter(
+ type=project_obj.type,
+ status__name__in=["Active", "Waiting For Admin Approval", "Contacted By Admin", "Review Pending"],
+ ).count()
+ return pi_projects_count >= limit
- for allocation in project.allocation_set.filter(status__name="Active"):
- allocation.status = allocation_status_expired
- allocation.end_date = end_date
- allocation.save()
- return redirect(reverse("project-detail", kwargs={"pk": project.pk}))
+ return False
+ def form_valid(self, form):
+ project_obj = form.save(commit=False)
+ form.instance.pi = form.cleaned_data.get("pi")
+ form.instance.status = ProjectStatusChoice.objects.get(name="Waiting For Admin Approval")
-class ProjectCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView):
- model = Project
- template_name_suffix = "_create_form"
- form_class = ProjectCreationForm
+ if self.check_max_project_type_count_reached(form.instance, form.instance.pi):
+ messages.error(self.request, "You have reached the max projects you can have of this type.")
+ return super().form_invalid(form)
- def test_func(self):
- """UserPassesTestMixin Tests"""
- if self.request.user.is_superuser:
- return True
+ end_date = get_new_end_date_from_list(
+ project_obj.get_env.get("expiry_dates"), buffer_days=PROJECT_END_DATE_CARRYOVER_DAYS
+ )
+ if end_date is None:
+ logger.error(f"End date for new project request was set to None on date {datetime.date.today()}")
+ messages.error(
+ self.request, "Something went wrong while submitting this project request. Please try again later."
+ )
+ return super().form_invalid(form)
- if self.request.user.userprofile.is_pi:
- return True
+ project_obj.end_date = end_date
+
+ for field in project_obj.get_env.get("addtl_fields", []):
+ if not form.cleaned_data.get(field):
+ messages.error(self.request, f"You must provide a {field} for a {project_obj.type} project.")
+ return super().form_invalid(form)
- def form_valid(self, form):
- project_obj = form.save(commit=False)
- form.instance.pi = self.request.user
- form.instance.status = ProjectStatusChoice.objects.get(name="New")
project_obj.save()
self.object = project_obj
+ for field in project_obj.get_env.get("addtl_fields", []):
+ ProjectAttribute.objects.create(
+ project=project_obj,
+ proj_attr_type=ProjectAttributeType.objects.get(name=field.replace("_", " ").title()),
+ value=form.cleaned_data.get(field),
+ )
+
ProjectUser.objects.create(
user=self.request.user,
project=project_obj,
role=ProjectUserRoleChoice.objects.get(name="Manager"),
status=ProjectUserStatusChoice.objects.get(name="Active"),
)
+ if form.instance.pi != form.instance.requestor:
+ project_user_pi_user = ProjectUser.objects.create(
+ user=form.instance.pi,
+ project=project_obj,
+ role=ProjectUserRoleChoice.objects.get(name="Manager"),
+ status=ProjectUserStatusChoice.objects.get(name="Active"),
+ )
if PROJECT_CODE:
"""
- Set the ProjectCode object, if PROJECT_CODE is defined.
+ Set the ProjectCode object, if PROJECT_CODE is defined.
If PROJECT_CODE_PADDING is defined, the set amount of padding will be added to PROJECT_CODE.
"""
- project_obj.project_code = generate_project_code(PROJECT_CODE, project_obj.pk, PROJECT_CODE_PADDING or 0)
+ project_type_initial = form.instance.type.name[0]
+ project_obj.project_code = generate_project_code(
+ project_type_initial, project_obj.pk, PROJECT_CODE_PADDING or 0
+ )
project_obj.save(update_fields=["project_code"])
if PROJECT_INSTITUTION_EMAIL_MAP:
determine_automated_institution_choice(project_obj, PROJECT_INSTITUTION_EMAIL_MAP)
+ if SLACK_MESSAGING_ENABLED:
+ domain_url = get_domain_url(self.request)
+ project_review_url = reverse("project-review-list")
+ url = "{}{}".format(domain_url, project_review_url)
+ send_message(
+ f'A new request for project "{project_obj.title}" with id {project_obj.pk} has been submitted. You can view it here: {url}'
+ )
+ if EMAIL_ENABLED:
+ domain_url = get_domain_url(self.request)
+ project_review_url = reverse("project-review-list")
+ template_context = {
+ "url": "{}{}".format(domain_url, project_review_url),
+ "project_title": project_obj.title,
+ "project_id": project_obj.pk,
+ }
+ send_email_template(
+ "New Project Request",
+ "email/new_project_request.txt",
+ template_context,
+ EMAIL_SENDER,
+ [
+ EMAIL_ALERTS_EMAIL_ADDRESS,
+ ],
+ )
+
+ if form.instance.pi != form.instance.requestor:
+ project_url = reverse("project-detail", kwargs={"pk": project_obj.pk})
+ template_context = {
+ "center_name": EMAIL_CENTER_NAME,
+ "project_title": project_obj.title,
+ "requestor_first_name": form.instance.requestor.first_name,
+ "requestor_last_name": form.instance.requestor.last_name,
+ "requestor_username": form.instance.requestor.username,
+ "project_url": "{}{}".format(domain_url, project_url),
+ "help_email": EMAIL_TICKET_SYSTEM_ADDRESS,
+ "signature": EMAIL_SIGNATURE,
+ }
+
+ send_email_template(
+ "PI For Project Request",
+ "email/pi_project_request.txt",
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ [
+ project_user_pi_user.user.email,
+ ],
+ )
+
+ logger.info(f"Email sent to pi {form.instance.pi.username} (project pk={project_obj.pk})")
+
# project signals
project_new.send(sender=self.__class__, project_obj=project_obj)
+ logger.info(f"User {form.instance.requestor.username} created a new project (project pk={project_obj.pk})")
return super().form_valid(form)
+ def reverse_with_params(self, path, **kwargs):
+ return path + "?" + urllib.parse.urlencode(kwargs)
+
def get_success_url(self):
- return reverse("project-detail", kwargs={"pk": self.object.pk})
+ url_name = "allocation-create"
+ if "coldfront.plugins.customizable_forms" in settings.INSTALLED_APPS:
+ url_name = "custom-allocation-create"
+ return self.reverse_with_params(
+ reverse(url_name, kwargs={"project_pk": self.object.pk}), after_project_creation="true"
+ )
-class ProjectUpdateView(SuccessMessageMixin, LoginRequiredMixin, UserPassesTestMixin, UpdateView):
- model = Project
- template_name_suffix = "_update_form"
- fields = [
- "title",
- "description",
- "field_of_science",
- ]
+
+class ProjectUpdateView(SuccessMessageMixin, LoginRequiredMixin, UserPassesTestMixin, FormView):
+ form_class = ProjectUpdateForm
+ template_name = "project/project_update_form.html"
success_message = "Project updated."
def test_func(self):
@@ -627,7 +800,10 @@ def test_func(self):
if self.request.user.is_superuser:
return True
- project_obj = self.get_object()
+ project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
+
+ if self.request.user.has_perm("project.change_project"):
+ return True
if project_obj.pi == self.request.user:
return True
@@ -639,27 +815,57 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
-
- if PROJECT_CODE and project_obj.project_code == "":
- """
- Updates project code if no value was set, providing the feature is activated.
- """
- project_obj.project_code = generate_project_code(PROJECT_CODE, project_obj.pk, PROJECT_CODE_PADDING or 0)
- project_obj.save(update_fields=["project_code"])
-
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot update an archived project.")
+ messages.error(request, 'You cannot update a project with status "{}".'.format(project_obj.status.name))
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
+ def get_form(self, form_class=None):
+ """Return an instance of the form to be used in this view."""
+ if form_class is None:
+ form_class = self.get_form_class()
+ return form_class(self.kwargs.get("pk"), **self.get_form_kwargs())
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context["project_pk"] = self.kwargs.get("pk")
+
+ return context
+
+ def form_valid(self, form):
+ project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
+ form_data = form.cleaned_data
+
+ ProjectDescriptionRecord.objects.create(
+ project=project_obj, user=self.request.user, description=project_obj.description
+ )
+
+ save_form = not project_obj.title == form_data.get("title") or not project_obj.description == form_data.get(
+ "description"
+ )
+ project_obj.title = form_data.get("title")
+ project_obj.description = form_data.get("description")
+ if save_form:
+ project_obj.save()
+
+ if SLACK_MESSAGING_ENABLED:
+ url = f"{get_domain_url(self.request)}{reverse('project-detail', kwargs={'pk': project_obj.pk})}"
+ send_message(
+ f'Project "{project_obj.title}" with id {project_obj.pk} was updated. You can view it here: {url}'
+ )
+ logger.info(f"User {self.request.user.username} updated a project (project pk={project_obj.pk})")
+ return super().form_valid(form)
+
def get_success_url(self):
# project signals
- project_update.send(sender=self.__class__, project_obj=self.object)
- return reverse("project-detail", kwargs={"pk": self.object.pk})
+ project_update.send(sender=self.__class__, project_obj=get_object_or_404(Project, pk=self.kwargs.get("pk")))
+ return reverse("project-detail", kwargs={"pk": self.kwargs.get("pk")})
class ProjectAddUsersSearchView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
@@ -682,11 +888,15 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot add users to an archived project.")
+ messages.error(
+ request, 'You cannot add users to a project with status "{}".'.format(project_obj.status.name)
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
@@ -695,6 +905,8 @@ def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context["user_search_form"] = UserSearchForm()
context["project"] = Project.objects.get(pk=self.kwargs.get("pk"))
+ after_project_creation = self.request.GET.get("after_project_creation")
+ context["after_project_creation"] = str(after_project_creation == "true").lower()
return context
@@ -719,31 +931,36 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot add users to an archived project.")
+ messages.error(
+ request, 'You cannot add users to a project with status "{}".'.format(project_obj.status.name)
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
- def get_initial_data(self, project_obj):
- allocation_objs = project_obj.allocation_set.filter(
- resources__is_allocatable=True,
- is_locked=False,
- status__name__in=["Active", "New", "Renewal Requested", "Payment Pending", "Payment Requested", "Paid"],
- )
- return [
- {
- "pk": allocation_obj.pk,
- "resource": allocation_obj.get_parent_resource.name,
- "details": allocation_obj.get_information,
- "resource_type": allocation_obj.get_parent_resource.resource_type.name,
- "status": allocation_obj.status.name,
- }
- for allocation_obj in allocation_objs
- ]
+ def get_initial_data(self, request, allocations):
+ initial_data = []
+ for allocation in allocations:
+ initial_data.append(
+ {
+ "pk": allocation.pk,
+ "resource": allocation.get_parent_resource.name,
+ "details": allocation.get_information,
+ "resource_type": allocation.get_parent_resource.resource_type.name,
+ "status": allocation.status.name,
+ }
+ )
+
+ return initial_data
+
+ def get_allocation_user_roles(self, allocations):
+ return [allocation.get_user_roles().values_list("name", flat=True) for allocation in allocations]
def post(self, request, *args, **kwargs):
user_search_string = request.POST.get("q")
@@ -752,15 +969,25 @@ def post(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=pk)
- users_to_exclude = [ele.user.username for ele in project_obj.projectuser_set.filter(status__name="Active")]
+ users_to_exclude = [
+ ele.user.username
+ for ele in project_obj.projectuser_set.filter(
+ status__name__in=[
+ "Active",
+ ]
+ )
+ ]
cobmined_user_search_obj = CombinedUserSearch(user_search_string, search_by, users_to_exclude)
context = cobmined_user_search_obj.search()
+ after_project_creation = request.POST.get("after_project_creation")
+ context["after_project_creation"] = str(after_project_creation == "true").lower()
+ # Initial data for ProjectAddUserForm
matches = context.get("matches")
- for match in matches:
- match.update({"role": ProjectUserRoleChoice.objects.get(name="User")})
+ context["num_matches"] = len(matches)
+ matches = update_project_user_matches(matches)
if matches:
formset = formset_factory(ProjectAddUserForm, max_num=len(matches))
@@ -776,20 +1003,40 @@ def post(self, request, *args, **kwargs):
users_already_in_project.append(ele)
context["users_already_in_project"] = users_already_in_project
+ status_list = ["Active", "New", "Renewal Requested", "Billing Information Submitted"]
+ allocations = project_obj.allocation_set.filter(status__name__in=status_list, is_locked=False).exclude(
+ resources__name="Geode-Project"
+ )
+ initial_data = self.get_initial_data(request, allocations)
+ allocation_formset = formset_factory(
+ ProjectAddUsersToAllocationForm, max_num=len(initial_data), formset=ProjectAddUsersToAllocationFormSet
+ )
+ roles = self.get_allocation_user_roles(allocations)
+ allocation_formset = allocation_formset(
+ initial=initial_data, prefix="allocationform", form_kwargs={"roles": roles}
+ )
+
+ account_statuses = {}
+ for allocation in allocations:
+ resource_obj = allocation.get_parent_resource
+ if not account_statuses.get(resource_obj.pk):
+ account_statuses[resource_obj.name] = resource_obj.get_user_account_statuses(
+ [match.get("username") for match in matches]
+ )
+ context["account_statuses"] = account_statuses
+
# The following block of code is used to hide/show the allocation div in the form.
- if project_obj.allocation_set.filter(status__name__in=["Active", "New", "Renewal Requested"]).exists():
+ if initial_data:
div_allocation_class = "placeholder_div_class"
else:
div_allocation_class = "d-none"
context["div_allocation_class"] = div_allocation_class
###
- initial_data = self.get_initial_data(project_obj)
- allocation_formset = formset_factory(ProjectAddUsersToAllocationForm, max_num=len(initial_data))
- allocation_formset = allocation_formset(initial=initial_data, prefix="allocationform")
-
context["pk"] = pk
- context["allocation_formset"] = allocation_formset
+ context["allocation_form"] = allocation_formset
+ context["current_num_managers"] = project_obj.get_current_num_managers()
+ context["max_managers"] = project_obj.max_managers
return render(request, self.template_name, context)
@@ -811,31 +1058,35 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot add users to an archived project.")
+ messages.error(
+ request, 'You cannot add users to a project with status "{}".'.format(project_obj.status.name)
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
- def get_initial_data(self, project_obj):
- allocation_objs = project_obj.allocation_set.filter(
- resources__is_allocatable=True,
- is_locked=False,
- status__name__in=["Active", "New", "Renewal Requested", "Payment Pending", "Payment Requested", "Paid"],
- )
- return [
- {
- "pk": allocation_obj.pk,
- "resource": allocation_obj.get_parent_resource.name,
- "details": allocation_obj.get_information,
- "resource_type": allocation_obj.get_parent_resource.resource_type.name,
- "status": allocation_obj.status.name,
- }
- for allocation_obj in allocation_objs
- ]
+ def get_initial_data(self, request, allocations):
+ initial_data = []
+ for allocation in allocations:
+ initial_data.append(
+ {
+ "pk": allocation.pk,
+ "resource": allocation.get_parent_resource.name,
+ "resource_type": allocation.get_parent_resource.resource_type.name,
+ "status": allocation.status.name,
+ }
+ )
+
+ return initial_data
+
+ def get_allocation_user_roles(self, allocations):
+ return [allocation.get_user_roles().values_list("name", flat=True) for allocation in allocations]
def post(self, request, *args, **kwargs):
user_search_string = request.POST.get("q")
@@ -844,62 +1095,98 @@ def post(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=pk)
- users_to_exclude = [ele.user.username for ele in project_obj.projectuser_set.filter(status__name="Active")]
+ users_to_exclude = [
+ ele.user.username
+ for ele in project_obj.projectuser_set.filter(
+ status__name__in=[
+ "Active",
+ ]
+ )
+ ]
cobmined_user_search_obj = CombinedUserSearch(user_search_string, search_by, users_to_exclude)
context = cobmined_user_search_obj.search()
+ # Initial data for ProjectAddUserForm
matches = context.get("matches")
- for match in matches:
- match.update({"role": ProjectUserRoleChoice.objects.get(name="User")})
+ matches = update_project_user_matches(matches)
+
+ auto_disable_notifications = False
+ auto_disable_obj = project_obj.projectattribute_set.filter(
+ proj_attr_type__name="Auto Disable User Notifications"
+ )
+ if auto_disable_obj.exists() and auto_disable_obj[0].value == "Yes":
+ auto_disable_notifications = True
formset = formset_factory(ProjectAddUserForm, max_num=len(matches))
formset = formset(request.POST, initial=matches, prefix="userform")
- initial_data = self.get_initial_data(project_obj)
+ status_list = ["Active", "New", "Renewal Requested", "Billing Information Submitted"]
+ allocations = project_obj.allocation_set.filter(status__name__in=status_list, is_locked=False)
+ initial_data = self.get_initial_data(request, allocations)
+
allocation_formset = formset_factory(
- ProjectAddUsersToAllocationForm,
- max_num=len(initial_data),
+ ProjectAddUsersToAllocationForm, max_num=len(initial_data), formset=ProjectAddUsersToAllocationFormSet
)
+ roles = self.get_allocation_user_roles(allocations)
allocation_formset = allocation_formset(
- request.POST,
- initial=initial_data,
- prefix="allocationform",
+ request.POST, initial=initial_data, prefix="allocationform", form_kwargs={"roles": roles}
)
- added_users_count = 0
+ project_user_objs = []
+ allocations_added_to = {}
if formset.is_valid() and allocation_formset.is_valid():
project_user_active_status_choice = ProjectUserStatusChoice.objects.get(name="Active")
allocation_user_active_status_choice = AllocationUserStatusChoice.objects.get(name="Active")
if ALLOCATION_EULA_ENABLE:
allocation_user_pending_status_choice = AllocationUserStatusChoice.objects.get(name="PendingEULA")
- allocations_selected_objs = Allocation.objects.filter(
- pk__in=[
- allocation_form.cleaned_data.get("pk")
- for allocation_form in allocation_formset
- if allocation_form.cleaned_data.get("selected")
- ]
- )
+ no_accounts = {}
+ added_users = {}
+ managers_rejected = []
+ for allocation in allocation_formset:
+ cleaned_data = allocation.cleaned_data
+ if cleaned_data["selected"]:
+ allocation = allocations.get(pk=cleaned_data["pk"])
+ selected_users_accounts = get_users_accounts(
+ [form.cleaned_data.get("username") for form in formset if form.cleaned_data.get("selected")]
+ )
+ break
+
for form in formset:
user_form_data = form.cleaned_data
- if user_form_data["selected"]:
- added_users_count += 1
+ if user_form_data["selected"]:
# Will create local copy of user if not already present in local database
- user_obj, _ = User.objects.get_or_create(username=user_form_data.get("username"))
- user_obj.first_name = user_form_data.get("first_name")
- user_obj.last_name = user_form_data.get("last_name")
- user_obj.email = user_form_data.get("email")
- user_obj.save()
+ user_obj, created = User.objects.get_or_create(username=user_form_data.get("username"))
+ if created:
+ user_obj.first_name = user_form_data.get("first_name")
+ user_obj.last_name = user_form_data.get("last_name")
+ user_obj.email = user_form_data.get("email")
+ user_obj.save()
role_choice = user_form_data.get("role")
+
+ # If no more managers can be added then give the user the 'User' role.
+ if role_choice.name == "Manager":
+ if project_obj.check_exceeds_max_managers(1): # TODO - See what this is doing
+ role_choice = ProjectUserRoleChoice.objects.get(name="User")
+ managers_rejected.append(user_form_data.get("username"))
+
+ enable_notifications = True # TODO - Could simplify this a little
+ if role_choice.name == "Group":
+ # Notifications by default will be disabled for group accounts.
+ enable_notifications = False
+ elif role_choice.name == "User" and auto_disable_notifications:
+ enable_notifications = False
+
# Is the user already in the project?
if project_obj.projectuser_set.filter(user=user_obj).exists():
project_user_obj = project_obj.projectuser_set.get(user=user_obj)
project_user_obj.role = role_choice
project_user_obj.status = project_user_active_status_choice
+ project_user_obj.enable_notifications = enable_notifications
project_user_obj.save()
else:
project_user_obj = ProjectUser.objects.create(
@@ -907,36 +1194,161 @@ def post(self, request, *args, **kwargs):
project=project_obj,
role=role_choice,
status=project_user_active_status_choice,
+ enable_notifications=enable_notifications,
)
# project signals
project_activate_user.send(sender=self.__class__, project_user_pk=project_user_obj.pk)
- for allocation in allocations_selected_objs:
- has_eula = allocation.get_eula()
- user_status_choice = allocation_user_active_status_choice
- if allocation.allocationuser_set.filter(user=user_obj).exists():
- allocation_user_obj = allocation.allocationuser_set.get(user=user_obj)
- if (
- ALLOCATION_EULA_ENABLE
- and has_eula
- and (allocation_user_obj.status != allocation_user_active_status_choice)
- ):
- user_status_choice = allocation_user_pending_status_choice
- allocation_user_obj.status = user_status_choice
- allocation_user_obj.save()
- else:
- if ALLOCATION_EULA_ENABLE and has_eula:
- user_status_choice = allocation_user_pending_status_choice
- allocation_user_obj = AllocationUser.objects.create(
- allocation=allocation, user=user_obj, status=user_status_choice
+ project_user_objs.append(project_user_obj)
+
+ username = user_form_data.get("username")
+ no_accounts[username] = []
+ added_users[username] = []
+ for allocation in allocation_formset:
+ cleaned_data = allocation.cleaned_data
+ if cleaned_data["selected"]:
+ allocation = allocations.get(pk=cleaned_data["pk"])
+ if allocations_added_to.get(allocation) is None:
+ allocations_added_to[allocation] = []
+
+ # If the user does not have an account on the resource in the allocation then do not add them to it.
+ account_exists, reason = allocation.get_parent_resource.get_user_account_statuses(
+ [
+ form.cleaned_data.get("username")
+ for form in formset
+ if form.cleaned_data.get("selected")
+ ],
+ selected_users_accounts,
+ ).get(username).values()
+ if not account_exists:
+ # Make sure there are no duplicates for a user if there's more than one instance of a resource.
+ if reason == "no_account":
+ if "IU" not in no_accounts[username]:
+ no_accounts[username].append("IU")
+ elif reason == "no_resource_account":
+ if allocation.get_parent_resource.name not in no_accounts[username]:
+ no_accounts[username].append(allocation.get_parent_resource.name)
+ continue
+
+ allocation_user_role_obj = AllocationUserRoleChoice.objects.filter(
+ resources=allocation.get_parent_resource, name=cleaned_data["role"]
)
- if user_status_choice == allocation_user_active_status_choice:
- allocation_activate_user.send(
- sender=self.__class__, allocation_user_pk=allocation_user_obj.pk
+ if allocation_user_role_obj.exists():
+ allocation_user_role_obj = allocation_user_role_obj[0]
+ else:
+ allocation_user_role_obj = None
+
+ has_eula = allocation.get_eula()
+ user_status_choice = allocation_user_active_status_choice
+ if allocation.allocationuser_set.filter(user=user_obj).exists():
+ allocation_user_obj = allocation.allocationuser_set.get(user=user_obj)
+ if (
+ ALLOCATION_EULA_ENABLE
+ and has_eula
+ and (allocation_user_obj.status != allocation_user_active_status_choice)
+ ):
+ user_status_choice = allocation_user_pending_status_choice
+ allocation_user_obj.status = user_status_choice
+ allocation_user_obj.role = allocation_user_role_obj
+ allocation_user_obj.save()
+ else:
+ if ALLOCATION_EULA_ENABLE and has_eula:
+ user_status_choice = allocation_user_pending_status_choice
+ allocation_user_obj = AllocationUser.objects.create(
+ allocation=allocation,
+ user=user_obj,
+ role=allocation_user_role_obj,
+ status=user_status_choice,
+ )
+ if user_status_choice == allocation_user_active_status_choice:
+ allocation_activate_user.send(
+ sender=self.__class__, allocation_user_pk=allocation_user_obj.pk
+ )
+ allocations_added_to[allocation].append(project_user_obj)
+
+ if allocation.get_parent_resource.name not in added_users[username]:
+ added_users[username].append(allocation.get_parent_resource.name)
+
+ if any(no_accounts.values()):
+ warning_message = "The following users were not added to the selected resource allocations due to missing accounts:
"
+ for username, no_account_list in no_accounts.items():
+ if no_account_list:
+ if "IU" in no_account_list:
+ warning_message += f"
{username} is missing an IU account
"
+ else:
+ warning_message += (
+ f"
{username} is missing an account for {', '.join(no_account_list)}
"
)
+ warning_message += "
"
+ if warning_message != "":
+ url = "https://access.iu.edu/Accounts/Create"
+ warning_message += f'They cannot be added until they create one. Please direct them to {url} to create one.'
+ messages.warning(request, format_html(warning_message))
+
+ if any(added_users.values()):
+ message = "The following users were added to the selected resource allocations:
"
+ for username, resource_list in added_users.items():
+ if resource_list:
+ message += (
+ f"
{username} was added to these resource allocations: {', '.join(resource_list)}
"
+ )
+ message += "
"
+ messages.success(request, format_html(message))
+
+ if EMAIL_ENABLED and project_user_objs:
+ domain_url = get_domain_url(self.request)
+ project_url = "{}{}".format(domain_url, reverse("project-detail", kwargs={"pk": project_obj.pk}))
+
+ template_context = {
+ "center_name": EMAIL_CENTER_NAME,
+ "project_title": project_obj.title,
+ "project_users": project_user_objs,
+ "action_user": f"{request.user.first_name} {request.user.last_name}",
+ "url": project_url,
+ "signature": EMAIL_SIGNATURE,
+ }
+ emails = [
+ project_user_obj.user.email
+ for project_user_obj in project_user_objs
+ if project_user_obj.enable_notifications
+ ]
+ emails.append(project_obj.pi.email)
+ send_email_template(
+ "Added to Project",
+ "email/project_added_users.txt",
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ emails,
+ )
- messages.success(request, "Added {} users to project.".format(added_users_count))
+ if allocations_added_to:
+ for allocation, added_project_user_objs in allocations_added_to.items():
+ users = [
+ project_user_obj.user
+ for project_user_obj in added_project_user_objs
+ if project_user_obj.enable_notifications
+ ]
+ emails = set(user.email for user in users)
+ if emails:
+ emails.add(project_obj.pi.email)
+ emails.add(request.user.email)
+ send_added_user_email(request, allocation, users, emails)
+
+ if project_user_objs:
+ logger.info(
+ f"User {request.user.username} added {', '.join(project_user_obj.user.username for project_user_obj in project_user_objs)} "
+ f"to a project (project pk={project_obj.pk})"
+ )
+ if allocations_added_to:
+ for allocation, added_project_user_objs in allocations_added_to.items():
+ project_users = [project_user_obj.user.username for project_user_obj in added_project_user_objs]
+ if project_users:
+ logger.info(
+ f"User {request.user.username} added {', '.join(project_users)} to a "
+ f"{allocation.get_parent_resource.name} allocation (allocation pk={allocation.pk})"
+ )
+ messages.success(request, "Added {} users to project.".format(len(project_user_objs)))
else:
if not formset.is_valid():
for error in formset.errors:
@@ -946,8 +1358,16 @@ def post(self, request, *args, **kwargs):
for error in allocation_formset.errors:
messages.error(request, error)
+ if request.POST.get("after_project_creation_field") == "true":
+ return HttpResponseRedirect(
+ self.reverse_with_params(reverse("project-detail", kwargs={"pk": pk}), after_project_creation="true")
+ )
+
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": pk}))
+ def reverse_with_params(self, path, **kwargs):
+ return path + "?" + urllib.parse.urlencode(kwargs)
+
class ProjectRemoveUsersView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
template_name = "project/project_remove_users.html"
@@ -969,11 +1389,14 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot remove users from an archived project.")
+ messages.error(
+ request, 'You cannot remove users from a project with status "{}".'.format(project_obj.status.name)
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
@@ -987,7 +1410,11 @@ def get_users_to_remove(self, project_obj):
"email": ele.user.email,
"role": ele.role,
}
- for ele in project_obj.projectuser_set.filter(status__name="Active").order_by("user__username")
+ for ele in project_obj.projectuser_set.filter(
+ status__name__in=[
+ "Active",
+ ]
+ ).order_by("user__username")
if ele.user != self.request.user and ele.user != project_obj.pi
]
@@ -1005,7 +1432,9 @@ def get(self, request, *args, **kwargs):
formset = formset(initial=users_to_remove, prefix="userform")
context["formset"] = formset
- context["project"] = get_object_or_404(Project, pk=pk)
+ project_obj = get_object_or_404(Project, pk=pk)
+ context["project"] = project_obj
+ context["display_warning"] = project_obj.allocation_set.filter(resources__name="Slate-Project")
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
@@ -1017,39 +1446,36 @@ def post(self, request, *args, **kwargs):
formset = formset_factory(ProjectRemoveUserForm, max_num=len(users_to_remove))
formset = formset(request.POST, initial=users_to_remove, prefix="userform")
- remove_users_count = 0
-
+ removed_user_objs = []
+ removed_users_breakdown = {}
if formset.is_valid():
project_user_removed_status_choice = ProjectUserStatusChoice.objects.get(name="Removed")
allocation_user_removed_status_choice = AllocationUserStatusChoice.objects.get(name="Removed")
+ resources_requiring_user_request = {}
for form in formset:
user_form_data = form.cleaned_data
if user_form_data["selected"]:
- remove_users_count += 1
-
user_obj = User.objects.get(username=user_form_data.get("username"))
if project_obj.pi == user_obj:
continue
- project_user_obj = project_obj.projectuser_set.get(user=user_obj)
- project_user_obj.status = project_user_removed_status_choice
- project_user_obj.save()
-
- # project signals
- project_remove_user.send(sender=self.__class__, project_user_pk=project_user_obj.pk)
+ remove_user_from_project = True
# get allocation to remove users from
allocations_to_remove_user_from = project_obj.allocation_set.filter(
- status__name__in=["Active", "New", "Renewal Requested"]
+ status__name__in=["Active", "New", "Renewal Requested", "Expired"]
)
for allocation in allocations_to_remove_user_from:
- for allocation_user_obj in allocation.allocationuser_set.filter(
- user=user_obj,
- status__name__in=[
- "Active",
- ],
+ for allocation_user_obj in allocation.allocationuser_set.filter(user=user_obj).exclude(
+ status__name="Removed"
):
+ if not removed_users_breakdown.get(allocation_user_obj.user.username):
+ removed_users_breakdown[allocation_user_obj.user.username] = []
+ removed_users_breakdown[allocation_user_obj.user.username].append(
+ (allocation.get_parent_resource.name, allocation.get_identifiers().values())
+ )
+
allocation_user_obj.status = allocation_user_removed_status_choice
allocation_user_obj.save()
@@ -1057,10 +1483,61 @@ def post(self, request, *args, **kwargs):
sender=self.__class__, allocation_user_pk=allocation_user_obj.pk
)
- if remove_users_count == 1:
- messages.success(request, "Removed {} user from project.".format(remove_users_count))
- else:
- messages.success(request, "Removed {} users from project.".format(remove_users_count))
+ if remove_user_from_project:
+ project_user_obj = project_obj.projectuser_set.get(user=user_obj)
+ project_user_obj.status = project_user_removed_status_choice
+ project_user_obj.save()
+ # project signals
+ project_remove_user.send(sender=self.__class__, project_user_pk=project_user_obj.pk)
+ removed_user_objs.append(project_user_obj)
+ if not removed_users_breakdown.get(project_user_obj.user.username):
+ removed_users_breakdown[project_user_obj.user.username] = [(None, ())]
+
+ if removed_user_objs:
+ if EMAIL_ENABLED:
+ emails = [
+ project_user_obj.user.email
+ for project_user_obj in removed_user_objs
+ if project_user_obj.enable_notifications
+ ]
+ emails.append(project_obj.pi.email)
+
+ template_context = {
+ "center_name": EMAIL_CENTER_NAME,
+ "project_title": project_obj.title,
+ "removed_users": removed_user_objs,
+ "removed_users_breakdown": removed_users_breakdown,
+ "action_user": f"{request.user.first_name} {request.user.last_name}",
+ "signature": EMAIL_SIGNATURE,
+ }
+
+ send_email_template(
+ "Removed From Project",
+ "email/project_removed_users.txt",
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ emails,
+ )
+
+ removed_users = [project_user_obj.user.username for project_user_obj in removed_user_objs]
+ logger.info(
+ f"User {request.user.username} removed {', '.join(removed_users)} from a "
+ f"project (project pk={project_obj.pk})"
+ )
+
+ removed_user_count = len(removed_user_objs)
+ if removed_user_count == 1:
+ messages.success(request, "Removed {} user from project.".format(removed_user_count))
+ else:
+ messages.success(request, "Removed {} users from project.".format(removed_user_count))
+
+ for resource_name, users in resources_requiring_user_request.items():
+ messages.warning(
+ request,
+ "User(s) {} in resource {} must be removed from the allocation first.".format(
+ ", ".join(users), resource_name
+ ),
+ )
else:
for error in formset.errors:
messages.error(request, error)
@@ -1088,31 +1565,30 @@ def test_func(self):
def get(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
- project_user_pk = self.kwargs.get("project_user_pk")
+ project_user_obj = get_object_or_404(ProjectUser, pk=self.kwargs.get("project_user_pk"))
- if project_obj.projectuser_set.filter(pk=project_user_pk).exists():
- project_user_obj = project_obj.projectuser_set.get(pk=project_user_pk)
+ project_user_update_form = ProjectUserUpdateForm(
+ initial={"role": project_user_obj.role, "enable_notifications": project_user_obj.enable_notifications}
+ )
- project_user_update_form = ProjectUserUpdateForm(
- initial={"role": project_user_obj.role, "enable_notifications": project_user_obj.enable_notifications}
- )
+ context = {}
+ context["project_obj"] = project_obj
+ context["project_user_update_form"] = project_user_update_form
+ context["project_user_obj"] = project_user_obj
- context = {}
- context["project_obj"] = project_obj
- context["project_user_update_form"] = project_user_update_form
- context["project_user_obj"] = project_user_obj
-
- return render(request, self.template_name, context)
+ return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
project_user_pk = self.kwargs.get("project_user_pk")
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot update a user in an archived project.")
+ messages.error(request, "You cannot update a user in a(n) {} project.".format(project_obj.status.name))
return HttpResponseRedirect(reverse("project-user-detail", kwargs={"pk": project_user_pk}))
if project_obj.projectuser_set.filter(id=project_user_pk).exists():
@@ -1121,7 +1597,6 @@ def post(self, request, *args, **kwargs):
if project_user_obj.user == project_user_obj.project.pi:
messages.error(request, "PI role and email notification option cannot be changed.")
return HttpResponseRedirect(reverse("project-user-detail", kwargs={"pk": project_user_pk}))
-
project_user_update_form = ProjectUserUpdateForm(
request.POST,
initial={
@@ -1132,20 +1607,76 @@ def post(self, request, *args, **kwargs):
if project_user_update_form.is_valid():
form_data = project_user_update_form.cleaned_data
- project_user_obj.role = ProjectUserRoleChoice.objects.get(name=form_data.get("role"))
+ form_role = form_data.get("role")
+ form_enable_notifications = form_data.get("enable_notifications")
+
+ if (
+ form_role == project_user_obj.role
+ and project_user_obj.enable_notifications == form_enable_notifications
+ ):
+ return HttpResponseRedirect(
+ reverse(
+ "project-user-detail", kwargs={"pk": project_obj.pk, "project_user_pk": project_user_obj.pk}
+ )
+ )
+ if form_role.name == "Manager":
+ if project_user_obj.role.name != "Manager":
+ if project_obj.get_current_num_managers() >= project_obj.max_managers:
+ messages.error(
+ request,
+ """
+ This project is at its maximum Managers limit ({}) and cannot have
+ more.
+ """.format(project_obj.max_managers),
+ )
+ return HttpResponseRedirect(
+ reverse(
+ "project-user-detail",
+ kwargs={"pk": project_obj.pk, "project_user_pk": project_user_obj.pk},
+ )
+ )
+
+ old_role = project_user_obj.role
+ project_user_obj.role = form_role
if project_user_obj.role.name == "Manager":
project_user_obj.enable_notifications = True
+ elif old_role.name == "Manager" and project_user_obj.role.name == "User":
+ auto_disable_obj = project_obj.projectattribute_set.filter(
+ proj_attr_type__name="Auto Disable User Notifications"
+ )
+ if auto_disable_obj.exists() and auto_disable_obj[0].value == "Yes":
+ project_user_obj.enable_notifications = False
+ else:
+ project_user_obj.enable_notifications = True
else:
- project_user_obj.enable_notifications = form_data.get("enable_notifications")
+ project_user_obj.enable_notifications = form_enable_notifications
+ logger.info(
+ f"Admin {request.user.username} set {project_user_obj.user.username}'s "
+ f"notifications to {form_enable_notifications} (project pk={project_obj.pk})"
+ )
project_user_obj.save()
+ if project_user_obj.role != old_role:
+ project_user_role_changed.send(sender=self.__class__, project_user_pk=project_user_obj.pk)
+ logger.info(
+ f"User {request.user.username} changed {project_user_obj.user.username}'s "
+ f"role to {form_data.get('role')} (project pk={project_obj.pk})"
+ )
+
messages.success(request, "User details updated.")
return HttpResponseRedirect(
reverse(
"project-user-detail", kwargs={"pk": project_obj.pk, "project_user_pk": project_user_obj.pk}
)
)
+ else:
+ messages.error(request, project_user_update_form.errors)
+ return HttpResponseRedirect(
+ reverse(
+ "project-user-detail", kwargs={"pk": project_obj.pk, "project_user_pk": project_user_obj.pk}
+ )
+ )
@login_required
@@ -1212,7 +1743,10 @@ def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
if not project_obj.needs_review:
- messages.error(request, "You do not need to review this project.")
+ if project_obj.get_env.get("renewable"):
+ messages.error(request, "You do not need to review this project.")
+ else:
+ messages.error(request, "This project cannot be reviewed.")
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
if "Auto-Import Project".lower() in project_obj.title.lower():
@@ -1231,9 +1765,46 @@ def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
+ def get_allocation_data(self, project_obj):
+ allocations = project_obj.allocation_set.filter(
+ status__name__in=[
+ "Active",
+ "Expired",
+ ],
+ is_locked=False,
+ resources__requires_payment=False,
+ )
+ initial_data = []
+ if allocations:
+ for allocation in allocations:
+ if (
+ ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING >= 0
+ and allocation.expires_in < -ALLOCATION_DAYS_TO_REVIEW_AFTER_EXPIRING
+ ):
+ continue
+
+ data = {
+ "pk": allocation.pk,
+ "resource": allocation.get_resources_as_string,
+ "users": ", ".join(
+ [
+ "{} {}".format(ele.user.first_name, ele.user.last_name)
+ for ele in allocation.allocationuser_set.filter(
+ status__name__in=["Active", "Invited", "Pending", "Disabled", "Retired"]
+ ).order_by("user__last_name")
+ ]
+ ),
+ "status": allocation.status,
+ "expires_on": allocation.end_date,
+ "renew": True,
+ }
+ initial_data.append(data)
+
+ return initial_data
+
def get(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
- project_review_form = ProjectReviewForm(project_obj.pk)
+ project_review_form = ProjectReviewForm()
context = {}
context["project"] = project_obj
@@ -1241,27 +1812,72 @@ def get(self, request, *args, **kwargs):
context["project_users"] = ", ".join(
[
"{} {}".format(ele.user.first_name, ele.user.last_name)
- for ele in project_obj.projectuser_set.filter(status__name="Active").order_by("user__last_name")
+ for ele in project_obj.projectuser_set.filter(
+ status__name__in=[
+ "Active",
+ ]
+ ).order_by("user__last_name")
]
)
+ context["ineligible_pi"] = not check_if_pis_eligible([project_obj.pi.username]).get(
+ project_obj.pi.username, True
+ )
+ context["formset"] = []
+ allocation_data = self.get_allocation_data(project_obj)
+ if allocation_data:
+ formset = formset_factory(ProjectReviewAllocationForm, max_num=len(allocation_data))
+ formset = formset(initial=allocation_data, prefix="allocationform")
+ context["formset"] = formset
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
- project_review_form = ProjectReviewForm(project_obj.pk, request.POST)
+ project_review_form = ProjectReviewForm(request.POST)
project_review_status_choice = ProjectReviewStatusChoice.objects.get(name="Pending")
+ project_status_choice = ProjectStatusChoice.objects.get(name="Review Pending")
+ allocation_renewals = []
if project_review_form.is_valid():
+ allocation_data = self.get_allocation_data(project_obj)
+ if allocation_data:
+ formset = formset_factory(ProjectReviewAllocationForm, max_num=len(allocation_data))
+ formset = formset(request.POST, initial=allocation_data, prefix="allocationform")
+
+ if formset.is_valid():
+ allocation_status_choice = AllocationStatusChoice.objects.get(name="Renewal Requested")
+ for form in formset:
+ data = form.cleaned_data
+ if data.get("renew"):
+ allocation_renewals.append(str(data.get("pk")))
+ allocation = Allocation.objects.get(pk=data.get("pk"))
+ allocation.status = allocation_status_choice
+ allocation.save()
+ else:
+ logger.error(
+ f"There was an error submitting allocation renewals for PI "
+ f"{project_obj.pi.username} (project pk={project_obj.pk})"
+ f"Errors: {formset.errors}"
+ )
+
+ messages.error(request, "There was an error submitting your allocation renewals.")
+ return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
+
form_data = project_review_form.cleaned_data
+ project_updates = form_data.get("project_updates")
+ if form_data.get("no_project_updates"):
+ project_updates = "No new project updates."
+
ProjectReview.objects.create(
project=project_obj,
- reason_for_not_updating_project=form_data.get("reason"),
+ project_updates=project_updates,
+ allocation_renewals=",".join(allocation_renewals),
status=project_review_status_choice,
)
project_obj.force_review = False
+ project_obj.status = project_status_choice
project_obj.save()
domain_url = get_domain_url(self.request)
@@ -1269,32 +1885,42 @@ def post(self, request, *args, **kwargs):
if EMAIL_ENABLED:
send_email_template(
- "New project review has been submitted",
- "email/new_project_review.txt",
- {"url": url},
+ "New project renewal has been submitted",
+ "email/new_project_renewal.txt",
+ {"url": url, "project_title": project_obj.title, "project_id": project_obj.pk},
EMAIL_SENDER,
[
- EMAIL_DIRECTOR_EMAIL_ADDRESS,
+ EMAIL_ALERTS_EMAIL_ADDRESS,
],
)
- messages.success(request, "Project reviewed successfully.")
+ if SLACK_MESSAGING_ENABLED:
+ domain_url = get_domain_url(self.request)
+ project_review_url = reverse("project-review-list")
+ url = "{}{}".format(domain_url, project_review_url)
+ text = (
+ f'A new renewal request for project "{project_obj.title}" with id '
+ f"{project_obj.pk} has been submitted. You can view it here: {url}"
+ )
+ send_message(text)
+
+ logger.info(f"User {request.user.username} submitted a project review (project pk={project_obj.pk})")
+
+ messages.success(request, "Project review submitted.")
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
- messages.error(request, "There was an error in processing your project review.")
- return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
+ messages.error(request, "There was an error in processing your project review.")
+ errors = project_review_form.errors.get("__all__")
+ if errors and len(errors):
+ for error in errors:
+ messages.error(request, error)
-class ProjectReviewListView(LoginRequiredMixin, UserPassesTestMixin, ListView):
- model = ProjectReview
- template_name = "project/project_review_list.html"
- prefetch_related = [
- "project",
- ]
- context_object_name = "project_review_list"
+ return HttpResponseRedirect(reverse("project-review", kwargs={"pk": project_obj.pk}))
- def get_queryset(self):
- return ProjectReview.objects.filter(status__name="Pending")
+
+class ProjectReviewListView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
+ template_name = "project/project_review_list.html"
def test_func(self):
"""UserPassesTestMixin Tests"""
@@ -1302,13 +1928,69 @@ def test_func(self):
if self.request.user.is_superuser:
return True
- if self.request.user.has_perm("project.can_review_pending_project_reviews"):
+ if self.request.user.has_perm("project.can_review_pending_projects"):
return True
- messages.error(self.request, "You do not have permission to review pending project reviews.")
+ messages.error(self.request, "You do not have permission to review pending project reviews/requests.")
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+
+ project_reviews = ProjectReview.objects.filter(
+ status__name__in=[
+ "Pending",
+ "Contacted By Admin",
+ ]
+ ).order_by("created")
+
+ pi_eligibilities = check_if_pis_eligible(
+ set([project_review.project.pi.username for project_review in project_reviews])
+ )
+ context["project_review_list"] = project_reviews
+ context["pi_eligibilities"] = pi_eligibilities
+
+ projects = Project.objects.filter(
+ status__name__in=[
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ ]
+ ).order_by("created")
+ context["project_request_list"] = projects
+
+ pis = set([project.pi for project in projects])
+ pis = pis.union(set([project_review.project.pi for project_review in project_reviews]))
+ pi_project_objs = Project.objects.filter(
+ Q(
+ pi__in=pis,
+ status__name__in=["Active", "Waiting For Admin Approval", "Contacted By Admin", "Review Pending"],
+ )
+ | Q(
+ pi__in=pis,
+ status__name="Expired",
+ end_date__gt=datetime.datetime.now() - datetime.timedelta(days=PROJECT_DAYS_TO_REVIEW_AFTER_EXPIRING),
+ )
+ ).order_by("status__name")
+ pi_projects = []
+ for pi_project_obj in pi_project_objs:
+ pi_projects.append(
+ {
+ "pk": pi_project_obj.pk,
+ "title": pi_project_obj.title,
+ "pi": pi_project_obj.pi.username,
+ "description": pi_project_obj.description,
+ "status": pi_project_obj.status.name,
+ "display": "false",
+ }
+ )
+ context["pi_projects"] = pi_projects
+
+ context["EMAIL_ENABLED"] = EMAIL_ENABLED
+ return context
class ProjectReviewCompleteView(LoginRequiredMixin, UserPassesTestMixin, View):
+ """Currently not in use."""
+
login_url = "/"
def test_func(self):
@@ -1317,7 +1999,7 @@ def test_func(self):
if self.request.user.is_superuser:
return True
- if self.request.user.has_perm("project.can_review_pending_project_reviews"):
+ if self.request.user.has_perm("project.can_review_pending_projects"):
return True
messages.error(self.request, "You do not have permission to mark a pending project review as completed.")
@@ -1327,8 +2009,9 @@ def get(self, request, project_review_pk):
project_review_status_completed_obj = ProjectReviewStatusChoice.objects.get(name="Completed")
project_review_obj.status = project_review_status_completed_obj
- project_review_obj.project.project_needs_review = False
- project_review_obj.save()
+ if project_review_obj.project.project_needs_review:
+ project_review_obj.project.project_needs_review = False
+ project_review_obj.save()
messages.success(request, "Project review for {} has been completed".format(project_review_obj.project.title))
@@ -1343,10 +2026,14 @@ class ProjectReviewEmailView(LoginRequiredMixin, UserPassesTestMixin, FormView):
def test_func(self):
"""UserPassesTestMixin Tests"""
+ if not EMAIL_ENABLED:
+ messages.error(self.request, "Emails are not enabled.")
+ return False
+
if self.request.user.is_superuser:
return True
- if self.request.user.has_perm("project.can_review_pending_project_reviews"):
+ if self.request.user.has_perm("project.can_review_pending_projects"):
return True
messages.error(self.request, "You do not have permission to send email for a pending project review.")
@@ -1363,13 +2050,17 @@ def get_form(self, form_class=None):
"""Return an instance of the form to be used in this view."""
if form_class is None:
form_class = self.get_form_class()
- return form_class(self.kwargs.get("pk"), **self.get_form_kwargs())
+ return form_class(self.kwargs.get("pk"), self.request.user, **self.get_form_kwargs())
def form_valid(self, form):
pk = self.kwargs.get("pk")
project_review_obj = get_object_or_404(ProjectReview, pk=pk)
form_data = form.cleaned_data
+ project_review_status_obj = ProjectReviewStatusChoice.objects.get(name="Contacted By Admin")
+ project_review_obj.status = project_review_status_obj
+ project_review_obj.save()
+
receiver_list = [project_review_obj.project.pi.email]
cc = form_data.get("cc").strip()
if cc:
@@ -1378,17 +2069,21 @@ def form_valid(self, form):
cc = []
send_email(
- "Request for more information", form_data.get("email_body"), EMAIL_DIRECTOR_EMAIL_ADDRESS, receiver_list, cc
+ f"Follow-up on Renewal for Project {project_review_obj.project.title}",
+ form_data.get("email_body"),
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ receiver_list,
+ cc,
)
-
- messages.success(
- self.request,
- "Email sent to {} {} ({})".format(
- project_review_obj.project.pi.first_name,
- project_review_obj.project.pi.last_name,
- project_review_obj.project.pi.username,
- ),
+ success_text = "Email sent to {} {} ({}).".format(
+ project_review_obj.project.pi.first_name,
+ project_review_obj.project.pi.last_name,
+ project_review_obj.project.pi.username,
)
+ if cc:
+ success_text += " CCed: {}".format(", ".join(cc))
+
+ messages.success(self.request, success_text)
return super().form_valid(form)
def get_success_url(self):
@@ -1406,7 +2101,7 @@ def test_func(self):
if self.request.user.is_superuser:
return True
else:
- messages.error(self.request, "You do not have permission to add allocation notes.")
+ messages.error(self.request, "You do not have permission to add project notes.")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
@@ -1433,6 +2128,7 @@ def get_form(self, form_class=None):
return form
def get_success_url(self):
+ logger.info(f"Admin {self.request.user.username} created a project attribute (pk={self.kwargs.get('pk')})")
return reverse("project-detail", kwargs={"pk": self.kwargs.get("pk")})
@@ -1443,17 +2139,9 @@ class ProjectAttributeCreateView(LoginRequiredMixin, UserPassesTestMixin, Create
def test_func(self):
"""UserPassesTestMixin Tests"""
- project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
-
- if self.request.user.is_superuser:
- return True
- if project_obj.pi == self.request.user:
- return True
-
- if project_obj.projectuser_set.filter(
- user=self.request.user, role__name="Manager", status__name="Active"
- ).exists():
+ user = self.request.user
+ if user.is_superuser or user.has_perm("project.add_projectattribute"):
return True
messages.error(self.request, "You do not have permission to add project attributes.")
@@ -1478,6 +2166,12 @@ def get_context_data(self, *args, **kwargs):
return context
def get_success_url(self):
+ logger.info(
+ f"Admin {self.request.user.username} created a project attribute (project pk={self.object.project_id})"
+ )
+ create_admin_action_for_creation(
+ self.request.user, self.object, get_object_or_404(Project, pk=self.object.project_id)
+ )
return reverse("project-detail", kwargs={"pk": self.object.project_id})
@@ -1489,23 +2183,14 @@ class ProjectAttributeDeleteView(LoginRequiredMixin, UserPassesTestMixin, Templa
def test_func(self):
"""UserPassesTestMixin Tests"""
- project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
-
- if self.request.user.is_superuser:
- return True
-
- if project_obj.pi == self.request.user:
- return True
-
- if project_obj.projectuser_set.filter(
- user=self.request.user, role__name="Manager", status__name="Active"
- ).exists():
+ user = self.request.user
+ if user.is_superuser or user.has_perm("project.delete_projectattribute"):
return True
messages.error(self.request, "You do not have permission to add project attributes.")
def get_avail_attrs(self, project_obj):
- if not self.request.user.is_superuser:
+ if not self.request.user.is_superuser and not self.request.user.has_perm("project.delete_projectattribute"):
avail_attrs = ProjectAttribute.objects.filter(project=project_obj, proj_attr_type__is_private=False)
else:
avail_attrs = ProjectAttribute.objects.filter(project=project_obj)
@@ -1549,6 +2234,13 @@ def post(self, request, *args, **kwargs):
proj_attr.delete()
+ create_admin_action_for_deletion(self.request.user, proj_attr, get_object_or_404(Project, pk=pk))
+
+ logger.info(
+ f"Admin {self.request.user.username} deleted {attributes_deleted_count} project "
+ f"attributes (project pk={pk})"
+ )
+
messages.success(request, "Deleted {} attributes from project.".format(attributes_deleted_count))
else:
for error in formset.errors:
@@ -1562,17 +2254,8 @@ class ProjectAttributeUpdateView(LoginRequiredMixin, UserPassesTestMixin, Templa
def test_func(self):
"""UserPassesTestMixin Tests"""
- project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
-
- if self.request.user.is_superuser:
- return True
-
- if project_obj.pi == self.request.user:
- return True
-
- if project_obj.projectuser_set.filter(
- user=self.request.user, role__name="Manager", status__name="Active"
- ).exists():
+ user = self.request.user
+ if user.is_superuser or user.has_perm("project.change_projectattribute"):
return True
def get(self, request, *args, **kwargs):
@@ -1608,8 +2291,13 @@ def post(self, request, *args, **kwargs):
if project_obj.status.name not in [
"Active",
"New",
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ "Renewal Requested",
]:
- messages.error(request, "You cannot update an attribute in an archived project.")
+ messages.error(
+ request, f"You cannot update an attribute in a project with status {project_obj.status.name}."
+ )
return HttpResponseRedirect(
reverse(
"project-attribute-update",
@@ -1626,6 +2314,10 @@ def post(self, request, *args, **kwargs):
if project_attribute_update_form.is_valid():
form_data = project_attribute_update_form.cleaned_data
+ logger.info(f"Admin {request.user.username} updated a project attribute (project pk={project_obj.pk})")
+ create_admin_action(
+ request.user, {"value": form_data.get("new_value")}, project_obj, project_attribute_obj
+ )
project_attribute_obj.value = form_data.get("new_value")
project_attribute_obj.save()
@@ -1640,3 +2332,656 @@ def post(self, request, *args, **kwargs):
kwargs={"pk": project_obj.pk, "project_attribute_pk": project_attribute_obj.pk},
)
)
+
+
+class ProjectDeniedListView(LoginRequiredMixin, ListView):
+ model = Project
+ template_name = "project/project_denied_list.html"
+ prefetch_related = [
+ "pi",
+ "status",
+ "field_of_science",
+ ]
+ context_object_name = "project_list"
+ paginate_by = 10
+
+ def get_queryset(self):
+ order_by = self.request.GET.get("order_by")
+ if order_by:
+ direction = self.request.GET.get("direction")
+ if direction == "asc":
+ direction = ""
+ else:
+ direction = "-"
+ order_by = direction + order_by
+ else:
+ order_by = "id"
+
+ project_search_form = ProjectSearchForm(self.request.GET)
+
+ if project_search_form.is_valid():
+ data = project_search_form.cleaned_data
+ if data.get("show_all_projects") and (
+ self.request.user.is_superuser or self.request.user.has_perm("project.can_view_all_projects")
+ ):
+ projects = (
+ Project.objects.prefetch_related(
+ "pi",
+ "field_of_science",
+ "status",
+ )
+ .filter(
+ status__name__in=[
+ "Denied",
+ "Renewal Denied",
+ ]
+ )
+ .order_by(order_by)
+ )
+ else:
+ projects = (
+ Project.objects.prefetch_related(
+ "pi",
+ "field_of_science",
+ "status",
+ )
+ .filter(
+ Q(
+ status__name__in=[
+ "Denied",
+ "Renewal Denied",
+ ]
+ )
+ & Q(projectuser__user=self.request.user)
+ & Q(projectuser__status__name="Active")
+ )
+ .order_by(order_by)
+ )
+
+ # Last Name
+ if data.get("last_name"):
+ projects = projects.filter(pi__last_name__icontains=data.get("last_name"))
+
+ # Username
+ if data.get("username"):
+ projects = projects.filter(pi__username__icontains=data.get("username"))
+
+ # Field of Science
+ # if data.get('field_of_science'):
+ # projects = projects.filter(
+ # field_of_science__description__icontains=data.get('field_of_science'))
+
+ else:
+ projects = (
+ Project.objects.prefetch_related(
+ "pi",
+ "field_of_science",
+ "status",
+ )
+ .filter(
+ Q(
+ status__name__in=[
+ "Denied",
+ "Renewal Denied",
+ ]
+ )
+ & Q(projectuser__user=self.request.user)
+ & Q(projectuser__status__name="Active")
+ )
+ .order_by(order_by)
+ )
+
+ return projects
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ projects_count = self.get_queryset().count()
+ context["projects_count"] = projects_count
+ context["expand"] = False
+
+ project_search_form = ProjectSearchForm(self.request.GET)
+ if project_search_form.is_valid():
+ context["project_search_form"] = project_search_form
+ data = project_search_form.cleaned_data
+ filter_parameters = ""
+ for key, value in data.items():
+ if value:
+ if isinstance(value, list):
+ for ele in value:
+ filter_parameters += "{}={}&".format(key, ele)
+ else:
+ filter_parameters += "{}={}&".format(key, value)
+ context["project_search_form"] = project_search_form
+ else:
+ filter_parameters = None
+ context["project_search_form"] = ProjectSearchForm()
+
+ order_by = self.request.GET.get("order_by")
+ if order_by:
+ direction = self.request.GET.get("direction")
+ filter_parameters_with_order_by = filter_parameters + "order_by=%s&direction=%s&" % (order_by, direction)
+ else:
+ filter_parameters_with_order_by = filter_parameters
+
+ if filter_parameters:
+ context["expand_accordion"] = "show"
+
+ context["filter_parameters"] = filter_parameters
+ context["filter_parameters_with_order_by"] = filter_parameters_with_order_by
+
+ project_list = context.get("project_list")
+ paginator = Paginator(project_list, self.paginate_by)
+
+ page = self.request.GET.get("page")
+
+ try:
+ project_list = paginator.page(page)
+ except PageNotAnInteger:
+ project_list = paginator.page(1)
+ except EmptyPage:
+ project_list = paginator.page(paginator.num_pages)
+
+ return context
+
+
+class ProjectArchiveProjectView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
+ template_name = "project/project_archive.html"
+
+ def test_func(self):
+ """UserPassesTestMixin Tests"""
+ if self.request.user.is_superuser:
+ return True
+
+ project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
+
+ if project_obj.pi == self.request.user:
+ return True
+
+ if project_obj.projectuser_set.filter(
+ user=self.request.user, role__name="Manager", status__name="Active"
+ ).exists():
+ return True
+
+ def dispatch(self, request, *args, **kwargs):
+ project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
+ if project_obj.status.name in [
+ "Denied",
+ "Waiting For Admin Approval",
+ "Review Pending",
+ "Contacted By Admin",
+ "Renewal Denied",
+ ]:
+ messages.error(request, 'You cannot archive a project with status "{}".'.format(project_obj.status.name))
+ return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
+
+ return super().dispatch(request, *args, **kwargs)
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ pk = self.kwargs.get("pk")
+ project = get_object_or_404(Project, pk=pk)
+
+ context["project"] = project
+
+ return context
+
+ def post(self, request, *args, **kwargs):
+ pk = self.kwargs.get("pk")
+ project = get_object_or_404(Project, pk=pk)
+ project_status_archive = ProjectStatusChoice.objects.get(name="Archived")
+ allocation_status_expired = AllocationStatusChoice.objects.get(name="Expired")
+ end_date = datetime.datetime.now()
+ project.status = project_status_archive
+ project.end_date = end_date
+ project.save()
+
+ # project signals
+ project_archive.send(sender=self.__class__, project_obj=project)
+
+ for allocation in project.allocation_set.filter(status__name="Active"):
+ allocation.status = allocation_status_expired
+ allocation.end_date = end_date
+ allocation.save()
+
+ allocation_expire.send(sender=ProjectArchiveProjectView, allocation_pk=allocation.pk)
+
+ logger.info(f"User {request.user.username} archived a project (project pk={project.pk})")
+ return redirect(reverse("project-detail", kwargs={"pk": project.pk}))
+
+
+class ProjectActivateRequestView(LoginRequiredMixin, UserPassesTestMixin, View):
+ login_url = "/"
+
+ def test_func(self):
+ """UserPassesTestMixin Tests"""
+
+ if not self.request.user.is_superuser:
+ if not self.request.user.has_perm("project.can_review_pending_projects"):
+ return False
+
+ project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
+ if project_obj.status.name not in [
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ ]:
+ messages.error(self.request, f'You cannot approve a project with status "{project_obj.status.name}"')
+ return False
+
+ return True
+
+ def get(self, request, pk):
+ project_obj = get_object_or_404(Project, pk=pk)
+ project_status_obj = ProjectStatusChoice.objects.get(name="Active")
+
+ create_admin_action(request.user, {"status": project_status_obj}, project_obj)
+
+ project_obj.status = project_status_obj
+ project_obj.save()
+
+ project_activate.send(sender=self.__class__, project_pk=project_obj.pk)
+ messages.success(request, "Project request for {} has been APPROVED".format(project_obj.title))
+
+ if EMAIL_ENABLED:
+ domain_url = get_domain_url(self.request)
+ project_url = "{}{}".format(domain_url, reverse("project-detail", kwargs={"pk": project_obj.pk}))
+
+ template_context = {
+ "project_title": project_obj.title,
+ "project_url": project_url,
+ "signature": EMAIL_SIGNATURE,
+ "help_email": EMAIL_TICKET_SYSTEM_ADDRESS,
+ "center_name": EMAIL_CENTER_NAME,
+ }
+
+ email_receiver_list = get_project_user_emails(project_obj)
+ send_email_template(
+ "Your Project Request Was Approved",
+ "email/project_request_approved.txt",
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ email_receiver_list,
+ )
+
+ logger.info(f"Admin {request.user.username} approved a project request (project pk={project_obj.pk})")
+ return HttpResponseRedirect(reverse("project-review-list"))
+
+
+class ProjectDenyRequestView(LoginRequiredMixin, UserPassesTestMixin, View):
+ login_url = "/"
+
+ def test_func(self):
+ """UserPassesTestMixin Tests"""
+
+ if not self.request.user.is_superuser:
+ if not self.request.user.has_perm("project.can_review_pending_projects"):
+ return False
+
+ project_obj = get_object_or_404(Project, pk=self.kwargs.get("pk"))
+ if project_obj.status.name not in [
+ "Waiting For Admin Approval",
+ "Contacted By Admin",
+ ]:
+ messages.error(self.request, f'You cannot deny a project with status "{project_obj.status.name}"')
+ return False
+
+ return True
+
+ def get(self, request, pk):
+ project_obj = get_object_or_404(Project, pk=pk)
+ project_status_obj = ProjectStatusChoice.objects.get(name="Denied")
+
+ create_admin_action(request.user, {"status": project_status_obj}, project_obj)
+
+ project_obj.status = project_status_obj
+
+ free_allocation_obj_list = project_obj.allocation_set.filter(
+ status__name__in=["Active", "New", "Renewal Requested"]
+ )
+ allocation_status_obj = AllocationStatusChoice.objects.get(name="Denied")
+ for allocation in free_allocation_obj_list:
+ allocation.status = allocation_status_obj
+ allocation.save()
+
+ paid_allocation_obj_list = project_obj.allocation_set.filter(
+ status__name__in=["Payment Requested", "Payment Pending", "Paid"]
+ )
+ allocation_status_obj = AllocationStatusChoice.objects.get(name="Payment Declined")
+ for allocation in paid_allocation_obj_list:
+ allocation.status = allocation_status_obj
+ allocation.save()
+
+ project_obj.save()
+
+ messages.success(request, "Project request for {} has been DENIED".format(project_obj.title))
+
+ if EMAIL_ENABLED:
+ domain_url = get_domain_url(self.request)
+ project_url = "{}{}".format(domain_url, reverse("project-detail", kwargs={"pk": project_obj.pk}))
+
+ template_context = {
+ "project_title": project_obj.title,
+ "project_url": project_url,
+ "signature": EMAIL_SIGNATURE,
+ "help_email": EMAIL_TICKET_SYSTEM_ADDRESS,
+ "center_name": EMAIL_CENTER_NAME,
+ }
+
+ email_receiver_list = get_project_user_emails(project_obj, True)
+
+ send_email_template(
+ "Your Project Request Was Denied",
+ "email/project_request_denied.txt",
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ email_receiver_list,
+ )
+
+ logger.info(f"Admin {request.user.username} denied a project request (project pk={project_obj.pk})")
+ return HttpResponseRedirect(reverse("project-review-list"))
+
+
+class ProjectReviewApproveView(LoginRequiredMixin, UserPassesTestMixin, View):
+ def test_func(self):
+ """UserPassesTestMixin Tests"""
+
+ if not self.request.user.is_superuser:
+ if not self.request.user.has_perm("project.can_review_pending_projects"):
+ return False
+
+ project_review_obj = get_object_or_404(ProjectReview, pk=self.kwargs.get("pk"))
+ if project_review_obj.status.name not in [
+ "Pending",
+ "Contacted By Admin",
+ ]:
+ messages.error(
+ self.request, f'You cannot approve a project review with status "{project_review_obj.status.name}"'
+ )
+ return False
+
+ return True
+
+ def get(self, request, pk):
+ project_review_obj = get_object_or_404(ProjectReview, pk=pk)
+ project_review_status_obj = ProjectReviewStatusChoice.objects.get(name="Approved")
+ project_obj = project_review_obj.project
+ project_status_obj = ProjectStatusChoice.objects.get(name="Active")
+
+ end_date = get_new_end_date_from_list(
+ project_obj.get_env.get("expiry_dates"), buffer_days=PROJECT_END_DATE_CARRYOVER_DAYS
+ )
+
+ if end_date is None:
+ logger.error(
+ f"New end date for project {project_obj.title} was set to None with project "
+ f"review creation date {project_review_obj.created.date()} during project "
+ f"review approval"
+ )
+ messages.error(request, "Something went wrong while approving the review.")
+ return HttpResponseRedirect(reverse("project-review-list"))
+
+ project_obj.end_date = end_date
+
+ create_admin_action(request.user, {"status": project_status_obj}, project_obj)
+
+ project_review_obj.status = project_review_status_obj
+ project_obj.status = project_status_obj
+ project_review_obj.save()
+ project_obj.save()
+
+ messages.success(request, "Project review for {} has been APPROVED".format(project_review_obj.project.title))
+
+ if EMAIL_ENABLED:
+ domain_url = get_domain_url(self.request)
+ project_url = "{}{}".format(
+ domain_url, reverse("project-detail", kwargs={"pk": project_review_obj.project.pk})
+ )
+
+ template_context = {
+ "project_title": project_review_obj.project.title,
+ "project_url": project_url,
+ "signature": EMAIL_SIGNATURE,
+ "help_email": EMAIL_TICKET_SYSTEM_ADDRESS,
+ "center_name": EMAIL_CENTER_NAME,
+ }
+
+ email_receiver_list = get_project_user_emails(project_obj)
+ send_email_template(
+ "Your Project Renewal Was Approved",
+ "email/project_renewal_approved.txt",
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ email_receiver_list,
+ )
+
+ logger.info(f"Admin {request.user.username} approved a project renewal request (project pk={project_obj.pk})")
+ return HttpResponseRedirect(reverse("project-review-list"))
+
+
+class ProjectReviewDenyView(LoginRequiredMixin, UserPassesTestMixin, View):
+ def test_func(self):
+ """UserPassesTestMixin Tests"""
+
+ if not self.request.user.is_superuser:
+ if not self.request.user.has_perm("project.can_review_pending_projects"):
+ return False
+
+ project_review_obj = get_object_or_404(ProjectReview, pk=self.kwargs.get("pk"))
+ if project_review_obj.status.name not in [
+ "Pending",
+ "Contacted By Admin",
+ ]:
+ messages.error(
+ self.request, f'You cannot deny a project review with status "{project_review_obj.status.name}"'
+ )
+ return False
+
+ return True
+
+ def get(self, request, pk):
+ project_review_obj = get_object_or_404(ProjectReview, pk=pk)
+ project_review_status_obj = ProjectReviewStatusChoice.objects.get(name="Denied")
+ project_obj = project_review_obj.project
+ project_status_obj = ProjectStatusChoice.objects.get(name="Renewal Denied")
+
+ create_admin_action(request.user, {"status": project_status_obj}, project_obj)
+
+ project_review_obj.status = project_review_status_obj
+ project_obj.status = project_status_obj
+
+ allocation_renewals = project_obj.allocation_set.filter(status__name="Renewal Requested")
+ if allocation_renewals:
+ allocation_active_status_choice = AllocationStatusChoice.objects.get(name="Active")
+ allocation_expired_status_choice = AllocationStatusChoice.objects.get(name="Expired")
+ for allocation in allocation_renewals:
+ if allocation.end_date < datetime.datetime.now().date():
+ allocation.status = allocation_expired_status_choice
+ allocation_expire.send(sender=ProjectReviewDenyView, allocation_pk=allocation.pk)
+ else:
+ allocation.status = allocation_active_status_choice
+ allocation.save()
+
+ project_review_obj.save()
+ project_obj.save()
+
+ messages.success(request, "Project review for {} has been DENIED".format(project_review_obj.project.title))
+
+ if EMAIL_ENABLED:
+ domain_url = get_domain_url(self.request)
+ project_url = "{}{}".format(
+ domain_url, reverse("project-detail", kwargs={"pk": project_review_obj.project.pk})
+ )
+ not_renewed_allocation_urls = []
+ if project_review_obj.allocation_renewals:
+ for allocation_pk in project_review_obj.allocation_renewals.split(","):
+ allocation_url = "{}{}".format(
+ domain_url, reverse("allocation-detail", kwargs={"pk": allocation_pk})
+ )
+ not_renewed_allocation_urls.append(allocation_url)
+
+ template_context = {
+ "project_title": project_review_obj.project.title,
+ "project_url": project_url,
+ "help_email": EMAIL_TICKET_SYSTEM_ADDRESS,
+ "center_name": EMAIL_CENTER_NAME,
+ "not_renewed_allocation_urls": not_renewed_allocation_urls,
+ "signature": EMAIL_SIGNATURE,
+ }
+
+ email_receiver_list = get_project_user_emails(project_obj, True)
+ send_email_template(
+ "Your Project Renewal Was Denied",
+ "email/project_renewal_denied.txt",
+ template_context,
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ email_receiver_list,
+ )
+
+ logger.info(f"Admin {request.user.username} denied a project renewal request (project pk={project_obj.pk})")
+ return HttpResponseRedirect(reverse("project-review-list"))
+
+
+class ProjectReviewInfoView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
+ template_name = "project/project_review_info.html"
+
+ def test_func(self):
+ """UserPassesTestMixin Tests"""
+
+ if not self.request.user.is_superuser:
+ if not self.request.user.has_perm("project.can_review_pending_projects"):
+ return False
+
+ project_review_obj = get_object_or_404(ProjectReview, pk=self.kwargs.get("pk"))
+ if project_review_obj.status.name not in ["Pending", "Contacted By Admin"]:
+ messages.error(
+ self.request, f'You cannot view a project review\'s info with status "{project_review_obj.status.name}"'
+ )
+ return False
+
+ return True
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ pk = self.kwargs.get("pk")
+ context["project_review"] = get_object_or_404(ProjectReview, pk=pk)
+
+ return context
+
+
+class ProjectRequestEmailView(LoginRequiredMixin, UserPassesTestMixin, FormView):
+ form_class = ProjectRequestEmailForm
+ template_name = "project/project_request_email.html"
+ login_url = "/"
+
+ def test_func(self):
+ """UserPassesTestMixin Tests"""
+
+ if not EMAIL_ENABLED:
+ messages.error(self.request, "Emails are not enabled.")
+ return False
+
+ if self.request.user.is_superuser:
+ return True
+
+ if self.request.user.has_perm("project.can_review_pending_projects"):
+ return True
+
+ messages.error(self.request, "You do not have permission to send email for a pending project request.")
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ pk = self.kwargs.get("pk")
+ project_obj = get_object_or_404(Project, pk=pk)
+ context["project"] = project_obj
+
+ return context
+
+ def get_form(self, form_class=None):
+ """Return an instance of the form to be used in this view."""
+ if form_class is None:
+ form_class = self.get_form_class()
+ return form_class(self.kwargs.get("pk"), self.request.user, **self.get_form_kwargs())
+
+ def form_valid(self, form):
+ pk = self.kwargs.get("pk")
+ project_obj = get_object_or_404(Project, pk=pk)
+ form_data = form.cleaned_data
+
+ project_status_obj = ProjectStatusChoice.objects.get(name="Contacted By Admin")
+ create_admin_action(self.request.user, {"status": project_status_obj}, project_obj)
+
+ project_obj.status = project_status_obj
+ project_obj.save()
+
+ if EMAIL_ENABLED:
+ receiver_list = [project_obj.requestor.email]
+ cc = form_data.get("cc").strip()
+ if cc:
+ cc = cc.split(",")
+ else:
+ cc = []
+
+ send_email(
+ f"Follow-up on Project {project_obj.title}",
+ form_data.get("email_body"),
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ receiver_list,
+ cc,
+ )
+
+ success_text = "Email sent to {} {} ({}).".format(
+ project_obj.requestor.first_name, project_obj.requestor.last_name, project_obj.requestor.username
+ )
+ if cc:
+ success_text += " CCed: {}".format(", ".join(cc))
+
+ messages.success(self.request, success_text)
+ else:
+ messages.error(self.request, "Failed to send email: Email not enabled")
+
+ logger.warning("Email has not been enabled")
+ return super().form_invalid(form)
+
+ return super().form_valid(form)
+
+ def get_success_url(self):
+ return reverse("project-review-list")
+
+
+class ProjectRequestAccessEmailView(LoginRequiredMixin, View):
+ def post(self, request):
+ project_obj = get_object_or_404(Project, pk=request.POST.get("project_pk"))
+ if project_obj.private is True:
+ logger.warning(
+ "User {} attempted to request access to a private project (pk={})".format(
+ request.user.username, project_obj.pk
+ )
+ )
+ return HttpResponseForbidden(reverse("project-list"))
+
+ domain_url = get_domain_url(self.request)
+ project_url = "{}{}".format(domain_url, reverse("project-detail", kwargs={"pk": project_obj.pk}))
+
+ if EMAIL_ENABLED:
+ send_email_template(
+ "Add User to Project Request",
+ "email/project_add_user_request.txt",
+ {
+ "center_name": EMAIL_CENTER_NAME,
+ "user": request.user,
+ "project_title": project_obj.title,
+ "project_url": project_url,
+ "help_email": EMAIL_TICKET_SYSTEM_ADDRESS,
+ "signature": EMAIL_SIGNATURE,
+ },
+ EMAIL_TICKET_SYSTEM_ADDRESS,
+ [project_obj.pi.email],
+ )
+ logger.info(
+ f"User {request.user.username} sent an email to {project_obj.pi.email} requesting "
+ f"access to their project (project pk={project_obj.pk})"
+ )
+ else:
+ logger.warning("Email has not been enabled")
+ return HttpResponseForbidden(reverse("project-list"))
+
+ return HttpResponseRedirect(reverse("project-list"))
diff --git a/coldfront/core/publication/forms.py b/coldfront/core/publication/forms.py
index ae9c1a5ae7..81ffe331f0 100644
--- a/coldfront/core/publication/forms.py
+++ b/coldfront/core/publication/forms.py
@@ -19,6 +19,7 @@ class PublicationSearchForm(forms.Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["search_id"].help_text = " Enter ID such as DOI or Bibliographic Code to search."
+ self.fields["search_id"].widget.attrs.update({"placeholder": "12.3456/1234567.8912345 OR YYYYJJJJJVVVVMPPPPA"})
class PublicationResultForm(forms.Form):
@@ -34,6 +35,7 @@ class PublicationResultForm(forms.Form):
class PublicationDeleteForm(forms.Form):
title = forms.CharField(max_length=255, disabled=True)
year = forms.CharField(max_length=30, disabled=True)
+ unique_id = forms.CharField(max_length=255, disabled=True)
selected = forms.BooleanField(initial=False, required=False)
diff --git a/coldfront/core/publication/management/commands/update_publication_catalog.py b/coldfront/core/publication/management/commands/update_publication_catalog.py
new file mode 100644
index 0000000000..63896977e2
--- /dev/null
+++ b/coldfront/core/publication/management/commands/update_publication_catalog.py
@@ -0,0 +1,227 @@
+import datetime
+import json
+import pathlib
+import urllib.request
+from argparse import ArgumentParser
+from urllib.parse import quote
+from xml.etree import ElementTree
+
+import feedparser
+import pymupdf
+import requests
+from django.core.management.base import BaseCommand
+
+from coldfront.core.publication.models import Publication
+
+
+class Command(BaseCommand):
+ help = "Updates the publication catalog by fetching latest citation information from Crossref for each publication."
+
+ def add_arguments(self, parser: ArgumentParser) -> None:
+ parser.add_argument(
+ "--process_pdfs",
+ action="store_true",
+ help="If images of the first page of the pdfs for each citation should be saved.",
+ )
+ parser.add_argument(
+ "--update",
+ action="store_true",
+ help="If existing citations should be replaced. Set --date if only citations before a certain date should be.",
+ )
+ parser.add_argument(
+ "--date",
+ type=str,
+ default=datetime.date.today().isoformat(),
+ help="Only used if --update is enabled. All citations created before this date will be replaced.",
+ )
+ parser.add_argument(
+ "--dir",
+ type=str,
+ default=".",
+ help="Where all the files are stored/saved.",
+ )
+
+ def handle(self, *args, **kwargs) -> None:
+ process_pdfs = kwargs.get("process_pdfs")
+ update = kwargs.get("update")
+ date = kwargs.get("date")
+ date = datetime.datetime.strptime(date, "%Y-%m-%d")
+ dir = kwargs.get("dir")
+
+ publications = set(
+ Publication.objects.filter().exclude(source__name="manual").values_list("id", "unique_id", "title")
+ )
+
+ dir = pathlib.Path(dir)
+ cache_file = dir / "catalog_cache.json"
+ cache_file.touch()
+ with cache_file.open() as cf:
+ try:
+ cache = json.load(cf)
+ except json.decoder.JSONDecodeError:
+ cache = {}
+
+ cache = self.get_citations(publications, cache, update, date)
+ cache = self.get_screenshots(publications, cache, process_pdfs, dir)
+ self.save_files(cache, cache_file, dir)
+
+ def save_files(self, cache: dict, cache_file: pathlib.Path, dir: pathlib.Path) -> None:
+ """Saves the updated citation information along with these files to the specified directory:
+ * apa.text: Conatins rows of citations in alphabetical order.
+ * links.txt: Contains rows of pub_id and DOI links.
+ * missing_pdfs: Contains rows of pub_id and DOI links for PDFs that were not able to be downloaded.
+
+ Parameters:
+ cache (dact): The updated citation information in the form {pub_id: {'citation': citation, 'auto_png': auto_png, 'created': created}, ...}.
+ cache_file (pathlib.Path): The path to the cache file where the updated citation information will be saved.
+ dir (pathlib.Path): The path to the directory where the files will be saved in.
+ """
+ with cache_file.open("w") as json_cache:
+ json.dump(cache, json_cache, indent=4)
+
+ with (dir / "apa.txt").open("w") as apa:
+ apa.writelines(sorted([values.get("citation") for values in cache.values()]))
+
+ with (dir / "links.txt").open("w") as missing_pdfs:
+ missing_pdfs.writelines(
+ f"{id} {values.get('citation').rsplit(' ', 1)[-1]}"
+ for id, values in cache.items()
+ if values.get("auto_png")
+ )
+
+ with (dir / "missing_pdfs.txt").open("w") as missing_pdfs:
+ missing_pdfs.writelines(
+ f"{id} {values.get('citation').rsplit(' ', 1)[-1]}"
+ for id, values in cache.items()
+ if not values.get("auto_png")
+ )
+
+ def get_citations(self, publications: set, cache: dict, update: bool, date: str) -> dict:
+ """Fetches latest citation information from Crossref for each publication.
+
+ Parameters:
+ publications (set): Publications in the form of [(pub_id, unique_id, title), ...].
+ cache (dict): Previously fetched citation information in the form {pub_id: {'citation': citation, 'auto_png': auto_png, 'created': created}, ...}.
+ update (bool): If set to True, the command will update existing citations based on the date parameter. If set to False, the command will only add new citations.
+ date (str): The date before which citations are updated. This parameter is only used if update is set to True.
+
+ Returns:
+ Updated citation information in the form {pub_id: {'citation': citation, 'auto_png': auto_png, 'created': created}, ...}.
+ """
+ todays_date = datetime.date.today().isoformat()
+ for pub_id, unique_id, _ in publications:
+ cached_citation = cache.get(str(pub_id))
+ if cached_citation:
+ if not update:
+ continue
+ if datetime.datetime.strptime(cached_citation.get("created"), "%Y-%m-%d") > date:
+ continue
+
+ valid, citation = self.get_citation(unique_id)
+ if valid:
+ cache[str(pub_id)] = {
+ "citation": self.fix_formatting(citation),
+ "auto_png": False,
+ "has_png": False,
+ "created": todays_date,
+ }
+
+ return cache
+
+ def get_citation(self, doi_number: str) -> tuple:
+ """Fetches the citation information from Crossref for a given publication.
+
+ Parameters:
+ doi_number (str): The DOI number of the publication.
+
+ Returns:
+ A boolean value indicating whether the citation was found and the citation itself.
+ """
+ api_url = f"https://api.crossref.org/works/{doi_number}/transform/text/x-bibliography"
+ req = requests.get(api_url)
+ valid = req.status_code == 200
+ citation = str(req.content, encoding="utf-8")
+
+ return valid, citation
+
+ def get_screenshots(self, publications: set, cache: dict, process_pdfs: bool, dir: str) -> dict:
+ """Fetches the first page of the PDF for each publication and saves it as an image file.
+
+ Parameters:
+ publications (set): Publications in the form [(pub_id, unique_id, title), ...].
+ cache (dict): Previously fetched citation information in the form {pub_id: {'citation': citation, 'auto_png': auto_png, 'created': created}, ...}.
+ process_pdfs (bool): If set to True, the command will fetch the first page of each PDF for each citation.
+ dir (str): The directory where the image files will be saved.
+
+ Returns:
+ The updated citation information in the form {pub_id: {'citation': citation, 'auto_png': auto_png, 'created': created}, ...}.
+ """
+ for pub_id, unique_id, title in publications:
+ if cache.get(str(pub_id), {}).get("auto_png"):
+ continue
+ if process_pdfs:
+ valid = self.get_screenshot(title, unique_id, pub_id, dir)
+ cache[str(pub_id)]["auto_png"] = valid
+ cache[str(pub_id)]["has_png"] = valid
+
+ return cache
+
+ def get_screenshot(self, title: str, unique_id: str, pub_id: int, dir: str) -> bool:
+ """Fetches the first page of the PDF for a given publication and saves it as an image file.
+
+ Parameters:
+ title (str): The title of the publication.
+ unique_id (str): The DOI ID of the publication.
+ pub_id (int): The ID of the publication.
+ dir (dir): The directory where the image file will be saved.
+ Returns:
+ A boolean value indicating whether the image file was successfully saved.
+ """
+ png_file = dir / "images" / f"{pub_id}.png"
+ if png_file.exists():
+ return True
+
+ parser = feedparser.parse(f"http://export.arxiv.org/api/query?search_query=ti:{quote(title)}")
+ for entry in parser.get("entries"):
+ if entry.get("arxiv_doi") == unique_id:
+ for link in entry.get("links"):
+ if link.get("title") == "pdf":
+ path, _ = urllib.request.urlretrieve(link.get("href"))
+ doc = pymupdf.open(path)
+ doc[0].get_pixmap().save(png_file)
+ return True
+ return False
+
+ def fix_formatting(self, citation: str) -> str:
+ """Formats the citation to remove any mml tags.
+
+ Parameters:
+ citation (str): The citation.
+ Returns:
+ Formatted citation.
+
+ """
+ mathml_start = citation.find("= 0:
+ mathml_end = citation.find("") + len("")
+ root = ElementTree.fromstring(citation[mathml_start:mathml_end])
+ combined_text = self.get_text_from_xml_ele(root, "")
+ citation = " ".join([citation[:mathml_start], combined_text, citation[mathml_end:]])
+ mathml_start = citation.find(" str:
+ """Extracts the text from an XML element.
+
+ Parameters:
+ ele (ElementTree.Element): The XML element.
+ text (str): The previous extracted text.
+ Returns:
+ Extracted text.
+ """
+ if ele.text is None:
+ sub_text = ""
+ for sub_ele in ele:
+ sub_text += self.get_text_from_xml_ele(sub_ele, text)
+ return sub_text
+ return text + ele.text
diff --git a/coldfront/core/publication/migrations/0005_alter_historicalpublication_options_and_more.py b/coldfront/core/publication/migrations/0005_alter_historicalpublication_options_and_more.py
new file mode 100644
index 0000000000..ef6a73b188
--- /dev/null
+++ b/coldfront/core/publication/migrations/0005_alter_historicalpublication_options_and_more.py
@@ -0,0 +1,26 @@
+# Generated by Django 4.2.11 on 2024-10-31 13:39
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("publication", "0004_add_manual_publication_source"),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name="historicalpublication",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical publication",
+ "verbose_name_plural": "historical publications",
+ },
+ ),
+ migrations.AlterField(
+ model_name="historicalpublication",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ ]
diff --git a/coldfront/core/publication/urls.py b/coldfront/core/publication/urls.py
index d80aa78807..5031fff035 100644
--- a/coldfront/core/publication/urls.py
+++ b/coldfront/core/publication/urls.py
@@ -33,4 +33,6 @@
publication_views.PublicationExportPublicationsView.as_view(),
name="publication-export-publications",
),
+ path("publication_catalogue", publication_views.publication_catalogue, name="publication_catalogue"),
+ path("publication_gallery", publication_views.publication_gallery, name="publication_gallery"),
]
diff --git a/coldfront/core/publication/views.py b/coldfront/core/publication/views.py
index 6cb8f36cfc..fee3c4b24c 100644
--- a/coldfront/core/publication/views.py
+++ b/coldfront/core/publication/views.py
@@ -4,12 +4,14 @@
import ast
import io
+import os
import re
import uuid
import requests
from bibtexparser.bibdatabase import as_text
from bibtexparser.bparser import BibTexParser
+from django.conf import settings
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.forms import formset_factory
@@ -33,6 +35,78 @@
MANUAL_SOURCE = "manual"
+def publication_gallery(request):
+ static_dir = settings.SITE_STATIC
+ image_dir = os.path.join(static_dir, "images")
+ context = {}
+ imgs, lnks, titles = [], [], []
+
+ # Load links.txt (key, url, title)
+ with open(os.path.join(static_dir, "links.txt"), "r") as f:
+ entries = f.read().strip().split("\n")
+ link_data = {}
+ for entry in entries:
+ parts = entry.split("\t")
+ if len(parts) >= 3:
+ key = parts[0]
+ url = parts[1]
+ title = "\t".join(parts[2:])
+ link_data[key] = (url, title)
+
+ # Determine which keys actually have an image file on disk
+ existing_keys = {
+ os.path.splitext(fname)[0]
+ for fname in os.listdir(image_dir)
+ if os.path.isfile(os.path.join(image_dir, fname))
+ }
+
+ # Keep only link entries that have a corresponding image
+ link_data = {k: v for k, v in link_data.items() if k in existing_keys}
+
+ # Build parallel lists, showing only images that have a link
+ for image_name in sorted(os.listdir(image_dir)):
+ full_path = os.path.join(image_dir, image_name)
+ if not os.path.isfile(full_path):
+ continue
+ img_key = os.path.splitext(image_name)[0]
+ if img_key not in link_data:
+ continue
+ imgs.append("/static/images/" + image_name)
+ url, title = link_data[img_key]
+ lnks.append(url)
+ titles.append(title)
+
+ items = ["item item" + str((i % 3) + 1) for i in range(len(imgs))]
+ context["data"] = list(zip(imgs, lnks, titles, items))
+ return render(request, "publication/publication_gallery.html", context)
+
+
+def publication_catalogue(request):
+ static_dir = settings.SITE_STATIC
+
+ context = {}
+ with open(os.path.join(static_dir, "apa.txt"), "r+") as f:
+ temp = {}
+ for line in f.readlines():
+ test = line.split("(")
+ for i in test:
+ if ("20" in i and i[:4].isdigit()) or "n.d." in i:
+ t = i[:4]
+ if t not in temp:
+ temp[t] = []
+ temp[t].append(line)
+ cnt = 0
+ temp = dict(sorted(temp.items(), reverse=True))
+ for t in temp:
+ temp[t] = [
+ [(f"[{cnt + i}]\t" + x).replace(re.search("(https://).*", x)[0], ""), re.search("(https://).*", x)[0]]
+ for i, x in enumerate(temp[t])
+ ]
+ cnt += len(temp[t])
+ context["data"] = temp
+ return render(request, "publication/publication_catalogue.html", context)
+
+
class PublicationSearchView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
template_name = "publication/publication_add_publication_search.html"
@@ -53,11 +127,15 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("project_pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot add publications to an archived project.")
+ messages.error(
+ request, 'You cannot add publications to a project with status "{}".'.format(project_obj.status.name)
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
@@ -66,6 +144,10 @@ def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context["publication_search_form"] = PublicationSearchForm()
context["project"] = Project.objects.get(pk=self.kwargs.get("project_pk"))
+ context["academics_analytics_enabled"] = False
+ if "coldfront.plugins.academic_analytics" in settings.INSTALLED_APPS:
+ context["academics_analytics_enabled"] = True
+ context["username"] = self.request.user.username
return context
@@ -89,11 +171,15 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("project_pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot add publications to an archived project.")
+ messages.error(
+ request, 'You cannot add publications to a project with status "{}".'.format(project_obj.status.name)
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"project_pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
@@ -220,11 +306,15 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("project_pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot add publications to an archived project.")
+ messages.error(
+ request, 'You cannot add publications to a project with status "{}".'.format(project_obj.status.name)
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
@@ -305,11 +395,15 @@ def test_func(self):
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("project_pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
+ "Expired",
+ "Renewal Denied",
]:
- messages.error(request, "You cannot add publications to an archived project.")
+ messages.error(
+ request, 'You cannot add publications to a project with status "{}".'.format(project_obj.status.name)
+ )
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
@@ -366,7 +460,7 @@ def test_func(self):
def get_publications_to_delete(self, project_obj):
publications_do_delete = [
- {"title": publication.title, "year": publication.year}
+ {"title": publication.title, "year": publication.year, "unique_id": publication.unique_id}
for publication in project_obj.publication_set.all().order_by("-year")
]
@@ -404,6 +498,7 @@ def post(self, request, *args, **kwargs):
project=project_obj,
title=publication_form_data.get("title"),
year=publication_form_data.get("year"),
+ unique_id=publication_form_data.get("unique_id"),
)
publication_obj.delete()
publications_deleted_count += 1
@@ -505,4 +600,4 @@ def post(self, request, *args, **kwargs):
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
def get_success_url(self):
- return reverse("project-detail", kwargs={"pk": self.object.project.id})
+ return reverse("project-detail", kwargs={"pk": self.object.project.id})
\ No newline at end of file
diff --git a/coldfront/core/research_output/migrations/0002_alter_historicalresearchoutput_options_and_more.py b/coldfront/core/research_output/migrations/0002_alter_historicalresearchoutput_options_and_more.py
new file mode 100644
index 0000000000..54f6f644c9
--- /dev/null
+++ b/coldfront/core/research_output/migrations/0002_alter_historicalresearchoutput_options_and_more.py
@@ -0,0 +1,26 @@
+# Generated by Django 4.2.11 on 2024-10-31 13:39
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("research_output", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name="historicalresearchoutput",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical research output",
+ "verbose_name_plural": "historical research outputs",
+ },
+ ),
+ migrations.AlterField(
+ model_name="historicalresearchoutput",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ ]
diff --git a/coldfront/core/resource/admin.py b/coldfront/core/resource/admin.py
index 34c40c2a6d..80a9a98972 100644
--- a/coldfront/core/resource/admin.py
+++ b/coldfront/core/resource/admin.py
@@ -63,12 +63,19 @@ def attribute_type_name(self, obj):
class ResourceAttributeInline(admin.TabularInline):
model = ResourceAttribute
+ readonly_fields = ("resource_attribute_type_description",)
fields_change = (
"resource_attribute_type",
"value",
+ "is_required",
+ "check_if_username_exists",
+ "resource_account_is_required",
)
extra = 0
+ def resource_attribute_type_description(self, obj):
+ return obj.resource_attribute_type.description
+
def get_fields(self, request, obj):
if obj is None:
return super().get_fields(request)
@@ -88,6 +95,8 @@ class ResourceAdmin(SimpleHistoryAdmin):
"is_available",
"is_public",
"requires_payment",
+ "requires_user_roles",
+ "review_groups",
"allowed_groups",
"allowed_users",
"linked_resources",
@@ -95,7 +104,6 @@ class ResourceAdmin(SimpleHistoryAdmin):
list_display = (
"pk",
"name",
- "description",
"parent_resource",
"is_allocatable",
"resource_type_name",
@@ -110,6 +118,7 @@ class ResourceAdmin(SimpleHistoryAdmin):
ResourceAttributeInline,
]
filter_horizontal = [
+ "review_groups",
"allowed_groups",
"allowed_users",
"linked_resources",
@@ -132,6 +141,9 @@ class ResourceAttributeAdmin(SimpleHistoryAdmin):
"pk",
"resource_name",
"value",
+ "is_required",
+ "check_if_username_exists",
+ "resource_account_is_required",
"resource_attribute_type_name",
"created",
"modified",
diff --git a/coldfront/core/resource/management/commands/add_resource_defaults.py b/coldfront/core/resource/management/commands/add_resource_defaults.py
index c93753564e..b6fb0dbea0 100644
--- a/coldfront/core/resource/management/commands/add_resource_defaults.py
+++ b/coldfront/core/resource/management/commands/add_resource_defaults.py
@@ -19,6 +19,7 @@ def handle(self, *args, **options):
"Text",
"Yes/No",
"Attribute Expanded Text",
+ "True/False",
):
AttributeType.objects.get_or_create(name=attribute_type)
@@ -44,7 +45,100 @@ def handle(self, *args, **options):
("RackUnits", "Int"),
("InstallDate", "Date"),
("WarrantyExpirationDate", "Date"),
+ ("access_level", "Text"),
+ ("access_level_label", "Text"),
+ ("account_number", "Text"),
+ ("account_number_label", "Text"),
+ ("applications_list", "Text"),
+ ("applications_list_label", "Text"),
+ ("campus_affiliation", "Text"),
+ ("campus_affiliation_label", "Text"),
+ ("check_user_account", "Text"),
+ ("confirm_understanding", "True/False"),
+ ("confirm_understanding_label", "Text"),
+ ("cost", "Int"),
+ ("cost_label", "Text"),
+ ("data_management_plan", "Text"),
+ ("data_management_plan_label", "Text"),
+ ("department_full_name", "Text"),
+ ("department_full_name_label", "Text"),
+ ("department_short_name", "Text"),
+ ("department_short_name_label", "Text"),
+ ("devices_ip_addresses", "Text"),
+ ("devices_ip_addresses_label", "Text"),
+ ("dl_workflow", "Yes/No"),
+ ("dl_workflow_label", "Text"),
+ ("email", "Text"),
+ ("email_label", "Text"),
+ ("end_date", "Date"),
+ ("end_date_label", "Text"),
+ ("expiry_time", "Int"),
+ ("faculty_email", "Text"),
+ ("faculty_email_label", "Text"),
+ ("first_name", "Text"),
+ ("first_name_label", "Text"),
+ ("fiscal_officer", "Text"),
+ ("fiscal_officer_label", "Text"),
+ ("for_coursework", "Yes/No"),
+ ("for_coursework_label", "Text"),
+ ("it_pro", "Text"),
+ ("it_pro_label", "Text"),
+ ("last_name", "Text"),
+ ("last_name_label", "Text"),
+ ("leverage_multiple_gpus", "Yes/No"),
+ ("leverage_multiple_gpus_label", "Text"),
+ ("phi_association", "Yes/No"),
+ ("phi_association_label", "Text"),
+ ("primary_contact", "Text"),
+ ("primary_contact_label", "Text"),
+ ("project_directory_name", "Text"),
+ ("project_directory_name_label", "Text"),
+ ("prorated", "True/False"),
+ ("prorated_cost_label", "Text"),
+ ("secondary_contact", "Text"),
+ ("secondary_contact_label", "Text"),
+ ("start_date", "Date"),
+ ("start_date_label", "Text"),
+ ("storage_space", "Int"),
+ ("storage_space_label", "Text"),
+ ("storage_space_unit", "Text"),
+ ("storage_space_unit_label", "Text"),
+ ("store_ephi", "Yes/No"),
+ ("store_ephi_label", "Text"),
+ ("sub_account_number", "Text"),
+ ("sub_account_number_label", "Text"),
+ ("system", "Text"),
+ ("system_label", "Text"),
+ ("training_or_inference", "Text"),
+ ("training_or_inference_label", "Text"),
+ ("url", "Text"),
+ ("url_label", "Text"),
+ ("user_limit", "Int"),
("allocation_limit", "Int"),
+ ("phone_number", "Text"),
+ ("phone_number_label", "Text"),
+ ("terms_of_service", "True/False"),
+ ("terms_of_service_label", "Text"),
+ ("data_management_responsibilities", "True/False"),
+ ("data_management_responsibilities_label", "Text"),
+ ("admin_ads_group", "Text"),
+ ("admin_ads_group_label", "Text"),
+ ("user_ads_group", "Text"),
+ ("user_ads_group_label", "Text"),
+ ("confirm_best_practices", "True/False"),
+ ("confirm_best_practices_label", "Text"),
+ ("gpu_workflow", "True/False"),
+ ("gpu_workflow_label", "Text"),
+ ("will_exceed_limit", "Yes/No"),
+ ("will_exceed_limit_label", "Text"),
+ ("department_primary_campus", "Text"),
+ ("department_primary_campus_label", "Text"),
+ ("use_indefinitely", "True/False"),
+ ("use_indefinitely_labek", "Text"),
+ ("group_name", "Text"),
+ ("group_name_label", "Text"),
+ ("help_url", "Text"),
+ ("allocation_limit_per_pi", "Int"),
):
ResourceAttributeType.objects.get_or_create(
name=resource_attribute_type, attribute_type=AttributeType.objects.get(name=attribute_type)
@@ -58,5 +152,6 @@ def handle(self, *args, **options):
("Server", "Extra servers providing various services"),
("Software License", "Software license purchased by users"),
("Storage", "NAS storage"),
+ ("Service", "Services"),
):
ResourceType.objects.get_or_create(name=resource_type, description=description)
diff --git a/coldfront/core/resource/migrations/0003_auto_20210817_1130_squashed_0008_alter_historicalresource_options_and_more.py b/coldfront/core/resource/migrations/0003_auto_20210817_1130_squashed_0008_alter_historicalresource_options_and_more.py
new file mode 100644
index 0000000000..7d4d890d5e
--- /dev/null
+++ b/coldfront/core/resource/migrations/0003_auto_20210817_1130_squashed_0008_alter_historicalresource_options_and_more.py
@@ -0,0 +1,139 @@
+# Generated by Django 4.2.11 on 2025-10-16 18:49
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("resource", "0002_auto_20191017_1141"),
+ ("auth", "0012_alter_user_first_name_max_length"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="historicalresourceattribute",
+ name="value",
+ field=models.TextField(blank=True),
+ ),
+ migrations.AlterField(
+ model_name="resourceattribute",
+ name="value",
+ field=models.TextField(blank=True),
+ ),
+ migrations.AddField(
+ model_name="resource",
+ name="review_groups",
+ field=models.ManyToManyField(blank=True, related_name="review_groups_resource_set", to="auth.group"),
+ ),
+ migrations.AddField(
+ model_name="historicalresourceattributetype",
+ name="description",
+ field=models.TextField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name="resourceattributetype",
+ name="description",
+ field=models.TextField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name="historicalresourceattribute",
+ name="check_if_username_exists",
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name="historicalresourceattribute",
+ name="is_required",
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name="historicalresourceattribute",
+ name="resource_account_is_required",
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name="resourceattribute",
+ name="check_if_username_exists",
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name="resourceattribute",
+ name="is_required",
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name="resourceattribute",
+ name="resource_account_is_required",
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name="historicalresource",
+ name="requires_user_roles",
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name="resource",
+ name="requires_user_roles",
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AlterModelOptions(
+ name="historicalresource",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical resource",
+ "verbose_name_plural": "historical resources",
+ },
+ ),
+ migrations.AlterModelOptions(
+ name="historicalresourceattribute",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical resource attribute",
+ "verbose_name_plural": "historical resource attributes",
+ },
+ ),
+ migrations.AlterModelOptions(
+ name="historicalresourceattributetype",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical resource attribute type",
+ "verbose_name_plural": "historical resource attribute types",
+ },
+ ),
+ migrations.AlterModelOptions(
+ name="historicalresourcetype",
+ options={
+ "get_latest_by": ("history_date", "history_id"),
+ "ordering": ("-history_date", "-history_id"),
+ "verbose_name": "historical resource type",
+ "verbose_name_plural": "historical resource types",
+ },
+ ),
+ migrations.AlterField(
+ model_name="historicalresource",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ migrations.AlterField(
+ model_name="historicalresourceattribute",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ migrations.AlterField(
+ model_name="historicalresourceattributetype",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ migrations.AlterField(
+ model_name="historicalresourcetype",
+ name="history_date",
+ field=models.DateTimeField(db_index=True),
+ ),
+ migrations.AlterField(
+ model_name="resource",
+ name="linked_resources",
+ field=models.ManyToManyField(blank=True, to="resource.resource"),
+ ),
+ ]
diff --git a/coldfront/core/resource/models.py b/coldfront/core/resource/models.py
index d2a5531022..934fed5597 100644
--- a/coldfront/core/resource/models.py
+++ b/coldfront/core/resource/models.py
@@ -2,8 +2,10 @@
#
# SPDX-License-Identifier: AGPL-3.0-or-later
+import logging
from datetime import datetime
+from django.conf import settings
from django.contrib.auth.models import Group, User
from django.core.exceptions import ValidationError
from django.db import models
@@ -11,6 +13,15 @@
from simple_history.models import HistoricalRecords
import coldfront.core.attribute_expansion as attribute_expansion
+from coldfront.core.resource.utils import get_user_account_statuses
+from coldfront.core.utils.common import import_from_settings
+
+if "coldfront.plugins.ldap_misc" in settings.INSTALLED_APPS:
+ from coldfront.plugins.ldap_misc.utils.resource import get_user_account_statuses
+
+logger = logging.getLogger(__name__)
+
+ADDITIONAL_USER_SEARCH_CLASSES = import_from_settings("ADDITIONAL_USER_SEARCH_CLASSES", [])
class AttributeType(TimeStampedModel):
@@ -92,6 +103,7 @@ class ResourceAttributeType(TimeStampedModel):
attribute_type = models.ForeignKey(AttributeType, on_delete=models.CASCADE)
name = models.CharField(max_length=128)
+ description = models.TextField(blank=True, null=True)
is_required = models.BooleanField(default=False)
is_unique_per_resource = models.BooleanField(default=False)
is_value_unique = models.BooleanField(default=False)
@@ -138,6 +150,8 @@ def get_by_natural_key(self, name):
is_public = models.BooleanField(default=True)
is_allocatable = models.BooleanField(default=True)
requires_payment = models.BooleanField(default=False)
+ requires_user_roles = models.BooleanField(default=False)
+ review_groups = models.ManyToManyField(Group, blank=True, related_name="review_groups_resource_set")
allowed_groups = models.ManyToManyField(Group, blank=True)
allowed_users = models.ManyToManyField(User, blank=True)
linked_resources = models.ManyToManyField("self", blank=True)
@@ -229,6 +243,9 @@ def get_ondemand_status(self):
return ondemand.value
return None
+ def get_user_account_statuses(self, usernames, accounts=None):
+ return get_user_account_statuses(usernames, self.get_attribute("check_user_account"), accounts)
+
def __str__(self):
return "%s (%s)" % (self.name, self.resource_type.name)
@@ -247,27 +264,33 @@ class ResourceAttribute(TimeStampedModel):
resource_attribute_type = models.ForeignKey(ResourceAttributeType, on_delete=models.CASCADE)
resource = models.ForeignKey(Resource, on_delete=models.CASCADE)
- value = models.TextField()
+ value = models.TextField(blank=True)
+ is_required = models.BooleanField(default=False)
+ check_if_username_exists = models.BooleanField(default=False)
+ resource_account_is_required = models.BooleanField(default=False)
history = HistoricalRecords()
def clean(self):
"""Validates the resource and raises errors if the resource is invalid."""
expected_value_type = self.resource_attribute_type.attribute_type.name.strip()
-
- if expected_value_type == "Int" and not self.value.isdigit():
+ if expected_value_type == "Int" and not self.value.isdigit() and self.value != "":
raise ValidationError('Invalid Value "%s". Value must be an integer.' % (self.value))
- elif expected_value_type == "Active/Inactive" and self.value not in ["Active", "Inactive"]:
+ elif expected_value_type == "Active/Inactive" and self.value not in ["Active", "Inactive", ""]:
raise ValidationError('Invalid Value "%s". Allowed inputs are "Active" or "Inactive".' % (self.value))
- elif expected_value_type == "Public/Private" and self.value not in ["Public", "Private"]:
+ elif expected_value_type == "Public/Private" and self.value not in ["Public", "Private", ""]:
raise ValidationError('Invalid Value "%s". Allowed inputs are "Public" or "Private".' % (self.value))
- elif expected_value_type == "Date":
+ elif expected_value_type == "Yes/No" and self.value not in ["Yes", "No", ""]:
+ raise ValidationError('Invalid Value "%s". Allowed inputs are "Yes" or "No".' % (self.value))
+ elif expected_value_type == "True/False" and self.value not in ["True", "False", ""]:
+ raise ValidationError('Invalid Value "%s". Allowed inputs are "True" or "False".' % (self.value))
+ elif expected_value_type == "Date" and not self.value == "":
try:
datetime.strptime(self.value.strip(), "%m/%d/%Y")
except ValueError:
raise ValidationError('Invalid Value "%s". Date must be in format MM/DD/YYYY' % (self.value))
def __str__(self):
- return "%s: %s (%s)" % (self.resource_attribute_type, self.value, self.resource)
+ return "%s (%s)" % (self.resource_attribute_type, self.resource_attribute_type.attribute_type.name)
def typed_value(self):
"""
diff --git a/coldfront/core/resource/utils.py b/coldfront/core/resource/utils.py
new file mode 100644
index 0000000000..e2363a0b93
--- /dev/null
+++ b/coldfront/core/resource/utils.py
@@ -0,0 +1,2 @@
+def get_user_account_statuses(usernames, resource, accounts=None):
+ return dict.fromkeys(usernames, {"exists": True, "reason": "not_enabled"})
diff --git a/coldfront/core/resource/views.py b/coldfront/core/resource/views.py
index 7f9e4aca3a..18d7b2228f 100644
--- a/coldfront/core/resource/views.py
+++ b/coldfront/core/resource/views.py
@@ -1,6 +1,7 @@
# SPDX-FileCopyrightText: (C) ColdFront Authors
#
# SPDX-License-Identifier: AGPL-3.0-or-later
+import logging
from django import forms
from django.contrib import messages
@@ -16,8 +17,15 @@
from django.views.generic.edit import CreateView
from coldfront.config.core import ALLOCATION_EULA_ENABLE
-from coldfront.core.resource.forms import ResourceAttributeCreateForm, ResourceAttributeDeleteForm, ResourceSearchForm
+from coldfront.core.resource.forms import (
+ ResourceAttributeCreateForm,
+ ResourceAttributeDeleteForm,
+ ResourceSearchForm,
+)
from coldfront.core.resource.models import Resource, ResourceAttribute
+from coldfront.core.utils.groups import check_if_groups_in_review_groups
+
+logger = logging.getLogger(__name__)
class ResourceEULAView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
@@ -52,7 +60,21 @@ class ResourceDetailView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
def test_func(self):
"""UserPassesTestMixin Tests"""
- return True
+
+ if self.request.user.is_superuser:
+ return True
+
+ resource_obj = get_object_or_404(Resource, pk=self.kwargs.get("pk"))
+ if resource_obj.is_allocatable:
+ return True
+
+ group_exists = check_if_groups_in_review_groups(
+ resource_obj.review_groups.all(), self.request.user.groups.all(), "view_resource"
+ )
+ if group_exists:
+ return True
+
+ messages.error(self.request, "You do not have permission to view this resource's attributes.")
def get_child_resources(self, resource_obj):
child_resources = [resource for resource in resource_obj.resource_set.all().order_by(Lower("name"))]
@@ -101,8 +123,8 @@ def test_func(self):
if self.request.user.is_superuser:
return True
- else:
- messages.error(self.request, "You do not have permission to add resource attributes.")
+
+ messages.error(self.request, "You do not have permission to add this resource's attributes.")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
@@ -125,6 +147,10 @@ def get_form(self, form_class=None):
return form
def get_success_url(self):
+ logger.info(
+ f"Admin {self.request.user.username} created a {self.object.resource.name} resource "
+ f"attribute (resource pk={self.kwargs.get('pk')})"
+ )
return reverse("resource-detail", kwargs={"pk": self.kwargs.get("pk")})
@@ -135,8 +161,8 @@ def test_func(self):
"""UserPassesTestMixin Tests"""
if self.request.user.is_superuser:
return True
- else:
- messages.error(self.request, "You do not have permission to delete resource attributes.")
+
+ messages.error(self.request, "You do not have permission to delete this resource's attributes.")
def get_resource_attributes_to_delete(self, resource_obj):
resource_attributes_to_delete = ResourceAttribute.objects.filter(resource=resource_obj)
@@ -186,6 +212,11 @@ def post(self, request, *args, **kwargs):
resource_attribute.delete()
messages.success(request, "Deleted {} attributes from resource.".format(attributes_deleted_count))
+
+ logger.info(
+ f"Admin {self.request.user.username} deleted {attributes_deleted_count} "
+ f"attribute(s) from the {resource_obj.name} resource (resource pk={resource_obj.pk})"
+ )
else:
for error in formset.errors:
messages.error(request, error)
@@ -222,7 +253,10 @@ def get_queryset(self):
else:
resources = Resource.objects.all().order_by(order_by)
else:
- resources = Resource.objects.all().order_by(order_by)
+ if self.request.user.is_staff:
+ resources = Resource.objects.all().order_by(order_by)
+ else:
+ resources = Resource.objects.filter(is_allocatable=True).order_by(order_by)
if data.get("show_allocatable_resources"):
resources = resources.filter(is_allocatable=True)
@@ -271,7 +305,10 @@ def get_queryset(self):
else:
resources = Resource.objects.all().order_by(order_by)
else:
- resources = Resource.objects.all().order_by(order_by)
+ if self.request.user.is_staff:
+ resources = Resource.objects.all().order_by(order_by)
+ else:
+ resources = Resource.objects.filter(is_allocatable=True).order_by(order_by)
return resources.distinct()
def get_context_data(self, **kwargs):
diff --git a/coldfront/core/test_helpers/__init__.py b/coldfront/core/test_helpers/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/core/test_helpers/factories.py b/coldfront/core/test_helpers/factories.py
index b852110095..57cf9249a7 100644
--- a/coldfront/core/test_helpers/factories.py
+++ b/coldfront/core/test_helpers/factories.py
@@ -2,6 +2,8 @@
#
# SPDX-License-Identifier: AGPL-3.0-or-later
+import datetime
+
import factory
from django.contrib.auth.models import User
from factory import SubFactory
@@ -21,6 +23,7 @@
AllocationStatusChoice,
AllocationUser,
AllocationUserNote,
+ AllocationUserRoleChoice,
AllocationUserStatusChoice,
)
from coldfront.core.allocation.models import (
@@ -36,12 +39,20 @@
ProjectAttribute,
ProjectAttributeType,
ProjectStatusChoice,
+ ProjectTypeChoice,
ProjectUser,
ProjectUserRoleChoice,
ProjectUserStatusChoice,
)
+from coldfront.core.project.utils import get_new_end_date_from_list
from coldfront.core.publication.models import PublicationSource
-from coldfront.core.resource.models import Resource, ResourceType
+from coldfront.core.resource.models import (
+ AttributeType,
+ Resource,
+ ResourceAttribute,
+ ResourceAttributeType,
+ ResourceType,
+)
from coldfront.core.user.models import UserProfile
### Default values and Faker provider setup ###
@@ -50,6 +61,8 @@
project_user_role_choice_names = ["User", "Manager"]
field_of_science_names = ["Physics", "Chemistry", "Economics", "Biology", "Sociology"]
attr_types = ["Date", "Int", "Float", "Text", "Boolean"]
+project_type_choice_names = ["Research", "Class"]
+allocation_role_choice_names = ["read/write", "read_only"]
fake = Faker()
@@ -138,18 +151,32 @@ class Meta:
name = FuzzyChoice(project_status_choice_names)
+class ProjectTypeChoiceFactory(DjangoModelFactory):
+ class Meta:
+ model = ProjectTypeChoice
+ django_get_or_create = ("name",)
+
+ name = FuzzyChoice(project_type_choice_names)
+
+
class ProjectFactory(DjangoModelFactory):
class Meta:
model = Project
- django_get_or_create = ("title",)
pi = SubFactory(UserFactory)
title = factory.Faker("project_title")
description = factory.Faker("sentence")
+ requestor = SubFactory(UserFactory)
field_of_science = SubFactory(FieldOfScienceFactory)
status = SubFactory(ProjectStatusChoiceFactory)
+ type = SubFactory(ProjectTypeChoiceFactory)
force_review = False
requires_review = False
+ end_date = get_new_end_date_from_list(
+ [
+ (6, 30),
+ ]
+ )
class ProjectUserRoleChoiceFactory(DjangoModelFactory):
@@ -240,6 +267,32 @@ class Meta:
resource_type = SubFactory(ResourceTypeFactory)
+class RAttributeTypeFactory(DjangoModelFactory):
+ class Meta:
+ model = AttributeType
+ django_get_or_create = ("name",)
+
+ name = "Text"
+
+
+class ResourceAttributeTypeFactory(DjangoModelFactory):
+ class Meta:
+ model = ResourceAttributeType
+ django_get_or_create = ("name",)
+
+ name = "storage"
+ attribute_type = SubFactory(RAttributeTypeFactory)
+
+
+class ResourceAttributeFactory(DjangoModelFactory):
+ class Meta:
+ model = ResourceAttribute
+
+ resource_attribute_type = SubFactory(ResourceAttributeTypeFactory)
+ value = "Test attribute value"
+ resource = SubFactory(ResourceFactory)
+
+
### Allocation factories ###
@@ -254,7 +307,6 @@ class Meta:
class AllocationFactory(DjangoModelFactory):
class Meta:
model = Allocation
- django_get_or_create = ("project",)
justification = factory.Faker("sentence")
status = SubFactory(AllocationStatusChoiceFactory)
@@ -340,6 +392,16 @@ class Meta:
name = "Active"
+class AllocationUserRoleChoiceFactory(DjangoModelFactory):
+ class Meta:
+ model = AllocationUserRoleChoice
+ django_get_or_create = ("name",)
+
+ name = FuzzyChoice(allocation_role_choice_names)
+ is_user_default = False
+ is_manager_default = False
+
+
class AllocationUserFactory(DjangoModelFactory):
class Meta:
model = AllocationUser
@@ -348,6 +410,7 @@ class Meta:
allocation = SubFactory(AllocationFactory)
user = SubFactory(UserFactory)
status = SubFactory(AllocationUserStatusChoiceFactory)
+ role = SubFactory(AllocationUserRoleChoiceFactory)
class AllocationUserNoteFactory(DjangoModelFactory):
diff --git a/coldfront/core/user/admin.py b/coldfront/core/user/admin.py
index 8cb672b964..aaa1acc28f 100644
--- a/coldfront/core/user/admin.py
+++ b/coldfront/core/user/admin.py
@@ -9,14 +9,10 @@
@admin.register(UserProfile)
class UserProfileAdmin(admin.ModelAdmin):
- list_display = (
- "username",
- "first_name",
- "last_name",
- "is_pi",
- )
- list_filter = ("is_pi",)
+ list_display = ("username", "first_name", "last_name", "title", "is_pi")
+ list_filter = ("is_pi", "title")
search_fields = ["user__username", "user__first_name", "user__last_name"]
+ readonly_fields = ["title", "department", "division"]
def username(self, obj):
return obj.user.username
diff --git a/coldfront/core/user/forms.py b/coldfront/core/user/forms.py
index 3198031bb4..2061b871fe 100644
--- a/coldfront/core/user/forms.py
+++ b/coldfront/core/user/forms.py
@@ -18,7 +18,7 @@ class UserSearchForm(forms.Form):
),
]
q = forms.CharField(
- label="Search String",
+ label="Username Search String",
min_length=2,
widget=forms.Textarea(attrs={"rows": 4}),
help_text="Copy paste usernames separated by space or newline for multiple username searches!",
diff --git a/coldfront/core/user/migrations/0002_auto_20220721_1202.py b/coldfront/core/user/migrations/0002_auto_20220721_1202.py
new file mode 100644
index 0000000000..fd7961b0af
--- /dev/null
+++ b/coldfront/core/user/migrations/0002_auto_20220721_1202.py
@@ -0,0 +1,27 @@
+# Generated by Django 3.2.13 on 2022-07-21 16:02
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("user", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="userprofile",
+ name="department",
+ field=models.CharField(default="", max_length=100),
+ ),
+ migrations.AddField(
+ model_name="userprofile",
+ name="max_projects",
+ field=models.IntegerField(default=-1),
+ ),
+ migrations.AddField(
+ model_name="userprofile",
+ name="title",
+ field=models.CharField(default="", max_length=30),
+ ),
+ ]
diff --git a/coldfront/core/user/migrations/0003_auto_20221020_1120.py b/coldfront/core/user/migrations/0003_auto_20221020_1120.py
new file mode 100644
index 0000000000..63bdce1e4b
--- /dev/null
+++ b/coldfront/core/user/migrations/0003_auto_20221020_1120.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.2.14 on 2022-10-20 15:20
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("user", "0002_auto_20220721_1202"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="userprofile",
+ name="max_class_projects_override",
+ field=models.IntegerField(default=-1),
+ ),
+ migrations.AddField(
+ model_name="userprofile",
+ name="max_research_projects_override",
+ field=models.IntegerField(default=-1),
+ ),
+ ]
diff --git a/coldfront/core/user/migrations/0004_auto_20240926_1039.py b/coldfront/core/user/migrations/0004_auto_20240926_1039.py
new file mode 100644
index 0000000000..cca1fbe11b
--- /dev/null
+++ b/coldfront/core/user/migrations/0004_auto_20240926_1039.py
@@ -0,0 +1,21 @@
+# Generated by Django 3.2.14 on 2024-09-26 14:39
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("user", "0003_auto_20221020_1120"),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name="userprofile",
+ name="max_projects",
+ ),
+ migrations.AddField(
+ model_name="userprofile",
+ name="division",
+ field=models.CharField(default="", max_length=100),
+ ),
+ ]
diff --git a/coldfront/core/user/migrations/0005_remove_userprofile_max_class_projects_override_and_more.py b/coldfront/core/user/migrations/0005_remove_userprofile_max_class_projects_override_and_more.py
new file mode 100644
index 0000000000..f4a7e687ba
--- /dev/null
+++ b/coldfront/core/user/migrations/0005_remove_userprofile_max_class_projects_override_and_more.py
@@ -0,0 +1,20 @@
+# Generated by Django 4.2.11 on 2025-02-19 19:28
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("user", "0004_auto_20240926_1039"),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name="userprofile",
+ name="max_class_projects_override",
+ ),
+ migrations.RemoveField(
+ model_name="userprofile",
+ name="max_research_projects_override",
+ ),
+ ]
diff --git a/coldfront/core/user/models.py b/coldfront/core/user/models.py
index e5264730a5..30a5869d9a 100644
--- a/coldfront/core/user/models.py
+++ b/coldfront/core/user/models.py
@@ -12,7 +12,13 @@ class UserProfile(models.Model):
Attributes:
is_pi (bool): indicates whether or not the user is a PI
user (User): represents the Django User model
+ department (str): the department the user is in
+ division (str): the department code
+ title (str): the user's status
"""
user = models.OneToOneField(User, on_delete=models.CASCADE)
is_pi = models.BooleanField(default=False)
+ department = models.CharField(max_length=100, default="")
+ division = models.CharField(max_length=100, default="")
+ title = models.CharField(max_length=30, default="")
diff --git a/coldfront/core/user/signals.py b/coldfront/core/user/signals.py
index 87e18e1fca..82a4cbe9c8 100644
--- a/coldfront/core/user/signals.py
+++ b/coldfront/core/user/signals.py
@@ -1,20 +1,100 @@
-# SPDX-FileCopyrightText: (C) ColdFront Authors
-#
-# SPDX-License-Identifier: AGPL-3.0-or-later
+import json
+import logging
+from django.conf import settings
from django.contrib.auth.models import User
+from django.contrib.auth.signals import user_logged_in
from django.db.models.signals import post_save
from django.dispatch import receiver
+from django_cas_ng.signals import cas_user_authenticated, cas_user_logout
from coldfront.core.user.models import UserProfile
+from coldfront.core.utils.common import get_users_info, import_from_settings
+
+if "coldfront.plugins.ldap_misc" in settings.INSTALLED_APPS:
+ from coldfront.plugins.ldap_misc.utils.ldap_user_search import get_users_info
+
+logger = logging.getLogger(__name__)
+
+ADDITIONAL_USER_SEARCH_CLASSES = import_from_settings("ADDITIONAL_USER_SEARCH_CLASSES", [])
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
- UserProfile.objects.create(user=instance)
+ user_profile = UserProfile.objects.create(user=instance, title="", department="", division="")
+ attributes = get_users_info([instance.username]).get(instance.username)
+ if not attributes:
+ return
+ user_profile = instance.userprofile
+ for name, value in attributes.items():
+ if name == "title" and not value == "group":
+ user_profile.is_pi = True
+ user_profile_attr = getattr(user_profile, name, None)
+ if user_profile_attr is not None and not user_profile_attr == value:
+ setattr(user_profile, name, value)
+ continue
+ user_attr = getattr(instance, name, None)
+ if user_attr is not None and not user_attr == value:
+ setattr(instance, name, value)
+
+ instance.save()
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userprofile.save()
+
+
+@receiver(user_logged_in, sender=User)
+def update_user_profile(sender, user, **kwargs):
+ logger.info(f"{user.username} logged in")
+ attributes = get_users_info([user.username]).get(user.username)
+ if not attributes:
+ return
+ save_changes = False
+ if not user.email == attributes.get("email"):
+ user.email = attributes.get("email")
+ save_changes = True
+
+ user_profile = user.userprofile
+ for name, value in attributes.items():
+ user_profile_attr = getattr(user_profile, name, None)
+ if user_profile_attr is not None and not user_profile_attr == value:
+ setattr(user_profile, name, value)
+ save_changes = True
+
+ if not user_profile.user.email == attributes.get("email"):
+ user_profile.user.email = attributes.get("email")
+ user_profile.user.save()
+
+ if save_changes:
+ user.save()
+
+
+@receiver(cas_user_authenticated)
+def cas_user_authenticated_callback(sender, **kwargs):
+ args = {}
+ args.update(kwargs)
+ print(
+ """cas_user_authenticated_callback:
+ user: %s
+ created: %s
+ attributes: %s
+ """
+ % (args.get("user"), args.get("created"), json.dumps(args.get("attributes"), sort_keys=True, indent=2))
+ )
+
+
+@receiver(cas_user_logout)
+def cas_user_logout_callback(sender, **kwargs):
+ args = {}
+ args.update(kwargs)
+ print(
+ """cas_user_logout_callback:
+ user: %s
+ session: %s
+ ticket: %s
+ """
+ % (args.get("user"), args.get("session"), args.get("ticket"))
+ )
diff --git a/coldfront/core/user/urls.py b/coldfront/core/user/urls.py
index 03b604beaf..1dca6b30b5 100644
--- a/coldfront/core/user/urls.py
+++ b/coldfront/core/user/urls.py
@@ -2,24 +2,18 @@
#
# SPDX-License-Identifier: AGPL-3.0-or-later
+import django_cas_ng.views
from django.conf import settings
from django.contrib.auth.views import LoginView, LogoutView
-from django.urls import path
+from django.urls import path, reverse_lazy
import coldfront.core.user.views as user_views
+from coldfront.config.env import ENV
EXTRA_APPS = settings.INSTALLED_APPS
urlpatterns = [
- path(
- "login",
- LoginView.as_view(
- template_name="user/login.html", extra_context={"EXTRA_APPS": EXTRA_APPS}, redirect_authenticated_user=True
- ),
- name="login",
- ),
- path("logout", LogoutView.as_view(), name="logout"),
path("user-profile/", user_views.UserProfile.as_view(), name="user-profile"),
path("user-profile/", user_views.UserProfile.as_view(), name="user-profile"),
path("user-projects-managers/", user_views.UserProjectsManagersView.as_view(), name="user-projects-managers"),
@@ -33,3 +27,23 @@
path("user-search-results/", user_views.UserSearchResults.as_view(), name="user-search-results"),
path("user-list-allocations/", user_views.UserListAllocations.as_view(), name="user-list-allocations"),
]
+
+
+if ENV.bool("PLUGIN_CAS", default=True):
+ urlpatterns += [
+ path("login", django_cas_ng.views.LoginView.as_view(), name="login"),
+ path("logout", django_cas_ng.views.LogoutView.as_view(), name="logout"),
+ ]
+else:
+ urlpatterns += [
+ path(
+ "login",
+ LoginView.as_view(
+ template_name="user/login.html",
+ extra_context={"EXTRA_APPS": EXTRA_APPS},
+ redirect_authenticated_user=True,
+ ),
+ name="login",
+ ),
+ path("logout", LogoutView.as_view(next_page=reverse_lazy("login")), name="logout"),
+ ]
diff --git a/coldfront/core/user/utils.py b/coldfront/core/user/utils.py
index 0b9da4a235..ccb0c6db46 100644
--- a/coldfront/core/user/utils.py
+++ b/coldfront/core/user/utils.py
@@ -80,7 +80,8 @@ def search_a_user(self, user_search_string=None, search_by="all_fields"):
class CombinedUserSearch:
def __init__(self, user_search_string, search_by, usernames_names_to_exclude=[]):
self.USER_SEARCH_CLASSES = import_from_settings("ADDITIONAL_USER_SEARCH_CLASSES", [])
- self.USER_SEARCH_CLASSES.insert(0, "coldfront.core.user.utils.LocalUserSearch")
+ if "coldfront.core.user.utils.LocalUserSearch" not in self.USER_SEARCH_CLASSES:
+ self.USER_SEARCH_CLASSES.insert(0, "coldfront.core.user.utils.LocalUserSearch")
self.user_search_string = user_search_string
self.search_by = search_by
self.usernames_names_to_exclude = usernames_names_to_exclude
@@ -101,7 +102,7 @@ def search(self):
usernames_found.append(username)
matches.append(user)
- if len(self.user_search_string.split()) > 1:
+ if len(self.user_search_string.split()) >= 1:
number_of_usernames_searched = len(self.user_search_string.split())
number_of_usernames_found = len(usernames_found)
usernames_not_found = list(
diff --git a/coldfront/core/user/views.py b/coldfront/core/user/views.py
index 8c0f8e7aa6..65d91dfda2 100644
--- a/coldfront/core/user/views.py
+++ b/coldfront/core/user/views.py
@@ -25,6 +25,8 @@
from coldfront.core.utils.mail import send_email_template
logger = logging.getLogger(__name__)
+
+DISPLAY_USER_SLATE_PROJECTS = import_from_settings("DISPLAY_USER_SLATE_PROJECTS", False)
EMAIL_ENABLED = import_from_settings("EMAIL_ENABLED", False)
if EMAIL_ENABLED:
EMAIL_SENDER = import_from_settings("EMAIL_SENDER")
@@ -64,6 +66,8 @@ def get_context_data(self, viewed_username=None, **kwargs):
group_list = ", ".join([group.name for group in viewed_user.groups.all()])
context["group_list"] = group_list
context["viewed_user"] = viewed_user
+ context["viewed_username"] = {"viewed_username": viewed_user.username}
+ context["DISPLAY_USER_SLATE_PROJECTS"] = DISPLAY_USER_SLATE_PROJECTS
return context
@@ -98,14 +102,11 @@ def dispatch(self, request, *args, viewed_username=None, **kwargs):
def get_queryset(self, *args, **kwargs):
viewed_user = self.viewed_user
- ongoing_projectuser_statuses = (
- "Active",
- "Pending - Add",
- "Pending - Remove",
- )
+ ongoing_projectuser_statuses = ("Active",)
ongoing_project_statuses = (
"New",
"Active",
+ "Review Pending",
)
qs = (
@@ -274,9 +275,9 @@ def get_context_data(self, *args, **kwargs):
for project in Project.objects.filter(pi=self.request.user):
for allocation in project.allocation_set.filter(status__name="Active"):
- for allocation_user in allocation.allocationuser_set.filter(status__name="Active").order_by(
- "user__username"
- ):
+ for allocation_user in allocation.allocationuser_set.filter(
+ status__name__in=["Active", "Invited", "Pending", "Disabled", "Retired"]
+ ).order_by("user__username"):
if allocation_user.user not in user_dict:
user_dict[allocation_user.user] = []
diff --git a/coldfront/core/utils/apps.py b/coldfront/core/utils/apps.py
index 68d0c7f8b7..6454b9f61f 100644
--- a/coldfront/core/utils/apps.py
+++ b/coldfront/core/utils/apps.py
@@ -8,3 +8,6 @@
class UtilsConfig(AppConfig):
name = "coldfront.core.utils"
verbose_name = "Coldfront Utils"
+
+ def ready(self):
+ import coldfront.core.utils.signals
diff --git a/coldfront/core/utils/common.py b/coldfront/core/utils/common.py
index 9fd84a2de3..13b83eb5ab 100644
--- a/coldfront/core/utils/common.py
+++ b/coldfront/core/utils/common.py
@@ -48,3 +48,11 @@ def su_login_callback(user):
logger.warning("User {} requested to login as another user but does not have permissions", user)
return False
+
+
+def get_users_info(usernames):
+ return dict.fromkeys(usernames, None)
+
+
+def get_users_accounts(usernames):
+ return None
diff --git a/coldfront/core/utils/groups.py b/coldfront/core/utils/groups.py
new file mode 100644
index 0000000000..6bfbbd0e07
--- /dev/null
+++ b/coldfront/core/utils/groups.py
@@ -0,0 +1,32 @@
+from django.contrib.auth.models import Permission
+
+
+def check_if_groups_in_review_groups(review_groups, groups, permission=None):
+ """
+ Returns True if at least one group in a group query is included in a review group query. An
+ additional permission can be given to check if at least one matching group has it. Since this
+ is for determining permissions this returns True if the review group query is empty, meaning
+ open to all groups. A user must be in at least one group or this will always return False.
+
+ :param review_groups: The review group query to compare the groups to
+ :param groups: The group query being compared
+ :param permission: A permission at least one matching group should have
+ """
+ if not groups.exists():
+ return False
+
+ if not review_groups.exists():
+ return True
+
+ # Intersection is not supported on the database backend we use (MySql)
+ matched_groups = [group for group in groups if group in review_groups]
+ if matched_groups:
+ if permission is None:
+ return True
+
+ matched_group_ids = [group.id for group in matched_groups]
+ permission_exists = Permission.objects.filter(group__id__in=matched_group_ids, codename=permission).exists()
+ if permission_exists:
+ return True
+
+ return False
diff --git a/coldfront/core/utils/log.py b/coldfront/core/utils/log.py
new file mode 100644
index 0000000000..867fee4fb9
--- /dev/null
+++ b/coldfront/core/utils/log.py
@@ -0,0 +1,30 @@
+from django.utils.log import AdminEmailHandler
+
+from coldfront.core.utils.common import import_from_settings
+from coldfront.core.utils.mail import send_email
+
+EMAIL_ENABLED = import_from_settings("EMAIL_ENABLED", False)
+if EMAIL_ENABLED:
+ EMAIL_SENDER = import_from_settings("EMAIL_SENDER")
+ EMAIL_ADMIN_LIST = import_from_settings("EMAIL_ADMIN_LIST")
+
+
+class CustomAdminEmailHandler(AdminEmailHandler):
+ def send_mail(self, subject, message, *args, **kwargs):
+ if not EMAIL_ENABLED:
+ return
+
+ last_index = message.find("\n")
+ for _ in range(4):
+ last_index = message.find("\n", last_index + 1)
+
+ short_message = message[:last_index]
+ if "Service Unavailable" in short_message or "Invalid HTTP_HOST header" in short_message:
+ return
+
+ message = "An error has occured on RT Projects. Please check the log file for more details."
+ if "1045" in short_message:
+ message = "Database access error has occurred. Please check the log file for more details."
+
+ subject = "An error occurred on RT Projects"
+ send_email(subject, message, EMAIL_SENDER, EMAIL_ADMIN_LIST)
diff --git a/coldfront/core/utils/mail.py b/coldfront/core/utils/mail.py
index 6e4d442ed1..abfb2e062c 100644
--- a/coldfront/core/utils/mail.py
+++ b/coldfront/core/utils/mail.py
@@ -22,6 +22,7 @@
EMAIL_SIGNATURE = import_from_settings("EMAIL_SIGNATURE")
EMAIL_CENTER_NAME = import_from_settings("CENTER_NAME")
CENTER_BASE_URL = import_from_settings("CENTER_BASE_URL")
+EMAIL_GROUP_TO_EMAIL_MAPPING = import_from_settings("EMAIL_GROUP_TO_EMAIL_MAPPING", {})
def send_email(subject, body, sender, receiver_list, cc=[]):
@@ -31,11 +32,11 @@ def send_email(subject, body, sender, receiver_list, cc=[]):
return
if len(receiver_list) == 0:
- logger.error("Failed to send email missing receiver_list")
+ logger.error(f"Failed to send email with subject {subject}, missing receiver_list")
return
if len(sender) == 0:
- logger.error("Failed to send email missing sender address")
+ logger.error(f"Failed to send email with subject {subject}, missing sender address")
return
if len(EMAIL_SUBJECT_PREFIX) > 0:
@@ -82,20 +83,21 @@ def build_link(url_path, domain_url=""):
return f"{domain_url}{url_path}"
-def send_admin_email_template(subject, template_name, template_context):
+def send_admin_email_template(allocation_obj, subject, template_name, template_context):
"""Helper function for sending admin emails using a template"""
+ email_recipient = get_email_recipient_from_groups(allocation_obj.get_parent_resource.review_groups.all())
send_email_template(
subject,
template_name,
template_context,
EMAIL_SENDER,
[
- EMAIL_TICKET_SYSTEM_ADDRESS,
+ email_recipient,
],
)
-def send_allocation_admin_email(allocation_obj, subject, template_name, url_path="", domain_url=""):
+def send_allocation_admin_email(allocation_obj, subject, template_name, url_path="", domain_url="", addtl_context=None):
"""Send allocation admin emails"""
if not url_path:
url_path = reverse("allocation-request-list")
@@ -109,22 +111,37 @@ def send_allocation_admin_email(allocation_obj, subject, template_name, url_path
ctx["resource"] = resource_name
ctx["url"] = url
+ if addtl_context:
+ ctx.update(addtl_context)
+
send_admin_email_template(
+ allocation_obj,
f"{subject}: {pi_name} - {resource_name}",
template_name,
ctx,
)
-def send_allocation_customer_email(allocation_obj, subject, template_name, url_path="", domain_url=""):
+def send_allocation_customer_email(
+ request, allocation_obj, subject, template_name, url_path="", domain_url="", addtl_context=None
+):
"""Send allocation customer emails"""
if not url_path:
url_path = reverse("allocation-detail", kwargs={"pk": allocation_obj.pk})
- url = build_link(url_path, domain_url=domain_url)
+ allocation_url = build_link(url_path, domain_url=domain_url)
+ project_obj = allocation_obj.project
+ project_url = build_link(reverse("project-detail", kwargs={"pk": project_obj.pk}), domain_url=domain_url)
ctx = email_template_context()
ctx["resource"] = allocation_obj.get_parent_resource
- ctx["url"] = url
+ ctx["allocation_url"] = allocation_url
+ ctx["project_url"] = project_url
+ ctx["project_pi"] = f"{project_obj.pi.first_name} {project_obj.pi.last_name}"
+ ctx["action_user"] = (f"{request.user.first_name} {request.user.last_name}",)
+ ctx["allocation_identifiers"] = allocation_obj.get_identifiers().items()
+
+ if addtl_context:
+ ctx.update(addtl_context)
allocation_users = allocation_obj.allocationuser_set.exclude(status__name__in=["Removed", "Error"])
email_receiver_list = []
@@ -132,7 +149,29 @@ def send_allocation_customer_email(allocation_obj, subject, template_name, url_p
if allocation_user.allocation.project.projectuser_set.get(user=allocation_user.user).enable_notifications:
email_receiver_list.append(allocation_user.user.email)
- send_email_template(subject, template_name, ctx, EMAIL_SENDER, email_receiver_list)
+ send_email_template(
+ subject,
+ template_name,
+ ctx,
+ EMAIL_SENDER,
+ email_receiver_list,
+ )
+
+
+def get_email_recipient_from_groups(groups):
+ """
+ Returns a group's email if it exists in EMAIL_GROUP_TO_EMAIL_MAPPING. Only returns the first
+ email it finds, if no email is found then EMAIL_TICKET_SYSTEM_ADDRESS is returned.
+
+ :params groups: List/QuerySet of Groups
+ :return: Email address for a group if found, else EMAIL_TICKET_SYSTEM_ADDRESS
+ """
+ for group in groups:
+ email = EMAIL_GROUP_TO_EMAIL_MAPPING.get(group.name)
+ if email is not None:
+ return email
+
+ return EMAIL_TICKET_SYSTEM_ADDRESS
def send_allocation_eula_customer_email(
diff --git a/coldfront/core/utils/management/commands/add_scheduled_tasks.py b/coldfront/core/utils/management/commands/add_scheduled_tasks.py
index 9da270fb4b..318d79523c 100644
--- a/coldfront/core/utils/management/commands/add_scheduled_tasks.py
+++ b/coldfront/core/utils/management/commands/add_scheduled_tasks.py
@@ -21,11 +21,16 @@ class Command(BaseCommand):
def handle(self, *args, **options):
date = timezone.now() + datetime.timedelta(days=1)
date = date.replace(hour=0, minute=0, second=0, microsecond=0)
- schedule("coldfront.core.allocation.tasks.update_statuses", schedule_type=Schedule.DAILY, next_run=date)
-
- schedule("coldfront.core.allocation.tasks.send_expiry_emails", schedule_type=Schedule.DAILY, next_run=date)
if ALLOCATION_EULA_ENABLE and EMAIL_ALLOCATION_EULA_REMINDERS:
schedule(
"coldfront.core.allocation.tasks.send_eula_reminders", schedule_type=Schedule.WEEKLY, next_run=date
)
+
+ schedule("coldfront.core.allocation.tasks.send_expiry_emails", schedule_type=Schedule.DAILY, next_run=date)
+
+ schedule("coldfront.core.project.tasks.update_statuses", schedule_type=Schedule.DAILY, next_run=date)
+
+ schedule("coldfront.core.project.tasks.send_expiry_emails", schedule_type=Schedule.DAILY, next_run=date)
+
+ schedule("coldfront.plugins.slurm.tasks.run_slurm_dump", schedule_type=Schedule.HOURLY)
diff --git a/coldfront/core/utils/management/commands/backfill_allocation_attributes.py b/coldfront/core/utils/management/commands/backfill_allocation_attributes.py
new file mode 100644
index 0000000000..f20497d64c
--- /dev/null
+++ b/coldfront/core/utils/management/commands/backfill_allocation_attributes.py
@@ -0,0 +1,70 @@
+from django.core.management.base import BaseCommand
+
+from coldfront.core.allocation.models import (
+ Allocation,
+ AllocationAttribute,
+ AllocationAttributeType,
+)
+from coldfront.core.resource.models import Resource
+
+
+class Command(BaseCommand):
+ def add_arguments(self, parser):
+ parser.add_argument(
+ "-at",
+ "--allocation_attribute_type",
+ help="Allocation attribute type the new allocation attribute should have",
+ required=True,
+ )
+ parser.add_argument(
+ "-ia",
+ "--internal_allocation_attribute",
+ help="Allocation attribute within the allocation class whose value we need",
+ required=True,
+ )
+ parser.add_argument(
+ "-r", "--resource", help="Allocations containing this resource that should be backfilled", required=True
+ )
+
+ def handle(self, *args, **options):
+ allocation_attribute_type = options.get("allocation_attribute_type")
+ internal_allocation_attribute = options.get("internal_allocation_attribute")
+ resource = options.get("resource")
+
+ resource_obj = Resource.objects.filter(name=resource)
+ if not resource_obj.exists():
+ print("This resource does not exist")
+ return
+ resource_obj = resource_obj[0]
+
+ allocation_attribute_type_obj = AllocationAttributeType.objects.filter(name=allocation_attribute_type)
+ if not allocation_attribute_type_obj.exists():
+ print("This allocation attribute type does not exist")
+ return
+ allocation_attribute_type_obj = allocation_attribute_type_obj[0]
+
+ if resource_obj not in allocation_attribute_type_obj.get_linked_resources():
+ print("This resource is not linked to this allocation attribute type")
+ return
+
+ if not hasattr(Allocation, internal_allocation_attribute):
+ print("This internal allocation attribute does not exist")
+ return
+
+ count = 0
+ allocation_objs = Allocation.objects.filter(resources=resource_obj)
+ for allocation_obj in allocation_objs:
+ value = getattr(allocation_obj, internal_allocation_attribute)
+ allocation_attribute_exists = AllocationAttribute.objects.filter(
+ allocation_attribute_type=allocation_attribute_type_obj, allocation=allocation_obj
+ ).exists()
+ if allocation_attribute_exists or not value:
+ continue
+
+ AllocationAttribute.objects.create(
+ allocation=allocation_obj, allocation_attribute_type=allocation_attribute_type_obj, value=value
+ )
+
+ count += 1
+
+ print(f"Created {count} allocation attributes")
diff --git a/coldfront/core/utils/management/commands/backfill_historical_reasons.py b/coldfront/core/utils/management/commands/backfill_historical_reasons.py
new file mode 100644
index 0000000000..3fcda8bbc3
--- /dev/null
+++ b/coldfront/core/utils/management/commands/backfill_historical_reasons.py
@@ -0,0 +1,44 @@
+import importlib
+
+from django.core.management.base import BaseCommand
+from simple_history.utils import get_history_manager_for_model
+
+
+class Command(BaseCommand):
+ def add_arguments(self, parser):
+ parser.add_argument(
+ "--module", help="Primary module to backfill change reasons into, i.e. allocation", required=True
+ )
+
+ parser.add_argument(
+ "--model", help="Model to backfill change reasons into, i.e. AllocationAttribute", required=True
+ )
+
+ parser.add_argument("--replace", help="Replace current existing change reasons", action="store_true")
+
+ def handle(self, *args, **options):
+ module = options.get("module")
+ model = options.get("model")
+ module_path = f"coldfront.core.{module}.models"
+ module = importlib.import_module(module_path)
+ model_objs = getattr(module, model).objects.all()
+ for model_obj in model_objs:
+ history = get_history_manager_for_model(model_obj)
+ records = history.all()
+ for record in records:
+ if record.history_change_reason and not options.get("replace"):
+ continue
+
+ prev_record = record.prev_record
+ if prev_record is None:
+ record.history_change_reason = "Created"
+ record.save()
+ continue
+
+ record_delta = record.diff_against(prev_record)
+ changes = []
+ for change in record_delta.changes:
+ changes.append(change.field)
+
+ record.history_change_reason = f"Fields changed: {', '.join(changes)}"
+ record.save()
diff --git a/coldfront/core/utils/management/commands/load_test_data.py b/coldfront/core/utils/management/commands/load_test_data.py
index 26923877ab..c3acb8b31e 100644
--- a/coldfront/core/utils/management/commands/load_test_data.py
+++ b/coldfront/core/utils/management/commands/load_test_data.py
@@ -25,12 +25,18 @@
ProjectAttribute,
ProjectAttributeType,
ProjectStatusChoice,
+ ProjectTypeChoice,
ProjectUser,
ProjectUserRoleChoice,
ProjectUserStatusChoice,
)
from coldfront.core.publication.models import Publication, PublicationSource
-from coldfront.core.resource.models import Resource, ResourceAttribute, ResourceAttributeType, ResourceType
+from coldfront.core.resource.models import (
+ Resource,
+ ResourceAttribute,
+ ResourceAttributeType,
+ ResourceType,
+)
base_dir = settings.BASE_DIR
@@ -207,6 +213,9 @@ def handle(self, *args, **options):
field_of_science=FieldOfScience.objects.get(description="Chemistry"),
status=ProjectStatusChoice.objects.get(name="Active"),
force_review=True,
+ end_date=datetime.date.today() + datetime.timedelta(days=365),
+ max_managers=2,
+ type=ProjectTypeChoice.objects.get(name="Research"),
)
AttributeType.objects.get_or_create(name="Int")
@@ -425,6 +434,9 @@ def handle(self, *args, **options):
description="This purpose of this project is to measure the critical behavior of quantum Hall transitions.",
field_of_science=FieldOfScience.objects.get(description="Physics"),
status=ProjectStatusChoice.objects.get(name="Active"),
+ end_date=datetime.date.today() + datetime.timedelta(days=365),
+ max_managers=2,
+ type=ProjectTypeChoice.objects.get(name="Research"),
)
project_user_obj, _ = ProjectUser.objects.get_or_create(
diff --git a/coldfront/core/utils/mixins/views.py b/coldfront/core/utils/mixins/views.py
index 105749241c..bfd282777b 100644
--- a/coldfront/core/utils/mixins/views.py
+++ b/coldfront/core/utils/mixins/views.py
@@ -46,11 +46,11 @@ def get_context_data(self, *args, **kwargs):
class ChangesOnlyOnActiveProjectMixin:
def dispatch(self, request, *args, **kwargs):
project_obj = get_object_or_404(Project, pk=self.kwargs.get("project_pk"))
- if project_obj.status.name not in [
- "Active",
- "New",
+ if project_obj.status.name in [
+ "Archived",
+ "Denied",
]:
- messages.error(request, "You cannot modify an archived project.")
+ messages.error(request, 'You cannot modify a project with status "{}".'.format(project_obj.status.name))
return HttpResponseRedirect(reverse("project-detail", kwargs={"pk": project_obj.pk}))
else:
return super().dispatch(request, *args, **kwargs)
diff --git a/coldfront/core/utils/signals.py b/coldfront/core/utils/signals.py
new file mode 100644
index 0000000000..d46e18858c
--- /dev/null
+++ b/coldfront/core/utils/signals.py
@@ -0,0 +1,19 @@
+from django.dispatch import receiver
+from simple_history.signals import post_create_historical_record
+from simple_history.utils import update_change_reason
+
+
+@receiver(post_create_historical_record)
+def save_historical_change_reason(sender, instance, **kwargs):
+ full_history = instance.history.all()
+ if len(full_history) < 2:
+ update_change_reason(instance, "Created")
+ return
+
+ new_history, prev_history = full_history[:2]
+ history_delta = new_history.diff_against(prev_history)
+ changes = []
+ for change in history_delta.changes:
+ changes.append(change.field)
+
+ update_change_reason(instance, f"Fields changed: {', '.join(changes)}")
diff --git a/coldfront/core/utils/slack.py b/coldfront/core/utils/slack.py
new file mode 100644
index 0000000000..b111f0352b
--- /dev/null
+++ b/coldfront/core/utils/slack.py
@@ -0,0 +1,30 @@
+import logging
+
+import requests
+
+from coldfront.core.utils.common import import_from_settings
+
+logger = logging.getLogger(__name__)
+
+
+SLACK_MESSAGING_ENABLED = import_from_settings("SLACK_MESSAGING_ENABLED", False)
+if SLACK_MESSAGING_ENABLED:
+ SLACK_WEBHOOK_URL = import_from_settings("SLACK_WEBHOOK_URL")
+
+
+def send_message(text):
+ if not SLACK_MESSAGING_ENABLED:
+ return
+
+ if not SLACK_WEBHOOK_URL:
+ logger.error("Failed to send Slack notification. SLACK_WEBHOOK_URL is not set.")
+ return
+
+ data = {"text": text}
+ try:
+ response = requests.post(SLACK_WEBHOOK_URL, json=data)
+ response.raise_for_status()
+ except requests.HTTPError as http_error:
+ logger.error(f"HTTP error: failed to send Slack notification. {http_error}.")
+ except Exception as err:
+ logger.error(f"Error: failed to send Slack notification. {err}.")
diff --git a/coldfront/core/utils/templatetags/common_tags.py b/coldfront/core/utils/templatetags/common_tags.py
index 5c66feedbe..9ba99f6d5c 100644
--- a/coldfront/core/utils/templatetags/common_tags.py
+++ b/coldfront/core/utils/templatetags/common_tags.py
@@ -1,6 +1,4 @@
-# SPDX-FileCopyrightText: (C) ColdFront Authors
-#
-# SPDX-License-Identifier: AGPL-3.0-or-later
+import json
from django import template
from django.conf import settings
@@ -18,6 +16,7 @@ def settings_value(name):
"CENTER_NAME",
"CENTER_HELP_URL",
"EMAIL_PROJECT_REVIEW_CONTACT",
+ "EMAIL_TICKET_SYSTEM_ADDRESS",
]
# FIXME: This is using mark_safe for now but settings should not contain HTML in the future
return mark_safe(getattr(settings, name, "") if name in allowed_names else "") # noqa: S308
@@ -53,12 +52,33 @@ def convert_status_to_icon(project):
return mark_safe('
')
+@register.filter()
+def color_text(status):
+ if status in [
+ "Active",
+ ]:
+ return "text-success"
+
+ if status in [
+ "Expired",
+ "Denied",
+ "Renewal Denied",
+ "Removed",
+ "Revoked",
+ ]:
+ return "text-danger"
+
+ return "text-primary"
+
+
@register.filter("get_value_from_dict")
def get_value_from_dict(dict_data, key):
"""
usage example {{ your_dict|get_value_from_dict:your_key }}
"""
if key:
+ if type(dict_data) == str:
+ dict_data = json.loads(dict_data)
return dict_data.get(key)
@@ -68,3 +88,27 @@ def get_value_by_index(array, index):
usage example {{ your_list|get_value_by_index:your_index }}
"""
return array[index]
+
+
+@register.filter
+def split(string, char):
+ return string.split(char)
+
+
+@register.filter
+def change_sign(int):
+ return -int
+
+
+@register.filter
+def divide(int, divisor):
+ return int // divisor
+
+
+@register.filter
+def template_exists(value):
+ try:
+ template.loader.get_template(value)
+ return True
+ except template.TemplateDoesNotExist:
+ return False
diff --git a/coldfront/core/utils/validators.py b/coldfront/core/utils/validators.py
new file mode 100644
index 0000000000..1f107cdf50
--- /dev/null
+++ b/coldfront/core/utils/validators.py
@@ -0,0 +1,19 @@
+from django.core.exceptions import ValidationError
+from django.utils.deconstruct import deconstructible
+
+
+@deconstructible
+class IsAlpha:
+ message = "The entry must not contain numbers or special characters"
+ code = "invalid"
+
+ def __init__(self, message=None) -> None:
+ if message is not None:
+ self.message = message
+
+ def __call__(self, value):
+ if not value.isalpha():
+ raise ValidationError(self.message, self.code)
+
+ def __eq__(self, other):
+ return isinstance(other, IsAlpha) and (self.message == other.message)
diff --git a/coldfront/plugins/academic_analytics/__init__.py b/coldfront/plugins/academic_analytics/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/academic_analytics/admin.py b/coldfront/plugins/academic_analytics/admin.py
new file mode 100644
index 0000000000..8c38f3f3da
--- /dev/null
+++ b/coldfront/plugins/academic_analytics/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/coldfront/plugins/academic_analytics/apps.py b/coldfront/plugins/academic_analytics/apps.py
new file mode 100644
index 0000000000..81b0c8e6cc
--- /dev/null
+++ b/coldfront/plugins/academic_analytics/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class AcademicAnalyticsConfig(AppConfig):
+ default_auto_field = "django.db.models.BigAutoField"
+ name = "coldfront.plugins.academic_analytics"
diff --git a/coldfront/plugins/academic_analytics/forms.py b/coldfront/plugins/academic_analytics/forms.py
new file mode 100644
index 0000000000..2443fe9e22
--- /dev/null
+++ b/coldfront/plugins/academic_analytics/forms.py
@@ -0,0 +1,10 @@
+from django import forms
+
+
+class PublicationForm(forms.Form):
+ title = forms.CharField(max_length=1024, disabled=True)
+ author = forms.CharField(disabled=True)
+ year = forms.IntegerField(disabled=True)
+ journal = forms.CharField(max_length=1024, disabled=True)
+ unique_id = forms.CharField(max_length=255, disabled=True, required=False)
+ add = forms.BooleanField(initial=False, required=False)
diff --git a/coldfront/plugins/academic_analytics/migrations/__init__.py b/coldfront/plugins/academic_analytics/migrations/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/academic_analytics/models.py b/coldfront/plugins/academic_analytics/models.py
new file mode 100644
index 0000000000..71a8362390
--- /dev/null
+++ b/coldfront/plugins/academic_analytics/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/coldfront/plugins/academic_analytics/templates/academic_analytics/academic_analytics_div.html b/coldfront/plugins/academic_analytics/templates/academic_analytics/academic_analytics_div.html
new file mode 100644
index 0000000000..bf5149dbc3
--- /dev/null
+++ b/coldfront/plugins/academic_analytics/templates/academic_analytics/academic_analytics_div.html
@@ -0,0 +1,38 @@
+
+
+
+
Publications:
+
+
+
Please select any publications that resulted from research done with this project.
+
+
+
+
+{% endblock %}
diff --git a/coldfront/plugins/help/urls.py b/coldfront/plugins/help/urls.py
new file mode 100644
index 0000000000..5863d5f18c
--- /dev/null
+++ b/coldfront/plugins/help/urls.py
@@ -0,0 +1,7 @@
+from django.urls import path
+
+from coldfront.plugins.help.views import HelpView
+
+urlpatterns = [
+ path("", HelpView.as_view(), name="get-help"),
+]
diff --git a/coldfront/plugins/help/views.py b/coldfront/plugins/help/views.py
new file mode 100644
index 0000000000..6c3479769c
--- /dev/null
+++ b/coldfront/plugins/help/views.py
@@ -0,0 +1,63 @@
+import logging
+
+from django.contrib import messages
+from django.core.mail import send_mail
+from django.shortcuts import render
+from django.views.generic import TemplateView
+
+from coldfront.core.utils.common import import_from_settings
+from coldfront.plugins.help.forms import HelpForm
+
+EMAIL_HELP_SUPPORT_EMAILS = import_from_settings("EMAIL_HELP_SUPPORT_EMAILS", {})
+EMAIL_HELP_TEMPLATE = import_from_settings("EMAIL_HELP_TEMPLATE", "")
+EMAIL_HELP_DEFAULT_EMAIL = import_from_settings("EMAIL_HELP_DEFAULT_EMAIL", "")
+
+logger = logging.getLogger(__name__)
+
+
+class HelpView(TemplateView):
+ template_name = "help/help.html"
+
+ def get_initial_data(self):
+ initial_data = {"first_name": "", "last_name": "", "user_email": "", "queue_email": ""}
+
+ user = self.request.user
+ if user.is_authenticated:
+ initial_data["first_name"] = user.first_name
+ initial_data["last_name"] = user.last_name
+ initial_data["user_email"] = user.email
+
+ queue = self.request.GET.get("queue", "")
+ initial_data["queue_email"] = EMAIL_HELP_SUPPORT_EMAILS.get(queue, EMAIL_HELP_DEFAULT_EMAIL)
+ return initial_data
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context["form"] = HelpForm(initial=self.get_initial_data())
+ return context
+
+ def post(self, request, *args, **kwargs):
+ form = HelpForm(request.POST, initial=self.get_initial_data())
+ if form.is_valid():
+ form_data = form.cleaned_data
+ queue_email = form_data.get("queue_email")
+ user_email = form_data.get("user_email")
+ first = form_data.get("first_name")
+ last = form_data.get("last_name")
+ message = form_data.get("message")
+ send_mail(
+ subject=form_data.get("subject", "Help Request"),
+ message=EMAIL_HELP_TEMPLATE.format(first=first, last=last, message=message),
+ from_email=user_email,
+ recipient_list=[queue_email],
+ fail_silently=False,
+ )
+ else:
+ messages.error(
+ request,
+ f"Something went wrong, please try again. If the issue persists contact {EMAIL_HELP_DEFAULT_EMAIL}.",
+ )
+ logger.error(f"An error occured in the help form. Error: {form.errors.as_text()}")
+ return self.render_to_response(self.get_context_data())
+
+ return render(request, "help/form_completed.html")
diff --git a/coldfront/plugins/ldap_misc/__init__.py b/coldfront/plugins/ldap_misc/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/ldap_misc/admin.py b/coldfront/plugins/ldap_misc/admin.py
new file mode 100644
index 0000000000..8c38f3f3da
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/coldfront/plugins/ldap_misc/apps.py b/coldfront/plugins/ldap_misc/apps.py
new file mode 100644
index 0000000000..aa8e53c91c
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/apps.py
@@ -0,0 +1,15 @@
+from django.apps import AppConfig
+from django.core.exceptions import ImproperlyConfigured
+
+from coldfront.core.utils.common import import_from_settings
+
+ADDITIONAL_USER_SEARCH_CLASSES = import_from_settings("ADDITIONAL_USER_SEARCH_CLASSES", [])
+
+
+class LdapMiscConfig(AppConfig):
+ default_auto_field = "django.db.models.BigAutoField"
+ name = "coldfront.plugins.ldap_misc"
+
+ def ready(self):
+ if "coldfront.plugins.ldap_user_search.utils.LDAPUserSearch" not in ADDITIONAL_USER_SEARCH_CLASSES:
+ raise ImproperlyConfigured("ldap_misc requires the ldap_user_search plugin, please enable it")
diff --git a/coldfront/plugins/ldap_misc/migrations/__init__.py b/coldfront/plugins/ldap_misc/migrations/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/ldap_misc/models.py b/coldfront/plugins/ldap_misc/models.py
new file mode 100644
index 0000000000..71a8362390
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/coldfront/plugins/ldap_misc/tests/__init__.py b/coldfront/plugins/ldap_misc/tests/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/ldap_misc/tests/test_ldap_user_search.py b/coldfront/plugins/ldap_misc/tests/test_ldap_user_search.py
new file mode 100644
index 0000000000..3a43218e3d
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/tests/test_ldap_user_search.py
@@ -0,0 +1,29 @@
+from unittest import mock
+
+from django.test import TestCase, override_settings
+
+from coldfront.plugins.ldap_misc.utils.ldap_user_search import get_users_info
+
+
+@override_settings(LDAP_ENABLE_USER_INFO=True)
+class LDAPUserSearchTestCase(TestCase):
+ @mock.patch("coldfront.plugins.ldap_misc.utils.ldap_user_search.LDAPUserSearch")
+ def test_get_users_info(self, mock_ldap_search):
+ usernames = ["john", "doe"]
+
+ # Grab the instance
+ mock_ldap_search = mock_ldap_search.return_value
+
+ # Test not finding the users
+ mock_ldap_search.search_a_user.side_effect = [[], []]
+ users_info = get_users_info(usernames)
+ for name, user_info in users_info.items():
+ with self.subTest(name=name):
+ self.assertEqual(user_info, {})
+
+ # Test finding the users
+ mock_ldap_search.search_a_user.side_effect = [[{"username": "john"}], [{"username": "doe"}]]
+ users_info = get_users_info(usernames)
+ for name, user_info in users_info.items():
+ with self.subTest(name=name):
+ self.assertEqual(user_info, {"username": name})
diff --git a/coldfront/plugins/ldap_misc/tests/test_project.py b/coldfront/plugins/ldap_misc/tests/test_project.py
new file mode 100644
index 0000000000..9b7d40a88b
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/tests/test_project.py
@@ -0,0 +1,71 @@
+from unittest import mock
+
+from django.test import TestCase, override_settings
+
+from coldfront.core.project.models import ProjectUserRoleChoice
+from coldfront.core.test_helpers.factories import ProjectUserRoleChoiceFactory
+from coldfront.plugins.ldap_misc.utils.project import (
+ check_if_pis_eligible,
+ get_ineligible_pis,
+ update_project_user_matches,
+)
+
+
+@override_settings(LDAP_ENABLE_PROJECT_PI_ELIGIBLE_ADS_GROUPS=True, LDAP_PROJECT_PI_ELIGIBLE_ADS_GROUPS=["test-group"])
+class ProjectTestCase(TestCase):
+ def setUp(self) -> None:
+ ProjectUserRoleChoiceFactory(name="User")
+ ProjectUserRoleChoiceFactory(name="Group")
+ return super().setUp()
+
+ @mock.patch("coldfront.plugins.ldap_misc.utils.project.get_users_info")
+ def test_check_if_pis_eligible_variants(self, mock_get_users_info):
+ usernames = ["john", "doe"]
+
+ def assert_bool_helper(usernames, result, assert_bool):
+ for name in usernames:
+ with self.subTest(name=name):
+ assert_bool(result.get(name))
+
+ mock_get_users_info.return_value = {"john": {}, "doe": {}}
+ result = check_if_pis_eligible(usernames)
+ assert_bool_helper(usernames, result, self.assertFalse)
+
+ mock_get_users_info.return_value = {"john": {"memberOf": ["other-group"]}, "doe": {"memberOf": ["other-group"]}}
+ result = check_if_pis_eligible(usernames)
+ assert_bool_helper(usernames, result, self.assertFalse)
+
+ mock_get_users_info.return_value = {"john": {"memberOf": ["test-group"]}, "doe": {"memberOf": ["test-group"]}}
+ result = check_if_pis_eligible(usernames)
+ assert_bool_helper(usernames, result, self.assertTrue)
+
+ @mock.patch("coldfront.plugins.ldap_misc.utils.project.check_if_pis_eligible")
+ def test_get_ineligible_pis_variants(self, mock_check_if_pis_eligible):
+ usernames = ["john", "doe"]
+
+ def assert_in_not_in_helper(usernames, result, assert_in_not_in):
+ for name in usernames:
+ with self.subTest(name=name):
+ assert_in_not_in(name, result)
+
+ mock_check_if_pis_eligible.return_value = {"john": False, "doe": False}
+ result = get_ineligible_pis(usernames)
+ assert_in_not_in_helper(usernames, result, self.assertIn)
+
+ mock_check_if_pis_eligible.return_value = {"john": True, "doe": True}
+ result = get_ineligible_pis(usernames)
+ assert_in_not_in_helper(usernames, result, self.assertNotIn)
+
+ @mock.patch("coldfront.plugins.ldap_misc.utils.project.get_users_info")
+ def test_update_project_user_matches(self, mock_get_users_info):
+ matches = [{"username": "john", "role": None}, {"username": "doe", "role": None}]
+
+ mock_get_users_info.return_value = {"john": {}, "doe": {}}
+ update_project_user_matches(matches)
+ for match in matches:
+ self.assertEqual(ProjectUserRoleChoice.objects.get(name="User"), match.get("role"))
+
+ mock_get_users_info.return_value = {"john": {"title": "group"}, "doe": {"title": "group"}}
+ update_project_user_matches(matches)
+ for match in matches:
+ self.assertEqual(ProjectUserRoleChoice.objects.get(name="Group"), match.get("role"))
diff --git a/coldfront/plugins/ldap_misc/tests/test_resource.py b/coldfront/plugins/ldap_misc/tests/test_resource.py
new file mode 100644
index 0000000000..46735a018d
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/tests/test_resource.py
@@ -0,0 +1,79 @@
+from unittest import mock
+
+from django.test import TestCase, override_settings
+
+from coldfront.plugins.ldap_misc.utils.resource import get_user_account_statuses, get_users_accounts
+
+
+@override_settings(
+ LDAP_ENABLE_RESOURCE_ACCOUNT_CHECKING=True,
+ LDAP_RESOURCE_ACCOUNTS={"test_resource": "test1"},
+)
+class ResourceTestCase(TestCase):
+ @mock.patch("coldfront.plugins.ldap_misc.utils.resource.get_users_info")
+ def test_get_users_accounts(self, mock_get_users_info):
+ usernames = ["john", "doe"]
+ mock_get_users_info.return_value = {"john": {"memberOf": ["test1"]}, "doe": {"memberOf": ["test1"]}}
+ user_accounts = get_users_accounts(usernames)
+ for name, accounts in user_accounts.items():
+ with self.subTest(name=name):
+ self.assertEqual(accounts, ["test1"])
+
+ @mock.patch("coldfront.plugins.ldap_misc.utils.resource.get_users_accounts")
+ def test_get_user_account_statuses_variants(self, mock_get_users_accounts):
+ def helper(user_account_statuses, assert_bool, reason):
+ for name, status in user_account_statuses.items():
+ with self.subTest(name=name):
+ assert_bool(status.get("exists"))
+ self.assertEqual(status.get("reason"), reason)
+
+ usernames = ["john", "doe"]
+ user_account_statuses = get_user_account_statuses(usernames, None)
+ helper(user_account_statuses, self.assertTrue, "not_required")
+
+ # First, we run tests with provided user_accounts
+ # No accounts
+ user_accounts = {"john": [], "doe": []}
+ user_account_statuses = get_user_account_statuses(usernames, "test_resource", user_accounts)
+ helper(user_account_statuses, self.assertFalse, "no_account")
+
+ # Missing resource accounts
+ user_accounts = {"john": ["wrong_account"], "doe": ["wrong_account"]}
+ user_account_statuses = get_user_account_statuses(usernames, "test_resource", user_accounts)
+ helper(user_account_statuses, self.assertFalse, "no_resource_account")
+
+ # Resource only requires an IU account
+ user_accounts = {"john": ["waccount"], "doe": ["account"]}
+ user_account_statuses = get_user_account_statuses(usernames, "test_resource2", user_accounts)
+ helper(user_account_statuses, self.assertTrue, "has_account")
+
+ # Resource requires an account
+ user_accounts = {"john": ["test1"], "doe": ["test1"]}
+ user_account_statuses = get_user_account_statuses(usernames, "test_resource", user_accounts)
+ helper(user_account_statuses, self.assertTrue, "has_resource_account")
+
+ # Now, we will run tests without providing accounts
+ # Disabled
+ mock_get_users_accounts.return_value = None
+ user_account_statuses = get_user_account_statuses(usernames, "test_resource")
+ helper(user_account_statuses, self.assertTrue, "not_enabled")
+
+ # # No accounts
+ mock_get_users_accounts.return_value = {"john": [], "doe": []}
+ user_account_statuses = get_user_account_statuses(usernames, "test_resource")
+ helper(user_account_statuses, self.assertFalse, "no_account")
+
+ # Missing resource accounts
+ mock_get_users_accounts.return_value = {"john": ["wrong_account"], "doe": ["wrong_account"]}
+ user_account_statuses = get_user_account_statuses(usernames, "test_resource")
+ helper(user_account_statuses, self.assertFalse, "no_resource_account")
+
+ # Resource only requires an IU account
+ mock_get_users_accounts.return_value = {"john": ["waccount"], "doe": ["account"]}
+ user_account_statuses = get_user_account_statuses(usernames, "test_resource2")
+ helper(user_account_statuses, self.assertTrue, "has_account")
+
+ # Resource requires an account
+ mock_get_users_accounts.return_value = {"john": ["test1"], "doe": ["test1"]}
+ user_account_statuses = get_user_account_statuses(usernames, "test_resource")
+ helper(user_account_statuses, self.assertTrue, "has_resource_account")
diff --git a/coldfront/plugins/ldap_misc/utils/__init__.py b/coldfront/plugins/ldap_misc/utils/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/ldap_misc/utils/ldap_user_search.py b/coldfront/plugins/ldap_misc/utils/ldap_user_search.py
new file mode 100644
index 0000000000..df1b76c758
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/utils/ldap_user_search.py
@@ -0,0 +1,28 @@
+from django.conf import settings
+
+from coldfront.plugins.ldap_user_search.utils import LDAPUserSearch
+
+
+def get_users_info(usernames: list[str]) -> dict:
+ """Runs an LDAP query for each username to find the info specified in the ENV variable
+ LDAP_USER_SEARCH_ATTRIBUTE_MAP.
+
+ Params:
+ usernames (list): a list of usernames to search for
+
+ Returns:
+ dict: a dictionary info found for each user, or each users' info is None if LDAP_ENABLE_USER_INFO is False
+ """
+ if not settings.LDAP_ENABLE_USER_INFO:
+ return dict.fromkeys(usernames, None)
+
+ ldap_search = LDAPUserSearch(None, None)
+ results = {}
+ for username in usernames:
+ user_info = ldap_search.search_a_user(username, "username_only")
+ if not user_info:
+ results[username] = {}
+ else:
+ results[username] = user_info[0]
+
+ return results
diff --git a/coldfront/plugins/ldap_misc/utils/project.py b/coldfront/plugins/ldap_misc/utils/project.py
new file mode 100644
index 0000000000..30e4fec41e
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/utils/project.py
@@ -0,0 +1,67 @@
+from django.conf import settings
+
+from coldfront.core.project.models import ProjectUserRoleChoice
+from coldfront.plugins.ldap_misc.utils.ldap_user_search import get_users_info
+
+
+def check_if_pis_eligible(project_pi_usernames: list[str]) -> dict:
+ """Checks the elgibility of project PIs.
+
+ Params:
+ project_pi_usernames (list): a list of project PI usernames
+
+ Returns:
+ dict: a dictionary of project PIs' eligibilities, if LDAP_ENABLE_PROJECT_PI_ELIGIBLE_ADS_GROUPS is False then
+ it's empty
+ """
+ if not settings.LDAP_ENABLE_PROJECT_PI_ELIGIBLE_ADS_GROUPS:
+ return {}
+
+ eligible_statuses = {}
+ users_info = get_users_info(project_pi_usernames)
+ for username, user_info in users_info.items():
+ if user_info is None:
+ eligible_statuses[username] = True
+ continue
+ for user_membersip in user_info.get("memberOf", []):
+ eligible = user_membersip in settings.LDAP_PROJECT_PI_ELIGIBLE_ADS_GROUPS
+ eligible_statuses[username] = eligible
+ if eligible:
+ break
+
+ return eligible_statuses
+
+
+def get_ineligible_pis(project_pi_usernames: list[str]) -> list[str]:
+ """Finds project PIs that are not eligible to be a PI.
+
+ Params:
+ project_pi_usernames (list): a list of project PI usernames
+
+ Returns:
+ list: a list of project PI usernames that are not eligible to be a PI
+ """
+ ineligible_pis = []
+ for username, eligible in check_if_pis_eligible(project_pi_usernames).items():
+ if not eligible:
+ ineligible_pis.append(username)
+
+ return ineligible_pis
+
+
+def update_project_user_matches(matches: list[dict]) -> list:
+ """Update the roles in each match based on if they are a group account.
+
+ Params:
+ matches (list): a list of matches found
+
+ Returns:
+ list: the list of matches with their updated roles
+ """
+ users_info = get_users_info([match.get("username") for match in matches])
+ for match in matches:
+ user_info = users_info.get(match.get("username"))
+ role = "Group" if user_info is not None and user_info.get("title") == "group" else "User"
+ match.update({"role": ProjectUserRoleChoice.objects.get(name=role)})
+
+ return matches
diff --git a/coldfront/plugins/ldap_misc/utils/resource.py b/coldfront/plugins/ldap_misc/utils/resource.py
new file mode 100644
index 0000000000..df13e4745b
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/utils/resource.py
@@ -0,0 +1,60 @@
+from django.conf import settings
+
+from coldfront.plugins.ldap_misc.utils.ldap_user_search import get_users_info
+
+
+def get_users_accounts(usernames: list[str]) -> dict | None:
+ """Finds the accounts the users have with LDAP.
+
+ Params:
+ usernames (list): a list of usernames
+
+ Returns:
+ dict | None: a dictionary with the users' accounts or None if LDAP_ENABLE_RESOURCE_ACCOUNT_CHECKING is False
+ """
+ if not settings.LDAP_ENABLE_RESOURCE_ACCOUNT_CHECKING:
+ return None
+
+ results = {}
+ users_info = get_users_info(usernames)
+ for username, user_info in users_info.items():
+ if user_info is None:
+ results[username] = []
+ else:
+ results[username] = user_info.get("memberOf", [])
+
+ return results
+
+
+def get_user_account_statuses(
+ usernames: list[str], resource: str | None, all_user_accounts: dict | None = None
+) -> dict:
+ """Checks if an account exists for the resource by comparing the provided list
+
+ Params:
+ accounts: A list of accounts to check against
+
+ Returns:
+ dict(exists: bool - If the require account exists, reason: str - Why the account was found/not found)
+ """
+ if resource is None:
+ return dict.fromkeys(usernames, {"exists": True, "reason": "not_required"})
+
+ if all_user_accounts is None:
+ all_user_accounts = get_users_accounts(usernames)
+ if all_user_accounts is None:
+ return dict.fromkeys(usernames, {"exists": True, "reason": "not_enabled"})
+
+ resource_acc = settings.LDAP_RESOURCE_ACCOUNTS.get(resource)
+ results = {}
+ for username, user_accounts in all_user_accounts.items():
+ if not user_accounts:
+ results[username] = {"exists": False, "reason": "no_account"}
+ elif not resource_acc:
+ results[username] = {"exists": True, "reason": "has_account"}
+ elif resource_acc in user_accounts:
+ results[username] = {"exists": True, "reason": "has_resource_account"}
+ else:
+ results[username] = {"exists": False, "reason": "no_resource_account"}
+
+ return results
diff --git a/coldfront/plugins/ldap_misc/views.py b/coldfront/plugins/ldap_misc/views.py
new file mode 100644
index 0000000000..91ea44a218
--- /dev/null
+++ b/coldfront/plugins/ldap_misc/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/coldfront/plugins/ldap_user_search/templates/username_search_result.html b/coldfront/plugins/ldap_user_search/templates/username_search_result.html
new file mode 100644
index 0000000000..f262d11a7a
--- /dev/null
+++ b/coldfront/plugins/ldap_user_search/templates/username_search_result.html
@@ -0,0 +1,17 @@
+
+ {{ message }}
+
+{% if username_exists %}
+
+
+
+
+ Details
+
+
+
Name: {{ name }}
+
Email: {{ email }}
+
+
+
+{% endif %}
\ No newline at end of file
diff --git a/coldfront/plugins/ldap_user_search/urls.py b/coldfront/plugins/ldap_user_search/urls.py
new file mode 100644
index 0000000000..b7e1903b6d
--- /dev/null
+++ b/coldfront/plugins/ldap_user_search/urls.py
@@ -0,0 +1,11 @@
+# SPDX-FileCopyrightText: (C) ColdFront Authors
+#
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+from django.urls import path
+
+from coldfront.plugins.ldap_user_search.views import LDAPUserSearchView
+
+urlpatterns = [
+ path("ldap_user_search/", LDAPUserSearchView.as_view(), name="ldap-user-search"),
+]
diff --git a/coldfront/plugins/ldap_user_search/utils.py b/coldfront/plugins/ldap_user_search/utils.py
index fe65c57afe..5b9d66e0db 100644
--- a/coldfront/plugins/ldap_user_search/utils.py
+++ b/coldfront/plugins/ldap_user_search/utils.py
@@ -7,7 +7,15 @@
import ssl
import ldap.filter
-from ldap3 import AUTO_BIND_TLS_BEFORE_BIND, SASL, Connection, Server, Tls, get_config_parameter, set_config_parameter
+from ldap3 import (
+ AUTO_BIND_TLS_BEFORE_BIND,
+ SASL,
+ Connection,
+ Server,
+ Tls,
+ get_config_parameter,
+ set_config_parameter,
+)
from coldfront.core.user.utils import UserSearch
from coldfront.core.utils.common import import_from_settings
@@ -116,5 +124,5 @@ def search_a_user(self, user_search_string=None, search_by="all_fields"):
user_dict = self.MAPPING_CALLBACK(self.ATTRIBUTE_MAP, entry_dict)
user_dict["source"] = self.search_source
users.append(user_dict)
- logger.info("LDAP user search for %s found %s results", user_search_string, len(users))
+ logger.debug("LDAP user search for %s found %s results", user_search_string, len(users))
return users
diff --git a/coldfront/plugins/ldap_user_search/views.py b/coldfront/plugins/ldap_user_search/views.py
index 2fa8704650..327c1c4e4f 100644
--- a/coldfront/plugins/ldap_user_search/views.py
+++ b/coldfront/plugins/ldap_user_search/views.py
@@ -3,3 +3,35 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# Create your views here.
+
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.shortcuts import render
+from django.views.generic import View
+
+from coldfront.plugins.ldap_user_search.utils import LDAPUserSearch
+
+
+class LDAPUserSearchView(LoginRequiredMixin, View):
+ def post(self, request):
+ context = {
+ "username_exists": False,
+ "name": None,
+ "email": None,
+ "id": request.POST.get("id"),
+ "message": "Invalid username",
+ }
+
+
+ attributes = LDAPUserSearch(None, None).search_a_user(request.POST.get("username"), "username_only")
+ if not attributes:
+ attributes = {}
+ attributes = attributes[0]
+ display_name = attributes.get("displayName")
+ # If one exists so does the other
+ if display_name:
+ context["username_exists"] = True
+ context["name"] = display_name
+ context["email"] = attributes.get("email")
+ context["message"] = "Valid username"
+
+ return render(request, "username_search_result.html", context)
diff --git a/coldfront/plugins/maintenance_mode/__init__.py b/coldfront/plugins/maintenance_mode/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/maintenance_mode/admin.py b/coldfront/plugins/maintenance_mode/admin.py
new file mode 100644
index 0000000000..8c38f3f3da
--- /dev/null
+++ b/coldfront/plugins/maintenance_mode/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/coldfront/plugins/maintenance_mode/apps.py b/coldfront/plugins/maintenance_mode/apps.py
new file mode 100644
index 0000000000..a05101c514
--- /dev/null
+++ b/coldfront/plugins/maintenance_mode/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class MaintenanceModeConfig(AppConfig):
+ name = "coldfront.plugins.maintenance_mode"
diff --git a/coldfront/plugins/maintenance_mode/management/__init__.py b/coldfront/plugins/maintenance_mode/management/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/maintenance_mode/management/commands/__init__.py b/coldfront/plugins/maintenance_mode/management/commands/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/maintenance_mode/management/commands/toggle_maintenance_mode.py b/coldfront/plugins/maintenance_mode/management/commands/toggle_maintenance_mode.py
new file mode 100644
index 0000000000..851ed44891
--- /dev/null
+++ b/coldfront/plugins/maintenance_mode/management/commands/toggle_maintenance_mode.py
@@ -0,0 +1,26 @@
+import logging
+
+from django.core.management.base import BaseCommand, CommandError
+
+from coldfront.plugins.maintenance_mode.utils import set_maintenance_mode_status
+
+logger = logging.getLogger(__name__)
+
+class Command(BaseCommand):
+ help = 'Turns maintenance mode on or off'
+
+ def add_arguments(self, parser):
+ parser.add_argument("-s", "--status", help="Turn maintenance mode on/off")
+
+ def handle(self, *args, **options):
+ status = options.get('status')
+ if status is None:
+ raise CommandError('Please provide a status (on/off)')
+
+ if status.lower() == 'on':
+ set_maintenance_mode_status(True)
+ elif status.lower() == 'off':
+ set_maintenance_mode_status(False)
+ else:
+ logger.warning(f'Failed to set maintenance mode status with {status}')
+ raise CommandError('Invalid command, status must be set with on/off')
diff --git a/coldfront/plugins/maintenance_mode/middleware.py b/coldfront/plugins/maintenance_mode/middleware.py
new file mode 100644
index 0000000000..40c2ee7e6e
--- /dev/null
+++ b/coldfront/plugins/maintenance_mode/middleware.py
@@ -0,0 +1,33 @@
+from django.shortcuts import render
+from django.utils.cache import add_never_cache_headers
+
+from coldfront.plugins.maintenance_mode.utils import get_maintenance_mode_status
+
+
+class MaintenanceModeMiddleware:
+ def __init__(self, get_response):
+ self.get_response = get_response
+
+ def __call__(self, request):
+ path = request.path
+ if not get_maintenance_mode_status():
+ return self.get_response(request)
+
+ if request.user.is_authenticated and request.user.is_superuser:
+ return self.get_response(request)
+
+ if '/admin' in path:
+ return self.get_response(request)
+
+ # This allows the cas login to complete
+ if '/user/login' in path:
+ return self.get_response(request)
+
+ response = render(
+ request,
+ 'maintenance_mode/503.html',
+ status=503
+ )
+ add_never_cache_headers(response)
+
+ return response
diff --git a/coldfront/plugins/maintenance_mode/migrations/__init__.py b/coldfront/plugins/maintenance_mode/migrations/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/maintenance_mode/models.py b/coldfront/plugins/maintenance_mode/models.py
new file mode 100644
index 0000000000..71a8362390
--- /dev/null
+++ b/coldfront/plugins/maintenance_mode/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/coldfront/plugins/maintenance_mode/templates/maintenance_mode/503.html b/coldfront/plugins/maintenance_mode/templates/maintenance_mode/503.html
new file mode 100644
index 0000000000..61926de0c5
--- /dev/null
+++ b/coldfront/plugins/maintenance_mode/templates/maintenance_mode/503.html
@@ -0,0 +1,70 @@
+{% load static %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% block title %}RT Projects{% endblock %}
+
+
+
+ {% include "su/is_su.html" %}
+
+ {% include 'common/navbar_brand.html' %}
+
+
+
+
+
+ {% include 'common/messages.html' %}
+ {% block content %}
+
+
+ The site is undergoing maintenance, please check back later.
+
+ {% endblock %}
+
+
+ {% include 'common/footer.html' %}
+ {% block javascript %} {% endblock %}
+
+
+
diff --git a/coldfront/plugins/maintenance_mode/tests.py b/coldfront/plugins/maintenance_mode/tests.py
new file mode 100644
index 0000000000..7ce503c2dd
--- /dev/null
+++ b/coldfront/plugins/maintenance_mode/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/coldfront/plugins/maintenance_mode/utils.py b/coldfront/plugins/maintenance_mode/utils.py
new file mode 100644
index 0000000000..8e8859c734
--- /dev/null
+++ b/coldfront/plugins/maintenance_mode/utils.py
@@ -0,0 +1,26 @@
+import os
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+def get_maintenance_mode_status():
+ file_name = 'maintenance_mode.txt'
+ if not os.path.isfile(file_name):
+ with open(file_name, 'w') as maintenance_file:
+ maintenance_file.write('0')
+
+ return False
+
+ with open(file_name, 'r') as maintenance_file:
+ status = bool(int(maintenance_file.readline()))
+
+ return status
+
+
+def set_maintenance_mode_status(status):
+ file_name = 'maintenance_mode.txt'
+ with open(file_name, 'w') as maintenance_file:
+ maintenance_file.write(str(int(status)))
+
+ logger.info(f'Maintenance mode has been set to {status}')
\ No newline at end of file
diff --git a/coldfront/plugins/maintenance_mode/views.py b/coldfront/plugins/maintenance_mode/views.py
new file mode 100644
index 0000000000..91ea44a218
--- /dev/null
+++ b/coldfront/plugins/maintenance_mode/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/coldfront/plugins/movable_allocations/__init__.py b/coldfront/plugins/movable_allocations/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/movable_allocations/admin.py b/coldfront/plugins/movable_allocations/admin.py
new file mode 100644
index 0000000000..8c38f3f3da
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/coldfront/plugins/movable_allocations/apps.py b/coldfront/plugins/movable_allocations/apps.py
new file mode 100644
index 0000000000..84bf48ac10
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class MovableAllocationsConfig(AppConfig):
+ default_auto_field = "django.db.models.BigAutoField"
+ name = "coldfront.plugins.movable_allocations"
diff --git a/coldfront/plugins/movable_allocations/forms.py b/coldfront/plugins/movable_allocations/forms.py
new file mode 100644
index 0000000000..d856f4dd6a
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/forms.py
@@ -0,0 +1,5 @@
+from django import forms
+
+
+class AllocationMoveForm(forms.Form):
+ destination_project = forms.IntegerField()
diff --git a/coldfront/plugins/movable_allocations/management/__init__.py b/coldfront/plugins/movable_allocations/management/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/movable_allocations/management/commands/__init__.py b/coldfront/plugins/movable_allocations/management/commands/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/movable_allocations/management/commands/add_movable_allocation_permissions.py b/coldfront/plugins/movable_allocations/management/commands/add_movable_allocation_permissions.py
new file mode 100644
index 0000000000..95c5901674
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/management/commands/add_movable_allocation_permissions.py
@@ -0,0 +1,15 @@
+from django.contrib.auth.models import Permission
+from django.contrib.contenttypes.models import ContentType
+from django.core.management.base import BaseCommand
+
+from coldfront.core.allocation.models import Allocation
+
+
+class Command(BaseCommand):
+ help = "Add permissions for movable allocations"
+
+ def handle(self, *args, **options):
+ content_type = ContentType.objects.get_for_model(Allocation)
+ Permission.objects.get_or_create(
+ content_type=content_type, codename="can_move_allocations", name="Can move allocations"
+ )
diff --git a/coldfront/plugins/movable_allocations/migrations/0001_initial.py b/coldfront/plugins/movable_allocations/migrations/0001_initial.py
new file mode 100644
index 0000000000..ac625fdb8c
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/migrations/0001_initial.py
@@ -0,0 +1,26 @@
+# Generated by Django 4.2.11 on 2025-05-14 19:57
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+ initial = True
+
+ dependencies = [
+ ("allocation", "0004_auto_20211005_1108_squashed_0018_alter_allocation_options_and_more"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="MovableAllocation",
+ fields=[],
+ options={
+ "permissions": (("can_move_allocations", "Can move allocations"),),
+ "proxy": True,
+ "default_permissions": (),
+ "indexes": [],
+ "constraints": [],
+ },
+ bases=("allocation.allocation",),
+ ),
+ ]
diff --git a/coldfront/plugins/movable_allocations/migrations/__init__.py b/coldfront/plugins/movable_allocations/migrations/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/coldfront/plugins/movable_allocations/models.py b/coldfront/plugins/movable_allocations/models.py
new file mode 100644
index 0000000000..8acdab80fc
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/models.py
@@ -0,0 +1,9 @@
+from coldfront.core.allocation.models import Allocation
+
+
+# Create your models here.
+class MovableAllocation(Allocation):
+ class Meta:
+ proxy = True
+ default_permissions = ()
+ permissions = (("can_move_allocations", "Can move allocations"),)
diff --git a/coldfront/plugins/movable_allocations/signals.py b/coldfront/plugins/movable_allocations/signals.py
new file mode 100644
index 0000000000..87d42edce9
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/signals.py
@@ -0,0 +1,4 @@
+import django.dispatch
+
+
+allocation_moved = django.dispatch.Signal()
diff --git a/coldfront/plugins/movable_allocations/templates/movable_allocations/allocation_move.html b/coldfront/plugins/movable_allocations/templates/movable_allocations/allocation_move.html
new file mode 100644
index 0000000000..bc48a66c7a
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/templates/movable_allocations/allocation_move.html
@@ -0,0 +1,193 @@
+{% extends "common/base.html" %}
+{% load crispy_forms_tags %}
+{% load common_tags %}
+{% load static %}
+
+
+{% block title %}
+Move Allocation
+{% endblock %}
+
+
+{% block content %}
+
Move {{ allocation.get_parent_resource.name }} Allocation to a Different Project
+
+
+
+ Allocations can be moved to another project as long as the other project's
+ restrictions are not met, i.e. max allocations allowed for this resource in the project.
+ Users in the allocation are also moved over and anyone missing from the destination project are
+ automatically added to it. If there are users that should not be moved then they need to be removed
+ from the allocation first. Compute allocations being moved will be given a new slurm
+ account. Storage allocation file system access will not be effected.
+
+
+
+
+
+
+{% endblock %}
diff --git a/coldfront/plugins/movable_allocations/templates/movable_allocations/email/moved_allocation.txt b/coldfront/plugins/movable_allocations/templates/movable_allocations/email/moved_allocation.txt
new file mode 100644
index 0000000000..ff9257091e
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/templates/movable_allocations/email/moved_allocation.txt
@@ -0,0 +1,13 @@
+Your {{ resource }} allocation, {{ allocation_url }}, was moved to a different project by
+{{ user.first_name }} {{ user.last_name }} ({{ user.username }}).
+
+New location:
+Project: {{ destination_project_url }}
+
+Old location:
+Project: {{ origin_project_url }}
+
+If this allocation has a compute resource then its slurm account has changed. You should
+visit your allocation and note the new slurm account.
+
+{{ signature }}
\ No newline at end of file
diff --git a/coldfront/plugins/movable_allocations/templates/movable_allocations/email/moved_allocation_admin.txt b/coldfront/plugins/movable_allocations/templates/movable_allocations/email/moved_allocation_admin.txt
new file mode 100644
index 0000000000..669f074c6e
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/templates/movable_allocations/email/moved_allocation_admin.txt
@@ -0,0 +1,8 @@
+A {{ resource }} allocation, {{ allocation_url }}, was moved to a different project by
+{{ user.first_name }} {{ user.last_name }} ({{ user.username }}).
+
+New location:
+Project: {{ destination_project_url }}
+
+Old location:
+Project: {{ origin_project_url }}
\ No newline at end of file
diff --git a/coldfront/plugins/movable_allocations/templates/movable_allocations/project_detail.html b/coldfront/plugins/movable_allocations/templates/movable_allocations/project_detail.html
new file mode 100644
index 0000000000..9cdc67c73c
--- /dev/null
+++ b/coldfront/plugins/movable_allocations/templates/movable_allocations/project_detail.html
@@ -0,0 +1,84 @@
+{% if does_not_exist %}
+
+
+ This project does not exist.
+
+{% else %}
+ {% if already_in_project %}
+
+
+ This allocation is already in this project.
+
+ {% elif over_allocation_limit %}
+
+
+ Moving this allocation to this project will put it over its resource limit.
+
+ {% elif not resource_allowed %}
+
+
+ The resource in this allocation is not allowed in this type of project.
+