1. load libraries

2. Load Seurat Object


#Load Seurat Object merged from cell lines and a control after filtration
load("../0-R_Objects/CD4Tcells_SCTnormalized_done_on_HPC_inluding_Patient_origin.robj")



# Visualize before Harmony integration
DimPlot(All_samples_Merged, 
              reduction = "umap", 
              group.by = "Patient_origin",
              label = TRUE, 
              label.box = TRUE) + 
      ggtitle("Before Harmony - By Cell Line")



DimPlot(All_samples_Merged, 
              reduction = "umap", 
              group.by = "cell_line",
              label = TRUE, 
              label.box = TRUE) + 
      ggtitle("Before Harmony - By Cell Line")


DimPlot(All_samples_Merged, 
              reduction = "umap", 
              group.by = "SCT_snn_res.0.5",
              label = TRUE, 
              label.box = TRUE) + 
      ggtitle("Before Harmony - By Clusters")


DimPlot(All_samples_Merged, 
              reduction = "umap", 
              group.by = "predicted.celltype.l1",
              label = TRUE, 
              label.box = TRUE) + 
      ggtitle("Before Harmony - By Annotation.l1")



DimPlot(All_samples_Merged, 
              reduction = "umap", 
              group.by = "predicted.celltype.l2",
              label = TRUE, 
              label.box = TRUE) + 
      ggtitle("Before Harmony - By Annotation.l2")


DimPlot(All_samples_Merged, 
              reduction = "umap", 
              group.by = "predicted.celltype.l3",
              label = TRUE, 
              label.box = TRUE) + 
      ggtitle("Before Harmony - By Annotation.l3")



table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$SCT_snn_res.0.5)
                   
                       0    1    2    3    4    5    6    7    8    9   10   11   12   13
  B intermediate       0    3    0    0    0    0    2    0    0    0    0    0    2    0
  B memory             8    6    1    0   85    0   30    2    0  115    4    0    1    0
  CD14 Mono            0    1    0    0    0    0    4    0    0    7    0    0    0    0
  CD4 CTL              0    0    0    0    0   12    0    0    0    0    0    0    0    1
  CD4 Naive            0    8    0    0    0  517    0    0 1479    0    0   37    0    1
  CD4 Proliferating 5448 2474 5388 2852 3954    0 3256 2863    6 1270 1407    0   93    0
  CD4 TCM            871 3414  522  269  536 4214  106   29 1838  457   46  425   49   54
  CD4 TEM              0    1    0    0    0   61    0    0   21    0    0    1    0    0
  CD8 Proliferating    0    0    0    0    1    0    0    0    0    1    0    0    0    0
  CD8 TCM              0    1    0   16    0    0    0    0    0    0    0    0    0    0
  CD8 TEM              0    1    0    8    3    0    2    0    0    1    0    0    0    0
  cDC1                 0    0    0    0    5    0    2    0    0    0    0    0    1    0
  cDC2                 0    1    2    0    3    0   10    0    0   36    0    0    0    1
  dnT                  0    3    1    1    1    0    2    0    0    3    0    1    3    0
  HSPC                57   10    1    0  211    0  678  483    0    5  358    0    2    0
  NK Proliferating     4   40   23 2785  237    0   10   12    0   22    1    0   27    0
  Treg                15   14    1    0    1    0    0    0    0    0    0    1   13    0

3. Perform Harmony Integration


# Perform Harmony integration
All_samples_Merged <- RunHarmony(All_samples_Merged, 
                                 group.by.vars = c("Patient_origin", "cell_line"), 
                                 reduction.use = "pca", 
                                 dim.use = 1:15,
                                 theta = c(1, 1),
                                 assay.use = "SCT")
Transposing data matrix
Initializing state using k-means centroids initialization
Harmony 1/10
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
*****************************Registered S3 method overwritten by 'rmarkdown':
  method         from
  print.paged_df     
*********************|
Harmony 2/10
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Harmony converged after 2 iterations
# Find neighbors using the Harmony reduction (you do not need to specify "reduction" here for FindNeighbors)
All_samples_Merged <- FindNeighbors(All_samples_Merged,reduction = "harmony", dims = 1:15)  # Use the first 16 PCs from Harmony integration
Computing nearest neighbor graph
Computing SNN
# Find clusters based on the neighbors found in the Harmony space
All_samples_Merged <- FindClusters(All_samples_Merged, reduction = "harmony", resolution = c(0.5))  # Clustering based on PC space (default)
Avis : The following arguments are not used: reductionAvis : The following arguments are not used: reduction
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 49372
Number of edges: 1485026

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8856
Number of communities: 14
Elapsed time: 16 seconds
# Run UMAP on the new Harmony reduction
All_samples_Merged <- RunUMAP(All_samples_Merged, reduction = "harmony", dims = 1:15, reduction.name = "umap.harmony")
Avis : The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session20:19:31 UMAP embedding parameters a = 0.9922 b = 1.112
20:19:31 Read 49372 rows and found 15 numeric columns
20:19:31 Using Annoy for neighbor search, n_neighbors = 30
20:19:31 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
20:19:37 Writing NN index file to temp file /tmp/RtmpoINXWz/file176a6f4d64d19c
20:19:37 Searching Annoy index using 1 thread, search_k = 3000
20:20:00 Annoy recall = 100%
20:20:01 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
20:20:05 Initializing from normalized Laplacian + noise (using RSpectra)
20:20:07 Commencing optimization for 200 epochs, with 2063492 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
20:20:38 Optimization finished

4. Visualize Harmony Integrated Data


# Visualization after Harmony

# By cell line
p3 <- DimPlot(All_samples_Merged, 
              reduction = "umap.harmony", 
              group.by = "cell_line",
              label = TRUE, 
              label.box = TRUE) + 
      ggtitle("After Harmony - By Cell Line")

# By clusters
p4 <- DimPlot(All_samples_Merged, 
              reduction = "umap.harmony", 
              group.by = "seurat_clusters",
              label = TRUE, 
              label.box = TRUE) + 
      ggtitle("After Harmony - By Clusters")

# By cell type annotations
p5 <- DimPlot(All_samples_Merged, 
              reduction = "umap.harmony", 
              group.by = "predicted.celltype.l2",
              label = TRUE, 
              label.box = TRUE) + 
      ggtitle("After Harmony - Cell Type Annotations")

# Print comparison plots
p3 + p4

print(p5)


DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "cell_line", label = T, label.box = T, repel = T) + 
  ggtitle("Harmony Integration - By Cell Line")

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "seurat_clusters",label = T, label.box = T, repel = T) + 
  ggtitle("Harmony Integration - By Clusters")

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "predicted.celltype.l2",label = T, label.box = T, repel = T) + 
  ggtitle("Harmony Integration - Annotations")


