Giới thiệu bộ
dữ liệu
Bộ dữ liệu iris là một tập hợp các dữ liệu về các loài hoa iris thu
thập bởi nhà thực vật học Ronald Fisher vào những năm 1930. Bộ dữ liệu
này chứa thông tin về các đặc điểm morfôlogi của các mẫu hoa iris thuộc
ba loài khác nhau: Iris setosa, Iris versicolor và Iris virginica. Cụ
thể, các đặc điểm này bao gồm:
- Sepal Length (Chiều dài lá đài): Độ dài của lá đài trong đơn vị
centimet.
- Sepal Width (Chiều rộng lá đài): Độ rộng của lá đài trong đơn vị
centimet.
- Petal Length (Chiều dài cánh hoa): Độ dài của cánh hoa trong đơn vị
centimet.
- Petal Width (Chiều rộng cánh hoa): Độ rộng của cánh hoa trong đơn vị
centimet. Mỗi mẫu hoa iris được ghi lại thông qua bốn thuộc tính trên và
được gắn nhãn với loài tương ứng của nó.
Bộ dữ liệu iris gồm tổng cộng 150 mẫu, với mỗi loài hoa iris có 50
mẫu. Bộ dữ liệu này đã trở thành một bộ dữ liệu kinh điển trong lĩnh vực
học máy và thống kê, được sử dụng rộng rãi để minh họa các kỹ thuật phân
loại, phân tích phân biệt và khám phá dữ liệu.
Với các thông tin về kích thước và hình dạng của lá đài và cánh hoa,
bộ dữ liệu iris cung cấp một nền tảng lý tưởng để nghiên cứu và áp dụng
các phương pháp phân loại và nhận dạng mẫu, cũng như hiểu rõ hơn về sự
đa dạng của loài hoa iris.
Biểu đồ
1
library(tidyverse)
data("iris")
hoa <- iris
library(dplyr)
library(ggplot2)
# Tính toán chiều dài lá trung bình của mỗi loài hoa iris
iris_avg_sepal_length <- iris %>%
group_by(Species) %>%
summarise(avg_sepal_length = mean(Sepal.Length))
# Vẽ biểu đồ cột
ggplot(iris_avg_sepal_length, aes(x = Species, y = avg_sepal_length, fill = Species)) +
geom_bar(stat = "identity", color = "black") +
labs(title = "Độ dài lá trung bình của mỗi loài",
x = "Loài",
y = "Độ dài lá trung bình")

Giải thích biểu đồ 1 - group_by(Species): Hàm
group_by() của gói dplyr được sử dụng để nhóm dữ liệu theo một biến cụ
thể, trong trường hợp này là cột Species.
summarise(avg_sepal_length = mean(Sepal.Length)): Hàm summarise()
của dplyr được sử dụng để tóm tắt dữ liệu. Trong trường hợp này, chúng
ta tính giá trị trung bình của cột Sepal.Length cho mỗi nhóm loài hoa
Species, và lưu kết quả vào cột mới avg_sepal_length. Kết quả sẽ được
lưu vào một data frame mới có tên là iris_avg_sepal_length.
ggplot(): Hàm này khởi tạo một đối tượng ggplot. Trong trường hợp
này, chúng ta cung cấp dữ liệu iris_avg_sepal_length làm dữ liệu đầu
vào.
aes(): Hàm này được sử dụng để xác định các aesthetics (mỹ thuật)
cho biểu đồ. Trong trường hợp này, chúng ta gán cột Species cho trục x
và cột avg_sepal_length cho trục y, và tô màu theo Species.
-geom_bar(): Hàm này được sử dụng để vẽ biểu đồ cột. Tham số stat =
“identity” đảm bảo rằng chiều cao của các cột được lấy trực tiếp từ dữ
liệu (không thực hiện tính toán lại).
-labs(): Hàm này được sử dụng để gán nhãn cho các trục và biểu
đồ.
- biểu đồ này sẽ tính toán chiều dài lá trung bình của mỗi loài hoa
iris và sau đó vẽ biểu đồ cột để so sánh giữa các loài. Biểu đồ cột sẽ
có trục x là tên loài hoa iris và trục y là chiều dài lá trung bình,
được tô màu khác nhau cho mỗi loài hoa để dễ nhận biết.
Biểu đồ
2
library(ggplot2)
# Tính số lượng của mỗi loài hoa iris
species_count <- table(iris$Species)
# Tạo biểu đồ pie chart
pie_chart <- ggplot(data = NULL, aes(x = "", y = species_count, fill = names(species_count))) +
geom_bar(stat = "identity") +
coord_polar("y", start = 0) +
labs(title = "Phân bố của các loài hoa",
fill = "Loài") +
theme_void()
# Hiển thị biểu đồ
print(pie_chart)
## Don't know how to automatically pick scale for object of type <table>.
## Defaulting to continuous.

