1. load libraries
2. Load Seurat Object
#Load Seurat Object Integrated Object
load("ARSIM0only_corrected.Robj")
ARSIM0only
An object of class Seurat
39604 features across 32273 samples within 3 assays
Active assay: integrated (2996 features, 2996 variable features)
2 layers present: data, scale.data
2 other assays present: RNA, ADT
3 dimensional reductions calculated: pca, umap, tsne
# Set the default assay to 'RNA' or 'SCT' if available
if ("RNA" %in% names(ARSIM0only@assays)) {
DefaultAssay(ARSIM0only) <- "RNA"
} else if ("SCT" %in% names(ARSIM0only@assays)) {
DefaultAssay(ARSIM0only) <- "SCT"
} else {
stop("Neither RNA nor SCT assay found in the Seurat object. Please ensure your data has been normalized and contains one of these assays.")
}
3. Data input & processing and initialization of CellChat
object
#------------------------------------------------------------------------------
# **Part I: Data input & processing and initialization of CellChat object**
#------------------------------------------------------------------------------
# Loading and Preparing Data
ARSIM0only <- AddMetaData(object = ARSIM0only,
metadata = paste0("Cluster_", ARSIM0only$seurat_clusters),
col.name = 'Clusters')
ARSIM0only[["RNA"]] <- JoinLayers(ARSIM0only[["RNA"]])
# Extract the normalized data
data_input <- GetAssayData(ARSIM0only, assay = "RNA", slot = "data")
#1. Create CellChat object
cellchat <- createCellChat(object = data_input, meta = ARSIM0only@meta.data, group.by = "Clusters")
[1] "Create a CellChat object from a data matrix"
Warning: The 'meta' data does not have a column named `samples`. We now add this column and all cells are assumed to belong to `sample1`!
Set cell identities for the new CellChat object
The cell groups used for CellChat analysis are Cluster_0, Cluster_1, Cluster_10, Cluster_11, Cluster_12, Cluster_13, Cluster_14, Cluster_15, Cluster_16, Cluster_17, Cluster_18, Cluster_19, Cluster_2, Cluster_20, Cluster_21, Cluster_22, Cluster_23, Cluster_3, Cluster_4, Cluster_5, Cluster_6, Cluster_7, Cluster_8, Cluster_9
#2. Set the ligand-receptor interaction database
cellchatDB <- CellChatDB.human # or CellChatDB.mouse
showDatabaseCategory(cellchatDB)

