This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

if (!require(dplyr)) {
  install.packages("dplyr")
}
Loading required package: dplyr

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
if (!require(ggplot)) {
  install.packages("ggplot2")
}
Loading required package: ggplot
Warning: there is no package called ‘ggplot’WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/nickc/AppData/Local/R/win-library/4.4’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/ggplot2_3.5.1.zip'
Content type 'application/zip' length 5022358 bytes (4.8 MB)
downloaded 4.8 MB
package ‘ggplot2’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\nickc\AppData\Local\Temp\Rtmp8MDxkM\downloaded_packages
hiVotes <- read.csv("./data/hiVotes.csv")
companyMetadata <- read.csv("./data/companyMetadata.csv")
employees <- read.csv("./data/employees.csv")
scoreMetadata <- read.csv("./data/scoreMetadata.csv")
scoreVotes <- read.csv("./data/scoreVotes.csv")
print(mean(hiVotes$hiVote, na.rm = TRUE))
[1] 2.915459
print(sd(hiVotes$hiVote, na.rm=TRUE))
[1] 0.9799774
print(mean(scoreVotes$scoreVote, na.rm = TRUE))
[1] 6.229596
print(sd(scoreVotes$scoreVote, na.rm=TRUE))
[1] 2.747134
head(scoreVotes)
head(scoreMetadata)
wellbeing_questions <- subset(scoreMetadata, grepl("Wellbeing", name, ignore.case = TRUE))

library(dplyr)
merged_wellbeing_data <- inner_join(scoreVotes, wellbeing_questions, by = "questionId")

print(mean(merged_wellbeing_data$scoreVote, na.rm = TRUE))
[1] 6.301063
print(sd(merged_wellbeing_data$scoreVote, na.rm = TRUE))
[1] 2.6897
scoreMetadata
work_related_stress_question <- subset(scoreMetadata, grepl("5dd6e4a49a5137000450ff1d", questionId, ignore.case = FALSE))

head(work_related_stress_question)
merged_stress_data <- inner_join(scoreVotes, work_related_stress_question, by = "questionId")

print(mean(merged_stress_data$scoreVote, na.rm = TRUE))
[1] 7.560678
print(sd(merged_stress_data$scoreVote, na.rm = TRUE))
[1] 1.959066
library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.4.2
top10_industries <- companyMetadata %>%
  group_by(industry) %>%
  summarise(count = n()) %>%
  arrange(desc(count)) %>%
  slice_max(order_by = count, n = 10)

ggplot(data = top10_industries, aes(x = reorder(industry, count), y = count)) +
  geom_bar(stat = "identity", fill = "lightblue") +
  coord_flip() +
  labs(
    title = "Top 10 Industries by Number of Companies",
    x = "Industry",
    y = "Number of Companies"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10)
  )

merged_score_data <- inner_join(scoreVotes, scoreMetadata, by = "scoreId")
Warning: Detected an unexpected many-to-many relationship between `x` and `y`.
ggplot(data = merged_score_data, aes(x = name, y = scoreVote)) +
  geom_boxplot(fill = "lightblue", color = "black", outlier.color = "red") +
  labs(
    title = "Distribution of Score Votes by Score Category",
    x = "Score Categories (Name)",
    y = "Score Votes"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
    axis.title = element_text(size = 12)
  )

wellbeing_metadata <- scoreMetadata %>%
  filter(name == "Wellbeing")

wellbeing_votes <- scoreVotes %>%
  inner_join(wellbeing_metadata, by = "scoreId")
Warning: Detected an unexpected many-to-many relationship between `x` and `y`.
wellbeing_with_company <- wellbeing_votes %>%
  inner_join(companyMetadata, by = "companyId")

average_scores <- wellbeing_with_company %>%
  group_by(companyId) %>%
  summarise(avg_wellbeing_score = mean(scoreVote, na.rm = TRUE)) %>%
  arrange(desc(avg_wellbeing_score))

top_company <- average_scores %>%
  slice_max(order_by = avg_wellbeing_score, n = 1)

