2. Phân tích bộ dữ liệu
2.1 Biểu đồ 1 - Biểu đồ thể hiện % tỷ lệ hãng điện
thoại
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(dplyr)
library(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
Câu lệnh trên tạo ra một biểu đồ cột thể hiện tỷ lệ phần trăm của các
hãng điện thoại. Dựa trên dữ liệu đầu vào d, biểu đồ sẽ có
trục x là “Hãng điện thoại” và trục y là “Số lượng”.
Các bước để tạo biểu đồ và phân tích kết quả như sau:
- Dữ liệu được nhóm theo “Brands”, tức là các hãng điện thoại được
nhóm lại.
- Với mỗi nhóm, số lượng phần tử trong nhóm được tính toán bằng hàm
n().
- Biểu đồ cột được tạo ra bằng
geom_col, mỗi cột biểu thị
số lượng phần tử của từng nhóm. Màu sắc cột được đặt là màu xanh lá
cây.
- Tiêu đề của biểu đồ được đặt là “Biểu đồ thể hiện % tỷ lệ hãng điện
thoại”.
- Giao diện của biểu đồ được thiết lập thành giao diện classic bằng
theme_classic().
- Với mỗi cột, một nhãn số được thêm vào biểu đồ bằng
geom_text. Nhãn số này là phần trăm của số lượng phần tử
trong nhóm so với tổng số phần tử của toàn bộ dữ liệu. Màu sắc của nhãn
số được đặt là màu đỏ.
- Nhãn cho trục x được đặt là “Hãng điện thoại” và nhãn cho trục y
được đặt là “Số lượng”.
Kết quả là một biểu đồ cột thể hiện số lượng phần tử và phần trăm của
các hãng điện thoại. Nhãn số trên mỗi cột cho biết tỷ lệ phần trăm của
số lượng phần tử trong hãng điện thoại đó so với tổng số phần tử của
toàn bộ dữ liệu. Màu sắc xanh lá cây của các cột tạo nên sự tương phản
và thu hút sự chú ý của người đọc, trong khi nhãn số màu đỏ giúp nhấn
mạnh giá trị phần trăm.
library(scales)
s %>% group_by(Brands) %>% summarise(n = n()) %>%
ggplot(aes(Brands,n)) +
geom_col(fill='green') +
labs(title = "Biểu đồ thể hiện % tỷ lệ hãng điện thoại") +
theme_classic() +
geom_text(aes(label = percent(n/length(s$Brands))),vjust = 1, color = 'red') +
labs(x = 'Hãng điện thoại', y = 'Số lượng')

2.2 Biểu đồ 2 - Biểu đồ thể hiện nhóm theo sự hài lòng khách
hàng
- Ta tiến hành phân chia biến Rating thành 5 phần: Không hài lòng, Tạm
chấp nhận, Bình thường, Hài lòng, Rất hài lòng.
table(cut(s$Rating,5))
##
## (2.3,2.84] (2.84,3.38] (3.38,3.92] (3.92,4.46] (4.46,5]
## 7 19 371 1992 581
Dựa vào biểu đồ thể hiện nhóm theo sự hài lòng của khách hàng, chúng
ta có thể phân tích kết quả như sau:
Phân bố sự hài lòng: Biểu đồ cho thấy phân bố sự hài lòng của
khách hàng được chia thành 5 nhóm: “không hài lòng”, “Tạm chấp nhận”,
“Bình thường”, “Hài lòng” và “Rất hài lòng”. Mỗi nhóm được biểu diễn
bằng một cột trên biểu đồ. Ngoài ra còn cột “NA” là cột “Không có ý
kiến”.
Số lượng khách hàng trong mỗi nhóm: Chiều cao của các cột thể
hiện số lượng khách hàng trong mỗi nhóm sự hài lòng. Nhìn vào biểu đồ,
chúng ta có thể so sánh số lượng khách hàng giữa các nhóm và nhận ra
nhóm có số lượng khách hàng cao nhất là nhóm “Hài lòng”.
Nhận xét về sự hài lòng: Dựa vào biểu đồ, chúng ta có thể đưa ra
nhận xét về mức độ sự hài lòng của khách hàng. Nhóm “Hài lòng” có số
lượng khách hàng nhiều nhất, chúng ta có thể kết luận rằng hầu hết khách
hàng đánh giá sản phẩm hoặc dịch vụ khá cao. Ngoài ra, nhóm “không hài
lòng” chiếm tỷ lệ thấp nhất, điều này có thể cho thấy sản phẩm hoặc dịch
vụ đáp ứng được sự hài lòng của khách hàng.
s <- s
s1 <- s %>% mutate(HL = cut(Rating,5, label = c('không hài lòng', 'Tạm chấp nhận','Bình thường','Hài lòng','Rất hài lòng')))
s1 %>% group_by(HL) %>% summarise(n = n()) %>%
ggplot(aes(HL,n)) +
geom_col(fill='blue') +
labs(title = " Biểu đồ thể hiện nhóm theo sự hài lòng khách hàng") +
geom_text(aes(label = n),vjust = 0, color = 'black') +
labs(x = 'Sự hài lòng', y = 'Số lượng')

2.3 Biểu đồ 3 - Biểu đồ thể hiện số lượng điện thoại được
chiết khấu
Câu lệnh trên thêm một cột mới vào dữ liệu d được gọi là “group” dựa
trên giá trị của cột “Discount”. Nếu giá trị trong cột “Discount” lớn
hơn 0, thì giá trị trong cột “group” sẽ là “Có chiết khấu”, ngược lại,
giá trị trong cột “group” sẽ là “Không chiết khấu”.
Sau đó, câu lệnh table(d$group) được sử dụng để tạo một bảng tần số,
hiển thị số lượng quan sát trong mỗi nhóm của cột “group”.
Kết quả là một bảng tần số, trong đó các nhóm “Có chiết khấu” và
“Không chiết khấu” được hiển thị và số lượng quan sát trong mỗi nhóm
được đếm lần lượt là 1193 và 1921.
s$group <- ifelse(s$Discount > 0, "Có chiết khấu", "Không chiết khấu")
table(s$group)
##
## Có chiết khấu Không chiết khấu
## 1193 1921
Dựa vào biểu đồ thể hiện nhóm theo chiết khấu, chúng ta có thể phân
tích kết quả như sau:
Phân bố chiết khấu: Biểu đồ cho thấy phân bố các nhóm dựa trên
chiết khấu của sản phẩm. Các nhóm được chia thành “Có chiết khấu” và
“Không chiết khấu”. Mỗi nhóm được biểu diễn bằng một cột trên biểu
đồ.
Số lượng sản phẩm trong mỗi nhóm: Nhóm “Không chiết khấu” có số
lượng 1921 nhiều hơn nhóm “Có chiết khấu” là 1193.
Nhận xét về chiết khấu: Dựa vào biểu đồ, chúng ta có thể đưa ra
nhận xét về mức độ chiết khấu của sản phẩm. Ta thấy nhóm “Không chiết
khấu” chiếm tỷ lệ cao, điều này có thể cho thấy chiết khấu không phổ
biến hoặc không ảnh hưởng đáng kể đến số lượng sản phẩm.
s %>% group_by(group) %>% summarise(n = n()) %>%
ggplot(aes(group,n)) +
geom_col(fill='gray') +
geom_text(aes(label = n),vjust = 2, color = 'red') +
labs(title = " Biểu đồ thể hiện nhóm theo chiết khấu ",x = 'Độ sâu', y = 'Số lượng')

2.4 Biểu đồ 4 - Biểu đồ thể hiện giá bán của các loại điện
thoại
Biểu đồ thể hiện giá bán của điện thoại dựa trên dữ liệu từ tập dữ
liệu. Dưới đây là phân tích kết quả của biểu đồ:
Phân bố giá bán: Biểu đồ histogram cho thấy phân bố giá bán của
điện thoại. Trục x trên biểu đồ biểu diễn giá bán của điện thoại, trong
khi trục y biểu diễn số lượng điện thoại. Mỗi cột trên biểu đồ đại diện
cho một khoảng giá bán, và chiều cao của cột thể hiện số lượng điện
thoại trong khoảng đó.
Binwidth: Thông qua đoạn mã geom_histogram(binwidth = 5000),
binwidth được thiết lập là 5000. Điều này có nghĩa là giá bán của điện
thoại được chia thành các khoảng có độ rộng 5000. Số lượng cột trên biểu
đồ sẽ phụ thuộc vào khoảng giá và binwidth này.
Màu sắc: Các cột trên biểu đồ được tô màu xanh lam (fill =
‘blue’) và có viền màu đỏ (color = ‘red’), tạo nên sự tương phản trực
quan.
Tiêu đề và nhãn trục: Biểu đồ có tiêu đề “Biểu đồ thể hiện giá
bán của điện thoại”, trục x được ghi là “Giá bán” và trục y được ghi là
“Số lượng”.
Biểu đồ này giúp chúng ta nhìn thấy phân phối giá bán của điện thoại
và tập trung giá trong các khoảng giá cụ thể. Chúng ta có thể sử dụng
biểu đồ này để hiểu thị trường và cung cầu của điện thoại, nhận biết các
khoảng giá phổ biến và đánh giá tập trung giá trong các khoảng đó.
s %>% ggplot(aes(x = Selling.Price)) +
geom_histogram(binwidth = 5000, fill = 'blue', color = 'red') +
labs(title = " Biểu đồ thể hiện giá bán của điện thoại ",x = 'Giá bán', y = 'Số lượng')

2.5 Biểu đồ 5 - Biểu đồ thể hiện mật đồ giá bán của điện
thoại
Dưới đây là phân tích kết quả của biểu đồ:
Mật độ giá bán: Biểu đồ mật độ (density plot) thể hiện mật độ
phân bố của giá bán điện thoại. Trục x biểu diễn giá bán, trong khi trục
y biểu diễn mật độ, hay tỷ lệ giữa số lượng điện thoại và diện tích dưới
đường cong.
Màu sắc: Đường cong mật độ được tô màu hồng (“fill = ‘pink’”),
tạo nên sự tương phản trực quan.
Tiêu đề và nhãn trục: Biểu đồ có tiêu đề “Biểu đồ thể hiện mật độ
giá bán của điện thoại”, trục x được ghi là “Giá bán” và trục y được ghi
là “Mật độ”.
Biểu đồ mật độ giúp chúng ta nhìn thấy sự phân bố mật độ của giá bán
điện thoại. Đường cong mật độ càng cao tại một giá trị cụ thể, càng cho
thấy mật độ lớn hơn của giá bán ở đó. Điều này giúp chúng ta hiểu rõ hơn
về mức độ tập trung và biểu diễn phân phối giá bán của điện thoại trong
tập dữ liệu.
Lưu ý rằng để phân tích kết quả chi tiết hơn, cần xem xét thông tin
cụ thể về dữ liệu và ngữ cảnh của nghiên cứu.
s %>% ggplot(aes(x = Selling.Price)) +
geom_density(fill = 'pink') +
labs(title = " Biểu đồ thể hiện mật độ giá bán của điện thoại ",x = 'Giá bán', y = 'Mật độ')

2.6 Biểu đồ 6 - Biểu đồ thể hiện tỷ lệ có camera của điện
thoại
Tạo ra một biểu đồ cột (bar chart) thể hiện số lượng điện thoại có
Camera dựa trên dữ liệu từ tập dữ liệu d. Dưới đây là phân
tích kết quả của biểu đồ:
Nhóm và tổng hợp dữ liệu: Đầu tiên, dữ liệu được nhóm theo biến
Camera bằng cách sử dụng group_by(Camera) và sau đó đếm số lượng điện
thoại trong mỗi nhóm bằng cách sử dụng summarise(n = n()). Kết quả là
một bảng dữ liệu với hai cột: Camera (biến nhóm) và n (số lượng điện
thoại có Camera).
Biểu đồ cột: Dữ liệu sau khi được tổng hợp được sử dụng để tạo
biểu đồ cột. Trục x trên biểu đồ biểu diễn các giá trị trong biến
Camera, trong khi trục y biểu diễn số lượng điện thoại
tương ứng. Mỗi cột trên biểu đồ đại diện cho một giá trị trong biến
Camera, và chiều cao của cột thể hiện số lượng điện
thoại.
Màu sắc: Các cột trên biểu đồ được tô màu đen
(fill='black'), tạo nên sự tương phản trực quan.
Chú thích số lượng: Số lượng điện thoại được hiển thị trên mỗi
cột sử dụng geom_text và được đặt nhãn
(label = n). Chú thích này có màu đỏ
(color = 'red') và được đặt vị trí dọc
(vjust = 2) để nằm trên cột tương ứng.
Tiêu đề và nhãn trục: Biểu đồ có tiêu đề “Biểu đồ thể hiện số
lượng điện thoại có Camera”, trục x được ghi là “Điện thoại có Camera”
và trục y được ghi là “Số lượng”.
Biểu đồ này giúp chúng ta nhìn thấy số lượng điện thoại có Camera
trong tập dữ liệu là 3114 và nó chiếm 100% số lượng điện thoại. Vậy có
lượng điện thoại không có camera là 0. Suy ra, hiện nay có thể nói đa số
điện thoại được sản xuất ra đều có Camera.
s %>% group_by(Camera) %>% summarise(n = n()) %>%
ggplot(aes(Camera,n)) +
geom_col(fill='black') +
geom_text(aes(label = n),vjust = 2, color = 'red') +
labs(title = " Biểu đồ thể hiện Số lượng điện thoại có Camera ",x = 'Điện thoại có Camera', y = 'Số lượng')

2.7 Biểu đồ 7 - Biểu đồ thể hiện mật độ chiết khấu của điện
thoại dựa trên giá gốc
Chúng ta có một biểu đồ mật độ (density plot) mới dựa trên giá gốc
(Original.Price) của dữ liệu. Biểu đồ này cũng được phân chia thành các
nhóm sử dụng facet_wrap(~group). Dưới đây là phân tích kết
quả của biểu đồ:
Mật độ giá gốc: Biểu đồ mật độ thể hiện mật độ phân bố của giá
gốc của điện thoại. Trục x biểu diễn giá gốc, trong khi trục y biểu diễn
mật độ, hay tỷ lệ giữa số lượng điện thoại và diện tích dưới đường
cong.
Màu sắc: Đường cong mật độ được tô màu xanh lá cây (“fill =
‘green’”), tạo nên sự tương phản trực quan.
Phân nhóm: Biểu đồ được phân chia thành các nhóm bằng
facet_wrap(~group). Mỗi nhóm có thể hiển thị trên một panel
riêng biệt, giúp so sánh mật độ giá gốc giữa hai nhóm “Có chiết khấu” và
“Không chiết khấu”.
Biểu đồ mật độ giúp chúng ta nhìn thấy sự phân bố mật độ của giá gốc
trong từng nhóm khác nhau của dữ liệu. Điều này giúp chúng ta so sánh
mật độ giá gốc giữa hai nhóm “Có chiết khấu” và “Không chiết khấu” là
tương đương nhau.
s %>% ggplot(aes(x = Original.Price)) +
geom_density(fill = 'green') +
facet_wrap(~group) +
labs(title = "Biểu đồ thể hiện mật độ chiết khấu của điện thoại dựa trên giá gốc")

2.8 Biểu đồ 8 - Biểu đồ cột (bar chart) thể hiện số lượng
điện thoại theo từng nhãn hiệu (Brands)
Biểu đồ cột (bar chart) thể hiện số lượng điện thoại theo từng nhãn
hiệu (Brands) dựa trên dữ liệu từ tập dữ liệu d. Dưới đây
là phân tích kết quả của biểu đồ:
Nhóm và tổng hợp dữ liệu: Đầu tiên, dữ liệu được nhóm theo biến
Brands bằng cách sử dụng group_by(Brands) và
sau đó đếm số lượng điện thoại trong mỗi nhóm bằng cách sử dụng
summarise(n = n()). Kết quả là một bảng dữ liệu với hai
cột: Brands (nhãn hiệu) và n (số lượng điện
thoại của từng nhãn hiệu).
Biểu đồ cột: Dữ liệu sau khi được tổng hợp được sử dụng để tạo
biểu đồ cột. Trục x trên biểu đồ biểu diễn các giá trị trong biến
Brands, trong khi trục y biểu diễn số lượng điện thoại
tương ứng. Mỗi cột trên biểu đồ đại diện cho một nhãn hiệu, và chiều cao
của cột thể hiện số lượng điện thoại.
Chú thích số lượng: Số lượng điện thoại được hiển thị trên mỗi
cột sử dụng geom_text và được đặt nhãn
(label = n). Vị trí của chú thích được đặt bằng
position_stack(vjust = 1), giúp chú thích nằm trên cột
tương ứng.
s %>% group_by(Brands) %>% summarise(n = n()) %>%
ggplot(aes(Brands,n)) +
geom_col() +
geom_text(aes(label = n),position = position_stack(vjust = 1)) +
labs(title = "Biểu đồ thể hiện số lượng của điện thoại dựa trên thương hiệu")

Phân phối nhãn hiệu: Biểu đồ cột cho thấy phân phối số lượng điện
thoại theo từng nhãn hiệu có sự chênh lệch rõ ràng.
So sánh giữa các nhãn hiệu: Biểu đồ cột giúp chúng ta so sánh số
lượng điện thoại giữa các nhãn hiệu. Chúng ta có thể xác định được nhãn
hiệu nổi bật với số lượng điện thoại cao hơn so với những nhãn hiệu khác
là thương hiệu SAMSUNG với số lượng 719, thấp nhất là thương hiệu IQOO
với số lượng là 5.
2.9 Biểu đồ 9 - Biểu đồ histogram thể hiện phân phối giá gốc
(Original.Price) của điện thoại từ hai nhãn hiệu ‘Apple’ và
‘SAMSUNG’
Biểu đồ histogram thể hiện phân phối giá gốc (Original.Price) của
điện thoại từ hai nhãn hiệu ‘Apple’ và ‘SAMSUNG’ trong tập dữ liệu
d. Dưới đây là phân tích kết quả của biểu đồ:
Xác định biến và dữ liệu: Biến x trên trục x của
biểu đồ được xác định là giá gốc (Original.Price). Dữ liệu được sử dụng
để tạo biểu đồ là tập dữ liệu d.
Biểu đồ histogram: Để hiển thị phân phối giá gốc của điện thoại
từ nhãn hiệu ‘Apple’, bạn sử dụng geom_histogram và lọc dữ
liệu bằng filter(Brands == 'Apple'). Kết quả là một
histogram với các cột biểu thị tần suất của các khoảng giá gốc. Tương
tự, bạn tạo một histogram khác cho nhãn hiệu ‘SAMSUNG’.
Cấu hình binwidth và màu sắc: Thông qua đối số
binwidth = 2000, bạn chỉ định rằng mỗi khoảng trên biểu đồ
histogram có chiều rộng là 2000. Điều này ảnh hưởng đến số lượng và kích
thước của các cột trên biểu đồ. Bạn sử dụng fill để thiết
lập màu sắc của các cột, ví dụ: ‘red’ cho ‘Apple’ và ‘lightgreen’ cho
‘SAMSUNG’.
s %>% ggplot(aes(x = Original.Price)) +
geom_histogram(data = s %>% filter(Brands == 'Apple'), binwidth = 2000, fill = 'red') +
geom_histogram(data = s %>% filter(Brands == 'SAMSUNG'), binwidth = 2000, fill = 'lightgreen') +
labs(title = "Biểu đồ histogram thể hiện phân phối giá gốc của điện thoại")

2.10 Biểu đồ 10 - Biểu đồ cột đồng tâm thể hiện số lượng
điện thoại từng nhãn hiệu từ bộ dữ liệu
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ cột đồng tâm thể hiện số lượng
điện thoại từng nhãn hiệu từ bộ dữ liệu “Smartphones Sales” trong R
Markdown. Dưới đây là phân tích kết quả của câu lệnh:
- Nhóm dữ liệu: Câu lệnh sử dụng hàm
group_by() để nhóm
dữ liệu theo nhãn hiệu (Brands).
- Tính tổng số lượng: Hàm
summarise() được sử dụng để
tính số lượng (n) cho mỗi nhãn hiệu.
- Vẽ biểu đồ cột đồng tâm: Hàm
ggplot() được sử dụng để
tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ
định giá trị x (rỗng) và giá trị y (số lượng) của từng nhãn hiệu, và sử
dụng màu sắc khác nhau cho từng nhãn hiệu
(fill = Brands).
- Hàm
geom_col() được sử dụng để vẽ các cột.
- Hàm
coord_polar('y') được sử dụng để chuyển đổi biểu đồ
sang dạng đồng tâm.
- Hàm
geom_text() được sử dụng để thêm chú thích số liệu
lên các cột. Thông qua tham số label = n, chú thích sẽ hiển
thị giá trị số lượng (n), và thông qua tham số
position_stack(vjust = .5), chú thích được căn chỉnh theo
chiều dọc.
- Hàm
theme_void() được sử dụng để loại bỏ nền và các
thành phần trang trí khác của biểu đồ.
Kết quả là một biểu đồ cột đồng tâm, trong đó mỗi cột biểu thị số
lượng điện thoại từng nhãn hiệu. Các cột được sắp xếp xung quanh một
trục tròn và có thể so sánh sự khác biệt về số lượng giữa các nhãn
hiệu.
s %>% group_by(Brands) %>% summarise(n = n()) %>%
ggplot(aes(x ='', y = n,fill = Brands)) +
geom_col(color = 'black') +
coord_polar('y') +
geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = .5)) +
theme_void()

