7 <title>Open source single molecule force spectroscopy</title>
9 <meta name="description" content="Controlling and analyzing SMFS with varying salt concentrations">
10 <meta name="author" content="Trevor King">
12 <meta name="apple-mobile-web-app-capable" content="yes" />
13 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
14 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
16 <link rel="stylesheet" href="css/reveal.min.css">
17 <link rel="stylesheet" href="css/theme/beige.css" id="theme">
18 <link rel="stylesheet" href="css/local.css" id="local">
20 <!-- For syntax highlighting -->
21 <link rel="stylesheet" href="lib/css/zenburn.css">
23 <!-- If the query includes 'print-pdf', use the PDF print sheet -->
25 document.write( '<link rel="stylesheet" href="css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
29 <script src="lib/js/html5shiv.js"></script>
37 <!-- Any section element inside of this container is displayed as a slide -->
41 <h2>Open source<br/> single molecule<br/> force spectroscopy</h2>
42 <h3>Protein unfolding in varying salt concentrations</h3>
43 <p style="text-align: center;">
44 <small>Trevor King</small>
49 <h2>Open source SMFS</h2>
51 <li><a href="#/1" class="active">Proteins</a></li>
52 <li><a href="#/2">Atomic force microscopy</a></li>
53 <li><a href="#/3">Single molecule force spectroscopy</a></li>
54 <li><a href="#/4">Experiment control</a></li>
55 <li><a href="#/5">Cantilever calibration</a></li>
57 Modeling: Monte Carlo unfolding simulations</a></li>
59 Application: Unfolding in salty buffers</a></li>
60 <li><a href="#/8">Conclusions and future work</a></li>
64 <h2>Proteins: What are they?</h2>
66 <video width="640" height="480"
67 preload="auto" loop="" controls=""> <!--autoplay=""-->
68 <source src="media/build/1TIT-atoms.mp4"
69 type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"' />
71 <!-- generated with PyMol from
72 http://www.rcsb.org/pdb/explore.do?structureId=1TIT -->
76 <h2>Proteins: Where are they?</h2>
78 <img src="media/build/takamori-fig4b-fw-fh.png" />
80 <p style="text-align: center;">
82 <a href="http://dx.doi.org/10.1016/j.cell.2006.10.030">
83 Takamori, Holt, Stenius, et al., 2006
89 <h2>Proteins: Titin</h2>
91 <img src="media/build/skeletal-muscle-fw-fh.png" />
93 <p style="text-align: center;">
96 <a href="http://en.wikipedia.org/wiki/File:Skeletal_muscle.jpg">
103 <h2>Proteins: Titin's I27</h2>
105 <img src="media/build/titin-fw-fh.png" />
107 <p style="text-align: center;">
109 <a href="http://www.ks.uiuc.edu/Research/telethonin/">
110 U. Illinois Biophysics Group
116 <h2>Proteins: I27</h2>
118 <img src="media/build/1TIT-fw-fh.png" />
120 <p style="text-align: center;">
122 <a href="http://www.rcsb.org/pdb/explore.do?structureId=1TIT">
129 <h2>Proteins: What's the problem?</h2>
130 <table class="center">
132 <td style="vertical-align: middle;">
133 <pre style="display: table; width: auto;">
143 <td style="vertical-align: middle;"><p> → </p></td>
144 <td style="vertical-align: middle;">
145 <img src="media/build/1TIT-tw-th.png" />
151 <img src="media/build/pirchi-fig1-fw-hh.png" />
153 <p style="text-align: center;">
155 <a href="http://dx.doi.org/10.1038/ncomms1504">
156 Pirchi, Ziv, Riven, et al., 2011
167 <h2>Open source SMFS</h2>
169 <li><a href="#/1">Proteins</a></li>
170 <li><a href="#/2" class="active">Atomic force microscopy</a></li>
171 <li><a href="#/3">Single molecule force spectroscopy</a></li>
172 <li><a href="#/4">Experiment control</a></li>
173 <li><a href="#/5">Cantilever calibration</a></li>
175 Modeling: Monte Carlo unfolding simulations</a></li>
177 Application: Unfolding in salty buffers</a></li>
178 <li><a href="#/8">Conclusions and future work</a></li>
182 <h2>Atomic force microscopy</h2>
184 <img src="media/build/afm-3d-fw-fh.png" />
188 <h2>AFM: Cantilever geometry</h2>
190 <!-- need height to stretch low-resolution pictures -->
191 <img src="media/build/cantilever.jpg" height="272" />
192 <img src="media/build/tip.jpg" height="272" />
194 <p style="text-align: center;">
196 <a href="http://probe.olympus-global.com/en/product/omcl_tr800psa_w/">
199 <a href="http://www.asylumresearch.com/Probe/TR400PSA,Olympus">
203 <a href="http://probe.olympus-global.com/en/product/omcl_tr400psa_hw/">
210 <h2>AFM: Laser deflection</h2>
212 <video width="640" height="480"
213 preload="auto" loop="" controls=""> <!--autoplay=""-->
214 <source src="media/build/contact-afm.ogv"
215 type='video/ogg; codecs="theora,vorbis"' />
218 <p style="text-align: center;">
220 <a href="http://www.freesbi.ch/fr/illustration/animations">
227 <h2>AFM: Piezo positioning</h2>
229 <img src="media/build/afm-fw-fh.png" />
233 <h2>The piezoelectric effect</h2>
235 <object data="media/perovskite.svg" type="image/svg+xml"
236 width="640" height="350"></object>
238 <p style="text-align: center;">
240 Lead zirconium titanate (PZT) from
241 <a href="http://en.wikipedia.org/wiki/File:Perovskite.svg">
248 <h2>AFM: Tubular piezos</h2>
250 <img src="media/build/piezo-fw-fh.png" />
256 <h2>Open source SMFS</h2>
258 <li><a href="#/1">Proteins</a></li>
259 <li><a href="#/2">Atomic force microscopy</a></li>
260 <li><a href="#/3" class="active">
261 Single molecule force spectroscopy</a></li>
262 <li><a href="#/4">Experiment control</a></li>
263 <li><a href="#/5">Cantilever calibration</a></li>
265 Modeling: Monte Carlo unfolding simulations</a></li>
267 Application: Unfolding in salty buffers</a></li>
268 <li><a href="#/8">Conclusions and future work</a></li>
272 <h2>Single molecule force spectroscopy</h2>
274 <img src="media/build/unfolding-fw-fh.png" />
278 <h2>SMFS: Sawtooth curve</h2>
280 <img src="media/build/expt-sawtooth-fw-fh.png" width="640" />
284 <h2>SMFS: What's going on?</h2>
286 <img src="media/build/carrion-vazquez-fig2-fw-fh.png" />
290 <a href="http://dx.doi.org/10.1016/S0079-6107(00)00017-1">
291 Carrion-Vazquez, et al., 2000;
292 adapted from Baljon and Robbins, 1996
298 <h2>SMFS: Unfolding one domain</h2>
300 <img src="media/build/lu-fig1-fw-fh.png" />
304 <a href="http://dx.doi.org/10.1016/S0006-3495(00)76273-4">
305 Lu and Schulten, 2000
313 <h2>Open source SMFS</h2>
315 <li><a href="#/1">Proteins</a></li>
316 <li><a href="#/2">Atomic force microscopy</a></li>
317 <li><a href="#/3">Single molecule force spectroscopy</a></li>
318 <li><a href="#/4" class="active">Experiment control</a></li>
319 <li><a href="#/5">Cantilever calibration</a></li>
321 Modeling: Monte Carlo unfolding simulations</a></li>
323 Application: Unfolding in salty buffers</a></li>
324 <li><a href="#/8">Conclusions and future work</a></li>
328 <h2>Experiment control</h2>
330 <img src="media/build/apparatus-fw-fh.png" />
334 <h2>Control: Quick-and-dirty</h2>
336 <img src="media/build/labview-fw-fh.png" />
340 <h2>Control: My modular stack</h2>
342 <img src="media/build/pyafm-fw-fh.png" />
346 <h2>Open source: Existing layers</h2>
347 <table class="center">
349 <td><img src="media/logo/tux.png" height="150" /></td>
350 <td><object data="media/logo/gnu.svg" type="image/svg+xml"
351 height="150"></object></td>
352 <td><object data="media/logo/gentoo.svg" type="image/svg+xml"
353 height="150"></object></td>
354 <td><object data="media/logo/python.svg" type="image/svg+xml"
355 height="150"></object></td>
356 <td><object data="media/logo/scipy.svg" type="image/svg+xml"
357 height="150"></object></td>
360 <td><a href="https://www.kernel.org/">Linux</a></td>
362 <a href="http://www.gnu.org/">
363 <abbr title="GNU's Not Unix!">GNU</abbr>
366 <td><a href="http://www.gentoo.org/">Gentoo</a></td>
367 <td><a href="http://www.python.org/">Python</a></td>
368 <td><a href="http://www.scipy.org/">SciPy</a></td>
373 <a href="http://www.comedi.org/">
374 <abbr title="Control and Measurement Device Interface">Comedi<abbr>
380 <a href="http://matplotlib.org/">matplotlib</a>
385 <a href="https://github.com/bashwork/pymodbus">pymodbus</a>
390 <a href="http://www.cython.org/">Cython</a>
395 <a href="https://www.numpy.org/">NumPy</a>
402 <a href="http://www.h5py.org/">h5py</a>
405 <td><small>…</small></td>
410 <h2>Open source: Teamwork</h2>
412 <img src="media/build/ants-fw-fh.png" />
414 <p style="text-align: center;">
416 <a href="http://dx.doi.org/10.1073/pnas.1016658108">
417 Mlot, Tovey, and Hu, 2011
423 <h2>Control: Example code</h2>
424 <pre><code data-trim="">
425 class Unfolder (object):
428 """Approach-bind-unfold-save[-plot] cycle.
431 ret['timestamp'] = _email_utils.formatdate(localtime=True)
432 ret['temperature'] = self.afm.get_temperature()
433 ret['approach'] = self._approach()
435 ret['unfold'] = self._unfold()
437 if _package_config['matplotlib']:
443 <h2>Archival: HDF5 and h5config</h2>
444 <!-- h5dump -H 2013-03-04T12-43-38.h5 |
445 grep 'GROUP\|DATASET' | sed 's/ {.*//' -->
447 GROUP <span style="color: blue">"/"</span>
448 GROUP <span style="color: blue">"approach"</span>
450 GROUP <span style="color: blue">"config"</span>
451 GROUP <span style="color: blue">"afm"</span>
453 GROUP <span style="color: blue">"approach"</span>
455 DATASET <span style="color: blue">"bind time"</span>
457 GROUP <span style="color: blue">"unfold"</span>
459 DATASET <span style="color: blue">"velocity"</span>
460 GROUP <span style="color: blue">"environment"</span>
461 DATASET <span style="color: blue">"temperature"</span>
462 DATASET <span style="color: blue">"timestamp"</span>
464 GROUP <span style="color: blue">"unfold"</span>
465 DATASET <span style="color: blue">"deflection"</span>
466 DATASET <span style="color: blue">"frequency"</span>
467 DATASET <span style="color: blue">"z"</span></pre>
470 <h2>Archival: Version control</h2>
472 <span style="color: red">commit 32bfbf98d79c73eba50b77d0917df100e0e33bcf</span>
473 Author: W. Trevor King <wking@tremily.us>
474 Date: Fri Jan 18 22:54:49 2013 -0500
476 afm: Optionally return stepper_approach data with `record_data`
478 Sometimes these approach curves are pretty funky, so I'll start
479 recording them by default in calibcant-calibrate.py.
481 <span style="font-weight: bold">diff --git a/pyafm/afm.py b/pyafm/afm.py
482 index 60741c6..e76b118 100644
484 +++ b/pyafm/afm.py</span>
485 <span style="color: blue">@@ -460,10 +460,11 @@</span> class AFM (object):
489 <span style="color: red">- def stepper_approach(self, target_deflection):</span>
490 <span style="color: green">+ def stepper_approach(self, target_deflection, record_data=None):</span>
496 <h2>Open source SMFS</h2>
498 <li><a href="#/1">Proteins</a></li>
499 <li><a href="#/2">Atomic force microscopy</a></li>
500 <li><a href="#/3">Single molecule force spectroscopy</a></li>
501 <li><a href="#/4">Experiment control</a></li>
502 <li><a href="#/5" class="active">Cantilever calibration</a></li>
504 Modeling: Monte Carlo unfolding simulations</a></li>
506 Application: Unfolding in salty buffers</a></li>
507 <li><a href="#/8">Conclusions and future work</a></li>
511 <h2>Cantilever calibration</h2>
513 <img src="media/build/unfolding-fw-fh.png" />
517 <h2>Calibration: Geometry</h2>
519 <!-- need height to stretch low-resolution pictures -->
520 <img src="media/build/cantilever.jpg" height="272" />
521 <img src="media/build/tip.jpg" height="272" />
523 <p style="text-align: center;">
525 <a href="http://probe.olympus-global.com/en/product/omcl_tr800psa_w/">
528 <a href="http://www.asylumresearch.com/Probe/TR400PSA,Olympus">
532 <a href="http://probe.olympus-global.com/en/product/omcl_tr400psa_hw/">
539 <h2>Calibration: Equipartition</h2>
540 <table class="center">
542 <td style="vertical-align: middle;">
543 <img src="media/build/calibcant-flow-hw-fh.png" />
547 The average spring energy is
551 \frac{1}{2} \kappa \left\langle x_c^2 \right\rangle = \frac{1}{2}k_B T \;,
555 where $k_B$ is Boltzmann's constant and $T$ is the
563 <h2>Calibration: Vibration</h2>
565 <img src="media/build/vibration-fw-fh.png" width="620" />
569 <h2>Calibration: Photodiode calibration</h2>
571 <img src="media/build/bump-fw-fh.png" />
575 <h2>Calibration: Results</h2>
579 T &= 298.15 \pm 0.03 \; \text{K} &
580 \sigma_p &= 35.7 \pm 0.9 \; \text{mV/nm} \\
581 \left\langle V_p^2 \right\rangle &= 97 \pm 1 \; \text{mV}^2 &
582 \sqrt{\left\langle x_c^2 \right\rangle}
583 &= \sqrt{\frac{\left\langle V_p^2 \right\rangle}{\sigma_p^2}}
584 = 0.28 \; \text{nm} \\
585 \kappa = \frac{k_B T \sigma_p^2}{\left\langle V_p^2 \right\rangle}
586 &= 54 \pm 3 \; \text{pN/nm}
592 <h2>Calibration: Stability</h2>
593 <table class="center">
599 <!-- 2013-03-03T16-37-12 -->
600 <th colspan="2" style="text-align: center">Day 1</th>
602 <!-- 2013-03-04T12-21-54 -->
603 <th colspan="2" style="text-align: center">Day 2</th>
621 <td> 46.2</td>
624 <td> 41.3</td>
628 <td>$\left\langle V_p^2 \right\rangle$</td>
651 <h2>Calibration: Inconsistency</h2>
652 <table class="center">
654 <td style="vertical-align: middle;">
655 <img src="media/build/florin-fig2-hw-fh.png" />
657 <td style="vertical-align: middle;">
658 <img src="media/build/vibration-hw-fh.png" />
662 <p style="text-align: center;">
664 <a href="http://dx.doi.org/10.1016/0896-6273(88)90139-0">
665 Florin, Rief, Lehmann, et al., 1995
673 <h2>Open source SMFS</h2>
675 <li><a href="#/1">Proteins</a></li>
676 <li><a href="#/2">Atomic force microscopy</a></li>
677 <li><a href="#/3">Single molecule force spectroscopy</a></li>
678 <li><a href="#/4">Experiment control</a></li>
679 <li><a href="#/5">Cantilever calibration</a></li>
680 <li><a href="#/6" class="active">
681 Modeling: Monte Carlo unfolding simulations</a></li>
683 Application: Unfolding in salty buffers</a></li>
684 <li><a href="#/8">Conclusions and future work</a></li>
688 <h2>Monte Carlo unfolding simulations</h2>
689 <table class="center">
691 <td rowspan="2" style="vertical-align: middle;">
692 <img src="media/build/unfolding-hw-fh.png" />
694 <td style="vertical-align: top;">
695 <img src="media/build/expt-sawtooth-hw-hh.png" />
699 <td><img src="media/build/pbs-hist-hw-hh.png" /></td>
704 <h2>Hooke: Experimental histograms</h2>
706 <img src="media/build/expt-sawtooth-hw-hh.png"
707 style="vertical-align: middle;" />
708 <img src="media/build/pbs-hist-hw-hh.png"
709 style="vertical-align: middle;" />
712 <a href="http://dx.doi.org/10.1093/bioinformatics/btp180">Sandal,
713 Benedetti, et al., 2009</a>
717 <h2>Sawsim: State model</h2>
719 <img src="media/build/unfolding-hw-fh.png"
720 style="vertical-align: middle;">
721 <img src="media/build/sawsim-states-hw-fh.png"
722 style="vertical-align: middle;">
725 My simulation framework.
729 <h2>Sawsim: Simulation loop</h2>
731 <li>Calculate piezo-induced gap $x_t(t)=v t$</li>
733 Find tension model parameters for each state
736 Distribute per-state stretching ($x_c$, $x_u$, …) to
740 Calculate the transition rates between states
743 Roll the dice to determine if transitions take
744 place as you step forward in time
749 <h2>Sawsim: Monte Carlo</h2>
751 <img src="media/build/monte-carlo-fw-fh.png" />
755 <h2>Sawsim: Unfolding models</h2>
756 <table class="center">
758 <td style="text-align: center;">
759 <img src="media/build/unfolding-hw-hh.png"
760 style="vertical-align: middle;">
763 <img src="media/build/landscape-hw-hh.png"
764 style="vertical-align: middle;">
768 <td style="text-align: center;">
769 <img src="media/build/sawsim-states-hw-hh.png"
770 style="vertical-align: middle;">
773 <img src="media/build/landscape-bell-hw-hh.png"
774 style="vertical-align: middle;">
780 <h2>Sawsim: Kramers' model</h2>
785 \int_{-\infty}^{\infty} \mathrm{d}\! x \;
786 e^{\frac{U_F(x)}{k_B T}}
787 \int_{-\infty}^{x} \mathrm{d}\! x' \;
788 e^{\frac{-U_F(x')}{k_B T}}
792 <img src="media/build/landscape-hw-hh.png"
793 style="vertical-align: middle;">
794 <img src="media/build/kramers-integrand-hw-hh.png"
795 style="vertical-align: middle;">
799 <h2>Sawsim: Tension models</h2>
800 <table class="center">
802 <td style="text-align: center;">
803 <img src="media/build/unfolding-hw-hh.png"
804 style="vertical-align: middle;">
806 <td rowspan="2" style="vertical-align: middle;">
807 <img src="media/build/wlc-model-hw-fh.png">
809 <td rowspan="2" style="vertical-align: middle;">
810 <img src="media/build/fjc-model-hw-fh.png">
814 <td style="text-align: center;">
815 <img src="media/build/sawsim-states-hw-hh.png"
816 style="vertical-align: middle;">
822 <h2>Sawsim: Fitting models</h2>
824 <img src="media/build/fit-valley-fw-fh.png" />
830 <h2>Open source SMFS</h2>
832 <li><a href="#/1">Proteins</a></li>
833 <li><a href="#/2">Atomic force microscopy</a></li>
834 <li><a href="#/3">Single molecule force spectroscopy</a></li>
835 <li><a href="#/4">Experiment control</a></li>
836 <li><a href="#/5">Cantilever calibration</a></li>
838 Modeling: Monte Carlo unfolding simulations</a></li>
839 <li><a href="#/7" class="active">
840 Application: Unfolding in salty buffers</a></li>
841 <li><a href="#/8">Conclusions and future work</a></li>
845 <h2>Unfolding in salty buffers</h2>
847 <img src="media/build/lu-fig1-fw-fh.png" />
849 <p style="text-align: center;">
851 <a href="http://dx.doi.org/10.1016/S0006-3495(00)76273-4">
852 Lu and Schulten, 2000
858 <h2>Salt: Glutamic acid</h2>
860 <img src="media/build/1TIT-hbond-fw-fh.png" />
864 <h2>Salt: Reduced stability in CaCl₂</h2>
866 <img src="media/build/pbs-0.5M-CaCl2-hist-fw-fh.png" />
870 <h2>Salt: Sawsim fits</h2>
872 <img src="media/build/fit-valley-PBS-hw-hh.png" />
873 <img src="media/build/fit-valley-PBS-0.5M-CaCl2-hw-hh.png" />
875 <table class="center" style="width: 640px;">
879 <th>$\Delta x$ (Å)</th>
880 <th>$k_{u0}$ (s$^{-1}$)</th>
890 <td>PBS + 0.5 M CaCl₂</td>
896 <p><small>Ca²⁺ radius ∼1.1 Å, H-bond ∼2 Å.</small></p>
901 <h2>Open source SMFS</h2>
903 <li><a href="#/1">Proteins</a></li>
904 <li><a href="#/2">Atomic force microscopy</a></li>
905 <li><a href="#/3">Single molecule force spectroscopy</a></li>
906 <li><a href="#/4">Experiment control</a></li>
907 <li><a href="#/5">Cantilever calibration</a></li>
909 Modeling: Monte Carlo unfolding simulations</a></li>
911 Application: Unfolding in salty buffers</a></li>
912 <li><a href="#/8" class="active">
913 Conclusions and future work</a></li>
917 <h2>Conclusions: Salt</h2>
920 Prelimiary results show the expected destabilizing
923 <li>More contextual data!
925 <li>Pulling speeds</li>
926 <li>Salt concentrations (physiological levels)</li>
927 <li>Salt species</li>
930 <li>Mutated proteins?
932 <li>Is glutamic acid special?</li>
938 <h2>Conclusions: Hardware</h2>
939 <table class="center">
941 <td style="vertical-align: top;">
942 <img src="media/build/afm-hw-hh.png" />
945 <p>For automatic control, it would be nice to have…</p>
947 <li>Piezos with capacitive feedback ($10k an axis)</li>
948 <li>Independent 4-segment photodiode readout</li>
949 <li>Control over photodiode positioning</li>
950 <li>Control over laser alignment</li>
957 <h2>Conclusions: Software</h2>
959 <img src="media/build/pyafm-hw-hh.png" />
961 <p style="text-align: left;">
962 Everything works for me, and I expect it will work for
963 others… but no software (except
964 maybe <a href="http://en.wikipedia.org/wiki/TeX#Development">TeX</a>)
965 is without bugs. Testers welcome!
977 <td rowspan="2" style="vertical-align: top;">
979 <li>Guoliang Yang</li>
980 <li>Luis Cruz Cruz</li>
981 <li>Marisa Roman</li>
983 <li>Jian-Min Yuan</li>
986 <li>Michel Vallières</li>
987 <li>Everyone else in Drexel physics!</li>
989 <a href="http://dx.doi.org/10.1093/bioinformatics/btp180">Sandal,
990 Benedetti, et al.</a> for initial work on Hooke</li>
993 <td style="vertical-align: top;">
995 <li><a href="http://lab.hakim.se/reveal-js/">reveal.js</a></li>
996 <li><a href="http://sourceforge.net/projects/pymol/">PyMOL</a></li>
997 <li><a href="http://asymptote.sourceforge.net/">Asymptote</a></li>
1003 <td style="vertical-align: top;">
1014 <script src="lib/js/head.min.js"></script>
1015 <script src="js/reveal.min.js"></script>
1017 // Full list of configuration options available here:
1018 // https://github.com/hakimel/reveal.js#configuration
1024 theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
1025 transition: Reveal.getQueryHash().transition || 'none', // default/cube/page/concave/zoom/linear/fade/none
1026 // Optional libraries used to extend on reveal.js
1028 { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
1029 { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
1030 { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
1031 { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
1032 { src: 'plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
1033 { src: 'plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
1034 // { src: 'plugin/search/search.js', async: true, condition: function() { return !!document.body.classList; } }
1035 // { src: 'plugin/remotes/remotes.js', async: true, condition: function() { return !!document.body.classList; } }