top_company_details <- top_company %>%
  inner_join(companyMetadata, by = "companyId")

print(top_company_details)
target_companies <- companyMetadata %>%
  filter(industry %in% c("ARTS_ENTERTAINMENT_RECREATION", "FINANCIAL_SERVICES_INSURANCE"))

industry_votes <- scoreVotes %>%
  inner_join(target_companies, by = "companyId") %>%
  select(industry, scoreVote)

arts_recreation <- industry_votes %>%
  filter(industry == "ARTS_ENTERTAINMENT_RECREATION") %>%
  pull(scoreVote)

financial_services <- industry_votes %>%
  filter(industry == "FINANCIAL_SERVICES_INSURANCE") %>%
  pull(scoreVote)

mean_arts <- mean(arts_recreation, na.rm = TRUE)
mean_financial <- mean(financial_services, na.rm = TRUE)

t_test_result <- t.test(arts_recreation, financial_services, var.equal = TRUE)

list(
  Mean_Arts_Entertainment_Recreation = mean_arts,
  Mean_Financial_Services_Insurance = mean_financial,
  P_Value = t_test_result$p.value,
  T_Test_Result = t_test_result
)
$Mean_Arts_Entertainment_Recreation
[1] 6.662791

$Mean_Financial_Services_Insurance
[1] 6.606734

$P_Value
[1] 0.8539026

$T_Test_Result

    Two Sample t-test

data:  arts_recreation and financial_services
t = 0.18414, df = 98839, p-value = 0.8539
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.5406072  0.6527210
sample estimates:
mean of x mean of y 
 6.662791  6.606734 
merged_happiness_data <- scoreVotes %>%
  inner_join(companyMetadata, by = "companyId") %>%
  select(companyId, companyName = industry, hiVote = scoreVote)

happiest_companies <- merged_happiness_data %>%
  group_by(companyId, companyName) %>%
  summarise(
    avg_happiness = mean(hiVote, na.rm = TRUE),
    sd_happiness = sd(hiVote, na.rm = TRUE),
    count = n()
  ) %>%
  arrange(desc(avg_happiness))
`summarise()` has grouped output by 'companyId'. You can override using the `.groups` argument.
print(happiest_companies)
happiest_companies_composite <- merged_happiness_data %>%
  group_by(companyId, companyName) %>%
  summarise(
    avg_happiness = mean(hiVote, na.rm = TRUE),
    sd_happiness = sd(hiVote, na.rm = TRUE),
    count = n(),
    .groups = "drop"
  ) %>%
  mutate(
    composite_score = avg_happiness - sd_happiness + log(count)
  ) %>%
  arrange(desc(composite_score))

top_composite_company <- happiest_companies_composite %>%
  slice_max(order_by = composite_score, n = 1)

head(happiest_companies_composite)
merged_industry_data <- inner_join(hiVotes, companyMetadata, by = "companyId") %>%
  select(hiVote, industry)

anova_result <- aov(hiVote ~ industry, data = merged_industry_data)

anova_summary <- summary(anova_result)

anova_p_value <- anova_summary[[1]]$`Pr(>F)`[1]
print(paste("P-value for ANOVA:", anova_p_value))
[1] "P-value for ANOVA: 0"
num_industries <- length(unique(merged_industry_data$industry))

print((num_industries * (num_industries - 1)) / 2)
[1] 120
str(companyMetadata)
'data.frame':   147 obs. of  3 variables:
 $ companyId: chr  "57908a2622881200033b34d7" "57c4aa7dbb8b5c000396fd3b" "56fd2b64f41c670003f643c8" "57ac8b23be7fe30003e656d0" ...
 $ industry : chr  "COMPUTER_SOFTWARE_IT_SERVICES" "HEALTH_CARE_SOCIAL_ASSISTANCE" "MANUFACTURING" "COMPUTER_SOFTWARE_IT_SERVICES" ...
 $ timezone : chr  "Europe/Madrid" "America/Guayaquil" "Europe/Madrid" "Europe/Madrid" ...