table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$cell_line)
                   
                      L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
  B intermediate       0    0    2    1    2    2    0    0        0
  B memory             0    0   11    1   38   82  120    0        0
  CD14 Mono            0    0    1    0    5    0    6    0        0
  CD4 CTL              0    0    0    0    0    0    0   12        1
  CD4 Naive            0    0    0    7    0    0    0  523     1512
  CD4 Proliferating 2461 2852 5452 5391 4732 4002 4115    0        6
  CD4 TCM           3320  270  887  562  178  557  517 4576     1963
  CD4 TEM              1    0    0    0    0    0    0   60       23
  CD8 Proliferating    0    0    0    0    0    1    1    0        0
  CD8 TCM              1   16    0    0    0    0    0    0        0
  CD8 TEM              1    8    0    0    2    3    1    0        0
  cDC1                 0    0    0    0    2    6    0    0        0
  cDC2                 0    0    0    4   11    3   35    0        0
  dnT                  2    3    0    1    2    5    2    0        0
  HSPC                 0    0   60    7 1035  213  490    0        0
  NK Proliferating    38 2785    6   24   11  259   38    0        0
  Treg                 1    1    9    9    4   15    6    0        0
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$seurat_clusters)
                   
                       0    1    2    3    4    5    6    7    8    9   10   11   12   13
  B intermediate       0    0    0    0    0    0    1    0    0    1    0    0    3    2
  B memory             0    1    6    7    0   36   10    0    2  135    1    0   52    2
  CD14 Mono            1    0    0    0    0    0    1    0    0   10    0    0    0    0
  CD4 CTL              6    0    0    0    4    0    0    0    0    3    0    0    0    0
  CD4 Naive         1417    4    0    0    2    1   51    0    0    1    0  559    0    7
  CD4 Proliferating  215 5820 4529 4351 2260 2287 1767 3187 2179  287 1176   46  907    0
  CD4 TCM           4978   92  156  929  122 2486 1624    8   48 1344    3  807  199   34
  CD4 TEM             74    0    0    0    1    2    4    0    0    0    0    3    0    0
  CD8 Proliferating    0    0    0    0    0    0    0    0    0    1    0    0    1    0
  CD8 TCM              0    1    0    2    1   12    0    0    0    1    0    0    0    0
  CD8 TEM              0    0    0    0    1    5    3    0    0    6    0    0    0    0
  cDC1                 0    0    0    0    0    0    0    0    1    2    0    0    5    0
  cDC2                 0    0    2    0    0    5    0    0    0   42    0    0    4    0
  dnT                  0    0    0    0    0    3    8    0    1    3    0    0    0    0
  HSPC                 0   74  963   33    2   56    8    8   76    3  537    0   39    6
  NK Proliferating    61   24  123    0 2650   35   88   85   81    4    1    0    9    0
  Treg                 0    0    0    0    0    0   41    0    1    1    0    0    0    2

Visualize Harmony Integrated Data distribution



table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$cell_line)
                   
                      L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
  B intermediate       0    0    2    1    2    2    0    0        0
  B memory             0    0   11    1   38   82  120    0        0
  CD14 Mono            0    0    1    0    5    0    6    0        0
  CD4 CTL              0    0    0    0    0    0    0   12        1
  CD4 Naive            0    0    0    7    0    0    0  523     1512
  CD4 Proliferating 2461 2852 5452 5391 4732 4002 4115    0        6
  CD4 TCM           3320  270  887  562  178  557  517 4576     1963
  CD4 TEM              1    0    0    0    0    0    0   60       23
  CD8 Proliferating    0    0    0    0    0    1    1    0        0
  CD8 TCM              1   16    0    0    0    0    0    0        0
  CD8 TEM              1    8    0    0    2    3    1    0        0
  cDC1                 0    0    0    0    2    6    0    0        0
  cDC2                 0    0    0    4   11    3   35    0        0
  dnT                  2    3    0    1    2    5    2    0        0
  HSPC                 0    0   60    7 1035  213  490    0        0
  NK Proliferating    38 2785    6   24   11  259   38    0        0
  Treg                 1    1    9    9    4   15    6    0        0
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$seurat_clusters)
                   
                       0    1    2    3    4    5    6    7    8    9   10   11   12   13
  B intermediate       0    0    0    0    0    0    1    0    0    1    0    0    3    2
  B memory             0    1    6    7    0   36   10    0    2  135    1    0   52    2
  CD14 Mono            1    0    0    0    0    0    1    0    0   10    0    0    0    0
  CD4 CTL              6    0    0    0    4    0    0    0    0    3    0    0    0    0
  CD4 Naive         1417    4    0    0    2    1   51    0    0    1    0  559    0    7
  CD4 Proliferating  215 5820 4529 4351 2260 2287 1767 3187 2179  287 1176   46  907    0
  CD4 TCM           4978   92  156  929  122 2486 1624    8   48 1344    3  807  199   34
  CD4 TEM             74    0    0    0    1    2    4    0    0    0    0    3    0    0
  CD8 Proliferating    0    0    0    0    0    0    0    0    0    1    0    0    1    0
  CD8 TCM              0    1    0    2    1   12    0    0    0    1    0    0    0    0
  CD8 TEM              0    0    0    0    1    5    3    0    0    6    0    0    0    0
  cDC1                 0    0    0    0    0    0    0    0    1    2    0    0    5    0
  cDC2                 0    0    2    0    0    5    0    0    0   42    0    0    4    0
  dnT                  0    0    0    0    0    3    8    0    1    3    0    0    0    0
  HSPC                 0   74  963   33    2   56    8    8   76    3  537    0   39    6
  NK Proliferating    61   24  123    0 2650   35   88   85   81    4    1    0    9    0
  Treg                 0    0    0    0    0    0   41    0    1    1    0    0    0    2
table(All_samples_Merged$cell_line, All_samples_Merged$seurat_clusters)
          
              0    1    2    3    4    5    6    7    8    9   10   11   12   13
  L1         56   79    9  206   36 2003 2486  519    9  413    1    2    6    0
  L2         69   20   11   58 4809  773   75   73    8   36    1    0    2    0
  L3          2 3021   35 2841    3  301   47   44    3   11    6    0  111    3
  L4        125 2696   58 1542   66  284   34  232   16  441    4   46  413   50
  L5          2   55 2120  293   17  293   49  404  692  164 1638    0  295    0
  L6         17   72 1746  176   45  693  138 1074  710  163   16    0  298    0
  L7         10   56 1800  205   27  535  129  941  951  544   52    0   81    0
  PBMC     4015   11    0    1   40   38  490    0    0   46    0  517   13    0
  PBMC_10x 2456    6    0    0    0    8  158    1    0   26    0  850    0    0

5. Marker Gene Visualization



# Set marker genes specific to requested immune cell types
myfeatures1 <- c("CD19", "CD79A", "MS4A1", # B cells
                "CD14", "LYZ", "FCGR3A", # Monocytes
                "CSF1R", "CD68", # Macrophages
                "NKG7", "GNLY", "KIR3DL1", # NK cells
                "MKI67", # Proliferating NK cells
                "CD34", "KIT", # HSPCs
                "CD3E", "CCR7", # T cells
                "SELL", "CD45RO", # Tnaive, Tcm
                "CD44", "CD45RA") # Tem, Temra

cd4_feature_plot1 <- FeaturePlot(
  All_samples_Merged, 
  features = myfeatures1, 
  reduction = "umap.harmony", 
  ncol = 4
) + 
  ggtitle("CD4 T Cell Marker Expression - Harmony Integration") +
  NoLegend()
