t <- diamonds
BIỂU ĐỒ 1
t %>% group_by(clarity) %>% summarise(m= mean(price)) %>%
ggplot(aes(x = clarity,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,1)), vjust = 2, color = 'green') +
labs(x = 'độ trong suốt', y = 'giá')

Ta phân loại kim cương theo độ trong suốt và tính giá
trung bình của từng loại . Ở biểu đồ trên thì ta gắn x là độ trong suốt,
y là giá trung bình của từng loại; các số liệu sẽ có màu xanh lá cây,
được làm tròn 01 chữ số thập phân và được điều chỉnh ở vị trí dọc cách
cột với đơn vị là 2. Qua biểu đồ trên ta thấy kim cương có độ trong suốt
SI2 là có giá trung bình cao nhất, tiếp đến là SI2, thấp hơn nữa lần
lượt là VS2, I1, VS1, WS2, IF và thấp nhất là Ws1
BIỂU ĐỒ 2
t %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(color,n)) +
geom_col(fill='red') +
geom_text(aes(label = n),vjust = 2, color = 'black') +
xlab('Color') +
ylab('Số lượng') +
labs(title ='số lượng kim cương theo màu sắc')

Ta Phân loại kim cương theo màu sắc và tính số lượng của
từng màu sắc. x là màu sắc của kim cương, y là số lượng của từng loại
màu sắc. Các số liệu có màu đen, được điều chỉnh ở vị trí dọc cách cột 2
đơn vị. Màu của các cột là màu đỏ . Qua biểu đồ trên ta thấy được nhiều
nhất là màu G với 11292 viên, tiếp đến là E với 9797 viên, F với 9542
viên, H với 8304 viên,D với 6775 viên, I với 5422 viên và ít nhất là màu
J với 2808 viên # BIỂU ĐỒ 3
t %>% ggplot(aes(x = cut)) +
geom_bar() +
labs(x = 'Loại', y = 'Số lượng') +
coord_flip() +
labs(title = 'Số kim cương theo kiểu cắt(biểu đồ ngang)')

Ta phân loại kim cương theo kiểu cắt. Biểu đồ ngang trên
cho ta thấy được kiểu Gía của kim cương theo từng kiểu cắt. Ta thấy số
kim cương sẽ tăng dần từ Fair, Good, Very Good, Premium,
Ideal
BIỂU ĐỒ 4
t %>% ggplot(aes(x = cut)) +
geom_bar() +
labs(x = 'Loại', y = 'Số lượng') +
labs(title = 'Số kim cương theo kiểu cắt(biểu đồ dọc)')

Ta phân loại kim cương theo kiểu cắt. Biểu đồ dọc trên
cho ta thấy được kiểu Gía của kim cương theo từng kiểu cắt. Ta thấy số
kim cương sẽ tăng dần từ Fair, Good, Very Good, Premium,
Ideal
BIỂU ĐỒ 5
t %>% group_by(carat) %>% filter(carat == 0.5 | carat == 1.00 | carat == 1.5 | carat == 2.05) %>% summarise(n = n()) %>%
ggplot(aes(carat,n)) +
geom_col(fill='blue') +
geom_text(aes(label = n),vjust = 2, color = 'white') +
xlab('Carat') +
ylab('Số lượng')

*Ta phân loại kim cương theo trọng lượng carat ở các mốc 0.5,
1.0, 1.5, 2.0 và tính số lượng của từng mốc khối lương. ta gắn x là
carat và y là số lượng từng mốc carat. Các cột biểu đồ có màu xanh lá
cây, các số liệu có màu trắng, được điều chỉnh ở vị trí dọc cách cột 2
đơn vị . Qua biểu đồ trên ta thấy được số kim cương có trọng lượng 1.0
carat là nhiều nhất và thấp nhất là 2.0
BIỂU ĐỒ 6
t %>% group_by(cut) %>% summarise(n = mean(price)) %>%
ggplot(aes(cut,n)) +
geom_col(fill='green') +
geom_text(aes(label = round(n,2)),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo kiểu cắt và tính giá trung
bình. Ta gắn x là kiểu cắt, y là số lượng. Các số liệu sẽ có màu đỏ,
được làm tròn đến 2 chữ thập phân và được điều chỉnh ở vị trí dọc cách
cột với đơn vị là 2; cột biểu đồ có màu xanh lá cây. Qua biểu đồ ta thấy
giá trung bình của từng kiểu cắt sẽ tăng dần từ Ideal, Good, Very Good,
Fair, Premium
BIỂU ĐỒ 7
t %>% group_by(cut) %>% summarise(m= mean(carat)) %>%
ggplot(aes(x = cut,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = 2, color = 'red') +
labs(x = 'Kiểu cắt', y = 'Trọng lượng trung bình')

Ta phân loại kiểu cắt kim cương và tính trọng lượng trung
bình (carat). ta gắn x là kiểu cắt, y là trọng lượng trung bình. Các số
liệu sẽ có màu đỏ, được làm tròn đến 2 chữ thập phân và được điều chỉnh
ở vị trí dọc cách cột với đơn vị là 2. Qua biểu đồ ta thấy được trọng
lương trung bình của kim cương tăng từ Ideal(0.7 carat), Very Good(0.81
carat), Good(0.85 carat), Premium(0.89 carat) và Fair(1.05
carat)
BIỂU ĐỒ 8
t %>% group_by(color) %>% summarise(m= mean(carat)) %>%
ggplot(aes(x = color,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = 2, color = 'green') +
labs(x = 'Màu', y = 'Trọng lượng trung bình')

Ta phân loại kim cương theo màu sắc và tính trọng lượng
trung bình theo đơn vị carat của từng loại . Ở biểu đồ trên thì ta gắn x
là màu sắc, y là trọng lượng trung bình của từng loại; các số liệu sẽ có
màu xanh lá cây, được làm tròn 2 chữ số thập phân và được điều chỉnh ở
vị trí dọc cách cột với đơn vị là 2. Qua biểu đồ trên ta thấy màu J có
trọng lượng trung bình cao nhất là giảm dần từ I, H , G , F, màu D Và E
có trọng lượng trung bình thấp nhất.
BIỂU ĐỒ 9
t %>% group_by(color) %>% summarise(m= mean(price)) %>%
ggplot(aes(x = color,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,0)), vjust = 2, color = 'green') +
labs(x = 'màu sắc', y = 'Gía trung bình')

Ta phân loại kim cương theo màu sắc và tính giá trung
bình của từng loại . Ở biểu đồ trên thì ta gắn x là màu sắc, y là giá
trung bình của từng loại; các số liệu sẽ có màu xanh lá cây, được làm
tròn 0 chữ số thập phân và được điều chỉnh ở vị trí dọc cách cột với đơn
vị là 2. Qua biểu đồ trên Ta thấy màu J có giá trung bình cao nhất và
giảm dần từ I, H, G, F, D và thấp nhất là màu D VỚI 3170 Đơn vị
giá # BIỂU ĐỒ 10
ggplot(diamonds , aes_string(x = "cut", y = "price")) +
geom_bar(stat = "identity") +
labs(title = "Giá kim cương theo kiểu cắt",
x = "Kiểu cắt",
y = "Giá")

Ta phân loại kim cương theo tổng giá và kiểu cắt. Biểu đồ
trên cho ta thấy được kiểu Gía của kim cương theo từng kiểu cắt. Ta thấy
kiểu cắt Ideal thì giá kim cương sẽ tăng dần từ Fair, Good, Very Good,
Premium, Ideal
BIỂU ĐỒ 11
t %>% group_by(cut) %>% summarise(n = n()) %>%
ggplot(aes(cut,n)) +
geom_col(fill='green') +
geom_text(aes(label = n),vjust = 2, color = 'red') +
labs(x = 'Kiểu Cắt', y = 'Số lượng')

Ta phân loại kim cương theo kiểu cắt và tính số lượng của
từng màu . Ở biểu đồ trên thì ta gắn x là kiểu cắt, y là số lượng của
từng loại; các số liệu sẽ có màu đỏ và được điều chỉnh ở vị trí dọc cách
cột với đơn vị là 2; các cột sẽ có màu xanh lá cây. Qua biểu đồ trên ta
thấy loại Fair có số lượng ít nhất và tăng dần theo kiểu cắt Good, Very
Good, Premium và kiểu cắt Premium là cố số lượng nhiều
nhất # BIỂU ĐỒ 12
t %>% group_by(clarity) %>% summarise(n = n()) %>%
ggplot(aes(x = clarity,y = n)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(n,2)), vjust = 2, color = 'green') +
labs(x = 'độ trong suốt', y = 'số lượng')

Ta phân loại kim cương theo độ trong suốt và tính số
lượng . Ở biểu đồ trên thì ta gắn x là độ trong suốt, y là số lượng của
từng loại; các số liệu sẽ có màu xanh lá cây, được làm tròn 5 chữ số
thập phân và được điều chỉnh ở vị trí dọc cách cột với đơn vị là 2. Qua
biểu đồ trên ta thấy độ trong suốt có số lượng nhiều nhất là SI1, giảm
dần từ VS2 ,SI2, VS1, WS2, WS1, IF và I1 là độ trong suốt có số lượng
thấp nhất
BIỂU ĐỒ 13
t %>% group_by(clarity) %>% summarise(m= mean(carat)) %>%
ggplot(aes(x = clarity,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,5)), vjust = 2, color = 'green') +
labs(x = 'độ trong suốt', y = 'trọng lượng trung bình')