# Show the structure of the database
dplyr::glimpse(cellchatDB$interaction)
Rows: 3,233
Columns: 28
$ interaction_name <chr> "TGFB1_TGFBR1_TGFBR2", "TGFB2_TGFBR1_TGFBR2", "TGFB3_TGFBR1_TGFBR2", "TGFB1_ACVR1B_TGFBR2", "TGFB…
$ pathway_name <chr> "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "…
$ ligand <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", "TGFB2", "TGFB2", "TGFB3", "TGFB3", "TGFB1", "TGFB2"…
$ receptor <chr> "TGFbR1_R2", "TGFbR1_R2", "TGFbR1_R2", "ACVR1B_TGFbR2", "ACVR1C_TGFbR2", "ACVR1B_TGFbR2", "ACVR1C…
$ agonist <chr> "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "…
$ antagonist <chr> "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "T…
$ co_A_receptor <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
$ co_I_receptor <chr> "TGFb inhibition receptor", "TGFb inhibition receptor", "TGFb inhibition receptor", "TGFb inhibit…
$ evidence <chr> "KEGG: hsa04350", "KEGG: hsa04350", "KEGG: hsa04350", "PMID: 27449815", "PMID: 27449815", "PMID: …
$ annotation <chr> "Secreted Signaling", "Secreted Signaling", "Secreted Signaling", "Secreted Signaling", "Secreted…
$ interaction_name_2 <chr> "TGFB1 - (TGFBR1+TGFBR2)", "TGFB2 - (TGFBR1+TGFBR2)", "TGFB3 - (TGFBR1+TGFBR2)", "TGFB1 - (ACVR1B…
$ is_neurotransmitter <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,…
$ ligand.symbol <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", "TGFB2", "TGFB2", "TGFB3", "TGFB3", "TGFB1", "TGFB2"…
$ ligand.family <chr> "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "…
$ ligand.location <chr> "Extracellular matrix, Secreted, Extracellular space", "Extracellular matrix, Secreted, Extracell…
$ ligand.keyword <chr> "Disease variant, Signal, Reference proteome, Extracellular matrix, Disulfide bond, Secreted, Mit…
$ ligand.secreted_type <chr> "growth factor", "growth factor", "cytokine;growth factor", "growth factor", "growth factor", "gr…
$ ligand.transmembrane <lgl> FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FAL…
$ receptor.symbol <chr> "TGFBR2, TGFBR1", "TGFBR2, TGFBR1", "TGFBR2, TGFBR1", "TGFBR2, ACVR1B", "TGFBR2, ACVR1C", "TGFBR2…
$ receptor.family <chr> "Protein kinase superfamily, TKL Ser/Thr protein kinase", "Protein kinase superfamily, TKL Ser/Th…
$ receptor.location <chr> "Cell membrane, Secreted, Membrane raft, Cell surface, Cell junction, Tight junction", "Cell memb…
$ receptor.keyword <chr> "Membrane, Secreted, Disulfide bond, Kinase, Transmembrane, Differentiation, ATP-binding, Recepto…
$ receptor.surfaceome_main <chr> "Receptors", "Receptors", "Receptors", "Receptors", "Receptors", "Receptors", "Receptors", "Recep…
$ receptor.surfaceome_sub <chr> "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TGFB;Kinase", "A…
$ receptor.adhesome <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
$ receptor.secreted_type <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
$ receptor.transmembrane <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, T…
$ version <chr> "CellChatDB v1", "CellChatDB v1", "CellChatDB v1", "CellChatDB v1", "CellChatDB v1", "CellChatDB …
# use a subset of CellChatDB for cell-cell communication analysis
cellchatDB.use <- subsetDB(cellchatDB, search = "Secreted Signaling", key = "annotation") # use Secreted Signaling
# set the used database in the object
cellchat@DB <- cellchatDB.use
#------------------------------------------------------------------------------
# **Preprocessing the expression data for cell-cell communication analysis**
#------------------------------------------------------------------------------
#3. Preprocess the expression data
cellchat <- subsetData(cellchat)
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)
| | 0 % ~calculating
|+ | 1 % ~00s
|++ | 2 % ~03s
|++ | 4 % ~02s
|+++ | 5 % ~01s
|+++ | 6 % ~01s
|++++ | 7 % ~01s
|+++++ | 8 % ~01s
|+++++ | 9 % ~01s
|++++++ | 11% ~01s
|++++++ | 12% ~01s
|+++++++ | 13% ~00s
|++++++++ | 14% ~00s
|++++++++ | 15% ~00s
|+++++++++ | 16% ~00s
|+++++++++ | 18% ~00s
|++++++++++ | 19% ~00s
|++++++++++ | 20% ~00s
|+++++++++++ | 21% ~00s
|++++++++++++ | 22% ~00s
|++++++++++++ | 24% ~00s
|+++++++++++++ | 25% ~00s
|+++++++++++++ | 26% ~00s
|++++++++++++++ | 27% ~00s
|+++++++++++++++ | 28% ~00s
|+++++++++++++++ | 29% ~00s
|++++++++++++++++ | 31% ~00s
|++++++++++++++++ | 32% ~00s
|+++++++++++++++++ | 33% ~00s
|++++++++++++++++++ | 34% ~00s
|++++++++++++++++++ | 35% ~00s
|+++++++++++++++++++ | 36% ~00s
|+++++++++++++++++++ | 38% ~00s
|++++++++++++++++++++ | 39% ~00s
|++++++++++++++++++++ | 40% ~00s
|+++++++++++++++++++++ | 41% ~00s
|++++++++++++++++++++++ | 42% ~00s
|++++++++++++++++++++++ | 44% ~00s
|+++++++++++++++++++++++ | 45% ~00s
|+++++++++++++++++++++++ | 46% ~00s
|++++++++++++++++++++++++ | 47% ~00s
|+++++++++++++++++++++++++ | 48% ~00s
|+++++++++++++++++++++++++ | 49% ~00s
|++++++++++++++++++++++++++ | 51% ~00s
|++++++++++++++++++++++++++ | 52% ~00s
|+++++++++++++++++++++++++++ | 53% ~00s
|++++++++++++++++++++++++++++ | 54% ~00s
|++++++++++++++++++++++++++++ | 55% ~00s
|+++++++++++++++++++++++++++++ | 56% ~00s
|+++++++++++++++++++++++++++++ | 58% ~00s
|++++++++++++++++++++++++++++++ | 59% ~00s
|++++++++++++++++++++++++++++++ | 60% ~00s
|+++++++++++++++++++++++++++++++ | 61% ~00s
|++++++++++++++++++++++++++++++++ | 62% ~00s
|++++++++++++++++++++++++++++++++ | 64% ~00s
|+++++++++++++++++++++++++++++++++ | 65% ~00s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|+++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|++++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
| | 0 % ~calculating
|+ | 1 % ~00s
|++ | 2 % ~00s
|++ | 4 % ~00s
|+++ | 5 % ~00s
|+++ | 6 % ~00s
|++++ | 7 % ~00s
|+++++ | 8 % ~00s
|+++++ | 9 % ~00s
|++++++ | 11% ~00s
|++++++ | 12% ~00s
|+++++++ | 13% ~00s
|++++++++ | 14% ~00s
|++++++++ | 15% ~00s
|+++++++++ | 16% ~00s
|+++++++++ | 18% ~00s
|++++++++++ | 19% ~00s
|++++++++++ | 20% ~00s
|+++++++++++ | 21% ~00s
|++++++++++++ | 22% ~00s
|++++++++++++ | 24% ~00s
|+++++++++++++ | 25% ~00s
|+++++++++++++ | 26% ~00s
|++++++++++++++ | 27% ~00s
|+++++++++++++++ | 28% ~00s
|+++++++++++++++ | 29% ~00s
|++++++++++++++++ | 31% ~00s
|++++++++++++++++ | 32% ~00s
|+++++++++++++++++ | 33% ~00s
|++++++++++++++++++ | 34% ~00s
|++++++++++++++++++ | 35% ~00s
|+++++++++++++++++++ | 36% ~00s
|+++++++++++++++++++ | 38% ~00s
|++++++++++++++++++++ | 39% ~00s
|++++++++++++++++++++ | 40% ~00s
|+++++++++++++++++++++ | 41% ~00s
|++++++++++++++++++++++ | 42% ~00s
|++++++++++++++++++++++ | 44% ~00s
|+++++++++++++++++++++++ | 45% ~00s
|+++++++++++++++++++++++ | 46% ~00s
|++++++++++++++++++++++++ | 47% ~00s
|+++++++++++++++++++++++++ | 48% ~00s
|+++++++++++++++++++++++++ | 49% ~00s
|++++++++++++++++++++++++++ | 51% ~00s
|++++++++++++++++++++++++++ | 52% ~00s
|+++++++++++++++++++++++++++ | 53% ~00s
|++++++++++++++++++++++++++++ | 54% ~00s
|++++++++++++++++++++++++++++ | 55% ~00s
|+++++++++++++++++++++++++++++ | 56% ~00s
|+++++++++++++++++++++++++++++ | 58% ~00s
|++++++++++++++++++++++++++++++ | 59% ~00s
|++++++++++++++++++++++++++++++ | 60% ~00s
|+++++++++++++++++++++++++++++++ | 61% ~00s
|++++++++++++++++++++++++++++++++ | 62% ~00s
|++++++++++++++++++++++++++++++++ | 64% ~00s
|+++++++++++++++++++++++++++++++++ | 65% ~00s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|+++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|++++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
| | 0 % ~calculating
|+ | 1 % ~00s
|++ | 2 % ~00s
|++ | 3 % ~00s
|+++ | 4 % ~00s
|+++ | 5 % ~00s
|++++ | 6 % ~00s
|++++ | 7 % ~00s
|+++++ | 8 % ~00s
|+++++ | 9 % ~00s
|++++++ | 10% ~00s
|++++++ | 11% ~00s
|+++++++ | 12% ~00s
|+++++++ | 13% ~00s
|++++++++ | 14% ~00s
|++++++++ | 15% ~00s
|+++++++++ | 16% ~00s
|+++++++++ | 17% ~00s
|++++++++++ | 18% ~00s
|++++++++++ | 19% ~00s
|+++++++++++ | 20% ~00s
|+++++++++++ | 21% ~00s
|++++++++++++ | 22% ~00s
|++++++++++++ | 23% ~00s
|+++++++++++++ | 24% ~00s
|+++++++++++++ | 25% ~00s
|++++++++++++++ | 26% ~00s
|++++++++++++++ | 27% ~00s
|+++++++++++++++ | 28% ~00s
|+++++++++++++++ | 29% ~00s
|++++++++++++++++ | 30% ~00s
|++++++++++++++++ | 31% ~00s
|+++++++++++++++++ | 32% ~00s
|+++++++++++++++++ | 33% ~00s
|++++++++++++++++++ | 34% ~00s
|++++++++++++++++++ | 35% ~00s
|+++++++++++++++++++ | 36% ~00s
|+++++++++++++++++++ | 37% ~00s
|++++++++++++++++++++ | 38% ~00s
|++++++++++++++++++++ | 39% ~00s
|+++++++++++++++++++++ | 40% ~00s
|+++++++++++++++++++++ | 41% ~00s
|++++++++++++++++++++++ | 42% ~00s
|++++++++++++++++++++++ | 43% ~00s
|+++++++++++++++++++++++ | 44% ~00s
|+++++++++++++++++++++++ | 45% ~00s
|++++++++++++++++++++++++ | 46% ~00s
|++++++++++++++++++++++++ | 47% ~00s
|+++++++++++++++++++++++++ | 48% ~00s
|+++++++++++++++++++++++++ | 49% ~00s
|++++++++++++++++++++++++++ | 51% ~00s
|++++++++++++++++++++++++++ | 52% ~00s
|+++++++++++++++++++++++++++ | 53% ~00s
|+++++++++++++++++++++++++++ | 54% ~00s
|++++++++++++++++++++++++++++ | 55% ~00s
|++++++++++++++++++++++++++++ | 56% ~00s
|+++++++++++++++++++++++++++++ | 57% ~00s
|+++++++++++++++++++++++++++++ | 58% ~00s
|++++++++++++++++++++++++++++++ | 59% ~00s
|++++++++++++++++++++++++++++++ | 60% ~00s
|+++++++++++++++++++++++++++++++ | 61% ~00s
|+++++++++++++++++++++++++++++++ | 62% ~00s
|++++++++++++++++++++++++++++++++ | 63% ~00s
|++++++++++++++++++++++++++++++++ | 64% ~00s
|+++++++++++++++++++++++++++++++++ | 65% ~00s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|+++++++++++++++++++++++++++++++++++ | 70% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|+++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
The number of highly variable ligand-receptor pairs used for signaling inference is 1018
4. Inference of cell-cell communication network


#7. Visualize the communication network
groupSize <- as.numeric(table(cellchat@idents))
netVisual_circle(cellchat@net$count, vertex.weight = groupSize, weight.scale = T, label.edge= F, title.name = "Number of interactions")
netVisual_circle(cellchat@net$weight, vertex.weight = groupSize, weight.scale = T, label.edge= F, title.name = "Interaction weights/strength")

mat <- cellchat@net$weight
par(mfrow = c(3,4), xpd=TRUE)

for (i in 1:nrow(mat)) {
mat2 <- matrix(0, nrow = nrow(mat), ncol = ncol(mat), dimnames = dimnames(mat))
mat2[i, ] <- mat[i, ]
netVisual_circle(mat2, vertex.weight = groupSize, weight.scale = T, edge.weight.max = max(mat), title.name = rownames(mat)[i])
}


5. Visualization of cell-cell communication network
#------------------------------------------------------------------------------
# **Part III: Visualization of cell-cell communication network**
#------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------------------
# **Visualize each signaling pathway using Hierarchy plot, Circle plot or Chord diagram**
#----------------------------------------------------------------------------------------------------
pathways.show <- c("CD70")
# Hierarchy plot
# Here we define `vertex.receive` so that the left portion of the hierarchy plot shows signaling to fibroblast and the right portion shows signaling to immune cells
vertex.receiver = seq(1,4) # a numeric vector.
netVisual_aggregate(cellchat, signaling = pathways.show, vertex.receiver = vertex.receiver)

# Circle plot
par(mfrow=c(1,1))

netVisual_aggregate(cellchat, signaling = pathways.show, layout = "circle")

# Chord diagram
par(mfrow=c(1,1))

netVisual_aggregate(cellchat, signaling = pathways.show, layout = "chord")

# Heatmap
par(mfrow=c(1,1))

netVisual_heatmap(cellchat, signaling = pathways.show, color.heatmap = "Reds")
Do heatmap based on a single object