Avis : Could not find CD45RO in the default search locations, found in 'ADT' assay insteadAvis : Could not find CD45RA in the default search locations, found in 'ADT' assay instead
# Display the plot
print(cd4_feature_plot1)


# Define markers specific to CD4 T cells and their subsets
cd4_markers <- c(
  "CD4",          # General CD4 T cells
  "IL7R",         # Naive T cells
  "CCR7",         # T central memory (Tcm) cells
  "SELL",         # T naive cells
  "FOXP3",        # Regulatory T cells (Tregs)
  "IL2RA",        # Activated T cells
  "PDCD1",        # Exhausted T cells
  "LAG3",         # Exhausted T cells
  "TIGIT",        # Exhausted T cells
  "GATA3",        # Th2 cells
  "TBX21",        # Th1 cells
  "RORC",         # Th17 cells
  "BCL6"          # T follicular helper (Tfh) cells
)

# Visualize marker genes for CD4 T cells
cd4_feature_plot2 <- FeaturePlot(
  All_samples_Merged, 
  features = cd4_markers, 
  reduction = "umap.harmony", 
  ncol = 4
) + 
  ggtitle("CD4 T Cell Marker Expression - Harmony Integration") +
  NoLegend()

# Display the plot
print(cd4_feature_plot2)

CD4 T Cell Marker Visualization

# Set marker genes specific to CD4 T cell biology and states
cd4_markers <- c(
    # Core T cell markers
    "CD3E",     # T cell marker
    "CD4",      # CD4 T cell marker
    
    # Naive/Memory markers
    "CCR7",     # Naive/Central memory
    "SELL",     # L-selectin, naive marker
    "CD27",     # Memory marker
    "IL7R",     # Naive/Memory marker
    
    # Activation/State markers
    "IL2RA",    # CD25, activation marker
    "CD69",     # Early activation
    "HLA-DRA",  # Activation marker
    
    # Exhaustion markers
    "PDCD1",    # PD-1
    "LAG3",     # Exhaustion marker
    "TIGIT",    # Exhaustion marker
    
    # Regulatory T cell markers
    "FOXP3",    # Treg marker
    "IL2RA",    # CD25, Treg marker
    "CTLA4",    # Treg/exhaustion marker
    
    # Effector/Function markers
    "IL2",      # T cell function
    "IFNG",     # Th1
    "IL4",      # Th2
    "IL13",     # Th2
    "IL17A"     # Th17
)

# Create feature plots with better visualization
FeaturePlot(All_samples_Merged, 
            features = cd4_markers, 
            reduction = "umap.harmony", 
            ncol = 4,
            pt.size = 0.1,           # Smaller point size for better resolution
            min.cutoff = "q1",       # Remove bottom 1% of expression
            max.cutoff = "q99",      # Remove top 1% of expression
            order = TRUE) +          # Plot highest expressing cells on top
    ggtitle("CD4 T Cell Marker Expression - Harmony Integration") +
    theme(plot.title = element_text(size = 16, face = "bold")) +
    NoLegend()


# Optional: Add violin plots to see expression distribution across clusters
VlnPlot(All_samples_Merged, 
        features = cd4_markers[1:20], # First 8 markers
        stack = TRUE,
        flip = TRUE) +
        ggtitle("CD4 T Cell Marker Distribution Across Clusters")

NA
NA

FindMarkers

# Idents(All_samples_Merged) <- "seurat_clusters"
# 
# markers1 <- FindMarkers (All_samples_Merged,
#                               ident.1 = c("0","2", "3", "8","1", "5", "6", "9", "10"), #cell lines
#                               ident.2 = c("4","7"), #CD4 T cells
#                               assay = "SCT",
#                               test.use =  "MAST",
#                               latent.vars = c("cell_line")) #batch
# 
# markers2 <- FindMarkers(All_samples_Merged,
#                         ident.1 = c("0", "2", "3", "8", "1", "5", "6", "9", "10"), #cell lines
#                         ident.2 = c("4", "7"), # CD4 T cells
#                         assay = "SCT",
#                         test.use = "wilcox")  # Change to Wilcoxon test
#                         
# 
# 
# markers3 <- FindMarkers(All_samples_Merged,
#                         ident.1 = c("0", "2", "3", "8", "1", "5", "6", "9", "10"), # cell lines
#                         ident.2 = c("4", "7"), # CD4 T cells
#                         assay = "SCT",
#                         test.use = "MAST")  # Use MAST
#                         
# write.csv(markers1, file = "0-imp_Robj/TEST_MAST_with_batch_results.csv", row.names = TRUE)
# 
# write.csv(markers2, file = "0-imp_Robj/TEST_Wilcox_without_batch_results2.csv", row.names = TRUE)
# 
# write.csv(markers3, file = "0-imp_Robj/TEST_MAST_without_batch_results3.csv", row.names = TRUE)
# 
# #Marker1
# 
# # Subset cells in each group
# group1_cells <- WhichCells(All_samples_Merged, idents = c("0", "2", "3", "8", "1", "5", "6", "9", "10"))
# group2_cells <- WhichCells(All_samples_Merged, idents = c("4", "7"))
# 
# # Extract normalized expression values
# expression_data <- GetAssayData(All_samples_Merged, slot = "data")  # log-normalized values
# 
# # Calculate mean expression for each group
# group1_mean <- rowMeans(expression_data[, group1_cells])
# group2_mean <- rowMeans(expression_data[, group2_cells])
# 
# 
# # Add mean expression to markers result
# markers1$mean_expr_group1 <- group1_mean[rownames(markers1)]
# markers1$mean_expr_group2 <- group2_mean[rownames(markers1)]
# 
# 
# #Marker2
# 
# # Add mean expression to markers result
# markers2$mean_expr_group1 <- group1_mean[rownames(markers2)]
# markers2$mean_expr_group2 <- group2_mean[rownames(markers2)]
# 
# #Marker3
# 
# # Add mean expression to markers result
# markers3$mean_expr_group1 <- group1_mean[rownames(markers3)]
# markers3$mean_expr_group2 <- group2_mean[rownames(markers3)]
# 
# write.csv(markers1, file = "0-imp_Robj/TEST_MAST_with_batch_results1_with_meanExpression.csv", row.names = TRUE)
# 
# write.csv(markers2, file = "0-imp_Robj/TEST_Wilcox_without_batch_results2_with_meanExpression.csv", row.names = TRUE)
# 
# write.csv(markers3, file = "0-imp_Robj/TEST_MAST_without_batch_results3_with_meanExpression.csv", row.names = TRUE)
# 
# 
# #Marker1
# # Count genes with p_val_adj = 0
# num_pval0 <- sum(markers1$p_val_adj == 0)
# cat("Number of genes with p_val_adj = 0:", num_pval0, "\n")
# 
# # Count genes with p_val_adj = 1
# num_pval1 <- sum(markers1$p_val_adj == 1)
# cat("Number of genes with p_val_adj = 1:", num_pval1, "\n")
# 
# 
# num_significant <- sum(markers1$p_val_adj < 0.05)
# cat("Number of significant genes (p_val_adj < 0.05):", num_significant, "\n")
# 
# 
# # Genes with avg_log2FC > 1 (upregulated)
# num_upregulated <- sum(markers1$avg_log2FC > 1)
# cat("Number of upregulated genes (avg_log2FC > 1):", num_upregulated, "\n")
# 
# # Genes with avg_log2FC < -1 (downregulated)
# num_downregulated <- sum(markers1$avg_log2FC < -1)
# cat("Number of downregulated genes (avg_log2FC < -1):", num_downregulated, "\n")
# 
# #Marker2
# 
# # Count genes with p_val_adj = 0
# num_pval0 <- sum(markers2$p_val_adj == 0)
# cat("Number of genes with p_val_adj = 0:", num_pval0, "\n")
# 
# # Count genes with p_val_adj = 1
# num_pval1 <- sum(markers2$p_val_adj == 1)
# cat("Number of genes with p_val_adj = 1:", num_pval1, "\n")
# 
# 
# num_significant <- sum(markers2$p_val_adj < 0.05)
# cat("Number of significant genes (p_val_adj < 0.05):", num_significant, "\n")
# 
# 
# # Genes with avg_log2FC > 1 (upregulated)
# num_upregulated <- sum(markers2$avg_log2FC > 1)
# cat("Number of upregulated genes (avg_log2FC > 1):", num_upregulated, "\n")
# 
# # Genes with avg_log2FC < -1 (downregulated)
# num_downregulated <- sum(markers2$avg_log2FC < -1)
# cat("Number of downregulated genes (avg_log2FC < -1):", num_downregulated, "\n")
# 
# 
# #Marker3
# 
# # Count genes with p_val_adj = 0
# num_pval0 <- sum(markers3$p_val_adj == 0)
# cat("Number of genes with p_val_adj = 0:", num_pval0, "\n")
# 
# # Count genes with p_val_adj = 1
# num_pval1 <- sum(markers3$p_val_adj == 1)
# cat("Number of genes with p_val_adj = 1:", num_pval1, "\n")
# 
# 
# num_significant <- sum(markers3$p_val_adj < 0.05)
# cat("Number of significant genes (p_val_adj < 0.05):", num_significant, "\n")
# 
# 
# # Genes with avg_log2FC > 1 (upregulated)
# num_upregulated <- sum(markers3$avg_log2FC > 1)
# cat("Number of upregulated genes (avg_log2FC > 1):", num_upregulated, "\n")
# 
# # Genes with avg_log2FC < -1 (downregulated)
# num_downregulated <- sum(markers3$avg_log2FC < -1)
# cat("Number of downregulated genes (avg_log2FC < -1):", num_downregulated, "\n")
# 

