A few months ago, I was walking around Mountain View while chatting with Zapier’s Co-founder Bryan. I wondered, “what’s Y Combinator’s conversion rate?” He didn’t know but suggested yclist.com as a place I might find data useful to answer the question.

Sys.setenv(TZ='GMT')
library(rvest) # for web scraping
library(dplyr) # for manipulating data
library(readr) # for reading data from a csv that I'll use as a data entry tool
library(survival) # R's basic survival anaylsis toolkit
library(ggplot2) # R plotting library
library(purrr) # functional programming library
library(ggthemes) # library with themes for ggplot2
site <- read_html("http://yclist.com/")
extract <- function(data, xpath) {
  data %>%
    html_nodes(xpath = xpath) %>%
    html_text()
}
companies <- tibble::tibble(
  company = site %>% extract(
    "//td[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]"),
  batch = site %>% extract(
    "//td[(((count(preceding-sibling::*) + 1) = 4) and parent::*)]") %>%
    gsub("\n", "", .) %>%
    gsub(" ", "", .),
  status = site %>% extract(
    "//td[(((count(preceding-sibling::*) + 1) = 5) and parent::*)]")
)
start_date <- function(batch) {
  if(!grepl("W", batch) & !grepl("S", batch)) return(NA)
  month <- ifelse(grepl("W", batch), "01", "06")
  year <- batch %>% gsub("W", "", .) %>%
    gsub("S", "", .) %>%
    paste0("20", .)
  paste0(year, "-", month, "-01") %>%
    as.POSIXct(origin = "1970-01-01", tz = "UTC")
}
# I read out the data as a .csv, added my own column and hand-by-hand used Crunchbase and Google to find exit dates. Please let me know if you see any that are wrong!
# companies %>%
#   mutate(start = as.POSIXct(Vectorize(start_date)(batch), origin = "1970-01-01")) %>%
#   filter(status == "Exited") %>%
#   select(company) %>%
#   write.csv("exits.csv", row.names = FALSE)
outcomes <- companies %>%
  mutate(start = as.POSIXct(Vectorize(start_date)(batch), origin = "1970-01-01")) %>%
  filter(!grepl("F", batch)) %>%
  left_join(
    read.csv("~/yc/exits.csv", stringsAsFactors = FALSE) %>% tbl_df(),
    by = "company"
  ) %>%
  mutate(time = ifelse(
    is.na(exit), difftime(Sys.time(), start, units = "days"),
    difftime(exit, start, units = "days")),
    censor = ifelse(!is.na(exit) | status == "Exited", 1, 0)
  )
outcomes %>%
  survfit(Surv(time, censor) ~ 1, data = .) %>%
  plot(fun = "event", xscale=365.25,
       main = "Y Combinator 'exit' conversion rate",
       xlab = "Years since starting batch",
       yscale = 100,
       ylab = "Conversion rate (%)")
abline(v = 5*365.25, col = 'red')

One in twenty YC startups exited within two years of starting the batch. That grows to one in ten by year five.

outcomes %>%
  survfit(Surv(time, censor) ~ 1, data = .) %>%
  summary(times = seq_len(12)*365.25) %>%
  { tibble::tibble(time = .$time, conv_rate = 1 - .$surv) } %>%
  mutate(`Marginal Conv` = conv_rate - lag(conv_rate)) %>%
  mutate(conv_rate = scales::percent(conv_rate),
         `Marginal Conv` = ifelse(is.na(`Marginal Conv`), NA, scales::percent(`Marginal Conv`))) %>%
  mutate(time = time / 365.25) %>%
  rename(`Years` = time, `Conv. Rate` = conv_rate)

I thought it’d be interesting to compare batches by two-year conversion rate,

outcomes %>%
  survfit(Surv(time, censor) ~ batch, data = .) %>%
  summary(times = 365.25*2) %>%
  { tibble::tibble(batch = as.character(.$strata),
                   lower = 1 - .$upper,
                   conv_rate = 1 - .$surv,
                   upper = 1 - .$lower) } %>%
  mutate(batch = gsub("batch=", "", batch)) %>%
  arrange(desc(conv_rate)) %>%
  mutate(batch = factor(batch, levels = batch)) %>%
  ggplot(aes(x = batch)) +
  geom_bar(stat = "identity",
           aes(y = conv_rate),
           alpha = 0.95) +
  geom_errorbar(aes(ymin = lower, ymax = upper), colour = 'red') +
  theme_bw(base_size = 16) +
  scale_y_continuous(labels = scales::percent) +
  theme(panel.grid.major = element_line(size = 0.25, linetype = "dashed", colour = "black"),
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "black"),
        axis.text.x = element_text(size = 8)) +
  xlab("Batch") +
  ylab("Conversion Rate") +
  ggtitle("Y Combinator conversion rates by batch")