#> Do heatmap based on a single object
# Get the levels of cell types
cell_types <- levels(cellchat@idents)
# Chord diagram
group.cellType <- c(rep("CD80", 4), rep("IL2", 4), rep("TNF", 4))
group.cellType <- rep(NA, length(cell_types))
# Assign each cell type to a group
# You'll need to adjust this based on your actual data and biological knowledge
group.cellType[1:8] <- "CD80"
group.cellType[9:16] <- "IL2"
group.cellType[17:24] <- "TNF"
# Name the vector with the cell types
names(group.cellType) <- cell_types
# Check the result
print(group.cellType)
Cluster_0 Cluster_1 Cluster_10 Cluster_11 Cluster_12 Cluster_13 Cluster_14 Cluster_15 Cluster_16 Cluster_17 Cluster_18 Cluster_19
"CD80" "CD80" "CD80" "CD80" "CD80" "CD80" "CD80" "CD80" "IL2" "IL2" "IL2" "IL2"
Cluster_2 Cluster_20 Cluster_21 Cluster_22 Cluster_23 Cluster_3 Cluster_4 Cluster_5 Cluster_6 Cluster_7 Cluster_8 Cluster_9
"IL2" "IL2" "IL2" "IL2" "TNF" "TNF" "TNF" "TNF" "TNF" "TNF" "TNF" "TNF"
netVisual_chord_cell(cellchat, signaling = pathways.show, group = group.cellType, title.name = paste0(pathways.show, " signaling network"))
Plot the aggregated cell-cell communication network at the signaling pathway level


#> Plot the aggregated cell-cell communication network at the signaling pathway level
# Compute the contribution of each ligand-receptor pair to the overall signaling pathway and visualize cell-cell
#communication mediated by a single ligand-receptor pair
netAnalysis_contribution(cellchat, signaling = pathways.show)

pairLR.CXCL <- extractEnrichedLR(cellchat, signaling = pathways.show, geneLR.return = FALSE)
LR.show <- pairLR.CXCL[1,] # show one ligand-receptor pair
# Hierarchy plot
vertex.receiver = seq(1,4) # a numeric vector
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, vertex.receiver = vertex.receiver)
[[1]]


#> [[1]]
# Circle plot
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "circle")
[[1]]


#> [[1]]
# Chord diagram
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "chord")
[[1]]


# Access all the signaling pathways showing significant communications
pathways.show.all <- cellchat@netP$pathways
# check the order of cell identity to set suitable vertex.receiver
levels(cellchat@idents)
[1] "Cluster_0" "Cluster_1" "Cluster_10" "Cluster_11" "Cluster_12" "Cluster_13" "Cluster_14" "Cluster_15" "Cluster_16"
[10] "Cluster_17" "Cluster_18" "Cluster_19" "Cluster_2" "Cluster_20" "Cluster_21" "Cluster_22" "Cluster_23" "Cluster_3"
[19] "Cluster_4" "Cluster_5" "Cluster_6" "Cluster_7" "Cluster_8" "Cluster_9"
vertex.receiver = seq(1,4)
for (i in 1:length(pathways.show.all)) {
# Visualize communication network associated with both signaling pathway and individual L-R pairs
netVisual(cellchat, signaling = pathways.show.all[i], vertex.receiver = vertex.receiver, layout = "hierarchy")
# Compute and visualize the contribution of each ligand-receptor pair to the overall signaling pathway
gg <- netAnalysis_contribution(cellchat, signaling = pathways.show.all[i])
ggsave(filename=paste0(pathways.show.all[i], "_L-R_contribution.pdf"), plot=gg, width = 3, height = 2, units = 'in', dpi = 300)
}
#----------------------------------------------------------------------------------------------------
# **Visualize cell-cell communication mediated by multiple ligand-receptors or signaling pathways**
#----------------------------------------------------------------------------------------------------
#(A) Bubble plot
# (1) show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), remove.isolate = FALSE)
Comparing communications on a single object

#> Comparing communications on a single object
# (2) show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), signaling = c("CCL","CXCL"), remove.isolate = FALSE)
Comparing communications on a single object

#> Comparing communications on a single object
# (3) show all the significant interactions (L-R pairs) based on user's input (defined by `pairLR.use`)
pairLR.use <- extractEnrichedLR(cellchat, signaling = c("CCL","CXCL","FGF"))
There is no significant communication of CXCL
There is no significant communication of FGF
netVisual_bubble(cellchat, sources.use = c(3,4), targets.use = c(5:8), pairLR.use = pairLR.use, remove.isolate = TRUE)
Comparing communications on a single object

#> Comparing communications on a single object
# (B) Chord diagram
# show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
# show all the interactions sending from Inflam.FIB
netVisual_chord_gene(cellchat, sources.use = 4, targets.use = c(5:11), lab.cex = 0.5,legend.pos.y = 30)


# show all the interactions received by Inflam.DC
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = 8, legend.pos.x = 15)


# show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), signaling = c("CCL","CXCL"),legend.pos.x = 8)


# show all the significant signaling pathways from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), slot.name = "netP", legend.pos.x = 10)


#----------------------------------------------------------------------------------------------------
# **Plot the signaling gene expression distribution using violin/dot plot**
#----------------------------------------------------------------------------------------------------
plotGeneExpression(cellchat, signaling = "CXCL", enriched.only = TRUE, type = "violin")
There is no significant communication of CXCL
Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.

plotGeneExpression(cellchat, signaling = "CXCL", enriched.only = FALSE)
Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.

6. Systems analysis of cell-cell communication network
#----------------------------------------------------------------------------------------------------
# **Part IV: Systems analysis of cell-cell communication network**
#----------------------------------------------------------------------------------------------------
# (A) Compute and visualize the network centrality scores
ptm = Sys.time()
# Compute the network centrality scores
cellchat <- netAnalysis_computeCentrality(cellchat, slot.name = "netP") # the slot 'netP' means the inferred intercellular communication network of signaling pathways
| | 0 % ~calculating
|++ | 4 % ~03s
|++++ | 8 % ~03s
|++++++ | 12% ~03s
|++++++++ | 16% ~02s
|++++++++++ | 20% ~02s
|++++++++++++ | 24% ~02s
|++++++++++++++ | 28% ~01s
|++++++++++++++++ | 32% ~01s
|++++++++++++++++++ | 36% ~01s
|++++++++++++++++++++ | 40% ~01s
|++++++++++++++++++++++ | 44% ~01s
|++++++++++++++++++++++++ | 48% ~01s
|++++++++++++++++++++++++++ | 52% ~01s
|++++++++++++++++++++++++++++ | 56% ~01s
|++++++++++++++++++++++++++++++ | 60% ~01s
|++++++++++++++++++++++++++++++++ | 64% ~01s
|++++++++++++++++++++++++++++++++++ | 68% ~00s
|++++++++++++++++++++++++++++++++++++ | 72% ~00s
|++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s
# Visualize the computed centrality scores using heatmap, allowing ready identification of major signaling roles of cell groups
netAnalysis_signalingRole_network(cellchat, signaling = pathways.show, width = 8, height = 2.5, font.size = 10)

#(B) Visualize dominant senders (sources) and receivers (targets) in a 2D space
# Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
gg1 <- netAnalysis_signalingRole_scatter(cellchat)
Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
#> Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
# Signaling role analysis on the cell-cell communication networks of interest
gg2 <- netAnalysis_signalingRole_scatter(cellchat, signaling = c("CXCL", "CCL"))
Signaling role analysis on the cell-cell communication network from user's input
#> Signaling role analysis on the cell-cell communication network from user's input
gg1 + gg2

# (C) Identify signals contributing the most to outgoing or incoming signaling of certain cell groups
# Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
ht1 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "outgoing")
ht2 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "incoming")
ht1 + ht2
Warning: Heatmap/annotation names are duplicated: Relative strength

# Signaling role analysis on the cell-cell communication networks of interest
ht <- netAnalysis_signalingRole_heatmap(cellchat, signaling = c("CXCL", "CCL"))
#---------------------------------------------------------------------------------------------------------------------------
# **Identify global communication patterns to explore how multiple cell types and signaling pathways coordinate together**
#----------------------------------------------------------------------------------------------------------------------------
# (A) Identify and visualize outgoing communication pattern of secreting cells
library(NMF)
Loading required package: registry
Loading required package: rngtools
Loading required package: cluster
NMF - BioConductor layer [OK] | Shared memory capabilities [NO: bigmemory] | Cores 2/2
To enable shared memory capabilities, try: install.extras('
NMF
')
Attaching package: ‘NMF’
The following objects are masked from ‘package:igraph’:
algorithm, compare
#> Loading required package: registry
#> Loading required package: rngtools
#> Loading required package: cluster
#> NMF - BioConductor layer [OK] | Shared memory capabilities [NO: bigmemory] | Cores 2/2
#> To enable shared memory capabilities, try: install.extras('
#> NMF
#> ')
#>
#> Attaching package: 'NMF'
#> The following objects are masked from 'package:igraph':
#>
#> algorithm, compare
library(ggalluvial)
selectK(cellchat, pattern = "outgoing")
Warning: Continuous limits supplied to discrete scale.
ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?
nPatterns = 6
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "outgoing", k = nPatterns)
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.