4. Save the Seurat object as an Robj file


#save(All_samples_Merged, file = "0-imp_Robj/Harmony_integrated_CD4Tcells_harmony_integrated.Robj")
LS0tCnRpdGxlOiAiSGFybW9ueSBpbnRlZ3JhdGlvbnMgb2YgUEJNQzEweCBieSBwYXRpZW50IG9yaWdpbiBhbmQgY2VsbF9saW5lLXRoZXRhLTEgIgphdXRob3I6IE5hc2lyIE1haG1vb2QgQWJiYXNpCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogICNybWRmb3JtYXRzOjpyZWFkdGhlZG93bgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCgojIDEuIGxvYWQgbGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShTZXVyYXRXcmFwcGVycykKbGlicmFyeShTZXVyYXRPYmplY3QpCmxpYnJhcnkoU2V1cmF0RGF0YSkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoaGFybW9ueSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJldGljdWxhdGUpCmxpYnJhcnkoQXppbXV0aCkKbGlicmFyeShkcGx5cikKbGlicmFyeShSdHNuZSkKbGlicmFyeShoYXJtb255KQoKCmBgYAoKCgoKIyAyLiBMb2FkIFNldXJhdCBPYmplY3QgCmBgYHtyIGxvYWRfc2V1cmF0LCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KCiNMb2FkIFNldXJhdCBPYmplY3QgbWVyZ2VkIGZyb20gY2VsbCBsaW5lcyBhbmQgYSBjb250cm9sIGFmdGVyIGZpbHRyYXRpb24KbG9hZCgiLi4vMC1SX09iamVjdHMvQ0Q0VGNlbGxzX1NDVG5vcm1hbGl6ZWRfZG9uZV9vbl9IUENfaW5sdWRpbmdfUGF0aWVudF9vcmlnaW4ucm9iaiIpCgoKCiMgVmlzdWFsaXplIGJlZm9yZSBIYXJtb255IGludGVncmF0aW9uCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gIlBhdGllbnRfb3JpZ2luIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQ2VsbCBMaW5lIikKCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLCAKICAgICAgICAgICAgICBncm91cC5ieSA9ICJjZWxsX2xpbmUiLAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgbGFiZWwuYm94ID0gVFJVRSkgKyAKICAgICAgZ2d0aXRsZSgiQmVmb3JlIEhhcm1vbnkgLSBCeSBDZWxsIExpbmUiKQoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAiU0NUX3Nubl9yZXMuMC41IiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQ2x1c3RlcnMiKQoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwxIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQW5ub3RhdGlvbi5sMSIpCgoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwyIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQW5ub3RhdGlvbi5sMiIpCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLCAKICAgICAgICAgICAgICBncm91cC5ieSA9ICJwcmVkaWN0ZWQuY2VsbHR5cGUubDMiLAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgbGFiZWwuYm94ID0gVFJVRSkgKyAKICAgICAgZ2d0aXRsZSgiQmVmb3JlIEhhcm1vbnkgLSBCeSBBbm5vdGF0aW9uLmwzIikKCgp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkU0NUX3Nubl9yZXMuMC41KQoKCmBgYAoKCiMgMy4gIFBlcmZvcm0gSGFybW9ueSBJbnRlZ3JhdGlvbgpgYGB7ciBoYXJtb255LWludGVncmF0aW9uLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCiMgUGVyZm9ybSBIYXJtb255IGludGVncmF0aW9uCkFsbF9zYW1wbGVzX01lcmdlZCA8LSBSdW5IYXJtb255KEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmJ5LnZhcnMgPSBjKCJQYXRpZW50X29yaWdpbiIsICJjZWxsX2xpbmUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjdGlvbi51c2UgPSAicGNhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbS51c2UgPSAxOjE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSA9IGMoMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2F5LnVzZSA9ICJTQ1QiKQoKIyBGaW5kIG5laWdoYm9ycyB1c2luZyB0aGUgSGFybW9ueSByZWR1Y3Rpb24gKHlvdSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5ICJyZWR1Y3Rpb24iIGhlcmUgZm9yIEZpbmROZWlnaGJvcnMpCkFsbF9zYW1wbGVzX01lcmdlZCA8LSBGaW5kTmVpZ2hib3JzKEFsbF9zYW1wbGVzX01lcmdlZCxyZWR1Y3Rpb24gPSAiaGFybW9ueSIsIGRpbXMgPSAxOjE1KSAgIyBVc2UgdGhlIGZpcnN0IDE2IFBDcyBmcm9tIEhhcm1vbnkgaW50ZWdyYXRpb24KCiMgRmluZCBjbHVzdGVycyBiYXNlZCBvbiB0aGUgbmVpZ2hib3JzIGZvdW5kIGluIHRoZSBIYXJtb255IHNwYWNlCkFsbF9zYW1wbGVzX01lcmdlZCA8LSBGaW5kQ2x1c3RlcnMoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAiaGFybW9ueSIsIHJlc29sdXRpb24gPSBjKDAuNSkpICAjIENsdXN0ZXJpbmcgYmFzZWQgb24gUEMgc3BhY2UgKGRlZmF1bHQpCgojIFJ1biBVTUFQIG9uIHRoZSBuZXcgSGFybW9ueSByZWR1Y3Rpb24KQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIFJ1blVNQVAoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAiaGFybW9ueSIsIGRpbXMgPSAxOjE1LCByZWR1Y3Rpb24ubmFtZSA9ICJ1bWFwLmhhcm1vbnkiKQoKCmBgYAoKIyA0LiAgVmlzdWFsaXplIEhhcm1vbnkgSW50ZWdyYXRlZCBEYXRhCmBgYHtyIGhhcm1vbnktdmlzdWFsaXphdGlvbjEsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQoKIyBWaXN1YWxpemF0aW9uIGFmdGVyIEhhcm1vbnkKCiMgQnkgY2VsbCBsaW5lCnAzIDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkFmdGVyIEhhcm1vbnkgLSBCeSBDZWxsIExpbmUiKQoKIyBCeSBjbHVzdGVycwpwNCA8LSBEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIsCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFKSArIAogICAgICBnZ3RpdGxlKCJBZnRlciBIYXJtb255IC0gQnkgQ2x1c3RlcnMiKQoKIyBCeSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMKcDUgPC0gRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLCAKICAgICAgICAgICAgICBncm91cC5ieSA9ICJwcmVkaWN0ZWQuY2VsbHR5cGUubDIiLAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgbGFiZWwuYm94ID0gVFJVRSkgKyAKICAgICAgZ2d0aXRsZSgiQWZ0ZXIgSGFybW9ueSAtIENlbGwgVHlwZSBBbm5vdGF0aW9ucyIpCgojIFByaW50IGNvbXBhcmlzb24gcGxvdHMKcDMgKyBwNApwcmludChwNSkKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBULCByZXBlbCA9IFQpICsgCiAgZ2d0aXRsZSgiSGFybW9ueSBJbnRlZ3JhdGlvbiAtIEJ5IENlbGwgTGluZSIpCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIixsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQsIHJlcGVsID0gVCkgKyAKICBnZ3RpdGxlKCJIYXJtb255IEludGVncmF0aW9uIC0gQnkgQ2x1c3RlcnMiKQpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMiIsbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBULCByZXBlbCA9IFQpICsgCiAgZ2d0aXRsZSgiSGFybW9ueSBJbnRlZ3JhdGlvbiAtIEFubm90YXRpb25zIikKCnRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRwcmVkaWN0ZWQuY2VsbHR5cGUubDIsIEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUpCgp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkc2V1cmF0X2NsdXN0ZXJzKQoKYGBgCiMjICBWaXN1YWxpemUgSGFybW9ueSBJbnRlZ3JhdGVkIERhdGEgZGlzdHJpYnV0aW9uCmBgYHtyIGhhcm1vbnktdGFibGVzLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCgp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkY2VsbF9saW5lKQoKdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMiwgQWxsX3NhbXBsZXNfTWVyZ2VkJHNldXJhdF9jbHVzdGVycykKCnRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUsIEFsbF9zYW1wbGVzX01lcmdlZCRzZXVyYXRfY2x1c3RlcnMpCgpgYGAKIyA1LiAgTWFya2VyIEdlbmUgVmlzdWFsaXphdGlvbgpgYGB7ciBmZWF0dXJlcGxvdC1oYXJtb255MSwgZmlnLmhlaWdodD0xNCwgZmlnLndpZHRoPTE4fQoKCiMgU2V0IG1hcmtlciBnZW5lcyBzcGVjaWZpYyB0byByZXF1ZXN0ZWQgaW1tdW5lIGNlbGwgdHlwZXMKbXlmZWF0dXJlczEgPC0gYygiQ0QxOSIsICJDRDc5QSIsICJNUzRBMSIsICMgQiBjZWxscwogICAgICAgICAgICAgICAgIkNEMTQiLCAiTFlaIiwgIkZDR1IzQSIsICMgTW9ub2N5dGVzCiAgICAgICAgICAgICAgICAiQ1NGMVIiLCAiQ0Q2OCIsICMgTWFjcm9waGFnZXMKICAgICAgICAgICAgICAgICJOS0c3IiwgIkdOTFkiLCAiS0lSM0RMMSIsICMgTksgY2VsbHMKICAgICAgICAgICAgICAgICJNS0k2NyIsICMgUHJvbGlmZXJhdGluZyBOSyBjZWxscwogICAgICAgICAgICAgICAgIkNEMzQiLCAiS0lUIiwgIyBIU1BDcwogICAgICAgICAgICAgICAgIkNEM0UiLCAiQ0NSNyIsICMgVCBjZWxscwogICAgICAgICAgICAgICAgIlNFTEwiLCAiQ0Q0NVJPIiwgIyBUbmFpdmUsIFRjbQogICAgICAgICAgICAgICAgIkNENDQiLCAiQ0Q0NVJBIikgIyBUZW0sIFRlbXJhCgpjZDRfZmVhdHVyZV9wbG90MSA8LSBGZWF0dXJlUGxvdCgKICBBbGxfc2FtcGxlc19NZXJnZWQsIAogIGZlYXR1cmVzID0gbXlmZWF0dXJlczEsIAogIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLCAKICBuY29sID0gNAopICsgCiAgZ2d0aXRsZSgiQ0Q0IFQgQ2VsbCBNYXJrZXIgRXhwcmVzc2lvbiAtIEhhcm1vbnkgSW50ZWdyYXRpb24iKSArCiAgTm9MZWdlbmQoKQoKIyBEaXNwbGF5IHRoZSBwbG90CnByaW50KGNkNF9mZWF0dXJlX3Bsb3QxKQoKIyBEZWZpbmUgbWFya2VycyBzcGVjaWZpYyB0byBDRDQgVCBjZWxscyBhbmQgdGhlaXIgc3Vic2V0cwpjZDRfbWFya2VycyA8LSBjKAogICJDRDQiLCAgICAgICAgICAjIEdlbmVyYWwgQ0Q0IFQgY2VsbHMKICAiSUw3UiIsICAgICAgICAgIyBOYWl2ZSBUIGNlbGxzCiAgIkNDUjciLCAgICAgICAgICMgVCBjZW50cmFsIG1lbW9yeSAoVGNtKSBjZWxscwogICJTRUxMIiwgICAgICAgICAjIFQgbmFpdmUgY2VsbHMKICAiRk9YUDMiLCAgICAgICAgIyBSZWd1bGF0b3J5IFQgY2VsbHMgKFRyZWdzKQogICJJTDJSQSIsICAgICAgICAjIEFjdGl2YXRlZCBUIGNlbGxzCiAgIlBEQ0QxIiwgICAgICAgICMgRXhoYXVzdGVkIFQgY2VsbHMKICAiTEFHMyIsICAgICAgICAgIyBFeGhhdXN0ZWQgVCBjZWxscwogICJUSUdJVCIsICAgICAgICAjIEV4aGF1c3RlZCBUIGNlbGxzCiAgIkdBVEEzIiwgICAgICAgICMgVGgyIGNlbGxzCiAgIlRCWDIxIiwgICAgICAgICMgVGgxIGNlbGxzCiAgIlJPUkMiLCAgICAgICAgICMgVGgxNyBjZWxscwogICJCQ0w2IiAgICAgICAgICAjIFQgZm9sbGljdWxhciBoZWxwZXIgKFRmaCkgY2VsbHMKKQoKIyBWaXN1YWxpemUgbWFya2VyIGdlbmVzIGZvciBDRDQgVCBjZWxscwpjZDRfZmVhdHVyZV9wbG90MiA8LSBGZWF0dXJlUGxvdCgKICBBbGxfc2FtcGxlc19NZXJnZWQsIAogIGZlYXR1cmVzID0gY2Q0X21hcmtlcnMsIAogIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLCAKICBuY29sID0gNAopICsgCiAgZ2d0aXRsZSgiQ0Q0IFQgQ2VsbCBNYXJrZXIgRXhwcmVzc2lvbiAtIEhhcm1vbnkgSW50ZWdyYXRpb24iKSArCiAgTm9MZWdlbmQoKQoKIyBEaXNwbGF5IHRoZSBwbG90CnByaW50KGNkNF9mZWF0dXJlX3Bsb3QyKQpgYGAKCiMjICBDRDQgVCBDZWxsIE1hcmtlciBWaXN1YWxpemF0aW9uCmBgYHtyIGZlYXR1cmVwbG90LWhhcm1vbnkyLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTZ9CiMgU2V0IG1hcmtlciBnZW5lcyBzcGVjaWZpYyB0byBDRDQgVCBjZWxsIGJpb2xvZ3kgYW5kIHN0YXRlcwpjZDRfbWFya2VycyA8LSBjKAogICAgIyBDb3JlIFQgY2VsbCBtYXJrZXJzCiAgICAiQ0QzRSIsICAgICAjIFQgY2VsbCBtYXJrZXIKICAgICJDRDQiLCAgICAgICMgQ0Q0IFQgY2VsbCBtYXJrZXIKICAgIAogICAgIyBOYWl2ZS9NZW1vcnkgbWFya2VycwogICAgIkNDUjciLCAgICAgIyBOYWl2ZS9DZW50cmFsIG1lbW9yeQogICAgIlNFTEwiLCAgICAgIyBMLXNlbGVjdGluLCBuYWl2ZSBtYXJrZXIKICAgICJDRDI3IiwgICAgICMgTWVtb3J5IG1hcmtlcgogICAgIklMN1IiLCAgICAgIyBOYWl2ZS9NZW1vcnkgbWFya2VyCiAgICAKICAgICMgQWN0aXZhdGlvbi9TdGF0ZSBtYXJrZXJzCiAgICAiSUwyUkEiLCAgICAjIENEMjUsIGFjdGl2YXRpb24gbWFya2VyCiAgICAiQ0Q2OSIsICAgICAjIEVhcmx5IGFjdGl2YXRpb24KICAgICJITEEtRFJBIiwgICMgQWN0aXZhdGlvbiBtYXJrZXIKICAgIAogICAgIyBFeGhhdXN0aW9uIG1hcmtlcnMKICAgICJQRENEMSIsICAgICMgUEQtMQogICAgIkxBRzMiLCAgICAgIyBFeGhhdXN0aW9uIG1hcmtlcgogICAgIlRJR0lUIiwgICAgIyBFeGhhdXN0aW9uIG1hcmtlcgogICAgCiAgICAjIFJlZ3VsYXRvcnkgVCBjZWxsIG1hcmtlcnMKICAgICJGT1hQMyIsICAgICMgVHJlZyBtYXJrZXIKICAgICJJTDJSQSIsICAgICMgQ0QyNSwgVHJlZyBtYXJrZXIKICAgICJDVExBNCIsICAgICMgVHJlZy9leGhhdXN0aW9uIG1hcmtlcgogICAgCiAgICAjIEVmZmVjdG9yL0Z1bmN0aW9uIG1hcmtlcnMKICAgICJJTDIiLCAgICAgICMgVCBjZWxsIGZ1bmN0aW9uCiAgICAiSUZORyIsICAgICAjIFRoMQogICAgIklMNCIsICAgICAgIyBUaDIKICAgICJJTDEzIiwgICAgICMgVGgyCiAgICAiSUwxN0EiICAgICAjIFRoMTcKKQoKIyBDcmVhdGUgZmVhdHVyZSBwbG90cyB3aXRoIGJldHRlciB2aXN1YWxpemF0aW9uCkZlYXR1cmVQbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgIGZlYXR1cmVzID0gY2Q0X21hcmtlcnMsIAogICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgCiAgICAgICAgICAgIG5jb2wgPSA0LAogICAgICAgICAgICBwdC5zaXplID0gMC4xLCAgICAgICAgICAgIyBTbWFsbGVyIHBvaW50IHNpemUgZm9yIGJldHRlciByZXNvbHV0aW9uCiAgICAgICAgICAgIG1pbi5jdXRvZmYgPSAicTEiLCAgICAgICAjIFJlbW92ZSBib3R0b20gMSUgb2YgZXhwcmVzc2lvbgogICAgICAgICAgICBtYXguY3V0b2ZmID0gInE5OSIsICAgICAgIyBSZW1vdmUgdG9wIDElIG9mIGV4cHJlc3Npb24KICAgICAgICAgICAgb3JkZXIgPSBUUlVFKSArICAgICAgICAgICMgUGxvdCBoaWdoZXN0IGV4cHJlc3NpbmcgY2VsbHMgb24gdG9wCiAgICBnZ3RpdGxlKCJDRDQgVCBDZWxsIE1hcmtlciBFeHByZXNzaW9uIC0gSGFybW9ueSBJbnRlZ3JhdGlvbiIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSkgKwogICAgTm9MZWdlbmQoKQoKIyBPcHRpb25hbDogQWRkIHZpb2xpbiBwbG90cyB0byBzZWUgZXhwcmVzc2lvbiBkaXN0cmlidXRpb24gYWNyb3NzIGNsdXN0ZXJzClZsblBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICBmZWF0dXJlcyA9IGNkNF9tYXJrZXJzWzE6MjBdLCAjIEZpcnN0IDggbWFya2VycwogICAgICAgIHN0YWNrID0gVFJVRSwKICAgICAgICBmbGlwID0gVFJVRSkgKwogICAgICAgIGdndGl0bGUoIkNENCBUIENlbGwgTWFya2VyIERpc3RyaWJ1dGlvbiBBY3Jvc3MgQ2x1c3RlcnMiKQoKCmBgYAoKIyMgIEZpbmRNYXJrZXJzCmBgYHtyIG1hcmtlcnMsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xNn0KIyBJZGVudHMoQWxsX3NhbXBsZXNfTWVyZ2VkKSA8LSAic2V1cmF0X2NsdXN0ZXJzIgojIAojIG1hcmtlcnMxIDwtIEZpbmRNYXJrZXJzIChBbGxfc2FtcGxlc19NZXJnZWQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoIjAiLCIyIiwgIjMiLCAiOCIsIjEiLCAiNSIsICI2IiwgIjkiLCAiMTAiKSwgI2NlbGwgbGluZXMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiNCIsIjciKSwgI0NENCBUIGNlbGxzCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiU0NUIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LnVzZSA9IAkiTUFTVCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW50LnZhcnMJPSBjKCJjZWxsX2xpbmUiKSkgI2JhdGNoCiMgCiMgbWFya2VyczIgPC0gRmluZE1hcmtlcnMoQWxsX3NhbXBsZXNfTWVyZ2VkLAojICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCIwIiwgIjIiLCAiMyIsICI4IiwgIjEiLCAiNSIsICI2IiwgIjkiLCAiMTAiKSwgI2NlbGwgbGluZXMKIyAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiNCIsICI3IiksICMgQ0Q0IFQgY2VsbHMKIyAgICAgICAgICAgICAgICAgICAgICAgICBhc3NheSA9ICJTQ1QiLAojICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QudXNlID0gIndpbGNveCIpICAjIENoYW5nZSB0byBXaWxjb3hvbiB0ZXN0CiMgICAgICAgICAgICAgICAgICAgICAgICAgCiMgCiMgCiMgbWFya2VyczMgPC0gRmluZE1hcmtlcnMoQWxsX3NhbXBsZXNfTWVyZ2VkLAojICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCIwIiwgIjIiLCAiMyIsICI4IiwgIjEiLCAiNSIsICI2IiwgIjkiLCAiMTAiKSwgIyBjZWxsIGxpbmVzCiMgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIjQiLCAiNyIpLCAjIENENCBUIGNlbGxzCiMgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiU0NUIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LnVzZSA9ICJNQVNUIikgICMgVXNlIE1BU1QKIyAgICAgICAgICAgICAgICAgICAgICAgICAKIyB3cml0ZS5jc3YobWFya2VyczEsIGZpbGUgPSAiMC1pbXBfUm9iai9URVNUX01BU1Rfd2l0aF9iYXRjaF9yZXN1bHRzLmNzdiIsIHJvdy5uYW1lcyA9IFRSVUUpCiMgCiMgd3JpdGUuY3N2KG1hcmtlcnMyLCBmaWxlID0gIjAtaW1wX1JvYmovVEVTVF9XaWxjb3hfd2l0aG91dF9iYXRjaF9yZXN1bHRzMi5jc3YiLCByb3cubmFtZXMgPSBUUlVFKQojIAojIHdyaXRlLmNzdihtYXJrZXJzMywgZmlsZSA9ICIwLWltcF9Sb2JqL1RFU1RfTUFTVF93aXRob3V0X2JhdGNoX3Jlc3VsdHMzLmNzdiIsIHJvdy5uYW1lcyA9IFRSVUUpCiMgCiMgI01hcmtlcjEKIyAKIyAjIFN1YnNldCBjZWxscyBpbiBlYWNoIGdyb3VwCiMgZ3JvdXAxX2NlbGxzIDwtIFdoaWNoQ2VsbHMoQWxsX3NhbXBsZXNfTWVyZ2VkLCBpZGVudHMgPSBjKCIwIiwgIjIiLCAiMyIsICI4IiwgIjEiLCAiNSIsICI2IiwgIjkiLCAiMTAiKSkKIyBncm91cDJfY2VsbHMgPC0gV2hpY2hDZWxscyhBbGxfc2FtcGxlc19NZXJnZWQsIGlkZW50cyA9IGMoIjQiLCAiNyIpKQojIAojICMgRXh0cmFjdCBub3JtYWxpemVkIGV4cHJlc3Npb24gdmFsdWVzCiMgZXhwcmVzc2lvbl9kYXRhIDwtIEdldEFzc2F5RGF0YShBbGxfc2FtcGxlc19NZXJnZWQsIHNsb3QgPSAiZGF0YSIpICAjIGxvZy1ub3JtYWxpemVkIHZhbHVlcwojIAojICMgQ2FsY3VsYXRlIG1lYW4gZXhwcmVzc2lvbiBmb3IgZWFjaCBncm91cAojIGdyb3VwMV9tZWFuIDwtIHJvd01lYW5zKGV4cHJlc3Npb25fZGF0YVssIGdyb3VwMV9jZWxsc10pCiMgZ3JvdXAyX21lYW4gPC0gcm93TWVhbnMoZXhwcmVzc2lvbl9kYXRhWywgZ3JvdXAyX2NlbGxzXSkKIyAKIyAKIyAjIEFkZCBtZWFuIGV4cHJlc3Npb24gdG8gbWFya2VycyByZXN1bHQKIyBtYXJrZXJzMSRtZWFuX2V4cHJfZ3JvdXAxIDwtIGdyb3VwMV9tZWFuW3Jvd25hbWVzKG1hcmtlcnMxKV0KIyBtYXJrZXJzMSRtZWFuX2V4cHJfZ3JvdXAyIDwtIGdyb3VwMl9tZWFuW3Jvd25hbWVzKG1hcmtlcnMxKV0KIyAKIyAKIyAjTWFya2VyMgojIAojICMgQWRkIG1lYW4gZXhwcmVzc2lvbiB0byBtYXJrZXJzIHJlc3VsdAojIG1hcmtlcnMyJG1lYW5fZXhwcl9ncm91cDEgPC0gZ3JvdXAxX21lYW5bcm93bmFtZXMobWFya2VyczIpXQojIG1hcmtlcnMyJG1lYW5fZXhwcl9ncm91cDIgPC0gZ3JvdXAyX21lYW5bcm93bmFtZXMobWFya2VyczIpXQojIAojICNNYXJrZXIzCiMgCiMgIyBBZGQgbWVhbiBleHByZXNzaW9uIHRvIG1hcmtlcnMgcmVzdWx0CiMgbWFya2VyczMkbWVhbl9leHByX2dyb3VwMSA8LSBncm91cDFfbWVhbltyb3duYW1lcyhtYXJrZXJzMyldCiMgbWFya2VyczMkbWVhbl9leHByX2dyb3VwMiA8LSBncm91cDJfbWVhbltyb3duYW1lcyhtYXJrZXJzMyldCiMgCiMgd3JpdGUuY3N2KG1hcmtlcnMxLCBmaWxlID0gIjAtaW1wX1JvYmovVEVTVF9NQVNUX3dpdGhfYmF0Y2hfcmVzdWx0czFfd2l0aF9tZWFuRXhwcmVzc2lvbi5jc3YiLCByb3cubmFtZXMgPSBUUlVFKQojIAojIHdyaXRlLmNzdihtYXJrZXJzMiwgZmlsZSA9ICIwLWltcF9Sb2JqL1RFU1RfV2lsY294X3dpdGhvdXRfYmF0Y2hfcmVzdWx0czJfd2l0aF9tZWFuRXhwcmVzc2lvbi5jc3YiLCByb3cubmFtZXMgPSBUUlVFKQojIAojIHdyaXRlLmNzdihtYXJrZXJzMywgZmlsZSA9ICIwLWltcF9Sb2JqL1RFU1RfTUFTVF93aXRob3V0X2JhdGNoX3Jlc3VsdHMzX3dpdGhfbWVhbkV4cHJlc3Npb24uY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKIyAKIyAKIyAjTWFya2VyMQojICMgQ291bnQgZ2VuZXMgd2l0aCBwX3ZhbF9hZGogPSAwCiMgbnVtX3B2YWwwIDwtIHN1bShtYXJrZXJzMSRwX3ZhbF9hZGogPT0gMCkKIyBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDA6IiwgbnVtX3B2YWwwLCAiXG4iKQojIAojICMgQ291bnQgZ2VuZXMgd2l0aCBwX3ZhbF9hZGogPSAxCiMgbnVtX3B2YWwxIDwtIHN1bShtYXJrZXJzMSRwX3ZhbF9hZGogPT0gMSkKIyBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDE6IiwgbnVtX3B2YWwxLCAiXG4iKQojIAojIAojIG51bV9zaWduaWZpY2FudCA8LSBzdW0obWFya2VyczEkcF92YWxfYWRqIDwgMC4wNSkKIyBjYXQoIk51bWJlciBvZiBzaWduaWZpY2FudCBnZW5lcyAocF92YWxfYWRqIDwgMC4wNSk6IiwgbnVtX3NpZ25pZmljYW50LCAiXG4iKQojIAojIAojICMgR2VuZXMgd2l0aCBhdmdfbG9nMkZDID4gMSAodXByZWd1bGF0ZWQpCiMgbnVtX3VwcmVndWxhdGVkIDwtIHN1bShtYXJrZXJzMSRhdmdfbG9nMkZDID4gMSkKIyBjYXQoIk51bWJlciBvZiB1cHJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA+IDEpOiIsIG51bV91cHJlZ3VsYXRlZCwgIlxuIikKIyAKIyAjIEdlbmVzIHdpdGggYXZnX2xvZzJGQyA8IC0xIChkb3ducmVndWxhdGVkKQojIG51bV9kb3ducmVndWxhdGVkIDwtIHN1bShtYXJrZXJzMSRhdmdfbG9nMkZDIDwgLTEpCiMgY2F0KCJOdW1iZXIgb2YgZG93bnJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA8IC0xKToiLCBudW1fZG93bnJlZ3VsYXRlZCwgIlxuIikKIyAKIyAjTWFya2VyMgojIAojICMgQ291bnQgZ2VuZXMgd2l0aCBwX3ZhbF9hZGogPSAwCiMgbnVtX3B2YWwwIDwtIHN1bShtYXJrZXJzMiRwX3ZhbF9hZGogPT0gMCkKIyBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDA6IiwgbnVtX3B2YWwwLCAiXG4iKQojIAojICMgQ291bnQgZ2VuZXMgd2l0aCBwX3ZhbF9hZGogPSAxCiMgbnVtX3B2YWwxIDwtIHN1bShtYXJrZXJzMiRwX3ZhbF9hZGogPT0gMSkKIyBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDE6IiwgbnVtX3B2YWwxLCAiXG4iKQojIAojIAojIG51bV9zaWduaWZpY2FudCA8LSBzdW0obWFya2VyczIkcF92YWxfYWRqIDwgMC4wNSkKIyBjYXQoIk51bWJlciBvZiBzaWduaWZpY2FudCBnZW5lcyAocF92YWxfYWRqIDwgMC4wNSk6IiwgbnVtX3NpZ25pZmljYW50LCAiXG4iKQojIAojIAojICMgR2VuZXMgd2l0aCBhdmdfbG9nMkZDID4gMSAodXByZWd1bGF0ZWQpCiMgbnVtX3VwcmVndWxhdGVkIDwtIHN1bShtYXJrZXJzMiRhdmdfbG9nMkZDID4gMSkKIyBjYXQoIk51bWJlciBvZiB1cHJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA+IDEpOiIsIG51bV91cHJlZ3VsYXRlZCwgIlxuIikKIyAKIyAjIEdlbmVzIHdpdGggYXZnX2xvZzJGQyA8IC0xIChkb3ducmVndWxhdGVkKQojIG51bV9kb3ducmVndWxhdGVkIDwtIHN1bShtYXJrZXJzMiRhdmdfbG9nMkZDIDwgLTEpCiMgY2F0KCJOdW1iZXIgb2YgZG93bnJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA8IC0xKToiLCBudW1fZG93bnJlZ3VsYXRlZCwgIlxuIikKIyAKIyAKIyAjTWFya2VyMwojIAojICMgQ291bnQgZ2VuZXMgd2l0aCBwX3ZhbF9hZGogPSAwCiMgbnVtX3B2YWwwIDwtIHN1bShtYXJrZXJzMyRwX3ZhbF9hZGogPT0gMCkKIyBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDA6IiwgbnVtX3B2YWwwLCAiXG4iKQojIAojICMgQ291bnQgZ2VuZXMgd2l0aCBwX3ZhbF9hZGogPSAxCiMgbnVtX3B2YWwxIDwtIHN1bShtYXJrZXJzMyRwX3ZhbF9hZGogPT0gMSkKIyBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDE6IiwgbnVtX3B2YWwxLCAiXG4iKQojIAojIAojIG51bV9zaWduaWZpY2FudCA8LSBzdW0obWFya2VyczMkcF92YWxfYWRqIDwgMC4wNSkKIyBjYXQoIk51bWJlciBvZiBzaWduaWZpY2FudCBnZW5lcyAocF92YWxfYWRqIDwgMC4wNSk6IiwgbnVtX3NpZ25pZmljYW50LCAiXG4iKQojIAojIAojICMgR2VuZXMgd2l0aCBhdmdfbG9nMkZDID4gMSAodXByZWd1bGF0ZWQpCiMgbnVtX3VwcmVndWxhdGVkIDwtIHN1bShtYXJrZXJzMyRhdmdfbG9nMkZDID4gMSkKIyBjYXQoIk51bWJlciBvZiB1cHJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA+IDEpOiIsIG51bV91cHJlZ3VsYXRlZCwgIlxuIikKIyAKIyAjIEdlbmVzIHdpdGggYXZnX2xvZzJGQyA8IC0xIChkb3ducmVndWxhdGVkKQojIG51bV9kb3ducmVndWxhdGVkIDwtIHN1bShtYXJrZXJzMyRhdmdfbG9nMkZDIDwgLTEpCiMgY2F0KCJOdW1iZXIgb2YgZG93bnJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA8IC0xKToiLCBudW1fZG93bnJlZ3VsYXRlZCwgIlxuIikKIyAKCgpgYGAKCgoKIyA0LiBTYXZlIHRoZSBTZXVyYXQgb2JqZWN0IGFzIGFuIFJvYmogZmlsZQpgYGB7ciBzYXZlUk9CSn0KCiNzYXZlKEFsbF9zYW1wbGVzX01lcmdlZCwgZmlsZSA9ICIwLWltcF9Sb2JqL0hhcm1vbnlfaW50ZWdyYXRlZF9DRDRUY2VsbHNfaGFybW9ueV9pbnRlZ3JhdGVkLlJvYmoiKQoKYGBgCgoKCgo=