Great job, Lillian! I did a bit of basic coding and data cleaning to prep for our meeting tomorrow. Im going to share that with you. We can adapt this in any way that you want, this was just to get us thinking about your results. We will go over it line by line together as well. Feel free to do more if you would like. Coding isnt really part of the SMP, so it’s not something I make you do, but you should understand what was done.

You should be really excited about these results because you didn’t just show that bacteria become resistant… you actually captured how that process happens over time. Your data clearly show that resistance evolves in very different ways depending on the antibiotic. Ampicillin resistance appeared almost immediately, jumping to very high levels, while kanamycin resistance increased more gradually and was much more variable. That contrast is not something everyone gets, and it points to real biological differences in how these drugs interact with cells and how bacteria adapt to them.

What makes your project especially strong is that all of your measurements tell the same story from different angles. The MIC data, growth scores, dose-response curves, and disk diffusion assays all line up and reinforce each other, which is exactly what you want in a solid scientific study. You also captured the process of adaptation, not just the endpoint, which is a much deeper level of analysis. This puts you in a great position to not only explain what happened, but to start asking why it happened.

Data Cleansing

names(disc)
[1] "Timepoint" "Plate"     "Disc"      "Radius"   
[5] "Radius.1" 

Figure 1 (MOST IMPORTANT): Resistance Trajectories “Amp resistance evolved extremely rapidly, exceeding our measurement range within one week”

p1 <- ggplot(mic, aes(x = Week, y = `log2(MIC)`, color = `Culture`, group = `Culture`)) +
  geom_line(linewidth = 1) +
  geom_point(aes(shape = Censored), size = 3) +
  scale_shape_manual(values = c(`FALSE` = 16, `TRUE` = 17)) +
  labs(
    title = "Resistance trajectories over time",
    x = "Week",
    y = expression(log[2]*"(MIC90, µg/mL)"),
    color = "Culture",
    shape = "At assay ceiling"
  ) +
  theme_classic(base_size = 14)

p1

Figure 3: Growth Under Selection

p3 <- ggplot(pass, aes(x = Passage, y = Growth.Score, color = Antibiotic, group = Line)) +
  geom_line(alpha = 0.8, linewidth = 0.9) +
  geom_point(size = 2) +
  labs(
    title = "Growth scores during serial passaging",
    x = "Passage",
    y = "Growth score",
    color = "Antibiotic"
  ) +
  theme_classic(base_size = 14)

p3

Figure 4: Antibiotic Concentration Over Time

p4 <- ggplot(pass, aes(x = Passage, y = Conc.Num, color = Antibiotic, group = Line)) +
  geom_step(alpha = 0.8, linewidth = 0.9) +
  geom_point(size = 2) +
  scale_y_log10() +
  labs(
    title = "Selection pressure during serial passaging",
    x = "Passage",
    y = expression("Concentration ("*mu*"g/mL, log scale)"),
    color = "Antibiotic"
  ) +
  theme_classic(base_size = 14)

p4

Figure 6: Disk Diffusion X-axis: Strain (Ancestor vs Evolved) Y-axis: Zone diameter (mm) Points = individual disks


p6 <- ggplot(disc, aes(x = Timepoint, y = Zone_diameter_mm, fill = Timepoint)) +
  geom_boxplot(alpha = 0.6, outlier.shape = NA) +
  geom_jitter(width = 0.1, size = 2.5) +
  labs(
    title = "Disk diffusion zones",
    x = "Timepoint",
    y = "Zone diameter (mm)"
  ) +
  theme_classic(base_size = 14) +
  theme(legend.position = "none")

p6

Figure 7: Heatmap of MIC curves X-axis: concentration Y-axis: timepoint Color: OD


p7 <- ggplot(od_long, aes(x = Timepoint, y = factor(Concentration, levels = sort(unique(Concentration), decreasing = TRUE)), fill = OD)) +
  geom_tile(color = "white") +
  facet_wrap(~Culture) +
  labs(
    title = "Heatmap of OD across concentration and time",
    x = "Week",
    y = expression("Concentration ("*mu*"g/mL)"),
    fill = expression(OD[600])
  ) +
  theme_classic(base_size = 14)

