1 Introduction

In preprocessing/index.Rmd I generated the various count tables for this experiment. Now let us check them out! I arbitrarily mapped every sample against both assemblies. It is noteworthy that the 5448 assembly is named ‘NV1’.

The first step I need to complete is to have a sample sheet describing the samples. I will therefore leave the following from the preprocessing so that I can manually create a starting sample sheet.

Basically, I am going to start libreoffice, create a sample_sheets/all_samples.xlsx file and copy/paste these sample IDs into it, then split the names by ’_’ to create some sense of what is going on …

echo "5448_dciaR_pSin_DMSO_R25448_dciaR_pSin_DMSO_R35448_dciaR_pSin_DMSO_R55448_dciaR_pSin_Heme_R2_585448_dciaR_pSin_Heme_R3_595448_dciaR_pSin_Heme_R5_605448_pJRS525_DMSO_R2_465448_pJRS525_DMSO_R3_765448_pJRS525_DMSO_R5_485448_pJRS525_Heme_R2_545448_pJRS525_Heme_R3_555448_pJRS525_Heme_R5_56CDM_glucose_manLMN_A_5CDM_glucose_manLMN_B_6CDM_glucose_manLMN_C_7CDM_glucose_manLMN_D_8CDM_glucose_manLMN_Rescue_A_9CDM_glucose_manLMN_Rescue_B_10CDM_glucose_manLMN_Rescue_C_11CDM_glucose_manLMN_Rescue_D_12CDM_glucose_WT_5448_A_1CDM_glucose_WT_5448_B_2CDM_glucose_WT_5448_C_3CDM_glucose_WT_5448_D_4CDM_glucose_WT_NZ131_A_33CDM_glucose_WT_NZ131_B_34CDM_glucose_WT_NZ131_C_35CDM_glucose_WT_NZ131_D_36CDM_mannose_manLMN_Rescue_A_29CDM_mannose_manLMN_Rescue_B_30CDM_mannose_manLMN_Rescue_C_13cycles_67CDM_mannose_manLMN_Rescue_D_32CDM_mannose_WT_NZ131_A_41CDM_mannose_WT_NZ131_B_42CDM_mannose_WT_NZ131_C_43CDM_mannose_WT_NZ131_D_44CDM_manose_WT_5448_A_13cycles_63CDM_manose_WT_5448_B_13cycles_64CDM_manose_WT_5448_C_13cycles_65CDM_manose_WT_5448_D_13cycles_66CDM_sucrose_manLMN_A_17CDM_sucrose_manLMN_B_18CDM_sucrose_manLMN_C_19CDM_sucrose_manLMN_D_20CDM_sucrose_manLMN_Rescue_A_21CDM_sucrose_manLMN_Rescue_B_22CDM_sucrose_manLMN_Rescue_C_23CDM_sucrose_manLMN_Rescue_D_24CDM_sucrose_WT_5448_A_13CDM_sucrose_WT_5448_B_14CDM_sucrose_WT_5448_C_13cycles_61CDM_sucrose_WT_5448_D_13cycles_62CDM_sucrose_WT_NZ131_A_37CDM_sucrose_WT_NZ131_B_38CDM_sucrose_WT_NZ131_C_39CDM_sucrose_WT_NZ131_D_40 Undetermined" | tr ' ' '\n'

I copy/pasted the resulting return-separated string into libreoffice and made up 4 columns ‘genotype’, ‘strain’, ‘replicate’, and ‘additive’.

If we assume that I chose reasonably, we should be able to observe clustering across some of these in a reasonable fashion. But first, let us populated the rest of the sheet.

starting_metadata <- "sample_sheets/all_samples_atb.xlsx"
specification <- make_rnaseq_spec()
species <- c("spyogenes_nv1", "spyogenes_nz131")
tag <- "locus_tag"

full_sample_sheet <- gather_preprocessing_metadata(
  starting_metadata, specification = specification,
  species = species, tag = tag, id_column = 2, md5 = TRUE)
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## Checking the state of the condition column.
## Checking the state of the batch column.
## Checking the condition factor.
## preprocessing/5448_dciaR_pSin_DMSO_R2/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_DMSO_R3/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_DMSO_R5/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_Heme_R2_58/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_Heme_R3_59/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_Heme_R5_60/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_DMSO_R2_46/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_DMSO_R3_76/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_DMSO_R5_48/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_Heme_R2_54/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_Heme_R3_55/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_Heme_R5_56/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_A_5/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_B_6/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_C_7/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_D_8/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_Rescue_A_9/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_Rescue_B_10/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_Rescue_C_11/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_Rescue_D_12/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_5448_A_1/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_5448_B_2/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_5448_C_3/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_5448_D_4/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_NZ131_A_33/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_NZ131_B_34/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_NZ131_C_35/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_NZ131_D_36/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_manLMN_Rescue_A_29/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_manLMN_Rescue_B_30/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_manLMN_Rescue_C_13cycles_67/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_manLMN_Rescue_D_32/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_WT_NZ131_A_41/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_WT_NZ131_B_42/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_WT_NZ131_C_43/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_WT_NZ131_D_44/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_manose_WT_5448_A_13cycles_63/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_manose_WT_5448_B_13cycles_64/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_manose_WT_5448_C_13cycles_65/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_manose_WT_5448_D_13cycles_66/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_A_17/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_B_18/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_C_19/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_D_20/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_Rescue_A_21/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_Rescue_B_22/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_Rescue_C_23/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_Rescue_D_24/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_5448_A_13/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_5448_B_14/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_5448_C_13cycles_61/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_5448_D_13cycles_62/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_NZ131_A_37/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_NZ131_B_38/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_NZ131_C_39/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_NZ131_D_40/outputs/*hisat*_spyogenes_nv1/spyogenes_nv1_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_DMSO_R2/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_DMSO_R3/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_DMSO_R5/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_Heme_R2_58/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_Heme_R3_59/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_dciaR_pSin_Heme_R5_60/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_DMSO_R2_46/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_DMSO_R3_76/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_DMSO_R5_48/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_Heme_R2_54/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_Heme_R3_55/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/5448_pJRS525_Heme_R5_56/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_A_5/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_B_6/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_C_7/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_D_8/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_Rescue_A_9/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_Rescue_B_10/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_Rescue_C_11/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_manLMN_Rescue_D_12/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_5448_A_1/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_5448_B_2/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_5448_C_3/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_5448_D_4/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_NZ131_A_33/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_NZ131_B_34/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_NZ131_C_35/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_glucose_WT_NZ131_D_36/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_manLMN_Rescue_A_29/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_manLMN_Rescue_B_30/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_manLMN_Rescue_C_13cycles_67/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_manLMN_Rescue_D_32/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_WT_NZ131_A_41/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_WT_NZ131_B_42/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_WT_NZ131_C_43/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_mannose_WT_NZ131_D_44/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_manose_WT_5448_A_13cycles_63/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_manose_WT_5448_B_13cycles_64/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_manose_WT_5448_C_13cycles_65/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_manose_WT_5448_D_13cycles_66/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_A_17/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_B_18/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_C_19/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_D_20/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_Rescue_A_21/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_Rescue_B_22/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_Rescue_C_23/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_manLMN_Rescue_D_24/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_5448_A_13/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_5448_B_14/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_5448_C_13cycles_61/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_5448_D_13cycles_62/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_NZ131_A_37/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_NZ131_B_38/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_NZ131_C_39/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## preprocessing/CDM_sucrose_WT_NZ131_D_40/outputs/*hisat*_spyogenes_nz131/spyogenes_nz131_*genome*_gene_locus_tag_fcounts.csv.xz
## Warning in gather_preprocessing_metadata(starting_metadata, specification =
## specification, : Column: input_r1 already exists, replacing it.
## Warning in gather_preprocessing_metadata(starting_metadata, specification =
## specification, : Column: input_r2 already exists, replacing it.
## Writing new metadata to: sample_sheets/all_samples_atb_modified.xlsx
## Deleting the file sample_sheets/all_samples_atb_modified.xlsx before writing the tables.

let us open that in libreoffice and see if it looks reasonable.

I see that I neglected to quantify the rRNA species. It looks like the mapping rates are pretty fantastic though, ranging from 93 to 99.8%. My code did not count the # of observed genes, likely because I moved to featureCounts from htseq.

Oddly, it also did not provide me the filenames for the featureCounts outputs, let us figure out why… The files are definitely there, so we can safely assume that my gather function is missing something obvious since I moved to fcounts.

There are a few other columns which need fixing with the move to featureCounts too: observed_Genes, sum_genes, mean_exprs

2 Gather annotations

I mapped every sample against both 5448 and NZ131; so we have a little bit of latitude with respect to how we treat the samples.

nz131_annot <- load_gff_annotations("~/libraries/genome/gff/spyogenes_nz131.gff",
                                    id_col = "locus_tag", type = "gene")
## Returning a df with 34 columns and 1782 rows.
rownames(nz131_annot) <- nz131_annot[["locus_tag"]]
#nz131_microbes <- load_microbesonline_annotations("NZ131")

nv1_annot <- load_gff_annotations("~/libraries/genome/gff/spyogenes_nv1.gff",
                                  id_col = "locus_tag", type = "gene")