At a cursory glance, it appears earlier batches had a higher conversion rates. This is confirmed by including one through four years post-batch.

outcomes %>%
  mutate(vintage = format(start, "%Y")) %>%
  survfit(Surv(time, censor) ~ vintage, data = .) %>%
  summary(times = seq_len(4)*365.25) %>%
  { tibble::tibble(year = .$time / 365.25,
                   vintage = as.character(.$strata),
                   lower = 1 - .$upper,
                   conv_rate = 1 - .$surv,
                   upper = 1 - .$lower) } %>%
  mutate(vintage = gsub("vintage=", "", vintage)) %>%
  arrange(desc(conv_rate)) %>%
  ggplot(aes(x = vintage, fill = factor(year))) +
  geom_bar(stat = "identity",
           position = "dodge",
           aes(y = conv_rate),
           alpha = 0.95) +
  theme_bw(base_size = 16) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_colorblind(name = "Years since batch") +
  theme(panel.grid.major = element_line(size = 0.25, linetype = "dashed", colour = "black"),
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "black"),
        axis.text.x = element_text(size = 8),
        legend.position = "top") +
  xlab("Vintage") +
  ylab("Conversion Rate") +
  ggtitle("Y Combinator conversion rates by vintage")

Two, three and four-year conversion rates have steadily declined from ~ 37-38% in 2005 to below the 5% for the 2012 through 2014 vintages.

So what’s Y Combinator’s conversion rate? About 15% after a decade entering the batch is a pretty good answer.

If you’d like to add to this analysis, I’ve uploaded the code and exit date data that I compiled here.