merged_timezone_data <- scoreVotes %>%
  inner_join(companyMetadata, by = "companyId") %>%
  select(scoreVote, timezone)

lm_result <- lm(scoreVote ~ timezone, data = merged_timezone_data)

summary_lm <- summary(lm_result)

print(summary_lm)

Call:
lm(formula = scoreVote ~ timezone, data = merged_timezone_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.9658 -2.5307  0.4693  2.4693  4.8389 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)                  6.27448    0.06591  95.195  < 2e-16 ***
timezoneAmerica/Bogota      -0.01668    0.08257  -0.202 0.839922    
timezoneAmerica/Guatemala    0.67738    0.06958   9.736  < 2e-16 ***
timezoneAmerica/Guayaquil    0.69128    0.06793  10.176  < 2e-16 ***
timezoneAmerica/Mexico_City  0.25625    0.06692   3.829 0.000129 ***
timezoneAmerica/Santiago     0.43746    0.08244   5.307 1.12e-07 ***
timezoneAmerica/Sao_Paulo    0.13692    0.06846   2.000 0.045495 *  
timezoneEurope/Berlin       -0.13062    0.06774  -1.928 0.053813 .  
timezoneEurope/London       -1.11338    0.07171 -15.525  < 2e-16 ***
timezoneEurope/Luxembourg    0.20144    0.10736   1.876 0.060616 .  
timezoneEurope/Madrid       -0.17735    0.06609  -2.683 0.007292 ** 
timezoneGMT                 -0.06100    0.06896  -0.885 0.376408    
timezonePacific/Galapagos    0.12552    0.55004   0.228 0.819482    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.73 on 495911 degrees of freedom
Multiple R-squared:  0.0122,    Adjusted R-squared:  0.01217 
F-statistic: 510.3 on 12 and 495911 DF,  p-value: < 2.2e-16
coeff_table <- as.data.frame(summary_lm$coefficients)

# Add row names (time zones) to the coefficients table
coeff_table$TimeZone <- rownames(coeff_table)

# Exclude the Intercept
coeff_table <- coeff_table[coeff_table$TimeZone != "(Intercept)", ]

# Identify the strongest effect (largest absolute coefficient)
strongest_effect <- coeff_table[which.max(abs(coeff_table$Estimate)), ]

# Identify the most significant effect (smallest p-value)
most_significant_effect <- coeff_table[which.min(coeff_table$`Pr(>|t|)`), ]

# Print results
print("Time zone with the strongest effect:")
[1] "Time zone with the strongest effect:"
print(strongest_effect)

print("Time zone with the most significant effect:")
[1] "Time zone with the most significant effect:"
print(most_significant_effect)
merged_department_data <- hiVotes %>%
  inner_join(companyMetadata, by = "companyId") %>%
  select(departmentId, hiVote)

dept_avg <- merged_department_data %>%
  group_by(departmentId) %>%
  summarise(avg_hiVote = mean(hiVote, na.rm = TRUE)) %>%
  arrange(desc(avg_hiVote))

overall_avg <- mean(merged_department_data$hiVote, na.rm = TRUE)

top_department <- dept_avg[1, ]