## Returning a df with 41 columns and 1791 rows.
rownames(nv1_annot) <- nv1_annot[["locus_tag"]]

cd Important note: there is a problem between the samtools alignments and featureCounts/the gff file: The alignments assigned every read to chromosome CPxxxx, but the gff file shows that chromosome as CPxxxx.1 and so featureCounts assigned exactly 0 reads. My solution was to delete the leading .1 from the gff file and recount.

3 Creating the complete datasets, one for 5448, one for NZ131

3.1 Choose some colors

color_choices <- list(
  "strains" = list(
    "nz131" = "#1111CC",
    "s5448" = "#3182CE"),
  "genotype" = list(
    "dciaR" = "#1B9E77",
    "manLMN" = "#D95F02",
    "manLMN_R" = "#7570B3",
    "pJRS525" = "#E7298A",
    "WT" = "#66A61E"),
  "additive" = list(
    "DMSO" = "#078D66",
    "glucose" = "#B73D01",
    "Heme" = "#535091",
    "mannose" = "#C50768",
    "sucrose" = "#4484AC"),
  "sugar_combined" = list(
    "manLMN_R_s5448_glucose" = "#1B9E77",
    "manLMN_R_s5448_mannose" = "#A07125",
    "manLMN_R_s5448_sucrose" =  "#B16548",
    "manLMN_s5448_glucose" = "#8068AE",
    "manLMN_s5448_sucrose" =  "#D03792",
    "WT_NZ131_glucose" =  "#A66753",
    "WT_NZ131_mannose" = "#7FA718",
    "WT_NZ131_sucrose" = "#D9AA04",
    "WT_s5448_glucose" = "#BF8B12",
    "WT_s5448_mannose" = "#927132",
    "WT_s5448_sucrose" = "#666666"),
  "heme_combined" = list(
    "dciaR_s5448_DMSO" = "#1B9E77",
    "dciaR_s5448_Heme" = "#D95F02",
    "pJRS525_s5448_DMSO" = "#7570B3",
    "pJRS525_s5448_Heme" = "#E7298A")
)
modified_meta <- full_sample_sheet[["new_meta"]]
nz131_se <- create_se(modified_meta, gene_info = nz131_annot,
                      file_column = "hisat_count_table_spyogenes_nz131")
## Reading the sample metadata.
## Checking the state of the condition column.
## Checking the state of the batch column.
## Checking the condition factor.
## The sample definitions comprises: 56 rows(samples) and 34 columns(metadata fields).
## Matched 1782 annotations and counts.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the summarized experiment to 'se.rda'.
## The final summarized experiment has 1782 rows and 34 columns.
nv1_se <- create_se(modified_meta, gene_info = nv1_annot,
                    file_column = "hisat_count_table_spyogenes_nv1")
## Reading the sample metadata.
## Checking the state of the condition column.
## Checking the state of the batch column.
## Checking the condition factor.
## The sample definitions comprises: 56 rows(samples) and 34 columns(metadata fields).
## Matched 1791 annotations and counts.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the summarized experiment to 'se.rda'.
## The final summarized experiment has 1791 rows and 34 columns.

4 Visualizing the metadata

There are a few interesting tools we can use to look at the metadata.

4.1 The sugar experiment

sugar_se <- subset_se(nv1_se, subset = "experiment=='mannose'") %>%
  set_conditions(fact = "combined", colors = color_choices[["sugar_combined"]]) %>%
  set_batches(fact = "replicate")
## The numbers of samples by condition are:
## 
## manLMN_R_s5448_glucose manLMN_R_s5448_mannose manLMN_R_s5448_sucrose 
##                      4                      4                      4 
##   manLMN_s5448_glucose   manLMN_s5448_sucrose       WT_NZ131_glucose 
##                      4                      4                      4 
##       WT_NZ131_mannose       WT_NZ131_sucrose       WT_s5448_glucose 
##                      4                      4                      4 
##       WT_s5448_mannose       WT_s5448_sucrose 
##                      4                      4
## The number of samples by batch are:
## 
##  A  B  C  D 
## 11 11 11 11
plot_meta_sankey(sugar_se, factors = c("strain", "genotype", "additive"),
                 color_choices = color_choices)
## A sankey plot describing the metadata of 44 samples,
## including 17 out of 0 nodes and traversing metadata factors:
## strain, genotype, additive.

plot_metadata_factors(sugar_se, column = "trimomatic_percent")

plot_metadata_factors(sugar_se, column = "trimomatic_output")

plot_metadata_factors(sugar_se, column = "hisat_genome_percent_log_spyogenes_nv1")

plot_metadata_factors(sugar_se, column = "hisat_genome_percent_log_spyogenes_nz131")

4.2 The heme experiment

heme_se <- subset_se(nv1_se, subset = "experiment=='heme'") %>%
  set_conditions(fact = "combined", colors = color_choices[["heme_combined"]]) %>%
  set_batches(fact = "replicate")
## The numbers of samples by condition are:
## 
##   dciaR_s5448_DMSO   dciaR_s5448_Heme pJRS525_s5448_DMSO pJRS525_s5448_Heme 
##                  3                  3                  3                  3
## The number of samples by batch are:
## 
## A B C 
## 4 4 4
plot_meta_sankey(heme_se, factors = c("strain", "genotype", "additive"),
                 color_choices = color_choices)
## A sankey plot describing the metadata of 12 samples,
## including 7 out of 0 nodes and traversing metadata factors:
## strain, genotype, additive.

plot_metadata_factors(heme_se, column = "trimomatic_percent")

plot_metadata_factors(heme_se, column = "trimomatic_output")

plot_metadata_factors(heme_se, column = "hisat_genome_percent_log_spyogenes_nv1")

plot_metadata_factors(heme_se, column = "hisat_genome_percent_log_spyogenes_nz131")

5 Plotting the count data

I did the sugar experiment first last time, let us do heme this time…

5.1 The heme experiment

I added a blue line to the non-zero plots which shows how the genes observed compares to some arbitrary cutoff, in this case 90% of the number of all genes.

Even without normalizing the data, they are remarkably consistent.

plot_libsize(heme_se)
## Library sizes of 12 samples, 
## ranging from 6,398,103 to 12,481,824.

plot_nonzero(heme_se, y_intercept = 0.9)
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## A non-zero genes plot of 12 samples.
## These samples have an average 7.933 CPM coverage and 1758 genes observed, ranging from 1746 to
## 1773.
## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

plot_disheat(heme_se)
## A heatmap of pairwise sample distances ranging from: 
## 49243.5532894155 to 942886.811905543.

5.2 The sugar experiment

The sugar experiment is a bit more confusing as one would expect.