Số lượng điện thoại theo nhãn hiệu: Chúng ta có thể xác định được
nhãn hiệu nổi bật với số lượng điện thoại cao hơn so với những nhãn hiệu
khác là thương hiệu SAMSUNG với số lượng 719, thấp nhất là thương hiệu
IQOO với số lượng là 5.
2.11 Biểu đồ 11 - Biểu đồ cột đồng tâm thể hiện số lượng
điện thoại SAMSUNG theo chiết khấu
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ cột đồng tâm thể hiện số lượng
điện thoại Samsung theo từng nhóm từ bộ dữ liệu “Smartphones Sales”
trong R Markdown. Sau đây là phân tích kết quả của câu lệnh:
- Lọc dữ liệu: Câu lệnh
filter(Brands == 'SAMSUNG') sử
dụng hàm filter() để chỉ lấy dữ liệu của điện thoại Samsung
(Brands == 'SAMSUNG'), và gán kết quả cho biến
s2.
- Nhóm dữ liệu: Câu lệnh
group_by(group) sử dụng hàm
group_by() để nhóm dữ liệu theo nhóm
(group).
- Tính tổng số lượng: Hàm
summarise() được sử dụng để
tính số lượng (n) cho mỗi nhóm.
- Vẽ biểu đồ cột đồng tâm: Hàm
ggplot() được sử dụng để
tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ
định giá trị x (rỗng) và giá trị y (số lượng) của từng nhóm, và sử dụng
màu sắc khác nhau cho từng nhóm (fill = group).
- Hàm
geom_col() được sử dụng để vẽ các cột. Tham số
width = 1 được sử dụng để đặt chiều rộng của các cột.
- Hàm
coord_polar('y') được sử dụng để chuyển đổi biểu đồ
sang dạng đồng tâm.
- Hàm
geom_text() được sử dụng để thêm chú thích số liệu
lên các cột. Thông qua tham số label = n, chú thích sẽ hiển
thị giá trị số lượng (n), và thông qua tham số
position_stack(vjust = .5), chú thích được căn chỉnh theo
chiều dọc.
- Hàm
theme_void() được sử dụng để loại bỏ nền và các
thành phần trang trí khác của biểu đồ.
Kết quả là một biểu đồ cột đồng tâm, trong đó mỗi cột biểu thị số
lượng điện thoại Samsung theo từng nhóm. Các cột được sắp xếp xung quanh
một trục tròn và có thể so sánh sự khác biệt về số lượng giữa các
nhóm.
s2 <- s %>% filter(Brands == 'SAMSUNG' )
s2 %>% group_by(group) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = group)) +
geom_col(color = 'black', width = 1) +
coord_polar('y') +
geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = .5)) +
theme_void()

2.12 Biểu đồ 12 - Biểu đồ điểm thể hiện mối quan hệ giữa giá
bán khách hàng và giá niêm yết
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ điểm thể hiện mối quan hệ giữa
giá bán khách hàng và giá niêm yết của điện thoại từ bộ dữ liệu
“Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của
câu lệnh:
- Vẽ biểu đồ điểm: Hàm
ggplot() được sử dụng để tạo một
khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định
giá trị x (giá bán khách hàng) và giá trị y (giá niêm yết) của từng
điểm.
- Hàm
geom_point() được sử dụng để vẽ các điểm trên biểu
đồ, biểu thị mỗi điểm dữ liệu.
- Hàm
xlab() và ylab() được sử dụng để đặt
nhãn cho trục x và trục y tương ứng, giúp diễn giải ý nghĩa của các
trục.
Kết quả là một biểu đồ điểm, trong đó mỗi điểm biểu thị mối quan hệ
giữa giá bán khách hàng (trục x) và giá niêm yết (trục y) của từng điện
thoại. Biểu đồ này giúp hiển thị phân phối và mối liên hệ giữa hai biến
giá trị.
s %>% ggplot(aes(x = Selling.Price, y = Original.Price)) +
geom_point() +
xlab('Giá bán khách hàng') +
ylab('Giá niêm yết')

2.13 Biểu đồ 13 - Biểu đồ điểm thể hiện mối quan hệ giữa khả
năng lưu trữ thông thường và khả năng lưu trữ nội bộ của điện
thoại
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ điểm thể hiện mối quan hệ giữa
khả năng lưu trữ thông thường và khả năng lưu trữ nội bộ của điện thoại
từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân
tích kết quả của câu lệnh:
- Vẽ biểu đồ điểm: Hàm
ggplot() được sử dụng để tạo một
khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định
giá trị x (khả năng lưu trữ thông thường) và giá trị y (khả năng lưu trữ
nội bộ) của từng điểm.
- Hàm
geom_point() được sử dụng để vẽ các điểm trên biểu
đồ, biểu thị mỗi điểm dữ liệu. Tham số color = 'lightblue'
được sử dụng để đặt màu sắc của các điểm là màu xanh nhạt.
- Hàm
geom_smooth() được sử dụng để vẽ đường hồi quy
tuyến tính dựa trên dữ liệu. Tham số method = 'lm' chỉ định
sử dụng phương pháp hồi quy tuyến tính, và color = 'green'
đặt màu sắc của đường hồi quy là màu xanh lá cây.
- Hàm
xlab() và ylab() được sử dụng để đặt
nhãn cho trục x và trục y tương ứng, giúp diễn giải ý nghĩa của các
trục.
Kết quả là một biểu đồ điểm, trong đó mỗi điểm biểu thị mối quan hệ
giữa khả năng lưu trữ thông thường (trục x) và khả năng lưu trữ nội bộ
(trục y) của từng điện thoại. Các điểm được hiển thị với màu sắc xanh
nhạt, và đường hồi quy tuyến tính được vẽ để biểu thị xu hướng tổng quát
của dữ liệu. Biểu đồ này giúp phân tích mối liên hệ giữa hai biến khả
năng lưu trữ và xác định xu hướng chung.
s %>% ggplot(aes(x = Memory, y = Storage)) +
geom_point(color ='lightblue') +
geom_smooth(method = 'lm', color = 'green') +
xlab('Khả năng lưu trữ thông thường') +
ylab('Khả năng lưu trữ nội bộ')
## `geom_smooth()` using formula = 'y ~ x'

2.14 Biểu đồ 14 - Biểu đồ histogram thể hiện phân bố giá bán
khách hàng của điện thoại theo khả năng lưu trữ
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ histogram thể hiện phân bố giá
bán khách hàng của điện thoại theo khả năng lưu trữ từ bộ dữ liệu
“Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của
câu lệnh:
- Vẽ biểu đồ histogram: Hàm
ggplot() được sử dụng để tạo
một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ
định giá trị x (giá bán khách hàng) và sử dụng màu sắc khác nhau cho
từng khoảng giá dựa trên khả năng lưu trữ
(fill = Memory).
- Hàm
geom_histogram() được sử dụng để vẽ histogram. Tham
số binwidth = 6000 xác định độ rộng của các khoảng giá,
trong trường hợp này là 6000.
Kết quả là một biểu đồ histogram, trong đó trục x biểu thị giá bán
khách hàng và trục y biểu thị số lượng điện thoại trong từng khoảng giá.
Các khoảng giá có màu sắc khác nhau dựa trên khả năng lưu trữ của điện
thoại. Biểu đồ này giúp phân tích phân phối giá bán khách hàng và mối
liên hệ với khả năng lưu trữ.
s %>% ggplot(aes(x = Selling.Price, fill = Memory)) +
geom_histogram(binwidth = 6000)

2.15 Biểu đồ 15 - Biểu đồ mật độ (density plot) thể hiện
phân phối giá bán của các điện thoại từ hai thương hiệu SAMSUNG và
OPPO
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ mật độ (density plot) thể hiện
phân phối giá bán của các điện thoại từ hai thương hiệu SAMSUNG và OPPO
từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân
tích kết quả của câu lệnh:
- Lọc dữ liệu: Hàm
filter() được sử dụng để lọc các dòng
dữ liệu chỉ từ thương hiệu SAMSUNG hoặc OPPO
(Brands == 'SAMSUNG' | Brands == 'OPPO').
- Vẽ biểu đồ mật độ: Hàm
ggplot() được sử dụng để tạo một
khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định
giá trị x (giá bán) và sử dụng màu sắc khác nhau cho từng thương hiệu
(fill = Brands).
- Hàm
geom_density() được sử dụng để vẽ biểu đồ mật độ
dựa trên dữ liệu. Biểu đồ mật độ thể hiện phân phối xác suất của giá bán
cho từng thương hiệu.
- Hàm
labs() được sử dụng để đặt tiêu đề cho biểu đồ
(title = "Biểu đồ thể hiện giá bán của SAMSUNG và OPPO") và
nhãn cho trục x và trục y
(x = 'Giá bán', y = 'Tỷ trọng').
Kết quả là một biểu đồ mật độ, trong đó trục x biểu thị giá bán và
trục y biểu thị tỷ trọng (xác suất) của giá bán. Các đường mật độ khác
nhau tương ứng với hai thương hiệu SAMSUNG và OPPO. Biểu đồ này giúp so
sánh phân phối giá bán giữa hai thương hiệu và phân tích sự khác biệt
trong giá cả.
s %>% filter(Brands== 'SAMSUNG' | Brands== 'OPPO') %>%
ggplot(aes(x=Selling.Price, fill = Brands)) +
geom_density() +
labs(title = "Biểu đồ thể hiện giá bán của SAMSUNG và OPPO") +
labs(x = 'Giá bán', y = 'Tỷ trọng')

2.16 Biểu đồ 16 - Biểu đồ tần số (frequency plot) thể hiện
số lần xuất hiện của các mức giá gốc của các điện thoại từ hai thương
hiệu Apple và OPPO
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ tần số (frequency plot) thể hiện
số lần xuất hiện của các mức giá gốc của các điện thoại từ hai thương
hiệu Apple và OPPO từ bộ dữ liệu “Smartphones Sales” trong R Markdown.
Dưới đây là phân tích kết quả của câu lệnh:
Lọc dữ liệu: Hàm filter() được sử dụng để lọc các
dòng dữ liệu chỉ từ thương hiệu Apple hoặc OPPO
(Brands == 'Apple' | Brands == 'OPPO').
Vẽ biểu đồ tần số: Hàm ggplot() được sử dụng để tạo
một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ
định giá trị x (giá gốc) và sử dụng màu sắc khác nhau cho từng thương
hiệu (color = Brands).
Hàm geom_freqpoly() được sử dụng để vẽ đường tần số
dựa trên dữ liệu. Đường tần số thể hiện số lần xuất hiện của từng mức
giá gốc.
Hàm `labs()` được sử dụng để đặt tiêu đề cho biểu đồ (`title =
“Biểu đồ tần số giá gốc của Apple và OPPO”`) và nhãn cho trục x và trục
y (`x = ‘Giá gốc’, y = ‘Tần số xuất hiện’`).
Kết quả là một biểu đồ tần số, trong đó trục x biểu thị giá gốc và trục y biểu thị số lần xuất hiện của mỗi mức giá. Các đường tần số khác nhau tương ứng với hai thương hiệu Apple và OPPO. Biểu đồ này giúp phân tích phân phối giá gốc của các điện thoại từ hai thương hiệu và so sánh tần số xuất hiện giữa chúng.
s %>% filter(Brands== 'Apple' | Brands== 'OPPO') %>%
ggplot(aes(x=Original.Price, color=Brands)) +
geom_freqpoly(linewidth = 1) +
labs(title = "Biểu đồ tần số giá gốc của Apple và OPPO") +
labs(x = 'Giá gốc', y = 'Tần số xuất hiện')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

2.17 Biểu đồ 17 - Biểu đồ cột (column chart) thể hiện số
lượng điện thoại của hai thương hiệu vivo và realme
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ cột (column chart) thể hiện số
lượng điện thoại của hai thương hiệu vivo và realme từ bộ dữ liệu
“Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của
câu lệnh:
- Vẽ biểu đồ cột: Hàm
ggplot() được sử dụng để tạo một
khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định
trục x (hãng điện thoại) và không có thông tin y
(y = '').
- Hàm
geom_col() được sử dụng để vẽ các cột thể hiện số
lượng điện thoại. Cụ thể, hai lệnh geom_col() được sử dụng,
mỗi lệnh tương ứng với một thương hiệu. Biểu đồ sử dụng dữ liệu đã được
lọc thông qua hàm filter() để chỉ hiển thị số lượng điện
thoại của vivo và realme. Tham số fill được sử dụng để định
nghĩa màu sắc cho cột của từng thương hiệu.
- Hàm
labs() được sử dụng để đặt tiêu đề cho biểu đồ
(title = "Biểu đồ thể hiện số lượng điện thoại của vivo và realme")
và nhãn cho trục x và trục y
(x = 'Hãng điện thoại', y = 'Số lượng').
Kết quả là một biểu đồ cột, trong đó trục x biểu thị các thương hiệu
điện thoại và trục y biểu thị số lượng điện thoại tương ứng. Cột màu đỏ
tương ứng với thương hiệu vivo và cột màu vàng tương ứng với thương hiệu
realme. Biểu đồ này giúp so sánh số lượng điện thoại giữa hai thương
hiệu và phân tích sự khác biệt trong số lượng.
s %>% ggplot(aes(x= Brands, y= '')) +
geom_col(data = s %>% filter(Brands == 'vivo'), fill = 'red') +
geom_col(data = s %>% filter(Brands == 'realme'), fill = 'yellow') +
labs(title = " Biểu đồ thể hiện số lượng điện thoại của vivo và realme") +
labs(x = 'Hãng điện thoại', y = 'Số lượng')