# river plot
netAnalysis_river(cellchat, pattern = "outgoing")
Please make sure you have load `library(ggalluvial)` when running this function

#> Please make sure you have load `library(ggalluvial)` when running this function
# dot plot
netAnalysis_dot(cellchat, pattern = "outgoing")

# (B) Identify and visualize incoming communication pattern of target cells
selectK(cellchat, pattern = "incoming")
Warning: Continuous limits supplied to discrete scale.
ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?
nPatterns = 3
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "incoming", k = nPatterns)
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.

# river plot
netAnalysis_river(cellchat, pattern = "incoming")
Please make sure you have load `library(ggalluvial)` when running this function

#> Please make sure you have load `library(ggalluvial)` when running this function
# dot plot
netAnalysis_dot(cellchat, pattern = "incoming")

#---------------------------------------------------------------------------------------------------------------------------
# **Manifold and classification learning analysis of signaling networks**
#----------------------------------------------------------------------------------------------------------------------------
# Identify signaling groups based on their functional similarity
#8. Identify signaling roles and patterns
cellchat <- computeNetSimilarity(cellchat, type = "functional")
cellchat <- netEmbedding(cellchat, type = "functional")
Manifold learning of the signaling networks for a single dataset
cellchat <- netClustering(cellchat, type = "functional")
Classification learning of the signaling networks for a single dataset
Warning: UNRELIABLE VALUE: One of the ‘future.apply’ iterations (‘future_sapply-1’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, specify 'future.seed=TRUE'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method. To disable this check, use 'future.seed = NULL', or set option 'future.rng.onMisuse' to "ignore".Warning: UNRELIABLE VALUE: One of the ‘future.apply’ iterations (‘future_sapply-2’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, specify 'future.seed=TRUE'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method. To disable this check, use 'future.seed = NULL', or set option 'future.rng.onMisuse' to "ignore".Warning: UNRELIABLE VALUE: One of the ‘future.apply’ iterations (‘future_sapply-3’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, specify 'future.seed=TRUE'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method. To disable this check, use 'future.seed = NULL', or set option 'future.rng.onMisuse' to "ignore".Warning: UNRELIABLE VALUE: One of the ‘future.apply’ iterations (‘future_sapply-4’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, specify 'future.seed=TRUE'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method. To disable this check, use 'future.seed = NULL', or set option 'future.rng.onMisuse' to "ignore".Warning: all eigenvalues are requested, eigen() is used insteadWarning: all eigenvalues are requested, eigen() is used instead
netVisual_embedding(cellchat, type = "functional", label.size = 3.5)
Warning: Using alpha for a discrete variable is not advised.

# Identify signaling groups based on structure similarity
#install umap-learn before running these commands
#pip install umap-learn
cellchat <- computeNetSimilarity(cellchat, type = "structural")
cellchat <- netEmbedding(cellchat, type = "structural")
Manifold learning of the signaling networks for a single dataset
#> Manifold learning of the signaling networks for a single dataset
cellchat <- netClustering(cellchat, type = "structural")
Classification learning of the signaling networks for a single dataset
Warning: UNRELIABLE VALUE: One of the ‘future.apply’ iterations (‘future_sapply-1’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, specify 'future.seed=TRUE'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method. To disable this check, use 'future.seed = NULL', or set option 'future.rng.onMisuse' to "ignore".Warning: UNRELIABLE VALUE: One of the ‘future.apply’ iterations (‘future_sapply-2’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, specify 'future.seed=TRUE'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method. To disable this check, use 'future.seed = NULL', or set option 'future.rng.onMisuse' to "ignore".Warning: UNRELIABLE VALUE: One of the ‘future.apply’ iterations (‘future_sapply-3’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, specify 'future.seed=TRUE'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method. To disable this check, use 'future.seed = NULL', or set option 'future.rng.onMisuse' to "ignore".Warning: UNRELIABLE VALUE: One of the ‘future.apply’ iterations (‘future_sapply-4’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, specify 'future.seed=TRUE'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method. To disable this check, use 'future.seed = NULL', or set option 'future.rng.onMisuse' to "ignore".Warning: all eigenvalues are requested, eigen() is used insteadWarning: all eigenvalues are requested, eigen() is used instead
#> Classification learning of the signaling networks for a single dataset
# Visualization in 2D-space
netVisual_embedding(cellchat, type = "structural", label.size = 3.5)
Warning: Using alpha for a discrete variable is not advised.

netVisual_embeddingZoomIn(cellchat, type = "structural", nCol = 2)

7. Save the CellChat object
save(cellchat, file = "cellCHAT_Analysis.Robj")
LS0tCnRpdGxlOiAiSW5mZXJlbmNlIGFuZCBhbmFseXNpcyBvZiBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiB1c2luZyBDZWxsQ2hhdCIKYXV0aG9yOiBOYXNpciBNYWhtb29kIEFiYmFzaQpkYXRlOiAiMjAyMy0wNi0wMyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKICAgIHRoZW1lOiBkYXJrbHkKLS0tCgojIDEuIGxvYWQgbGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoQ2VsbENoYXQpCmxpYnJhcnkocGF0Y2h3b3JrKQpvcHRpb25zKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKIyByZXRpY3VsYXRlOjp1c2VfcHl0aG9uKCIvVXNlcnMvc3VvcWluamluL2FuYWNvbmRhMy9iaW4vcHl0aG9uIiwgcmVxdWlyZWQ9VCkgCgpgYGAKCiMgMi4gTG9hZCBTZXVyYXQgT2JqZWN0CmBgYHtyIGxvYWRfc2V1cmF0T0JKfQoKI0xvYWQgU2V1cmF0IE9iamVjdCBJbnRlZ3JhdGVkIE9iamVjdApsb2FkKCJBUlNJTTBvbmx5X2NvcnJlY3RlZC5Sb2JqIikKCkFSU0lNMG9ubHkKCiMgU2V0IHRoZSBkZWZhdWx0IGFzc2F5IHRvICdSTkEnIG9yICdTQ1QnIGlmIGF2YWlsYWJsZQppZiAoIlJOQSIgJWluJSBuYW1lcyhBUlNJTTBvbmx5QGFzc2F5cykpIHsKICAgIERlZmF1bHRBc3NheShBUlNJTTBvbmx5KSA8LSAiUk5BIgp9IGVsc2UgaWYgKCJTQ1QiICVpbiUgbmFtZXMoQVJTSU0wb25seUBhc3NheXMpKSB7CiAgICBEZWZhdWx0QXNzYXkoQVJTSU0wb25seSkgPC0gIlNDVCIKfSBlbHNlIHsKICAgIHN0b3AoIk5laXRoZXIgUk5BIG5vciBTQ1QgYXNzYXkgZm91bmQgaW4gdGhlIFNldXJhdCBvYmplY3QuIFBsZWFzZSBlbnN1cmUgeW91ciBkYXRhIGhhcyBiZWVuIG5vcm1hbGl6ZWQgYW5kIGNvbnRhaW5zIG9uZSBvZiB0aGVzZSBhc3NheXMuIikKfQoKCmBgYAoKCiMgMy4gRGF0YSBpbnB1dCAmIHByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uIG9mIENlbGxDaGF0IG9iamVjdApgYGB7ciBEQVRBSU5QVVQsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqUGFydCBJOiBEYXRhIGlucHV0ICYgcHJvY2Vzc2luZyBhbmQgaW5pdGlhbGl6YXRpb24gb2YgQ2VsbENoYXQgb2JqZWN0KioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBMb2FkaW5nIGFuZCBQcmVwYXJpbmcgRGF0YQpBUlNJTTBvbmx5IDwtIEFkZE1ldGFEYXRhKG9iamVjdCA9IEFSU0lNMG9ubHksIAogICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gcGFzdGUwKCJDbHVzdGVyXyIsIEFSU0lNMG9ubHkkc2V1cmF0X2NsdXN0ZXJzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLm5hbWUgPSAnQ2x1c3RlcnMnKQoKQVJTSU0wb25seVtbIlJOQSJdXSA8LSBKb2luTGF5ZXJzKEFSU0lNMG9ubHlbWyJSTkEiXV0pCgoKIyBFeHRyYWN0IHRoZSBub3JtYWxpemVkIGRhdGEKZGF0YV9pbnB1dCA8LSBHZXRBc3NheURhdGEoQVJTSU0wb25seSwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJkYXRhIikKCiMxLiAgQ3JlYXRlIENlbGxDaGF0IG9iamVjdApjZWxsY2hhdCA8LSBjcmVhdGVDZWxsQ2hhdChvYmplY3QgPSBkYXRhX2lucHV0LCBtZXRhID0gQVJTSU0wb25seUBtZXRhLmRhdGEsIGdyb3VwLmJ5ID0gIkNsdXN0ZXJzIikKCgoKCiMyLiAgU2V0IHRoZSBsaWdhbmQtcmVjZXB0b3IgaW50ZXJhY3Rpb24gZGF0YWJhc2UKCmNlbGxjaGF0REIgPC0gQ2VsbENoYXREQi5odW1hbiAjIG9yIENlbGxDaGF0REIubW91c2UKc2hvd0RhdGFiYXNlQ2F0ZWdvcnkoY2VsbGNoYXREQikKCiMgU2hvdyB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhYmFzZQpkcGx5cjo6Z2xpbXBzZShjZWxsY2hhdERCJGludGVyYWN0aW9uKQoKIyB1c2UgYSBzdWJzZXQgb2YgQ2VsbENoYXREQiBmb3IgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gYW5hbHlzaXMKY2VsbGNoYXREQi51c2UgPC0gc3Vic2V0REIoY2VsbGNoYXREQiwgc2VhcmNoID0gIlNlY3JldGVkIFNpZ25hbGluZyIsIGtleSA9ICJhbm5vdGF0aW9uIikgIyB1c2UgU2VjcmV0ZWQgU2lnbmFsaW5nCgojIHNldCB0aGUgdXNlZCBkYXRhYmFzZSBpbiB0aGUgb2JqZWN0CmNlbGxjaGF0QERCIDwtIGNlbGxjaGF0REIudXNlCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipQcmVwcm9jZXNzaW5nIHRoZSBleHByZXNzaW9uIGRhdGEgZm9yIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIGFuYWx5c2lzKioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojMy4gIFByZXByb2Nlc3MgdGhlIGV4cHJlc3Npb24gZGF0YQpjZWxsY2hhdCA8LSBzdWJzZXREYXRhKGNlbGxjaGF0KQpjZWxsY2hhdCA8LSBpZGVudGlmeU92ZXJFeHByZXNzZWRHZW5lcyhjZWxsY2hhdCkKY2VsbGNoYXQgPC0gaWRlbnRpZnlPdmVyRXhwcmVzc2VkSW50ZXJhY3Rpb25zKGNlbGxjaGF0KQoKCgoKYGBgCgojIDQuIEluZmVyZW5jZSBvZiBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrCmBgYHtyIElORkVSRU5DRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqKlBhcnQgSUk6IEluZmVyZW5jZSBvZiBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrKioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqQ29tcHV0ZSB0aGUgY29tbXVuaWNhdGlvbiBwcm9iYWJpbGl0eSBhbmQgaW5mZXIgY2VsbHVsYXIgY29tbXVuaWNhdGlvbiBuZXR3b3JrKioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIzQuICBDb21wdXRlIGNvbW11bmljYXRpb24gcHJvYmFiaWxpdHkgYW5kIGluZmVyIGNlbGx1bGFyIGNvbW11bmljYXRpb24gbmV0d29yawpjZWxsY2hhdCA8LSBjb21wdXRlQ29tbXVuUHJvYihjZWxsY2hhdCkKY2VsbGNoYXQgPC0gZmlsdGVyQ29tbXVuaWNhdGlvbihjZWxsY2hhdCwgbWluLmNlbGxzID0gMTApCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipJbmZlciB0aGUgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gYXQgYSBzaWduYWxpbmcgcGF0aHdheSBsZXZlbCoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIzUuICBDb21wdXRlIGNvbW11bmljYXRpb24gYXQgdGhlIHBhdGh3YXkgbGV2ZWwKY2VsbGNoYXQgPC0gY29tcHV0ZUNvbW11blByb2JQYXRod2F5KGNlbGxjaGF0KQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqQ2FsY3VsYXRlIHRoZSBhZ2dyZWdhdGVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiM2LiAgQWdncmVnYXRlIHRoZSBpbmZlcnJlZCBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrCmNlbGxjaGF0IDwtIGFnZ3JlZ2F0ZU5ldChjZWxsY2hhdCkKCgojNy4gIFZpc3VhbGl6ZSB0aGUgY29tbXVuaWNhdGlvbiBuZXR3b3JrCmdyb3VwU2l6ZSA8LSBhcy5udW1lcmljKHRhYmxlKGNlbGxjaGF0QGlkZW50cykpCgpuZXRWaXN1YWxfY2lyY2xlKGNlbGxjaGF0QG5ldCRjb3VudCwgdmVydGV4LndlaWdodCA9IGdyb3VwU2l6ZSwgd2VpZ2h0LnNjYWxlID0gVCwgbGFiZWwuZWRnZT0gRiwgdGl0bGUubmFtZSA9ICJOdW1iZXIgb2YgaW50ZXJhY3Rpb25zIikKbmV0VmlzdWFsX2NpcmNsZShjZWxsY2hhdEBuZXQkd2VpZ2h0LCB2ZXJ0ZXgud2VpZ2h0ID0gZ3JvdXBTaXplLCB3ZWlnaHQuc2NhbGUgPSBULCBsYWJlbC5lZGdlPSBGLCB0aXRsZS5uYW1lID0gIkludGVyYWN0aW9uIHdlaWdodHMvc3RyZW5ndGgiKQoKbWF0IDwtIGNlbGxjaGF0QG5ldCR3ZWlnaHQKcGFyKG1mcm93ID0gYygzLDQpLCB4cGQ9VFJVRSkKZm9yIChpIGluIDE6bnJvdyhtYXQpKSB7CiAgbWF0MiA8LSBtYXRyaXgoMCwgbnJvdyA9IG5yb3cobWF0KSwgbmNvbCA9IG5jb2wobWF0KSwgZGltbmFtZXMgPSBkaW1uYW1lcyhtYXQpKQogIG1hdDJbaSwgXSA8LSBtYXRbaSwgXQogIG5ldFZpc3VhbF9jaXJjbGUobWF0MiwgdmVydGV4LndlaWdodCA9IGdyb3VwU2l6ZSwgd2VpZ2h0LnNjYWxlID0gVCwgZWRnZS53ZWlnaHQubWF4ID0gbWF4KG1hdCksIHRpdGxlLm5hbWUgPSByb3duYW1lcyhtYXQpW2ldKQp9CgpgYGAKIyA1LiBWaXN1YWxpemF0aW9uIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsKYGBge3IgVklTVUFMSVpBVElPTiwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqKlBhcnQgSUlJOiBWaXN1YWxpemF0aW9uIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqKlZpc3VhbGl6ZSBlYWNoIHNpZ25hbGluZyBwYXRod2F5IHVzaW5nIEhpZXJhcmNoeSBwbG90LCBDaXJjbGUgcGxvdCBvciBDaG9yZCBkaWFncmFtKioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAKcGF0aHdheXMuc2hvdyA8LSBjKCJDRDcwIikgCiMgSGllcmFyY2h5IHBsb3QKIyBIZXJlIHdlIGRlZmluZSBgdmVydGV4LnJlY2VpdmVgIHNvIHRoYXQgdGhlIGxlZnQgcG9ydGlvbiBvZiB0aGUgaGllcmFyY2h5IHBsb3Qgc2hvd3Mgc2lnbmFsaW5nIHRvIGZpYnJvYmxhc3QgYW5kIHRoZSByaWdodCBwb3J0aW9uIHNob3dzIHNpZ25hbGluZyB0byBpbW11bmUgY2VsbHMgCnZlcnRleC5yZWNlaXZlciA9IHNlcSgxLDQpICMgYSBudW1lcmljIHZlY3Rvci4gCm5ldFZpc3VhbF9hZ2dyZWdhdGUoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csICB2ZXJ0ZXgucmVjZWl2ZXIgPSB2ZXJ0ZXgucmVjZWl2ZXIpCiMgQ2lyY2xlIHBsb3QKcGFyKG1mcm93PWMoMSwxKSkKbmV0VmlzdWFsX2FnZ3JlZ2F0ZShjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgbGF5b3V0ID0gImNpcmNsZSIpCgoKIyBDaG9yZCBkaWFncmFtCnBhcihtZnJvdz1jKDEsMSkpCm5ldFZpc3VhbF9hZ2dyZWdhdGUoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIGxheW91dCA9ICJjaG9yZCIpCgojIEhlYXRtYXAKcGFyKG1mcm93PWMoMSwxKSkKbmV0VmlzdWFsX2hlYXRtYXAoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIGNvbG9yLmhlYXRtYXAgPSAiUmVkcyIpCiM+IERvIGhlYXRtYXAgYmFzZWQgb24gYSBzaW5nbGUgb2JqZWN0CgoKCiMgR2V0IHRoZSBsZXZlbHMgb2YgY2VsbCB0eXBlcwpjZWxsX3R5cGVzIDwtIGxldmVscyhjZWxsY2hhdEBpZGVudHMpCgojIENob3JkIGRpYWdyYW0KZ3JvdXAuY2VsbFR5cGUgPC0gYyhyZXAoIkNEODAiLCA0KSwgcmVwKCJJTDIiLCA0KSwgcmVwKCJUTkYiLCA0KSkgCgpncm91cC5jZWxsVHlwZSA8LSByZXAoTkEsIGxlbmd0aChjZWxsX3R5cGVzKSkKCiMgQXNzaWduIGVhY2ggY2VsbCB0eXBlIHRvIGEgZ3JvdXAKIyBZb3UnbGwgbmVlZCB0byBhZGp1c3QgdGhpcyBiYXNlZCBvbiB5b3VyIGFjdHVhbCBkYXRhIGFuZCBiaW9sb2dpY2FsIGtub3dsZWRnZQpncm91cC5jZWxsVHlwZVsxOjhdIDwtICJDRDgwIgpncm91cC5jZWxsVHlwZVs5OjE2XSA8LSAiSUwyIgpncm91cC5jZWxsVHlwZVsxNzoyNF0gPC0gIlRORiIKCiMgTmFtZSB0aGUgdmVjdG9yIHdpdGggdGhlIGNlbGwgdHlwZXMKbmFtZXMoZ3JvdXAuY2VsbFR5cGUpIDwtIGNlbGxfdHlwZXMKCiMgQ2hlY2sgdGhlIHJlc3VsdApwcmludChncm91cC5jZWxsVHlwZSkKCm5ldFZpc3VhbF9jaG9yZF9jZWxsKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCBncm91cCA9IGdyb3VwLmNlbGxUeXBlLCB0aXRsZS5uYW1lID0gcGFzdGUwKHBhdGh3YXlzLnNob3csICIgc2lnbmFsaW5nIG5ldHdvcmsiKSkKIz4gUGxvdCB0aGUgYWdncmVnYXRlZCBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrIGF0IHRoZSBzaWduYWxpbmcgcGF0aHdheSBsZXZlbAoKCiAgCiMgQ29tcHV0ZSB0aGUgY29udHJpYnV0aW9uIG9mIGVhY2ggbGlnYW5kLXJlY2VwdG9yIHBhaXIgdG8gdGhlIG92ZXJhbGwgc2lnbmFsaW5nIHBhdGh3YXkgYW5kIHZpc3VhbGl6ZSBjZWxsLWNlbGwgCiNjb21tdW5pY2F0aW9uIG1lZGlhdGVkIGJ5IGEgc2luZ2xlIGxpZ2FuZC1yZWNlcHRvciBwYWlyCgpuZXRBbmFseXNpc19jb250cmlidXRpb24oY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3cpCgpwYWlyTFIuQ1hDTCA8LSBleHRyYWN0RW5yaWNoZWRMUihjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgZ2VuZUxSLnJldHVybiA9IEZBTFNFKQpMUi5zaG93IDwtIHBhaXJMUi5DWENMWzEsXSAjIHNob3cgb25lIGxpZ2FuZC1yZWNlcHRvciBwYWlyCiMgSGllcmFyY2h5IHBsb3QKdmVydGV4LnJlY2VpdmVyID0gc2VxKDEsNCkgIyBhIG51bWVyaWMgdmVjdG9yCm5ldFZpc3VhbF9pbmRpdmlkdWFsKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCAgcGFpckxSLnVzZSA9IExSLnNob3csIHZlcnRleC5yZWNlaXZlciA9IHZlcnRleC5yZWNlaXZlcikKIz4gW1sxXV0KIyBDaXJjbGUgcGxvdApuZXRWaXN1YWxfaW5kaXZpZHVhbChjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgcGFpckxSLnVzZSA9IExSLnNob3csIGxheW91dCA9ICJjaXJjbGUiKQoKCgojPiBbWzFdXQojIENob3JkIGRpYWdyYW0KbmV0VmlzdWFsX2luZGl2aWR1YWwoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIHBhaXJMUi51c2UgPSBMUi5zaG93LCBsYXlvdXQgPSAiY2hvcmQiKQoKIyBBY2Nlc3MgYWxsIHRoZSBzaWduYWxpbmcgcGF0aHdheXMgc2hvd2luZyBzaWduaWZpY2FudCBjb21tdW5pY2F0aW9ucwpwYXRod2F5cy5zaG93LmFsbCA8LSBjZWxsY2hhdEBuZXRQJHBhdGh3YXlzCiMgY2hlY2sgdGhlIG9yZGVyIG9mIGNlbGwgaWRlbnRpdHkgdG8gc2V0IHN1aXRhYmxlIHZlcnRleC5yZWNlaXZlcgpsZXZlbHMoY2VsbGNoYXRAaWRlbnRzKQp2ZXJ0ZXgucmVjZWl2ZXIgPSBzZXEoMSw0KQpmb3IgKGkgaW4gMTpsZW5ndGgocGF0aHdheXMuc2hvdy5hbGwpKSB7CiAgIyBWaXN1YWxpemUgY29tbXVuaWNhdGlvbiBuZXR3b3JrIGFzc29jaWF0ZWQgd2l0aCBib3RoIHNpZ25hbGluZyBwYXRod2F5IGFuZCBpbmRpdmlkdWFsIEwtUiBwYWlycwogIG5ldFZpc3VhbChjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdy5hbGxbaV0sIHZlcnRleC5yZWNlaXZlciA9IHZlcnRleC5yZWNlaXZlciwgbGF5b3V0ID0gImhpZXJhcmNoeSIpCiAgIyBDb21wdXRlIGFuZCB2aXN1YWxpemUgdGhlIGNvbnRyaWJ1dGlvbiBvZiBlYWNoIGxpZ2FuZC1yZWNlcHRvciBwYWlyIHRvIHRoZSBvdmVyYWxsIHNpZ25hbGluZyBwYXRod2F5CiAgZ2cgPC0gbmV0QW5hbHlzaXNfY29udHJpYnV0aW9uKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LmFsbFtpXSkKICBnZ3NhdmUoZmlsZW5hbWU9cGFzdGUwKHBhdGh3YXlzLnNob3cuYWxsW2ldLCAiX0wtUl9jb250cmlidXRpb24ucGRmIiksIHBsb3Q9Z2csIHdpZHRoID0gMywgaGVpZ2h0ID0gMiwgdW5pdHMgPSAnaW4nLCBkcGkgPSAzMDApCn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipWaXN1YWxpemUgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbWVkaWF0ZWQgYnkgbXVsdGlwbGUgbGlnYW5kLXJlY2VwdG9ycyBvciBzaWduYWxpbmcgcGF0aHdheXMqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojKEEpIEJ1YmJsZSBwbG90CgojICgxKSBzaG93IGFsbCB0aGUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIChMLVIgcGFpcnMpIGZyb20gc29tZSBjZWxsIGdyb3VwcyAoZGVmaW5lZCBieSAnc291cmNlcy51c2UnKSB0byBvdGhlciBjZWxsIGdyb3VwcyAoZGVmaW5lZCBieSAndGFyZ2V0cy51c2UnKQpuZXRWaXN1YWxfYnViYmxlKGNlbGxjaGF0LCBzb3VyY2VzLnVzZSA9IDQsIHRhcmdldHMudXNlID0gYyg1OjExKSwgcmVtb3ZlLmlzb2xhdGUgPSBGQUxTRSkKIz4gQ29tcGFyaW5nIGNvbW11bmljYXRpb25zIG9uIGEgc2luZ2xlIG9iamVjdAoKCgojICgyKSBzaG93IGFsbCB0aGUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIChMLVIgcGFpcnMpIGFzc29jaWF0ZWQgd2l0aCBjZXJ0YWluIHNpZ25hbGluZyBwYXRod2F5cwpuZXRWaXN1YWxfYnViYmxlKGNlbGxjaGF0LCBzb3VyY2VzLnVzZSA9IDQsIHRhcmdldHMudXNlID0gYyg1OjExKSwgc2lnbmFsaW5nID0gYygiQ0NMIiwiQ1hDTCIpLCByZW1vdmUuaXNvbGF0ZSA9IEZBTFNFKQojPiBDb21wYXJpbmcgY29tbXVuaWNhdGlvbnMgb24gYSBzaW5nbGUgb2JqZWN0CgoKIyAoMykgc2hvdyBhbGwgdGhlIHNpZ25pZmljYW50IGludGVyYWN0aW9ucyAoTC1SIHBhaXJzKSBiYXNlZCBvbiB1c2VyJ3MgaW5wdXQgKGRlZmluZWQgYnkgYHBhaXJMUi51c2VgKQpwYWlyTFIudXNlIDwtIGV4dHJhY3RFbnJpY2hlZExSKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBjKCJDQ0wiLCJDWENMIiwiRkdGIikpCm5ldFZpc3VhbF9idWJibGUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gYygzLDQpLCB0YXJnZXRzLnVzZSA9IGMoNTo4KSwgcGFpckxSLnVzZSA9IHBhaXJMUi51c2UsIHJlbW92ZS5pc29sYXRlID0gVFJVRSkKIz4gQ29tcGFyaW5nIGNvbW11bmljYXRpb25zIG9uIGEgc2luZ2xlIG9iamVjdAoKCiMgKEIpIENob3JkIGRpYWdyYW0KCiMgc2hvdyBhbGwgdGhlIHNpZ25pZmljYW50IGludGVyYWN0aW9ucyAoTC1SIHBhaXJzKSBmcm9tIHNvbWUgY2VsbCBncm91cHMgKGRlZmluZWQgYnkgJ3NvdXJjZXMudXNlJykgdG8gb3RoZXIgY2VsbCBncm91cHMgKGRlZmluZWQgYnkgJ3RhcmdldHMudXNlJykKIyBzaG93IGFsbCB0aGUgaW50ZXJhY3Rpb25zIHNlbmRpbmcgZnJvbSBJbmZsYW0uRklCCm5ldFZpc3VhbF9jaG9yZF9nZW5lKGNlbGxjaGF0LCBzb3VyY2VzLnVzZSA9IDQsIHRhcmdldHMudXNlID0gYyg1OjExKSwgbGFiLmNleCA9IDAuNSxsZWdlbmQucG9zLnkgPSAzMCkKCgojIHNob3cgYWxsIHRoZSBpbnRlcmFjdGlvbnMgcmVjZWl2ZWQgYnkgSW5mbGFtLkRDCm5ldFZpc3VhbF9jaG9yZF9nZW5lKGNlbGxjaGF0LCBzb3VyY2VzLnVzZSA9IGMoMSwyLDMsNCksIHRhcmdldHMudXNlID0gOCwgbGVnZW5kLnBvcy54ID0gMTUpCgojIHNob3cgYWxsIHRoZSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMgKEwtUiBwYWlycykgYXNzb2NpYXRlZCB3aXRoIGNlcnRhaW4gc2lnbmFsaW5nIHBhdGh3YXlzCm5ldFZpc3VhbF9jaG9yZF9nZW5lKGNlbGxjaGF0LCBzb3VyY2VzLnVzZSA9IGMoMSwyLDMsNCksIHRhcmdldHMudXNlID0gYyg1OjExKSwgc2lnbmFsaW5nID0gYygiQ0NMIiwiQ1hDTCIpLGxlZ2VuZC5wb3MueCA9IDgpCgojIHNob3cgYWxsIHRoZSBzaWduaWZpY2FudCBzaWduYWxpbmcgcGF0aHdheXMgZnJvbSBzb21lIGNlbGwgZ3JvdXBzIChkZWZpbmVkIGJ5ICdzb3VyY2VzLnVzZScpIHRvIG90aGVyIGNlbGwgZ3JvdXBzIChkZWZpbmVkIGJ5ICd0YXJnZXRzLnVzZScpCm5ldFZpc3VhbF9jaG9yZF9nZW5lKGNlbGxjaGF0LCBzb3VyY2VzLnVzZSA9IGMoMSwyLDMsNCksIHRhcmdldHMudXNlID0gYyg1OjExKSwgc2xvdC5uYW1lID0gIm5ldFAiLCBsZWdlbmQucG9zLnggPSAxMCkKCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqUGxvdCB0aGUgc2lnbmFsaW5nIGdlbmUgZXhwcmVzc2lvbiBkaXN0cmlidXRpb24gdXNpbmcgdmlvbGluL2RvdCBwbG90KioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnBsb3RHZW5lRXhwcmVzc2lvbihjZWxsY2hhdCwgc2lnbmFsaW5nID0gIkNYQ0wiLCBlbnJpY2hlZC5vbmx5ID0gVFJVRSwgdHlwZSA9ICJ2aW9saW4iKQoKCnBsb3RHZW5lRXhwcmVzc2lvbihjZWxsY2hhdCwgc2lnbmFsaW5nID0gIkNYQ0wiLCBlbnJpY2hlZC5vbmx5ID0gRkFMU0UpCgpgYGAKCiMgNi4gU3lzdGVtcyBhbmFseXNpcyBvZiBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrCmBgYHtyIFNZU1RFTVMtQU5BTFlTSVMsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqUGFydCBJVjogU3lzdGVtcyBhbmFseXNpcyBvZiBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrKioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAoQSkgQ29tcHV0ZSBhbmQgdmlzdWFsaXplIHRoZSBuZXR3b3JrIGNlbnRyYWxpdHkgc2NvcmVzCgpwdG0gPSBTeXMudGltZSgpCiMgQ29tcHV0ZSB0aGUgbmV0d29yayBjZW50cmFsaXR5IHNjb3JlcwpjZWxsY2hhdCA8LSBuZXRBbmFseXNpc19jb21wdXRlQ2VudHJhbGl0eShjZWxsY2hhdCwgc2xvdC5uYW1lID0gIm5ldFAiKSAjIHRoZSBzbG90ICduZXRQJyBtZWFucyB0aGUgaW5mZXJyZWQgaW50ZXJjZWxsdWxhciBjb21tdW5pY2F0aW9uIG5ldHdvcmsgb2Ygc2lnbmFsaW5nIHBhdGh3YXlzCiMgVmlzdWFsaXplIHRoZSBjb21wdXRlZCBjZW50cmFsaXR5IHNjb3JlcyB1c2luZyBoZWF0bWFwLCBhbGxvd2luZyByZWFkeSBpZGVudGlmaWNhdGlvbiBvZiBtYWpvciBzaWduYWxpbmcgcm9sZXMgb2YgY2VsbCBncm91cHMKbmV0QW5hbHlzaXNfc2lnbmFsaW5nUm9sZV9uZXR3b3JrKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCB3aWR0aCA9IDgsIGhlaWdodCA9IDIuNSwgZm9udC5zaXplID0gMTApCgoKIyhCKSBWaXN1YWxpemUgZG9taW5hbnQgc2VuZGVycyAoc291cmNlcykgYW5kIHJlY2VpdmVycyAodGFyZ2V0cykgaW4gYSAyRCBzcGFjZQoKIyBTaWduYWxpbmcgcm9sZSBhbmFseXNpcyBvbiB0aGUgYWdncmVnYXRlZCBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrIGZyb20gYWxsIHNpZ25hbGluZyBwYXRod2F5cwpnZzEgPC0gbmV0QW5hbHlzaXNfc2lnbmFsaW5nUm9sZV9zY2F0dGVyKGNlbGxjaGF0KQojPiBTaWduYWxpbmcgcm9sZSBhbmFseXNpcyBvbiB0aGUgYWdncmVnYXRlZCBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrIGZyb20gYWxsIHNpZ25hbGluZyBwYXRod2F5cwojIFNpZ25hbGluZyByb2xlIGFuYWx5c2lzIG9uIHRoZSBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrcyBvZiBpbnRlcmVzdApnZzIgPC0gbmV0QW5hbHlzaXNfc2lnbmFsaW5nUm9sZV9zY2F0dGVyKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBjKCJDWENMIiwgIkNDTCIpKQojPiBTaWduYWxpbmcgcm9sZSBhbmFseXNpcyBvbiB0aGUgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbmV0d29yayBmcm9tIHVzZXIncyBpbnB1dApnZzEgKyBnZzIKCgojIChDKSBJZGVudGlmeSBzaWduYWxzIGNvbnRyaWJ1dGluZyB0aGUgbW9zdCB0byBvdXRnb2luZyBvciBpbmNvbWluZyBzaWduYWxpbmcgb2YgY2VydGFpbiBjZWxsIGdyb3VwcwojIFNpZ25hbGluZyByb2xlIGFuYWx5c2lzIG9uIHRoZSBhZ2dyZWdhdGVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsgZnJvbSBhbGwgc2lnbmFsaW5nIHBhdGh3YXlzCmh0MSA8LSBuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX2hlYXRtYXAoY2VsbGNoYXQsIHBhdHRlcm4gPSAib3V0Z29pbmciKQpodDIgPC0gbmV0QW5hbHlzaXNfc2lnbmFsaW5nUm9sZV9oZWF0bWFwKGNlbGxjaGF0LCBwYXR0ZXJuID0gImluY29taW5nIikKaHQxICsgaHQyCgojIFNpZ25hbGluZyByb2xlIGFuYWx5c2lzIG9uIHRoZSBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrcyBvZiBpbnRlcmVzdApodCA8LSBuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX2hlYXRtYXAoY2VsbGNoYXQsIHNpZ25hbGluZyA9IGMoIkNYQ0wiLCAiQ0NMIikpCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqSWRlbnRpZnkgZ2xvYmFsIGNvbW11bmljYXRpb24gcGF0dGVybnMgdG8gZXhwbG9yZSBob3cgbXVsdGlwbGUgY2VsbCB0eXBlcyBhbmQgc2lnbmFsaW5nIHBhdGh3YXlzIGNvb3JkaW5hdGUgdG9nZXRoZXIqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyAoQSkgSWRlbnRpZnkgYW5kIHZpc3VhbGl6ZSBvdXRnb2luZyBjb21tdW5pY2F0aW9uIHBhdHRlcm4gb2Ygc2VjcmV0aW5nIGNlbGxzCgpsaWJyYXJ5KE5NRikKIz4gTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiByZWdpc3RyeQojPiBMb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2U6IHJuZ3Rvb2xzCiM+IExvYWRpbmcgcmVxdWlyZWQgcGFja2FnZTogY2x1c3RlcgojPiBOTUYgLSBCaW9Db25kdWN0b3IgbGF5ZXIgW09LXSB8IFNoYXJlZCBtZW1vcnkgY2FwYWJpbGl0aWVzIFtOTzogYmlnbWVtb3J5XSB8IENvcmVzIDIvMgojPiAgIFRvIGVuYWJsZSBzaGFyZWQgbWVtb3J5IGNhcGFiaWxpdGllcywgdHJ5OiBpbnN0YWxsLmV4dHJhcygnCiM+IE5NRgojPiAnKQojPiAKIz4gQXR0YWNoaW5nIHBhY2thZ2U6ICdOTUYnCiM+IFRoZSBmb2xsb3dpbmcgb2JqZWN0cyBhcmUgbWFza2VkIGZyb20gJ3BhY2thZ2U6aWdyYXBoJzoKIz4gCiM+ICAgICBhbGdvcml0aG0sIGNvbXBhcmUKbGlicmFyeShnZ2FsbHV2aWFsKQoKc2VsZWN0SyhjZWxsY2hhdCwgcGF0dGVybiA9ICJvdXRnb2luZyIpCgoKblBhdHRlcm5zID0gNgoKY2VsbGNoYXQgPC0gaWRlbnRpZnlDb21tdW5pY2F0aW9uUGF0dGVybnMoY2VsbGNoYXQsIHBhdHRlcm4gPSAib3V0Z29pbmciLCBrID0gblBhdHRlcm5zKQoKCiMgcml2ZXIgcGxvdApuZXRBbmFseXNpc19yaXZlcihjZWxsY2hhdCwgcGF0dGVybiA9ICJvdXRnb2luZyIpCiM+IFBsZWFzZSBtYWtlIHN1cmUgeW91IGhhdmUgbG9hZCBgbGlicmFyeShnZ2FsbHV2aWFsKWAgd2hlbiBydW5uaW5nIHRoaXMgZnVuY3Rpb24KCgojIGRvdCBwbG90Cm5ldEFuYWx5c2lzX2RvdChjZWxsY2hhdCwgcGF0dGVybiA9ICJvdXRnb2luZyIpCgoKCiMgKEIpIElkZW50aWZ5IGFuZCB2aXN1YWxpemUgaW5jb21pbmcgY29tbXVuaWNhdGlvbiBwYXR0ZXJuIG9mIHRhcmdldCBjZWxscwoKc2VsZWN0SyhjZWxsY2hhdCwgcGF0dGVybiA9ICJpbmNvbWluZyIpCgoKCiBuUGF0dGVybnMgPSAzCmNlbGxjaGF0IDwtIGlkZW50aWZ5Q29tbXVuaWNhdGlvblBhdHRlcm5zKGNlbGxjaGF0LCBwYXR0ZXJuID0gImluY29taW5nIiwgayA9IG5QYXR0ZXJucykKCgojIHJpdmVyIHBsb3QKbmV0QW5hbHlzaXNfcml2ZXIoY2VsbGNoYXQsIHBhdHRlcm4gPSAiaW5jb21pbmciKQojPiBQbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIGxvYWQgYGxpYnJhcnkoZ2dhbGx1dmlhbClgIHdoZW4gcnVubmluZyB0aGlzIGZ1bmN0aW9uCgoKIyBkb3QgcGxvdApuZXRBbmFseXNpc19kb3QoY2VsbGNoYXQsIHBhdHRlcm4gPSAiaW5jb21pbmciKQoKCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqTWFuaWZvbGQgYW5kIGNsYXNzaWZpY2F0aW9uIGxlYXJuaW5nIGFuYWx5c2lzIG9mIHNpZ25hbGluZyBuZXR3b3JrcyoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIElkZW50aWZ5IHNpZ25hbGluZyBncm91cHMgYmFzZWQgb24gdGhlaXIgZnVuY3Rpb25hbCBzaW1pbGFyaXR5CiM4LiAgSWRlbnRpZnkgc2lnbmFsaW5nIHJvbGVzIGFuZCBwYXR0ZXJucwpjZWxsY2hhdCA8LSBjb21wdXRlTmV0U2ltaWxhcml0eShjZWxsY2hhdCwgdHlwZSA9ICJmdW5jdGlvbmFsIikKY2VsbGNoYXQgPC0gbmV0RW1iZWRkaW5nKGNlbGxjaGF0LCB0eXBlID0gImZ1bmN0aW9uYWwiKQpjZWxsY2hhdCA8LSBuZXRDbHVzdGVyaW5nKGNlbGxjaGF0LCB0eXBlID0gImZ1bmN0aW9uYWwiKQpuZXRWaXN1YWxfZW1iZWRkaW5nKGNlbGxjaGF0LCB0eXBlID0gImZ1bmN0aW9uYWwiLCBsYWJlbC5zaXplID0gMy41KQoKIyBJZGVudGlmeSBzaWduYWxpbmcgZ3JvdXBzIGJhc2VkIG9uIHN0cnVjdHVyZSBzaW1pbGFyaXR5CiNpbnN0YWxsIHVtYXAtbGVhcm4gYmVmb3JlIHJ1bm5pbmcgdGhlc2UgY29tbWFuZHMKICNwaXAgaW5zdGFsbCB1bWFwLWxlYXJuCmNlbGxjaGF0IDwtIGNvbXB1dGVOZXRTaW1pbGFyaXR5KGNlbGxjaGF0LCB0eXBlID0gInN0cnVjdHVyYWwiKQpjZWxsY2hhdCA8LSBuZXRFbWJlZGRpbmcoY2VsbGNoYXQsIHR5cGUgPSAic3RydWN0dXJhbCIpCiM+IE1hbmlmb2xkIGxlYXJuaW5nIG9mIHRoZSBzaWduYWxpbmcgbmV0d29ya3MgZm9yIGEgc2luZ2xlIGRhdGFzZXQKY2VsbGNoYXQgPC0gbmV0Q2x1c3RlcmluZyhjZWxsY2hhdCwgdHlwZSA9ICJzdHJ1Y3R1cmFsIikKIz4gQ2xhc3NpZmljYXRpb24gbGVhcm5pbmcgb2YgdGhlIHNpZ25hbGluZyBuZXR3b3JrcyBmb3IgYSBzaW5nbGUgZGF0YXNldAojIFZpc3VhbGl6YXRpb24gaW4gMkQtc3BhY2UKbmV0VmlzdWFsX2VtYmVkZGluZyhjZWxsY2hhdCwgdHlwZSA9ICJzdHJ1Y3R1cmFsIiwgbGFiZWwuc2l6ZSA9IDMuNSkKCgpuZXRWaXN1YWxfZW1iZWRkaW5nWm9vbUluKGNlbGxjaGF0LCB0eXBlID0gInN0cnVjdHVyYWwiLCBuQ29sID0gMikKCmBgYAojIDcuIFNhdmUgdGhlIENlbGxDaGF0IG9iamVjdApgYGB7ciBTQVZFLUNFTExDSEFULCBldmFsID0gRkFMU0V9CgpzYXZlKGNlbGxjaGF0LCBmaWxlID0gImNlbGxDSEFUX0FuYWx5c2lzLlJvYmoiKQoKYGBgCg==