I think we should maybe come up with simpler sample names, too. (I added a sampleID column with s01-sxx (58ish?), so future plots will have less obnoxious borders.

plot_libsize(sugar_se)
## Library sizes of 44 samples, 
## ranging from 5,825,673 to 8,954,977.

plot_nonzero(sugar_se, y_intercept = 0.9)
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## A non-zero genes plot of 44 samples.
## These samples have an average 7.474 CPM coverage and 1726 genes observed, ranging from 1630 to
## 1787.
## Warning: ggrepel: 26 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

plot_disheat(sugar_se)
## A heatmap of pairwise sample distances ranging from: 
## 51463.3959548746 to 4902689.18658521.

6 Look at the normalized data

6.1 Sugar first this time

The NZ131 data is pretty significantly different, I guess this should not come as a surprise. Should we separate them out? I bet if I check my email I will remember the answer to this question.

Conversely, I can use sva to see if that lowers the variance associated with strain.

sugar_norm <- normalize(sugar_se, transform = "log2", convert = "cpm",
                        norm = "quant", filter = TRUE)
## Running normalize_se.
## Removing 71 low-count genes (1720 remaining).
## Setting 3788 entries to zero.
plot_pca(sugar_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by manLMN_R_s5448_glucose, manLMN_R_s5448_mannose, manLMN_R_s5448_sucrose, manLMN_s5448_glucose, manLMN_s5448_sucrose, WT_NZ131_glucose, WT_NZ131_mannose, WT_NZ131_sucrose, WT_s5448_glucose, WT_s5448_mannose, WT_s5448_sucrose
## Shapes are defined by A, B, C, D.

plot_disheat(sugar_norm)
## A heatmap of pairwise sample distances ranging from: 
## 10.8006419174447 to 86.2337422469123.

plot_corheat(sugar_norm)
## A heatmap of pairwise sample correlations ranging from: 
## 0.771698867368623 to 0.996425252919219.

sugar_nb <- normalize(sugar_se, transform = "log2", convert = "cpm",
                      filter = TRUE, batch = "pca")
## Running normalize_se.
## Removing 71 low-count genes (1720 remaining).
## Error in solve.default(t(mod) %*% mod) : 
##   Lapack routine dgesv: system is exactly singular: U[15,15] = 0
## Warning in all_adjusters(count_table, design = design, estimate_type = method,
## : It is highly likely that the underlying reason for this error is too many 0's
## in the dataset, please try doing a filtering of the data and retry.
## transform_counts: Found 85 values less than 0.
## Warning in transform_counts(count_table, method = transform, ...): NaNs
## produced
## Setting 2418 entries to zero.
plot_pca(sugar_nb)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by manLMN_R_s5448_glucose, manLMN_R_s5448_mannose, manLMN_R_s5448_sucrose, manLMN_s5448_glucose, manLMN_s5448_sucrose, WT_NZ131_glucose, WT_NZ131_mannose, WT_NZ131_sucrose, WT_s5448_glucose, WT_s5448_mannose, WT_s5448_sucrose
## Shapes are defined by A, B, C, D.

plot_disheat(sugar_nb)
## A heatmap of pairwise sample distances ranging from: 
## 11.9773145347721 to 51.6761854388067.

heme_norm <- normalize(heme_se, transform = "log2", convert = "cpm",
                       norm = "quant", filter = TRUE)
## Running normalize_se.
## Removing 125 low-count genes (1666 remaining).
## Setting 325 entries to zero.
plot_pca(heme_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by dciaR_s5448_DMSO, dciaR_s5448_Heme, pJRS525_s5448_DMSO, pJRS525_s5448_Heme
## Shapes are defined by A, B, C.

heme_nb <- normalize(heme_se, transform = "log2", convert = "cpm",
                     filter = TRUE, batch = "svaseq")
## Running normalize_se.
## Removing 125 low-count genes (1666 remaining).
## transform_counts: Found 7 values less than 0.
## Warning in transform_counts(count_table, method = transform, ...): NaNs
## produced
## Setting 287 entries to zero.
plot_pca(heme_nb)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by dciaR_s5448_DMSO, dciaR_s5448_Heme, pJRS525_s5448_DMSO, pJRS525_s5448_Heme
## Shapes are defined by A, B, C.

7 Initial DE analyses

7.1 The heme experiment

In my email I received the following request vis a vis the comparisons:

  1. pSin_ciaR vs pJRS525 5448 DMSO
  2. pSin_ciaR vs pJRS525 5448 Heme

When I looked at the sample sheet, the first comparison that came to my mind was a comparison of heme/dmso for each strain, so I added those.

heme_contrasts <- list(
  "psin_pjr_dmso" = c("dciaR_s5448_DMSO", "pJRS525_s5448_DMSO"),
  "psin_pjr_heme" = c("dciaR_s5448_Heme", "pJRS525_s5448_Heme"),
  "dcia" = c("dciaR_s5448_Heme", "dciaR_s5448_DMSO"),
  "plasmid" = c("pJRS525_s5448_Heme", "pJRS525_s5448_DMSO"))
heme_de <- all_pairwise(heme_se, keepers = heme_contrasts, force = TRUE)
##   dciaR_s5448_DMSO   dciaR_s5448_Heme pJRS525_s5448_DMSO pJRS525_s5448_Heme 
##                  3                  3                  3                  3 
## A B C 
## 4 4 4
## Basic step 0/3: Filtering data.
## Basic step 0/3: Normalizing data.
## Basic step 0/3: Converting data.
## I think this is failing? SummarizedExperiment
## Basic step 0/3: Transforming data.
## Running normalize_se.
## Setting 268 entries to zero.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Warning in createContrastL(objFlt$formula, objFlt$data, L): Contrasts with only
## a single non-zero term are already evaluated by default.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## conditions
##   dciaR_s5448_DMSO   dciaR_s5448_Heme pJRS525_s5448_DMSO pJRS525_s5448_Heme 
##                  3                  3                  3                  3
## conditions
##   dciaR_s5448_DMSO   dciaR_s5448_Heme pJRS525_s5448_DMSO pJRS525_s5448_Heme 
##                  3                  3                  3                  3
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## conditions
##   dciaR_s5448_DMSO   dciaR_s5448_Heme pJRS525_s5448_DMSO pJRS525_s5448_Heme 
##                  3                  3                  3                  3

heme_table <- combine_de_tables(heme_de, excel = "excel/heme_contrasts.xlsx")
## Deleting the file excel/heme_contrasts.xlsx before writing the tables.

7.2 DE of the sugar experiment

  1. WT 5448 Glucose vs WT 5448 Sucrose
  2. WT 5448 Glucose vs WT 5448 Mannose
  3. WT 5448 Sucrose vs WT 5448 Mannose
  4. DmanLMN Glucose vs DmanLMN Sucrose
  5. DmanLMN_Rescue Glucose vs DmanLMN_Rescue Sucrose
  6. DmanLMN_Rescue Glucose vs DmanLMN_Rescue Mannose
  7. DmanLMN_Rescue Sucrose vs DmanLMN_Rescue Mannose
  8. WT Glucose-Sucrose vs DmanLMN Glucose-Sucrose
  9. DmanLMN Glucose-Sucrose vs DmanLMN_Rescue Glucose-Sucrose
extra_contrasts <- "wt_sg_vs_deletion_sg = (conditionWT_s5448_sucrose - conditionWT_s5448_glucose) - (conditionmanLMN_s5448_sucrose - conditionmanLMN_s5448_glucose), deletion_sg_vs_rescue_sg = (conditionmanLMN_s5448_sucrose - conditionmanLMN_s5448_glucose) - (conditionmanLMN_R_s5448_sucrose - conditionmanLMN_R_s5448_glucose)"
all_keepers <- list(
  "01wt5448sg" = c("WT_s5448_sucrose", "WT_s5448_glucose"), ## 1 above
  "02wt5448mg" = c("WT_s5448_mannose", "WT_s5448_glucose"), ## 2 above
  "03wt5448ms" = c("WT_s5448_mannose", "WT_s5448_sucrose"),
  "04dlsg" = c("manLMN_s5448_sucrose", "manLMN_s5448_glucose"),
  "05resg" = c("manLMN_R_s5448_sucrose", "manLMN_R_s5448_glucose"),
  "06remg" = c("manLMN_R_s5448_mannose", "manLMN_R_s5448_glucose"),
  "07rems" = c("manLMN_R_s5448_mannose", "manLMN_R_s5448_sucrose"),
  "08wtnzsg" = c("WT_NZ131_sucrose", "WT_NZ131_glucose"), ## 1 above
  "09wtnzmg" = c("WT_NZ131_mannose", "WT_NZ131_glucose"), ## 2 above
  "10wtnzms" = c("WT_NZ131_mannose", "WT_NZ131_sucrose"),
  "11dlwtgl" = c("manLMN_s5448_glucose", "WT_s5448_glucose"),
  "12dlwtsu" = c("manLMN_s5448_sucrose", "WT_s5448_sucrose"))
sugar_extra_keepers <- all_keepers
sugar_extra_keepers[["wtsgdelsg"]] <- c("wt_sg", "deletion_sg")
sugar_extra_keepers[["delsgressg"]] <- c("deletion_sg", "rescue_sg")

sugar_de_noextra <- all_pairwise(sugar_se, keepers = all_keepers, filter = TRUE,
                                 force = TRUE)
## manLMN_R_s5448_glucose manLMN_R_s5448_mannose manLMN_R_s5448_sucrose 
##                      4                      4                      4 
##   manLMN_s5448_glucose   manLMN_s5448_sucrose       WT_NZ131_glucose 
##                      4                      4                      4 
##       WT_NZ131_mannose       WT_NZ131_sucrose       WT_s5448_glucose 
##                      4                      4                      4 
##       WT_s5448_mannose       WT_s5448_sucrose 
##                      4                      4 
##  A  B  C  D 
## 11 11 11 11
## Running normalize_se.
## Removing 71 low-count genes (1720 remaining).
## Basic step 0/3: Normalizing data.
## Basic step 0/3: Converting data.
## I think this is failing? SummarizedExperiment
## Basic step 0/3: Transforming data.
## Running normalize_se.
## Setting 3601 entries to zero.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Warning in createContrastL(objFlt$formula, objFlt$data, L): Contrasts with only
## a single non-zero term are already evaluated by default.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## conditions
## manLMN_R_s5448_glucose manLMN_R_s5448_mannose manLMN_R_s5448_sucrose 
##                      4                      4                      4 
##   manLMN_s5448_glucose   manLMN_s5448_sucrose       WT_NZ131_glucose 
##                      4                      4                      4 
##       WT_NZ131_mannose       WT_NZ131_sucrose       WT_s5448_glucose 
##                      4                      4                      4 
##       WT_s5448_mannose       WT_s5448_sucrose 
##                      4                      4
## conditions
## manLMN_R_s5448_glucose manLMN_R_s5448_mannose manLMN_R_s5448_sucrose 
##                      4                      4                      4 
##   manLMN_s5448_glucose   manLMN_s5448_sucrose       WT_NZ131_glucose 
##                      4                      4                      4 
##       WT_NZ131_mannose       WT_NZ131_sucrose       WT_s5448_glucose 
##                      4                      4                      4 
##       WT_s5448_mannose       WT_s5448_sucrose 
##                      4                      4
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## conditions
## manLMN_R_s5448_glucose manLMN_R_s5448_mannose manLMN_R_s5448_sucrose 
##                      4                      4                      4 
##   manLMN_s5448_glucose   manLMN_s5448_sucrose       WT_NZ131_glucose 
##                      4                      4                      4 
##       WT_NZ131_mannose       WT_NZ131_sucrose       WT_s5448_glucose 
##                      4                      4                      4 
##       WT_s5448_mannose       WT_s5448_sucrose 
##                      4                      4

sugar_tables_noextra <- combine_de_tables(sugar_de_noextra,
                                          excel = "excel/sugar_tables_noextra.xlsx")
## Deleting the file excel/sugar_tables_noextra.xlsx before writing the tables.
## Error in wb$check_overwrite_tables(sheet = sheet, new_rows = c(startRow,  : 
##   Cannot overwrite existing table with another table.

Now write the data with the extra contrasts included.

Reminder to self, one cannot use a set of keepers in all_pairwise() if extra contrasts are set because I do not currently control the names of the numerators/denominators in the makeContrasts() function.

sugar_de <- all_pairwise(sugar_se, extra_contrasts = extra_contrasts,
                         force = TRUE)
## manLMN_R_s5448_glucose manLMN_R_s5448_mannose manLMN_R_s5448_sucrose 
##                      4                      4                      4 
##   manLMN_s5448_glucose   manLMN_s5448_sucrose       WT_NZ131_glucose 
##                      4                      4                      4 
##       WT_NZ131_mannose       WT_NZ131_sucrose       WT_s5448_glucose 
##                      4                      4                      4 
##       WT_s5448_mannose       WT_s5448_sucrose 
##                      4                      4 
##  A  B  C  D 
## 11 11 11 11
## Basic step 0/3: Filtering data.
## Basic step 0/3: Normalizing data.
## Basic step 0/3: Converting data.
## I think this is failing? SummarizedExperiment
## Basic step 0/3: Transforming data.
## Running normalize_se.
## Setting 3601 entries to zero.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## The contrast wt_sg is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast deletion_sg is not in the results.
## If this is not an extra contrast, then this is an error.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Warning in createContrastL(objFlt$formula, objFlt$data, L): Contrasts with only
## a single non-zero term are already evaluated by default.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## conditions
## manLMN_R_s5448_glucose manLMN_R_s5448_mannose manLMN_R_s5448_sucrose 
##                      4                      4                      4 
##   manLMN_s5448_glucose   manLMN_s5448_sucrose       WT_NZ131_glucose 
##                      4                      4                      4 
##       WT_NZ131_mannose       WT_NZ131_sucrose       WT_s5448_glucose 
##                      4                      4                      4 
##       WT_s5448_mannose       WT_s5448_sucrose 
##                      4                      4
## conditions
## manLMN_R_s5448_glucose manLMN_R_s5448_mannose manLMN_R_s5448_sucrose 
##                      4                      4                      4 
##   manLMN_s5448_glucose   manLMN_s5448_sucrose       WT_NZ131_glucose 
##                      4                      4                      4 
##       WT_NZ131_mannose       WT_NZ131_sucrose       WT_s5448_glucose 
##                      4                      4                      4 
##       WT_s5448_mannose       WT_s5448_sucrose 
##                      4                      4
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## conditions
## manLMN_R_s5448_glucose manLMN_R_s5448_mannose manLMN_R_s5448_sucrose 
##                      4                      4                      4 
##   manLMN_s5448_glucose   manLMN_s5448_sucrose       WT_NZ131_glucose 
##                      4                      4                      4 
##       WT_NZ131_mannose       WT_NZ131_sucrose       WT_s5448_glucose 
##                      4                      4                      4 
##       WT_s5448_mannose       WT_s5448_sucrose 
##                      4                      4

sugar_tables <- combine_de_tables(sugar_de, keepers = sugar_extra_keepers,
                                  excel = "excel/sugar_contrasts_extras.xlsx")
## Deleting the file excel/sugar_contrasts_extras.xlsx before writing the tables.
## Warning in extract_keepers(extracted, keepers, table_names, all_coefficients, :
## The table for wtsgdelsg using basic does not appear in the pairwise data.
## Warning in extract_keepers(extracted, keepers, table_names, all_coefficients, :
## The table for wtsgdelsg using ebseq does not appear in the pairwise data.
## Warning in extract_keepers(extracted, keepers, table_names, all_coefficients, :
## The table for wtsgdelsg using noiseq does not appear in the pairwise data.
## Error : subscript contains invalid names
## coefficient limma did not find deletion_sg or wt_sg.
## coefficient edger did not find conditiondeletion_sg or conditionwt_sg.
## coefficient limma did not find deletion_sg or wt_sg.
## Warning in extract_keepers(extracted, keepers, table_names, all_coefficients, :
## The table for delsgressg using basic does not appear in the pairwise data.
## Warning in extract_keepers(extracted, keepers, table_names, all_coefficients, :
## The table for delsgressg using ebseq does not appear in the pairwise data.
## Warning in extract_keepers(extracted, keepers, table_names, all_coefficients, :
## The table for delsgressg using noiseq does not appear in the pairwise data.
## Error : subscript contains invalid names
## coefficient limma did not find rescue_sg or deletion_sg.
## coefficient edger did not find conditionrescue_sg or conditiondeletion_sg.
## coefficient limma did not find rescue_sg or deletion_sg.

Finally, write the data as one contrast per sheet.

for (t in seq_along(all_keepers)) {
  keeper <- all_keepers[t]
  name <- names(keeper)
  filename <- file.path("excel", paste0(name, ".xlsx"))
  single_write <- combine_de_tables(sugar_de_noextra, keepers = keeper,
                                    excel = filename)
}
## Deleting the file excel/01wt5448sg.xlsx before writing the tables.
## Deleting the file excel/02wt5448mg.xlsx before writing the tables.
## Deleting the file excel/03wt5448ms.xlsx before writing the tables.
## Deleting the file excel/04dlsg.xlsx before writing the tables.
## Deleting the file excel/05resg.xlsx before writing the tables.
## Deleting the file excel/06remg.xlsx before writing the tables.
## Deleting the file excel/07rems.xlsx before writing the tables.
## Deleting the file excel/08wtnzsg.xlsx before writing the tables.
## Deleting the file excel/09wtnzmg.xlsx before writing the tables.
## Deleting the file excel/10wtnzms.xlsx before writing the tables.
pander::pander(sessionInfo())
message(paste0("This is hpgltools commit: ", get_git_commit()))
message(paste0("Saving to ", savefile))
tmp <- sm(saveme(filename = savefile))
tmp <- loadme(filename = savefile)
LS0tCnRpdGxlOiAiU3RyZXB0b2NvY2N1cyBweW9nZW5lcyA1NDQ4IGFuZCBOWjEzMSBjb21wYXJpc29ucy4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpiaWJsaW9ncmFwaHk6IC9ob21lL3RyZXkvc2NyYXRjaC96b3Rlcm9fbGlicmFyeS9hdGIuYmliCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShnbHVlKQpsaWJyYXJ5KGhwZ2x0b29scykKbGlicmFyeSh0aWR5cikKCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIHdpZHRoID0gOTAsIGVjaG8gPSBUUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZXJyb3IgPSBUUlVFLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOCwgZmlnLnJldGluYSA9IDIsCiAgb3V0LndpZHRoID0gIjEwMCUiLCBkZXYgPSAicG5nIiwKICBkZXYuYXJncyA9IGxpc3QocG5nID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKSkKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHMgPSA0LCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbCA9ICJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemUgPSAxMikpCnZlciA8LSBTeXMuZ2V0ZW52KCJWRVJTSU9OIikKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0ID0gIiVZJW0lZCIpCgpybWRfZmlsZSA8LSAiaW5kZXguUm1kIgpzYXZlZmlsZSA8LSBnc3ViKHBhdHRlcm4gPSAiXFwuUm1kIiwgcmVwbGFjZSA9ICJcXC5yZGFcXC54eiIsIHggPSBybWRfZmlsZSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoIm1ldGhvZHMiKQpgYGAKCiMgSW50cm9kdWN0aW9uCgpJbiBwcmVwcm9jZXNzaW5nL2luZGV4LlJtZCBJIGdlbmVyYXRlZCB0aGUgdmFyaW91cyBjb3VudCB0YWJsZXMgZm9yCnRoaXMgZXhwZXJpbWVudC4gTm93IGxldCB1cyBjaGVjayB0aGVtIG91dCEgIEkgYXJiaXRyYXJpbHkgbWFwcGVkCmV2ZXJ5IHNhbXBsZSBhZ2FpbnN0IGJvdGggYXNzZW1ibGllcy4gIEl0IGlzIG5vdGV3b3J0aHkgdGhhdCB0aGUgNTQ0OAphc3NlbWJseSBpcyBuYW1lZCAnTlYxJy4KClRoZSBmaXJzdCBzdGVwIEkgbmVlZCB0byBjb21wbGV0ZSBpcyB0byBoYXZlIGEgc2FtcGxlIHNoZWV0IGRlc2NyaWJpbmcKdGhlIHNhbXBsZXMuIEkgd2lsbCB0aGVyZWZvcmUgbGVhdmUgdGhlIGZvbGxvd2luZyBmcm9tIHRoZQpwcmVwcm9jZXNzaW5nIHNvIHRoYXQgSSBjYW4gbWFudWFsbHkgY3JlYXRlIGEgc3RhcnRpbmcgc2FtcGxlIHNoZWV0LgoKQmFzaWNhbGx5LCBJIGFtIGdvaW5nIHRvIHN0YXJ0IGxpYnJlb2ZmaWNlLCBjcmVhdGUgYQpzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLnhsc3ggZmlsZSBhbmQgY29weS9wYXN0ZSB0aGVzZSBzYW1wbGUgSURzCmludG8gaXQsIHRoZW4gc3BsaXQgdGhlIG5hbWVzIGJ5ICdfJyB0byBjcmVhdGUgc29tZSBzZW5zZSBvZiB3aGF0IGlzCmdvaW5nIG9uIC4uLgoKYGBge2Jhc2g9ZXZhbD1GQUxTRX0KZWNobyAiNTQ0OF9kY2lhUl9wU2luX0RNU09fUjI1NDQ4X2RjaWFSX3BTaW5fRE1TT19SMzU0NDhfZGNpYVJfcFNpbl9ETVNPX1I1NTQ0OF9kY2lhUl9wU2luX0hlbWVfUjJfNTg1NDQ4X2RjaWFSX3BTaW5fSGVtZV9SM181OTU0NDhfZGNpYVJfcFNpbl9IZW1lX1I1XzYwNTQ0OF9wSlJTNTI1X0RNU09fUjJfNDY1NDQ4X3BKUlM1MjVfRE1TT19SM183NjU0NDhfcEpSUzUyNV9ETVNPX1I1XzQ4NTQ0OF9wSlJTNTI1X0hlbWVfUjJfNTQ1NDQ4X3BKUlM1MjVfSGVtZV9SM181NTU0NDhfcEpSUzUyNV9IZW1lX1I1XzU2Q0RNX2dsdWNvc2VfbWFuTE1OX0FfNUNETV9nbHVjb3NlX21hbkxNTl9CXzZDRE1fZ2x1Y29zZV9tYW5MTU5fQ183Q0RNX2dsdWNvc2VfbWFuTE1OX0RfOENETV9nbHVjb3NlX21hbkxNTl9SZXNjdWVfQV85Q0RNX2dsdWNvc2VfbWFuTE1OX1Jlc2N1ZV9CXzEwQ0RNX2dsdWNvc2VfbWFuTE1OX1Jlc2N1ZV9DXzExQ0RNX2dsdWNvc2VfbWFuTE1OX1Jlc2N1ZV9EXzEyQ0RNX2dsdWNvc2VfV1RfNTQ0OF9BXzFDRE1fZ2x1Y29zZV9XVF81NDQ4X0JfMkNETV9nbHVjb3NlX1dUXzU0NDhfQ18zQ0RNX2dsdWNvc2VfV1RfNTQ0OF9EXzRDRE1fZ2x1Y29zZV9XVF9OWjEzMV9BXzMzQ0RNX2dsdWNvc2VfV1RfTloxMzFfQl8zNENETV9nbHVjb3NlX1dUX05aMTMxX0NfMzVDRE1fZ2x1Y29zZV9XVF9OWjEzMV9EXzM2Q0RNX21hbm5vc2VfbWFuTE1OX1Jlc2N1ZV9BXzI5Q0RNX21hbm5vc2VfbWFuTE1OX1Jlc2N1ZV9CXzMwQ0RNX21hbm5vc2VfbWFuTE1OX1Jlc2N1ZV9DXzEzY3ljbGVzXzY3Q0RNX21hbm5vc2VfbWFuTE1OX1Jlc2N1ZV9EXzMyQ0RNX21hbm5vc2VfV1RfTloxMzFfQV80MUNETV9tYW5ub3NlX1dUX05aMTMxX0JfNDJDRE1fbWFubm9zZV9XVF9OWjEzMV9DXzQzQ0RNX21hbm5vc2VfV1RfTloxMzFfRF80NENETV9tYW5vc2VfV1RfNTQ0OF9BXzEzY3ljbGVzXzYzQ0RNX21hbm9zZV9XVF81NDQ4X0JfMTNjeWNsZXNfNjRDRE1fbWFub3NlX1dUXzU0NDhfQ18xM2N5Y2xlc182NUNETV9tYW5vc2VfV1RfNTQ0OF9EXzEzY3ljbGVzXzY2Q0RNX3N1Y3Jvc2VfbWFuTE1OX0FfMTdDRE1fc3Vjcm9zZV9tYW5MTU5fQl8xOENETV9zdWNyb3NlX21hbkxNTl9DXzE5Q0RNX3N1Y3Jvc2VfbWFuTE1OX0RfMjBDRE1fc3Vjcm9zZV9tYW5MTU5fUmVzY3VlX0FfMjFDRE1fc3Vjcm9zZV9tYW5MTU5fUmVzY3VlX0JfMjJDRE1fc3Vjcm9zZV9tYW5MTU5fUmVzY3VlX0NfMjNDRE1fc3Vjcm9zZV9tYW5MTU5fUmVzY3VlX0RfMjRDRE1fc3Vjcm9zZV9XVF81NDQ4X0FfMTNDRE1fc3Vjcm9zZV9XVF81NDQ4X0JfMTRDRE1fc3Vjcm9zZV9XVF81NDQ4X0NfMTNjeWNsZXNfNjFDRE1fc3Vjcm9zZV9XVF81NDQ4X0RfMTNjeWNsZXNfNjJDRE1fc3Vjcm9zZV9XVF9OWjEzMV9BXzM3Q0RNX3N1Y3Jvc2VfV1RfTloxMzFfQl8zOENETV9zdWNyb3NlX1dUX05aMTMxX0NfMzlDRE1fc3Vjcm9zZV9XVF9OWjEzMV9EXzQwIFVuZGV0ZXJtaW5lZCIgfCB0ciAnICcgJ1xuJwpgYGAKCkkgY29weS9wYXN0ZWQgdGhlIHJlc3VsdGluZyByZXR1cm4tc2VwYXJhdGVkIHN0cmluZyBpbnRvIGxpYnJlb2ZmaWNlCmFuZCBtYWRlIHVwIDQgY29sdW1ucyAnZ2Vub3R5cGUnLCAnc3RyYWluJywgJ3JlcGxpY2F0ZScsIGFuZAonYWRkaXRpdmUnLgoKSWYgd2UgYXNzdW1lIHRoYXQgSSBjaG9zZSByZWFzb25hYmx5LCB3ZSBzaG91bGQgYmUgYWJsZSB0byBvYnNlcnZlCmNsdXN0ZXJpbmcgYWNyb3NzIHNvbWUgb2YgdGhlc2UgaW4gYSByZWFzb25hYmxlIGZhc2hpb24uICBCdXQgZmlyc3QsCmxldCB1cyBwb3B1bGF0ZWQgdGhlIHJlc3Qgb2YgdGhlIHNoZWV0LgoKYGBge3J9CnN0YXJ0aW5nX21ldGFkYXRhIDwtICJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzX2F0Yi54bHN4IgpzcGVjaWZpY2F0aW9uIDwtIG1ha2Vfcm5hc2VxX3NwZWMoKQpzcGVjaWVzIDwtIGMoInNweW9nZW5lc19udjEiLCAic3B5b2dlbmVzX256MTMxIikKdGFnIDwtICJsb2N1c190YWciCgpmdWxsX3NhbXBsZV9zaGVldCA8LSBnYXRoZXJfcHJlcHJvY2Vzc2luZ19tZXRhZGF0YSgKICBzdGFydGluZ19tZXRhZGF0YSwgc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb24sCiAgc3BlY2llcyA9IHNwZWNpZXMsIHRhZyA9IHRhZywgaWRfY29sdW1uID0gMiwgbWQ1ID0gVFJVRSkKYGBgCgpsZXQgdXMgb3BlbiB0aGF0IGluIGxpYnJlb2ZmaWNlIGFuZCBzZWUgaWYgaXQgbG9va3MgcmVhc29uYWJsZS4KCkkgc2VlIHRoYXQgSSBuZWdsZWN0ZWQgdG8gcXVhbnRpZnkgdGhlIHJSTkEgc3BlY2llcy4gIEl0IGxvb2tzIGxpa2UKdGhlIG1hcHBpbmcgcmF0ZXMgYXJlIHByZXR0eSBmYW50YXN0aWMgdGhvdWdoLCByYW5naW5nIGZyb20gOTMgdG8KOTkuOCUuICBNeSBjb2RlIGRpZCBub3QgY291bnQgdGhlICMgb2Ygb2JzZXJ2ZWQgZ2VuZXMsIGxpa2VseSBiZWNhdXNlCkkgbW92ZWQgdG8gZmVhdHVyZUNvdW50cyBmcm9tIGh0c2VxLgoKT2RkbHksIGl0IGFsc28gZGlkIG5vdCBwcm92aWRlIG1lIHRoZSBmaWxlbmFtZXMgZm9yIHRoZSBmZWF0dXJlQ291bnRzCm91dHB1dHMsIGxldCB1cyBmaWd1cmUgb3V0IHdoeS4uLiAgVGhlIGZpbGVzIGFyZSBkZWZpbml0ZWx5IHRoZXJlLCBzbwp3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IG15IGdhdGhlciBmdW5jdGlvbiBpcyBtaXNzaW5nIHNvbWV0aGluZwpvYnZpb3VzIHNpbmNlIEkgbW92ZWQgdG8gZmNvdW50cy4KClRoZXJlIGFyZSBhIGZldyBvdGhlciBjb2x1bW5zIHdoaWNoIG5lZWQgZml4aW5nIHdpdGggdGhlIG1vdmUgdG8KZmVhdHVyZUNvdW50cyB0b286IG9ic2VydmVkX0dlbmVzLCBzdW1fZ2VuZXMsIG1lYW5fZXhwcnMKCiMgR2F0aGVyIGFubm90YXRpb25zCgpJIG1hcHBlZCBldmVyeSBzYW1wbGUgYWdhaW5zdCBib3RoIDU0NDggYW5kIE5aMTMxOyBzbyB3ZSBoYXZlIGEgbGl0dGxlCmJpdCBvZiBsYXRpdHVkZSB3aXRoIHJlc3BlY3QgdG8gaG93IHdlIHRyZWF0IHRoZSBzYW1wbGVzLgoKYGBge3J9Cm56MTMxX2Fubm90IDwtIGxvYWRfZ2ZmX2Fubm90YXRpb25zKCJ+L2xpYnJhcmllcy9nZW5vbWUvZ2ZmL3NweW9nZW5lc19uejEzMS5nZmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZF9jb2wgPSAibG9jdXNfdGFnIiwgdHlwZSA9ICJnZW5lIikKcm93bmFtZXMobnoxMzFfYW5ub3QpIDwtIG56MTMxX2Fubm90W1sibG9jdXNfdGFnIl1dCiNuejEzMV9taWNyb2JlcyA8LSBsb2FkX21pY3JvYmVzb25saW5lX2Fubm90YXRpb25zKCJOWjEzMSIpCgpudjFfYW5ub3QgPC0gbG9hZF9nZmZfYW5ub3RhdGlvbnMoIn4vbGlicmFyaWVzL2dlbm9tZS9nZmYvc3B5b2dlbmVzX252MS5nZmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRfY29sID0gImxvY3VzX3RhZyIsIHR5cGUgPSAiZ2VuZSIpCnJvd25hbWVzKG52MV9hbm5vdCkgPC0gbnYxX2Fubm90W1sibG9jdXNfdGFnIl1dCmBgYAoKY2QgSW1wb3J0YW50IG5vdGU6IHRoZXJlIGlzIGEgcHJvYmxlbSBiZXR3ZWVuIHRoZSBzYW10b29scyBhbGlnbm1lbnRzIGFuZApmZWF0dXJlQ291bnRzL3RoZSBnZmYgZmlsZTogIFRoZSBhbGlnbm1lbnRzIGFzc2lnbmVkIGV2ZXJ5IHJlYWQgdG8KY2hyb21vc29tZSBDUHh4eHgsIGJ1dCB0aGUgZ2ZmIGZpbGUgc2hvd3MgdGhhdCBjaHJvbW9zb21lIGFzIENQeHh4eC4xCmFuZCBzbyBmZWF0dXJlQ291bnRzIGFzc2lnbmVkIGV4YWN0bHkgMCByZWFkcy4gIE15IHNvbHV0aW9uIHdhcyB0bwpkZWxldGUgdGhlIGxlYWRpbmcgLjEgZnJvbSB0aGUgZ2ZmIGZpbGUgYW5kIHJlY291bnQuCgojIENyZWF0aW5nIHRoZSBjb21wbGV0ZSBkYXRhc2V0cywgb25lIGZvciA1NDQ4LCBvbmUgZm9yIE5aMTMxCgojIyBDaG9vc2Ugc29tZSBjb2xvcnMKCmBgYHtyfQpjb2xvcl9jaG9pY2VzIDwtIGxpc3QoCiAgInN0cmFpbnMiID0gbGlzdCgKICAgICJuejEzMSIgPSAiIzExMTFDQyIsCiAgICAiczU0NDgiID0gIiMzMTgyQ0UiKSwKICAiZ2Vub3R5cGUiID0gbGlzdCgKICAgICJkY2lhUiIgPSAiIzFCOUU3NyIsCiAgICAibWFuTE1OIiA9ICIjRDk1RjAyIiwKICAgICJtYW5MTU5fUiIgPSAiIzc1NzBCMyIsCiAgICAicEpSUzUyNSIgPSAiI0U3Mjk4QSIsCiAgICAiV1QiID0gIiM2NkE2MUUiKSwKICAiYWRkaXRpdmUiID0gbGlzdCgKICAgICJETVNPIiA9ICIjMDc4RDY2IiwKICAgICJnbHVjb3NlIiA9ICIjQjczRDAxIiwKICAgICJIZW1lIiA9ICIjNTM1MDkxIiwKICAgICJtYW5ub3NlIiA9ICIjQzUwNzY4IiwKICAgICJzdWNyb3NlIiA9ICIjNDQ4NEFDIiksCiAgInN1Z2FyX2NvbWJpbmVkIiA9IGxpc3QoCiAgICAibWFuTE1OX1JfczU0NDhfZ2x1Y29zZSIgPSAiIzFCOUU3NyIsCiAgICAibWFuTE1OX1JfczU0NDhfbWFubm9zZSIgPSAiI0EwNzEyNSIsCiAgICAibWFuTE1OX1JfczU0NDhfc3Vjcm9zZSIgPSAgIiNCMTY1NDgiLAogICAgIm1hbkxNTl9zNTQ0OF9nbHVjb3NlIiA9ICIjODA2OEFFIiwKICAgICJtYW5MTU5fczU0NDhfc3Vjcm9zZSIgPSAgIiNEMDM3OTIiLAogICAgIldUX05aMTMxX2dsdWNvc2UiID0gICIjQTY2NzUzIiwKICAgICJXVF9OWjEzMV9tYW5ub3NlIiA9ICIjN0ZBNzE4IiwKICAgICJXVF9OWjEzMV9zdWNyb3NlIiA9ICIjRDlBQTA0IiwKICAgICJXVF9zNTQ0OF9nbHVjb3NlIiA9ICIjQkY4QjEyIiwKICAgICJXVF9zNTQ0OF9tYW5ub3NlIiA9ICIjOTI3MTMyIiwKICAgICJXVF9zNTQ0OF9zdWNyb3NlIiA9ICIjNjY2NjY2IiksCiAgImhlbWVfY29tYmluZWQiID0gbGlzdCgKICAgICJkY2lhUl9zNTQ0OF9ETVNPIiA9ICIjMUI5RTc3IiwKICAgICJkY2lhUl9zNTQ0OF9IZW1lIiA9ICIjRDk1RjAyIiwKICAgICJwSlJTNTI1X3M1NDQ4X0RNU08iID0gIiM3NTcwQjMiLAogICAgInBKUlM1MjVfczU0NDhfSGVtZSIgPSAiI0U3Mjk4QSIpCikKYGBgCgpgYGB7cn0KbW9kaWZpZWRfbWV0YSA8LSBmdWxsX3NhbXBsZV9zaGVldFtbIm5ld19tZXRhIl1dCm56MTMxX3NlIDwtIGNyZWF0ZV9zZShtb2RpZmllZF9tZXRhLCBnZW5lX2luZm8gPSBuejEzMV9hbm5vdCwKICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uID0gImhpc2F0X2NvdW50X3RhYmxlX3NweW9nZW5lc19uejEzMSIpCgpudjFfc2UgPC0gY3JlYXRlX3NlKG1vZGlmaWVkX21ldGEsIGdlbmVfaW5mbyA9IG52MV9hbm5vdCwKICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJoaXNhdF9jb3VudF90YWJsZV9zcHlvZ2VuZXNfbnYxIikKYGBgCgojIFZpc3VhbGl6aW5nIHRoZSBtZXRhZGF0YQoKVGhlcmUgYXJlIGEgZmV3IGludGVyZXN0aW5nIHRvb2xzIHdlIGNhbiB1c2UgdG8gbG9vayBhdCB0aGUgbWV0YWRhdGEuCgojIyBUaGUgc3VnYXIgZXhwZXJpbWVudAoKYGBge3J9CnN1Z2FyX3NlIDwtIHN1YnNldF9zZShudjFfc2UsIHN1YnNldCA9ICJleHBlcmltZW50PT0nbWFubm9zZSciKSAlPiUKICBzZXRfY29uZGl0aW9ucyhmYWN0ID0gImNvbWJpbmVkIiwgY29sb3JzID0gY29sb3JfY2hvaWNlc1tbInN1Z2FyX2NvbWJpbmVkIl1dKSAlPiUKICBzZXRfYmF0Y2hlcyhmYWN0ID0gInJlcGxpY2F0ZSIpCgpwbG90X21ldGFfc2Fua2V5KHN1Z2FyX3NlLCBmYWN0b3JzID0gYygic3RyYWluIiwgImdlbm90eXBlIiwgImFkZGl0aXZlIiksCiAgICAgICAgICAgICAgICAgY29sb3JfY2hvaWNlcyA9IGNvbG9yX2Nob2ljZXMpCgpwbG90X21ldGFkYXRhX2ZhY3RvcnMoc3VnYXJfc2UsIGNvbHVtbiA9ICJ0cmltb21hdGljX3BlcmNlbnQiKQpwbG90X21ldGFkYXRhX2ZhY3RvcnMoc3VnYXJfc2UsIGNvbHVtbiA9ICJ0cmltb21hdGljX291dHB1dCIpCnBsb3RfbWV0YWRhdGFfZmFjdG9ycyhzdWdhcl9zZSwgY29sdW1uID0gImhpc2F0X2dlbm9tZV9wZXJjZW50X2xvZ19zcHlvZ2VuZXNfbnYxIikKcGxvdF9tZXRhZGF0YV9mYWN0b3JzKHN1Z2FyX3NlLCBjb2x1bW4gPSAiaGlzYXRfZ2Vub21lX3BlcmNlbnRfbG9nX3NweW9nZW5lc19uejEzMSIpCmBgYAoKIyMgVGhlIGhlbWUgZXhwZXJpbWVudAoKYGBge3J9CmhlbWVfc2UgPC0gc3Vic2V0X3NlKG52MV9zZSwgc3Vic2V0ID0gImV4cGVyaW1lbnQ9PSdoZW1lJyIpICU+JQogIHNldF9jb25kaXRpb25zKGZhY3QgPSAiY29tYmluZWQiLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1siaGVtZV9jb21iaW5lZCJdXSkgJT4lCiAgc2V0X2JhdGNoZXMoZmFjdCA9ICJyZXBsaWNhdGUiKQoKcGxvdF9tZXRhX3NhbmtleShoZW1lX3NlLCBmYWN0b3JzID0gYygic3RyYWluIiwgImdlbm90eXBlIiwgImFkZGl0aXZlIiksCiAgICAgICAgICAgICAgICAgY29sb3JfY2hvaWNlcyA9IGNvbG9yX2Nob2ljZXMpCgpwbG90X21ldGFkYXRhX2ZhY3RvcnMoaGVtZV9zZSwgY29sdW1uID0gInRyaW1vbWF0aWNfcGVyY2VudCIpCnBsb3RfbWV0YWRhdGFfZmFjdG9ycyhoZW1lX3NlLCBjb2x1bW4gPSAidHJpbW9tYXRpY19vdXRwdXQiKQpwbG90X21ldGFkYXRhX2ZhY3RvcnMoaGVtZV9zZSwgY29sdW1uID0gImhpc2F0X2dlbm9tZV9wZXJjZW50X2xvZ19zcHlvZ2VuZXNfbnYxIikKcGxvdF9tZXRhZGF0YV9mYWN0b3JzKGhlbWVfc2UsIGNvbHVtbiA9ICJoaXNhdF9nZW5vbWVfcGVyY2VudF9sb2dfc3B5b2dlbmVzX256MTMxIikKYGBgCgojIFBsb3R0aW5nIHRoZSBjb3VudCBkYXRhCgpJIGRpZCB0aGUgc3VnYXIgZXhwZXJpbWVudCBmaXJzdCBsYXN0IHRpbWUsIGxldCB1cyBkbyBoZW1lIHRoaXMgdGltZS4uLgoKIyMgVGhlIGhlbWUgZXhwZXJpbWVudAoKSSBhZGRlZCBhIGJsdWUgbGluZSB0byB0aGUgbm9uLXplcm8gcGxvdHMgd2hpY2ggc2hvd3MgaG93IHRoZSBnZW5lcwpvYnNlcnZlZCBjb21wYXJlcyB0byBzb21lIGFyYml0cmFyeSBjdXRvZmYsIGluIHRoaXMgY2FzZSA5MCUgb2YgdGhlCm51bWJlciBvZiBhbGwgZ2VuZXMuCgpFdmVuIHdpdGhvdXQgbm9ybWFsaXppbmcgdGhlIGRhdGEsIHRoZXkgYXJlIHJlbWFya2FibHkgY29uc2lzdGVudC4KCmBgYHtyfQpwbG90X2xpYnNpemUoaGVtZV9zZSkKcGxvdF9ub256ZXJvKGhlbWVfc2UsIHlfaW50ZXJjZXB0ID0gMC45KQpwbG90X2Rpc2hlYXQoaGVtZV9zZSkKYGBgCgojIyBUaGUgc3VnYXIgZXhwZXJpbWVudAoKVGhlIHN1Z2FyIGV4cGVyaW1lbnQgaXMgYSBiaXQgbW9yZSBjb25mdXNpbmcgYXMgb25lIHdvdWxkIGV4cGVjdC4KCkkgdGhpbmsgd2Ugc2hvdWxkIG1heWJlIGNvbWUgdXAgd2l0aCBzaW1wbGVyIHNhbXBsZSBuYW1lcywgdG9vLiAoSQphZGRlZCBhIHNhbXBsZUlEIGNvbHVtbiB3aXRoIHMwMS1zeHggKDU4aXNoPyksIHNvIGZ1dHVyZSBwbG90cyB3aWxsCmhhdmUgbGVzcyBvYm5veGlvdXMgYm9yZGVycy4KCmBgYHtyfQpwbG90X2xpYnNpemUoc3VnYXJfc2UpCnBsb3Rfbm9uemVybyhzdWdhcl9zZSwgeV9pbnRlcmNlcHQgPSAwLjkpCnBsb3RfZGlzaGVhdChzdWdhcl9zZSkKYGBgCgojIExvb2sgYXQgdGhlIG5vcm1hbGl6ZWQgZGF0YQoKIyMgU3VnYXIgZmlyc3QgdGhpcyB0aW1lCgpUaGUgTloxMzEgZGF0YSBpcyBwcmV0dHkgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQsIEkgZ3Vlc3MgdGhpcyBzaG91bGQKbm90IGNvbWUgYXMgYSBzdXJwcmlzZS4gIFNob3VsZCB3ZSBzZXBhcmF0ZSB0aGVtIG91dD8gIEkgYmV0IGlmIEkKY2hlY2sgbXkgZW1haWwgSSB3aWxsIHJlbWVtYmVyIHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbi4KCkNvbnZlcnNlbHksIEkgY2FuIHVzZSBzdmEgdG8gc2VlIGlmIHRoYXQgbG93ZXJzIHRoZSB2YXJpYW5jZQphc3NvY2lhdGVkIHdpdGggc3RyYWluLgoKYGBge3J9CnN1Z2FyX25vcm0gPC0gbm9ybWFsaXplKHN1Z2FyX3NlLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHN1Z2FyX25vcm0pCnBsb3RfZGlzaGVhdChzdWdhcl9ub3JtKQpwbG90X2NvcmhlYXQoc3VnYXJfbm9ybSkKCnN1Z2FyX25iIDwtIG5vcm1hbGl6ZShzdWdhcl9zZSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJwY2EiKQpwbG90X3BjYShzdWdhcl9uYikKcGxvdF9kaXNoZWF0KHN1Z2FyX25iKQpgYGAKCmBgYHtyfQpoZW1lX25vcm0gPC0gbm9ybWFsaXplKGhlbWVfc2UsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShoZW1lX25vcm0pCgpoZW1lX25iIDwtIG5vcm1hbGl6ZShoZW1lX3NlLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKcGxvdF9wY2EoaGVtZV9uYikKYGBgCgojIEluaXRpYWwgREUgYW5hbHlzZXMKCiMjIFRoZSBoZW1lIGV4cGVyaW1lbnQKCkluIG15IGVtYWlsIEkgcmVjZWl2ZWQgdGhlIGZvbGxvd2luZyByZXF1ZXN0IHZpcyBhIHZpcyB0aGUKY29tcGFyaXNvbnM6CgoxLiBwU2luX2NpYVIgdnMgcEpSUzUyNSA1NDQ4IERNU08KMi4gcFNpbl9jaWFSIHZzIHBKUlM1MjUgNTQ0OCBIZW1lCgpXaGVuIEkgbG9va2VkIGF0IHRoZSBzYW1wbGUgc2hlZXQsIHRoZSBmaXJzdCBjb21wYXJpc29uIHRoYXQgY2FtZSB0bwpteSBtaW5kIHdhcyBhIGNvbXBhcmlzb24gb2YgaGVtZS9kbXNvIGZvciBlYWNoIHN0cmFpbiwgc28gSSBhZGRlZCB0aG9zZS4KCmBgYHtyfQpoZW1lX2NvbnRyYXN0cyA8LSBsaXN0KAogICJwc2luX3Bqcl9kbXNvIiA9IGMoImRjaWFSX3M1NDQ4X0RNU08iLCAicEpSUzUyNV9zNTQ0OF9ETVNPIiksCiAgInBzaW5fcGpyX2hlbWUiID0gYygiZGNpYVJfczU0NDhfSGVtZSIsICJwSlJTNTI1X3M1NDQ4X0hlbWUiKSwKICAiZGNpYSIgPSBjKCJkY2lhUl9zNTQ0OF9IZW1lIiwgImRjaWFSX3M1NDQ4X0RNU08iKSwKICAicGxhc21pZCIgPSBjKCJwSlJTNTI1X3M1NDQ4X0hlbWUiLCAicEpSUzUyNV9zNTQ0OF9ETVNPIikpCmhlbWVfZGUgPC0gYWxsX3BhaXJ3aXNlKGhlbWVfc2UsIGtlZXBlcnMgPSBoZW1lX2NvbnRyYXN0cywgZm9yY2UgPSBUUlVFKQpoZW1lX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKGhlbWVfZGUsIGV4Y2VsID0gImV4Y2VsL2hlbWVfY29udHJhc3RzLnhsc3giKQpgYGAKCiMjIERFIG9mIHRoZSBzdWdhciBleHBlcmltZW50CgoxLiBXVCA1NDQ4IEdsdWNvc2UgdnMgV1QgNTQ0OCBTdWNyb3NlCjIuIFdUIDU0NDggR2x1Y29zZSB2cyBXVCA1NDQ4IE1hbm5vc2UKMy4gV1QgNTQ0OCBTdWNyb3NlIHZzIFdUIDU0NDggTWFubm9zZQo0LiBEbWFuTE1OIEdsdWNvc2UgdnMgRG1hbkxNTiBTdWNyb3NlCjUuIERtYW5MTU5fUmVzY3VlIEdsdWNvc2UgdnMgRG1hbkxNTl9SZXNjdWUgU3Vjcm9zZQo2LiBEbWFuTE1OX1Jlc2N1ZSBHbHVjb3NlIHZzIERtYW5MTU5fUmVzY3VlIE1hbm5vc2UKNy4gRG1hbkxNTl9SZXNjdWUgU3Vjcm9zZSB2cyBEbWFuTE1OX1Jlc2N1ZSBNYW5ub3NlCjguIFdUIEdsdWNvc2UtU3Vjcm9zZSB2cyBEbWFuTE1OIEdsdWNvc2UtU3Vjcm9zZQo5LiBEbWFuTE1OIEdsdWNvc2UtU3Vjcm9zZSB2cyBEbWFuTE1OX1Jlc2N1ZSBHbHVjb3NlLVN1Y3Jvc2UKCmBgYHtyfQpleHRyYV9jb250cmFzdHMgPC0gInd0X3NnX3ZzX2RlbGV0aW9uX3NnID0gKGNvbmRpdGlvbldUX3M1NDQ4X3N1Y3Jvc2UgLSBjb25kaXRpb25XVF9zNTQ0OF9nbHVjb3NlKSAtIChjb25kaXRpb25tYW5MTU5fczU0NDhfc3Vjcm9zZSAtIGNvbmRpdGlvbm1hbkxNTl9zNTQ0OF9nbHVjb3NlKSwgZGVsZXRpb25fc2dfdnNfcmVzY3VlX3NnID0gKGNvbmRpdGlvbm1hbkxNTl9zNTQ0OF9zdWNyb3NlIC0gY29uZGl0aW9ubWFuTE1OX3M1NDQ4X2dsdWNvc2UpIC0gKGNvbmRpdGlvbm1hbkxNTl9SX3M1NDQ4X3N1Y3Jvc2UgLSBjb25kaXRpb25tYW5MTU5fUl9zNTQ0OF9nbHVjb3NlKSIKYWxsX2tlZXBlcnMgPC0gbGlzdCgKICAiMDF3dDU0NDhzZyIgPSBjKCJXVF9zNTQ0OF9zdWNyb3NlIiwgIldUX3M1NDQ4X2dsdWNvc2UiKSwgIyMgMSBhYm92ZQogICIwMnd0NTQ0OG1nIiA9IGMoIldUX3M1NDQ4X21hbm5vc2UiLCAiV1RfczU0NDhfZ2x1Y29zZSIpLCAjIyAyIGFib3ZlCiAgIjAzd3Q1NDQ4bXMiID0gYygiV1RfczU0NDhfbWFubm9zZSIsICJXVF9zNTQ0OF9zdWNyb3NlIiksCiAgIjA0ZGxzZyIgPSBjKCJtYW5MTU5fczU0NDhfc3Vjcm9zZSIsICJtYW5MTU5fczU0NDhfZ2x1Y29zZSIpLAogICIwNXJlc2ciID0gYygibWFuTE1OX1JfczU0NDhfc3Vjcm9zZSIsICJtYW5MTU5fUl9zNTQ0OF9nbHVjb3NlIiksCiAgIjA2cmVtZyIgPSBjKCJtYW5MTU5fUl9zNTQ0OF9tYW5ub3NlIiwgIm1hbkxNTl9SX3M1NDQ4X2dsdWNvc2UiKSwKICAiMDdyZW1zIiA9IGMoIm1hbkxNTl9SX3M1NDQ4X21hbm5vc2UiLCAibWFuTE1OX1JfczU0NDhfc3Vjcm9zZSIpLAogICIwOHd0bnpzZyIgPSBjKCJXVF9OWjEzMV9zdWNyb3NlIiwgIldUX05aMTMxX2dsdWNvc2UiKSwgIyMgMSBhYm92ZQogICIwOXd0bnptZyIgPSBjKCJXVF9OWjEzMV9tYW5ub3NlIiwgIldUX05aMTMxX2dsdWNvc2UiKSwgIyMgMiBhYm92ZQogICIxMHd0bnptcyIgPSBjKCJXVF9OWjEzMV9tYW5ub3NlIiwgIldUX05aMTMxX3N1Y3Jvc2UiKSwKICAiMTFkbHd0Z2wiID0gYygibWFuTE1OX3M1NDQ4X2dsdWNvc2UiLCAiV1RfczU0NDhfZ2x1Y29zZSIpLAogICIxMmRsd3RzdSIgPSBjKCJtYW5MTU5fczU0NDhfc3Vjcm9zZSIsICJXVF9zNTQ0OF9zdWNyb3NlIikpCnN1Z2FyX2V4dHJhX2tlZXBlcnMgPC0gYWxsX2tlZXBlcnMKc3VnYXJfZXh0cmFfa2VlcGVyc1tbInd0c2dkZWxzZyJdXSA8LSBjKCJ3dF9zZyIsICJkZWxldGlvbl9zZyIpCnN1Z2FyX2V4dHJhX2tlZXBlcnNbWyJkZWxzZ3Jlc3NnIl1dIDwtIGMoImRlbGV0aW9uX3NnIiwgInJlc2N1ZV9zZyIpCgpzdWdhcl9kZV9ub2V4dHJhIDwtIGFsbF9wYWlyd2lzZShzdWdhcl9zZSwga2VlcGVycyA9IGFsbF9rZWVwZXJzLCBmaWx0ZXIgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSA9IFRSVUUpCnN1Z2FyX3RhYmxlc19ub2V4dHJhIDwtIGNvbWJpbmVfZGVfdGFibGVzKHN1Z2FyX2RlX25vZXh0cmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gImV4Y2VsL3N1Z2FyX3RhYmxlc19ub2V4dHJhLnhsc3giKQpgYGAKCk5vdyB3cml0ZSB0aGUgZGF0YSB3aXRoIHRoZSBleHRyYSBjb250cmFzdHMgaW5jbHVkZWQuCgpSZW1pbmRlciB0byBzZWxmLCBvbmUgY2Fubm90IHVzZSBhIHNldCBvZiBrZWVwZXJzIGluIGFsbF9wYWlyd2lzZSgpCmlmIGV4dHJhIGNvbnRyYXN0cyBhcmUgc2V0IGJlY2F1c2UgSSBkbyBub3QgY3VycmVudGx5CmNvbnRyb2wgdGhlIG5hbWVzIG9mIHRoZSBudW1lcmF0b3JzL2Rlbm9taW5hdG9ycyBpbiB0aGUKbWFrZUNvbnRyYXN0cygpIGZ1bmN0aW9uLgoKYGBge3J9CnN1Z2FyX2RlIDwtIGFsbF9wYWlyd2lzZShzdWdhcl9zZSwgZXh0cmFfY29udHJhc3RzID0gZXh0cmFfY29udHJhc3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UgPSBUUlVFKQpzdWdhcl90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoc3VnYXJfZGUsIGtlZXBlcnMgPSBzdWdhcl9leHRyYV9rZWVwZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSAiZXhjZWwvc3VnYXJfY29udHJhc3RzX2V4dHJhcy54bHN4IikKYGBgCgpGaW5hbGx5LCB3cml0ZSB0aGUgZGF0YSBhcyBvbmUgY29udHJhc3QgcGVyIHNoZWV0LgoKYGBge3J9CmZvciAodCBpbiBzZXFfYWxvbmcoYWxsX2tlZXBlcnMpKSB7CiAga2VlcGVyIDwtIGFsbF9rZWVwZXJzW3RdCiAgbmFtZSA8LSBuYW1lcyhrZWVwZXIpCiAgZmlsZW5hbWUgPC0gZmlsZS5wYXRoKCJleGNlbCIsIHBhc3RlMChuYW1lLCAiLnhsc3giKSkKICBzaW5nbGVfd3JpdGUgPC0gY29tYmluZV9kZV90YWJsZXMoc3VnYXJfZGVfbm9leHRyYSwga2VlcGVycyA9IGtlZXBlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSBmaWxlbmFtZSkKfQpgYGAKCmBgYHtyIHNhdmVtZSwgZXZhbD1GQUxTRX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgc2F2ZWZpbGUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lID0gc2F2ZWZpbGUpKQpgYGAKCmBgYHtyIGxvYWRtZV9hZnRlciwgZXZhbD1GQUxTRX0KdG1wIDwtIGxvYWRtZShmaWxlbmFtZSA9IHNhdmVmaWxlKQpgYGAK