aggregate G185M3 and G185 M4 which are dcas9 and lnc5998 samples.
## aggregate G185M3 and G185 M4 which are dcas9 and lnc5998 samples.
samples1 <- read.csv(file.path("/restricted/projectnb/waxmanlab/kkarri2/cellranger_KO_aggr2/outs/aggregation.csv"), stringsAsFactors=F)
raw.data1 <- Read10X("/restricted/projectnb/waxmanlab/kkarri2/cellranger_KO_aggr2/outs/filtered_feature_bc_matrix")
G185M3M4 <- CreateSeuratObject(raw.data1) # dropseq
cellcodes <- as.data.frame(G185M3M4@assays$RNA@counts@Dimnames[[2]])
colnames(cellcodes) <- "barcodes"
rownames(cellcodes) <- cellcodes$barcodes
cellcodes$libcodes <- as.factor(gsub(pattern=".+-", replacement="", cellcodes$barcodes))
cellcodes$samples <- as.vector(samples1$library_id[cellcodes$libcodes])
sampleidentity <- cellcodes["samples"]
G185M3M4 <- AddMetaData(object=G185M3M4,sampleidentity)
ctrl_aggr1 <- G185M3M4
ctrl_aggr1 <- subset(ctrl_aggr1, subset = nFeature_RNA > 200 & nCount_RNA > 500)
ctrl_aggr1 <- NormalizeData(ctrl_aggr1, verbose = FALSE)
ctrl_aggr1 <- FindVariableFeatures(ctrl_aggr1, selection.method = "vst", nfeatures = 2000)
ctrl_aggr1 <- SCTransform(ctrl_aggr1)
ctrl_aggr1[["percent.mt"]] <- PercentageFeatureSet(ctrl_aggr1, pattern = "^mt-")
DefaultAssay(ctrl_aggr1) <- "SCT"
ctrl_aggr1 <- ScaleData(ctrl_aggr1,vars.to.regress = "percent.mt", verbose = FALSE)
ctrl_aggr1 <- RunPCA(ctrl_aggr1, npcs = 100, verbose = FALSE)
ctrl_aggr1 <- RunUMAP(ctrl_aggr1, reduction = "pca", dims = 1:30)
ctrl_aggr1 <- FindNeighbors(ctrl_aggr1, reduction = "pca", dims = 1:30)
ctrl_aggr1 <- FindClusters(ctrl_aggr1, resolution = 0.2)
ctrl_aggr1_p1.1 <- DimPlot(ctrl_aggr1, reduction = "umap", label = TRUE)
ctrl_aggr1_p1.2 <- DimPlot(ctrl_aggr1, reduction = "umap", split.by = "samples",label = TRUE)
ctrl_aggr1_p1.3 <- DimPlot(ctrl_aggr1, reduction = "umap", group.by = "samples")
plot_grid(ctrl_aggr1_p1.1,ctrl_aggr1_p1.2)
MS_list2 <- c('Sox9','Epcam','Krt7','Krt19','Alb','Ttr','Apoa1','Serpina1c','Cyp2e1', 'Glul', 'Oat', 'Gulo',
'Ass1', 'Hamp', 'Gstp1', 'Ubb',
'Cyp2f2', 'Pck1', 'Hal', 'Cdh1', 'Ptprc','Irf8','Itgax','Clec4f','Csf1r','Top2a','Kdr','Aqp1','Fcgr2b','Gpr182','Dcn','Colec11','Ecm1','Lrat','Il2rb','Nkg7','Cd3g','Cxcr6')
DefaultAssay(ctrl_aggr1) <- "RNA"
ctrl_aggr1 <- NormalizeData(ctrl_aggr1)
ctrl_aggr1_d1.1 <-DotPlot(ctrl_aggr1, features = MS_list2)+RotatedAxis()
ctrl_aggr1_d1.2 <-DotPlot(ctrl_aggr1, features = "Newlnc-inter-c7-5998",split.by = "samples")
ctrl_aggr1_v1.1<- VlnPlot(ctrl_aggr1, features = "Newlnc-inter-c7-5998", split.by = "samples", group.by = "seurat_clusters", pt.size = 0, combine = FALSE)
plot_grid(ctrl_aggr1_p1.1,ctrl_aggr1_d1.1)
plot_grid(ctrl_aggr1_p1.1,ctrl_aggr1_p1.2,ctrl_aggr1_d1.1)
######## Get some numbers and stats for avergage expression ######
table(FetchData(ctrl_aggr1, c('samples','ident')))
x <- (AverageExpression(KO.cells, verbose = TRUE, assays = "RNA" ,slot="counts")$RNA)
x["ncRNA-inter-chr7-5998",]
save(ctrl_aggr1,file ="/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G185/G185M3M4_subhep_SCT_PC30_res0.2_GB.Rdata")
ctrl_aggr29_subhep <- subset(ctrl_aggr1,idents = c('0'))
ctrl_aggr29_subhep <- NormalizeData(ctrl_aggr29_subhep)
ctrl_aggr29_subhep <- FindVariableFeatures(ctrl_aggr29_subhep, selection.method = "vst", nfeatures = 2000)
ctrl_aggr29_subhep$stim <- "ctrl_aggr29_subhep"
ctrl_aggr29_subhep <- SCTransform(ctrl_aggr29_subhep) # check to see if it remove batch effects
ctrl_aggr29_subhep[["percent.mt"]] <- PercentageFeatureSet(ctrl_aggr29_subhep, pattern = "^mt-")
DefaultAssay(ctrl_aggr29_subhep) <- "SCT"
ctrl_aggr29_subhep <- ScaleData(ctrl_aggr29_subhep, vars.to.regress = "percent.mt")
ctrl_aggr29_subhep <- RunPCA(ctrl_aggr29_subhep, npcs = 100)
ctrl_aggr29_subhep <- RunUMAP(ctrl_aggr29_subhep, reduction = "pca", dims = 1:10)
ctrl_aggr29_subhep <- FindNeighbors(ctrl_aggr29_subhep, reduction = "pca", dims = 1:10)
ctrl_aggr29_subhep <- FindClusters(ctrl_aggr29_subhep, resolution = 0.2)
ctrl_aggr29_subhep_p1.1 <- DimPlot(ctrl_aggr29_subhep, label=TRUE)
ctrl_aggr29_subhep_p1.2 <- DimPlot(ctrl_aggr29_subhep,group.by = "samples", label=TRUE)
plot_grid(ctrl_aggr29_subhep_p1.1,ctrl_aggr29_subhep_p1.2)
DefaultAssay(ctrl_aggr29_subhep) <- "RNA"
ctrl_aggr29_subhep <- NormalizeData(ctrl_aggr29_subhep)
ctrl_aggr29_subhep_d1.1 <- DotPlot(ctrl_aggr29_subhep,features = "Newlnc-inter-c7-5998") +RotatedAxis()
ctrl_aggr29_subhep_f1.1 <- FeaturePlot(ctrl_aggr29_subhep,features = "Newlnc-inter-c7-5998") +RotatedAxis()
ctrl_aggr29_subhep_v1.1 <- VlnPlot(ctrl_aggr29_subhep,features = "Newlnc-inter-c7-5998",sort = TRUE,split.by = "samples",pt.size = 0) +RotatedAxis()
table(FetchData(ctrl_aggr29_subhep, c('samples','ident')))
save(ctrl_aggr29_subhep,file ="/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G185/G185M3M4_subhep_SCT_PC10_res0.2_GB.Rdata")
aggregate G185M3 and G185 M5 which are dcas9 and lnc5998 samples.
## aggregate G185M3 and G185 M5 which are dcas9 and lnc5998 samples.
samples2 <- read.csv(file.path("/restricted/projectnb/waxmanlab/kkarri2/cellranger_KO_aggr3/outs/aggregation.csv"), stringsAsFactors=F)
#### aggreagte genebody counts folder from cellranger for G185M3 and G185M5 aggregated together
raw.data2 <- Read10X("/restricted/projectnb/waxmanlab/kkarri2/cellranger_KO_aggr3/outs/filtered_feature_bc_matrix")
G185M3M5 <- CreateSeuratObject(raw.data2) # dropseq
cellcodes <- as.data.frame(G185M3M5@assays$RNA@counts@Dimnames[[2]])
colnames(cellcodes) <- "barcodes"
rownames(cellcodes) <- cellcodes$barcodes
cellcodes$libcodes <- as.factor(gsub(pattern=".+-", replacement="", cellcodes$barcodes))
cellcodes$samples <- as.vector(samples2$library_id[cellcodes$libcodes])
sampleidentity <- cellcodes["samples"]
G185M3M5 <- AddMetaData(object=G185M3M5,sampleidentity)
ctrl_aggr2 <- G185M3M5
ctrl_aggr2 <- subset(ctrl_aggr2, subset = nFeature_RNA > 200 & nCount_RNA > 500)
ctrl_aggr2 <- NormalizeData(ctrl_aggr2, verbose = FALSE)
ctrl_aggr2 <- FindVariableFeatures(ctrl_aggr2, selection.method = "vst", nfeatures = 2000)
ctrl_aggr2 <- SCTransform(ctrl_aggr2)
ctrl_aggr2[["percent.mt"]] <- PercentageFeatureSet(ctrl_aggr2, pattern = "^mt-")
DefaultAssay(ctrl_aggr2) <- "SCT"
ctrl_aggr2 <- ScaleData(ctrl_aggr2,vars.to.regress = "percent.mt", verbose = FALSE)
ctrl_aggr2 <- RunPCA(ctrl_aggr2, npcs = 100, verbose = FALSE)
ctrl_aggr2 <- RunUMAP(ctrl_aggr2, reduction = "pca", dims = 1:11)
ctrl_aggr2 <- FindNeighbors(ctrl_aggr2, reduction = "pca", dims = 1:11)
ctrl_aggr2 <- FindClusters(ctrl_aggr2, resolution = 0.5)
ctrl_aggr2_p1.1 <- DimPlot(ctrl_aggr2, reduction = "umap", label = TRUE)
ctrl_aggr2_p1.2 <- DimPlot(ctrl_aggr2, reduction = "umap", split.by = "samples",label = TRUE)
ctrl_aggr2_p1.3 <- DimPlot(ctrl_aggr2, reduction = "umap", group.by = "samples")
plot_grid(ctrl_aggr2_p1.1,ctrl_aggr2_p1.2)
MS_list2 <- c('Sox9','Epcam','Krt7','Krt19','Alb','Ttr','Apoa1','Serpina1c','Cyp2e1','Cyp2f2','Ptprc','Irf8','Itgax','Clec4f','Csf1r','Top2a','Kdr','Aqp1','Fcgr2b','Gpr182','Dcn','Colec11','Ecm1','Lrat','Il2rb','Nkg7','Cd3g','Cxcr6')
DefaultAssay(ctrl_aggr2) <- "RNA"
ctrl_aggr2 <- ScaleData(ctrl_aggr2)
ctrl_aggr2 <- NormalizeData(ctrl_aggr2)
ctrl_aggr2_d1.1 <-DotPlot(ctrl_aggr2, features = MS_list2)+RotatedAxis()
ctrl_aggr2_d1.2 <-DotPlot(ctrl_aggr2, features = "(Gm13021)Newlnc-inter-c4-3779",split.by = "samples", cols=c("red","blue"))
ctrl_aggr2_v1.1<- VlnPlot(ctrl_aggr2, features = "(Gm13021)Newlnc-inter-c4-3779", split.by = "samples", group.by = "seurat_clusters", pt.size = 0, combine = FALSE)
ctrl_aggr2_h11 <- DoHeatmap(ctrl_aggr2, features = c("(Gm13021)Newlnc-inter-c4-3779","Newlnc-inter-c7-5998"), size = 3,assay = "RNA",slot = 'data')
ctrl_aggr2_f1.2 <- FeaturePlot(ctrl_aggr2,features = c('(Gm13021)Newlnc-inter-c4-3779','Newlnc-inter-c7-5998'),order=TRUE,label = TRUE)
plot_grid(ctrl_aggr2_p1.1,ctrl_aggr2_d1.1)
plot_grid(ctrl_aggr2_p1.1,ctrl_aggr2_p1.2,ctrl_aggr2_d1.1)
######## Get some numbers and stats for avergage expression ######
table(FetchData(ctrl_aggr2, c('samples','ident')))
x <- (AverageExpression(KO.cells, verbose = TRUE, assays = "RNA" ,slot="counts")$RNA)
x["ncRNA-inter-chr7-5998",]
save(ctrl_aggr2,file ="/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G185/G185M3M5_SCT_PC11_res0.5_GB.Rdata")
## aggregate G185M3 and G185 M5 which are dcas9 and lnc5998 samples.
samples3 <- read.csv(file.path("/restricted/projectnb/waxmanlab/kkarri2/cellranger_KO_aggr4_GB/outs/aggregation.csv"), stringsAsFactors=F)
#### aggreagte genebody counts folder from cellranger for G185M3 and G185M5 aggregated together
raw.data3 <- Read10X("/restricted/projectnb/waxmanlab/kkarri2/cellranger_KO_aggr4_GB/outs/filtered_feature_bc_matrix")
G185M4M5 <- CreateSeuratObject(raw.data3) # dropseq
cellcodes <- as.data.frame(G185M4M5@assays$RNA@counts@Dimnames[[2]])
colnames(cellcodes) <- "barcodes"
rownames(cellcodes) <- cellcodes$barcodes
cellcodes$libcodes <- as.factor(gsub(pattern=".+-", replacement="", cellcodes$barcodes))
cellcodes$samples <- as.vector(samples3$library_id[cellcodes$libcodes])
sampleidentity <- cellcodes["samples"]
G185M4M5 <- AddMetaData(object=G185M4M5,sampleidentity)
ctrl_aggr3 <- G185M4M5
ctrl_aggr3 <- subset(ctrl_aggr3, subset = nFeature_RNA > 200 & nCount_RNA > 500)
ctrl_aggr3 <- NormalizeData(ctrl_aggr3, verbose = FALSE)
ctrl_aggr3 <- FindVariableFeatures(ctrl_aggr3, selection.method = "vst", nfeatures = 2000)
ctrl_aggr3 <- SCTransform(ctrl_aggr3)
ctrl_aggr3[["percent.mt"]] <- PercentageFeatureSet(ctrl_aggr3, pattern = "^mt-")
DefaultAssay(ctrl_aggr3) <- "SCT"
ctrl_aggr3 <- ScaleData(ctrl_aggr3,vars.to.regress = "percent.mt", verbose = FALSE)
ctrl_aggr3 <- RunPCA(ctrl_aggr3, npcs = 100, verbose = FALSE)
ctrl_aggr3 <- RunUMAP(ctrl_aggr3, reduction = "pca", dims = 1:11)
ctrl_aggr3 <- FindNeighbors(ctrl_aggr3, reduction = "pca", dims = 1:11)
ctrl_aggr3 <- FindClusters(ctrl_aggr3, resolution = 0.3)
ctrl_aggr3_p1.1 <- DimPlot(ctrl_aggr3, reduction = "umap", label = TRUE)
ctrl_aggr3_p1.2 <- DimPlot(ctrl_aggr3, reduction = "umap", split.by = "samples",label = TRUE)
ctrl_aggr3_p1.3 <- DimPlot(ctrl_aggr3, reduction = "umap", group.by = "samples")
plot_grid(ctrl_aggr3_p1.1,ctrl_aggr3_p1.2)
MS_list2 <- c('Sox9','Epcam','Krt7','Krt19','Alb','Ttr','Apoa1','Serpina1c','Cyp2e1','Cyp2f2','Ptprc','Irf8','Itgax','Clec4f','Csf1r','Top2a','Kdr','Aqp1','Fcgr2b','Gpr182','Dcn','Colec11','Ecm1','Lrat','Il2rb','Nkg7','Cd3g','Cxcr6')
DefaultAssay(ctrl_aggr3) <- "RNA"
ctrl_aggr3 <- NormalizeData(ctrl_aggr3)
ctrl_aggr3_d1.1 <-DotPlot(ctrl_aggr3, features = MS_list2)+RotatedAxis()
ctrl_aggr3_d1.2 <-DotPlot(ctrl_aggr3, features = "(Gm13021)Newlnc-inter-c4-3779",split.by = "samples", cols=c("red","blue"))
ctrl_aggr3_v1.1<- VlnPlot(ctrl_aggr3, features = "(Gm13021)Newlnc-inter-c4-3779", split.by = "samples", group.by = "seurat_clusters", pt.size = 0, combine = FALSE)
ctrl_aggr3_r1.1<- RidgePlot(ctrl_aggr3, features = c("(Gm13021)Newlnc-inter-c4-3779","Newlnc-inter-c7-5998"), split.by = "samples", group.by = "seurat_clusters", pt.size = 0, combine = FALSE)
plot_grid(ctrl_aggr3_p1.1,ctrl_aggr3_d1.1)
plot_grid(ctrl_aggr3_p1.1,ctrl_aggr3_p1.2,ctrl_aggr3_d1.1)
######## Get some numbers and stats for avergage expression ######
table(FetchData(ctrl_aggr3, c('samples','ident')))
x <- (AverageExpression(KO.cells, verbose = TRUE, assays = "RNA" ,slot="counts")$RNA)
x["ncRNA-inter-chr7-5998",]
save(ctrl_aggr3,file ="/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G185/G185M4M5_SCT_PC11_res0.3_GB.Rdata")
genes_hep_main =c('Alb', 'Ttr', 'Apoa1', 'Serpina1c')
genes_hep = c('Alb', 'Ttr', 'Apoa1', 'Serpina1c',
'Cyp2e1', 'Glul', 'Oat', 'Gulo',
'Ass1', 'Hamp', 'Gstp1', 'Ubb',
'Cyp2f2', 'Pck1', 'Hal', 'Cdh1')
genes_endo1 = c( 'Pecam1', 'Nrp1', 'Kdr','Oit3','Igfbp7','Aqp1')
genes_endo2 = c('Kdr','Oit3','Aqp1','Efnb1','Wnt2')
genes_kuppfer = c( 'Clec4f', 'Cd68')
genes_nk = c('Il2rb', 'Nkg7', 'Cxcr6', 'Gzma')
genes_b = c('Cd79a', 'Cd79b')
genes_bec = c('Epcam', 'Krt19', 'Krt7')
genes_immune = 'Ptprc'
#HSC = c("Dcn","Lama1","Nes","Ngfr")
HSC=c("Colec11","Ecm1","Hgf","Lrat","Dcn")
Dividing = "Top2a"
Bplasma= "Jchain"
Mac= "Csf1r"
Chol="Sox9"
DC=c("Irf8","Itgax")
Tcell="Cd3g"
LSEC=c('Gpr182','Fcgr2b')
New_Macrophage = c('Ccl9','Osm')
Y_genes <- c("Uty","Ddx3y","Kdm5d","Eif2s3y", "Gm47283")
sex <- c("Cyp2b9", "ncRNA-inter-chrX-15394","Cyp2c69", 'Mup20', 'Mup1','Mup12', 'Mup21', 'Cyp2d9')
F_sex <- c('Sult3a1', 'A1bg', 'Fmo3', 'Cyp2b9', 'Sult2a1','Cyp2b13')
all_genes = c(genes_hep, genes_endo,LSEC, genes_kuppfer, Mac,genes_nk, genes_b, genes_bec, genes_immune, HSC_all,VSMC,FB, Dividing)
All_Genes = c(genes_hep_main, genes_endo2,LSEC,genes_kuppfer,Mac,genes_nk,genes_b,Bplasma,genes_bec,genes_immune,HSC,VSMC,FB,Chol,DC,Tcell,New_Macrophage)
vlnplot_genes = c('Alb','Aqp1','Efnb1','Gpr182','Fcgr2b','Wnt2','Clec4f','Csf1r','Nkg7','Cd79a','Jchain','Ngfr','Gsn','Tagln','Irf8','Cd3g','Top2a','Osm')
genes_bec_b_immune = c(genes_bec,genes_b,genes_immune)
genes_zones = c('Cyp2e1', 'Glul', 'Oat', 'Gulo',
'Ass1', 'Hamp', 'Gstp1', 'Ubb',
'Cyp2f2', 'Pck1', 'Hal', 'Cdh1')
All_sex_genes <- c('Mup11','Mup7','Elovl3','Cyp4a12a','Tff3','Scara5','Mup14','Gstp2','Cyp4a12b','Mup20','Mup12','Mup21','Cyp2d9','Mup1',
'Sult2a5','Sult2a2','Sult2a3','Cyp3a16','Sult2a6','Cyp3a41b','Cyp3a44','Cyp3a41a','Cyp2a4','Slc22a26','Sult3a1',
'Sult2a1','Cyp2b13','A1bg','Fmo3','Cyp2c69','Cyp2b9')
#All_sex_genes <- c('Mup11|Mup7|Elovl3|Cyp4a12a|Tff3|Scara5|Mup14|Gstp2|Cyp4a12b|Mup20|Mup12|Mup21|Cyp2d9|Mup1|
# Sult2a5|Sult2a2|Sult2a3|Cyp3a16|Sult2a6|Cyp3a41b|Cyp3a44|Cyp3a41a|Cyp2a4|Slc22a26|Sult3a1|
#Sult2a1|Cyp2b13|A1bg|Fmo3|Cyp2c69|Cyp2b9')
All_sex_genes_all <- c(Y_genes, "(Xist)Newlnc-inter-cX-15394", All_sex_genes)
receptor_KO <- c("ncRNA-inter-chr7-5998","Cyp2b10","Nr1i2","Nr1i3","Ppara","Pparg","Ppargc1b","Ppard")
cell <- c("Stab2","Csf1r","Cd3g","Ebf1","Irf8","Sox9","Apoc3","Top2a","Dcn")
receptor_KO <- c("Nr1i2","Nr1i3","Nr1h2","Nr1h1","Nr1h3","Nr1h4","Nr1h5","Ppara","Pparg","Ppargc1b","Ppard")
################ HSC gene markers ##########################33
VSMC <- c('Tagln', 'Tpm2','Acta2','Cnn1','Pln','Myh11')
FB <- c('Gsn','Clec3b','Dpt','Cd34','Mfap4','Entpd2','Fbln2','Col15a1')
HSC_all <- c('Ecm1', 'Colec11','Vipr1','Reln','Lrat','Pth1r','Hgf','Rgs5')
HSC_PV <- c('Ngfr','Igfbp3','Rgs4','Il34','Itgb3')
HSC_PP <- c('Loxl1','Sox4','Podn','Adamtsl2','Rspo3','Spon2')
HSC_combined <- c(HSC_all, HSC_PV, HSC_PP,FB,VSMC )
########## endothelial gene markers #########################
Endo_PC <- c('Wnt9b', 'Rspo3', 'Cdh13', 'Wnt2')
Endo_PP <- c('Ednrb', 'Jag1', 'Lrg1', 'Efnb1', 'Ltbp4', 'Adgrg6')
LSEC <- c('Fcgr2b','Gpr182')
MS_list <- c('Kdr','Aqp1','Fcgr2b','Gpr182','Colec11','Ecm1','Lrat','Dcn','Gsn','Clec3b','Dpt','Alb','Ttr','Apoa1','Serpina1c','Clec4f','Csf1r','Tagln','Tpm2','Acta2','Irf8','Itgax','Il2rb','Nkg7','Cd3g','Cxcr6','Cd79a','Cd79b','Jchain','Ptprc','Sox9','Epcam','Krt7','Krt19','Osm','Ccl9','Top2a')
MS_list1 <- c('Sox9','Epcam','Krt7','Krt19','Alb','Ttr','Apoa1','Serpina1c','Ptprc','Irf8','Itgax','Clec4f','Csf1r','Jchain','Cd79a','Cd79b','Top2a','Kdr','Aqp1','Fcgr2b','Gpr182','Tagln','Tpm2','Acta2','Gsn','Clec3b','Dpt','Dcn','Colec11','Ecm1','Lrat','Il2rb','Nkg7','Cd3g','Cxcr6')
MS_list2 <- c('Sox9','Epcam','Krt7','Krt19','Alb','Ttr','Apoa1','Serpina1c','Cyp2e1','Cyp2f2','Ptprc','Irf8','Itgax','Clec4f','Csf1r','Top2a','Kdr','Aqp1','Fcgr2b','Gpr182','Dpt','Dcn','Colec11','Ecm1','Lrat','Il2rb','Nkg7','Cd3g','Cxcr6')
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KdGlzc3VlX29mX2ludGVyZXN0ID0gIkxpdmVyIgpsaWJyYXJ5KGhlcmUpCnNvdXJjZSgiL3Jlc3RyaWN0ZWQvcHJvamVjdG5iL3dheG1hbmxhYi9ra2Fycmkvc2NSTkFzZXFfZGF0YV9pbnRlZ3JhdGlvbi9ib2lsZXJwbGF0ZS5SIikKI3Rpc3MgPSBsb2FkX3Rpc3N1ZV9kcm9wbGV0KHRpc3N1ZV9vZl9pbnRlcmVzdCkKI2xpYnJhcnkoc2NhdGVyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShjb3dwbG90KQojbGlicmFyeShNQVNUKQpgYGAKIyMgYWdncmVnYXRlIEcxODVNMyBhbmQgRzE4NSBNNCB3aGljaCBhcmUgZGNhczkgYW5kIGxuYzU5OTggc2FtcGxlcy4gCgpgYGB7cn0KIyMgYWdncmVnYXRlIEcxODVNMyBhbmQgRzE4NSBNNCB3aGljaCBhcmUgZGNhczkgYW5kIGxuYzU5OTggc2FtcGxlcy4gCgpzYW1wbGVzMSA8LSByZWFkLmNzdihmaWxlLnBhdGgoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpMi9jZWxscmFuZ2VyX0tPX2FnZ3IyL291dHMvYWdncmVnYXRpb24uY3N2IiksIHN0cmluZ3NBc0ZhY3RvcnM9RikKcmF3LmRhdGExIDwtIFJlYWQxMFgoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpMi9jZWxscmFuZ2VyX0tPX2FnZ3IyL291dHMvZmlsdGVyZWRfZmVhdHVyZV9iY19tYXRyaXgiKQpHMTg1TTNNNCA8LSBDcmVhdGVTZXVyYXRPYmplY3QocmF3LmRhdGExKSAgICMgZHJvcHNlcQoKY2VsbGNvZGVzIDwtIGFzLmRhdGEuZnJhbWUoRzE4NU0zTTRAYXNzYXlzJFJOQUBjb3VudHNARGltbmFtZXNbWzJdXSkKY29sbmFtZXMoY2VsbGNvZGVzKSA8LSAiYmFyY29kZXMiCnJvd25hbWVzKGNlbGxjb2RlcykgPC0gY2VsbGNvZGVzJGJhcmNvZGVzCmNlbGxjb2RlcyRsaWJjb2RlcyA8LSBhcy5mYWN0b3IoZ3N1YihwYXR0ZXJuPSIuKy0iLCByZXBsYWNlbWVudD0iIiwgY2VsbGNvZGVzJGJhcmNvZGVzKSkKY2VsbGNvZGVzJHNhbXBsZXMgPC0gYXMudmVjdG9yKHNhbXBsZXMxJGxpYnJhcnlfaWRbY2VsbGNvZGVzJGxpYmNvZGVzXSkKc2FtcGxlaWRlbnRpdHkgPC0gY2VsbGNvZGVzWyJzYW1wbGVzIl0KCkcxODVNM000IDwtIEFkZE1ldGFEYXRhKG9iamVjdD1HMTg1TTNNNCxzYW1wbGVpZGVudGl0eSkKY3RybF9hZ2dyMSA8LSBHMTg1TTNNNCAKY3RybF9hZ2dyMSA8LSAgc3Vic2V0KGN0cmxfYWdncjEsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDIwMCAmIG5Db3VudF9STkEgPiA1MDApCmN0cmxfYWdncjEgPC0gTm9ybWFsaXplRGF0YShjdHJsX2FnZ3IxLCB2ZXJib3NlID0gRkFMU0UpCmN0cmxfYWdncjEgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoY3RybF9hZ2dyMSwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQpjdHJsX2FnZ3IxIDwtIFNDVHJhbnNmb3JtKGN0cmxfYWdncjEpCmN0cmxfYWdncjFbWyJwZXJjZW50Lm10Il1dIDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KGN0cmxfYWdncjEsIHBhdHRlcm4gPSAiXm10LSIpCkRlZmF1bHRBc3NheShjdHJsX2FnZ3IxKSA8LSAiU0NUIgpjdHJsX2FnZ3IxIDwtIFNjYWxlRGF0YShjdHJsX2FnZ3IxLHZhcnMudG8ucmVncmVzcyA9ICJwZXJjZW50Lm10IiwgdmVyYm9zZSA9IEZBTFNFKQpjdHJsX2FnZ3IxIDwtIFJ1blBDQShjdHJsX2FnZ3IxLCBucGNzID0gMTAwLCB2ZXJib3NlID0gRkFMU0UpCmN0cmxfYWdncjEgPC0gUnVuVU1BUChjdHJsX2FnZ3IxLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCmN0cmxfYWdncjEgPC0gRmluZE5laWdoYm9ycyhjdHJsX2FnZ3IxLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCmN0cmxfYWdncjEgPC0gRmluZENsdXN0ZXJzKGN0cmxfYWdncjEsIHJlc29sdXRpb24gPSAwLjIpICAgCgpjdHJsX2FnZ3IxX3AxLjEgPC0gRGltUGxvdChjdHJsX2FnZ3IxLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsID0gVFJVRSkgIApjdHJsX2FnZ3IxX3AxLjIgPC0gRGltUGxvdChjdHJsX2FnZ3IxLCByZWR1Y3Rpb24gPSAidW1hcCIsIHNwbGl0LmJ5ID0gInNhbXBsZXMiLGxhYmVsID0gVFJVRSkgICAKY3RybF9hZ2dyMV9wMS4zIDwtIERpbVBsb3QoY3RybF9hZ2dyMSwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJzYW1wbGVzIikgCnBsb3RfZ3JpZChjdHJsX2FnZ3IxX3AxLjEsY3RybF9hZ2dyMV9wMS4yKQoKTVNfbGlzdDIgPC0gYygnU294OScsJ0VwY2FtJywnS3J0NycsJ0tydDE5JywnQWxiJywnVHRyJywnQXBvYTEnLCdTZXJwaW5hMWMnLCdDeXAyZTEnLCAnR2x1bCcsICdPYXQnLCAnR3VsbycsCiAgICAgICAgICAgICAgJ0FzczEnLCAnSGFtcCcsICdHc3RwMScsICdVYmInLAogICAgICAgICAgICAgICdDeXAyZjInLCAnUGNrMScsICdIYWwnLCAnQ2RoMScsICdQdHByYycsJ0lyZjgnLCdJdGdheCcsJ0NsZWM0ZicsJ0NzZjFyJywnVG9wMmEnLCdLZHInLCdBcXAxJywnRmNncjJiJywnR3ByMTgyJywnRGNuJywnQ29sZWMxMScsJ0VjbTEnLCdMcmF0JywnSWwycmInLCdOa2c3JywnQ2QzZycsJ0N4Y3I2JykKCgoKRGVmYXVsdEFzc2F5KGN0cmxfYWdncjEpIDwtICJSTkEiCmN0cmxfYWdncjEgPC0gTm9ybWFsaXplRGF0YShjdHJsX2FnZ3IxKQpjdHJsX2FnZ3IxX2QxLjEgPC1Eb3RQbG90KGN0cmxfYWdncjEsIGZlYXR1cmVzID0gTVNfbGlzdDIpK1JvdGF0ZWRBeGlzKCkKY3RybF9hZ2dyMV9kMS4yIDwtRG90UGxvdChjdHJsX2FnZ3IxLCBmZWF0dXJlcyA9ICJOZXdsbmMtaW50ZXItYzctNTk5OCIsc3BsaXQuYnkgPSAic2FtcGxlcyIpICAgCmN0cmxfYWdncjFfdjEuMTwtIFZsblBsb3QoY3RybF9hZ2dyMSwgZmVhdHVyZXMgPSAiTmV3bG5jLWludGVyLWM3LTU5OTgiLCBzcGxpdC5ieSA9ICJzYW1wbGVzIiwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIiwgcHQuc2l6ZSA9IDAsIGNvbWJpbmUgPSBGQUxTRSkKCnBsb3RfZ3JpZChjdHJsX2FnZ3IxX3AxLjEsY3RybF9hZ2dyMV9kMS4xKQpwbG90X2dyaWQoY3RybF9hZ2dyMV9wMS4xLGN0cmxfYWdncjFfcDEuMixjdHJsX2FnZ3IxX2QxLjEpCgojIyMjIyMjIyBHZXQgc29tZSBudW1iZXJzIGFuZCBzdGF0cyBmb3IgYXZlcmdhZ2UgZXhwcmVzc2lvbiAjIyMjIyMKdGFibGUoRmV0Y2hEYXRhKGN0cmxfYWdncjEsIGMoJ3NhbXBsZXMnLCdpZGVudCcpKSkKeCA8LSAoQXZlcmFnZUV4cHJlc3Npb24oS08uY2VsbHMsIHZlcmJvc2UgPSBUUlVFLCBhc3NheXMgPSAiUk5BIiAsc2xvdD0iY291bnRzIikkUk5BKQp4WyJuY1JOQS1pbnRlci1jaHI3LTU5OTgiLF0KCnNhdmUoY3RybF9hZ2dyMSxmaWxlID0iL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxODUvRzE4NU0zTTRfc3ViaGVwX1NDVF9QQzMwX3JlczAuMl9HQi5SZGF0YSIpCgoKYGBgCgoKCmBgYHtyfQpjdHJsX2FnZ3IyOV9zdWJoZXAgPC0gc3Vic2V0KGN0cmxfYWdncjEsaWRlbnRzID0gYygnMCcpKQoKY3RybF9hZ2dyMjlfc3ViaGVwIDwtIE5vcm1hbGl6ZURhdGEoY3RybF9hZ2dyMjlfc3ViaGVwKQpjdHJsX2FnZ3IyOV9zdWJoZXAgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoY3RybF9hZ2dyMjlfc3ViaGVwLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCmN0cmxfYWdncjI5X3N1YmhlcCRzdGltIDwtICJjdHJsX2FnZ3IyOV9zdWJoZXAiCmN0cmxfYWdncjI5X3N1YmhlcCA8LSBTQ1RyYW5zZm9ybShjdHJsX2FnZ3IyOV9zdWJoZXApICAjIGNoZWNrIHRvIHNlZSBpZiBpdCByZW1vdmUgYmF0Y2ggZWZmZWN0cwpjdHJsX2FnZ3IyOV9zdWJoZXBbWyJwZXJjZW50Lm10Il1dIDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KGN0cmxfYWdncjI5X3N1YmhlcCwgcGF0dGVybiA9ICJebXQtIikKRGVmYXVsdEFzc2F5KGN0cmxfYWdncjI5X3N1YmhlcCkgPC0gIlNDVCIKCmN0cmxfYWdncjI5X3N1YmhlcCA8LSBTY2FsZURhdGEoY3RybF9hZ2dyMjlfc3ViaGVwLCB2YXJzLnRvLnJlZ3Jlc3MgPSAicGVyY2VudC5tdCIpCmN0cmxfYWdncjI5X3N1YmhlcCA8LSBSdW5QQ0EoY3RybF9hZ2dyMjlfc3ViaGVwLCBucGNzID0gMTAwKQpjdHJsX2FnZ3IyOV9zdWJoZXAgPC0gUnVuVU1BUChjdHJsX2FnZ3IyOV9zdWJoZXAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToxMCkKY3RybF9hZ2dyMjlfc3ViaGVwIDwtIEZpbmROZWlnaGJvcnMoY3RybF9hZ2dyMjlfc3ViaGVwLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MTApCmN0cmxfYWdncjI5X3N1YmhlcCA8LSBGaW5kQ2x1c3RlcnMoY3RybF9hZ2dyMjlfc3ViaGVwLCByZXNvbHV0aW9uID0gMC4yKQoKY3RybF9hZ2dyMjlfc3ViaGVwX3AxLjEgPC0gRGltUGxvdChjdHJsX2FnZ3IyOV9zdWJoZXAsIGxhYmVsPVRSVUUpCmN0cmxfYWdncjI5X3N1YmhlcF9wMS4yIDwtIERpbVBsb3QoY3RybF9hZ2dyMjlfc3ViaGVwLGdyb3VwLmJ5ID0gInNhbXBsZXMiLCBsYWJlbD1UUlVFKQpwbG90X2dyaWQoY3RybF9hZ2dyMjlfc3ViaGVwX3AxLjEsY3RybF9hZ2dyMjlfc3ViaGVwX3AxLjIpCgpEZWZhdWx0QXNzYXkoY3RybF9hZ2dyMjlfc3ViaGVwKSA8LSAiUk5BIgpjdHJsX2FnZ3IyOV9zdWJoZXAgPC0gTm9ybWFsaXplRGF0YShjdHJsX2FnZ3IyOV9zdWJoZXApCmN0cmxfYWdncjI5X3N1YmhlcF9kMS4xIDwtICBEb3RQbG90KGN0cmxfYWdncjI5X3N1YmhlcCxmZWF0dXJlcyA9ICJOZXdsbmMtaW50ZXItYzctNTk5OCIpICtSb3RhdGVkQXhpcygpCmN0cmxfYWdncjI5X3N1YmhlcF9mMS4xIDwtICBGZWF0dXJlUGxvdChjdHJsX2FnZ3IyOV9zdWJoZXAsZmVhdHVyZXMgPSAiTmV3bG5jLWludGVyLWM3LTU5OTgiKSArUm90YXRlZEF4aXMoKQpjdHJsX2FnZ3IyOV9zdWJoZXBfdjEuMSA8LSAgVmxuUGxvdChjdHJsX2FnZ3IyOV9zdWJoZXAsZmVhdHVyZXMgPSAiTmV3bG5jLWludGVyLWM3LTU5OTgiLHNvcnQgPSBUUlVFLHNwbGl0LmJ5ID0gInNhbXBsZXMiLHB0LnNpemUgPSAwKSArUm90YXRlZEF4aXMoKQoKdGFibGUoRmV0Y2hEYXRhKGN0cmxfYWdncjI5X3N1YmhlcCwgYygnc2FtcGxlcycsJ2lkZW50JykpKQpzYXZlKGN0cmxfYWdncjI5X3N1YmhlcCxmaWxlID0iL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxODUvRzE4NU0zTTRfc3ViaGVwX1NDVF9QQzEwX3JlczAuMl9HQi5SZGF0YSIpCgpgYGAKCiMjIGFnZ3JlZ2F0ZSBHMTg1TTMgYW5kIEcxODUgTTUgd2hpY2ggYXJlIGRjYXM5IGFuZCBsbmM1OTk4IHNhbXBsZXMuIAoKYGBge3J9CiMjIGFnZ3JlZ2F0ZSBHMTg1TTMgYW5kIEcxODUgTTUgd2hpY2ggYXJlIGRjYXM5IGFuZCBsbmM1OTk4IHNhbXBsZXMuIApzYW1wbGVzMiA8LSByZWFkLmNzdihmaWxlLnBhdGgoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpMi9jZWxscmFuZ2VyX0tPX2FnZ3IzL291dHMvYWdncmVnYXRpb24uY3N2IiksIHN0cmluZ3NBc0ZhY3RvcnM9RikKCiMjIyMgYWdncmVhZ3RlIGdlbmVib2R5IGNvdW50cyBmb2xkZXIgZnJvbSBjZWxscmFuZ2VyIGZvciBHMTg1TTMgYW5kIEcxODVNNSBhZ2dyZWdhdGVkIHRvZ2V0aGVyCnJhdy5kYXRhMiA8LSBSZWFkMTBYKCIvcmVzdHJpY3RlZC9wcm9qZWN0bmIvd2F4bWFubGFiL2trYXJyaTIvY2VsbHJhbmdlcl9LT19hZ2dyMy9vdXRzL2ZpbHRlcmVkX2ZlYXR1cmVfYmNfbWF0cml4IikKRzE4NU0zTTUgPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KHJhdy5kYXRhMikgICAjIGRyb3BzZXEKCmNlbGxjb2RlcyA8LSBhcy5kYXRhLmZyYW1lKEcxODVNM001QGFzc2F5cyRSTkFAY291bnRzQERpbW5hbWVzW1syXV0pCmNvbG5hbWVzKGNlbGxjb2RlcykgPC0gImJhcmNvZGVzIgpyb3duYW1lcyhjZWxsY29kZXMpIDwtIGNlbGxjb2RlcyRiYXJjb2RlcwpjZWxsY29kZXMkbGliY29kZXMgPC0gYXMuZmFjdG9yKGdzdWIocGF0dGVybj0iListIiwgcmVwbGFjZW1lbnQ9IiIsIGNlbGxjb2RlcyRiYXJjb2RlcykpCmNlbGxjb2RlcyRzYW1wbGVzIDwtIGFzLnZlY3RvcihzYW1wbGVzMiRsaWJyYXJ5X2lkW2NlbGxjb2RlcyRsaWJjb2Rlc10pCnNhbXBsZWlkZW50aXR5IDwtIGNlbGxjb2Rlc1sic2FtcGxlcyJdCgpHMTg1TTNNNSA8LSBBZGRNZXRhRGF0YShvYmplY3Q9RzE4NU0zTTUsc2FtcGxlaWRlbnRpdHkpCmN0cmxfYWdncjIgPC0gRzE4NU0zTTUgCgpjdHJsX2FnZ3IyIDwtICBzdWJzZXQoY3RybF9hZ2dyMiwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gMjAwICYgbkNvdW50X1JOQSA+IDUwMCkKY3RybF9hZ2dyMiA8LSBOb3JtYWxpemVEYXRhKGN0cmxfYWdncjIsIHZlcmJvc2UgPSBGQUxTRSkKY3RybF9hZ2dyMiA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhjdHJsX2FnZ3IyLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCmN0cmxfYWdncjIgPC0gU0NUcmFuc2Zvcm0oY3RybF9hZ2dyMikKY3RybF9hZ2dyMltbInBlcmNlbnQubXQiXV0gPC0gUGVyY2VudGFnZUZlYXR1cmVTZXQoY3RybF9hZ2dyMiwgcGF0dGVybiA9ICJebXQtIikKRGVmYXVsdEFzc2F5KGN0cmxfYWdncjIpIDwtICJTQ1QiCmN0cmxfYWdncjIgPC0gU2NhbGVEYXRhKGN0cmxfYWdncjIsdmFycy50by5yZWdyZXNzID0gInBlcmNlbnQubXQiLCB2ZXJib3NlID0gRkFMU0UpCmN0cmxfYWdncjIgPC0gUnVuUENBKGN0cmxfYWdncjIsIG5wY3MgPSAxMDAsIHZlcmJvc2UgPSBGQUxTRSkKY3RybF9hZ2dyMiA8LSBSdW5VTUFQKGN0cmxfYWdncjIsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToxMSkKY3RybF9hZ2dyMiA8LSBGaW5kTmVpZ2hib3JzKGN0cmxfYWdncjIsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToxMSkKY3RybF9hZ2dyMiA8LSBGaW5kQ2x1c3RlcnMoY3RybF9hZ2dyMiwgcmVzb2x1dGlvbiA9IDAuNSkgICAKCmN0cmxfYWdncjJfcDEuMSA8LSBEaW1QbG90KGN0cmxfYWdncjIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFKSAgCmN0cmxfYWdncjJfcDEuMiA8LSBEaW1QbG90KGN0cmxfYWdncjIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgc3BsaXQuYnkgPSAic2FtcGxlcyIsbGFiZWwgPSBUUlVFKSAgIApjdHJsX2FnZ3IyX3AxLjMgPC0gRGltUGxvdChjdHJsX2FnZ3IyLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gInNhbXBsZXMiKSAKcGxvdF9ncmlkKGN0cmxfYWdncjJfcDEuMSxjdHJsX2FnZ3IyX3AxLjIpCgpNU19saXN0MiA8LSBjKCdTb3g5JywnRXBjYW0nLCdLcnQ3JywnS3J0MTknLCdBbGInLCdUdHInLCdBcG9hMScsJ1NlcnBpbmExYycsJ0N5cDJlMScsJ0N5cDJmMicsJ1B0cHJjJywnSXJmOCcsJ0l0Z2F4JywnQ2xlYzRmJywnQ3NmMXInLCdUb3AyYScsJ0tkcicsJ0FxcDEnLCdGY2dyMmInLCdHcHIxODInLCdEY24nLCdDb2xlYzExJywnRWNtMScsJ0xyYXQnLCdJbDJyYicsJ05rZzcnLCdDZDNnJywnQ3hjcjYnKQoKCgpEZWZhdWx0QXNzYXkoY3RybF9hZ2dyMikgPC0gIlJOQSIKY3RybF9hZ2dyMiA8LSBTY2FsZURhdGEoY3RybF9hZ2dyMikKCmN0cmxfYWdncjIgPC0gTm9ybWFsaXplRGF0YShjdHJsX2FnZ3IyKQoKY3RybF9hZ2dyMl9kMS4xIDwtRG90UGxvdChjdHJsX2FnZ3IyLCBmZWF0dXJlcyA9IE1TX2xpc3QyKStSb3RhdGVkQXhpcygpCmN0cmxfYWdncjJfZDEuMiA8LURvdFBsb3QoY3RybF9hZ2dyMiwgZmVhdHVyZXMgPSAiKEdtMTMwMjEpTmV3bG5jLWludGVyLWM0LTM3NzkiLHNwbGl0LmJ5ID0gInNhbXBsZXMiLCBjb2xzPWMoInJlZCIsImJsdWUiKSkgICAKY3RybF9hZ2dyMl92MS4xPC0gVmxuUGxvdChjdHJsX2FnZ3IyLCBmZWF0dXJlcyA9ICIoR20xMzAyMSlOZXdsbmMtaW50ZXItYzQtMzc3OSIsIHNwbGl0LmJ5ID0gInNhbXBsZXMiLCBncm91cC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiLCBwdC5zaXplID0gMCwgY29tYmluZSA9IEZBTFNFKQoKY3RybF9hZ2dyMl9oMTEgPC0gRG9IZWF0bWFwKGN0cmxfYWdncjIsIGZlYXR1cmVzID0gYygiKEdtMTMwMjEpTmV3bG5jLWludGVyLWM0LTM3NzkiLCJOZXdsbmMtaW50ZXItYzctNTk5OCIpLCBzaXplID0gMyxhc3NheSA9ICJSTkEiLHNsb3QgPSAnZGF0YScpCgpjdHJsX2FnZ3IyX2YxLjIgPC0gRmVhdHVyZVBsb3QoY3RybF9hZ2dyMixmZWF0dXJlcyA9IGMoJyhHbTEzMDIxKU5ld2xuYy1pbnRlci1jNC0zNzc5JywnTmV3bG5jLWludGVyLWM3LTU5OTgnKSxvcmRlcj1UUlVFLGxhYmVsID0gVFJVRSkKCnBsb3RfZ3JpZChjdHJsX2FnZ3IyX3AxLjEsY3RybF9hZ2dyMl9kMS4xKQpwbG90X2dyaWQoY3RybF9hZ2dyMl9wMS4xLGN0cmxfYWdncjJfcDEuMixjdHJsX2FnZ3IyX2QxLjEpCgojIyMjIyMjIyBHZXQgc29tZSBudW1iZXJzIGFuZCBzdGF0cyBmb3IgYXZlcmdhZ2UgZXhwcmVzc2lvbiAjIyMjIyMKdGFibGUoRmV0Y2hEYXRhKGN0cmxfYWdncjIsIGMoJ3NhbXBsZXMnLCdpZGVudCcpKSkKeCA8LSAoQXZlcmFnZUV4cHJlc3Npb24oS08uY2VsbHMsIHZlcmJvc2UgPSBUUlVFLCBhc3NheXMgPSAiUk5BIiAsc2xvdD0iY291bnRzIikkUk5BKQp4WyJuY1JOQS1pbnRlci1jaHI3LTU5OTgiLF0KCnNhdmUoY3RybF9hZ2dyMixmaWxlID0iL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxODUvRzE4NU0zTTVfU0NUX1BDMTFfcmVzMC41X0dCLlJkYXRhIikKCgpgYGAKCmBgYHtyfQoKIyMgYWdncmVnYXRlIEcxODVNMyBhbmQgRzE4NSBNNSB3aGljaCBhcmUgZGNhczkgYW5kIGxuYzU5OTggc2FtcGxlcy4gCnNhbXBsZXMzIDwtIHJlYWQuY3N2KGZpbGUucGF0aCgiL3Jlc3RyaWN0ZWQvcHJvamVjdG5iL3dheG1hbmxhYi9ra2FycmkyL2NlbGxyYW5nZXJfS09fYWdncjRfR0Ivb3V0cy9hZ2dyZWdhdGlvbi5jc3YiKSwgc3RyaW5nc0FzRmFjdG9ycz1GKQoKIyMjIyBhZ2dyZWFndGUgZ2VuZWJvZHkgY291bnRzIGZvbGRlciBmcm9tIGNlbGxyYW5nZXIgZm9yIEcxODVNMyBhbmQgRzE4NU01IGFnZ3JlZ2F0ZWQgdG9nZXRoZXIKcmF3LmRhdGEzIDwtIFJlYWQxMFgoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpMi9jZWxscmFuZ2VyX0tPX2FnZ3I0X0dCL291dHMvZmlsdGVyZWRfZmVhdHVyZV9iY19tYXRyaXgiKQpHMTg1TTRNNSA8LSBDcmVhdGVTZXVyYXRPYmplY3QocmF3LmRhdGEzKSAgICMgZHJvcHNlcQoKY2VsbGNvZGVzIDwtIGFzLmRhdGEuZnJhbWUoRzE4NU00TTVAYXNzYXlzJFJOQUBjb3VudHNARGltbmFtZXNbWzJdXSkKY29sbmFtZXMoY2VsbGNvZGVzKSA8LSAiYmFyY29kZXMiCnJvd25hbWVzKGNlbGxjb2RlcykgPC0gY2VsbGNvZGVzJGJhcmNvZGVzCmNlbGxjb2RlcyRsaWJjb2RlcyA8LSBhcy5mYWN0b3IoZ3N1YihwYXR0ZXJuPSIuKy0iLCByZXBsYWNlbWVudD0iIiwgY2VsbGNvZGVzJGJhcmNvZGVzKSkKY2VsbGNvZGVzJHNhbXBsZXMgPC0gYXMudmVjdG9yKHNhbXBsZXMzJGxpYnJhcnlfaWRbY2VsbGNvZGVzJGxpYmNvZGVzXSkKc2FtcGxlaWRlbnRpdHkgPC0gY2VsbGNvZGVzWyJzYW1wbGVzIl0KCkcxODVNNE01IDwtIEFkZE1ldGFEYXRhKG9iamVjdD1HMTg1TTRNNSxzYW1wbGVpZGVudGl0eSkKY3RybF9hZ2dyMyA8LSBHMTg1TTRNNSAKCmN0cmxfYWdncjMgPC0gIHN1YnNldChjdHJsX2FnZ3IzLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiAyMDAgJiBuQ291bnRfUk5BID4gNTAwKQpjdHJsX2FnZ3IzIDwtIE5vcm1hbGl6ZURhdGEoY3RybF9hZ2dyMywgdmVyYm9zZSA9IEZBTFNFKQpjdHJsX2FnZ3IzIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKGN0cmxfYWdncjMsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKY3RybF9hZ2dyMyA8LSBTQ1RyYW5zZm9ybShjdHJsX2FnZ3IzKQpjdHJsX2FnZ3IzW1sicGVyY2VudC5tdCJdXSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChjdHJsX2FnZ3IzLCBwYXR0ZXJuID0gIl5tdC0iKQpEZWZhdWx0QXNzYXkoY3RybF9hZ2dyMykgPC0gIlNDVCIKY3RybF9hZ2dyMyA8LSBTY2FsZURhdGEoY3RybF9hZ2dyMyx2YXJzLnRvLnJlZ3Jlc3MgPSAicGVyY2VudC5tdCIsIHZlcmJvc2UgPSBGQUxTRSkKY3RybF9hZ2dyMyA8LSBSdW5QQ0EoY3RybF9hZ2dyMywgbnBjcyA9IDEwMCwgdmVyYm9zZSA9IEZBTFNFKQpjdHJsX2FnZ3IzIDwtIFJ1blVNQVAoY3RybF9hZ2dyMywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjExKQpjdHJsX2FnZ3IzIDwtIEZpbmROZWlnaGJvcnMoY3RybF9hZ2dyMywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjExKQpjdHJsX2FnZ3IzIDwtIEZpbmRDbHVzdGVycyhjdHJsX2FnZ3IzLCByZXNvbHV0aW9uID0gMC4zKSAgIAoKY3RybF9hZ2dyM19wMS4xIDwtIERpbVBsb3QoY3RybF9hZ2dyMywgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFRSVUUpICAKY3RybF9hZ2dyM19wMS4yIDwtIERpbVBsb3QoY3RybF9hZ2dyMywgcmVkdWN0aW9uID0gInVtYXAiLCBzcGxpdC5ieSA9ICJzYW1wbGVzIixsYWJlbCA9IFRSVUUpICAgCmN0cmxfYWdncjNfcDEuMyA8LSBEaW1QbG90KGN0cmxfYWdncjMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAic2FtcGxlcyIpIApwbG90X2dyaWQoY3RybF9hZ2dyM19wMS4xLGN0cmxfYWdncjNfcDEuMikKCk1TX2xpc3QyIDwtIGMoJ1NveDknLCdFcGNhbScsJ0tydDcnLCdLcnQxOScsJ0FsYicsJ1R0cicsJ0Fwb2ExJywnU2VycGluYTFjJywnQ3lwMmUxJywnQ3lwMmYyJywnUHRwcmMnLCdJcmY4JywnSXRnYXgnLCdDbGVjNGYnLCdDc2YxcicsJ1RvcDJhJywnS2RyJywnQXFwMScsJ0ZjZ3IyYicsJ0dwcjE4MicsJ0RjbicsJ0NvbGVjMTEnLCdFY20xJywnTHJhdCcsJ0lsMnJiJywnTmtnNycsJ0NkM2cnLCdDeGNyNicpCgoKRGVmYXVsdEFzc2F5KGN0cmxfYWdncjMpIDwtICJSTkEiCmN0cmxfYWdncjMgPC0gTm9ybWFsaXplRGF0YShjdHJsX2FnZ3IzKQpjdHJsX2FnZ3IzX2QxLjEgPC1Eb3RQbG90KGN0cmxfYWdncjMsIGZlYXR1cmVzID0gTVNfbGlzdDIpK1JvdGF0ZWRBeGlzKCkKY3RybF9hZ2dyM19kMS4yIDwtRG90UGxvdChjdHJsX2FnZ3IzLCBmZWF0dXJlcyA9ICIoR20xMzAyMSlOZXdsbmMtaW50ZXItYzQtMzc3OSIsc3BsaXQuYnkgPSAic2FtcGxlcyIsIGNvbHM9YygicmVkIiwiYmx1ZSIpKSAgIApjdHJsX2FnZ3IzX3YxLjE8LSBWbG5QbG90KGN0cmxfYWdncjMsIGZlYXR1cmVzID0gIihHbTEzMDIxKU5ld2xuYy1pbnRlci1jNC0zNzc5Iiwgc3BsaXQuYnkgPSAic2FtcGxlcyIsIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIsIHB0LnNpemUgPSAwLCBjb21iaW5lID0gRkFMU0UpCmN0cmxfYWdncjNfcjEuMTwtIFJpZGdlUGxvdChjdHJsX2FnZ3IzLCBmZWF0dXJlcyA9IGMoIihHbTEzMDIxKU5ld2xuYy1pbnRlci1jNC0zNzc5IiwiTmV3bG5jLWludGVyLWM3LTU5OTgiKSwgc3BsaXQuYnkgPSAic2FtcGxlcyIsIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIsIHB0LnNpemUgPSAwLCBjb21iaW5lID0gRkFMU0UpCgpwbG90X2dyaWQoY3RybF9hZ2dyM19wMS4xLGN0cmxfYWdncjNfZDEuMSkKcGxvdF9ncmlkKGN0cmxfYWdncjNfcDEuMSxjdHJsX2FnZ3IzX3AxLjIsY3RybF9hZ2dyM19kMS4xKQoKIyMjIyMjIyMgR2V0IHNvbWUgbnVtYmVycyBhbmQgc3RhdHMgZm9yIGF2ZXJnYWdlIGV4cHJlc3Npb24gIyMjIyMjCnRhYmxlKEZldGNoRGF0YShjdHJsX2FnZ3IzLCBjKCdzYW1wbGVzJywnaWRlbnQnKSkpCnggPC0gKEF2ZXJhZ2VFeHByZXNzaW9uKEtPLmNlbGxzLCB2ZXJib3NlID0gVFJVRSwgYXNzYXlzID0gIlJOQSIgLHNsb3Q9ImNvdW50cyIpJFJOQSkKeFsibmNSTkEtaW50ZXItY2hyNy01OTk4IixdCgpzYXZlKGN0cmxfYWdncjMsZmlsZSA9Ii9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTg1L0cxODVNNE01X1NDVF9QQzExX3JlczAuM19HQi5SZGF0YSIpCgpgYGAKCgoKCmBgYHtyfQpnZW5lc19oZXBfbWFpbiA9YygnQWxiJywgJ1R0cicsICdBcG9hMScsICdTZXJwaW5hMWMnKQpnZW5lc19oZXAgPSBjKCdBbGInLCAnVHRyJywgJ0Fwb2ExJywgJ1NlcnBpbmExYycsCiAgICAgICAgICAgICAgICAgICAnQ3lwMmUxJywgJ0dsdWwnLCAnT2F0JywgJ0d1bG8nLAogICAgICAgICAgICAgICAgICAgJ0FzczEnLCAnSGFtcCcsICdHc3RwMScsICdVYmInLAogICAgICAgICAgICAgICAgICAgJ0N5cDJmMicsICdQY2sxJywgJ0hhbCcsICdDZGgxJykKZ2VuZXNfZW5kbzEgPSBjKCAnUGVjYW0xJywgJ05ycDEnLCAnS2RyJywnT2l0MycsJ0lnZmJwNycsJ0FxcDEnKQpnZW5lc19lbmRvMiA9IGMoJ0tkcicsJ09pdDMnLCdBcXAxJywnRWZuYjEnLCdXbnQyJykKZ2VuZXNfa3VwcGZlciA9IGMoICdDbGVjNGYnLCAnQ2Q2OCcpCmdlbmVzX25rID0gYygnSWwycmInLCAnTmtnNycsICdDeGNyNicsICdHem1hJykKZ2VuZXNfYiA9IGMoJ0NkNzlhJywgJ0NkNzliJykKZ2VuZXNfYmVjID0gYygnRXBjYW0nLCAnS3J0MTknLCAnS3J0NycpCmdlbmVzX2ltbXVuZSA9ICdQdHByYycKI0hTQyA9IGMoIkRjbiIsIkxhbWExIiwiTmVzIiwiTmdmciIpCkhTQz1jKCJDb2xlYzExIiwiRWNtMSIsIkhnZiIsIkxyYXQiLCJEY24iKQpEaXZpZGluZyA9ICJUb3AyYSIKQnBsYXNtYT0gIkpjaGFpbiIKTWFjPSAiQ3NmMXIiCkNob2w9IlNveDkiCkRDPWMoIklyZjgiLCJJdGdheCIpClRjZWxsPSJDZDNnIgpMU0VDPWMoJ0dwcjE4MicsJ0ZjZ3IyYicpCk5ld19NYWNyb3BoYWdlID0gYygnQ2NsOScsJ09zbScpCgpZX2dlbmVzIDwtIGMoIlV0eSIsIkRkeDN5IiwiS2RtNWQiLCJFaWYyczN5IiwJIkdtNDcyODMiKQpzZXggPC0gYygiQ3lwMmI5IiwgIm5jUk5BLWludGVyLWNoclgtMTUzOTQiLCJDeXAyYzY5IiwgJ011cDIwJywgJ011cDEnLCdNdXAxMicsICdNdXAyMScsICdDeXAyZDknKQpGX3NleCA8LSBjKCdTdWx0M2ExJywgJ0ExYmcnLCAnRm1vMycsICdDeXAyYjknLCAnU3VsdDJhMScsJ0N5cDJiMTMnKQphbGxfZ2VuZXMgPSBjKGdlbmVzX2hlcCwgZ2VuZXNfZW5kbyxMU0VDLCBnZW5lc19rdXBwZmVyLCBNYWMsZ2VuZXNfbmssIGdlbmVzX2IsIGdlbmVzX2JlYywgZ2VuZXNfaW1tdW5lLCBIU0NfYWxsLFZTTUMsRkIsIERpdmlkaW5nKQpBbGxfR2VuZXMgPSBjKGdlbmVzX2hlcF9tYWluLCBnZW5lc19lbmRvMixMU0VDLGdlbmVzX2t1cHBmZXIsTWFjLGdlbmVzX25rLGdlbmVzX2IsQnBsYXNtYSxnZW5lc19iZWMsZ2VuZXNfaW1tdW5lLEhTQyxWU01DLEZCLENob2wsREMsVGNlbGwsTmV3X01hY3JvcGhhZ2UpCnZsbnBsb3RfZ2VuZXMgPSBjKCdBbGInLCdBcXAxJywnRWZuYjEnLCdHcHIxODInLCdGY2dyMmInLCdXbnQyJywnQ2xlYzRmJywnQ3NmMXInLCdOa2c3JywnQ2Q3OWEnLCdKY2hhaW4nLCdOZ2ZyJywnR3NuJywnVGFnbG4nLCdJcmY4JywnQ2QzZycsJ1RvcDJhJywnT3NtJykKZ2VuZXNfYmVjX2JfaW1tdW5lICA9IGMoZ2VuZXNfYmVjLGdlbmVzX2IsZ2VuZXNfaW1tdW5lKQpnZW5lc196b25lcyA9IGMoJ0N5cDJlMScsICdHbHVsJywgJ09hdCcsICdHdWxvJywKICAgICAgICAgICAgICAnQXNzMScsICdIYW1wJywgJ0dzdHAxJywgJ1ViYicsCiAgICAgICAgICAgICAgJ0N5cDJmMicsICdQY2sxJywgJ0hhbCcsICdDZGgxJykKCkFsbF9zZXhfZ2VuZXMgPC0gYygnTXVwMTEnLCdNdXA3JywnRWxvdmwzJywnQ3lwNGExMmEnLCdUZmYzJywnU2NhcmE1JywnTXVwMTQnLCdHc3RwMicsJ0N5cDRhMTJiJywnTXVwMjAnLCdNdXAxMicsJ011cDIxJywnQ3lwMmQ5JywnTXVwMScsCiAgICAgICAgICAgICAgICAgICAnU3VsdDJhNScsJ1N1bHQyYTInLCdTdWx0MmEzJywnQ3lwM2ExNicsJ1N1bHQyYTYnLCdDeXAzYTQxYicsJ0N5cDNhNDQnLCdDeXAzYTQxYScsJ0N5cDJhNCcsJ1NsYzIyYTI2JywnU3VsdDNhMScsCidTdWx0MmExJywnQ3lwMmIxMycsJ0ExYmcnLCdGbW8zJywnQ3lwMmM2OScsJ0N5cDJiOScpCgojQWxsX3NleF9nZW5lcyA8LSBjKCdNdXAxMXxNdXA3fEVsb3ZsM3xDeXA0YTEyYXxUZmYzfFNjYXJhNXxNdXAxNHxHc3RwMnxDeXA0YTEyYnxNdXAyMHxNdXAxMnxNdXAyMXxDeXAyZDl8TXVwMXwKICAgICAgICAgICAgICAgICAgIyBTdWx0MmE1fFN1bHQyYTJ8U3VsdDJhM3xDeXAzYTE2fFN1bHQyYTZ8Q3lwM2E0MWJ8Q3lwM2E0NHxDeXAzYTQxYXxDeXAyYTR8U2xjMjJhMjZ8U3VsdDNhMXwKI1N1bHQyYTF8Q3lwMmIxM3xBMWJnfEZtbzN8Q3lwMmM2OXxDeXAyYjknKQoKQWxsX3NleF9nZW5lc19hbGwgPC0gYyhZX2dlbmVzLCAiKFhpc3QpTmV3bG5jLWludGVyLWNYLTE1Mzk0IiwgQWxsX3NleF9nZW5lcykKcmVjZXB0b3JfS08gPC0gYygibmNSTkEtaW50ZXItY2hyNy01OTk4IiwiQ3lwMmIxMCIsIk5yMWkyIiwiTnIxaTMiLCJQcGFyYSIsIlBwYXJnIiwiUHBhcmdjMWIiLCJQcGFyZCIpCmNlbGwgPC0gYygiU3RhYjIiLCJDc2YxciIsIkNkM2ciLCJFYmYxIiwiSXJmOCIsIlNveDkiLCJBcG9jMyIsIlRvcDJhIiwiRGNuIikKcmVjZXB0b3JfS08gPC0gYygiTnIxaTIiLCJOcjFpMyIsIk5yMWgyIiwiTnIxaDEiLCJOcjFoMyIsIk5yMWg0IiwiTnIxaDUiLCJQcGFyYSIsIlBwYXJnIiwiUHBhcmdjMWIiLCJQcGFyZCIpCgojIyMjIyMjIyMjIyMjIyMjIEhTQyBnZW5lIG1hcmtlcnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzMwoKVlNNQyA8LSBjKCdUYWdsbicsICdUcG0yJywnQWN0YTInLCdDbm4xJywnUGxuJywnTXloMTEnKQpGQiA8LSBjKCdHc24nLCdDbGVjM2InLCdEcHQnLCdDZDM0JywnTWZhcDQnLCdFbnRwZDInLCdGYmxuMicsJ0NvbDE1YTEnKQpIU0NfYWxsIDwtIGMoJ0VjbTEnLCAnQ29sZWMxMScsJ1ZpcHIxJywnUmVsbicsJ0xyYXQnLCdQdGgxcicsJ0hnZicsJ1JnczUnKQpIU0NfUFYgPC0gIGMoJ05nZnInLCdJZ2ZicDMnLCdSZ3M0JywnSWwzNCcsJ0l0Z2IzJykKSFNDX1BQIDwtIGMoJ0xveGwxJywnU294NCcsJ1BvZG4nLCdBZGFtdHNsMicsJ1JzcG8zJywnU3BvbjInKSAKCkhTQ19jb21iaW5lZCA8LSBjKEhTQ19hbGwsIEhTQ19QViwgSFNDX1BQLEZCLFZTTUMgKQoKIyMjIyMjIyMjIyBlbmRvdGhlbGlhbCBnZW5lIG1hcmtlcnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpFbmRvX1BDIDwtIGMoJ1dudDliJywgJ1JzcG8zJywgJ0NkaDEzJywgJ1dudDInKQpFbmRvX1BQIDwtIGMoJ0VkbnJiJywgJ0phZzEnLCAnTHJnMScsICdFZm5iMScsICdMdGJwNCcsICdBZGdyZzYnKQpMU0VDIDwtIGMoJ0ZjZ3IyYicsJ0dwcjE4MicpCgpNU19saXN0IDwtIGMoJ0tkcicsJ0FxcDEnLCdGY2dyMmInLCdHcHIxODInLCdDb2xlYzExJywnRWNtMScsJ0xyYXQnLCdEY24nLCdHc24nLCdDbGVjM2InLCdEcHQnLCdBbGInLCdUdHInLCdBcG9hMScsJ1NlcnBpbmExYycsJ0NsZWM0ZicsJ0NzZjFyJywnVGFnbG4nLCdUcG0yJywnQWN0YTInLCdJcmY4JywnSXRnYXgnLCdJbDJyYicsJ05rZzcnLCdDZDNnJywnQ3hjcjYnLCdDZDc5YScsJ0NkNzliJywnSmNoYWluJywnUHRwcmMnLCdTb3g5JywnRXBjYW0nLCdLcnQ3JywnS3J0MTknLCdPc20nLCdDY2w5JywnVG9wMmEnKQoKCk1TX2xpc3QxIDwtIGMoJ1NveDknLCdFcGNhbScsJ0tydDcnLCdLcnQxOScsJ0FsYicsJ1R0cicsJ0Fwb2ExJywnU2VycGluYTFjJywnUHRwcmMnLCdJcmY4JywnSXRnYXgnLCdDbGVjNGYnLCdDc2YxcicsJ0pjaGFpbicsJ0NkNzlhJywnQ2Q3OWInLCdUb3AyYScsJ0tkcicsJ0FxcDEnLCdGY2dyMmInLCdHcHIxODInLCdUYWdsbicsJ1RwbTInLCdBY3RhMicsJ0dzbicsJ0NsZWMzYicsJ0RwdCcsJ0RjbicsJ0NvbGVjMTEnLCdFY20xJywnTHJhdCcsJ0lsMnJiJywnTmtnNycsJ0NkM2cnLCdDeGNyNicpCgpNU19saXN0MiA8LSBjKCdTb3g5JywnRXBjYW0nLCdLcnQ3JywnS3J0MTknLCdBbGInLCdUdHInLCdBcG9hMScsJ1NlcnBpbmExYycsJ0N5cDJlMScsJ0N5cDJmMicsJ1B0cHJjJywnSXJmOCcsJ0l0Z2F4JywnQ2xlYzRmJywnQ3NmMXInLCdUb3AyYScsJ0tkcicsJ0FxcDEnLCdGY2dyMmInLCdHcHIxODInLCdEcHQnLCdEY24nLCdDb2xlYzExJywnRWNtMScsJ0xyYXQnLCdJbDJyYicsJ05rZzcnLCdDZDNnJywnQ3hjcjYnKQo=