2.18 Biểu đồ 18 - Biểu đồ điểm (scatter plot) thể hiện số
lượng điện thoại của mỗi hãng với điểm số Rating lớn hơn 4
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ điểm (scatter plot) thể hiện số
lượng điện thoại của mỗi hãng với điểm số Rating lớn hơn 4 từ bộ dữ liệu
“Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của
câu lệnh:
- Lọc dữ liệu: Hàm
filter() được sử dụng để lọc các dòng
dữ liệu chỉ có Rating lớn hơn 4 (Rating > 4).
- Vẽ biểu đồ điểm: Hàm
ggplot() được sử dụng để tạo một
khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định
trục x (hãng) và trục y (Rating).
- Hàm
geom_point() được sử dụng để vẽ các điểm trên biểu
đồ, mỗi điểm tương ứng với một hãng điện thoại. Các điểm được màu đỏ
(color = 'red').
- Hàm
labs() được sử dụng để đặt tiêu đề cho biểu đồ
(title = "Biểu đồ số lượng điện thoại của hãng Rating trên 4")
và nhãn cho trục x (x = 'Hãng') và trục y
(y = 'Rating').
Kết quả là một biểu đồ điểm, trong đó trục x biểu thị các hãng điện
thoại và trục y biểu thị điểm số Rating tương ứng. Mỗi điểm trên biểu đồ
tương ứng với một hãng điện thoại và màu đỏ. Biểu đồ này giúp hiển thị
số lượng điện thoại của mỗi hãng có Rating lớn hơn 4 và phân tích mức độ
đánh giá của từng hãng.
s %>% filter(Rating>4) %>%
ggplot(aes(x=Brands, y=Rating)) +
geom_point(color = 'red') +
labs(title = "Biểu đồ số lượng điện thoại của hãng Rating trên 4") +
labs(x = 'Hãng', 'Rating')

2.19 Biểu đồ 19 - Biểu đồ tần số (frequency plot) thể hiện
số lần xuất hiện của các mức giá gốc của các điện thoại có màu đen và
trắng
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ tần số (frequency plot) thể hiện
số lần xuất hiện của các mức giá gốc của các điện thoại có màu đen và
trắng từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là
phân tích kết quả của câu lệnh:
- Lọc dữ liệu: Hàm
filter() được sử dụng để lọc các dòng
dữ liệu chỉ từ các điện thoại có màu đen hoặc trắng
(Colors == 'White' | Colors == 'Black').
- Vẽ biểu đồ tần số: Hàm
ggplot() được sử dụng để tạo một
khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định
giá trị x (giá gốc) và sử dụng màu sắc khác nhau cho từng màu
(color = Colors).
- Hàm
geom_freqpoly() được sử dụng để vẽ đường tần số dựa
trên dữ liệu. Đường tần số thể hiện số lần xuất hiện của từng mức giá
gốc.
- Hàm
labs() được sử dụng để đặt tiêu đề cho biểu đồ
(title = "Biểu đồ tần số giá gốc theo màu đen và trắng") và
nhãn cho trục x và trục y
(x = 'Giá gốc', y = 'Tần số xuất hiện').
Kết quả là một biểu đồ tần số, trong đó trục x biểu thị giá gốc và
trục y biểu thị số lần xuất hiện của mỗi mức giá. Các đường tần số khác
nhau tương ứng với hai màu đen và trắng. Biểu đồ này giúp phân tích phân
phối giá gốc của các điện thoại có màu đen và trắng và so sánh tần số
xuất hiện giữa chúng.
s %>% filter(Colors== 'White' | Colors== 'Black') %>%
ggplot(aes(x=Original.Price, color=Colors)) +
geom_freqpoly(linewidth = 1) +
labs(title = "Biểu đồ tần số giá gốc theo màu đen và trắng") +
labs(x = 'Giá gốc', y = 'Tần số xuất hiện')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