print(paste("Top department:", top_department$departmentId))
[1] "Top department: 595d0ee77b727a0004a19ad0"
print(paste("Average hiVote for top department:", round(top_department$avg_hiVote, 2)))
[1] "Average hiVote for top department: 4"
print(paste("Overall company average hiVote:", round(overall_avg, 2)))
[1] "Overall company average hiVote: 2.92"
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCmBgYHtyfQ0KaWYgKCFyZXF1aXJlKGRwbHlyKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQp9DQoNCmlmICghcmVxdWlyZShnZ3Bsb3QpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KfQ0KDQpgYGANCmBgYHtyfQ0KaGlWb3RlcyA8LSByZWFkLmNzdigiLi9kYXRhL2hpVm90ZXMuY3N2IikNCmNvbXBhbnlNZXRhZGF0YSA8LSByZWFkLmNzdigiLi9kYXRhL2NvbXBhbnlNZXRhZGF0YS5jc3YiKQ0KZW1wbG95ZWVzIDwtIHJlYWQuY3N2KCIuL2RhdGEvZW1wbG95ZWVzLmNzdiIpDQpzY29yZU1ldGFkYXRhIDwtIHJlYWQuY3N2KCIuL2RhdGEvc2NvcmVNZXRhZGF0YS5jc3YiKQ0Kc2NvcmVWb3RlcyA8LSByZWFkLmNzdigiLi9kYXRhL3Njb3JlVm90ZXMuY3N2IikNCg0KYGBgDQoNCg0KYGBge3J9DQpwcmludChtZWFuKGhpVm90ZXMkaGlWb3RlLCBuYS5ybSA9IFRSVUUpKQ0KYGBgDQoNCg0KYGBge3J9DQpwcmludChzZChoaVZvdGVzJGhpVm90ZSwgbmEucm09VFJVRSkpDQpgYGANCmBgYHtyfQ0KcHJpbnQobWVhbihzY29yZVZvdGVzJHNjb3JlVm90ZSwgbmEucm0gPSBUUlVFKSkNCmBgYA0KYGBge3J9DQpwcmludChzZChzY29yZVZvdGVzJHNjb3JlVm90ZSwgbmEucm09VFJVRSkpDQoNCmBgYA0KYGBge3J9DQpoZWFkKHNjb3JlVm90ZXMpDQpgYGANCmBgYHtyfQ0KaGVhZChzY29yZU1ldGFkYXRhKQ0KYGBgDQpgYGB7cn0NCndlbGxiZWluZ19xdWVzdGlvbnMgPC0gc3Vic2V0KHNjb3JlTWV0YWRhdGEsIGdyZXBsKCJXZWxsYmVpbmciLCBuYW1lLCBpZ25vcmUuY2FzZSA9IFRSVUUpKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbWVyZ2VkX3dlbGxiZWluZ19kYXRhIDwtIGlubmVyX2pvaW4oc2NvcmVWb3Rlcywgd2VsbGJlaW5nX3F1ZXN0aW9ucywgYnkgPSAicXVlc3Rpb25JZCIpDQoNCnByaW50KG1lYW4obWVyZ2VkX3dlbGxiZWluZ19kYXRhJHNjb3JlVm90ZSwgbmEucm0gPSBUUlVFKSkNCg0KYGBgDQpgYGB7cn0NCnByaW50KHNkKG1lcmdlZF93ZWxsYmVpbmdfZGF0YSRzY29yZVZvdGUsIG5hLnJtID0gVFJVRSkpDQoNCmBgYA0KYGBge3J9DQpzY29yZU1ldGFkYXRhDQpgYGANCg0KDQpgYGB7cn0NCndvcmtfcmVsYXRlZF9zdHJlc3NfcXVlc3Rpb24gPC0gc3Vic2V0KHNjb3JlTWV0YWRhdGEsIGdyZXBsKCI1ZGQ2ZTRhNDlhNTEzNzAwMDQ1MGZmMWQiLCBxdWVzdGlvbklkLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkNCg0KaGVhZCh3b3JrX3JlbGF0ZWRfc3RyZXNzX3F1ZXN0aW9uKQ0KYGBgDQpgYGB7cn0NCm1lcmdlZF9zdHJlc3NfZGF0YSA8LSBpbm5lcl9qb2luKHNjb3JlVm90ZXMsIHdvcmtfcmVsYXRlZF9zdHJlc3NfcXVlc3Rpb24sIGJ5ID0gInF1ZXN0aW9uSWQiKQ0KDQpwcmludChtZWFuKG1lcmdlZF9zdHJlc3NfZGF0YSRzY29yZVZvdGUsIG5hLnJtID0gVFJVRSkpDQpgYGANCmBgYHtyfQ0KcHJpbnQoc2QobWVyZ2VkX3N0cmVzc19kYXRhJHNjb3JlVm90ZSwgbmEucm0gPSBUUlVFKSkNCg0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQp0b3AxMF9pbmR1c3RyaWVzIDwtIGNvbXBhbnlNZXRhZGF0YSAlPiUNCiAgZ3JvdXBfYnkoaW5kdXN0cnkpICU+JQ0KICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JQ0KICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gY291bnQsIG4gPSAxMCkNCg0KZ2dwbG90KGRhdGEgPSB0b3AxMF9pbmR1c3RyaWVzLCBhZXMoeCA9IHJlb3JkZXIoaW5kdXN0cnksIGNvdW50KSwgeSA9IGNvdW50KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJsaWdodGJsdWUiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVG9wIDEwIEluZHVzdHJpZXMgYnkgTnVtYmVyIG9mIENvbXBhbmllcyIsDQogICAgeCA9ICJJbmR1c3RyeSIsDQogICAgeSA9ICJOdW1iZXIgb2YgQ29tcGFuaWVzIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkNCiAgKQ0KYGBgDQpgYGB7cn0NCm1lcmdlZF9zY29yZV9kYXRhIDwtIGlubmVyX2pvaW4oc2NvcmVWb3Rlcywgc2NvcmVNZXRhZGF0YSwgYnkgPSAic2NvcmVJZCIpDQoNCmdncGxvdChkYXRhID0gbWVyZ2VkX3Njb3JlX2RhdGEsIGFlcyh4ID0gbmFtZSwgeSA9IHNjb3JlVm90ZSkpICsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLmNvbG9yID0gInJlZCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgU2NvcmUgVm90ZXMgYnkgU2NvcmUgQ2F0ZWdvcnkiLA0KICAgIHggPSAiU2NvcmUgQ2F0ZWdvcmllcyAoTmFtZSkiLA0KICAgIHkgPSAiU2NvcmUgVm90ZXMiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxMCksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikNCiAgKQ0KDQpgYGANCmBgYHtyfQ0Kd2VsbGJlaW5nX21ldGFkYXRhIDwtIHNjb3JlTWV0YWRhdGEgJT4lDQogIGZpbHRlcihuYW1lID09ICJXZWxsYmVpbmciKQ0KDQp3ZWxsYmVpbmdfdm90ZXMgPC0gc2NvcmVWb3RlcyAlPiUNCiAgaW5uZXJfam9pbih3ZWxsYmVpbmdfbWV0YWRhdGEsIGJ5ID0gInNjb3JlSWQiKQ0KDQp3ZWxsYmVpbmdfd2l0aF9jb21wYW55IDwtIHdlbGxiZWluZ192b3RlcyAlPiUNCiAgaW5uZXJfam9pbihjb21wYW55TWV0YWRhdGEsIGJ5ID0gImNvbXBhbnlJZCIpDQoNCmF2ZXJhZ2Vfc2NvcmVzIDwtIHdlbGxiZWluZ193aXRoX2NvbXBhbnkgJT4lDQogIGdyb3VwX2J5KGNvbXBhbnlJZCkgJT4lDQogIHN1bW1hcmlzZShhdmdfd2VsbGJlaW5nX3Njb3JlID0gbWVhbihzY29yZVZvdGUsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBhcnJhbmdlKGRlc2MoYXZnX3dlbGxiZWluZ19zY29yZSkpDQoNCnRvcF9jb21wYW55IDwtIGF2ZXJhZ2Vfc2NvcmVzICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBhdmdfd2VsbGJlaW5nX3Njb3JlLCBuID0gMSkNCg0KdG9wX2NvbXBhbnlfZGV0YWlscyA8LSB0b3BfY29tcGFueSAlPiUNCiAgaW5uZXJfam9pbihjb21wYW55TWV0YWRhdGEsIGJ5ID0gImNvbXBhbnlJZCIpDQoNCnByaW50KHRvcF9jb21wYW55X2RldGFpbHMpDQpgYGANCmBgYHtyfQ0KdGFyZ2V0X2NvbXBhbmllcyA8LSBjb21wYW55TWV0YWRhdGEgJT4lDQogIGZpbHRlcihpbmR1c3RyeSAlaW4lIGMoIkFSVFNfRU5URVJUQUlOTUVOVF9SRUNSRUFUSU9OIiwgIkZJTkFOQ0lBTF9TRVJWSUNFU19JTlNVUkFOQ0UiKSkNCg0KaW5kdXN0cnlfdm90ZXMgPC0gc2NvcmVWb3RlcyAlPiUNCiAgaW5uZXJfam9pbih0YXJnZXRfY29tcGFuaWVzLCBieSA9ICJjb21wYW55SWQiKSAlPiUNCiAgc2VsZWN0KGluZHVzdHJ5LCBzY29yZVZvdGUpDQoNCmFydHNfcmVjcmVhdGlvbiA8LSBpbmR1c3RyeV92b3RlcyAlPiUNCiAgZmlsdGVyKGluZHVzdHJ5ID09ICJBUlRTX0VOVEVSVEFJTk1FTlRfUkVDUkVBVElPTiIpICU+JQ0KICBwdWxsKHNjb3JlVm90ZSkNCg0KZmluYW5jaWFsX3NlcnZpY2VzIDwtIGluZHVzdHJ5X3ZvdGVzICU+JQ0KICBmaWx0ZXIoaW5kdXN0cnkgPT0gIkZJTkFOQ0lBTF9TRVJWSUNFU19JTlNVUkFOQ0UiKSAlPiUNCiAgcHVsbChzY29yZVZvdGUpDQoNCm1lYW5fYXJ0cyA8LSBtZWFuKGFydHNfcmVjcmVhdGlvbiwgbmEucm0gPSBUUlVFKQ0KbWVhbl9maW5hbmNpYWwgPC0gbWVhbihmaW5hbmNpYWxfc2VydmljZXMsIG5hLnJtID0gVFJVRSkNCg0KdF90ZXN0X3Jlc3VsdCA8LSB0LnRlc3QoYXJ0c19yZWNyZWF0aW9uLCBmaW5hbmNpYWxfc2VydmljZXMsIHZhci5lcXVhbCA9IFRSVUUpDQoNCmxpc3QoDQogIE1lYW5fQXJ0c19FbnRlcnRhaW5tZW50X1JlY3JlYXRpb24gPSBtZWFuX2FydHMsDQogIE1lYW5fRmluYW5jaWFsX1NlcnZpY2VzX0luc3VyYW5jZSA9IG1lYW5fZmluYW5jaWFsLA0KICBQX1ZhbHVlID0gdF90ZXN0X3Jlc3VsdCRwLnZhbHVlLA0KICBUX1Rlc3RfUmVzdWx0ID0gdF90ZXN0X3Jlc3VsdA0KKQ0KYGBgDQpgYGB7cn0NCm1lcmdlZF9oYXBwaW5lc3NfZGF0YSA8LSBzY29yZVZvdGVzICU+JQ0KICBpbm5lcl9qb2luKGNvbXBhbnlNZXRhZGF0YSwgYnkgPSAiY29tcGFueUlkIikgJT4lDQogIHNlbGVjdChjb21wYW55SWQsIGNvbXBhbnlOYW1lID0gaW5kdXN0cnksIGhpVm90ZSA9IHNjb3JlVm90ZSkNCg0KaGFwcGllc3RfY29tcGFuaWVzIDwtIG1lcmdlZF9oYXBwaW5lc3NfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoY29tcGFueUlkLCBjb21wYW55TmFtZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBhdmdfaGFwcGluZXNzID0gbWVhbihoaVZvdGUsIG5hLnJtID0gVFJVRSksDQogICAgc2RfaGFwcGluZXNzID0gc2QoaGlWb3RlLCBuYS5ybSA9IFRSVUUpLA0KICAgIGNvdW50ID0gbigpDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhhdmdfaGFwcGluZXNzKSkNCg0KcHJpbnQoaGFwcGllc3RfY29tcGFuaWVzKQ0KYGBgDQpgYGB7cn0NCmhhcHBpZXN0X2NvbXBhbmllc19jb21wb3NpdGUgPC0gbWVyZ2VkX2hhcHBpbmVzc19kYXRhICU+JQ0KICBncm91cF9ieShjb21wYW55SWQsIGNvbXBhbnlOYW1lKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGF2Z19oYXBwaW5lc3MgPSBtZWFuKGhpVm90ZSwgbmEucm0gPSBUUlVFKSwNCiAgICBzZF9oYXBwaW5lc3MgPSBzZChoaVZvdGUsIG5hLnJtID0gVFJVRSksDQogICAgY291bnQgPSBuKCksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgY29tcG9zaXRlX3Njb3JlID0gYXZnX2hhcHBpbmVzcyAtIHNkX2hhcHBpbmVzcyArIGxvZyhjb3VudCkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGNvbXBvc2l0ZV9zY29yZSkpDQoNCnRvcF9jb21wb3NpdGVfY29tcGFueSA8LSBoYXBwaWVzdF9jb21wYW5pZXNfY29tcG9zaXRlICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBjb21wb3NpdGVfc2NvcmUsIG4gPSAxKQ0KDQpoZWFkKGhhcHBpZXN0X2NvbXBhbmllc19jb21wb3NpdGUpDQpgYGANCmBgYHtyfQ0KbWVyZ2VkX2luZHVzdHJ5X2RhdGEgPC0gaW5uZXJfam9pbihoaVZvdGVzLCBjb21wYW55TWV0YWRhdGEsIGJ5ID0gImNvbXBhbnlJZCIpICU+JQ0KICBzZWxlY3QoaGlWb3RlLCBpbmR1c3RyeSkNCg0KYW5vdmFfcmVzdWx0IDwtIGFvdihoaVZvdGUgfiBpbmR1c3RyeSwgZGF0YSA9IG1lcmdlZF9pbmR1c3RyeV9kYXRhKQ0KDQphbm92YV9zdW1tYXJ5IDwtIHN1bW1hcnkoYW5vdmFfcmVzdWx0KQ0KDQphbm92YV9wX3ZhbHVlIDwtIGFub3ZhX3N1bW1hcnlbWzFdXSRgUHIoPkYpYFsxXQ0KcHJpbnQocGFzdGUoIlAtdmFsdWUgZm9yIEFOT1ZBOiIsIGFub3ZhX3BfdmFsdWUpKQ0KYGBgDQoNCmBgYHtyfQ0KbnVtX2luZHVzdHJpZXMgPC0gbGVuZ3RoKHVuaXF1ZShtZXJnZWRfaW5kdXN0cnlfZGF0YSRpbmR1c3RyeSkpDQoNCnByaW50KChudW1faW5kdXN0cmllcyAqIChudW1faW5kdXN0cmllcyAtIDEpKSAvIDIpDQpgYGANCmBgYHtyfQ0Kc3RyKGNvbXBhbnlNZXRhZGF0YSkNCmBgYA0KDQoNCg0KYGBge3J9DQptZXJnZWRfdGltZXpvbmVfZGF0YSA8LSBzY29yZVZvdGVzICU+JQ0KICBpbm5lcl9qb2luKGNvbXBhbnlNZXRhZGF0YSwgYnkgPSAiY29tcGFueUlkIikgJT4lDQogIHNlbGVjdChzY29yZVZvdGUsIHRpbWV6b25lKQ0KDQpsbV9yZXN1bHQgPC0gbG0oc2NvcmVWb3RlIH4gdGltZXpvbmUsIGRhdGEgPSBtZXJnZWRfdGltZXpvbmVfZGF0YSkNCg0Kc3VtbWFyeV9sbSA8LSBzdW1tYXJ5KGxtX3Jlc3VsdCkNCg0KcHJpbnQoc3VtbWFyeV9sbSkNCmBgYA0KDQpgYGB7cn0NCmNvZWZmX3RhYmxlIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeV9sbSRjb2VmZmljaWVudHMpDQoNCiMgQWRkIHJvdyBuYW1lcyAodGltZSB6b25lcykgdG8gdGhlIGNvZWZmaWNpZW50cyB0YWJsZQ0KY29lZmZfdGFibGUkVGltZVpvbmUgPC0gcm93bmFtZXMoY29lZmZfdGFibGUpDQoNCiMgRXhjbHVkZSB0aGUgSW50ZXJjZXB0DQpjb2VmZl90YWJsZSA8LSBjb2VmZl90YWJsZVtjb2VmZl90YWJsZSRUaW1lWm9uZSAhPSAiKEludGVyY2VwdCkiLCBdDQoNCiMgSWRlbnRpZnkgdGhlIHN0cm9uZ2VzdCBlZmZlY3QgKGxhcmdlc3QgYWJzb2x1dGUgY29lZmZpY2llbnQpDQpzdHJvbmdlc3RfZWZmZWN0IDwtIGNvZWZmX3RhYmxlW3doaWNoLm1heChhYnMoY29lZmZfdGFibGUkRXN0aW1hdGUpKSwgXQ0KDQojIElkZW50aWZ5IHRoZSBtb3N0IHNpZ25pZmljYW50IGVmZmVjdCAoc21hbGxlc3QgcC12YWx1ZSkNCm1vc3Rfc2lnbmlmaWNhbnRfZWZmZWN0IDwtIGNvZWZmX3RhYmxlW3doaWNoLm1pbihjb2VmZl90YWJsZSRgUHIoPnx0fClgKSwgXQ0KDQojIFByaW50IHJlc3VsdHMNCnByaW50KCJUaW1lIHpvbmUgd2l0aCB0aGUgc3Ryb25nZXN0IGVmZmVjdDoiKQ0KcHJpbnQoc3Ryb25nZXN0X2VmZmVjdCkNCg0KcHJpbnQoIlRpbWUgem9uZSB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGVmZmVjdDoiKQ0KcHJpbnQobW9zdF9zaWduaWZpY2FudF9lZmZlY3QpDQpgYGANCmBgYHtyfQ0KbWVyZ2VkX2RlcGFydG1lbnRfZGF0YSA8LSBoaVZvdGVzICU+JQ0KICBpbm5lcl9qb2luKGNvbXBhbnlNZXRhZGF0YSwgYnkgPSAiY29tcGFueUlkIikgJT4lDQogIHNlbGVjdChkZXBhcnRtZW50SWQsIGhpVm90ZSkNCg0KZGVwdF9hdmcgPC0gbWVyZ2VkX2RlcGFydG1lbnRfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoZGVwYXJ0bWVudElkKSAlPiUNCiAgc3VtbWFyaXNlKGF2Z19oaVZvdGUgPSBtZWFuKGhpVm90ZSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhhdmdfaGlWb3RlKSkNCg0Kb3ZlcmFsbF9hdmcgPC0gbWVhbihtZXJnZWRfZGVwYXJ0bWVudF9kYXRhJGhpVm90ZSwgbmEucm0gPSBUUlVFKQ0KDQp0b3BfZGVwYXJ0bWVudCA8LSBkZXB0X2F2Z1sxLCBdDQoNCnByaW50KHBhc3RlKCJUb3AgZGVwYXJ0bWVudDoiLCB0b3BfZGVwYXJ0bWVudCRkZXBhcnRtZW50SWQpKQ0KcHJpbnQocGFzdGUoIkF2ZXJhZ2UgaGlWb3RlIGZvciB0b3AgZGVwYXJ0bWVudDoiLCByb3VuZCh0b3BfZGVwYXJ0bWVudCRhdmdfaGlWb3RlLCAyKSkpDQpwcmludChwYXN0ZSgiT3ZlcmFsbCBjb21wYW55IGF2ZXJhZ2UgaGlWb3RlOiIsIHJvdW5kKG92ZXJhbGxfYXZnLCAyKSkpDQpgYGANCg0KDQo=