Giải thích biểu đồ 2
ggplot(data = NULL, aes(x = ““, y = species_count, fill =
names(species_count))): Đây là câu lệnh để khởi tạo một đối tượng
ggplot. Chúng ta cung cấp NULL cho dữ liệu vì chúng ta đã tính toán số
lượng trước đó. Trong aesthetics, chúng ta sử dụng y để đại diện cho số
lượng của mỗi loài hoa iris, và fill để tô màu theo tên của các loài
hoa.
geom_bar(stat = “identity”): Chúng ta sử dụng geom_bar() để tạo
ra biểu đồ cột, với tham số stat = “identity” để đảm bảo rằng chiều cao
của cột được lấy trực tiếp từ dữ liệu (không thực hiện tính toán
lại).
coord_polar(“y”, start = 0): Hàm này thiết lập loại biểu đồ là
biểu đồ pie chart.
labs(): Hàm này được sử dụng để đặt tiêu đề và nhãn cho biểu
đồ.
theme_void(): Hàm này thiết lập giao diện cho biểu đồ là không có
gì (void), nghĩa là không có bất kỳ lưới hoặc trục nào.
Biểu đồ
3
library(ggplot2)
# Tính số lượng của mỗi loài hoa iris
species_count <- table(iris$Species)
# Tạo biểu đồ pie chart
pie_chart <- ggplot(data = NULL, aes(x = "", y = species_count, fill = names(species_count))) +
geom_bar(stat = "identity") +
coord_polar("y", start = 0) +
labs(title = "phân bố của 3 loài hoa",
fill = "loài") +
theme_minimal()
# Hiển thị biểu đồ
print(pie_chart)
## Don't know how to automatically pick scale for object of type <table>.
## Defaulting to continuous.