LS0tCnRpdGxlOiAiV2hhdCdzIFkgQ29tYmluYXRvcidzIGNvbnZlcnNpb24gcmF0ZT8iCmF1dGhvcjogIlN0YXR3b25rIgpkYXRlOiAiSnVuZSAxNywgMjAxNyIKb3V0cHV0OiBodG1sX2RvY3VtZW50Ci0tLQoKQSBmZXcgbW9udGhzIGFnbywgSSB3YXMgd2Fsa2luZyBhcm91bmQgTW91bnRhaW4gVmlldyB3aGlsZSBjaGF0dGluZyB3aXRoIFtaYXBpZXJdKGh0dHBzOi8vemFwaWVyLmNvbSkncyBDby1mb3VuZGVyIEJyeWFuLiBJIHdvbmRlcmVkLCAid2hhdCdzIFkgQ29tYmluYXRvcidzIGNvbnZlcnNpb24gcmF0ZT8iIEhlIGRpZG4ndCBrbm93IGJ1dCBzdWdnZXN0ZWQgW3ljbGlzdC5jb21dKGh0dHA6Ly95Y2xpc3QuY29tLykgYXMgYSBwbGFjZSBJIG1pZ2h0IGZpbmQgZGF0YSB1c2VmdWwgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbi4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpTeXMuc2V0ZW52KFRaPSdHTVQnKQpsaWJyYXJ5KHJ2ZXN0KSAjIGZvciB3ZWIgc2NyYXBpbmcKbGlicmFyeShkcGx5cikgIyBmb3IgbWFuaXB1bGF0aW5nIGRhdGEKbGlicmFyeShyZWFkcikgIyBmb3IgcmVhZGluZyBkYXRhIGZyb20gYSBjc3YgdGhhdCBJJ2xsIHVzZSBhcyBhIGRhdGEgZW50cnkgdG9vbApsaWJyYXJ5KHN1cnZpdmFsKSAjIFIncyBiYXNpYyBzdXJ2aXZhbCBhbmF5bHNpcyB0b29sa2l0CmxpYnJhcnkoZ2dwbG90MikgIyBSIHBsb3R0aW5nIGxpYnJhcnkKbGlicmFyeShwdXJycikgIyBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGxpYnJhcnkKbGlicmFyeShnZ3RoZW1lcykgIyBsaWJyYXJ5IHdpdGggdGhlbWVzIGZvciBnZ3Bsb3QyCmBgYAoKYGBge3J9CnNpdGUgPC0gcmVhZF9odG1sKCJodHRwOi8veWNsaXN0LmNvbS8iKQoKZXh0cmFjdCA8LSBmdW5jdGlvbihkYXRhLCB4cGF0aCkgewogIGRhdGEgJT4lCiAgICBodG1sX25vZGVzKHhwYXRoID0geHBhdGgpICU+JQogICAgaHRtbF90ZXh0KCkKfQpjb21wYW5pZXMgPC0gdGliYmxlOjp0aWJibGUoCiAgY29tcGFueSA9IHNpdGUgJT4lIGV4dHJhY3QoCiAgICAiLy90ZFsoKChjb3VudChwcmVjZWRpbmctc2libGluZzo6KikgKyAxKSA9IDIpIGFuZCBwYXJlbnQ6OiopXSIpLAogIGJhdGNoID0gc2l0ZSAlPiUgZXh0cmFjdCgKICAgICIvL3RkWygoKGNvdW50KHByZWNlZGluZy1zaWJsaW5nOjoqKSArIDEpID0gNCkgYW5kIHBhcmVudDo6KildIikgJT4lCiAgICBnc3ViKCJcbiIsICIiLCAuKSAlPiUKICAgIGdzdWIoIiAiLCAiIiwgLiksCiAgc3RhdHVzID0gc2l0ZSAlPiUgZXh0cmFjdCgKICAgICIvL3RkWygoKGNvdW50KHByZWNlZGluZy1zaWJsaW5nOjoqKSArIDEpID0gNSkgYW5kIHBhcmVudDo6KildIikKKQoKc3RhcnRfZGF0ZSA8LSBmdW5jdGlvbihiYXRjaCkgewogIGlmKCFncmVwbCgiVyIsIGJhdGNoKSAmICFncmVwbCgiUyIsIGJhdGNoKSkgcmV0dXJuKE5BKQogIG1vbnRoIDwtIGlmZWxzZShncmVwbCgiVyIsIGJhdGNoKSwgIjAxIiwgIjA2IikKICB5ZWFyIDwtIGJhdGNoICU+JSBnc3ViKCJXIiwgIiIsIC4pICU+JQogICAgZ3N1YigiUyIsICIiLCAuKSAlPiUKICAgIHBhc3RlMCgiMjAiLCAuKQogIHBhc3RlMCh5ZWFyLCAiLSIsIG1vbnRoLCAiLTAxIikgJT4lCiAgICBhcy5QT1NJWGN0KG9yaWdpbiA9ICIxOTcwLTAxLTAxIiwgdHogPSAiVVRDIikKfQoKIyBJIHJlYWQgb3V0IHRoZSBkYXRhIGFzIGEgLmNzdiwgYWRkZWQgbXkgb3duIGNvbHVtbiBhbmQgaGFuZC1ieS1oYW5kIHVzZWQgQ3J1bmNoYmFzZSBhbmQgR29vZ2xlIHRvIGZpbmQgZXhpdCBkYXRlcy4gUGxlYXNlIGxldCBtZSBrbm93IGlmIHlvdSBzZWUgYW55IHRoYXQgYXJlIHdyb25nIQoKIyBjb21wYW5pZXMgJT4lCiMgICBtdXRhdGUoc3RhcnQgPSBhcy5QT1NJWGN0KFZlY3Rvcml6ZShzdGFydF9kYXRlKShiYXRjaCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIikpICU+JQojICAgZmlsdGVyKHN0YXR1cyA9PSAiRXhpdGVkIikgJT4lCiMgICBzZWxlY3QoY29tcGFueSkgJT4lCiMgICB3cml0ZS5jc3YoImV4aXRzLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQoKb3V0Y29tZXMgPC0gY29tcGFuaWVzICU+JQogIG11dGF0ZShzdGFydCA9IGFzLlBPU0lYY3QoVmVjdG9yaXplKHN0YXJ0X2RhdGUpKGJhdGNoKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSkgJT4lCiAgZmlsdGVyKCFncmVwbCgiRiIsIGJhdGNoKSkgJT4lCiAgbGVmdF9qb2luKAogICAgcmVhZC5jc3YoIn4veWMvZXhpdHMuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSAlPiUgdGJsX2RmKCksCiAgICBieSA9ICJjb21wYW55IgogICkgJT4lCiAgbXV0YXRlKHRpbWUgPSBpZmVsc2UoCiAgICBpcy5uYShleGl0KSwgZGlmZnRpbWUoU3lzLnRpbWUoKSwgc3RhcnQsIHVuaXRzID0gImRheXMiKSwKICAgIGRpZmZ0aW1lKGV4aXQsIHN0YXJ0LCB1bml0cyA9ICJkYXlzIikpLAogICAgY2Vuc29yID0gaWZlbHNlKCFpcy5uYShleGl0KSB8IHN0YXR1cyA9PSAiRXhpdGVkIiwgMSwgMCkKICApCmBgYAoKYGBge3IsIGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoPScxMDAlJ30Kb3V0Y29tZXMgJT4lCiAgc3VydmZpdChTdXJ2KHRpbWUsIGNlbnNvcikgfiAxLCBkYXRhID0gLikgJT4lCiAgcGxvdChmdW4gPSAiZXZlbnQiLCB4c2NhbGU9MzY1LjI1LAogICAgICAgbWFpbiA9ICJZIENvbWJpbmF0b3IgJ2V4aXQnIGNvbnZlcnNpb24gcmF0ZSIsCiAgICAgICB4bGFiID0gIlllYXJzIHNpbmNlIHN0YXJ0aW5nIGJhdGNoIiwKICAgICAgIHlzY2FsZSA9IDEwMCwKICAgICAgIHlsYWIgPSAiQ29udmVyc2lvbiByYXRlICglKSIpCmFibGluZSh2ID0gNSozNjUuMjUsIGNvbCA9ICdyZWQnKQpgYGAKCk9uZSBpbiB0d2VudHkgWUMgc3RhcnR1cHMgZXhpdGVkIHdpdGhpbiB0d28geWVhcnMgb2Ygc3RhcnRpbmcgdGhlIGJhdGNoLiBUaGF0IGdyb3dzIHRvIG9uZSBpbiB0ZW4gYnkgeWVhciBmaXZlLgoKYGBge3J9Cm91dGNvbWVzICU+JQogIHN1cnZmaXQoU3Vydih0aW1lLCBjZW5zb3IpIH4gMSwgZGF0YSA9IC4pICU+JQogIHN1bW1hcnkodGltZXMgPSBzZXFfbGVuKDEyKSozNjUuMjUpICU+JQogIHsgdGliYmxlOjp0aWJibGUodGltZSA9IC4kdGltZSwgY29udl9yYXRlID0gMSAtIC4kc3VydikgfSAlPiUKICBtdXRhdGUoYE1hcmdpbmFsIENvbnZgID0gY29udl9yYXRlIC0gbGFnKGNvbnZfcmF0ZSkpICU+JQogIG11dGF0ZShjb252X3JhdGUgPSBzY2FsZXM6OnBlcmNlbnQoY29udl9yYXRlKSwKICAgICAgICAgYE1hcmdpbmFsIENvbnZgID0gaWZlbHNlKGlzLm5hKGBNYXJnaW5hbCBDb252YCksIE5BLCBzY2FsZXM6OnBlcmNlbnQoYE1hcmdpbmFsIENvbnZgKSkpICU+JQogIG11dGF0ZSh0aW1lID0gdGltZSAvIDM2NS4yNSkgJT4lCiAgcmVuYW1lKGBZZWFyc2AgPSB0aW1lLCBgQ29udi4gUmF0ZWAgPSBjb252X3JhdGUpCmBgYAoKSSB0aG91Z2h0IGl0J2QgYmUgaW50ZXJlc3RpbmcgdG8gY29tcGFyZSBiYXRjaGVzIGJ5IHR3by15ZWFyIGNvbnZlcnNpb24gcmF0ZSwKCmBgYHtyfQpvdXRjb21lcyAlPiUKICBzdXJ2Zml0KFN1cnYodGltZSwgY2Vuc29yKSB+IGJhdGNoLCBkYXRhID0gLikgJT4lCiAgc3VtbWFyeSh0aW1lcyA9IDM2NS4yNSoyKSAlPiUKICB7IHRpYmJsZTo6dGliYmxlKGJhdGNoID0gYXMuY2hhcmFjdGVyKC4kc3RyYXRhKSwKICAgICAgICAgICAgICAgICAgIGxvd2VyID0gMSAtIC4kdXBwZXIsCiAgICAgICAgICAgICAgICAgICBjb252X3JhdGUgPSAxIC0gLiRzdXJ2LAogICAgICAgICAgICAgICAgICAgdXBwZXIgPSAxIC0gLiRsb3dlcikgfSAlPiUKICBtdXRhdGUoYmF0Y2ggPSBnc3ViKCJiYXRjaD0iLCAiIiwgYmF0Y2gpKSAlPiUKICBhcnJhbmdlKGRlc2MoY29udl9yYXRlKSkgJT4lCiAgbXV0YXRlKGJhdGNoID0gZmFjdG9yKGJhdGNoLCBsZXZlbHMgPSBiYXRjaCkpICU+JQogIGdncGxvdChhZXMoeCA9IGJhdGNoKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLAogICAgICAgICAgIGFlcyh5ID0gY29udl9yYXRlKSwKICAgICAgICAgICBhbHBoYSA9IDAuOTUpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIGNvbG91ciA9ICdyZWQnKSArCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShzaXplID0gMC4yNSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShzaXplID0gMC4yNSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKSArCiAgeGxhYigiQmF0Y2giKSArCiAgeWxhYigiQ29udmVyc2lvbiBSYXRlIikgKwogIGdndGl0bGUoIlkgQ29tYmluYXRvciBjb252ZXJzaW9uIHJhdGVzIGJ5IGJhdGNoIikKYGBgCgpBdCBhIGN1cnNvcnkgZ2xhbmNlLCBpdCBhcHBlYXJzIGVhcmxpZXIgYmF0Y2hlcyBoYWQgYSBoaWdoZXIgY29udmVyc2lvbiByYXRlcy4gVGhpcyBpcyBjb25maXJtZWQgYnkgaW5jbHVkaW5nIG9uZSB0aHJvdWdoIGZvdXIgeWVhcnMgcG9zdC1iYXRjaC4gCgoKYGBge3J9Cm91dGNvbWVzICU+JQogIG11dGF0ZSh2aW50YWdlID0gZm9ybWF0KHN0YXJ0LCAiJVkiKSkgJT4lCiAgc3VydmZpdChTdXJ2KHRpbWUsIGNlbnNvcikgfiB2aW50YWdlLCBkYXRhID0gLikgJT4lCiAgc3VtbWFyeSh0aW1lcyA9IHNlcV9sZW4oNCkqMzY1LjI1KSAlPiUKICB7IHRpYmJsZTo6dGliYmxlKHllYXIgPSAuJHRpbWUgLyAzNjUuMjUsCiAgICAgICAgICAgICAgICAgICB2aW50YWdlID0gYXMuY2hhcmFjdGVyKC4kc3RyYXRhKSwKICAgICAgICAgICAgICAgICAgIGxvd2VyID0gMSAtIC4kdXBwZXIsCiAgICAgICAgICAgICAgICAgICBjb252X3JhdGUgPSAxIC0gLiRzdXJ2LAogICAgICAgICAgICAgICAgICAgdXBwZXIgPSAxIC0gLiRsb3dlcikgfSAlPiUKICBtdXRhdGUodmludGFnZSA9IGdzdWIoInZpbnRhZ2U9IiwgIiIsIHZpbnRhZ2UpKSAlPiUKICBhcnJhbmdlKGRlc2MoY29udl9yYXRlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmludGFnZSwgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwKICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsCiAgICAgICAgICAgYWVzKHkgPSBjb252X3JhdGUpLAogICAgICAgICAgIGFscGhhID0gMC45NSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2ZpbGxfY29sb3JibGluZChuYW1lID0gIlllYXJzIHNpbmNlIGJhdGNoIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIHhsYWIoIlZpbnRhZ2UiKSArCiAgeWxhYigiQ29udmVyc2lvbiBSYXRlIikgKwogIGdndGl0bGUoIlkgQ29tYmluYXRvciBjb252ZXJzaW9uIHJhdGVzIGJ5IHZpbnRhZ2UiKQpgYGAKClR3bywgdGhyZWUgYW5kIGZvdXIteWVhciBjb252ZXJzaW9uIHJhdGVzIGhhdmUgc3RlYWRpbHkgZGVjbGluZWQgZnJvbSB+IDM3LTM4JSBpbiAyMDA1IHRvIGJlbG93IHRoZSA1JSBmb3IgdGhlIDIwMTIgdGhyb3VnaCAyMDE0IHZpbnRhZ2VzLgoKU28gd2hhdCdzIFkgQ29tYmluYXRvcidzIGNvbnZlcnNpb24gcmF0ZT8gQWJvdXQgMTUlIGFmdGVyIGEgZGVjYWRlIGVudGVyaW5nIHRoZSBiYXRjaCBpcyBhIHByZXR0eSBnb29kIGFuc3dlci4KCklmIHlvdSdkIGxpa2UgdG8gYWRkIHRvIHRoaXMgYW5hbHlzaXMsIEkndmUgdXBsb2FkZWQgdGhlIGNvZGUgYW5kIGV4aXQgZGF0ZSBkYXRhIHRoYXQgSSBjb21waWxlZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL3N0YXR3b25rL3ljKS4=