p7

Figure 8: OD vs concentration curves (per week)

Plot dose-response curves: W0 vs W5 vs W10 etc. Very strong for showing: rightward shift = resistance


p8 <- ggplot(od_long, aes(x = Concentration, y = OD, color = Timepoint, group = Timepoint)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  scale_x_log10() +
  facet_wrap(~Culture) +
  labs(
    title = "Dose-response curves across time",
    x = expression("Concentration ("*mu*"g/mL, log scale)"),
    y = expression(OD[600]),
    color = "Week"
  ) +
  theme_classic(base_size = 14)

p8

Key takeaways to consider:

  1. Resistance does not evolve in a single uniform way — it depends strongly on the antibiotic and underlying mechanism.
  2. Resistance can evolve extremely fast (Amp Log2 from 7-9 in one week). Ampicillin resistance can arise through large-effect mutations that rapidly confer high-level resistance. 3.Resistance can evolve gradually and unstably. Kanamycin resistance likely requires multiple or smaller-effect changes, leading to slower and more variable evolutionary trajectories.
  3. Adaptation happens before full resistance. Cells survive and fluctuate before MIC increases. Populations first undergo physiological adaptation, followed by stable genetic resistance.
  4. Phenotype matches quantitative data. Resistance observed in MIC assays translates directly into clinically relevant phenotypic resistance.

Discussion Points (tie to above)

  1. This study demonstrates how bacterial populations adapt to sub-lethal antibiotic exposure, with distinct evolutionary trajectories depending on the antibiotic.

  2. The rapid evolution of ampicillin resistance suggests selection of large-effect mutations (e.g., porin loss or efflux regulation), while the gradual trajectory of kanamycin resistance indicates a more complex adaptive pathway. I would read into this more as you’re writing your thesis.

  3. These results highlight that antibiotic resistance is not a uniform process and that different drugs can drive fundamentally different evolutionary dynamics, which has implications for treatment strategies and resistance management.

For your conclusion, consider a figure that depicts a future direction. Even just a diagram with text explanation:

Amp → efflux / porin mutation Kan → multi-step adaptation

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpHcmVhdCBqb2IsIExpbGxpYW4hIEkgZGlkIGEgYml0IG9mIGJhc2ljIGNvZGluZyBhbmQgZGF0YSBjbGVhbmluZyB0byBwcmVwIGZvciBvdXIgbWVldGluZyB0b21vcnJvdy4gSW0gZ29pbmcgdG8gc2hhcmUgdGhhdCB3aXRoIHlvdS4gV2UgY2FuIGFkYXB0IHRoaXMgaW4gYW55IHdheSB0aGF0IHlvdSB3YW50LCB0aGlzIHdhcyBqdXN0IHRvIGdldCB1cyB0aGlua2luZyBhYm91dCB5b3VyIHJlc3VsdHMuIFdlIHdpbGwgZ28gb3ZlciBpdCBsaW5lIGJ5IGxpbmUgdG9nZXRoZXIgIGFzIHdlbGwuIEZlZWwgZnJlZSB0byBkbyBtb3JlIGlmIHlvdSB3b3VsZCBsaWtlLiBDb2RpbmcgaXNudCByZWFsbHkgcGFydCBvZiB0aGUgU01QLCBzbyBpdCdzIG5vdCBzb21ldGhpbmcgSSBtYWtlIHlvdSBkbywgYnV0IHlvdSBzaG91bGQgdW5kZXJzdGFuZCB3aGF0IHdhcyBkb25lLiAKCllvdSBzaG91bGQgYmUgcmVhbGx5IGV4Y2l0ZWQgYWJvdXQgdGhlc2UgcmVzdWx0cyBiZWNhdXNlIHlvdSBkaWRu4oCZdCBqdXN0IHNob3cgdGhhdCBiYWN0ZXJpYSBiZWNvbWUgcmVzaXN0YW50Li4uIHlvdSBhY3R1YWxseSBjYXB0dXJlZCBob3cgdGhhdCBwcm9jZXNzIGhhcHBlbnMgb3ZlciB0aW1lLiBZb3VyIGRhdGEgY2xlYXJseSBzaG93IHRoYXQgcmVzaXN0YW5jZSBldm9sdmVzIGluIHZlcnkgZGlmZmVyZW50IHdheXMgZGVwZW5kaW5nIG9uIHRoZSBhbnRpYmlvdGljLiBBbXBpY2lsbGluIHJlc2lzdGFuY2UgYXBwZWFyZWQgYWxtb3N0IGltbWVkaWF0ZWx5LCBqdW1waW5nIHRvIHZlcnkgaGlnaCBsZXZlbHMsIHdoaWxlIGthbmFteWNpbiByZXNpc3RhbmNlIGluY3JlYXNlZCBtb3JlIGdyYWR1YWxseSBhbmQgd2FzIG11Y2ggbW9yZSB2YXJpYWJsZS4gVGhhdCBjb250cmFzdCBpcyBub3Qgc29tZXRoaW5nIGV2ZXJ5b25lIGdldHMsIGFuZCBpdCBwb2ludHMgdG8gcmVhbCBiaW9sb2dpY2FsIGRpZmZlcmVuY2VzIGluIGhvdyB0aGVzZSBkcnVncyBpbnRlcmFjdCB3aXRoIGNlbGxzIGFuZCBob3cgYmFjdGVyaWEgYWRhcHQgdG8gdGhlbS4KCldoYXQgbWFrZXMgeW91ciBwcm9qZWN0IGVzcGVjaWFsbHkgc3Ryb25nIGlzIHRoYXQgYWxsIG9mIHlvdXIgbWVhc3VyZW1lbnRzIHRlbGwgdGhlIHNhbWUgc3RvcnkgZnJvbSBkaWZmZXJlbnQgYW5nbGVzLiBUaGUgTUlDIGRhdGEsIGdyb3d0aCBzY29yZXMsIGRvc2UtcmVzcG9uc2UgY3VydmVzLCBhbmQgZGlzayBkaWZmdXNpb24gYXNzYXlzIGFsbCBsaW5lIHVwIGFuZCByZWluZm9yY2UgZWFjaCBvdGhlciwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHlvdSB3YW50IGluIGEgc29saWQgc2NpZW50aWZpYyBzdHVkeS4gWW91IGFsc28gY2FwdHVyZWQgdGhlIHByb2Nlc3Mgb2YgYWRhcHRhdGlvbiwgbm90IGp1c3QgdGhlIGVuZHBvaW50LCB3aGljaCBpcyBhIG11Y2ggZGVlcGVyIGxldmVsIG9mIGFuYWx5c2lzLiBUaGlzIHB1dHMgeW91IGluIGEgZ3JlYXQgcG9zaXRpb24gdG8gbm90IG9ubHkgZXhwbGFpbiB3aGF0IGhhcHBlbmVkLCBidXQgdG8gc3RhcnQgYXNraW5nIHdoeSBpdCBoYXBwZW5lZC4KCiMgRGF0YSBDbGVhbnNpbmcKCmBgYHtyfQoKbGlicmFyeShkcGx5cikKbWljIDwtIHJlYWQuY3N2KCJNSUNTdW1tYXJ5LmNzdiIsIGNoZWNrLm5hbWVzID0gRkFMU0UpCm9kICA8LSByZWFkLmNzdigiT0RTdW1tYXJ5LmNzdiIsIGNoZWNrLm5hbWVzID0gRkFMU0UpCmRpc2MgPC0gcmVhZC5jc3YoIkRpc2NEaWZmLmNzdiIsIGNoZWNrLm5hbWVzID0gRkFMU0UpCnBhc3MgPC0gcmVhZC5jc3YoIlBhc3NhZ2VzLmNzdiIsIGNoZWNrLm5hbWVzID0gRkFMU0UpCgpuYW1lcyhtaWMpICA8LSB0cmltd3MobmFtZXMobWljKSkKbmFtZXMob2QpICAgPC0gdHJpbXdzKG5hbWVzKG9kKSkKbmFtZXMoZGlzYykgPC0gdHJpbXdzKG5hbWVzKGRpc2MpKQpuYW1lcyhkaXNjKSA8LSBtYWtlLnVuaXF1ZShuYW1lcyhkaXNjKSkKbmFtZXMoZGlzYykKbmFtZXMocGFzcykgPC0gdHJpbXdzKG5hbWVzKHBhc3MpKQoKd2Vla19sZXZlbHMgPC0gYygiVzAiLCJXMSIsIlcyIiwiVzMiLCJXNCIsIlc1IikKCm1pYyRXZWVrIDwtIGZhY3RvcihtaWMkV2VlaywgbGV2ZWxzID0gd2Vla19sZXZlbHMpCm9kJFRpbWVwb2ludCA8LSBmYWN0b3Iob2QkVGltZXBvaW50LCBsZXZlbHMgPSB3ZWVrX2xldmVscykKCiMgcGFzc2FnaW5nCnBhc3MkQW50aWJpb3RpYyA8LSB0cmltd3MocGFzcyRBbnRpYmlvdGljKQpwYXNzJExpbmUgPC0gcGFzdGUocGFzcyRBbnRpYmlvdGljLCBwYXNzJGBDdWx0dXJlIElEYCwgc2VwID0gIl8iKQoKIyBkaXNjIGRpZmZ1c2lvbgpkaXNjJFRpbWVwb2ludCA8LSB0cmltd3MoZGlzYyRUaW1lcG9pbnQpCgojIHVzZSB0aGUgNXRoIGNvbHVtbiwgd2hpY2ggaXMgdGhlIG51bWVyaWMgcmFkaXVzIGNvbHVtbgpkaXNjJFJhZGl1c19tbSA8LSBhcy5udW1lcmljKGRpc2NbWzVdXSkKZGlzYyRab25lX2RpYW1ldGVyX21tIDwtIGRpc2MkUmFkaXVzX21tICogMgoKIyBBZGQgY2Vuc29yZWQgZmxhZyBmb3IgTUlDcyB0aGF0IGhpdCBhc3NheSBjZWlsaW5nCm1heF90ZXN0ZWQgPC0gNTEyCm1pYyRDZW5zb3JlZCA8LSBtaWMkTUlDOTAgPj0gbWF4X3Rlc3RlZAoKbGlicmFyeSh0aWR5dmVyc2UpCgoKb2RfbG9uZyA8LSBvZCAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYyhgT0QgS2FuYCwgYE9EIEFtcGApLAogICAgbmFtZXNfdG8gPSAiQ3VsdHVyZSIsCiAgICB2YWx1ZXNfdG8gPSAiT0QiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBDdWx0dXJlID0gcmVjb2RlKEN1bHR1cmUsCiAgICAgICAgICAgICAgICAgICAgIGBPRCBLYW5gID0gIkthbiIsCiAgICAgICAgICAgICAgICAgICAgIGBPRCBBbXBgID0gIkFtcCIpLAogICAgQ29uY2VudHJhdGlvbiA9IGBDb25jZW50cmF0aW9uICh1Zy9tTClgCiAgKQoKYGBgCgpGaWd1cmUgMSAoTU9TVCBJTVBPUlRBTlQpOiBSZXNpc3RhbmNlIFRyYWplY3RvcmllcwrigJxBbXAgcmVzaXN0YW5jZSBldm9sdmVkIGV4dHJlbWVseSByYXBpZGx5LCBleGNlZWRpbmcgb3VyIG1lYXN1cmVtZW50IHJhbmdlIHdpdGhpbiBvbmUgd2Vla+KAnQoKYGBge3J9CnAxIDwtIGdncGxvdChtaWMsIGFlcyh4ID0gV2VlaywgeSA9IGBsb2cyKE1JQylgLCBjb2xvciA9IGBDdWx0dXJlYCwgZ3JvdXAgPSBgQ3VsdHVyZWApKSArCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IENlbnNvcmVkKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhgRkFMU0VgID0gMTYsIGBUUlVFYCA9IDE3KSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZXNpc3RhbmNlIHRyYWplY3RvcmllcyBvdmVyIHRpbWUiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSBleHByZXNzaW9uKGxvZ1syXSoiKE1JQzkwLCDCtWcvbUwpIiksCiAgICBjb2xvciA9ICJDdWx0dXJlIiwKICAgIHNoYXBlID0gIkF0IGFzc2F5IGNlaWxpbmciCiAgKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNCkKCnAxCgpgYGAKCkZpZ3VyZSAzOiBHcm93dGggVW5kZXIgU2VsZWN0aW9uIAoKYGBge3J9CnAzIDwtIGdncGxvdChwYXNzLCBhZXMoeCA9IFBhc3NhZ2UsIHkgPSBHcm93dGguU2NvcmUsIGNvbG9yID0gQW50aWJpb3RpYywgZ3JvdXAgPSBMaW5lKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuOCwgbGluZXdpZHRoID0gMC45KSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJHcm93dGggc2NvcmVzIGR1cmluZyBzZXJpYWwgcGFzc2FnaW5nIiwKICAgIHggPSAiUGFzc2FnZSIsCiAgICB5ID0gIkdyb3d0aCBzY29yZSIsCiAgICBjb2xvciA9ICJBbnRpYmlvdGljIgogICkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTQpCgpwMwoKYGBgCkZpZ3VyZSA0OiBBbnRpYmlvdGljIENvbmNlbnRyYXRpb24gT3ZlciBUaW1lCgpgYGB7cn0KcDQgPC0gZ2dwbG90KHBhc3MsIGFlcyh4ID0gUGFzc2FnZSwgeSA9IENvbmMuTnVtLCBjb2xvciA9IEFudGliaW90aWMsIGdyb3VwID0gTGluZSkpICsKICBnZW9tX3N0ZXAoYWxwaGEgPSAwLjgsIGxpbmV3aWR0aCA9IDAuOSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV95X2xvZzEwKCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJTZWxlY3Rpb24gcHJlc3N1cmUgZHVyaW5nIHNlcmlhbCBwYXNzYWdpbmciLAogICAgeCA9ICJQYXNzYWdlIiwKICAgIHkgPSBleHByZXNzaW9uKCJDb25jZW50cmF0aW9uICgiKm11KiJnL21MLCBsb2cgc2NhbGUpIiksCiAgICBjb2xvciA9ICJBbnRpYmlvdGljIgogICkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTQpCgpwNAoKYGBgCgoKRmlndXJlIDY6IERpc2sgRGlmZnVzaW9uIApYLWF4aXM6IFN0cmFpbiAoQW5jZXN0b3IgdnMgRXZvbHZlZCkKWS1heGlzOiBab25lIGRpYW1ldGVyIChtbSkKUG9pbnRzID0gaW5kaXZpZHVhbCBkaXNrcwoKYGBge3J9CgpwNiA8LSBnZ3Bsb3QoZGlzYywgYWVzKHggPSBUaW1lcG9pbnQsIHkgPSBab25lX2RpYW1ldGVyX21tLCBmaWxsID0gVGltZXBvaW50KSkgKwogIGdlb21fYm94cGxvdChhbHBoYSA9IDAuNiwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjEsIHNpemUgPSAyLjUpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRGlzayBkaWZmdXNpb24gem9uZXMiLAogICAgeCA9ICJUaW1lcG9pbnQiLAogICAgeSA9ICJab25lIGRpYW1ldGVyIChtbSkiCiAgKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCnA2CmBgYAoKRmlndXJlIDc6IEhlYXRtYXAgb2YgTUlDIGN1cnZlcwpYLWF4aXM6IGNvbmNlbnRyYXRpb24KWS1heGlzOiB0aW1lcG9pbnQKQ29sb3I6IE9ECgpgYGB7cn0KCnA3IDwtIGdncGxvdChvZF9sb25nLCBhZXMoeCA9IFRpbWVwb2ludCwgeSA9IGZhY3RvcihDb25jZW50cmF0aW9uLCBsZXZlbHMgPSBzb3J0KHVuaXF1ZShDb25jZW50cmF0aW9uKSwgZGVjcmVhc2luZyA9IFRSVUUpKSwgZmlsbCA9IE9EKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJ3aGl0ZSIpICsKICBmYWNldF93cmFwKH5DdWx0dXJlKSArCiAgbGFicygKICAgIHRpdGxlID0gIkhlYXRtYXAgb2YgT0QgYWNyb3NzIGNvbmNlbnRyYXRpb24gYW5kIHRpbWUiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSBleHByZXNzaW9uKCJDb25jZW50cmF0aW9uICgiKm11KiJnL21MKSIpLAogICAgZmlsbCA9IGV4cHJlc3Npb24oT0RbNjAwXSkKICApICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE0KQoKcDcKYGBgCgoKRmlndXJlIDg6IE9EIHZzIGNvbmNlbnRyYXRpb24gY3VydmVzIChwZXIgd2VlaykKClBsb3QgZG9zZS1yZXNwb25zZSBjdXJ2ZXM6ClcwIHZzIFc1IHZzIFcxMCBldGMuClZlcnkgc3Ryb25nIGZvciBzaG93aW5nOgpyaWdodHdhcmQgc2hpZnQgPSByZXNpc3RhbmNlCgoKYGBge3J9CgpwOCA8LSBnZ3Bsb3Qob2RfbG9uZywgYWVzKHggPSBDb25jZW50cmF0aW9uLCB5ID0gT0QsIGNvbG9yID0gVGltZXBvaW50LCBncm91cCA9IFRpbWVwb2ludCkpICsKICBnZW9tX2xpbmUobGluZXdpZHRoID0gMSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV94X2xvZzEwKCkgKwogIGZhY2V0X3dyYXAofkN1bHR1cmUpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRG9zZS1yZXNwb25zZSBjdXJ2ZXMgYWNyb3NzIHRpbWUiLAogICAgeCA9IGV4cHJlc3Npb24oIkNvbmNlbnRyYXRpb24gKCIqbXUqImcvbUwsIGxvZyBzY2FsZSkiKSwKICAgIHkgPSBleHByZXNzaW9uKE9EWzYwMF0pLAogICAgY29sb3IgPSAiV2VlayIKICApICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE0KQoKcDgKCmBgYAoKCiMjIEtleSB0YWtlYXdheXMgdG8gY29uc2lkZXI6IAoKMS4gUmVzaXN0YW5jZSBkb2VzIG5vdCBldm9sdmUgaW4gYSBzaW5nbGUgdW5pZm9ybSB3YXkg4oCUIGl0IGRlcGVuZHMgc3Ryb25nbHkgb24gdGhlIGFudGliaW90aWMgYW5kIHVuZGVybHlpbmcgbWVjaGFuaXNtLgoyLiBSZXNpc3RhbmNlIGNhbiBldm9sdmUgZXh0cmVtZWx5IGZhc3QgKEFtcCBMb2cyIGZyb20gNy05IGluIG9uZSB3ZWVrKS4gQW1waWNpbGxpbiByZXNpc3RhbmNlIGNhbiBhcmlzZSB0aHJvdWdoIGxhcmdlLWVmZmVjdCBtdXRhdGlvbnMgdGhhdCByYXBpZGx5IGNvbmZlciBoaWdoLWxldmVsIHJlc2lzdGFuY2UuCjMuUmVzaXN0YW5jZSBjYW4gZXZvbHZlIGdyYWR1YWxseSBhbmQgdW5zdGFibHkuIEthbmFteWNpbiByZXNpc3RhbmNlIGxpa2VseSByZXF1aXJlcyBtdWx0aXBsZSBvciBzbWFsbGVyLWVmZmVjdCBjaGFuZ2VzLCBsZWFkaW5nIHRvIHNsb3dlciBhbmQgbW9yZSB2YXJpYWJsZSBldm9sdXRpb25hcnkgdHJhamVjdG9yaWVzLgo0LiBBZGFwdGF0aW9uIGhhcHBlbnMgYmVmb3JlIGZ1bGwgcmVzaXN0YW5jZS4gQ2VsbHMgc3Vydml2ZSBhbmQgZmx1Y3R1YXRlIGJlZm9yZSBNSUMgaW5jcmVhc2VzLiBQb3B1bGF0aW9ucyBmaXJzdCB1bmRlcmdvIHBoeXNpb2xvZ2ljYWwgYWRhcHRhdGlvbiwgZm9sbG93ZWQgYnkgc3RhYmxlIGdlbmV0aWMgcmVzaXN0YW5jZS4KNS4gUGhlbm90eXBlIG1hdGNoZXMgcXVhbnRpdGF0aXZlIGRhdGEuIFJlc2lzdGFuY2Ugb2JzZXJ2ZWQgaW4gTUlDIGFzc2F5cyB0cmFuc2xhdGVzIGRpcmVjdGx5IGludG8gY2xpbmljYWxseSByZWxldmFudCBwaGVub3R5cGljIHJlc2lzdGFuY2UuIAoKIyMgRGlzY3Vzc2lvbiBQb2ludHMgKHRpZSB0byBhYm92ZSkKCjEuIFRoaXMgc3R1ZHkgZGVtb25zdHJhdGVzIGhvdyBiYWN0ZXJpYWwgcG9wdWxhdGlvbnMgYWRhcHQgdG8gc3ViLWxldGhhbCBhbnRpYmlvdGljIGV4cG9zdXJlLCB3aXRoIGRpc3RpbmN0IGV2b2x1dGlvbmFyeSB0cmFqZWN0b3JpZXMgZGVwZW5kaW5nIG9uIHRoZSBhbnRpYmlvdGljLgoKMi4gVGhlIHJhcGlkIGV2b2x1dGlvbiBvZiBhbXBpY2lsbGluIHJlc2lzdGFuY2Ugc3VnZ2VzdHMgc2VsZWN0aW9uIG9mIGxhcmdlLWVmZmVjdCBtdXRhdGlvbnMgKGUuZy4sIHBvcmluIGxvc3Mgb3IgZWZmbHV4IHJlZ3VsYXRpb24pLCB3aGlsZSB0aGUgZ3JhZHVhbCB0cmFqZWN0b3J5IG9mIGthbmFteWNpbiByZXNpc3RhbmNlIGluZGljYXRlcyBhIG1vcmUgY29tcGxleCBhZGFwdGl2ZSBwYXRod2F5LiBJIHdvdWxkIHJlYWQgaW50byB0aGlzIG1vcmUgYXMgeW91J3JlIHdyaXRpbmcgeW91ciB0aGVzaXMuIAoKMy4gVGhlc2UgcmVzdWx0cyBoaWdobGlnaHQgdGhhdCBhbnRpYmlvdGljIHJlc2lzdGFuY2UgaXMgbm90IGEgdW5pZm9ybSBwcm9jZXNzIGFuZCB0aGF0IGRpZmZlcmVudCBkcnVncyBjYW4gZHJpdmUgZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgZXZvbHV0aW9uYXJ5IGR5bmFtaWNzLCB3aGljaCBoYXMgaW1wbGljYXRpb25zIGZvciB0cmVhdG1lbnQgc3RyYXRlZ2llcyBhbmQgcmVzaXN0YW5jZSBtYW5hZ2VtZW50LgoKCkZvciB5b3VyIGNvbmNsdXNpb24sIGNvbnNpZGVyIGEgZmlndXJlIHRoYXQgZGVwaWN0cyBhIGZ1dHVyZSBkaXJlY3Rpb24uIApFdmVuIGp1c3QgYSBkaWFncmFtIHdpdGggdGV4dCBleHBsYW5hdGlvbjoKCkFtcCDihpIgZWZmbHV4IC8gcG9yaW4gbXV0YXRpb24KS2FuIOKGkiBtdWx0aS1zdGVwIGFkYXB0YXRpb24=