Giả thích biểu đồ 3
table(iris$Species) tính số lượng hoa của mỗi loại.
ggplot() khởi tạo biểu đồ pie chart.
geom_bar(stat = “identity”) tạo ra biểu đồ cột với chiều dài
tương ứng với số lượng từng loại hoa.
coord_polar(“y”, start = 0) chuyển biểu đồ thành dạng pie chart
với trục số quanh đường tròn.
theme_minimal() thiết lập giao diện cho biểu đồ.
Sau khi chạy mã này, bạn sẽ có một biểu đồ pie chart thể hiện số
lượng hoa từng loại có trục số quanh đường tròn.
BIểu đồ
4
library(ggplot2)
# Tạo biểu đồ density plot
density_plot <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
geom_density(alpha = 0.5) +
labs(title = "Density Plot of Sepal Length by Species",
x = "Sepal Length",
y = "Density",
fill = "Species") +
theme_minimal()
# Hiển thị biểu đồ
print(density_plot)
Giải thích biểu đồ 4
ggplot(iris, aes(x = Sepal.Length, fill = Species)) khởi tạo biểu
đồ density plot, với dữ liệu từ dataframe iris, chiều dài lá đài
(Sepal.Length) làm trục x và màu sắc theo loài hoa (Species).
geom_density(alpha = 0.5) thêm layer density plot vào biểu đồ với
độ mờ (alpha) là 0.5 để giảm độ trong suốt của đường density.
labs() được sử dụng để đặt tiêu đề và nhãn cho các trục và biểu
đồ.
theme_minimal() thiết lập giao diện cho biểu đồ là giao diện tối
giản.
Sau khi chạy mã này, bạn sẽ có một biểu đồ density plot thể hiện
phân phối của chiều dài lá đài theo từng loài hoa iris.
Biểu đồ
5
library(ggplot2)
# Tạo biểu đồ histogram
histogram_plot <- ggplot(iris, aes(x = Sepal.Width, fill = Species)) +
geom_histogram(binwidth = 0.2, position = "dodge", alpha = 0.5) +
labs(title = "Histogram of Sepal Width by Species",
x = "Sepal Width",
y = "Frequency",
fill = "Species") +
theme_minimal()
# Hiển thị biểu đồ
print(histogram_plot)

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTmhoYW8iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQojICoqR2nhu5tpIHRoaeG7h3UgYuG7mSBk4buvIGxp4buHdSoqDQoNCkLhu5kgZOG7ryBsaeG7h3UgaXJpcyBsw6AgbeG7mXQgdOG6rXAgaOG7o3AgY8OhYyBk4buvIGxp4buHdSB24buBIGPDoWMgbG/DoGkgaG9hIGlyaXMgdGh1IHRo4bqtcCBi4bufaSBuaMOgIHRo4buxYyB24bqtdCBo4buNYyBSb25hbGQgRmlzaGVyIHbDoG8gbmjhu69uZyBuxINtIDE5MzAuIELhu5kgZOG7ryBsaeG7h3UgbsOgeSBjaOG7qWEgdGjDtG5nIHRpbiB24buBIGPDoWMgxJHhurdjIMSRaeG7g20gbW9yZsO0bG9naSBj4bunYSBjw6FjIG3huqt1IGhvYSBpcmlzIHRodeG7mWMgYmEgbG/DoGkga2jDoWMgbmhhdTogSXJpcyBzZXRvc2EsIElyaXMgdmVyc2ljb2xvciB2w6AgSXJpcyB2aXJnaW5pY2EuIEPhu6UgdGjhu4MsIGPDoWMgxJHhurdjIMSRaeG7g20gbsOgeSBiYW8gZ+G7k206DQoNCi0gU2VwYWwgTGVuZ3RoIChDaGnhu4F1IGTDoGkgbMOhIMSRw6BpKTogxJDhu5kgZMOgaSBj4bunYSBsw6EgxJHDoGkgdHJvbmcgxJHGoW4gduG7iyBjZW50aW1ldC4NCi0gU2VwYWwgV2lkdGggKENoaeG7gXUgcuG7mW5nIGzDoSDEkcOgaSk6IMSQ4buZIHLhu5luZyBj4bunYSBsw6EgxJHDoGkgdHJvbmcgxJHGoW4gduG7iyBjZW50aW1ldC4NCi0gUGV0YWwgTGVuZ3RoIChDaGnhu4F1IGTDoGkgY8OhbmggaG9hKTogxJDhu5kgZMOgaSBj4bunYSBjw6FuaCBob2EgdHJvbmcgxJHGoW4gduG7iyBjZW50aW1ldC4NCi0gUGV0YWwgV2lkdGggKENoaeG7gXUgcuG7mW5nIGPDoW5oIGhvYSk6IMSQ4buZIHLhu5luZyBj4bunYSBjw6FuaCBob2EgdHJvbmcgxJHGoW4gduG7iyBjZW50aW1ldC4NCk3hu5dpIG3huqt1IGhvYSBpcmlzIMSRxrDhu6NjIGdoaSBs4bqhaSB0aMO0bmcgcXVhIGLhu5FuIHRodeG7mWMgdMOtbmggdHLDqm4gdsOgIMSRxrDhu6NjIGfhuq9uIG5ow6NuIHbhu5tpIGxvw6BpIHTGsMahbmcg4bupbmcgY+G7p2EgbsOzLg0KDQpC4buZIGThu68gbGnhu4d1IGlyaXMgZ+G7k20gdOG7lW5nIGPhu5luZyAxNTAgbeG6q3UsIHbhu5tpIG3hu5dpIGxvw6BpIGhvYSBpcmlzIGPDsyA1MCBt4bqrdS4gQuG7mSBk4buvIGxp4buHdSBuw6B5IMSRw6MgdHLhu58gdGjDoG5oIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3Uga2luaCDEkWnhu4NuIHRyb25nIGzEqW5oIHbhu7FjIGjhu41jIG3DoXkgdsOgIHRo4buRbmcga8OqLCDEkcaw4bujYyBz4butIGThu6VuZyBy4buZbmcgcsOjaSDEkeG7gyBtaW5oIGjhu41hIGPDoWMga+G7uSB0aHXhuq10IHBow6JuIGxv4bqhaSwgcGjDom4gdMOtY2ggcGjDom4gYmnhu4d0IHbDoCBraMOhbSBwaMOhIGThu68gbGnhu4d1Lg0KDQpW4bubaSBjw6FjIHRow7RuZyB0aW4gduG7gSBrw61jaCB0aMaw4bubYyB2w6AgaMOsbmggZOG6oW5nIGPhu6dhIGzDoSDEkcOgaSB2w6AgY8OhbmggaG9hLCBi4buZIGThu68gbGnhu4d1IGlyaXMgY3VuZyBj4bqlcCBt4buZdCBu4buBbiB04bqjbmcgbMO9IHTGsOG7n25nIMSR4buDIG5naGnDqm4gY+G7qXUgdsOgIMOhcCBk4bulbmcgY8OhYyBwaMawxqFuZyBwaMOhcCBwaMOibiBsb+G6oWkgdsOgIG5o4bqtbiBk4bqhbmcgbeG6q3UsIGPFqW5nIG5oxrAgaGnhu4N1IHLDtSBoxqFuIHbhu4Egc+G7sSDEkWEgZOG6oW5nIGPhu6dhIGxvw6BpIGhvYSBpcmlzLg0KDQojIyAqKkJp4buDdSDEkeG7kyAxKioNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmRhdGEoImlyaXMiKQ0KaG9hIDwtIGlyaXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgVMOtbmggdG/DoW4gY2hp4buBdSBkw6BpIGzDoSB0cnVuZyBiw6xuaCBj4bunYSBt4buXaSBsb8OgaSBob2EgaXJpcw0KaXJpc19hdmdfc2VwYWxfbGVuZ3RoIDwtIGlyaXMgJT4lDQogIGdyb3VwX2J5KFNwZWNpZXMpICU+JQ0KICBzdW1tYXJpc2UoYXZnX3NlcGFsX2xlbmd0aCA9IG1lYW4oU2VwYWwuTGVuZ3RoKSkNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdA0KZ2dwbG90KGlyaXNfYXZnX3NlcGFsX2xlbmd0aCwgYWVzKHggPSBTcGVjaWVzLCB5ID0gYXZnX3NlcGFsX2xlbmd0aCwgZmlsbCA9IFNwZWNpZXMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh0aXRsZSA9ICLEkOG7mSBkw6BpIGzDoSB0cnVuZyBiw6xuaCBj4bunYSBt4buXaSBsb8OgaSIsDQogICAgICAgeCA9ICJMb8OgaSIsDQogICAgICAgeSA9ICLEkOG7mSBkw6BpIGzDoSB0cnVuZyBiw6xuaCIpDQoNCmBgYA0KDQoNCioqR2nhuqNpIHRow61jaCBiaeG7g3UgxJHhu5MgMSoqDQotIGdyb3VwX2J5KFNwZWNpZXMpOiBIw6BtIGdyb3VwX2J5KCkgY+G7p2EgZ8OzaSBkcGx5ciDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBuaMOzbSBk4buvIGxp4buHdSB0aGVvIG3hu5l0IGJp4bq/biBj4bulIHRo4buDLCB0cm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSBsw6AgY+G7mXQgU3BlY2llcy4NCg0KLSBzdW1tYXJpc2UoYXZnX3NlcGFsX2xlbmd0aCA9IG1lYW4oU2VwYWwuTGVuZ3RoKSk6IEjDoG0gc3VtbWFyaXNlKCkgY+G7p2EgZHBseXIgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdMOzbSB04bqvdCBk4buvIGxp4buHdS4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGNow7puZyB0YSB0w61uaCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGPhu5l0IFNlcGFsLkxlbmd0aCBjaG8gbeG7l2kgbmjDs20gbG/DoGkgaG9hIFNwZWNpZXMsIHbDoCBsxrB1IGvhur90IHF14bqjIHbDoG8gY+G7mXQgbeG7m2kgYXZnX3NlcGFsX2xlbmd0aC4gS+G6v3QgcXXhuqMgc+G6vSDEkcaw4bujYyBsxrB1IHbDoG8gbeG7mXQgZGF0YSBmcmFtZSBt4bubaSBjw7MgdMOqbiBsw6AgaXJpc19hdmdfc2VwYWxfbGVuZ3RoLg0KDQotIGdncGxvdCgpOiBIw6BtIG7DoHkga2jhu59pIHThuqFvIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBnZ3Bsb3QuIFRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCBjaMO6bmcgdGEgY3VuZyBj4bqlcCBk4buvIGxp4buHdSBpcmlzX2F2Z19zZXBhbF9sZW5ndGggbMOgbSBk4buvIGxp4buHdSDEkeG6p3UgdsOgby4NCg0KLSBhZXMoKTogSMOgbSBuw6B5IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHjDoWMgxJHhu4tuaCBjw6FjIGFlc3RoZXRpY3MgKG3hu7kgdGh14bqtdCkgY2hvIGJp4buDdSDEkeG7ky4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGNow7puZyB0YSBnw6FuIGPhu5l0IFNwZWNpZXMgY2hvIHRy4bulYyB4IHbDoCBj4buZdCBhdmdfc2VwYWxfbGVuZ3RoIGNobyB0cuG7pWMgeSwgdsOgIHTDtCBtw6B1IHRoZW8gU3BlY2llcy4NCg0KLWdlb21fYmFyKCk6IEjDoG0gbsOgeSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB24bq9IGJp4buDdSDEkeG7kyBj4buZdC4gVGhhbSBz4buRIHN0YXQgPSAiaWRlbnRpdHkiIMSR4bqjbSBi4bqjbyBy4bqxbmcgY2hp4buBdSBjYW8gY+G7p2EgY8OhYyBj4buZdCDEkcaw4bujYyBs4bqleSB0cuG7sWMgdGnhur9wIHThu6sgZOG7ryBsaeG7h3UgKGtow7RuZyB0aOG7sWMgaGnhu4duIHTDrW5oIHRvw6FuIGzhuqFpKS4NCg0KLWxhYnMoKTogSMOgbSBuw6B5IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGfDoW4gbmjDo24gY2hvIGPDoWMgdHLhu6VjIHbDoCBiaeG7g3UgxJHhu5MuDQoNCi0gYmnhu4N1IMSR4buTIG7DoHkgc+G6vSB0w61uaCB0b8OhbiBjaGnhu4F1IGTDoGkgbMOhIHRydW5nIGLDrG5oIGPhu6dhIG3hu5dpIGxvw6BpIGhvYSBpcmlzIHbDoCBzYXUgxJHDsyB24bq9IGJp4buDdSDEkeG7kyBj4buZdCDEkeG7gyBzbyBzw6FuaCBnaeG7r2EgY8OhYyBsb8OgaS4gQmnhu4N1IMSR4buTIGPhu5l0IHPhur0gY8OzIHRy4bulYyB4IGzDoCB0w6puIGxvw6BpIGhvYSBpcmlzIHbDoCB0cuG7pWMgeSBsw6AgY2hp4buBdSBkw6BpIGzDoSB0cnVuZyBiw6xuaCwgxJHGsOG7o2MgdMO0IG3DoHUga2jDoWMgbmhhdSBjaG8gbeG7l2kgbG/DoGkgaG9hIMSR4buDIGThu4Ugbmjhuq1uIGJp4bq/dC4NCg0KIyMgKipCaeG7g3UgxJHhu5MgMioqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KIyBUw61uaCBz4buRIGzGsOG7o25nIGPhu6dhIG3hu5dpIGxvw6BpIGhvYSBpcmlzDQpzcGVjaWVzX2NvdW50IDwtIHRhYmxlKGlyaXMkU3BlY2llcykNCiMgVOG6oW8gYmnhu4N1IMSR4buTIHBpZSBjaGFydA0KcGllX2NoYXJ0IDwtIGdncGxvdChkYXRhID0gTlVMTCwgYWVzKHggPSAiIiwgeSA9IHNwZWNpZXNfY291bnQsIGZpbGwgPSBuYW1lcyhzcGVjaWVzX2NvdW50KSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDApICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGPhu6dhIGPDoWMgbG/DoGkgaG9hIiwNCiAgICAgICBmaWxsID0gIkxvw6BpIikgKw0KICB0aGVtZV92b2lkKCkNCiMgSGnhu4NuIHRo4buLIGJp4buDdSDEkeG7kw0KcHJpbnQocGllX2NoYXJ0KQ0KDQpgYGANCg0KKipHaeG6o2kgdGjDrWNoIGJp4buDdSDEkeG7kyAyKioNCg0KLSBnZ3Bsb3QoZGF0YSA9IE5VTEwsIGFlcyh4ID0gIiIsIHkgPSBzcGVjaWVzX2NvdW50LCBmaWxsID0gbmFtZXMoc3BlY2llc19jb3VudCkpKTogxJDDonkgbMOgIGPDonUgbOG7h25oIMSR4buDIGto4bufaSB04bqhbyBt4buZdCDEkeG7kWkgdMaw4bujbmcgZ2dwbG90LiBDaMO6bmcgdGEgY3VuZyBj4bqlcCBOVUxMIGNobyBk4buvIGxp4buHdSB2w6wgY2jDum5nIHRhIMSRw6MgdMOtbmggdG/DoW4gc+G7kSBsxrDhu6NuZyB0csaw4bubYyDEkcOzLiBUcm9uZyBhZXN0aGV0aWNzLCBjaMO6bmcgdGEgc+G7rSBk4bulbmcgeSDEkeG7gyDEkeG6oWkgZGnhu4duIGNobyBz4buRIGzGsOG7o25nIGPhu6dhIG3hu5dpIGxvw6BpIGhvYSBpcmlzLCB2w6AgZmlsbCDEkeG7gyB0w7QgbcOgdSB0aGVvIHTDqm4gY+G7p2EgY8OhYyBsb8OgaSBob2EuDQoNCi0gZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpOiBDaMO6bmcgdGEgc+G7rSBk4bulbmcgZ2VvbV9iYXIoKSDEkeG7gyB04bqhbyByYSBiaeG7g3UgxJHhu5MgY+G7mXQsIHbhu5tpIHRoYW0gc+G7kSBzdGF0ID0gImlkZW50aXR5IiDEkeG7gyDEkeG6o20gYuG6o28gcuG6sW5nIGNoaeG7gXUgY2FvIGPhu6dhIGPhu5l0IMSRxrDhu6NjIGzhuqV5IHRy4buxYyB0aeG6v3AgdOG7qyBk4buvIGxp4buHdSAoa2jDtG5nIHRo4buxYyBoaeG7h24gdMOtbmggdG/DoW4gbOG6oWkpLg0KDQotIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQgPSAwKTogSMOgbSBuw6B5IHRoaeG6v3QgbOG6rXAgbG/huqFpIGJp4buDdSDEkeG7kyBsw6AgYmnhu4N1IMSR4buTIHBpZSBjaGFydC4NCg0KLSBsYWJzKCk6IEjDoG0gbsOgeSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgdsOgIG5ow6NuIGNobyBiaeG7g3UgxJHhu5MuDQoNCi0gdGhlbWVfdm9pZCgpOiBIw6BtIG7DoHkgdGhp4bq/dCBs4bqtcCBnaWFvIGRp4buHbiBjaG8gYmnhu4N1IMSR4buTIGzDoCBraMO0bmcgY8OzIGfDrCAodm9pZCksIG5naMSpYSBsw6Aga2jDtG5nIGPDsyBi4bqldCBr4buzIGzGsOG7m2kgaG/hurdjIHRy4bulYyBuw6BvLg0KDQojIyAqKkJp4buDdSDEkeG7kyAzKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQojIFTDrW5oIHPhu5EgbMaw4bujbmcgY+G7p2EgbeG7l2kgbG/DoGkgaG9hIGlyaXMNCnNwZWNpZXNfY291bnQgPC0gdGFibGUoaXJpcyRTcGVjaWVzKQ0KIyBU4bqhbyBiaeG7g3UgxJHhu5MgcGllIGNoYXJ0DQpwaWVfY2hhcnQgPC0gZ2dwbG90KGRhdGEgPSBOVUxMLCBhZXMoeCA9ICIiLCB5ID0gc3BlY2llc19jb3VudCwgZmlsbCA9IG5hbWVzKHNwZWNpZXNfY291bnQpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCkgKw0KICBsYWJzKHRpdGxlID0gInBow6JuIGLhu5EgY+G7p2EgMyBsb8OgaSBob2EiLA0KICAgICAgIGZpbGwgPSAibG/DoGkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KIyBIaeG7g24gdGjhu4sgYmnhu4N1IMSR4buTDQpwcmludChwaWVfY2hhcnQpDQoNCmBgYA0KDQoNCioqR2nhuqMgdGjDrWNoIGJp4buDdSDEkeG7kyAzKioNCg0KLSB0YWJsZShpcmlzJFNwZWNpZXMpIHTDrW5oIHPhu5EgbMaw4bujbmcgaG9hIGPhu6dhIG3hu5dpIGxv4bqhaS4NCg0KLSBnZ3Bsb3QoKSBraOG7n2kgdOG6oW8gYmnhu4N1IMSR4buTIHBpZSBjaGFydC4NCg0KLSBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgdOG6oW8gcmEgYmnhu4N1IMSR4buTIGPhu5l0IHbhu5tpIGNoaeG7gXUgZMOgaSB0xrDGoW5nIOG7qW5nIHbhu5tpIHPhu5EgbMaw4bujbmcgdOG7q25nIGxv4bqhaSBob2EuDQoNCi0gY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDApIGNodXnhu4NuIGJp4buDdSDEkeG7kyB0aMOgbmggZOG6oW5nIHBpZSBjaGFydCB24bubaSB0cuG7pWMgc+G7kSBxdWFuaCDEkcaw4budbmcgdHLDsm4uDQoNCi0gdGhlbWVfbWluaW1hbCgpIHRoaeG6v3QgbOG6rXAgZ2lhbyBkaeG7h24gY2hvIGJp4buDdSDEkeG7ky4NCg0KLSBTYXUga2hpIGNo4bqheSBtw6MgbsOgeSwgYuG6oW4gc+G6vSBjw7MgbeG7mXQgYmnhu4N1IMSR4buTIHBpZSBjaGFydCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBob2EgdOG7q25nIGxv4bqhaSBjw7MgdHLhu6VjIHPhu5EgcXVhbmggxJHGsOG7nW5nIHRyw7JuLg0KDQojIyAqKkJJ4buDdSDEkeG7kyA0KioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQojIFThuqFvIGJp4buDdSDEkeG7kyBkZW5zaXR5IHBsb3QNCmRlbnNpdHlfcGxvdCA8LSBnZ3Bsb3QoaXJpcywgYWVzKHggPSBTZXBhbC5MZW5ndGgsIGZpbGwgPSBTcGVjaWVzKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IFBsb3Qgb2YgU2VwYWwgTGVuZ3RoIGJ5IFNwZWNpZXMiLA0KICAgICAgIHggPSAiU2VwYWwgTGVuZ3RoIiwNCiAgICAgICB5ID0gIkRlbnNpdHkiLA0KICAgICAgIGZpbGwgPSAiU3BlY2llcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQojIEhp4buDbiB0aOG7iyBiaeG7g3UgxJHhu5MNCnByaW50KGRlbnNpdHlfcGxvdCkNCg0KYGBgDQoqKkdp4bqjaSB0aMOtY2ggYmnhu4N1IMSR4buTIDQqKg0KDQotIGdncGxvdChpcmlzLCBhZXMoeCA9IFNlcGFsLkxlbmd0aCwgZmlsbCA9IFNwZWNpZXMpKSBraOG7n2kgdOG6oW8gYmnhu4N1IMSR4buTIGRlbnNpdHkgcGxvdCwgduG7m2kgZOG7ryBsaeG7h3UgdOG7qyBkYXRhZnJhbWUgaXJpcywgY2hp4buBdSBkw6BpIGzDoSDEkcOgaSAoU2VwYWwuTGVuZ3RoKSBsw6BtIHRy4bulYyB4IHbDoCBtw6B1IHPhuq9jIHRoZW8gbG/DoGkgaG9hIChTcGVjaWVzKS4NCg0KLSBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpIHRow6ptIGxheWVyIGRlbnNpdHkgcGxvdCB2w6BvIGJp4buDdSDEkeG7kyB24bubaSDEkeG7mSBt4budIChhbHBoYSkgbMOgIDAuNSDEkeG7gyBnaeG6o20gxJHhu5kgdHJvbmcgc3Xhu5F0IGPhu6dhIMSRxrDhu51uZyBkZW5zaXR5Lg0KDQotIGxhYnMoKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgdsOgIG5ow6NuIGNobyBjw6FjIHRy4bulYyB2w6AgYmnhu4N1IMSR4buTLg0KDQotIHRoZW1lX21pbmltYWwoKSB0aGnhur90IGzhuq1wIGdpYW8gZGnhu4duIGNobyBiaeG7g3UgxJHhu5MgbMOgIGdpYW8gZGnhu4duIHThu5FpIGdp4bqjbi4NCg0KLSBTYXUga2hpIGNo4bqheSBtw6MgbsOgeSwgYuG6oW4gc+G6vSBjw7MgbeG7mXQgYmnhu4N1IMSR4buTIGRlbnNpdHkgcGxvdCB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIGPhu6dhIGNoaeG7gXUgZMOgaSBsw6EgxJHDoGkgdGhlbyB04burbmcgbG/DoGkgaG9hIGlyaXMuDQoNCg0KIyMgKipCaeG7g3UgxJHhu5MgNSoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFThuqFvIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0NCmhpc3RvZ3JhbV9wbG90IDwtIGdncGxvdChpcmlzLCBhZXMoeCA9IFNlcGFsLldpZHRoLCBmaWxsID0gU3BlY2llcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjIsIHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjUpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gb2YgU2VwYWwgV2lkdGggYnkgU3BlY2llcyIsDQogICAgICAgeCA9ICJTZXBhbCBXaWR0aCIsDQogICAgICAgeSA9ICJGcmVxdWVuY3kiLA0KICAgICAgIGZpbGwgPSAiU3BlY2llcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgSGnhu4NuIHRo4buLIGJp4buDdSDEkeG7kw0KcHJpbnQoaGlzdG9ncmFtX3Bsb3QpDQoNCmBgYA0KDQo=