Ta phân loại kim cương theo độ trong suốt và tính trọng
lượng trung bình của chúng theo đơn vị carat. Ở biểu đồ trên thì ta gắn
x là độ trong suốt, y là khối lượng trung bình của từng loại; các số
liệu sẽ có màu xanh lá cây, được làm tròn 5 chữ số thập phân và được
điều chỉnh ở vị trí dọc cách cột với đơn vị là 2. Và ta thấy được kim
cương có độ trong suốt cao nhất là I1, thấp hơn đó là SI2 và giảm dần từ
SI1, VS2, VS1, WS2, WS1, và thấp nhất là IF.
BIỂU ĐỒ 14
t <- t %>% mutate(caratC = cut(carat,4, label = c('rất nhỏ', 'nhỏ','vừa','lớn')))
t %>% ggplot(aes(x = caratC)) +
geom_bar(fill = 'red') +
labs(x = 'phân loại', y = 'số lượng')

Ta thêm 1 cột dữ liêu caratC vào bộ dữ liệu t để đánh giá
trọng lượng của các viên kim cương theo mức độ ‘rất nhỏ’ ‘nhỏ’, ‘vừa’ và
‘lớn’. Các cột biểu đồ có màu đỏ. Qua biểu đồ trên ta thấy số lượng kim
cương có trọng lượng ‘rất nhỏ’ là lớn nhất và giảm dần từ ‘nhỏ’, ‘vừa’
và thấp nhất là loại ‘lớn’
BIỂU ĐỒ 15
t <- t %>% mutate(priceC = cut(price,5, label = c('rất thấp', 'thấp','vừa','cao','rất cao')))
t %>% ggplot(aes(x = priceC)) +
geom_bar(fill = 'red') +
labs(x = 'phân loại', y = 'số lượng')

Ta thêm 1 cột dữ liêu priceC vào bộ dữ liệu t để đánh giá
Gía cả của các viên kim cương theo mức độ ‘rất thấp’ ‘thấp’, ‘vừa’,
‘cao’ và ‘rất cao’. Các cột biểu đồ có màu đỏ. Qua biểu đồ trên ta thấy
số lượng kim cương có giá ‘rất thấp’ là lớn nhất và giảm dần từ ‘thấp’,
‘vừa’, ‘cao’ và thấp nhất là loại ‘rất cao’
BIỂU ĐỒ 16
t <- diamonds
b <- t %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
b %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = b %>% filter(color == 'D'), fill = 'red') +
geom_col(data = b %>% filter(color == 'J'), fill = 'blue')

Ta phân loại kim cương theo kiểu cắt và màu sắc sau đó
tính số lượng . Ở biểu đồ trên thì ta gắn x là kiểu cắt, y là số lượng
của từng loại; ta sẽ lọc các loại kim cương có màu D,cột biểu đồ có màu
đỏ và lọc các loại kim cương có màu J, biểu đồ có màu xanh dương. Qua
biểu đồ trên ta đã lọc được số lượng kim cương màu D phân bổ ít nhất ở
kiểu cắt Fair và tăng dần lên từ Good, Very Good, Premium, và nhiều nhất
là Ideal. Và số lượng kim cương có màu J cũng phẩn bổ tương tự như kim
cương có màu D # BIỂU ĐỒ 17
t <- diamonds
b <- t %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
b %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = b %>% filter(color == 'E'), fill = 'red') +
geom_col(data = b %>% filter(color == 'H'), fill = 'blue')

***Tương tự như biểu đồ số 17, lần này thay vì lọc các kim cương có
màu ‘D’ VÀ ‘J’ thì ta sẽ lọc các kim cương có màu ‘E’ VÀ ‘H’. Ở biểu đồ
này ta thấy màu E không phân bổ ở loại kim cương có kiểu cắt Fair,
Premium, và màu sắc này phân bổ nhiều nhất ở kiểu cắt Ideal giảm dần từ
Very Good, Good. Màu H phân bổ ở các kiểu cắt, nhiều nhất là Ideal và
giảm dần từ Premium, Very Good, Good và thấp nhất là Fair # BIỂU ĐỒ
18
b <- t %>% group_by(clarity, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
b %>% ggplot(aes(x = clarity, y = n)) +
geom_col(data = b %>% filter(color == 'F'), fill = 'red') +
geom_col(data = b %>% filter(color == 'J'), fill = 'blue')

Ta phân loại kim cương theo kiểu độ trong suốt và màu sắc
sau đó tính số lượng . Ở biểu đồ trên thì ta gắn x là độ trong suốt, y
là số lượng của từng loại; ta sẽ lọc các loại kim cương có màu ‘F’,cột
biểu đồ có màu đỏ và lọc các loại kim cương có màu J, biểu đồ có màu
xanh dương. Qua biểu đồ trên ta thấy các màu phân bổ ở tất cả độ trong
suốt. Trong đó màu J sẽ phân bổ nhiều nhất ở SI1 rồi giảm dần từ VS2,
VS1, SI2, WS2, WS1, IF và thấp nhất là I1. Còn màu F Phân bổ nhiều nhất
ở VS2 rồi giảm dần từ SI1, SI2, VS1, WS2, WS1, IF và tháp nhất là
I1.
BIỂU ĐỒ 19
b <- t %>% group_by(clarity, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
b %>% ggplot(aes(x = clarity, y = n)) +
geom_col(data = b %>% filter(color == 'E'), fill = 'red') +
geom_col(data = b %>% filter(color == 'G'), fill = 'blue')

Tương tự như biểu đồ số 18, lần này thay vì lọc các kim
cương có màu ‘F’ VÀ ‘J’ thì ta sẽ lọc các kim cương có màu ‘E’ VÀ ‘G’. Ở
biểu đồ này ta thấy màu E chỉ phân bổ ở loại kim cương độ trong suốt là
SI2,VS2 và SI1. Còn kim cương màu G phân bổ ở tất cả độ trong suốt,
trong đó nhiều nhất là VS2, giảm dần từ VS1, SI1, SI2, VVS2, VVS1, IF và
phân bổ ít nhất ở I1.
BIỂU ĐỒ 20
c <- t %>% group_by(clarity, cut) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
c %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = c %>% filter(clarity == 'IF'), fill = 'red') +
geom_col(data = c %>% filter(clarity == 'I1'), fill = 'blue')

Ta phân loại kim cương theo kiểu độ trong suốt và kiểu
cắt sau đó tính số lượng . Ở biểu đồ trên thì ta gắn x là kiểu cắt, y là
số lượng của từng loại; Ta lọc các kim cương có độ trong suốt ‘IF’ là
các cột màu đỏ, các kim cương có độ trong suốt ‘I1’ là các cột màu xanh.
Qua biểu đồ trên ta thấy kim cương có độ trong suốt ‘IF’ chỉ phân bổ ở
kiểu cắt Ideal, Very Good, Premium theo số lượng giảm dần. Trong khi đó
độ trong suốt I1 phân bổ ở mọi kiểu cắt, nhiều nhất là Premium và giảm
dần từ Fair, Idea, Good, thấp nhất là Very Good.
BIỂU ĐỒ 21
f <- t %>% group_by(clarity, cut) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
f %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = f %>% filter(clarity == 'SI1'), fill = 'red') +
geom_col(data = f %>% filter(clarity == 'SI2'), fill = 'blue')