2.20 Biểu đồ 20 - Biểu đồ tần số (frequency plot) thể hiện
số lần xuất hiện của các mức đánh giá sự hài lòng của các điện thoại có
bộ nhớ RAM là 8 GB và 6 GB
Câu lệnh trên sử dụng ống dẫn (%>%) và gói
ggplot2 để vẽ một biểu đồ tần số (frequency plot) thể hiện
số lần xuất hiện của các mức đánh giá sự hài lòng của các điện thoại có
bộ nhớ RAM là 8 GB và 6 GB từ bộ dữ liệu “Smartphones Sales” trong R
Markdown. Dưới đây là phân tích kết quả của câu lệnh:
- Lọc dữ liệu: Hàm
filter() được sử dụng để lọc các dòng
dữ liệu chỉ từ các điện thoại có bộ nhớ RAM là 8 GB hoặc 6 GB
(Memory == '8 GB' | Memory == '6 GB').
- Vẽ biểu đồ tần số: Hàm
ggplot() được sử dụng để tạo một
khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định
giá trị x (đánh giá sự hài lòng) và sử dụng màu sắc khác nhau cho từng
bộ nhớ RAM (color = Memory).
- Hàm
geom_freqpoly() được sử dụng để vẽ đường tần số dựa
trên dữ liệu. Đường tần số thể hiện số lần xuất hiện của từng mức đánh
giá sự hài lòng.
- Hàm
labs() được sử dụng để đặt tiêu đề cho biểu đồ
(title = "Biểu đồ tần số giá gốc theo màu đen và trắng") và
nhãn cho trục x và trục y
(x = 'Sự hài lòng', y = 'Tần số xuất hiện').
Kết quả là một biểu đồ tần số, trong đó trục x biểu thị đánh giá sự
hài lòng và trục y biểu thị số lần xuất hiện của mỗi mức đánh giá. Các
đường tần số khác nhau tương ứng với hai bộ nhớ RAM là 8 GB và 6 GB.
Biểu đồ này giúp phân tích phân phối đánh giá sự hài lòng của các điện
thoại có bộ nhớ RAM khác nhau và so sánh tần số xuất hiện giữa
chúng.
s %>% filter(Memory== '8 GB' | Memory== '6 GB') %>%
ggplot(aes(x=Rating, color=Memory)) +
geom_freqpoly(linewidth = 1) +
labs(title = "Biểu đồ tần số giá gốc theo màu đen và trắng") +
labs(x = 'Sự hài lòng', y = 'Tần số xuất hiện')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 62 rows containing non-finite outside the scale range
## (`stat_bin()`).

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTMOibSBUw6JtIE5oxrAiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyAqKjEuIEdp4bubaSB0aGnhu4d1IHbhu4EgYuG7mSBk4buvIGxp4buHdSBTbWFydHBob25lcyBTYWxlcyoqDQoNCiMjICoqMS4xIELhu5kgZOG7ryBsaeG7h3UgU21hcnRwaG9uZXMgU2FsZXMqKg0KDQpC4buZIGThu68gbGnhu4d1IGJhbyBn4buTbSB0aMO0bmcgdGluIHbhu4EgxJFp4buHbiB0aG/huqFpIHRow7RuZyBtaW5oLCBnaGkgbOG6oWkgKmPDoWMgdGh14buZYyB0w61uaCBraMOhYyBuaGF1KiBuaMawICoqKnRoxrDGoW5nIGhp4buHdSwgbcOgdSBz4bqvYywgYuG7mSBuaOG7mywgbMawdSB0cuG7rywgxJHDoW5oIGdpw6EgY+G7p2EgbmfGsOG7nWkgZMO5bmcsIGdpw6EgYsOhbiwgZ2nDoSBn4buRYyB2w6AgY2hp4bq/dCBraOG6pXUqKiouIE7DsyBjdW5nIGPhuqVwIG3hu5l0IGPDoWkgbmjDrG4gdG/DoG4gZGnhu4duIHbhu4EgdGjhu4sgdHLGsOG7nW5nIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaCwgY2hvIHBow6lwIHBow6JuIHTDrWNoIGPDoWMgY2hp4bq/biBsxrDhu6NjIMSR4buLbmggZ2nDoSwgc+G7nyB0aMOtY2ggY+G7p2EgbmfGsOG7nWkgdGnDqnUgZMO5bmcgdsOgIHh1IGjGsOG7m25nIHRo4buLIHRyxrDhu51uZy4gVuG7m2kgdGjDtG5nIHPhu5Ega+G7uSB0aHXhuq10IGNoaSB0aeG6v3QgdsOgIGThu68gbGnhu4d1IHbhu4EgZ2nDoSBj4bqjLCBi4buZIGThu68gbGnhu4d1IG7DoHkgbMOgIG3hu5l0IG5ndeG7k24gdMOgaSBuZ3V5w6puIHF1w70gZ2nDoSBjaG8gY8OhYyBuaMOgIGLDoW4gbOG6uywgbmjDoCBz4bqjbiB4deG6pXQgdsOgIG5ow6AgcGjDom4gdMOtY2ggdMOsbSBraeG6v20gdGjDtG5nIHRpbiB24buBIGPhuqNuaCBxdWFuIGPhuqFuaCB0cmFuaCB2w6AgaMOgbmggdmkgY+G7p2EgbmfGsOG7nWkgdGnDqnUgZMO5bmcgdHJvbmcgbmfDoG5oIGPDtG5nIG5naGnhu4dwIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaC4NCg0KMS4gICoqQnJhbmRzOioqIEPDoWMgdGjGsMahbmcgaGnhu4d1IMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaCDEkcaw4bujYyBiYW8gZ+G7k20gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UuDQoyLiAgKipDb2xvcnM6KiogQ8OhYyBtw6B1IHPhuq9jIGPDsyBz4bq1biBjaG8gY8OhYyDEkWnhu4duIHRob+G6oWkgdGjDtG5nIG1pbmguDQozLiAgKipNZW1vcnk6KiogS2jhuqMgbsSDbmcgbMawdSB0cuG7ryBj4bunYSBjw6FjIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgdGjGsOG7nW5nIMSRxrDhu6NjIMSRbyBi4bqxbmcgZ2lnYWJ5dGUgKEdCKSBob+G6t2MgbWVnYWJ5dGUgKE1CKS4NCjQuICAqKlN0b3JhZ2U6KiogS2jhuqMgbsSDbmcgbMawdSB0cuG7ryBu4buZaSBi4buZIGPhu6dhIGPDoWMgxJFp4buHbiB0aG/huqFpIHRow7RuZyB0aMaw4budbmcgxJHGsOG7o2MgxJFvIGLhurFuZyBnaWdhYnl0ZSAoR0IpIGhv4bq3YyBtZWdhYnl0ZSAoTUIpLg0KNS4gICoqUmF0aW5nOioqIMSQaeG7g20gxJHDoW5oIGdpw6EgaG/hurdjIMSRaeG7g20gc+G7kSDEkcaw4bujYyBnw6FuIGNobyBjw6FjIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaCwgcGjhuqNuIMOhbmggc+G7sSBow6BpIGzDsm5nIGhv4bq3YyBoaeG7h3Ugc3XhuqV0IGPhu6dhIG5nxrDhu51pIGTDuW5nLg0KNi4gICoqU2VsbGluZyBQcmljZToqKiBHacOhIGLDoW4gY2hvIG5nxrDhu51pIHRpw6p1IGTDuW5nIGPhu6dhIGPDoWMgxJFp4buHbiB0aG/huqFpIHRow7RuZyBtaW5oLg0KNy4gICoqT3JpZ2luYWwgUHJpY2U6KiogR2nDoSBn4buRYyBob+G6t2MgZ2nDoSBuacOqbSB54bq/dCBj4bunYSBjw6FjIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaCB0csaw4bubYyBi4bqldCBr4buzIGNoaeG6v3Qga2jhuqV1IGhv4bq3YyBraHV54bq/biBtw6NpIG7DoG8uDQo4LiAgKipNb2JpbGU6KiogQ2jhu4kgcmEgbGnhu4d1IHRoaeG6v3QgYuG7iyBjw7MgcGjhuqNpIGzDoCDEkWnhu4duIHRob+G6oWkgZGkgxJHhu5luZyBoYXkga2jDtG5nLg0KOS4gICoqRGlzY291bnQ6KiogQ2hp4bq/dCBraOG6pXUgxJHGsOG7o2Mgw6FwIGThu6VuZyB2w6BvIGdpw6EgZ+G7kWMgxJHhu4MgdMOtbmggdG/DoW4gZ2nDoSBiw6FuLg0KMTAuICoqRGlzY291bnQgcGVyY2VudGFnZToqKiBU4bu3IGzhu4cgcGjhuqduIHRyxINtIGNoaeG6v3Qga2jhuqV1IMSRxrDhu6NjIMOhcCBk4bulbmcgdsOgbyBnacOhIGfhu5FjIMSR4buDIHTDrW5oIHRvw6FuIGdpw6EgYsOhbi4NCg0KIyMgKioxLjIgxJDhu41jIGThu68gbGnhu4d1IHThu6sgZmlsZSBFeGNlbCB2w6AgZ8OhbiBk4buvIGxp4buHdSB2w6BvIG9iamVjdCoqDQoNCmBgYHtyfQ0KbGlicmFyeSh4bHN4KSANCnMgPC0gcmVhZC54bHN4KCJEOi9sYW10YW1uaHUvU2FsZXMueGxzeCIsIHNoZWV0SW5kZXggPSAxLCBoZWFkZXIgPSBUKSANCmBgYA0KDQotICAgQuG7mSBk4buvIGxp4buHdSBjw7MgY+G6pXUgdHLDumMgYmFvIGfhu5NtOiAzMTE0IGjDoG5nIHTGsMahbmcg4bupbmcgduG7m2kgMzExNCBxdWFuIHPDoXQgdsOgIDEyIGPhu5l0IHTGsMahbmcg4bupbmcgduG7m2kgMTIgYmnhur9uLg0KDQpgYGB7cn0NCmRpbShzKQ0KYGBgDQoNCiMgKioyLiBQaMOibiB0w61jaCBi4buZIGThu68gbGnhu4d1KioNCg0KIyMgKioyLjEgQmnhu4N1IMSR4buTIDEgLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duICUgdOG7tyBs4buHIGjDo25nIMSRaeG7h24gdGhv4bqhaSoqDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzY2FsZXMpDQpgYGANCg0KQ8OidSBs4buHbmggdHLDqm4gdOG6oW8gcmEgbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiB04bu3IGzhu4cgcGjhuqduIHRyxINtIGPhu6dhIGPDoWMgaMOjbmcgxJFp4buHbiB0aG/huqFpLiBE4buxYSB0csOqbiBk4buvIGxp4buHdSDEkeG6p3UgdsOgbyBgZGAsIGJp4buDdSDEkeG7kyBz4bq9IGPDsyB0cuG7pWMgeCBsw6AgIkjDo25nIMSRaeG7h24gdGhv4bqhaSIgdsOgIHRy4bulYyB5IGzDoCAiU+G7kSBsxrDhu6NuZyIuDQoNCkPDoWMgYsaw4bubYyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgdsOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQoxLiAgROG7ryBsaeG7h3UgxJHGsOG7o2MgbmjDs20gdGhlbyAiQnJhbmRzIiwgdOG7qWMgbMOgIGPDoWMgaMOjbmcgxJFp4buHbiB0aG/huqFpIMSRxrDhu6NjIG5ow7NtIGzhuqFpLg0KMi4gIFbhu5tpIG3hu5dpIG5ow7NtLCBz4buRIGzGsOG7o25nIHBo4bqnbiB04butIHRyb25nIG5ow7NtIMSRxrDhu6NjIHTDrW5oIHRvw6FuIGLhurFuZyBow6BtIGBuKClgLg0KMy4gIEJp4buDdSDEkeG7kyBj4buZdCDEkcaw4bujYyB04bqhbyByYSBi4bqxbmcgYGdlb21fY29sYCwgbeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcgcGjhuqduIHThu60gY+G7p2EgdOG7q25nIG5ow7NtLiBNw6B1IHPhuq9jIGPhu5l0IMSRxrDhu6NjIMSR4bq3dCBsw6AgbcOgdSB4YW5oIGzDoSBjw6J5Lg0KNC4gIFRpw6p1IMSR4buBIGPhu6dhIGJp4buDdSDEkeG7kyDEkcaw4bujYyDEkeG6t3QgbMOgICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duICUgdOG7tyBs4buHIGjDo25nIMSRaeG7h24gdGhv4bqhaSIuDQo1LiAgR2lhbyBkaeG7h24gY+G7p2EgYmnhu4N1IMSR4buTIMSRxrDhu6NjIHRoaeG6v3QgbOG6rXAgdGjDoG5oIGdpYW8gZGnhu4duIGNsYXNzaWMgYuG6sW5nIGB0aGVtZV9jbGFzc2ljKClgLg0KNi4gIFbhu5tpIG3hu5dpIGPhu5l0LCBt4buZdCBuaMOjbiBz4buRIMSRxrDhu6NjIHRow6ptIHbDoG8gYmnhu4N1IMSR4buTIGLhurFuZyBgZ2VvbV90ZXh0YC4gTmjDo24gc+G7kSBuw6B5IGzDoCBwaOG6p24gdHLEg20gY+G7p2Egc+G7kSBsxrDhu6NuZyBwaOG6p24gdOG7rSB0cm9uZyBuaMOzbSBzbyB24bubaSB04buVbmcgc+G7kSBwaOG6p24gdOG7rSBj4bunYSB0b8OgbiBi4buZIGThu68gbGnhu4d1LiBNw6B1IHPhuq9jIGPhu6dhIG5ow6NuIHPhu5EgxJHGsOG7o2MgxJHhurd0IGzDoCBtw6B1IMSR4buPLg0KNy4gIE5ow6NuIGNobyB0cuG7pWMgeCDEkcaw4bujYyDEkeG6t3QgbMOgICJIw6NuZyDEkWnhu4duIHRob+G6oWkiIHbDoCBuaMOjbiBjaG8gdHLhu6VjIHkgxJHGsOG7o2MgxJHhurd0IGzDoCAiU+G7kSBsxrDhu6NuZyIuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgcGjhuqduIHThu60gdsOgIHBo4bqnbiB0csSDbSBj4bunYSBjw6FjIGjDo25nIMSRaeG7h24gdGhv4bqhaS4gTmjDo24gc+G7kSB0csOqbiBt4buXaSBj4buZdCBjaG8gYmnhur90IHThu7cgbOG7hyBwaOG6p24gdHLEg20gY+G7p2Egc+G7kSBsxrDhu6NuZyBwaOG6p24gdOG7rSB0cm9uZyBow6NuZyDEkWnhu4duIHRob+G6oWkgxJHDsyBzbyB24bubaSB04buVbmcgc+G7kSBwaOG6p24gdOG7rSBj4bunYSB0b8OgbiBi4buZIGThu68gbGnhu4d1LiBNw6B1IHPhuq9jIHhhbmggbMOhIGPDonkgY+G7p2EgY8OhYyBj4buZdCB04bqhbyBuw6puIHPhu7EgdMawxqFuZyBwaOG6o24gdsOgIHRodSBow7p0IHPhu7EgY2jDuiDDvSBj4bunYSBuZ8aw4budaSDEkeG7jWMsIHRyb25nIGtoaSBuaMOjbiBz4buRIG3DoHUgxJHhu48gZ2nDunAgbmjhuqVuIG3huqFuaCBnacOhIHRy4buLIHBo4bqnbiB0csSDbS4NCg0KYGBge3J9DQpsaWJyYXJ5KHNjYWxlcykNCnMgJT4lIGdyb3VwX2J5KEJyYW5kcykgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhCcmFuZHMsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsNCiAgICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gJSB04bu3IGzhu4cgaMOjbmcgxJFp4buHbiB0aG/huqFpIikgKw0KICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQobi9sZW5ndGgocyRCcmFuZHMpKSksdmp1c3QgPSAxLCBjb2xvciA9ICdyZWQnKSArDQogICAgbGFicyh4ID0gJ0jDo25nIMSRaeG7h24gdGhv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KIyMgKioyLjIgQmnhu4N1IMSR4buTIDIgLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG5ow7NtIHRoZW8gc+G7sSBow6BpIGzDsm5nIGtow6FjaCBow6BuZyoqDQoNCi0gICBUYSB0aeG6v24gaMOgbmggcGjDom4gY2hpYSBiaeG6v24gUmF0aW5nIHRow6BuaCA1IHBo4bqnbjogS2jDtG5nIGjDoGkgbMOybmcsIFThuqFtIGNo4bqlcCBuaOG6rW4sIELDrG5oIHRoxrDhu51uZywgSMOgaSBsw7JuZywgUuG6pXQgaMOgaSBsw7JuZy4NCg0KYGBge3J9DQp0YWJsZShjdXQocyRSYXRpbmcsNSkpDQpgYGANCg0KROG7sWEgdsOgbyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG5ow7NtIHRoZW8gc+G7sSBow6BpIGzDsm5nIGPhu6dhIGtow6FjaCBow6BuZywgY2jDum5nIHRhIGPDsyB0aOG7gyBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KMS4gIFBow6JuIGLhu5Egc+G7sSBow6BpIGzDsm5nOiBCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBwaMOibiBi4buRIHPhu7EgaMOgaSBsw7JuZyBj4bunYSBraMOhY2ggaMOgbmcgxJHGsOG7o2MgY2hpYSB0aMOgbmggNSBuaMOzbTogImtow7RuZyBow6BpIGzDsm5nIiwgIlThuqFtIGNo4bqlcCBuaOG6rW4iLCAiQsOsbmggdGjGsOG7nW5nIiwgIkjDoGkgbMOybmciIHbDoCAiUuG6pXQgaMOgaSBsw7JuZyIuIE3hu5dpIG5ow7NtIMSRxrDhu6NjIGJp4buDdSBkaeG7hW4gYuG6sW5nIG3hu5l0IGPhu5l0IHRyw6puIGJp4buDdSDEkeG7ky4gTmdvw6BpIHJhIGPDsm4gY+G7mXQgIk5BIiBsw6AgY+G7mXQgIktow7RuZyBjw7Mgw70ga2nhur9uIi4NCg0KMi4gIFPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIHRyb25nIG3hu5dpIG5ow7NtOiBDaGnhu4F1IGNhbyBj4bunYSBjw6FjIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyB0cm9uZyBt4buXaSBuaMOzbSBz4buxIGjDoGkgbMOybmcuIE5ow6xuIHbDoG8gYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIHNvIHPDoW5oIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGdp4buvYSBjw6FjIG5ow7NtIHbDoCBuaOG6rW4gcmEgbmjDs20gY8OzIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGNhbyBuaOG6pXQgbMOgIG5ow7NtICJIw6BpIGzDsm5nIi4NCg0KMy4gIE5o4bqtbiB4w6l0IHbhu4Egc+G7sSBow6BpIGzDsm5nOiBE4buxYSB2w6BvIGJp4buDdSDEkeG7kywgY2jDum5nIHRhIGPDsyB0aOG7gyDEkcawYSByYSBuaOG6rW4geMOpdCB24buBIG3hu6ljIMSR4buZIHPhu7EgaMOgaSBsw7JuZyBj4bunYSBraMOhY2ggaMOgbmcuIE5ow7NtICJIw6BpIGzDsm5nIiBjw7Mgc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgbmhp4buBdSBuaOG6pXQsIGNow7puZyB0YSBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBo4bqndSBo4bq/dCBraMOhY2ggaMOgbmcgxJHDoW5oIGdpw6Egc+G6o24gcGjhuqltIGhv4bq3YyBk4buLY2ggduG7pSBraMOhIGNhby4gTmdvw6BpIHJhLCBuaMOzbSAia2jDtG5nIGjDoGkgbMOybmciIGNoaeG6v20gdOG7tyBs4buHIHRo4bqlcCBuaOG6pXQsIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4MgY2hvIHRo4bqleSBz4bqjbiBwaOG6qW0gaG/hurdjIGThu4tjaCB24bulIMSRw6FwIOG7qW5nIMSRxrDhu6NjIHPhu7EgaMOgaSBsw7JuZyBj4bunYSBraMOhY2ggaMOgbmcuDQoNCmBgYHtyfQ0KcyA8LSBzDQpzMSA8LSBzICU+JSBtdXRhdGUoSEwgPSBjdXQoUmF0aW5nLDUsIGxhYmVsID0gYygna2jDtG5nIGjDoGkgbMOybmcnLCAnVOG6oW0gY2jhuqVwIG5o4bqtbicsJ0LDrG5oIHRoxrDhu51uZycsJ0jDoGkgbMOybmcnLCdS4bqldCBow6BpIGzDsm5nJykpKQ0KczEgJT4lIGdyb3VwX2J5KEhMKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKEhMLG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYmx1ZScpICsNCiAgICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG5ow7NtIHRoZW8gc+G7sSBow6BpIGzDsm5nIGtow6FjaCBow6BuZyIpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAwLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnU+G7sSBow6BpIGzDsm5nJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQojIyAqKjIuMyBCaeG7g3UgxJHhu5MgMyAtIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgxJHGsOG7o2MgY2hp4bq/dCBraOG6pXUqKg0KDQpDw6J1IGzhu4duaCB0csOqbiB0aMOqbSBt4buZdCBj4buZdCBt4bubaSB2w6BvIGThu68gbGnhu4d1IGQgxJHGsOG7o2MgZ+G7jWkgbMOgICJncm91cCIgZOG7sWEgdHLDqm4gZ2nDoSB0cuG7iyBj4bunYSBj4buZdCAiRGlzY291bnQiLiBO4bq/dSBnacOhIHRy4buLIHRyb25nIGPhu5l0ICJEaXNjb3VudCIgbOG7m24gaMahbiAwLCB0aMOsIGdpw6EgdHLhu4sgdHJvbmcgY+G7mXQgImdyb3VwIiBz4bq9IGzDoCAiQ8OzIGNoaeG6v3Qga2jhuqV1IiwgbmfGsOG7o2MgbOG6oWksIGdpw6EgdHLhu4sgdHJvbmcgY+G7mXQgImdyb3VwIiBz4bq9IGzDoCAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1Ii4NCg0KU2F1IMSRw7MsIGPDonUgbOG7h25oIHRhYmxlKGRcJGdyb3VwKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBt4buZdCBi4bqjbmcgdOG6p24gc+G7kSwgaGnhu4NuIHRo4buLIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IHRyb25nIG3hu5dpIG5ow7NtIGPhu6dhIGPhu5l0ICJncm91cCIuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBi4bqjbmcgdOG6p24gc+G7kSwgdHJvbmcgxJHDsyBjw6FjIG5ow7NtICJDw7MgY2hp4bq/dCBraOG6pXUiIHbDoCAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1IiDEkcaw4bujYyBoaeG7g24gdGjhu4sgdsOgIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IHRyb25nIG3hu5dpIG5ow7NtIMSRxrDhu6NjIMSR4bq/bSBs4bqnbiBsxrDhu6N0IGzDoCAxMTkzIHbDoCAxOTIxLg0KDQpgYGB7cn0NCnMkZ3JvdXAgPC0gaWZlbHNlKHMkRGlzY291bnQgPiAwLCAiQ8OzIGNoaeG6v3Qga2jhuqV1IiwgIktow7RuZyBjaGnhur90IGto4bqldSIpDQp0YWJsZShzJGdyb3VwKQ0KYGBgDQoNCkThu7FhIHbDoG8gYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBuaMOzbSB0aGVvIGNoaeG6v3Qga2jhuqV1LCBjaMO6bmcgdGEgY8OzIHRo4buDIHBow6JuIHTDrWNoIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQoxLiAgUGjDom4gYuG7kSBjaGnhur90IGto4bqldTogQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgcGjDom4gYuG7kSBjw6FjIG5ow7NtIGThu7FhIHRyw6puIGNoaeG6v3Qga2jhuqV1IGPhu6dhIHPhuqNuIHBo4bqpbS4gQ8OhYyBuaMOzbSDEkcaw4bujYyBjaGlhIHRow6BuaCAiQ8OzIGNoaeG6v3Qga2jhuqV1IiB2w6AgIktow7RuZyBjaGnhur90IGto4bqldSIuIE3hu5dpIG5ow7NtIMSRxrDhu6NjIGJp4buDdSBkaeG7hW4gYuG6sW5nIG3hu5l0IGPhu5l0IHRyw6puIGJp4buDdSDEkeG7ky4NCg0KMi4gIFPhu5EgbMaw4bujbmcgc+G6o24gcGjhuqltIHRyb25nIG3hu5dpIG5ow7NtOiBOaMOzbSAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1IiBjw7Mgc+G7kSBsxrDhu6NuZyAxOTIxIG5oaeG7gXUgaMahbiBuaMOzbSAiQ8OzIGNoaeG6v3Qga2jhuqV1IiBsw6AgMTE5My4NCg0KMy4gIE5o4bqtbiB4w6l0IHbhu4EgY2hp4bq/dCBraOG6pXU6IEThu7FhIHbDoG8gYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIMSRxrBhIHJhIG5o4bqtbiB4w6l0IHbhu4EgbeG7qWMgxJHhu5kgY2hp4bq/dCBraOG6pXUgY+G7p2Egc+G6o24gcGjhuqltLiBUYSB0aOG6pXkgbmjDs20gIktow7RuZyBjaGnhur90IGto4bqldSIgY2hp4bq/bSB04bu3IGzhu4cgY2FvLCDEkWnhu4F1IG7DoHkgY8OzIHRo4buDIGNobyB0aOG6pXkgY2hp4bq/dCBraOG6pXUga2jDtG5nIHBo4buVIGJp4bq/biBob+G6t2Mga2jDtG5nIOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIMSR4bq/biBz4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbS4NCg0KYGBge3J9DQpzICU+JSBncm91cF9ieShncm91cCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhncm91cCxuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J2dyYXknKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbmjDs20gdGhlbyBjaGnhur90IGto4bqldSAiLHggPSAnxJDhu5kgc8OidScsIHkgPSAnU+G7kSBsxrDhu6NuZycpIA0KYGBgDQoNCiMjICoqMi40IEJp4buDdSDEkeG7kyA0IC0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBnacOhIGLDoW4gY+G7p2EgY8OhYyBsb+G6oWkgxJFp4buHbiB0aG/huqFpKioNCg0KQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpIGThu7FhIHRyw6puIGThu68gbGnhu4d1IHThu6sgdOG6rXAgZOG7ryBsaeG7h3UuIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGJp4buDdSDEkeG7kzoNCg0KMS4gIFBow6JuIGLhu5EgZ2nDoSBiw6FuOiBCaeG7g3UgxJHhu5MgaGlzdG9ncmFtIGNobyB0aOG6pXkgcGjDom4gYuG7kSBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpLiBUcuG7pWMgeCB0csOqbiBiaeG7g3UgxJHhu5MgYmnhu4N1IGRp4buFbiBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpLCB0cm9uZyBraGkgdHLhu6VjIHkgYmnhu4N1IGRp4buFbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaS4gTeG7l2kgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIMSR4bqhaSBkaeG7h24gY2hvIG3hu5l0IGtob+G6o25nIGdpw6EgYsOhbiwgdsOgIGNoaeG7gXUgY2FvIGPhu6dhIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSB0cm9uZyBraG/huqNuZyDEkcOzLg0KDQoyLiAgQmlud2lkdGg6IFRow7RuZyBxdWEgxJFv4bqhbiBtw6MgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwKSwgYmlud2lkdGggxJHGsOG7o2MgdGhp4bq/dCBs4bqtcCBsw6AgNTAwMC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGdpw6EgYsOhbiBj4bunYSDEkWnhu4duIHRob+G6oWkgxJHGsOG7o2MgY2hpYSB0aMOgbmggY8OhYyBraG/huqNuZyBjw7MgxJHhu5kgcuG7mW5nIDUwMDAuIFPhu5EgbMaw4bujbmcgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIHPhur0gcGjhu6UgdGh14buZYyB2w6BvIGtob+G6o25nIGdpw6EgdsOgIGJpbndpZHRoIG7DoHkuDQoNCjMuICBNw6B1IHPhuq9jOiBDw6FjIGPhu5l0IHRyw6puIGJp4buDdSDEkeG7kyDEkcaw4bujYyB0w7QgbcOgdSB4YW5oIGxhbSAoZmlsbCA9ICdibHVlJykgdsOgIGPDsyB2aeG7gW4gbcOgdSDEkeG7jyAoY29sb3IgPSAncmVkJyksIHThuqFvIG7Dqm4gc+G7sSB0xrDGoW5nIHBo4bqjbiB0cuG7sWMgcXVhbi4NCg0KNC4gIFRpw6p1IMSR4buBIHbDoCBuaMOjbiB0cuG7pWM6IEJp4buDdSDEkeG7kyBjw7MgdGnDqnUgxJHhu4EgIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZ2nDoSBiw6FuIGPhu6dhIMSRaeG7h24gdGhv4bqhaSIsIHRy4bulYyB4IMSRxrDhu6NjIGdoaSBsw6AgIkdpw6EgYsOhbiIgdsOgIHRy4bulYyB5IMSRxrDhu6NjIGdoaSBsw6AgIlPhu5EgbMaw4bujbmciLg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBjaMO6bmcgdGEgbmjDrG4gdGjhuqV5IHBow6JuIHBo4buRaSBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpIHbDoCB04bqtcCB0cnVuZyBnacOhIHRyb25nIGPDoWMga2hv4bqjbmcgZ2nDoSBj4bulIHRo4buDLiBDaMO6bmcgdGEgY8OzIHRo4buDIHPhu60gZOG7pW5nIGJp4buDdSDEkeG7kyBuw6B5IMSR4buDIGhp4buDdSB0aOG7iyB0csaw4budbmcgdsOgIGN1bmcgY+G6p3UgY+G7p2EgxJFp4buHbiB0aG/huqFpLCBuaOG6rW4gYmnhur90IGPDoWMga2hv4bqjbmcgZ2nDoSBwaOG7lSBiaeG6v24gdsOgIMSRw6FuaCBnacOhIHThuq1wIHRydW5nIGdpw6EgdHJvbmcgY8OhYyBraG/huqNuZyDEkcOzLg0KDQpgYGB7cn0NCnMgJT4lIGdncGxvdChhZXMoeCA9IFNlbGxpbmcuUHJpY2UpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMCwgZmlsbCA9ICdibHVlJywgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGdpw6EgYsOhbiBj4bunYSDEkWnhu4duIHRob+G6oWkgIix4ID0gJ0dpw6EgYsOhbicsIHkgPSAnU+G7kSBsxrDhu6NuZycpIA0KDQpgYGANCg0KIyMgKioyLjUgQmnhu4N1IMSR4buTIDUgLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG3huq10IMSR4buTIGdpw6EgYsOhbiBj4bunYSDEkWnhu4duIHRob+G6oWkqKg0KDQpExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBiaeG7g3UgxJHhu5M6DQoNCjEuICBN4bqtdCDEkeG7mSBnacOhIGLDoW46IEJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSAoZGVuc2l0eSBwbG90KSB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgcGjDom4gYuG7kSBj4bunYSBnacOhIGLDoW4gxJFp4buHbiB0aG/huqFpLiBUcuG7pWMgeCBiaeG7g3UgZGnhu4VuIGdpw6EgYsOhbiwgdHJvbmcga2hpIHRy4bulYyB5IGJp4buDdSBkaeG7hW4gbeG6rXQgxJHhu5ksIGhheSB04bu3IGzhu4cgZ2nhu69hIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHbDoCBkaeG7h24gdMOtY2ggZMaw4bubaSDEkcaw4budbmcgY29uZy4NCg0KMi4gIE3DoHUgc+G6r2M6IMSQxrDhu51uZyBjb25nIG3huq10IMSR4buZIMSRxrDhu6NjIHTDtCBtw6B1IGjhu5NuZyAoImZpbGwgPSAncGluayciKSwgdOG6oW8gbsOqbiBz4buxIHTGsMahbmcgcGjhuqNuIHRy4buxYyBxdWFuLg0KDQozLiAgVGnDqnUgxJHhu4EgdsOgIG5ow6NuIHRy4bulYzogQmnhu4N1IMSR4buTIGPDsyB0acOqdSDEkeG7gSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bqtdCDEkeG7mSBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpIiwgdHLhu6VjIHggxJHGsOG7o2MgZ2hpIGzDoCAiR2nDoSBiw6FuIiB2w6AgdHLhu6VjIHkgxJHGsOG7o2MgZ2hpIGzDoCAiTeG6rXQgxJHhu5kiLg0KDQpCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgZ2nDunAgY2jDum5nIHRhIG5ow6xuIHRo4bqleSBz4buxIHBow6JuIGLhu5EgbeG6rXQgxJHhu5kgY+G7p2EgZ2nDoSBiw6FuIMSRaeG7h24gdGhv4bqhaS4gxJDGsOG7nW5nIGNvbmcgbeG6rXQgxJHhu5kgY8OgbmcgY2FvIHThuqFpIG3hu5l0IGdpw6EgdHLhu4sgY+G7pSB0aOG7gywgY8OgbmcgY2hvIHRo4bqleSBt4bqtdCDEkeG7mSBs4bubbiBoxqFuIGPhu6dhIGdpw6EgYsOhbiDhu58gxJHDsy4gxJBp4buBdSBuw6B5IGdpw7pwIGNow7puZyB0YSBoaeG7g3UgcsO1IGjGoW4gduG7gSBt4bupYyDEkeG7mSB04bqtcCB0cnVuZyB2w6AgYmnhu4N1IGRp4buFbiBwaMOibiBwaOG7kWkgZ2nDoSBiw6FuIGPhu6dhIMSRaeG7h24gdGhv4bqhaSB0cm9uZyB04bqtcCBk4buvIGxp4buHdS4NCg0KTMawdSDDvSBy4bqxbmcgxJHhu4MgcGjDom4gdMOtY2gga+G6v3QgcXXhuqMgY2hpIHRp4bq/dCBoxqFuLCBj4bqnbiB4ZW0geMOpdCB0aMO0bmcgdGluIGPhu6UgdGjhu4MgduG7gSBk4buvIGxp4buHdSB2w6Agbmfhu68gY+G6o25oIGPhu6dhIG5naGnDqm4gY+G7qXUuDQoNCmBgYHtyfQ0KcyAlPiUgZ2dwbG90KGFlcyh4ID0gU2VsbGluZy5QcmljZSkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAncGluaycpICsNCiAgbGFicyh0aXRsZSA9ICIgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bqtdCDEkeG7mSBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpICIseCA9ICdHacOhIGLDoW4nLCB5ID0gJ03huq10IMSR4buZJykgDQpgYGANCg0KIyMgKioyLjYgQmnhu4N1IMSR4buTIDYgLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu7cgbOG7hyBjw7MgY2FtZXJhIGPhu6dhIMSRaeG7h24gdGhv4bqhaSoqDQoNClThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCAoYmFyIGNoYXJ0KSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY8OzIENhbWVyYSBk4buxYSB0csOqbiBk4buvIGxp4buHdSB04burIHThuq1wIGThu68gbGnhu4d1IGBkYC4gRMaw4bubaSDEkcOieSBsw6AgcGjDom4gdMOtY2gga+G6v3QgcXXhuqMgY+G7p2EgYmnhu4N1IMSR4buTOg0KDQoxLiAgTmjDs20gdsOgIHThu5VuZyBo4bujcCBk4buvIGxp4buHdTogxJDhuqd1IHRpw6puLCBk4buvIGxp4buHdSDEkcaw4bujYyBuaMOzbSB0aGVvIGJp4bq/biBDYW1lcmEgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGdyb3VwX2J5KENhbWVyYSkgdsOgIHNhdSDEkcOzIMSR4bq/bSBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSB0cm9uZyBt4buXaSBuaMOzbSBi4bqxbmcgY8OhY2ggc+G7rSBk4bulbmcgc3VtbWFyaXNlKG4gPSBuKCkpLiBL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IHbhu5tpIGhhaSBj4buZdDogQ2FtZXJhIChiaeG6v24gbmjDs20pIHbDoCBuIChz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBjw7MgQ2FtZXJhKS4NCg0KMi4gIEJp4buDdSDEkeG7kyBj4buZdDogROG7ryBsaeG7h3Ugc2F1IGtoaSDEkcaw4bujYyB04buVbmcgaOG7o3AgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGPhu5l0LiBUcuG7pWMgeCB0csOqbiBiaeG7g3UgxJHhu5MgYmnhu4N1IGRp4buFbiBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgYmnhur9uIGBDYW1lcmFgLCB0cm9uZyBraGkgdHLhu6VjIHkgYmnhu4N1IGRp4buFbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSB0xrDGoW5nIOG7qW5nLiBN4buXaSBj4buZdCB0csOqbiBiaeG7g3UgxJHhu5MgxJHhuqFpIGRp4buHbiBjaG8gbeG7mXQgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gYENhbWVyYWAsIHbDoCBjaGnhu4F1IGNhbyBj4bunYSBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkuDQoNCjMuICBNw6B1IHPhuq9jOiBDw6FjIGPhu5l0IHRyw6puIGJp4buDdSDEkeG7kyDEkcaw4bujYyB0w7QgbcOgdSDEkWVuIChgZmlsbD0nYmxhY2snYCksIHThuqFvIG7Dqm4gc+G7sSB0xrDGoW5nIHBo4bqjbiB0cuG7sWMgcXVhbi4NCg0KNC4gIENow7ogdGjDrWNoIHPhu5EgbMaw4bujbmc6IFPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIMSRxrDhu6NjIGhp4buDbiB0aOG7iyB0csOqbiBt4buXaSBj4buZdCBz4butIGThu6VuZyBgZ2VvbV90ZXh0YCB2w6AgxJHGsOG7o2MgxJHhurd0IG5ow6NuIChgbGFiZWwgPSBuYCkuIENow7ogdGjDrWNoIG7DoHkgY8OzIG3DoHUgxJHhu48gKGBjb2xvciA9ICdyZWQnYCkgdsOgIMSRxrDhu6NjIMSR4bq3dCB24buLIHRyw60gZOG7jWMgKGB2anVzdCA9IDJgKSDEkeG7gyBu4bqxbSB0csOqbiBj4buZdCB0xrDGoW5nIOG7qW5nLg0KDQo1LiAgVGnDqnUgxJHhu4EgdsOgIG5ow6NuIHRy4bulYzogQmnhu4N1IMSR4buTIGPDsyB0acOqdSDEkeG7gSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBjw7MgQ2FtZXJhIiwgdHLhu6VjIHggxJHGsOG7o2MgZ2hpIGzDoCAixJBp4buHbiB0aG/huqFpIGPDsyBDYW1lcmEiIHbDoCB0cuG7pWMgeSDEkcaw4bujYyBnaGkgbMOgICJT4buRIGzGsOG7o25nIi4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgY2jDum5nIHRhIG5ow6xuIHRo4bqleSBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBjw7MgQ2FtZXJhIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGzDoCAzMTE0IHbDoCBuw7MgY2hp4bq/bSAxMDAlIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpLiBW4bqteSBjw7MgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGtow7RuZyBjw7MgY2FtZXJhIGzDoCAwLiBTdXkgcmEsIGhp4buHbiBuYXkgY8OzIHRo4buDIG7Ds2kgxJFhIHPhu5EgxJFp4buHbiB0aG/huqFpIMSRxrDhu6NjIHPhuqNuIHh14bqldCByYSDEkeG7gXUgY8OzIENhbWVyYS4NCg0KYGBge3J9DQpzICU+JSBncm91cF9ieShDYW1lcmEpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoQ2FtZXJhLG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYmxhY2snKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gU+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY8OzIENhbWVyYSAiLHggPSAnxJBp4buHbiB0aG/huqFpIGPDsyBDYW1lcmEnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSANCmBgYA0KDQojIyAqKjIuNyBCaeG7g3UgxJHhu5MgNyAtIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgY2hp4bq/dCBraOG6pXUgY+G7p2EgxJFp4buHbiB0aG/huqFpIGThu7FhIHRyw6puIGdpw6EgZ+G7kWMqKg0KDQpDaMO6bmcgdGEgY8OzIG3hu5l0IGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSAoZGVuc2l0eSBwbG90KSBt4bubaSBk4buxYSB0csOqbiBnacOhIGfhu5FjIChPcmlnaW5hbC5QcmljZSkgY+G7p2EgZOG7ryBsaeG7h3UuIEJp4buDdSDEkeG7kyBuw6B5IGPFqW5nIMSRxrDhu6NjIHBow6JuIGNoaWEgdGjDoG5oIGPDoWMgbmjDs20gc+G7rSBk4bulbmcgYGZhY2V0X3dyYXAofmdyb3VwKWAuIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGJp4buDdSDEkeG7kzoNCg0KMS4gIE3huq10IMSR4buZIGdpw6EgZ+G7kWM6IEJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgcGjDom4gYuG7kSBj4bunYSBnacOhIGfhu5FjIGPhu6dhIMSRaeG7h24gdGhv4bqhaS4gVHLhu6VjIHggYmnhu4N1IGRp4buFbiBnacOhIGfhu5FjLCB0cm9uZyBraGkgdHLhu6VjIHkgYmnhu4N1IGRp4buFbiBt4bqtdCDEkeG7mSwgaGF5IHThu7cgbOG7hyBnaeG7r2Egc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdsOgIGRp4buHbiB0w61jaCBkxrDhu5tpIMSRxrDhu51uZyBjb25nLg0KDQoyLiAgTcOgdSBz4bqvYzogxJDGsOG7nW5nIGNvbmcgbeG6rXQgxJHhu5kgxJHGsOG7o2MgdMO0IG3DoHUgeGFuaCBsw6EgY8OieSAoImZpbGwgPSAnZ3JlZW4nIiksIHThuqFvIG7Dqm4gc+G7sSB0xrDGoW5nIHBo4bqjbiB0cuG7sWMgcXVhbi4NCg0KMy4gIFBow6JuIG5ow7NtOiBCaeG7g3UgxJHhu5MgxJHGsOG7o2MgcGjDom4gY2hpYSB0aMOgbmggY8OhYyBuaMOzbSBi4bqxbmcgYGZhY2V0X3dyYXAofmdyb3VwKWAuIE3hu5dpIG5ow7NtIGPDsyB0aOG7gyBoaeG7g24gdGjhu4sgdHLDqm4gbeG7mXQgcGFuZWwgcmnDqm5nIGJp4buHdCwgZ2nDunAgc28gc8OhbmggbeG6rXQgxJHhu5kgZ2nDoSBn4buRYyBnaeG7r2EgaGFpIG5ow7NtICJDw7MgY2hp4bq/dCBraOG6pXUiIHbDoCAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1Ii4NCg0KQmnhu4N1IMSR4buTIG3huq10IMSR4buZIGdpw7pwIGNow7puZyB0YSBuaMOsbiB0aOG6pXkgc+G7sSBwaMOibiBi4buRIG3huq10IMSR4buZIGPhu6dhIGdpw6EgZ+G7kWMgdHJvbmcgdOG7q25nIG5ow7NtIGtow6FjIG5oYXUgY+G7p2EgZOG7ryBsaeG7h3UuIMSQaeG7gXUgbsOgeSBnacO6cCBjaMO6bmcgdGEgc28gc8OhbmggbeG6rXQgxJHhu5kgZ2nDoSBn4buRYyBnaeG7r2EgaGFpIG5ow7NtICJDw7MgY2hp4bq/dCBraOG6pXUiIHbDoCAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1IiBsw6AgdMawxqFuZyDEkcawxqFuZyBuaGF1Lg0KDQpgYGB7cn0NCnMgJT4lIGdncGxvdChhZXMoeCA9IE9yaWdpbmFsLlByaWNlKSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdncmVlbicpICsNCiAgZmFjZXRfd3JhcCh+Z3JvdXApICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG3huq10IMSR4buZIGNoaeG6v3Qga2jhuqV1IGPhu6dhIMSRaeG7h24gdGhv4bqhaSBk4buxYSB0csOqbiBnacOhIGfhu5FjIikNCmBgYA0KDQojIyAqKjIuOCBCaeG7g3UgxJHhu5MgOCAtIEJp4buDdSDEkeG7kyBj4buZdCAoYmFyIGNoYXJ0KSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdGhlbyB04burbmcgbmjDo24gaGnhu4d1IChCcmFuZHMpKioNCg0KQmnhu4N1IMSR4buTIGPhu5l0IChiYXIgY2hhcnQpIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSB0aGVvIHThu6tuZyBuaMOjbiBoaeG7h3UgKEJyYW5kcykgZOG7sWEgdHLDqm4gZOG7ryBsaeG7h3UgdOG7qyB04bqtcCBk4buvIGxp4buHdSBgZGAuIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGJp4buDdSDEkeG7kzoNCg0KMS4gIE5ow7NtIHbDoCB04buVbmcgaOG7o3AgZOG7ryBsaeG7h3U6IMSQ4bqndSB0acOqbiwgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbmjDs20gdGhlbyBiaeG6v24gYEJyYW5kc2AgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGBncm91cF9ieShCcmFuZHMpYCB2w6Agc2F1IMSRw7MgxJHhur9tIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHRyb25nIG3hu5dpIG5ow7NtIGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBgc3VtbWFyaXNlKG4gPSBuKCkpYC4gS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGLhuqNuZyBk4buvIGxp4buHdSB24bubaSBoYWkgY+G7mXQ6IGBCcmFuZHNgIChuaMOjbiBoaeG7h3UpIHbDoCBgbmAgKHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGPhu6dhIHThu6tuZyBuaMOjbiBoaeG7h3UpLg0KDQoyLiAgQmnhu4N1IMSR4buTIGPhu5l0OiBE4buvIGxp4buHdSBzYXUga2hpIMSRxrDhu6NjIHThu5VuZyBo4bujcCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgY+G7mXQuIFRy4bulYyB4IHRyw6puIGJp4buDdSDEkeG7kyBiaeG7g3UgZGnhu4VuIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gYEJyYW5kc2AsIHRyb25nIGtoaSB0cuG7pWMgeSBiaeG7g3UgZGnhu4VuIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHTGsMahbmcg4bupbmcuIE3hu5dpIGPhu5l0IHRyw6puIGJp4buDdSDEkeG7kyDEkeG6oWkgZGnhu4duIGNobyBt4buZdCBuaMOjbiBoaeG7h3UsIHbDoCBjaGnhu4F1IGNhbyBj4bunYSBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkuDQoNCjMuICBDaMO6IHRow61jaCBz4buRIGzGsOG7o25nOiBT4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSDEkcaw4bujYyBoaeG7g24gdGjhu4sgdHLDqm4gbeG7l2kgY+G7mXQgc+G7rSBk4bulbmcgYGdlb21fdGV4dGAgdsOgIMSRxrDhu6NjIMSR4bq3dCBuaMOjbiAoYGxhYmVsID0gbmApLiBW4buLIHRyw60gY+G7p2EgY2jDuiB0aMOtY2ggxJHGsOG7o2MgxJHhurd0IGLhurFuZyBgcG9zaXRpb25fc3RhY2sodmp1c3QgPSAxKWAsIGdpw7pwIGNow7ogdGjDrWNoIG7hurFtIHRyw6puIGPhu5l0IHTGsMahbmcg4bupbmcuDQoNCmBgYHtyfQ0KcyAlPiUgZ3JvdXBfYnkoQnJhbmRzKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKEJyYW5kcyxuKSkgKw0KICAgIGdlb21fY29sKCkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMSkpICsNCiAgIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGPhu6dhIMSRaeG7h24gdGhv4bqhaSBk4buxYSB0csOqbiB0aMawxqFuZyBoaeG7h3UiKQ0KYGBgDQoNCjEuICBQaMOibiBwaOG7kWkgbmjDo24gaGnhu4d1OiBCaeG7g3UgxJHhu5MgY+G7mXQgY2hvIHRo4bqleSBwaMOibiBwaOG7kWkgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdGhlbyB04burbmcgbmjDo24gaGnhu4d1IGPDsyBz4buxIGNow6puaCBs4buHY2ggcsO1IHLDoG5nLg0KDQoyLiAgU28gc8OhbmggZ2nhu69hIGPDoWMgbmjDo24gaGnhu4d1OiBCaeG7g3UgxJHhu5MgY+G7mXQgZ2nDunAgY2jDum5nIHRhIHNvIHPDoW5oIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGdp4buvYSBjw6FjIG5ow6NuIGhp4buHdS4gQ2jDum5nIHRhIGPDsyB0aOG7gyB4w6FjIMSR4buLbmggxJHGsOG7o2MgbmjDo24gaGnhu4d1IG7hu5VpIGLhuq10IHbhu5tpIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGNhbyBoxqFuIHNvIHbhu5tpIG5o4buvbmcgbmjDo24gaGnhu4d1IGtow6FjIGzDoCB0aMawxqFuZyBoaeG7h3UgU0FNU1VORyB24bubaSBz4buRIGzGsOG7o25nIDcxOSwgdGjhuqVwIG5o4bqldCBsw6AgdGjGsMahbmcgaGnhu4d1IElRT08gduG7m2kgc+G7kSBsxrDhu6NuZyBsw6AgNS4NCg0KIyMgKioyLjkgQmnhu4N1IMSR4buTIDkgLSBCaeG7g3UgxJHhu5MgaGlzdG9ncmFtIHRo4buDIGhp4buHbiBwaMOibiBwaOG7kWkgZ2nDoSBn4buRYyAoT3JpZ2luYWwuUHJpY2UpIGPhu6dhIMSRaeG7h24gdGhv4bqhaSB04burIGhhaSBuaMOjbiBoaeG7h3UgJ0FwcGxlJyB2w6AgJ1NBTVNVTkcnKioNCg0KQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIGdpw6EgZ+G7kWMgKE9yaWdpbmFsLlByaWNlKSBj4bunYSDEkWnhu4duIHRob+G6oWkgdOG7qyBoYWkgbmjDo24gaGnhu4d1ICdBcHBsZScgdsOgICdTQU1TVU5HJyB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBgZGAuIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGJp4buDdSDEkeG7kzoNCg0KMS4gIFjDoWMgxJHhu4tuaCBiaeG6v24gdsOgIGThu68gbGnhu4d1OiBCaeG6v24gYHhgIHRyw6puIHRy4bulYyB4IGPhu6dhIGJp4buDdSDEkeG7kyDEkcaw4bujYyB4w6FjIMSR4buLbmggbMOgIGdpw6EgZ+G7kWMgKE9yaWdpbmFsLlByaWNlKS4gROG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGzDoCB04bqtcCBk4buvIGxp4buHdSBgZGAuDQoNCjIuICBCaeG7g3UgxJHhu5MgaGlzdG9ncmFtOiDEkOG7gyBoaeG7g24gdGjhu4sgcGjDom4gcGjhu5FpIGdpw6EgZ+G7kWMgY+G7p2EgxJFp4buHbiB0aG/huqFpIHThu6sgbmjDo24gaGnhu4d1ICdBcHBsZScsIGLhuqFuIHPhu60gZOG7pW5nIGBnZW9tX2hpc3RvZ3JhbWAgdsOgIGzhu41jIGThu68gbGnhu4d1IGLhurFuZyBgZmlsdGVyKEJyYW5kcyA9PSAnQXBwbGUnKWAuIEvhur90IHF14bqjIGzDoCBt4buZdCBoaXN0b2dyYW0gduG7m2kgY8OhYyBj4buZdCBiaeG7g3UgdGjhu4sgdOG6p24gc3XhuqV0IGPhu6dhIGPDoWMga2hv4bqjbmcgZ2nDoSBn4buRYy4gVMawxqFuZyB04buxLCBi4bqhbiB04bqhbyBt4buZdCBoaXN0b2dyYW0ga2jDoWMgY2hvIG5ow6NuIGhp4buHdSAnU0FNU1VORycuDQoNCjMuICBD4bqldSBow6xuaCBiaW53aWR0aCB2w6AgbcOgdSBz4bqvYzogVGjDtG5nIHF1YSDEkeG7kWkgc+G7kSBgYmlud2lkdGggPSAyMDAwYCwgYuG6oW4gY2jhu4kgxJHhu4tuaCBy4bqxbmcgbeG7l2kga2hv4bqjbmcgdHLDqm4gYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBjw7MgY2hp4buBdSBy4buZbmcgbMOgIDIwMDAuIMSQaeG7gXUgbsOgeSDhuqNuaCBoxrDhu59uZyDEkeG6v24gc+G7kSBsxrDhu6NuZyB2w6Aga8OtY2ggdGjGsOG7m2MgY+G7p2EgY8OhYyBj4buZdCB0csOqbiBiaeG7g3UgxJHhu5MuIELhuqFuIHPhu60gZOG7pW5nIGBmaWxsYCDEkeG7gyB0aGnhur90IGzhuq1wIG3DoHUgc+G6r2MgY+G7p2EgY8OhYyBj4buZdCwgdsOtIGThu6U6ICdyZWQnIGNobyAnQXBwbGUnIHbDoCAnbGlnaHRncmVlbicgY2hvICdTQU1TVU5HJy4NCg0KYGBge3J9DQpzICU+JSBnZ3Bsb3QoYWVzKHggPSBPcmlnaW5hbC5QcmljZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZGF0YSA9IHMgJT4lIGZpbHRlcihCcmFuZHMgPT0gJ0FwcGxlJyksIGJpbndpZHRoID0gMjAwMCwgZmlsbCA9ICdyZWQnKSArDQogIGdlb21faGlzdG9ncmFtKGRhdGEgPSBzICU+JSBmaWx0ZXIoQnJhbmRzID09ICdTQU1TVU5HJyksIGJpbndpZHRoID0gMjAwMCwgZmlsbCA9ICdsaWdodGdyZWVuJykgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBoaXN0b2dyYW0gdGjhu4MgaGnhu4duIHBow6JuIHBo4buRaSBnacOhIGfhu5FjIGPhu6dhIMSRaeG7h24gdGhv4bqhaSIpDQpgYGANCg0KIyMgKioyLjEwIEJp4buDdSDEkeG7kyAxMCAtIEJp4buDdSDEkeG7kyBj4buZdCDEkeG7k25nIHTDom0gdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHThu6tuZyBuaMOjbiBoaeG7h3UgdOG7qyBi4buZIGThu68gbGnhu4d1KiogDQoNCkPDonUgbOG7h25oIHRyw6puIHPhu60gZOG7pW5nIOG7kW5nIGThuqtuIChgJT4lYCkgdsOgIGfDs2kgYGdncGxvdDJgIMSR4buDIHbhur0gbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IMSR4buTbmcgdMOibSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdOG7q25nIG5ow6NuIGhp4buHdSB04burIGLhu5kgZOG7ryBsaeG7h3UgIlNtYXJ0cGhvbmVzIFNhbGVzIiB0cm9uZyBSIE1hcmtkb3duLiBExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBjw6J1IGzhu4duaDoNCg0KMS4gIE5ow7NtIGThu68gbGnhu4d1OiBDw6J1IGzhu4duaCBz4butIGThu6VuZyBow6BtIGBncm91cF9ieSgpYCDEkeG7gyBuaMOzbSBk4buvIGxp4buHdSB0aGVvIG5ow6NuIGhp4buHdSAoYEJyYW5kc2ApLg0KMi4gIFTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nOiBIw6BtIGBzdW1tYXJpc2UoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdMOtbmggc+G7kSBsxrDhu6NuZyAoYG5gKSBjaG8gbeG7l2kgbmjDo24gaGnhu4d1Lg0KMy4gIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IMSR4buTbmcgdMOibTogSMOgbSBgZ2dwbG90KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIG3hu5l0IGtodW5nIGJp4buDdSDEkeG7ky4gVGjDtG5nIHF1YSB0aGFtIHPhu5EgYGFlcygpYCwgYmnhu4N1IMSR4buTIGNo4buJIMSR4buLbmggZ2nDoSB0cuG7iyB4IChy4buXbmcpIHbDoCBnacOhIHRy4buLIHkgKHPhu5EgbMaw4bujbmcpIGPhu6dhIHThu6tuZyBuaMOjbiBoaeG7h3UsIHbDoCBz4butIGThu6VuZyBtw6B1IHPhuq9jIGtow6FjIG5oYXUgY2hvIHThu6tuZyBuaMOjbiBoaeG7h3UgKGBmaWxsID0gQnJhbmRzYCkuDQo0LiAgSMOgbSBgZ2VvbV9jb2woKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgduG6vSBjw6FjIGPhu5l0Lg0KNS4gIEjDoG0gYGNvb3JkX3BvbGFyKCd5JylgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGNodXnhu4NuIMSR4buVaSBiaeG7g3UgxJHhu5Mgc2FuZyBk4bqhbmcgxJHhu5NuZyB0w6JtLg0KNi4gIEjDoG0gYGdlb21fdGV4dCgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0aMOqbSBjaMO6IHRow61jaCBz4buRIGxp4buHdSBsw6puIGPDoWMgY+G7mXQuIFRow7RuZyBxdWEgdGhhbSBz4buRIGBsYWJlbCA9IG5gLCBjaMO6IHRow61jaCBz4bq9IGhp4buDbiB0aOG7iyBnacOhIHRy4buLIHPhu5EgbMaw4bujbmcgKGBuYCksIHbDoCB0aMO0bmcgcXVhIHRoYW0gc+G7kSBgcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSlgLCBjaMO6IHRow61jaCDEkcaw4bujYyBjxINuIGNo4buJbmggdGhlbyBjaGnhu4F1IGThu41jLg0KNy4gIEjDoG0gYHRoZW1lX3ZvaWQoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbG/huqFpIGLhu48gbuG7gW4gdsOgIGPDoWMgdGjDoG5oIHBo4bqnbiB0cmFuZyB0csOtIGtow6FjIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCDEkeG7k25nIHTDom0sIHRyb25nIMSRw7MgbeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHThu6tuZyBuaMOjbiBoaeG7h3UuIEPDoWMgY+G7mXQgxJHGsOG7o2Mgc+G6r3AgeOG6v3AgeHVuZyBxdWFuaCBt4buZdCB0cuG7pWMgdHLDsm4gdsOgIGPDsyB0aOG7gyBzbyBzw6FuaCBz4buxIGtow6FjIGJp4buHdCB24buBIHPhu5EgbMaw4bujbmcgZ2nhu69hIGPDoWMgbmjDo24gaGnhu4d1Lg0KDQpgYGB7cn0NCnMgJT4lIGdyb3VwX2J5KEJyYW5kcykgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0nJywgeSA9IG4sZmlsbCA9IEJyYW5kcykpICsNCiAgICBnZW9tX2NvbChjb2xvciA9ICdibGFjaycpICsNCiAgICBjb29yZF9wb2xhcigneScpICsNCiAgICBnZW9tX3RleHQoYWVzKHggPSAxLjMsIGxhYmVsID0gbikscG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSkgKw0KICAgIHRoZW1lX3ZvaWQoKQ0KYGBgDQoNClPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHRoZW8gbmjDo24gaGnhu4d1OiBDaMO6bmcgdGEgY8OzIHRo4buDIHjDoWMgxJHhu4tuaCDEkcaw4bujYyBuaMOjbiBoaeG7h3UgbuG7lWkgYuG6rXQgduG7m2kgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY2FvIGjGoW4gc28gduG7m2kgbmjhu69uZyBuaMOjbiBoaeG7h3Uga2jDoWMgbMOgIHRoxrDGoW5nIGhp4buHdSBTQU1TVU5HIHbhu5tpIHPhu5EgbMaw4bujbmcgNzE5LCB0aOG6pXAgbmjhuqV0IGzDoCB0aMawxqFuZyBoaeG7h3UgSVFPTyB24bubaSBz4buRIGzGsOG7o25nIGzDoCA1Lg0KDQojIyAqKjIuMTEgQmnhu4N1IMSR4buTIDExIC0gQmnhu4N1IMSR4buTIGPhu5l0IMSR4buTbmcgdMOibSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgU0FNU1VORyB0aGVvIGNoaeG6v3Qga2jhuqV1KioNCg0KQ8OidSBs4buHbmggdHLDqm4gc+G7rSBk4bulbmcg4buRbmcgZOG6q24gKGAlPiVgKSB2w6AgZ8OzaSBgZ2dwbG90MmAgxJHhu4MgduG6vSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgxJHhu5NuZyB0w6JtIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBTYW1zdW5nIHRoZW8gdOG7q25nIG5ow7NtIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIFNhdSDEkcOieSBsw6AgcGjDom4gdMOtY2gga+G6v3QgcXXhuqMgY+G7p2EgY8OidSBs4buHbmg6DQoNCjEuICBM4buNYyBk4buvIGxp4buHdTogQ8OidSBs4buHbmggYGZpbHRlcihCcmFuZHMgPT0gJ1NBTVNVTkcnKWAgc+G7rSBk4bulbmcgaMOgbSBgZmlsdGVyKClgIMSR4buDIGNo4buJIGzhuqV5IGThu68gbGnhu4d1IGPhu6dhIMSRaeG7h24gdGhv4bqhaSBTYW1zdW5nIChgQnJhbmRzID09ICdTQU1TVU5HJ2ApLCB2w6AgZ8OhbiBr4bq/dCBxdeG6oyBjaG8gYmnhur9uIGBzMmAuDQoyLiAgTmjDs20gZOG7ryBsaeG7h3U6IEPDonUgbOG7h25oIGBncm91cF9ieShncm91cClgIHPhu60gZOG7pW5nIGjDoG0gYGdyb3VwX2J5KClgIMSR4buDIG5ow7NtIGThu68gbGnhu4d1IHRoZW8gbmjDs20gKGBncm91cGApLg0KMy4gIFTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nOiBIw6BtIGBzdW1tYXJpc2UoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdMOtbmggc+G7kSBsxrDhu6NuZyAoYG5gKSBjaG8gbeG7l2kgbmjDs20uDQo0LiAgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgxJHhu5NuZyB0w6JtOiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKHLhu5duZykgdsOgIGdpw6EgdHLhu4sgeSAoc+G7kSBsxrDhu6NuZykgY+G7p2EgdOG7q25nIG5ow7NtLCB2w6Agc+G7rSBk4bulbmcgbcOgdSBz4bqvYyBraMOhYyBuaGF1IGNobyB04burbmcgbmjDs20gKGBmaWxsID0gZ3JvdXBgKS4NCjUuICBIw6BtIGBnZW9tX2NvbCgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB24bq9IGPDoWMgY+G7mXQuIFRoYW0gc+G7kSBgd2lkdGggPSAxYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgY2hp4buBdSBy4buZbmcgY+G7p2EgY8OhYyBj4buZdC4NCjYuICBIw6BtIGBjb29yZF9wb2xhcigneScpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBjaHV54buDbiDEkeG7lWkgYmnhu4N1IMSR4buTIHNhbmcgZOG6oW5nIMSR4buTbmcgdMOibS4NCjcuICBIw6BtIGBnZW9tX3RleHQoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdGjDqm0gY2jDuiB0aMOtY2ggc+G7kSBsaeG7h3UgbMOqbiBjw6FjIGPhu5l0LiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgbGFiZWwgPSBuYCwgY2jDuiB0aMOtY2ggc+G6vSBoaeG7g24gdGjhu4sgZ2nDoSB0cuG7iyBz4buRIGzGsOG7o25nIChgbmApLCB2w6AgdGjDtG5nIHF1YSB0aGFtIHPhu5EgYHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpYCwgY2jDuiB0aMOtY2ggxJHGsOG7o2MgY8SDbiBjaOG7iW5oIHRoZW8gY2hp4buBdSBk4buNYy4NCjguICBIw6BtIGB0aGVtZV92b2lkKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGxv4bqhaSBi4buPIG7hu4FuIHbDoCBjw6FjIHRow6BuaCBwaOG6p24gdHJhbmcgdHLDrSBraMOhYyBj4bunYSBiaeG7g3UgxJHhu5MuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgxJHhu5NuZyB0w6JtLCB0cm9uZyDEkcOzIG3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBTYW1zdW5nIHRoZW8gdOG7q25nIG5ow7NtLiBDw6FjIGPhu5l0IMSRxrDhu6NjIHPhuq9wIHjhur9wIHh1bmcgcXVhbmggbeG7mXQgdHLhu6VjIHRyw7JuIHbDoCBjw7MgdGjhu4Mgc28gc8Ohbmggc+G7sSBraMOhYyBiaeG7h3QgduG7gSBz4buRIGzGsOG7o25nIGdp4buvYSBjw6FjIG5ow7NtLg0KDQpgYGB7cn0NCnMyIDwtIHMgJT4lIGZpbHRlcihCcmFuZHMgPT0gJ1NBTVNVTkcnICkNCnMyICU+JSBncm91cF9ieShncm91cCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBncm91cCkpICsNCiAgICBnZW9tX2NvbChjb2xvciA9ICdibGFjaycsIHdpZHRoID0gMSkgKw0KICAgIGNvb3JkX3BvbGFyKCd5JykgKw0KICAgIGdlb21fdGV4dChhZXMoeCA9IDEuMywgbGFiZWwgPSBuKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpKSArDQogICAgdGhlbWVfdm9pZCgpDQpgYGANCg0KIyMgKioyLjEyIEJp4buDdSDEkeG7kyAxMiAtIEJp4buDdSDEkeG7kyDEkWnhu4NtIHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgYsOhbiBraMOhY2ggaMOgbmcgdsOgIGdpw6EgbmnDqm0geeG6v3QqKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyDEkWnhu4NtIHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgYsOhbiBraMOhY2ggaMOgbmcgdsOgIGdpw6EgbmnDqm0geeG6v3QgY+G7p2EgxJFp4buHbiB0aG/huqFpIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgVuG6vSBiaeG7g3UgxJHhu5MgxJFp4buDbTogSMOgbSBgZ2dwbG90KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIG3hu5l0IGtodW5nIGJp4buDdSDEkeG7ky4gVGjDtG5nIHF1YSB0aGFtIHPhu5EgYGFlcygpYCwgYmnhu4N1IMSR4buTIGNo4buJIMSR4buLbmggZ2nDoSB0cuG7iyB4IChnacOhIGLDoW4ga2jDoWNoIGjDoG5nKSB2w6AgZ2nDoSB0cuG7iyB5IChnacOhIG5pw6ptIHnhur90KSBj4bunYSB04burbmcgxJFp4buDbS4NCjIuICBIw6BtIGBnZW9tX3BvaW50KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gY8OhYyDEkWnhu4NtIHRyw6puIGJp4buDdSDEkeG7kywgYmnhu4N1IHRo4buLIG3hu5dpIMSRaeG7g20gZOG7ryBsaeG7h3UuDQozLiAgSMOgbSBgeGxhYigpYCB2w6AgYHlsYWIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgdMawxqFuZyDhu6luZywgZ2nDunAgZGnhu4VuIGdp4bqjaSDDvSBuZ2jEqWEgY+G7p2EgY8OhYyB0cuG7pWMuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgxJFp4buDbSwgdHJvbmcgxJHDsyBt4buXaSDEkWnhu4NtIGJp4buDdSB0aOG7iyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgYsOhbiBraMOhY2ggaMOgbmcgKHRy4bulYyB4KSB2w6AgZ2nDoSBuacOqbSB54bq/dCAodHLhu6VjIHkpIGPhu6dhIHThu6tuZyDEkWnhu4duIHRob+G6oWkuIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGhp4buDbiB0aOG7iyBwaMOibiBwaOG7kWkgdsOgIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGhhaSBiaeG6v24gZ2nDoSB0cuG7iy4NCg0KYGBge3J9DQpzICU+JSBnZ3Bsb3QoYWVzKHggPSBTZWxsaW5nLlByaWNlLCB5ID0gT3JpZ2luYWwuUHJpY2UpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHhsYWIoJ0dpw6EgYsOhbiBraMOhY2ggaMOgbmcnKSArIA0KICB5bGFiKCdHacOhIG5pw6ptIHnhur90JykNCmBgYA0KDQojIyAqKjIuMTMgQmnhu4N1IMSR4buTIDEzIC0gQmnhu4N1IMSR4buTIMSRaeG7g20gdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2Ega2jhuqMgbsSDbmcgbMawdSB0cuG7ryB0aMO0bmcgdGjGsOG7nW5nIHbDoCBraOG6oyBuxINuZyBsxrB1IHRy4buvIG7hu5lpIGLhu5kgY+G7p2EgxJFp4buHbiB0aG/huqFpKioNCg0KQ8OidSBs4buHbmggdHLDqm4gc+G7rSBk4bulbmcg4buRbmcgZOG6q24gKGAlPiVgKSB2w6AgZ8OzaSBgZ2dwbG90MmAgxJHhu4MgduG6vSBt4buZdCBiaeG7g3UgxJHhu5MgxJFp4buDbSB0aOG7gyBoaeG7h24gbeG7kWkgcXVhbiBo4buHIGdp4buvYSBraOG6oyBuxINuZyBsxrB1IHRy4buvIHRow7RuZyB0aMaw4budbmcgdsOgIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gbuG7mWkgYuG7mSBj4bunYSDEkWnhu4duIHRob+G6oWkgdOG7qyBi4buZIGThu68gbGnhu4d1ICJTbWFydHBob25lcyBTYWxlcyIgdHJvbmcgUiBNYXJrZG93bi4gRMaw4bubaSDEkcOieSBsw6AgcGjDom4gdMOtY2gga+G6v3QgcXXhuqMgY+G7p2EgY8OidSBs4buHbmg6DQoNCjEuICBW4bq9IGJp4buDdSDEkeG7kyDEkWnhu4NtOiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKGto4bqjIG7Eg25nIGzGsHUgdHLhu68gdGjDtG5nIHRoxrDhu51uZykgdsOgIGdpw6EgdHLhu4sgeSAoa2jhuqMgbsSDbmcgbMawdSB0cuG7ryBu4buZaSBi4buZKSBj4bunYSB04burbmcgxJFp4buDbS4NCjIuICBIw6BtIGBnZW9tX3BvaW50KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gY8OhYyDEkWnhu4NtIHRyw6puIGJp4buDdSDEkeG7kywgYmnhu4N1IHRo4buLIG3hu5dpIMSRaeG7g20gZOG7ryBsaeG7h3UuIFRoYW0gc+G7kSBgY29sb3IgPSAnbGlnaHRibHVlJ2AgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG3DoHUgc+G6r2MgY+G7p2EgY8OhYyDEkWnhu4NtIGzDoCBtw6B1IHhhbmggbmjhuqF0Lg0KMy4gIEjDoG0gYGdlb21fc21vb3RoKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gxJHGsOG7nW5nIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGThu7FhIHRyw6puIGThu68gbGnhu4d1LiBUaGFtIHPhu5EgYG1ldGhvZCA9ICdsbSdgIGNo4buJIMSR4buLbmggc+G7rSBk4bulbmcgcGjGsMahbmcgcGjDoXAgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgsIHbDoCBgY29sb3IgPSAnZ3JlZW4nYCDEkeG6t3QgbcOgdSBz4bqvYyBj4bunYSDEkcaw4budbmcgaOG7k2kgcXV5IGzDoCBtw6B1IHhhbmggbMOhIGPDonkuDQo0LiAgSMOgbSBgeGxhYigpYCB2w6AgYHlsYWIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgdMawxqFuZyDhu6luZywgZ2nDunAgZGnhu4VuIGdp4bqjaSDDvSBuZ2jEqWEgY+G7p2EgY8OhYyB0cuG7pWMuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgxJFp4buDbSwgdHJvbmcgxJHDsyBt4buXaSDEkWnhu4NtIGJp4buDdSB0aOG7iyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gdGjDtG5nIHRoxrDhu51uZyAodHLhu6VjIHgpIHbDoCBraOG6oyBuxINuZyBsxrB1IHRy4buvIG7hu5lpIGLhu5kgKHRy4bulYyB5KSBj4bunYSB04burbmcgxJFp4buHbiB0aG/huqFpLiBDw6FjIMSRaeG7g20gxJHGsOG7o2MgaGnhu4NuIHRo4buLIHbhu5tpIG3DoHUgc+G6r2MgeGFuaCBuaOG6oXQsIHbDoCDEkcaw4budbmcgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHGsOG7o2MgduG6vSDEkeG7gyBiaeG7g3UgdGjhu4sgeHUgaMaw4bubbmcgdOG7lW5nIHF1w6F0IGPhu6dhIGThu68gbGnhu4d1LiBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBwaMOibiB0w61jaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSBoYWkgYmnhur9uIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gdsOgIHjDoWMgxJHhu4tuaCB4dSBoxrDhu5tuZyBjaHVuZy4NCg0KYGBge3J9DQpzICU+JSBnZ3Bsb3QoYWVzKHggPSBNZW1vcnksIHkgPSBTdG9yYWdlKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0nbGlnaHRibHVlJykgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBjb2xvciA9ICdncmVlbicpICsNCiAgeGxhYignS2jhuqMgbsSDbmcgbMawdSB0cuG7ryB0aMO0bmcgdGjGsOG7nW5nJykgKyANCiAgeWxhYignS2jhuqMgbsSDbmcgbMawdSB0cuG7ryBu4buZaSBi4buZJykNCmBgYA0KDQojIyAqKjIuMTQgQmnhu4N1IMSR4buTIDE0IC0gQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gcGjDom4gYuG7kSBnacOhIGLDoW4ga2jDoWNoIGjDoG5nIGPhu6dhIMSRaeG7h24gdGhv4bqhaSB0aGVvIGto4bqjIG7Eg25nIGzGsHUgdHLhu68qKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyBoaXN0b2dyYW0gdGjhu4MgaGnhu4duIHBow6JuIGLhu5EgZ2nDoSBiw6FuIGtow6FjaCBow6BuZyBj4bunYSDEkWnhu4duIHRob+G6oWkgdGhlbyBraOG6oyBuxINuZyBsxrB1IHRy4buvIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgVuG6vSBiaeG7g3UgxJHhu5MgaGlzdG9ncmFtOiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKGdpw6EgYsOhbiBraMOhY2ggaMOgbmcpIHbDoCBz4butIGThu6VuZyBtw6B1IHPhuq9jIGtow6FjIG5oYXUgY2hvIHThu6tuZyBraG/huqNuZyBnacOhIGThu7FhIHRyw6puIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gKGBmaWxsID0gTWVtb3J5YCkuDQoyLiAgSMOgbSBgZ2VvbV9oaXN0b2dyYW0oKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgduG6vSBoaXN0b2dyYW0uIFRoYW0gc+G7kSBgYmlud2lkdGggPSA2MDAwYCB4w6FjIMSR4buLbmggxJHhu5kgcuG7mW5nIGPhu6dhIGPDoWMga2hv4bqjbmcgZ2nDoSwgdHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHkgbMOgIDYwMDAuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgaGlzdG9ncmFtLCB0cm9uZyDEkcOzIHRy4bulYyB4IGJp4buDdSB0aOG7iyBnacOhIGLDoW4ga2jDoWNoIGjDoG5nIHbDoCB0cuG7pWMgeSBiaeG7g3UgdGjhu4sgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdHJvbmcgdOG7q25nIGtob+G6o25nIGdpw6EuIEPDoWMga2hv4bqjbmcgZ2nDoSBjw7MgbcOgdSBz4bqvYyBraMOhYyBuaGF1IGThu7FhIHRyw6puIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gY+G7p2EgxJFp4buHbiB0aG/huqFpLiBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBwaMOibiB0w61jaCBwaMOibiBwaOG7kWkgZ2nDoSBiw6FuIGtow6FjaCBow6BuZyB2w6AgbeG7kWkgbGnDqm4gaOG7hyB24bubaSBraOG6oyBuxINuZyBsxrB1IHRy4buvLg0KDQpgYGB7cn0NCnMgJT4lIGdncGxvdChhZXMoeCA9IFNlbGxpbmcuUHJpY2UsIGZpbGwgPSBNZW1vcnkpKSArDQogZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA2MDAwKQ0KYGBgDQoNCiMjICoqMi4xNSBCaeG7g3UgxJHhu5MgMTUgLSBCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgKGRlbnNpdHkgcGxvdCkgdGjhu4MgaGnhu4duIHBow6JuIHBo4buRaSBnacOhIGLDoW4gY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgdOG7qyBoYWkgdGjGsMahbmcgaGnhu4d1IFNBTVNVTkcgdsOgIE9QUE8qKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSAoZGVuc2l0eSBwbG90KSB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIGdpw6EgYsOhbiBj4bunYSBjw6FjIMSRaeG7h24gdGhv4bqhaSB04burIGhhaSB0aMawxqFuZyBoaeG7h3UgU0FNU1VORyB2w6AgT1BQTyB04burIGLhu5kgZOG7ryBsaeG7h3UgIlNtYXJ0cGhvbmVzIFNhbGVzIiB0cm9uZyBSIE1hcmtkb3duLiBExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBjw6J1IGzhu4duaDoNCg0KMS4gIEzhu41jIGThu68gbGnhu4d1OiBIw6BtIGBmaWx0ZXIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbOG7jWMgY8OhYyBkw7JuZyBk4buvIGxp4buHdSBjaOG7iSB04burIHRoxrDGoW5nIGhp4buHdSBTQU1TVU5HIGhv4bq3YyBPUFBPIChgQnJhbmRzID09ICdTQU1TVU5HJyB8IEJyYW5kcyA9PSAnT1BQTydgKS4NCjIuICBW4bq9IGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mTogSMOgbSBgZ2dwbG90KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIG3hu5l0IGtodW5nIGJp4buDdSDEkeG7ky4gVGjDtG5nIHF1YSB0aGFtIHPhu5EgYGFlcygpYCwgYmnhu4N1IMSR4buTIGNo4buJIMSR4buLbmggZ2nDoSB0cuG7iyB4IChnacOhIGLDoW4pIHbDoCBz4butIGThu6VuZyBtw6B1IHPhuq9jIGtow6FjIG5oYXUgY2hvIHThu6tuZyB0aMawxqFuZyBoaeG7h3UgKGBmaWxsID0gQnJhbmRzYCkuDQozLiAgSMOgbSBgZ2VvbV9kZW5zaXR5KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gYmnhu4N1IMSR4buTIG3huq10IMSR4buZIGThu7FhIHRyw6puIGThu68gbGnhu4d1LiBCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgdGjhu4MgaGnhu4duIHBow6JuIHBo4buRaSB4w6FjIHN14bqldCBj4bunYSBnacOhIGLDoW4gY2hvIHThu6tuZyB0aMawxqFuZyBoaeG7h3UuDQo0LiAgSMOgbSBgbGFicygpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoYHRpdGxlID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZ2nDoSBiw6FuIGPhu6dhIFNBTVNVTkcgdsOgIE9QUE8iYCkgdsOgIG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgKGB4ID0gJ0dpw6EgYsOhbicsIHkgPSAnVOG7tyB0cuG7jW5nJ2ApLg0KDQpL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIG3huq10IMSR4buZLCB0cm9uZyDEkcOzIHRy4bulYyB4IGJp4buDdSB0aOG7iyBnacOhIGLDoW4gdsOgIHRy4bulYyB5IGJp4buDdSB0aOG7iyB04bu3IHRy4buNbmcgKHjDoWMgc3XhuqV0KSBj4bunYSBnacOhIGLDoW4uIEPDoWMgxJHGsOG7nW5nIG3huq10IMSR4buZIGtow6FjIG5oYXUgdMawxqFuZyDhu6luZyB24bubaSBoYWkgdGjGsMahbmcgaGnhu4d1IFNBTVNVTkcgdsOgIE9QUE8uIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHNvIHPDoW5oIHBow6JuIHBo4buRaSBnacOhIGLDoW4gZ2nhu69hIGhhaSB0aMawxqFuZyBoaeG7h3UgdsOgIHBow6JuIHTDrWNoIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIGdpw6EgY+G6oy4NCg0KYGBge3J9DQpzICU+JSBmaWx0ZXIoQnJhbmRzPT0gJ1NBTVNVTkcnIHwgQnJhbmRzPT0gJ09QUE8nKSAlPiUNCiAgZ2dwbG90KGFlcyh4PVNlbGxpbmcuUHJpY2UsIGZpbGwgPSBCcmFuZHMpKSArDQogIGdlb21fZGVuc2l0eSgpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGdpw6EgYsOhbiBj4bunYSBTQU1TVU5HIHbDoCBPUFBPIikgKw0KICBsYWJzKHggPSAnR2nDoSBiw6FuJywgeSA9ICdU4bu3IHRy4buNbmcnKQ0KYGBgDQoNCiMjICoqMi4xNiBCaeG7g3UgxJHhu5MgMTYgLSBCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSAoZnJlcXVlbmN5IHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBt4bupYyBnacOhIGfhu5FjIGPhu6dhIGPDoWMgxJFp4buHbiB0aG/huqFpIHThu6sgaGFpIHRoxrDGoW5nIGhp4buHdSBBcHBsZSB2w6AgT1BQTyoqIA0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyB04bqnbiBz4buRIChmcmVxdWVuY3kgcGxvdCkgdGjhu4MgaGnhu4duIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBjw6FjIG3hu6ljIGdpw6EgZ+G7kWMgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgdOG7qyBoYWkgdGjGsMahbmcgaGnhu4d1IEFwcGxlIHbDoCBPUFBPIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgTOG7jWMgZOG7ryBsaeG7h3U6IEjDoG0gYGZpbHRlcigpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBs4buNYyBjw6FjIGTDsm5nIGThu68gbGnhu4d1IGNo4buJIHThu6sgdGjGsMahbmcgaGnhu4d1IEFwcGxlIGhv4bq3YyBPUFBPIChgQnJhbmRzID09ICdBcHBsZScgfCBCcmFuZHMgPT0gJ09QUE8nYCkuDQoNCjIuICBW4bq9IGJp4buDdSDEkeG7kyB04bqnbiBz4buROiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKGdpw6EgZ+G7kWMpIHbDoCBz4butIGThu6VuZyBtw6B1IHPhuq9jIGtow6FjIG5oYXUgY2hvIHThu6tuZyB0aMawxqFuZyBoaeG7h3UgKGBjb2xvciA9IEJyYW5kc2ApLg0KDQozLiAgSMOgbSBgZ2VvbV9mcmVxcG9seSgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB24bq9IMSRxrDhu51uZyB04bqnbiBz4buRIGThu7FhIHRyw6puIGThu68gbGnhu4d1LiDEkMaw4budbmcgdOG6p24gc+G7kSB0aOG7gyBoaeG7h24gc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIHThu6tuZyBt4bupYyBnacOhIGfhu5FjLg0KDQo0LiAgIEjDoG0gXGBsYWJzKClcYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoXGB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSBnacOhIGfhu5FjIGPhu6dhIEFwcGxlIHbDoCBPUFBPIlxgKSB2w6AgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB0cuG7pWMgeSAoXGB4ID0gJ0dpw6EgZ+G7kWMnLCB5ID0gJ1ThuqduIHPhu5EgeHXhuqV0IGhp4buHbidcYCkuDQoNCiAgICBL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIHThuqduIHPhu5EsIHRyb25nIMSRw7MgdHLhu6VjIHggYmnhu4N1IHRo4buLIGdpw6EgZ+G7kWMgdsOgIHRy4bulYyB5IGJp4buDdSB0aOG7iyBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgbeG7l2kgbeG7qWMgZ2nDoS4gQ8OhYyDEkcaw4budbmcgdOG6p24gc+G7kSBraMOhYyBuaGF1IHTGsMahbmcg4bupbmcgduG7m2kgaGFpIHRoxrDGoW5nIGhp4buHdSBBcHBsZSB2w6AgT1BQTy4gQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgcGjDom4gdMOtY2ggcGjDom4gcGjhu5FpIGdpw6EgZ+G7kWMgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgdOG7qyBoYWkgdGjGsMahbmcgaGnhu4d1IHbDoCBzbyBzw6FuaCB04bqnbiBz4buRIHh14bqldCBoaeG7h24gZ2nhu69hIGNow7puZy4NCg0KYGBge3J9DQpzICU+JSBmaWx0ZXIoQnJhbmRzPT0gJ0FwcGxlJyB8IEJyYW5kcz09ICdPUFBPJykgJT4lDQogIGdncGxvdChhZXMoeD1PcmlnaW5hbC5QcmljZSwgY29sb3I9QnJhbmRzKSkgKyANCiAgZ2VvbV9mcmVxcG9seShsaW5ld2lkdGggPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHPhu5EgZ2nDoSBn4buRYyBj4bunYSBBcHBsZSB2w6AgT1BQTyIpICsNCiAgbGFicyh4ID0gJ0dpw6EgZ+G7kWMnLCB5ID0gJ1ThuqduIHPhu5EgeHXhuqV0IGhp4buHbicpDQpgYGANCg0KIyMgKioyLjE3IEJp4buDdSDEkeG7kyAxNyAtIEJp4buDdSDEkeG7kyBj4buZdCAoY29sdW1uIGNoYXJ0KSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY+G7p2EgaGFpIHRoxrDGoW5nIGhp4buHdSB2aXZvIHbDoCByZWFsbWUqKiANCg0KQ8OidSBs4buHbmggdHLDqm4gc+G7rSBk4bulbmcg4buRbmcgZOG6q24gKGAlPiVgKSB2w6AgZ8OzaSBgZ2dwbG90MmAgxJHhu4MgduG6vSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgKGNvbHVtbiBjaGFydCkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGPhu6dhIGhhaSB0aMawxqFuZyBoaeG7h3Ugdml2byB2w6AgcmVhbG1lIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQ6IEjDoG0gYGdncGxvdCgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBt4buZdCBraHVuZyBiaeG7g3UgxJHhu5MuIFRow7RuZyBxdWEgdGhhbSBz4buRIGBhZXMoKWAsIGJp4buDdSDEkeG7kyBjaOG7iSDEkeG7i25oIHRy4bulYyB4IChow6NuZyDEkWnhu4duIHRob+G6oWkpIHbDoCBraMO0bmcgY8OzIHRow7RuZyB0aW4geSAoYHkgPSAnJ2ApLg0KMi4gIEjDoG0gYGdlb21fY29sKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gY8OhYyBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkuIEPhu6UgdGjhu4MsIGhhaSBs4buHbmggYGdlb21fY29sKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nLCBt4buXaSBs4buHbmggdMawxqFuZyDhu6luZyB24bubaSBt4buZdCB0aMawxqFuZyBoaeG7h3UuIEJp4buDdSDEkeG7kyBz4butIGThu6VuZyBk4buvIGxp4buHdSDEkcOjIMSRxrDhu6NjIGzhu41jIHRow7RuZyBxdWEgaMOgbSBgZmlsdGVyKClgIMSR4buDIGNo4buJIGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSB2aXZvIHbDoCByZWFsbWUuIFRoYW0gc+G7kSBgZmlsbGAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhu4tuaCBuZ2jEqWEgbcOgdSBz4bqvYyBjaG8gY+G7mXQgY+G7p2EgdOG7q25nIHRoxrDGoW5nIGhp4buHdS4NCjMuICBIw6BtIGBsYWJzKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSR4bq3dCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTIChgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSB2aXZvIHbDoCByZWFsbWUiYCkgdsOgIG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgKGB4ID0gJ0jDo25nIMSRaeG7h24gdGhv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZydgKS4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCwgdHJvbmcgxJHDsyB0cuG7pWMgeCBiaeG7g3UgdGjhu4sgY8OhYyB0aMawxqFuZyBoaeG7h3UgxJFp4buHbiB0aG/huqFpIHbDoCB0cuG7pWMgeSBiaeG7g3UgdGjhu4sgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdMawxqFuZyDhu6luZy4gQ+G7mXQgbcOgdSDEkeG7jyB0xrDGoW5nIOG7qW5nIHbhu5tpIHRoxrDGoW5nIGhp4buHdSB2aXZvIHbDoCBj4buZdCBtw6B1IHbDoG5nIHTGsMahbmcg4bupbmcgduG7m2kgdGjGsMahbmcgaGnhu4d1IHJlYWxtZS4gQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgc28gc8Ohbmggc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgZ2nhu69hIGhhaSB0aMawxqFuZyBoaeG7h3UgdsOgIHBow6JuIHTDrWNoIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIHPhu5EgbMaw4bujbmcuDQoNCmBgYHtyfQ0KcyAlPiUgZ2dwbG90KGFlcyh4PSBCcmFuZHMsIHk9ICcnKSkgKw0KICBnZW9tX2NvbChkYXRhID0gcyAlPiUgZmlsdGVyKEJyYW5kcyA9PSAndml2bycpLCBmaWxsID0gJ3JlZCcpICsNCiAgZ2VvbV9jb2woZGF0YSA9IHMgJT4lIGZpbHRlcihCcmFuZHMgPT0gJ3JlYWxtZScpLCBmaWxsID0gJ3llbGxvdycpICsNCiAgbGFicyh0aXRsZSA9ICIgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSB2aXZvIHbDoCByZWFsbWUiKSArDQogIGxhYnMoeCA9ICdIw6NuZyDEkWnhu4duIHRob+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiMjICoqMi4xOCBCaeG7g3UgxJHhu5MgMTggLSBCaeG7g3UgxJHhu5MgxJFp4buDbSAoc2NhdHRlciBwbG90KSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY+G7p2EgbeG7l2kgaMOjbmcgduG7m2kgxJFp4buDbSBz4buRIFJhdGluZyBs4bubbiBoxqFuIDQqKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyDEkWnhu4NtIChzY2F0dGVyIHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSBt4buXaSBow6NuZyB24bubaSDEkWnhu4NtIHPhu5EgUmF0aW5nIGzhu5tuIGjGoW4gNCB04burIGLhu5kgZOG7ryBsaeG7h3UgIlNtYXJ0cGhvbmVzIFNhbGVzIiB0cm9uZyBSIE1hcmtkb3duLiBExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBjw6J1IGzhu4duaDoNCg0KMS4gIEzhu41jIGThu68gbGnhu4d1OiBIw6BtIGBmaWx0ZXIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbOG7jWMgY8OhYyBkw7JuZyBk4buvIGxp4buHdSBjaOG7iSBjw7MgUmF0aW5nIGzhu5tuIGjGoW4gNCAoYFJhdGluZyA+IDRgKS4NCjIuICBW4bq9IGJp4buDdSDEkeG7kyDEkWnhu4NtOiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCB0cuG7pWMgeCAoaMOjbmcpIHbDoCB0cuG7pWMgeSAoUmF0aW5nKS4NCjMuICBIw6BtIGBnZW9tX3BvaW50KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gY8OhYyDEkWnhu4NtIHRyw6puIGJp4buDdSDEkeG7kywgbeG7l2kgxJFp4buDbSB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5l0IGjDo25nIMSRaeG7h24gdGhv4bqhaS4gQ8OhYyDEkWnhu4NtIMSRxrDhu6NjIG3DoHUgxJHhu48gKGBjb2xvciA9ICdyZWQnYCkuDQo0LiAgSMOgbSBgbGFicygpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoYHRpdGxlID0gIkJp4buDdSDEkeG7kyBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSBow6NuZyBSYXRpbmcgdHLDqm4gNCJgKSB2w6AgbmjDo24gY2hvIHRy4bulYyB4IChgeCA9ICdIw6NuZydgKSB2w6AgdHLhu6VjIHkgKGB5ID0gJ1JhdGluZydgKS4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyDEkWnhu4NtLCB0cm9uZyDEkcOzIHRy4bulYyB4IGJp4buDdSB0aOG7iyBjw6FjIGjDo25nIMSRaeG7h24gdGhv4bqhaSB2w6AgdHLhu6VjIHkgYmnhu4N1IHRo4buLIMSRaeG7g20gc+G7kSBSYXRpbmcgdMawxqFuZyDhu6luZy4gTeG7l2kgxJFp4buDbSB0csOqbiBiaeG7g3UgxJHhu5MgdMawxqFuZyDhu6luZyB24bubaSBt4buZdCBow6NuZyDEkWnhu4duIHRob+G6oWkgdsOgIG3DoHUgxJHhu48uIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSBt4buXaSBow6NuZyBjw7MgUmF0aW5nIGzhu5tuIGjGoW4gNCB2w6AgcGjDom4gdMOtY2ggbeG7qWMgxJHhu5kgxJHDoW5oIGdpw6EgY+G7p2EgdOG7q25nIGjDo25nLg0KDQpgYGB7cn0NCnMgJT4lIGZpbHRlcihSYXRpbmc+NCkgJT4lDQogIGdncGxvdChhZXMoeD1CcmFuZHMsIHk9UmF0aW5nKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gJ3JlZCcpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5Mgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY+G7p2EgaMOjbmcgUmF0aW5nIHRyw6puIDQiKSArDQogIGxhYnMoeCA9ICdIw6NuZycsICdSYXRpbmcnKQ0KYGBgDQoNCiMjICoqMi4xOSBCaeG7g3UgxJHhu5MgMTkgLSBCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSAoZnJlcXVlbmN5IHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBt4bupYyBnacOhIGfhu5FjIGPhu6dhIGPDoWMgxJFp4buHbiB0aG/huqFpIGPDsyBtw6B1IMSRZW4gdsOgIHRy4bqvbmcqKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyB04bqnbiBz4buRIChmcmVxdWVuY3kgcGxvdCkgdGjhu4MgaGnhu4duIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBjw6FjIG3hu6ljIGdpw6EgZ+G7kWMgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIG3DoHUgxJFlbiB2w6AgdHLhuq9uZyB04burIGLhu5kgZOG7ryBsaeG7h3UgIlNtYXJ0cGhvbmVzIFNhbGVzIiB0cm9uZyBSIE1hcmtkb3duLiBExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBjw6J1IGzhu4duaDoNCg0KMS4gIEzhu41jIGThu68gbGnhu4d1OiBIw6BtIGBmaWx0ZXIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbOG7jWMgY8OhYyBkw7JuZyBk4buvIGxp4buHdSBjaOG7iSB04burIGPDoWMgxJFp4buHbiB0aG/huqFpIGPDsyBtw6B1IMSRZW4gaG/hurdjIHRy4bqvbmcgKGBDb2xvcnMgPT0gJ1doaXRlJyB8IENvbG9ycyA9PSAnQmxhY2snYCkuDQoyLiAgVuG6vSBiaeG7g3UgxJHhu5MgdOG6p24gc+G7kTogSMOgbSBgZ2dwbG90KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIG3hu5l0IGtodW5nIGJp4buDdSDEkeG7ky4gVGjDtG5nIHF1YSB0aGFtIHPhu5EgYGFlcygpYCwgYmnhu4N1IMSR4buTIGNo4buJIMSR4buLbmggZ2nDoSB0cuG7iyB4IChnacOhIGfhu5FjKSB2w6Agc+G7rSBk4bulbmcgbcOgdSBz4bqvYyBraMOhYyBuaGF1IGNobyB04burbmcgbcOgdSAoYGNvbG9yID0gQ29sb3JzYCkuDQozLiAgSMOgbSBgZ2VvbV9mcmVxcG9seSgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB24bq9IMSRxrDhu51uZyB04bqnbiBz4buRIGThu7FhIHRyw6puIGThu68gbGnhu4d1LiDEkMaw4budbmcgdOG6p24gc+G7kSB0aOG7gyBoaeG7h24gc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIHThu6tuZyBt4bupYyBnacOhIGfhu5FjLg0KNC4gIEjDoG0gYGxhYnMoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IHRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MgKGB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSBnacOhIGfhu5FjIHRoZW8gbcOgdSDEkWVuIHbDoCB0cuG6r25nImApIHbDoCBuaMOjbiBjaG8gdHLhu6VjIHggdsOgIHRy4bulYyB5IChgeCA9ICdHacOhIGfhu5FjJywgeSA9ICdU4bqnbiBz4buRIHh14bqldCBoaeG7h24nYCkuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgdOG6p24gc+G7kSwgdHJvbmcgxJHDsyB0cuG7pWMgeCBiaeG7g3UgdGjhu4sgZ2nDoSBn4buRYyB2w6AgdHLhu6VjIHkgYmnhu4N1IHRo4buLIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBt4buXaSBt4bupYyBnacOhLiBDw6FjIMSRxrDhu51uZyB04bqnbiBz4buRIGtow6FjIG5oYXUgdMawxqFuZyDhu6luZyB24bubaSBoYWkgbcOgdSDEkWVuIHbDoCB0cuG6r25nLiBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBwaMOibiB0w61jaCBwaMOibiBwaOG7kWkgZ2nDoSBn4buRYyBj4bunYSBjw6FjIMSRaeG7h24gdGhv4bqhaSBjw7MgbcOgdSDEkWVuIHbDoCB0cuG6r25nIHbDoCBzbyBzw6FuaCB04bqnbiBz4buRIHh14bqldCBoaeG7h24gZ2nhu69hIGNow7puZy4NCg0KYGBge3J9DQpzICU+JSBmaWx0ZXIoQ29sb3JzPT0gJ1doaXRlJyB8IENvbG9ycz09ICdCbGFjaycpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9T3JpZ2luYWwuUHJpY2UsIGNvbG9yPUNvbG9ycykpICsgDQogIGdlb21fZnJlcXBvbHkobGluZXdpZHRoID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBz4buRIGdpw6EgZ+G7kWMgdGhlbyBtw6B1IMSRZW4gdsOgIHRy4bqvbmciKSArDQogIGxhYnMoeCA9ICdHacOhIGfhu5FjJywgeSA9ICdU4bqnbiBz4buRIHh14bqldCBoaeG7h24nKQ0KYGBgDQoNCiMjICoqMi4yMCBCaeG7g3UgxJHhu5MgMjAgLSBCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSAoZnJlcXVlbmN5IHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBt4bupYyDEkcOhbmggZ2nDoSBz4buxIGjDoGkgbMOybmcgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIGLhu5kgbmjhu5sgUkFNIGzDoCA4IEdCIHbDoCA2IEdCKioNCg0KQ8OidSBs4buHbmggdHLDqm4gc+G7rSBk4bulbmcg4buRbmcgZOG6q24gKGAlPiVgKSB2w6AgZ8OzaSBgZ2dwbG90MmAgxJHhu4MgduG6vSBt4buZdCBiaeG7g3UgxJHhu5MgdOG6p24gc+G7kSAoZnJlcXVlbmN5IHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBt4bupYyDEkcOhbmggZ2nDoSBz4buxIGjDoGkgbMOybmcgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIGLhu5kgbmjhu5sgUkFNIGzDoCA4IEdCIHbDoCA2IEdCIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgTOG7jWMgZOG7ryBsaeG7h3U6IEjDoG0gYGZpbHRlcigpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBs4buNYyBjw6FjIGTDsm5nIGThu68gbGnhu4d1IGNo4buJIHThu6sgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIGLhu5kgbmjhu5sgUkFNIGzDoCA4IEdCIGhv4bq3YyA2IEdCIChgTWVtb3J5ID09ICc4IEdCJyB8IE1lbW9yeSA9PSAnNiBHQidgKS4NCjIuICBW4bq9IGJp4buDdSDEkeG7kyB04bqnbiBz4buROiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKMSRw6FuaCBnacOhIHPhu7EgaMOgaSBsw7JuZykgdsOgIHPhu60gZOG7pW5nIG3DoHUgc+G6r2Mga2jDoWMgbmhhdSBjaG8gdOG7q25nIGLhu5kgbmjhu5sgUkFNIChgY29sb3IgPSBNZW1vcnlgKS4NCjMuICBIw6BtIGBnZW9tX2ZyZXFwb2x5KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gxJHGsOG7nW5nIHThuqduIHPhu5EgZOG7sWEgdHLDqm4gZOG7ryBsaeG7h3UuIMSQxrDhu51uZyB04bqnbiBz4buRIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgdOG7q25nIG3hu6ljIMSRw6FuaCBnacOhIHPhu7EgaMOgaSBsw7JuZy4NCjQuICBIw6BtIGBsYWJzKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSR4bq3dCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTIChgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHPhu5EgZ2nDoSBn4buRYyB0aGVvIG3DoHUgxJFlbiB2w6AgdHLhuq9uZyJgKSB2w6AgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB0cuG7pWMgeSAoYHggPSAnU+G7sSBow6BpIGzDsm5nJywgeSA9ICdU4bqnbiBz4buRIHh14bqldCBoaeG7h24nYCkuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgdOG6p24gc+G7kSwgdHJvbmcgxJHDsyB0cuG7pWMgeCBiaeG7g3UgdGjhu4sgxJHDoW5oIGdpw6Egc+G7sSBow6BpIGzDsm5nIHbDoCB0cuG7pWMgeSBiaeG7g3UgdGjhu4sgc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIG3hu5dpIG3hu6ljIMSRw6FuaCBnacOhLiBDw6FjIMSRxrDhu51uZyB04bqnbiBz4buRIGtow6FjIG5oYXUgdMawxqFuZyDhu6luZyB24bubaSBoYWkgYuG7mSBuaOG7myBSQU0gbMOgIDggR0IgdsOgIDYgR0IuIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHBow6JuIHTDrWNoIHBow6JuIHBo4buRaSDEkcOhbmggZ2nDoSBz4buxIGjDoGkgbMOybmcgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIGLhu5kgbmjhu5sgUkFNIGtow6FjIG5oYXUgdsOgIHNvIHPDoW5oIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBnaeG7r2EgY2jDum5nLg0KDQpgYGB7cn0NCnMgJT4lIGZpbHRlcihNZW1vcnk9PSAnOCBHQicgfCBNZW1vcnk9PSAnNiBHQicpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9UmF0aW5nLCBjb2xvcj1NZW1vcnkpKSArIA0KICBnZW9tX2ZyZXFwb2x5KGxpbmV3aWR0aCA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSBnacOhIGfhu5FjIHRoZW8gbcOgdSDEkWVuIHbDoCB0cuG6r25nIikgKw0KICBsYWJzKHggPSAnU+G7sSBow6BpIGzDsm5nJywgeSA9ICdU4bqnbiBz4buRIHh14bqldCBoaeG7h24nKQ0KYGBgDQo=