Tương tự như biểu đồ số 20, lần này thay vì lọc các kim
cương có độ trong suốt ‘iF’ VÀ ‘i1’ thì ta sẽ lọc các kim cương có độ
trong suốt ‘SI1’ VÀ ‘SI2’. Ở biểu đồ này ta thấy độ trong suốt SI1 không
phân bổ ở loại kim cương có kiểu cắt Fair, phân bố nhiều nhất ở kiểu cắt
Ideal giảm dần từ Very Good, Premium và phân bổ ít nhất ở kiểu cắt Good.
Kim cương có độ trong suốt SI2 phân bổ ở tất cả kiểu cắt, nhiều nhất ở
kiểu cắt Premium giảm dần từ Ideal, Very Good, Good và phân bổ ít nhất ở
kiểu cắt Fair.
BIỂU ĐỒ 22
t %>% group_by(cut) %>% summarise(n = n()) %>%
ggplot(aes(cut,n)) +
geom_col(fill='green') +
geom_text(aes(label = percent(n/length(t$carat))),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo kiểu cắt và tính số lượng của
các kiểu cắt. ta gắn x là ‘Loại’, y là ‘Số Lượng’. Các cột biểu đồ được
tô màu xanh lá cây, các số liệu là tỷ khối lượng của mỗi kiểu cắt, các
số liệu này có màu đỏ và được điều chỉnh vị trí dọc các cột dữ liệu với
đơn vị là 2. Qua biểu đồ trên ta thấy Kiểu cắt Ideal chiếm tỷ lệ cao
nhất về trọng lượng (đơn vị carat) và giảm dần từ Premium, Very Good,
Good và kiểu cắt Fair có tỷ lệ trọng lượng thấp nhất
BIỂU ĐỒ 23
t %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(color,n)) +
geom_col(fill='green') +
geom_text(aes(label = percent(n/length(t$carat))),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo kiểu màu sắc và tính số lượng
của các màu. ta gắn x là ‘Loại’, y là ‘Số Lượng’. Các cột biểu đồ được
tô màu xanh lá cây, các số liệu là tỷ lệ khối lượng của mỗi kiểu cắt,
các số liệu này có màu đỏ và được điều chỉnh vị trí dọc các cột dữ liệu
với đơn vị là 2. Qua biểu đồ trên ta thấy kim cương màu G chiếm tỷ lệ
cao nhất về trọng lượng(20,93), giảm dần là E, F, H, D, I và kim cương
màu J chiếm tỷ lệ thấp nhất (5,21%)
BIỂU ĐỒ 24
t %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(color,n)) +
geom_col(fill='green') +
geom_text(aes(label = percent(n/length(t$price))),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo kiểu màu sắc và tính số lượng
của các màu. ta gắn x là ‘Loại’, y là ‘Số Lượng’. Các cột biểu đồ được
tô màu xanh lá cây, các số liệu là tỷ lệ giá tiền của mỗi kiểu cắt, các
số liệu này có màu đỏ và được điều chỉnh vị trí dọc các cột dữ liệu với
đơn vị là 2. Qua biểu đồ trên ta thấy kim cương màu G chiếm tỷ lệ cao
nhất về giá(20,93%), giảm dần là E, F, H, D, I và kim cương màu J chiếm
tỷ lệ thấp nhất (5,21%)
BIỂU ĐỒ 25
t %>% group_by(clarity) %>% summarise(n = n()) %>%
ggplot(aes(clarity,n)) +
geom_col(fill='green') +
geom_text(aes(label = percent(n/length(t$price))),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo độ trong suốt và tính số
lượng của các màu. ta gắn x là ‘Loại’, y là ‘Số Lượng’. Các cột biểu đồ
được tô màu xanh lá cây, các số liệu là tỷ lệ giá tiền của mỗi loại kim
cương, các số liệu này có màu đỏ và được điều chỉnh vị trí dọc các cột
dữ liệu với đơn vị là 2. Qua biểu đồ trên ta thấy kim cương có độ trong
suốt SI1 chiếm tỷ lệ giá cao nhất (24,2%), giảm dần từ VS2, SI2, VS1,
VVS2, VVS1, IF, I1(1,4%)
BIỂU ĐỒ 26
t %>% group_by(cut) %>% summarise(n = n()) %>%
ggplot(aes(cut,n)) +
geom_col(fill='green') +
geom_text(aes(label = percent(n/length(t$price))),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng')

BIỂU ĐỒ 27
t %>% group_by(cut,color) %>% summarise(n=n()) %>%
ggplot(aes(x = cut,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

Ta phân loại kim cương theo kiểu cắt và màu sắc sau đó
tính số lượng. ta gắn x là loại, y la số lượng và ta chia thành 7 biểu
đồ theo 7 loại màu sắc để so sánh. Qua 7 biểu đồ ta nhận xét các màu sắc
phân bổ nhiều nhất ở kim cương có kiểu cắt Ideal, giảm dần qua các kiểu
cắt Premium, Very Good, Good và phân bổ ít nhất ở kiểu cắt Fair
BIỂU ĐỒ 28
t %>% group_by(color) %>% summarise(m = mean(depth)) %>%
ggplot(aes(color,m)) +
geom_col(fill='green') +
geom_text(aes(label = round(m,2)),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo màu sắc và tính trung bình tỷ
lệ độ sâu của từng loại. Các cột biểu đồ có màu xanh lá cây, các dữ liệu
có màu đỏ, được làm tròn đến 2 chữ số thập phân và được điều chỉnh ở vị
trí dọc cách cột 2 đơn vị. Qua biểu đồ trên ta thấy các loại màu của kim
cương sẽ có xấp xỉ trung bình tỷ lệ độ sâu bằng nhau. Trong đó cao nhất
là màu J và thấp nhất là màu E.
BIỂU ĐỒ 29
t %>% ggplot(aes(x = clarity)) +
geom_bar() +
labs(x = 'Cấp độ tinh khiết', y = 'Số lượng') +
coord_flip() +
labs(title = 'Cấp độ tinh khiết của kim cương (biểu đồ ngang)')

Ta phân loại kim cương theo độ trong suốt. ta gắn x là
cấp độ tinh khiết, y là số lượng Và đây là biểu đồ ngang. Qua biểu đồ
trên ta thấy SI1 có độ tinh khiết cao nhất, giảm dần từ VS2, SI2, VS1,
VVS2, IF và I1 là kim cương có độ trong suốt thấp nhất
BIỂU ĐỒ 30
t %>% group_by(cut) %>% summarise(m= mean(depth)) %>%
ggplot(aes(x = cut,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = 2, color = 'green') +
labs(x = 'Kiểu cắt', y = 'Mean')

Ta phân loại kim cương theo kiểu cắt và tính trung bình
tỷ lệ độ sâu (trung bình z/x). ta gắn x là kiểu cắt, y là trung bình.
các số liệu được làm tròn 2 chữ số thập phân, được điều chỉnh ở vị trí
cách cột dọc 2 đơn vị và có màu xanh lá cây. Qua biểu đồ trên ta thấy
kiểu cắt Fair có độ sâu trung bình lớn nhất, giảm dần từ Good, Very
Good, Ideal và thấp nhất là Premium
Cảm ơn thầy đã đọc, chúc thầy 1 ngày làm việc vui
vẻ
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA0Ig0KYXV0aG9yOiAiTmd1eeG7hW4gUGjDumMgVGjhu4tuaCINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIHRoZW1lOiAiZGVmYXVsdCINCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCi0tLQ0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoRFQpDQpgYGANCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCA8LSBkaWFtb25kcw0KYGBgDQoNCiMgQknhu4JVIMSQ4buSIDENCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShtPSBtZWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGNsYXJpdHkseSA9IG0pKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwxKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnZ3JlZW4nKSArDQogIGxhYnMoeCA9ICfEkeG7mSB0cm9uZyBzdeG7kXQnLCB5ID0gJ2dpw6EnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRyb25nIHN14buRdCB2w6AgdMOtbmggZ2nDoSB0cnVuZyBiw6xuaCBj4bunYSB04burbmcgbG/huqFpIC4g4bueIGJp4buDdSDEkeG7kyB0csOqbiB0aMOsIHRhIGfhuq9uIHggbMOgIMSR4buZIHRyb25nIHN14buRdCwgeSBsw6AgZ2nDoSB0cnVuZyBiw6xuaCBj4bunYSB04burbmcgbG/huqFpOyBjw6FjIHPhu5EgbGnhu4d1IHPhur0gY8OzIG3DoHUgeGFuaCBsw6EgY8OieSwgxJHGsOG7o2MgbMOgbSB0csOybiAwMSBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkga2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCBTSTIgbMOgIGPDsyBnacOhIHRydW5nIGLDrG5oIGNhbyBuaOG6pXQsIHRp4bq/cCDEkeG6v24gbMOgIFNJMiwgdGjhuqVwIGjGoW4gbuG7r2EgbOG6p24gbMaw4bujdCBsw6AgVlMyLCBJMSwgVlMxLCBXUzIsIElGIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBXczEqKioNCg0KIyBCSeG7glUgxJDhu5IgMg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdyZWQnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnYmxhY2snKSArDQogICAgeGxhYignQ29sb3InKSArDQogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsNCiAgICBsYWJzKHRpdGxlID0nc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2MnKQ0KYGBgDQoNCg0KKioqVGEgUGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyB2w6AgdMOtbmggc+G7kSBsxrDhu6NuZyBj4bunYSB04burbmcgbcOgdSBz4bqvYy4geCBsw6AgbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZywgeSBsw6Agc+G7kSBsxrDhu6NuZyBj4bunYSB04burbmcgbG/huqFpIG3DoHUgc+G6r2MuIEPDoWMgc+G7kSBsaeG7h3UgY8OzIG3DoHUgxJFlbiwgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgMiDEkcahbiB24buLLiBNw6B1IGPhu6dhIGPDoWMgY+G7mXQgbMOgIG3DoHUgxJHhu48gIC4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgxJHGsOG7o2Mgbmhp4buBdSBuaOG6pXQgbMOgIG3DoHUgRyB24bubaSAxMTI5MiB2acOqbiwgdGnhur9wIMSR4bq/biBsw6AgRSB24bubaSA5Nzk3IHZpw6puLCBGIHbhu5tpIDk1NDIgdmnDqm4sIEggduG7m2kgODMwNCB2acOqbixEIHbhu5tpIDY3NzUgdmnDqm4sIEkgduG7m2kgNTQyMiB2acOqbiB2w6Agw610IG5o4bqldCBsw6AgbcOgdSBKIHbhu5tpIDI4MDggdmnDqm4qKioNCiMgQknhu4JVIMSQ4buSIDMNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0KSkgKw0KICAgIGdlb21fYmFyKCkgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArDQogICAgY29vcmRfZmxpcCgpICsNCiAgICBsYWJzKHRpdGxlID0gJ1Phu5Ega2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QoYmnhu4N1IMSR4buTIG5nYW5nKScpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8ga2nhu4N1IGPhuq90LiBCaeG7g3UgxJHhu5MgbmdhbmcgdHLDqm4gY2hvIHRhIHRo4bqleSDEkcaw4bujYyBraeG7g3UgR8OtYSBj4bunYSBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBraeG7g3UgY+G6r3QuIFRhIHRo4bqleSBz4buRIGtpbSBjxrDGoW5nIHPhur0gdMSDbmcgZOG6p24gdOG7qyBGYWlyLCBHb29kLCBWZXJ5IEdvb2QsIFByZW1pdW0sIElkZWFsKioqDQoNCiMgQknhu4JVIMSQ4buSIDQNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdncGxvdChhZXMoeCA9IGN1dCkpICsNCiAgICBnZW9tX2JhcigpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykgKw0KICAgIGxhYnModGl0bGUgPSAnU+G7kSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBj4bqvdChiaeG7g3UgxJHhu5MgZOG7jWMpJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QuIEJp4buDdSDEkeG7kyBk4buNYyB0csOqbiBjaG8gdGEgdGjhuqV5IMSRxrDhu6NjIGtp4buDdSBHw61hIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIGtp4buDdSBj4bqvdC4gVGEgdGjhuqV5IHPhu5Ega2ltIGPGsMahbmcgc+G6vSB0xINuZyBk4bqnbiB04burIEZhaXIsIEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSwgSWRlYWwqKioNCg0KIyBCSeG7glUgxJDhu5IgNQ0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjYXJhdCkgJT4lIGZpbHRlcihjYXJhdCA9PSAwLjUgfCBjYXJhdCA9PSAxLjAwIHwgY2FyYXQgPT0gMS41IHwgY2FyYXQgPT0gMi4wNSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhjYXJhdCxuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J2JsdWUnKSArDQogICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ3doaXRlJykgKw0KICAgIHhsYWIoJ0NhcmF0JykgKw0KICAgIHlsYWIoJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIHRy4buNbmcgbMaw4bujbmcgY2FyYXQg4bufIGPDoWMgbeG7kWMgMC41LCAxLjAsIDEuNSwgMi4wIHbDoCB0w61uaCBz4buRIGzGsOG7o25nIGPhu6dhIHThu6tuZyBt4buRYyBraOG7kWkgbMawxqFuZy4gdGEgZ+G6r24geCBsw6AgY2FyYXQgdsOgIHkgbMOgIHPhu5EgbMaw4bujbmcgdOG7q25nIG3hu5FjIGNhcmF0LiBDw6FjIGPhu5l0IGJp4buDdSDEkeG7kyBjw7MgbcOgdSB4YW5oIGzDoSBjw6J5LCBjw6FjIHPhu5EgbGnhu4d1IGPDsyBtw6B1IHRy4bqvbmcsIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCDhu58gduG7iyB0csOtIGThu41jIGPDoWNoIGPhu5l0IDIgxJHGoW4gduG7iyAuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IMSRxrDhu6NjIHPhu5Ega2ltIGPGsMahbmcgY8OzIHRy4buNbmcgbMaw4bujbmcgMS4wIGNhcmF0IGzDoCBuaGnhu4F1IG5o4bqldCB2w6AgdGjhuqVwIG5o4bqldCBsw6AgMi4wKioNCg0KIyBCSeG7glUgxJDhu5IgNg0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG1lYW4ocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyhjdXQsbikpICsNCiAgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChuLDIpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsNCiAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8ga2nhu4N1IGPhuq90IHbDoCB0w61uaCBnacOhIHRydW5nIGLDrG5oLiBUYSBn4bqvbiB4IGzDoCBraeG7g3UgY+G6r3QsIHkgbMOgIHPhu5EgbMaw4bujbmcuIEPDoWMgc+G7kSBsaeG7h3Ugc+G6vSBjw7MgbcOgdSDEkeG7jywgxJHGsOG7o2MgbMOgbSB0csOybiDEkeG6v24gMiBjaOG7ryB0aOG6rXAgcGjDom4gdsOgIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCDhu58gduG7iyB0csOtIGThu41jIGPDoWNoIGPhu5l0IHbhu5tpIMSRxqFuIHbhu4sgbMOgIDI7IGPhu5l0IGJp4buDdSDEkeG7kyBjw7MgbcOgdSB4YW5oIGzDoSBjw6J5LiBRdWEgYmnhu4N1IMSR4buTIHRhIHRo4bqleSBnacOhIHRydW5nIGLDrG5oIGPhu6dhIHThu6tuZyBraeG7g3UgY+G6r3Qgc+G6vSB0xINuZyBk4bqnbiB04burIElkZWFsLCBHb29kLCBWZXJ5IEdvb2QsIEZhaXIsIFByZW1pdW0qKioNCg0KIyBCSeG7glUgxJDhu5IgNw0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobT0gbWVhbihjYXJhdCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IG0pKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnS2nhu4N1IGPhuq90JywgeSA9ICdUcuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2nhu4N1IGPhuq90IGtpbSBjxrDGoW5nIHbDoCB0w61uaCB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIChjYXJhdCkuIHRhIGfhuq9uIHggbMOgIGtp4buDdSBj4bqvdCwgeSBsw6AgdHLhu41uZyBsxrDhu6NuZyB0cnVuZyBiw6xuaC4gQ8OhYyBz4buRIGxp4buHdSBz4bq9IGPDsyBtw6B1IMSR4buPLCDEkcaw4bujYyBsw6BtIHRyw7JuIMSR4bq/biAyIGNo4buvIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0YSB0aOG6pXkgxJHGsOG7o2MgdHLhu41uZyBsxrDGoW5nIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIHTEg25nIHThu6sgSWRlYWwoMC43IGNhcmF0KSwgVmVyeSBHb29kKDAuODEgY2FyYXQpLCBHb29kKDAuODUgY2FyYXQpLCBQcmVtaXVtKDAuODkgY2FyYXQpIHbDoCBGYWlyKDEuMDUgY2FyYXQpKioqDQoNCiMgQknhu4JVIMSQ4buSIDgNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG09IG1lYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY29sb3IseSA9IG0pKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnZ3JlZW4nKSArDQogIGxhYnMoeCA9ICdNw6B1JywgeSA9ICdUcuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIHbDoCB0w61uaCB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIHRoZW8gxJHGoW4gduG7iyBjYXJhdCBj4bunYSB04burbmcgbG/huqFpIC4g4bueIGJp4buDdSDEkeG7kyB0csOqbiB0aMOsIHRhIGfhuq9uIHggbMOgIG3DoHUgc+G6r2MsIHkgbMOgIHRy4buNbmcgbMaw4bujbmcgdHJ1bmcgYsOsbmggY+G7p2EgdOG7q25nIGxv4bqhaTsgY8OhYyBz4buRIGxp4buHdSBz4bq9IGPDsyBtw6B1IHhhbmggbMOhIGPDonksIMSRxrDhu6NjIGzDoG0gdHLDsm4gMiBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgbcOgdSBKIGPDsyB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIGNhbyBuaOG6pXQgbMOgIGdp4bqjbSBk4bqnbiB04burIEksIEggLCBHICwgRiwgbcOgdSBEIFbDoCBFIGPDsyB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIHRo4bqlcCBuaOG6pXQuKioqDQoNCiMgQknhu4JVIMSQ4buSIDkNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobT0gbWVhbihwcmljZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjb2xvcix5ID0gbSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDApKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpICsNCiAgbGFicyh4ID0gJ23DoHUgc+G6r2MnLCB5ID0gJ0fDrWEgdHJ1bmcgYsOsbmgnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2MgdsOgIHTDrW5oIGdpw6EgdHJ1bmcgYsOsbmggY+G7p2EgdOG7q25nIGxv4bqhaSAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCBtw6B1IHPhuq9jLCB5IGzDoCBnacOhIHRydW5nIGLDrG5oIGPhu6dhIHThu6tuZyBsb+G6oWk7IGPDoWMgc+G7kSBsaeG7h3Ugc+G6vSBjw7MgbcOgdSB4YW5oIGzDoSBjw6J5LCDEkcaw4bujYyBsw6BtIHRyw7JuIDAgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4gdsOgIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCDhu58gduG7iyB0csOtIGThu41jIGPDoWNoIGPhu5l0IHbhu5tpIMSRxqFuIHbhu4sgbMOgIDIuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gVGEgdGjhuqV5IG3DoHUgSiBjw7MgZ2nDoSB0cnVuZyBiw6xuaCBjYW8gbmjhuqV0IHbDoCBnaeG6o20gZOG6p24gdOG7qyBJLCBILCBHLCBGLCBEIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBtw6B1IEQgVuG7mkkgMzE3MCDEkMahbiB24buLIGdpw6EqKioNCiMgQknhu4JVIMSQ4buSIDEwDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoZGlhbW9uZHMgLCBhZXNfc3RyaW5nKHggPSAiY3V0IiwgeSA9ICJwcmljZSIpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiR2nDoSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBj4bqvdCIsDQogICAgICAgeCA9ICJLaeG7g3UgY+G6r3QiLA0KICAgICAgIHkgPSAiR2nDoSIpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gdOG7lW5nIGdpw6EgdsOgIGtp4buDdSBj4bqvdC4gQmnhu4N1IMSR4buTIHRyw6puIGNobyB0YSB0aOG6pXkgxJHGsOG7o2Mga2nhu4N1IEfDrWEgY+G7p2Ega2ltIGPGsMahbmcgdGhlbyB04burbmcga2nhu4N1IGPhuq90LiBUYSB0aOG6pXkga2nhu4N1IGPhuq90ICBJZGVhbCB0aMOsIGdpw6Ega2ltIGPGsMahbmcgc+G6vSB0xINuZyBk4bqnbiB04burIEZhaXIsIEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSwgSWRlYWwqKioNCg0KDQojIEJJ4buCVSDEkOG7kiAxMQ0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKGN1dCxuKSkgKw0KICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnS2nhu4N1IEPhuq90JywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QgdsOgIHTDrW5oIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIG3DoHUgLiDhu54gYmnhu4N1IMSR4buTIHRyw6puIHRow6wgdGEgZ+G6r24geCBsw6Aga2nhu4N1IGPhuq90LCB5IGzDoCBz4buRIGzGsOG7o25nIGPhu6dhIHThu6tuZyBsb+G6oWk7IGPDoWMgc+G7kSBsaeG7h3Ugc+G6vSBjw7MgbcOgdSDEkeG7jyB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMjsgY8OhYyBj4buZdCBz4bq9IGPDsyBtw6B1IHhhbmggbMOhIGPDonkuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IGxv4bqhaSBGYWlyIGPDsyBz4buRIGzGsOG7o25nIMOtdCBuaOG6pXQgdsOgIHTEg25nIGThuqduIHRoZW8ga2nhu4N1IGPhuq90IEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSB2w6Aga2nhu4N1IGPhuq90IFByZW1pdW0gbMOgIGPhu5Egc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCoqKg0KIyBCSeG7glUgxJDhu5IgMTINCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdyb3VwX2J5KGNsYXJpdHkpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGNsYXJpdHkseSA9IG4pKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobiwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnZ3JlZW4nKSArDQogIGxhYnMoeCA9ICfEkeG7mSB0cm9uZyBzdeG7kXQnLCB5ID0gJ3Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRyb25nIHN14buRdCB2w6AgdMOtbmggc+G7kSBsxrDhu6NuZyAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCDEkeG7mSB0cm9uZyBzdeG7kXQsIHkgbMOgIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIGxv4bqhaTsgY8OhYyBz4buRIGxp4buHdSBz4bq9IGPDsyBtw6B1IHhhbmggbMOhIGPDonksIMSRxrDhu6NjIGzDoG0gdHLDsm4gNSBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgxJHhu5kgdHJvbmcgc3Xhu5F0IGPDsyBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0IGzDoCBTSTEsIGdp4bqjbSBk4bqnbiB04burIFZTMiAsU0kyLCBWUzEsIFdTMiwgV1MxLCBJRiB2w6AgSTEgbMOgIMSR4buZIHRyb25nIHN14buRdCBjw7Mgc+G7kSBsxrDhu6NuZyB0aOG6pXAgbmjhuqV0KioqDQoNCiMgQknhu4JVIMSQ4buSIDEzDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG09IG1lYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSx5ID0gbSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDUpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpICsNCiAgbGFicyh4ID0gJ8SR4buZIHRyb25nIHN14buRdCcsIHkgPSAndHLhu41uZyBsxrDhu6NuZyB0cnVuZyBiw6xuaCcpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdHJvbmcgc3Xhu5F0IHbDoCB0w61uaCB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIGPhu6dhIGNow7puZyB0aGVvIMSRxqFuIHbhu4sgY2FyYXQuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCDEkeG7mSB0cm9uZyBzdeG7kXQsIHkgbMOgIGto4buRaSBsxrDhu6NuZyB0cnVuZyBiw6xuaCBj4bunYSB04burbmcgbG/huqFpOyBjw6FjIHPhu5EgbGnhu4d1IHPhur0gY8OzIG3DoHUgeGFuaCBsw6EgY8OieSwgxJHGsOG7o2MgbMOgbSB0csOybiA1IGNo4buvIHPhu5EgdGjhuq1wIHBow6JuIHbDoCDEkcaw4bujYyDEkWnhu4F1IGNo4buJbmgg4bufIHbhu4sgdHLDrSBk4buNYyBjw6FjaCBj4buZdCB24bubaSDEkcahbiB24buLIGzDoCAyLiBWw6AgdGEgdGjhuqV5IMSRxrDhu6NjIGtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0cm9uZyBzdeG7kXQgY2FvIG5o4bqldCBsw6AgSTEsIHRo4bqlcCBoxqFuIMSRw7MgbMOgIFNJMiB2w6AgZ2nhuqNtIGThuqduIHThu6sgU0kxLCBWUzIsIFZTMSwgV1MyLCBXUzEsIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBJRi4qKioNCg0KIyBCSeG7glUgxJDhu5IgMTQNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCA8LSB0ICU+JSBtdXRhdGUoY2FyYXRDID0gY3V0KGNhcmF0LDQsIGxhYmVsID0gYygncuG6pXQgbmjhu48nLCAnbmjhu48nLCd24burYScsJ2zhu5tuJykpKQ0KdCAlPiUgZ2dwbG90KGFlcyh4ID0gY2FyYXRDKSkgKw0KICBnZW9tX2JhcihmaWxsID0gJ3JlZCcpICsNCiAgbGFicyh4ID0gJ3Bow6JuIGxv4bqhaScsIHkgPSAnc+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKioqVGEgdGjDqm0gMSBj4buZdCBk4buvIGxpw6p1IGNhcmF0QyB2w6BvIGLhu5kgZOG7ryBsaeG7h3UgdCDEkeG7gyDEkcOhbmggZ2nDoSB0cuG7jW5nIGzGsOG7o25nIGPhu6dhIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBt4bupYyDEkeG7mSAncuG6pXQgbmjhu48nICduaOG7jycsICd24burYScgdsOgICds4bubbicuIEPDoWMgY+G7mXQgYmnhu4N1IMSR4buTIGPDsyBtw6B1IMSR4buPLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDsyB0cuG7jW5nIGzGsOG7o25nICdy4bqldCBuaOG7jycgbMOgIGzhu5tuIG5o4bqldCB2w6AgZ2nhuqNtIGThuqduIHThu6sgJ25o4buPJywgJ3bhu6thJyB2w6AgdGjhuqVwIG5o4bqldCBsw6AgbG/huqFpICds4bubbicqKioNCg0KIyBCSeG7glUgxJDhu5IgMTUNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCA8LSB0ICU+JSBtdXRhdGUocHJpY2VDID0gY3V0KHByaWNlLDUsIGxhYmVsID0gYygncuG6pXQgdGjhuqVwJywgJ3Ro4bqlcCcsJ3bhu6thJywnY2FvJywncuG6pXQgY2FvJykpKQ0KdCAlPiUgZ2dwbG90KGFlcyh4ID0gcHJpY2VDKSkgKw0KICBnZW9tX2JhcihmaWxsID0gJ3JlZCcpICsNCiAgbGFicyh4ID0gJ3Bow6JuIGxv4bqhaScsIHkgPSAnc+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKioqVGEgdGjDqm0gMSBj4buZdCBk4buvIGxpw6p1IHByaWNlQyB2w6BvIGLhu5kgZOG7ryBsaeG7h3UgdCDEkeG7gyDEkcOhbmggZ2nDoSBHw61hIGPhuqMgY+G7p2EgY8OhYyB2acOqbiBraW0gY8awxqFuZyB0aGVvIG3hu6ljIMSR4buZICdy4bqldCB0aOG6pXAnICd0aOG6pXAnLCAnduG7q2EnLCAnY2FvJyB2w6AgJ3LhuqV0IGNhbycuIEPDoWMgY+G7mXQgYmnhu4N1IMSR4buTIGPDsyBtw6B1IMSR4buPLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDsyBnacOhICdy4bqldCB0aOG6pXAnIGzDoCBs4bubbiBuaOG6pXQgdsOgIGdp4bqjbSBk4bqnbiB04burICd0aOG6pXAnLCAnduG7q2EnLCAnY2FvJyB2w6AgdGjhuqVwIG5o4bqldCBsw6AgbG/huqFpICdy4bqldCBjYW8nKioqDQoNCiMgQknhu4JVIMSQ4buSIDE2DQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgPC0gZGlhbW9uZHMgDQpiIDwtIHQgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCmIgJT4lIGdncGxvdChhZXMoeCA9IGN1dCwgeSA9IG4pKSArDQogIGdlb21fY29sKGRhdGEgPSBiICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0QnKSwgZmlsbCA9ICdyZWQnKSArDQogIGdlb21fY29sKGRhdGEgPSBiICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICdibHVlJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QgdsOgIG3DoHUgc+G6r2Mgc2F1IMSRw7MgdMOtbmggc+G7kSBsxrDhu6NuZyAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCBraeG7g3UgY+G6r3QsIHkgbMOgIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIGxv4bqhaTsgdGEgc+G6vSBs4buNYyBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBjw7MgbcOgdSBELGPhu5l0IGJp4buDdSDEkeG7kyBjw7MgbcOgdSDEkeG7jyB2w6AgbOG7jWMgY8OhYyBsb+G6oWkga2ltIGPGsMahbmcgY8OzIG3DoHUgSiwgYmnhu4N1IMSR4buTIGPDsyBtw6B1IHhhbmggZMawxqFuZy4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSDEkcOjIGzhu41jIMSRxrDhu6NjIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBEIHBow6JuIGLhu5Ugw610IG5o4bqldCDhu58ga2nhu4N1IGPhuq90IEZhaXIgdsOgIHTEg25nIGThuqduIGzDqm4gdOG7qyBHb29kLCBWZXJ5IEdvb2QsIFByZW1pdW0sIHbDoCBuaGnhu4F1IG5o4bqldCBsw6AgSWRlYWwuIFbDoCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDsyBtw6B1IEogY8WpbmcgcGjhuqluIGLhu5UgdMawxqFuZyB04buxIG5oxrAga2ltIGPGsMahbmcgY8OzIG3DoHUgRCoqKg0KIyBCSeG7glUgxJDhu5IgMTcNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCA8LSBkaWFtb25kcyANCmIgPC0gdCAlPiUgZ3JvdXBfYnkoY3V0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KYiAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGIgJT4lIGZpbHRlcihjb2xvciA9PSAnRScpLCBmaWxsID0gJ3JlZCcpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGIgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBmaWxsID0gJ2JsdWUnKQ0KDQpgYGANCg0KKioqVMawxqFuZyB04buxIG5oxrAgYmnhu4N1IMSR4buTIHPhu5EgMTcsIGzhuqduIG7DoHkgdGhheSB2w6wgbOG7jWMgY8OhYyBraW0gY8awxqFuZyBjw7MgbcOgdSAnRCcgVsOAICdKJyB0aMOsIHRhIHPhur0gbOG7jWMgY8OhYyBraW0gY8awxqFuZyBjw7MgbcOgdSAnRScgVsOAICdIJy4g4bueIGJp4buDdSDEkeG7kyBuw6B5IHRhIHRo4bqleSBtw6B1IEUga2jDtG5nIHBow6JuIGLhu5Ug4bufIGxv4bqhaSBraW0gY8awxqFuZyBjw7Mga2nhu4N1IGPhuq90IEZhaXIsIFByZW1pdW0sIHbDoCBtw6B1IHPhuq9jIG7DoHkgcGjDom4gYuG7lSBuaGnhu4F1IG5o4bqldCDhu58ga2nhu4N1IGPhuq90IElkZWFsIGdp4bqjbSBk4bqnbiB04burIFZlcnkgR29vZCwgR29vZC4gTcOgdSBIIHBow6JuIGLhu5Ug4bufIGPDoWMga2nhu4N1IGPhuq90LCBuaGnhu4F1IG5o4bqldCBsw6AgSWRlYWwgdsOgIGdp4bqjbSBk4bqnbiB04burIFByZW1pdW0sIFZlcnkgR29vZCwgR29vZCB2w6AgdGjhuqVwIG5o4bqldCBsw6AgRmFpcg0KIyBCSeG7glUgxJDhu5IgMTgNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KYiA8LSB0ICU+JSBncm91cF9ieShjbGFyaXR5LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KYiAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSwgeSA9IG4pKSArDQogIGdlb21fY29sKGRhdGEgPSBiICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0YnKSwgZmlsbCA9ICdyZWQnKSArDQogIGdlb21fY29sKGRhdGEgPSBiICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICdibHVlJykNCg0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSDEkeG7mSB0cm9uZyBzdeG7kXQgdsOgIG3DoHUgc+G6r2Mgc2F1IMSRw7MgdMOtbmggc+G7kSBsxrDhu6NuZyAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCDEkeG7mSB0cm9uZyBzdeG7kXQsIHkgbMOgIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIGxv4bqhaTsgdGEgc+G6vSBs4buNYyBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBjw7MgbcOgdSAnRicsY+G7mXQgYmnhu4N1IMSR4buTIGPDsyBtw6B1IMSR4buPIHbDoCBs4buNYyBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBjw7MgbcOgdSBKLCBiaeG7g3UgxJHhu5MgY8OzIG3DoHUgeGFuaCBkxrDGoW5nLiAgUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgY8OhYyBtw6B1IHBow6JuIGLhu5Ug4bufIHThuqV0IGPhuqMgxJHhu5kgdHJvbmcgc3Xhu5F0LiBUcm9uZyDEkcOzIG3DoHUgSiBz4bq9IHBow6JuIGLhu5Ugbmhp4buBdSBuaOG6pXQg4bufIFNJMSBy4buTaSBnaeG6o20gZOG6p24gdOG7qyBWUzIsIFZTMSwgU0kyLCBXUzIsIFdTMSwgSUYgdsOgIHRo4bqlcCBuaOG6pXQgbMOgIEkxLiBDw7JuIG3DoHUgRiBQaMOibiBi4buVIG5oaeG7gXUgbmjhuqV0IOG7nyBWUzIgcuG7k2kgZ2nhuqNtIGThuqduIHThu6sgU0kxLCBTSTIsIFZTMSwgV1MyLCBXUzEsIElGIHbDoCB0aMOhcCBuaOG6pXQgbMOgIEkxLioqKg0KDQojIEJJ4buCVSDEkOG7kiAxOQ0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpiIDwtIHQgJT4lIGdyb3VwX2J5KGNsYXJpdHksIGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpDQpiICU+JSBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGIgJT4lIGZpbHRlcihjb2xvciA9PSAnRScpLCBmaWxsID0gJ3JlZCcpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGIgJT4lIGZpbHRlcihjb2xvciA9PSAnRycpLCBmaWxsID0gJ2JsdWUnKQ0KYGBgDQoNCioqKlTGsMahbmcgdOG7sSBuaMawIGJp4buDdSDEkeG7kyBz4buRIDE4LCBs4bqnbiBuw6B5IHRoYXkgdsOsIGzhu41jIGPDoWMga2ltIGPGsMahbmcgY8OzIG3DoHUgJ0YnIFbDgCAnSicgdGjDrCB0YSBz4bq9IGzhu41jIGPDoWMga2ltIGPGsMahbmcgY8OzIG3DoHUgJ0UnIFbDgCAnRycuIOG7niBiaeG7g3UgxJHhu5MgbsOgeSB0YSB0aOG6pXkgbcOgdSBFIGNo4buJIHBow6JuIGLhu5Ug4bufIGxv4bqhaSBraW0gY8awxqFuZyDEkeG7mSB0cm9uZyBzdeG7kXQgbMOgIFNJMixWUzIgdsOgIFNJMS4gQ8OybiBraW0gY8awxqFuZyBtw6B1IEcgcGjDom4gYuG7lSDhu58gdOG6pXQgY+G6oyDEkeG7mSB0cm9uZyBzdeG7kXQsIHRyb25nIMSRw7Mgbmhp4buBdSBuaOG6pXQgbMOgIFZTMiwgZ2nhuqNtIGThuqduIHThu6sgVlMxLCBTSTEsIFNJMiwgVlZTMiwgVlZTMSwgSUYgdsOgIHBow6JuIGLhu5Ugw610IG5o4bqldCDhu58gSTEuKioqDQoNCiMgQknhu4JVIMSQ4buSIDIwDQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCg0KYyA8LSB0ICU+JSBncm91cF9ieShjbGFyaXR5LCBjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCmMgJT4lIGdncGxvdChhZXMoeCA9IGN1dCwgeSA9IG4pKSArDQogIGdlb21fY29sKGRhdGEgPSBjICU+JSBmaWx0ZXIoY2xhcml0eSA9PSAnSUYnKSwgZmlsbCA9ICdyZWQnKSArDQogIGdlb21fY29sKGRhdGEgPSBjICU+JSBmaWx0ZXIoY2xhcml0eSA9PSAnSTEnKSwgZmlsbCA9ICdibHVlJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgxJHhu5kgdHJvbmcgc3Xhu5F0IHbDoCBraeG7g3UgY+G6r3Qgc2F1IMSRw7MgdMOtbmggc+G7kSBsxrDhu6NuZyAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCBraeG7g3UgY+G6r3QsIHkgbMOgIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIGxv4bqhaTsgVGEgbOG7jWMgY8OhYyBraW0gY8awxqFuZyBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0ICdJRicgbMOgIGPDoWMgY+G7mXQgbcOgdSDEkeG7jywgY8OhYyBraW0gY8awxqFuZyBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0ICdJMScgbMOgIGPDoWMgY+G7mXQgbcOgdSB4YW5oLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBraW0gY8awxqFuZyBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0ICdJRicgY2jhu4kgcGjDom4gYuG7lSDhu58ga2nhu4N1IGPhuq90IElkZWFsLCBWZXJ5IEdvb2QsIFByZW1pdW0gdGhlbyBz4buRIGzGsOG7o25nIGdp4bqjbSBk4bqnbi4gVHJvbmcga2hpIMSRw7MgxJHhu5kgdHJvbmcgc3Xhu5F0IEkxIHBow6JuIGLhu5Ug4bufIG3hu41pIGtp4buDdSBj4bqvdCwgbmhp4buBdSBuaOG6pXQgbMOgIFByZW1pdW0gdsOgIGdp4bqjbSBk4bqnbiB04burIEZhaXIsIElkZWEsIEdvb2QsIHRo4bqlcCBuaOG6pXQgbMOgIFZlcnkgR29vZC4qKioNCg0KIyBCSeG7glUgxJDhu5IgMjENCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZiA8LSB0ICU+JSBncm91cF9ieShjbGFyaXR5LCBjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCmYgJT4lIGdncGxvdChhZXMoeCA9IGN1dCwgeSA9IG4pKSArDQogIGdlb21fY29sKGRhdGEgPSBmICU+JSBmaWx0ZXIoY2xhcml0eSA9PSAnU0kxJyksIGZpbGwgPSAncmVkJykgKw0KICBnZW9tX2NvbChkYXRhID0gZiAlPiUgZmlsdGVyKGNsYXJpdHkgPT0gJ1NJMicpLCBmaWxsID0gJ2JsdWUnKQ0KDQpgYGANCg0KKioqVMawxqFuZyB04buxIG5oxrAgYmnhu4N1IMSR4buTIHPhu5EgMjAsIGzhuqduIG7DoHkgdGhheSB2w6wgbOG7jWMgY8OhYyBraW0gY8awxqFuZyBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0ICdpRicgVsOAICdpMScgdGjDrCB0YSBz4bq9IGzhu41jIGPDoWMga2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCAnU0kxJyBWw4AgJ1NJMicuIOG7niBiaeG7g3UgxJHhu5MgbsOgeSB0YSB0aOG6pXkgxJHhu5kgdHJvbmcgc3Xhu5F0IFNJMSBraMO0bmcgcGjDom4gYuG7lSDhu58gbG/huqFpIGtpbSBjxrDGoW5nIGPDsyBraeG7g3UgY+G6r3QgRmFpciwgcGjDom4gYuG7kSBuaGnhu4F1IG5o4bqldCDhu58ga2nhu4N1IGPhuq90IElkZWFsIGdp4bqjbSBk4bqnbiB04burIFZlcnkgR29vZCwgUHJlbWl1bSB2w6AgcGjDom4gYuG7lSDDrXQgbmjhuqV0IOG7nyBraeG7g3UgY+G6r3QgR29vZC4gS2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCBTSTIgcGjDom4gYuG7lSDhu58gdOG6pXQgY+G6oyBraeG7g3UgY+G6r3QsIG5oaeG7gXUgbmjhuqV0IOG7nyBraeG7g3UgY+G6r3QgUHJlbWl1bSBnaeG6o20gZOG6p24gdOG7qyBJZGVhbCwgVmVyeSBHb29kLCBHb29kIHbDoCBwaMOibiBi4buVIMOtdCBuaOG6pXQg4bufIGtp4buDdSBj4bqvdCBGYWlyLioqKg0KDQojIEJJ4buCVSDEkOG7kiAyMg0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG4pKSArDQogIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aCh0JGNhcmF0KSkpLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QgdsOgIHTDrW5oIHPhu5EgbMaw4bujbmcgY+G7p2EgY8OhYyBraeG7g3UgY+G6r3QuIHRhIGfhuq9uIHggbMOgICdMb+G6oWknLCB5IGzDoCAnU+G7kSBMxrDhu6NuZycuIEPDoWMgY+G7mXQgYmnhu4N1IMSR4buTIMSRxrDhu6NjIHTDtCBtw6B1IHhhbmggbMOhIGPDonksIGPDoWMgc+G7kSBsaeG7h3UgbMOgIHThu7cga2jhu5FpIGzGsOG7o25nIGPhu6dhIG3hu5dpIGtp4buDdSBj4bqvdCwgY8OhYyBz4buRIGxp4buHdSBuw6B5IGPDsyBtw6B1IMSR4buPIHbDoCDEkcaw4bujYyDEkWnhu4F1IGNo4buJbmggIHbhu4sgdHLDrSBk4buNYyBjw6FjIGPhu5l0IGThu68gbGnhu4d1IHbhu5tpIMSRxqFuIHbhu4sgbMOgIDIuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IEtp4buDdSBj4bqvdCBJZGVhbCBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu4EgdHLhu41uZyBsxrDhu6NuZyAoxJHGoW4gduG7iyBjYXJhdCkgdsOgIGdp4bqjbSBk4bqnbiB04burIFByZW1pdW0sIFZlcnkgR29vZCwgR29vZCB2w6Aga2nhu4N1IGPhuq90IEZhaXIgY8OzIHThu7cgbOG7hyB0cuG7jW5nIGzGsOG7o25nIHRo4bqlcCBuaOG6pXQqKioNCg0KIyBCSeG7glUgxJDhu5IgMjMNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKHQkY2FyYXQpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArDQogIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBtw6B1IHPhuq9jIHbDoCB0w61uaCBz4buRIGzGsOG7o25nIGPhu6dhIGPDoWMgbcOgdS4gdGEgZ+G6r24geCBsw6AgJ0xv4bqhaScsIHkgbMOgICdT4buRIEzGsOG7o25nJy4gQ8OhYyBj4buZdCBiaeG7g3UgxJHhu5MgxJHGsOG7o2MgdMO0IG3DoHUgeGFuaCBsw6EgY8OieSwgY8OhYyBz4buRIGxp4buHdSBsw6AgdOG7tyBs4buHIGto4buRaSBsxrDhu6NuZyBj4bunYSBt4buXaSBraeG7g3UgY+G6r3QsIGPDoWMgc+G7kSBsaeG7h3UgbsOgeSBjw7MgbcOgdSDEkeG7jyB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oICB24buLIHRyw60gZOG7jWMgY8OhYyBj4buZdCBk4buvIGxp4buHdSB24bubaSDEkcahbiB24buLIGzDoCAyLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBraW0gY8awxqFuZyBtw6B1IEcgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB24buBIHRy4buNbmcgbMaw4bujbmcoMjAsOTMpLCBnaeG6o20gZOG6p24gbMOgIEUsIEYsIEgsIEQsIEkgdsOgIGtpbSBjxrDGoW5nIG3DoHUgSiBjaGnhur9tIHThu7cgbOG7hyB0aOG6pXAgbmjhuqV0ICg1LDIxJSkqKioNCg0KIyBCSeG7glUgxJDhu5IgMjQNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKHQkcHJpY2UpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArDQogIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBtw6B1IHPhuq9jIHbDoCB0w61uaCBz4buRIGzGsOG7o25nIGPhu6dhIGPDoWMgbcOgdS4gdGEgZ+G6r24geCBsw6AgJ0xv4bqhaScsIHkgbMOgICdT4buRIEzGsOG7o25nJy4gQ8OhYyBj4buZdCBiaeG7g3UgxJHhu5MgxJHGsOG7o2MgdMO0IG3DoHUgeGFuaCBsw6EgY8OieSwgY8OhYyBz4buRIGxp4buHdSBsw6AgdOG7tyBs4buHIGdpw6EgdGnhu4FuIGPhu6dhIG3hu5dpIGtp4buDdSBj4bqvdCwgY8OhYyBz4buRIGxp4buHdSBuw6B5IGPDsyBtw6B1IMSR4buPIHbDoCDEkcaw4bujYyDEkWnhu4F1IGNo4buJbmggIHbhu4sgdHLDrSBk4buNYyBjw6FjIGPhu5l0IGThu68gbGnhu4d1IHbhu5tpIMSRxqFuIHbhu4sgbMOgIDIuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IGtpbSBjxrDGoW5nIG3DoHUgRyBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu4EgZ2nDoSgyMCw5MyUpLCBnaeG6o20gZOG6p24gbMOgIEUsIEYsIEgsIEQsIEkgdsOgIGtpbSBjxrDGoW5nIG3DoHUgSiBjaGnhur9tIHThu7cgbOG7hyB0aOG6pXAgbmjhuqV0ICg1LDIxJSkqKioNCg0KIyBCSeG7glUgxJDhu5IgMjUNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhjbGFyaXR5LG4pKSArDQogIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aCh0JHByaWNlKSkpLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0cm9uZyBzdeG7kXQgdsOgIHTDrW5oIHPhu5EgbMaw4bujbmcgY+G7p2EgY8OhYyBtw6B1LiB0YSBn4bqvbiB4IGzDoCAnTG/huqFpJywgeSBsw6AgJ1Phu5EgTMaw4bujbmcnLiBDw6FjIGPhu5l0IGJp4buDdSDEkeG7kyDEkcaw4bujYyB0w7QgbcOgdSB4YW5oIGzDoSBjw6J5LCBjw6FjIHPhu5EgbGnhu4d1IGzDoCB04bu3IGzhu4cgZ2nDoSB0aeG7gW4gY+G7p2EgbeG7l2kgbG/huqFpIGtpbSBjxrDGoW5nLCBjw6FjIHPhu5EgbGnhu4d1IG7DoHkgY8OzIG3DoHUgxJHhu48gdsOgIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCAgduG7iyB0csOtIGThu41jIGPDoWMgY+G7mXQgZOG7ryBsaeG7h3UgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkga2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCBTSTEgY2hp4bq/bSB04bu3IGzhu4cgZ2nDoSBjYW8gbmjhuqV0ICgyNCwyJSksIGdp4bqjbSBk4bqnbiB04burIFZTMiwgU0kyLCBWUzEsIFZWUzIsIFZWUzEsIElGLCBJMSgxLDQlKSoqKg0KDQojIEJJ4buCVSDEkOG7kiAyNg0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG4pKSArDQogIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aCh0JHByaWNlKSkpLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCg0KYGBgDQoNCiMgQknhu4JVIMSQ4buSIDI3DQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdyb3VwX2J5KGN1dCxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbikpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsNCiAgICBmYWNldF93cmFwKH5jb2xvcikgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBj4bqvdCB2w6AgbcOgdSBz4bqvYyBzYXUgxJHDsyB0w61uaCBz4buRIGzGsOG7o25nLiB0YSBn4bqvbiB4IGzDoCBsb+G6oWksIHkgbGEgc+G7kSBsxrDhu6NuZyB2w6AgdGEgY2hpYSB0aMOgbmggNyBiaeG7g3UgxJHhu5MgdGhlbyA3IGxv4bqhaSBtw6B1IHPhuq9jIMSR4buDIHNvIHPDoW5oLiBRdWEgNyBiaeG7g3UgxJHhu5MgdGEgbmjhuq1uIHjDqXQgY8OhYyBtw6B1IHPhuq9jIHBow6JuIGLhu5Ugbmhp4buBdSBuaOG6pXQg4bufIGtpbSBjxrDGoW5nIGPDsyBraeG7g3UgY+G6r3QgSWRlYWwsIGdp4bqjbSBk4bqnbiBxdWEgY8OhYyBraeG7g3UgY+G6r3QgUHJlbWl1bSwgVmVyeSBHb29kLCBHb29kIHbDoCBwaMOibiBi4buVIMOtdCBuaOG6pXQg4bufIGtp4buDdSBj4bqvdCBGYWlyICoqKg0KDQojIEJJ4buCVSDEkOG7kiAyOA0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQoNCnQgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKGRlcHRoKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbSkpICsNCiAgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDIpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsNCiAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyB2w6AgdMOtbmggdHJ1bmcgYsOsbmggdOG7tyBs4buHIMSR4buZIHPDonUgY+G7p2EgdOG7q25nIGxv4bqhaS4gQ8OhYyBj4buZdCBiaeG7g3UgxJHhu5MgY8OzIG3DoHUgeGFuaCBsw6EgY8OieSwgY8OhYyBk4buvIGxp4buHdSBjw7MgbcOgdSDEkeG7jywgxJHGsOG7o2MgbMOgbSB0csOybiDEkeG6v24gMiBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgMiDEkcahbiB24buLLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBjw6FjIGxv4bqhaSBtw6B1IGPhu6dhIGtpbSBjxrDGoW5nIHPhur0gY8OzIHjhuqVwIHjhu4kgdHJ1bmcgYsOsbmggdOG7tyBs4buHIMSR4buZIHPDonUgYuG6sW5nIG5oYXUuIFRyb25nIMSRw7MgY2FvIG5o4bqldCBsw6AgbcOgdSBKIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBtw6B1IEUuKioqDQoNCiMgQknhu4JVIMSQ4buSIDI5DQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdncGxvdChhZXMoeCA9IGNsYXJpdHkpKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKHggPSAnQ+G6pXAgxJHhu5kgdGluaCBraGnhur90JywgeSA9ICdT4buRIGzGsOG7o25nJykgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gJ0PhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyAoYmnhu4N1IMSR4buTIG5nYW5nKScpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdHJvbmcgc3Xhu5F0LiB0YSBn4bqvbiB4IGzDoCBj4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QsIHkgbMOgIHPhu5EgbMaw4bujbmcgVsOgIMSRw6J5IGzDoCBiaeG7g3UgxJHhu5MgbmdhbmcuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IFNJMSBjw7MgxJHhu5kgdGluaCBraGnhur90IGNhbyBuaOG6pXQsIGdp4bqjbSBk4bqnbiB04burIFZTMiwgU0kyLCBWUzEsIFZWUzIsIElGIHbDoCBJMSBsw6Aga2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCB0aOG6pXAgbmjhuqV0KioqDQoNCiMgQknhu4JVIMSQ4buSIDMwDQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdyb3VwX2J5KGN1dCkgJT4lIHN1bW1hcmlzZShtPSBtZWFuKGRlcHRoKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDIpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpICsNCiAgbGFicyh4ID0gJ0tp4buDdSBj4bqvdCcsIHkgPSAnTWVhbicpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8ga2nhu4N1IGPhuq90IHbDoCB0w61uaCB0cnVuZyBiw6xuaCB04bu3IGzhu4cgxJHhu5kgc8OidSAodHJ1bmcgYsOsbmggei94KS4gdGEgZ+G6r24geCBsw6Aga2nhu4N1IGPhuq90LCB5IGzDoCB0cnVuZyBiw6xuaC4gY8OhYyBz4buRIGxp4buHdSDEkcaw4bujYyBsw6BtIHRyw7JuIDIgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4sIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCDhu58gduG7iyB0csOtIGPDoWNoIGPhu5l0IGThu41jIDIgxJHGoW4gduG7iyB2w6AgY8OzIG3DoHUgeGFuaCBsw6EgY8OieS4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkga2nhu4N1IGPhuq90IEZhaXIgY8OzIMSR4buZIHPDonUgdHJ1bmcgYsOsbmggbOG7m24gbmjhuqV0LCBnaeG6o20gZOG6p24gdOG7qyBHb29kLCBWZXJ5IEdvb2QsIElkZWFsIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBQcmVtaXVtKioqDQoNCg0KKioqQ+G6o20gxqFuIHRo4bqneSDEkcOjIMSR4buNYywgY2jDumMgdGjhuqd5IDEgbmfDoHkgbMOgbSB2aeG7h2MgdnVpIHbhursqKio=