Nội dung của Nhiệm vụ

  • Nhiệm vụ yêu cầu vẽ ít nhất 30 đồ thị dạng Bar chart

  • Bộ dữ liệu tiến hành thực hiện : Bộ dữ liệu diamonds trong package ggplot2

Tổng quan về Bộ dữ liệu diamonds

1. Nguồn gốc của Bộ dữ liệu

  • Bộ dữ liệu diamonds là một trong số các bộ dữ liệu của package ggplot2

  • Ta gán bộ dữ liệu gốc diamonds với tên là KC (viết tắt của Kim Cương)

  • Giới thiệu sơ về package ggplot2 :

    • ggplot2 là một package hỗ trợ visualization, ta có thể vẽ được các đồ thị dạng bar chart, density, pie,…

    • ggplot2 còn cho phép tùy chỉnh màu sắc, kích cỡ, theme, … để đồ thị được đẹp hơn

  • Cấu trúc của ggplot2 được chia làm 2 phần :

    • ggplot(): Phần này quy định đồ thị sẽ sử dụng Data nào (Data phải có dạng data.frame)

    • geom_(aes(x,y)) : Phần này quy định kiểu đồ thị và Các trục tọa độ từ dữ liệu

    • Nếu chỉ có ggplot() mà không thêm geom_() : thì chỉ nhận được Background mà không có đồ thị

    • Trong geom_() phải khai báo thêm trục tọa độ vào các arguments x và y của aes()

library(ggplot2)
data(package = 'ggplot2')
KC <- diamonds

2. Một số thông tin về Bộ dữ liệu

Từ tên của bộ dữ liệu là diamonds, cũng đủ cho thấy dữ liệu bên trong cung cấp nội dung và thông số về Kim Cương

  • Bộ dữ liệu KC bao gồm : 53,940 quan sát10 biến

    • Mỗi quan sát (mỗi hàng) đại diện cho một viên kim cương khác nhau và có tổng 53,940 viên kim cương

    • Mỗi viên kim cương đó đều có các thông số khác nhau về màu sắc, kích thước,… và có tổng 10 đặc tính

dim(KC)
## [1] 53940    10

  • Với 10 biến tương ứng, mỗi biến cung cấp các đặc tính/ tính chất của kim cương, bao gồm như sau :

    1. Carat - Trọng lượng : Đơn vị dùng để đo khối lượng của đá quý nói chung (1 carat = 200 milligram = 0,2 gram)

    2. Cut - Giác cắt : Quá trình chế tác viên kim cương từ dạng thô thành hoàn thiện và có nhiều kiểu Giác cắt khác nhau

    3. Color - Màu sắc : Màu sắc của viên kim cương

    4. Clarity - Độ trong/ Độ tinh khiết : Đánh giá dựa vào số lượng các vết trầy xước, màu sắc vết gãy,…khi nhìn dưới kính lúp 10x

    5. Depth - Độ sâu : Thuật ngữ thể hiện độ sâu của viên kim cương so với đường kính của nó (tính bằng %)

    6. Table - Bề mặt : Mỗi viên kim cương đều có một bề mặt phẳng ở trên đỉnh, đó chính là Diamond Table (tính bằng %)

    7. Price - Giá thành : Dựa trên các đặc tính đã nêu trên, tất cả sẽ quyết định giá trị của một viên kiêm cương là bao nhiêu

    8.9.10. Gía trị x - y - z : Lần lượt là Chiều dài - Chiều rộng - Độ sâu (tính bằng mm) của viên kim cương

str(KC)
## tibble [53,940 × 10] (S3: tbl_df/tbl/data.frame)
##  $ carat  : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
##  $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
##  $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
##  $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
##  $ depth  : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
##  $ table  : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
##  $ price  : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
##  $ x      : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
##  $ y      : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
##  $ z      : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...

Ngoài ra còn có các thông tin khác :

library(skimr)
skim(KC)
Data summary
Name KC
Number of rows 53940
Number of columns 10
_______________________
Column type frequency:
factor 3
numeric 7
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
cut 0 1 TRUE 5 Ide: 21551, Pre: 13791, Ver: 12082, Goo: 4906
color 0 1 TRUE 7 G: 11292, E: 9797, F: 9542, H: 8304
clarity 0 1 TRUE 8 SI1: 13065, VS2: 12258, SI2: 9194, VS1: 8171

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
carat 0 1 0.80 0.47 0.2 0.40 0.70 1.04 5.01 ▇▂▁▁▁
depth 0 1 61.75 1.43 43.0 61.00 61.80 62.50 79.00 ▁▁▇▁▁
table 0 1 57.46 2.23 43.0 56.00 57.00 59.00 95.00 ▁▇▁▁▁
price 0 1 3932.80 3989.44 326.0 950.00 2401.00 5324.25 18823.00 ▇▂▁▁▁
x 0 1 5.73 1.12 0.0 4.71 5.70 6.54 10.74 ▁▁▇▃▁
y 0 1 5.73 1.14 0.0 4.72 5.71 6.54 58.90 ▇▁▁▁▁
z 0 1 3.54 0.71 0.0 2.91 3.53 4.04 31.80 ▇▁▁▁▁

Các Đặc tính của Kim cương

Để đánh giá chất lượng cũng như giá thành một viên kim cương, các chuyên gia thường dựa trên 4 tiêu chí - gọi là tiêu chí 4C

  • GIA đã tạo ra tiêu chuẩn này đầu tiên và hiện được chấp nhận trên toàn cầu

  • Tiêu chuẩn 4C gồm : Màu sắc Color - Độ tinh khiết Clarity - Giác cắt Cut - Trọng lượng Carat

Ta sẽ tiến hành phân tích và nhận xét từng đặc tính có trong bộ dữ liệu này


1. Carat - Trọng lượng

Trọng lượng carat của một viên kim cương được xác định bằng cách cân viên kim cương trên cân điện tử một cách chính xác

  • Trọng lượng carat thường được giữ 2 số thập phân cuối cùng (vd : 1.53, 1.00,…)

  • Trọng lượng chính xác là rất quan trọng, ảnh hưởng trực tiếp đến việc định giá

  • Nhưng chưa chắc viên kim cương nào có trọng lượng nặng hơn sẽ có giá cao hơn và ngược lại, trọng lượng chỉ là 1 trong các yếu tố để đánh giá mà thôi


Tóm tắt sơ lược

Đầu tiên, ta tóm tắt sơ lược về trọng lượng của các viên kim cương bằng cách :

Ta tiến hành cut hay gọi là chia 53,940 viên kim cương thành 5 nhóm theo trọng lượng như sau :

table(cut(KC$carat,5))
## 
## (0.195,1.16]  (1.16,2.12]  (2.12,3.09]  (3.09,4.05]  (4.05,5.01] 
##        43781         9478          667           11            3
KC$carat.c<- cut(KC$carat,5, labels = c('Rất nhẹ','Nhẹ','Vừa','Nặng','Rất nặng'))
table(KC$carat.c)
## 
##  Rất nhẹ      Nhẹ      Vừa     Nặng Rất nặng 
##    43781     9478      667       11        3

Ta đã chia thành 5 khoảng và trong mỗi khoảng trọng lượng carat đó có bao nhiêu viên kim cương

  • Bên cạnh đó, ta cũng đưa ra nhận xét trước tiên là các viên kim cương có trọng lượng càng cao thì càng ít dần

  • 5 nhóm được chia ra như sau :

    • Nhóm Rất nhẹ - có trọng lượng carat từ 0.19 đến 1.16, tổng 43,781 viên

    • Nhóm Nhẹ - có trọng lượng carat từ 1.16 đến 2.12, tổng 9,478 viên

    • Nhóm Vừa - có trọng lượng carat từ 2.12 đến 3.09, tổng 667 viên

    • Nhóm Nặng - có trọng lượng carat từ 3.09 đến 4.05, tổng 11 viên

    • Nhóm Rất nặng - có trọng lượng carat từ 4.05 đến 5.01, tổng 3 viên

Sau đó, ta tiến hành vẽ biểu đồ để thấy rõ hơn được sự khác biệt của mỗi nhóm trọng lượng carat


Biểu đồ thể hiện Trọng lượng

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
KC <- diamonds
KC1 <- KC %>% mutate(TLCarat = cut(carat,5, label = c('Rất nhẹ', 'Nhẹ','Vừa','Nặng','Rất nặng')))
KC1 %>% group_by(TLCarat) %>% summarise(n = n()) %>%
  ggplot(aes(TLCarat,n)) +
    geom_col(fill='blue') +
    labs(title = " Biểu đồ thể hiện nhóm theo Carat ") +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    labs(x = 'Trọng Lượng', y = 'Số lượng')

Nhận xét Trọng lượng 1

  • Trước tiên ta thấy lượng phân bổ của các viên kim cương theo các nhóm trọng lượng là không đồng đều

  • Cột Rất nhẹ chiếm số lượng nhiều nhất/ áp đảo nhất trong 5 cột

    • Với tổng là 43,781 viên trên tổng 53,940 viên kim cương, và các viên kim cương này có trọng lượng từ 0.195 đến 1.16

    • Điều này cho thấy các viên kim cương có trọng lượng rất nhẹ là chiếm đại đa số và dễ tìm thấy hơn

  • Kế tiếp là 2 cột Nhẹ và cột Vừa với số kim cương lần lượt là 9,478 và 667

    • Kim cương có trọng lượng Nhẹ và Vừa thì ít hơn hẳn so với Rất nhẹ

    • Số lượng kim cương Rất nhẹ gấp hơn 4 lần so với Rất nhẹ, và gấp 65 lần so với Vừa

    • Từ đó càng cho thấy sự đại trà của số lượng kim cương trọng lượng Rất nhẹ, cũng như sự ít của trọng lượng Nhẹ và Vừa

  • Kim cương ở cột Nặng chỉ có 11 viên và cột Rất nặng ở mức cực hiếm chỉ có 3 viên

    • Các viên kim cương ở 2 cột này có trọng lượng carat trên 3,09 carat, có thể xếp vào mục cực hiếm và khó tìm thấy

    • Nếu so cột Rất nhẹ và Rất nặng với nhau thì cột Rất nhẹ gấp hơn 14,000 lần


Bên cạnh đó, ta có thể chuyển cụ thể số lượng như trên thành % so với tổng số, để dễ dàng nhận xét hơn nữa

library(scales)
KC1 <- KC %>% mutate(TLCarat = cut(carat,5, label = c('Rất nhẹ', 'Nhẹ','Vừa','Nặng','Rất nặng')))
KC1 %>% group_by(TLCarat) %>% summarise(n = n()) %>%
  ggplot(aes(TLCarat,n)) +
    geom_col(fill='blue') +
    labs(title = " Biểu đồ thể hiện % thang đo Carat ") +
    theme_classic() +
    geom_text(aes(label = percent(n/length(KC$carat))),vjust = 0, color = 'black') +
    labs(x = 'Trọng Lượng', y = 'Số lượng')

Nhận xét Trọng lượng 2

  • Vẫn tương tự như nhận xét phía trên, cột Rất nhẹ với hơn 40,000 viên - chiếm tới hơn 80% trên 100%

  • Cột Nhẹ đứng thứ 2, sau cột Rất nhẹ với hơn 17% - khoảng cách với cột đứng nhất là hơn 60%

  • 3 cột Vừa - Nặng - Rất nặng với phần trăm rất nhỏ, thậm chí là có thể xếp vào mục cực cực hiếm - lần lượt là 1.2% - 0,02% - 0,006%

  • Khi dựa vào phần trăm, ta càng thấy rõ hơn độ đại trà cũng như độ hiếm của từng mức trọng lượng carat của các viên kim cương

  • Những viên kim cương có trọng lượng càng cao thì càng hiếm thấy, và với trọng lượng nhẹ thì ngược lại

Nhưng chỉ mỗi trọng lượng carat thôi thì chưa đủ chuẩn xác để đánh giá hết một viên kim cương, ta tiến hành xét tiếp đến tiêu chí thứ hai


2. Cut - Giác cắt

Giác cắt hay còn gọi là vết cắt của viên kim cương, được xem là độ chính xác về góc độ và tỉ lệ cắt xén của kim cương, khi đánh giá thì từng mặt được kiểm tra chi tiết và đo lường cụ thể

  • Đây được xem là yếu tố quan trọng nhất trong tiêu chí 4C

  • Vì nó có thể ảnh hưởng đến vẻ đẹp và độ lấp lánh bên ngoài của viên kim cương

  • 2 yếu tố Diamond Table và Diamond Depth cũng bao gồm trong phần Giác cắt này

Thang đo giác cắt Kim cương bao gồm :

  • Giác cắt Ideal - Lý tưởng

  • Giác cắt Premium/ Excellent - Tuyệt hảo

  • Giác cắt Very Good - Rất tốt

  • Giác cắt Good - Tốt

  • Giác cắt Fair - Trung bình

  • Giác cắt Poor - Kém


Tóm tắt sơ lược

Với tiêu chí về Giác cắt, ta thấy chất lượng kim cương được chia ra làm 5 nhóm (không bao gồm thang đo Poor như đã nêu), chỉ bao gồm :

table(KC$cut)
## 
##      Fair      Good Very Good   Premium     Ideal 
##      1610      4906     12082     13791     21551
  • 5 nhóm được chia theo chất lượng giác cắt gồm :

    • Nhóm Fair - mức trung bình, có tổng 1,610 viên

    • Nhóm Good - mức tốt, có tổng 4,906 viên

    • Nhóm Very Good - mức rất tốt, có tổng 12,082 viên

    • Nhóm Premium - mức tuyệt hảo, có tổng 13,791 viên

    • Nhóm Ideal - mức lý tưởng, có tổng 21,551 viên

Sau đó, ta tiến hành vẽ biểu đồ để thấy rõ hơn được sự khác biệt của mỗi nhóm


Biểu đồ thể hiện Giác cắt

KC %>% group_by(cut) %>% summarise(n = n()) %>%
  ggplot(aes(cut,n)) +
    geom_col(fill='yellow') +
    labs(title = " Biểu đồ thể hiện nhóm theo Cut ") +
    geom_text(aes(label = n),vjust = 2, color = 'red') +
    labs(x = 'Thang đo Cut', y = 'Số lượng')

Nhận xét Giác cắt 1

  • Trước tiên ta thấy được mức độ hoàn thiện giác cắt ở các viên kim cương là không đồng đều

  • Mức ta có thể thấy rõ ràng nhất là mức Ideal - chiếm số lượng nhiều nhất

    • Với tổng là 21,511 viên trên 53,940 viên kim cương, chiếm gần một nửa so với tổng số

    • Điều này cho thấy các viên kim cương được chế tác ở mức độ lý tưởng là khá nhiều

    • Được biết những viên kim cương Ideal Cut là rất hoàn hảo, đã được tính toán cẩn thận đến từng tỉ lệ góc cạnh

  • Kế tiếp là các 2 mức Premium và mức Very Good, với số kim cương lần lượt là 13,791 và 12,082 viên

    • Dù ít hơn so với mức lý tưởng, nhưng 2 mức này đều có lượng kim cương chiếm trung bình trên tổng số

    • Số lượng kim cương mức Ideal gấp hơn 1,5 lần so với mức Premium, và gấp 1,7 lần so với mức Very Good

    • Mức Premium và Very Good cũng chỉ chênh lệnh nhau khoảng 1,000 viên, cũng không phải là khoảng chênh lệnh quá lớn

    • Từ đó cho thấy, mức cách biệt của 3 thang đo đầu tiên cũng không quá rõ rệt

  • Kim cương ở mức Good và Fair lần lượt là 4,906 và 1,610 viên

    • Các viên kim cương được chế tác ở mức này thì ít hơn hẳn so với các mức ở vị trí đầu

    • Vì đây là 2 mức được đánh giá thấp nhất trong đánh giá về Giác cắt nên số lượng kim cương cũng ít hơn hẳn


Cũng giống như trọng lượng, ta có thể chuyển cụ thể số lượng thành % so với tổng số, để dễ dàng nhận xét hơn

KC %>% group_by(cut) %>% summarise(n = n()) %>%
  ggplot(aes(cut,n)) +
    geom_col(fill='yellow') +
    labs(title = "Biểu đồ thể hiện % thang đo Cut ") +
    theme_classic() +
    geom_text(aes(label = percent(n/length(KC$cut))),vjust = 2, color = 'red') +
    labs(x = 'Thang đo Cut', y = 'Số lượng')

Nhận xét Giác cắt 2

  • Vẫn tương tự như nhận xét phía trên, mức lý tưởng - Ideal chiếm 40% trên tổng số

  • Mặc dù mức lý tưởng chiếm nhiều nhất (gần một nửa), nhưng nó có số liệu không quá áp đảo so với các mức còn lại

  • Mức Tuyệt hảo Premium và Rất tốt Very Good đứng lần lượt thứ 2 và 3 với 25.6% và 22,4%, mỗi mức cũng bằng hơn một nửa so với mức Ideal

  • 2 mức cuối cùng là Tốt Good và Trung bình Fair với phần trăm ít nhất lần lượt là 9,1% và 3%, chứng tỏ mức chế tác ở 2 mức này không được ưa chuộng bằng 3 mức còn lại

  • Khi dựa vào phần trăm, ta càng thấy rõ hơn các mức độ thanh đo về mặt cắt của kim cương

  • Các viên có tỷ lệ chế tác càng hoàn hảo thì sẽ có giá thành cao và được ưa chuộng hơn


3. Color - Màu sắc

Màu sắc của kim cương (hay còn gọi là Nước kim cương) có rất nhiều và các màu sắc đó được phân loại gọi là Cấp độ màu sắc

  • Một viên kim cương càng có ít màu sắc thì sẽ phản xạ ánh sáng càng chân thật

  • Thông thường sẽ nhìn từ phần đáy của kim cương để giám định màu sắc của nó

Cấp độ màu sắc gồm 5 cấp độ màu và có 23 màu như sau :

  • Màu D - E - F : xếp vào loại Không màu (Colorless)

  • Màu G - H - I - J : xếp vào loại Gần như không màu (Near Colorless)

  • Màu K - L - M : xếp vào loại Màu rất nhạt (Faint Yellow)

  • Màu N - O - P - Q - R : xếp vào loại Màu nhạt (Very Light Yellow)

  • Màu S - T - U - V - W - X - Y - Z : xếp vào loại Màu vàng (Light Yellow)


Tóm tắt sơ lược

Mỗi viên kim cương đều có màu sắc riêng biệt và có tới 23 màu sắc dành cho việc đánh giá kim cương

Nhưng với bộ dữ liệu thì sẽ không đầy đủ tất cả các màu đã nêu - chỉ bao gồm 7 màu như sau :

table(KC$color)
## 
##     D     E     F     G     H     I     J 
##  6775  9797  9542 11292  8304  5422  2808
  • Theo như bảng tần số đã chia bên trên, có 7 màu sắc tất cả

  • 7 màu gồm từ D đến J, mỗi màu có số viên kim cương tương ứng như bảng trên

  • 3 Màu D - E - F là các viên kim cương thuộc cấp không màu

    • Màu D có tổng là 6,775 viên

    • Màu E có tổng là 9,797 viên

    • Màu F có tổng là 9,542 viên

  • Màu G - H - I - J là các viên kim cương thuộc cấp gần như không màu

    • Màu G có tổng là 11,292 viên

    • Màu H có tổng là 8,304 viên

    • Màu I có tổng là 5,422 viên

    • Màu J có tổng là 2,808 viên


Biểu đồ thể hiện Màu sắc

KC %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(n,color)) +
    geom_col(fill='pink') +
    labs(title = " Biểu đồ thể hiện nhóm theo Color ") +
    geom_text(aes(label = n),vjust = 1, color = 'black') +
    labs(x = 'Số lượng', y = 'Các màu sắc')

Nhận xét Màu sắc 1

  • Nhìn tổng quan ta thấy được cả 7 màu sắc đều có số lượng kim cương không quá ít cũng không quá nhiều

  • Nổi bật nhất là màu G chiếm số lượng nhiều nhất, với 11,292 viên trên tổng số

  • Ngược lại màu Jsố lượng ít nhất, với 2,808 viên

  • Khi so sánh 2 màu nhiều nhất và ít nhất, ta thấy màu G gấp hơn 4 lần màu J

  • Các màu E, F, H lần lượt đứng thứ 2,3,4 sau màu G, với số lượng từng loại cũng gần như ngang bằng nhau

    • Như màu E và F chỉ cách nhau hơn 200 viên, số lượng cũng không đáng kể

    • Và màu F và H các nhau khoảng hơn 1000 viên

  • 2 màu sắc ít hơn nữa là D và I , với số lượng lần lượt là 6,775 và 5,422

  • Dựa vào số lượng trên, ta thấy các màu sắc thuộc nhóm gần như không màu (G,H,I,J) chiếm lượng nhiều hơn so với nhóm không màu (D,E,F)


Cũng giống như 2 tiêu chí đã nói trên, ta chuyển số lượng cụ thể thành % so với tổng số, để dễ dàng nhận xét hơn

KC %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(n,color)) +
    geom_col(fill='pink') +
    labs(title = "Biểu đồ thể hiện % thang đo Color ") +
    theme_classic() +
    geom_text(aes(label = percent(n/length(KC$color))),vjust = 1, color = 'black') +
    labs(x = 'Số lượng', y = 'Các màu sắc')

Nhận xét Màu sắc 2

  • Với phần trăm là 20,93% - Màu sắc G có tỷ lệ số viên kim cương nhiều nhất trên tổng số

  • Các tỷ lệ đứng thứ 2,3,4 lần lượt là màu E - 18,16% , màu F - 17,69% , màu H - 15,39%

    • Tỷ lệ của 3 màu này cách màu G đứng đầu khoảng 2-5%, cũng không phải là con số đáng kể

    • Từ đó ta thấy được, không có màu sắc nào là có số lượng cao hơn hẳn/ rõ rệt hơn các màu còn lại

  • Màu D và I đứng gần áp bảng với tỷ lệ khiêm tốn hơn : 12,56% và 10,05%

  • Cuối cùng màu có tỷ lệ ít nhất trong biểu đồ là màu J - chỉ với 5,21%

    • Khoảng cách của màu nhiều và ít nhất là khoảng 15%

    • Vậy ta cũng có thể nói rằng dù là màu ít nhất nhưng màu J cũng không phải ở mức cực hiếm


Lồng ghép các đặc tính với nhau

Ta đã tìm hiểu và xét riêng biệt được 3 tiêu chí là : Trọng lượng Carat - Giác cắt Cut - Màu sắc Color

Trước khi đến với tiêu chí thứ 4, ta sẽ tiến hàng xét 3 tiêu chí này với nhau (không còn xét riêng lẻ)

  • Việc này có thể giúp thấy rõ trong từng màu sắc có bao nhiêu viên loại như Ideal, Very Good,…..

  • Hay trong từng loại màu sắc có bao nhiêu viên có cân nặng dưới 1,00 carat,…. chẳng hạn


Màu sắc - Color và Giác cắt - Cut

Khi xét tới 2 tiêu chí cùng một lúc, ta sẽ thấy được cụ thể hơn so với xét riêng biệt

Từng viên kim cương tương ứng với các màu sắc và giác cắt sẽ rõ ràng hơn

KC %>% group_by(cut,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = cut,y = n)) +
    geom_col(position = 'dodge', color = 'black') +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    facet_wrap(~color) +
    labs(x = 'Thang đo Cut', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

Nhận xét

Với tổng số 7 màu sắc cùng với 5 loại giác cắt, ta có thể thấy 7 biểu đồ tương ứng với từng màu sắc và mỗi màu sắc có số lượng giác cắt cụ thể

  • Nhìn tổng quan, cả 7 màu đều có giác cắt Lý tưởng Ideal cao nhất và Fair ít nhất

  • Với Giác cắt Ideal, màu E có số lượng nhiều nhất - 3,903 viên so với các màu còn lại, theo sát sau là màu F với 3,826 viên

  • Với mức Premium và Very Good, các màu đều có số lượng không quá chênh lệch, tất cả đều ở mức trung bình, không quá nhiều và cũng không quá ít

  • Với mức Good và Fair, số lượng ít hơn hẳn các mức còn lại - sự chênh lệch với mức Ideal là quá rõ rệt

Khi ta xét tiêu chí về giác cắt không thôi là cũng đủ để ta hình dung về các nhóm kim cương phân bổ như thế nào, nhưng việc tách riêng và thêm yếu tố màu sắc vào, chắc chắn sẽ giúp cho biết thêm ở màu nào loại giác cắt nào sẽ nhiều nhất và ít nhất


Từng màu sắc với Giác cắt - Cut

Với 7 biểu đồ từng màu sắc trên cho ta thấy tổng thể của cả 7, nhưng nếu muốn biết cụ thể sự chênh lệch khoảng cách của 2 màu có số lượng nhiều nhất và ít nhất là màu G và màu J, ta có thể đem chúng so sánh như biểu đồ sau :

KCE <- diamonds %>%
  group_by(cut, color) %>%
  summarise(n = n()) %>%
  mutate(color = factor(color, levels = c("G", "J")))
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
KCE %>%
  ggplot(aes(x = cut, y = n, fill = color)) + 
  geom_col(position = position_dodge()) + 
  labs(x = "Các mức độ Giác cắt", y = "Số lượng") +
  labs(caption = "Biểu đồ thể hiện từng màu sắc")

Nhận xét

  • Vì ta đang muốn thấy sự rõ sự chênh lệch của 2 màu nhiều nhất và ít nhất nên khi nhìn vào biểu đồ, ta thấy được màu G và màu J có khoảng cách cách biệt rất lớn

  • Thể hiện rõ nhất là 3 mức Ideal - Premium - Very Good, màu J thậm chỉ bằng hoặc thấp hơn 1/3 màu G

  • Sự chênh lệch lớn nhất là ở mức Ideal - với số kim cương cách biệt là khoảng 4,000 viên

  • Còn ở 2 mức cuối là Fair và Good, dù không hơn quá nhiều như 3 mức còn lại, nhưng khoảng cách cũng rơi tầm vài chục đến vài trăm viên

Ngoài 2 màu này ra, ta cũng có thể so sánh bất cứ màu nào ta muốn

Ta còn có thể so sánh 3 màu, 4 màu cùng lúc nếu có nhu cầu


Màu sắc - Color và Trọng lượng - Carat

Ta xét tiếp tới 2 tính chất Màu sắc và Trọng lượng Carat cùng lúc

  • Ở phần trọng lượng Carat, ta đã phân các viên kim cương thành 5 nhóm theo trọng lượng và đặt tên cho từng nhóm

  • Bên cạnh đó, ta cũng tạo bộ dữ liệu mới từ KC là KC1, bộ dữ liệu này được bổ sung thêm 1 biến tên TLCarat, biến này có nội dung gồm 5 nhóm được chia theo trọng lượng đã nói trên, bao gồm Rất nhẹ, Nhẹ, Vừa, Nặng, Rất nặng

Từ đó, ta tiến hành vẽ các biểu đồ từ 7 màu sắc với 5 nhóm trọng lượng này :

KC1 %>% group_by(TLCarat,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = TLCarat,y = n)) +
    geom_col(position = 'dodge', color = 'black') +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    facet_wrap(~color) +
    labs(x = 'Trọng lượng Carat', y = 'Số lượng')
## `summarise()` has grouped output by 'TLCarat'. You can override using the
## `.groups` argument.

Nhận xét

Với tổng số 7 màu cùng với 5 mức độ trọng lượng, ta có thể thấy 7 biểu đồ tương ứng với từng màu sắc và mỗi màu sắc có số viên kim cương được chia theo trọng lượng cụ thể

  • Nhìn tổng quan tất cả, các viên kim cương ở mức Rất nhẹ chiếm đại đa số và gần như áp đảo trong từng biểu đồ

  • Mức Nhẹ cũng đứng thứ 2 trong tất cả các biểu đồ, nhưng vấn có sự chênh lệch khá lớn so với mức Rất nhẹ

  • 2 mức Vừa, Nặng đều rất ít, chỉ rơi vào vài viên đến vài trăm viên

  • Đặc biệt mức Rất nặng, chỉ có 2 viên ở màu J1 viên ở màu E, các màu còn lại không sở hữu một viên nào

  • 3 màu E,F,G đều có kim cương ở mức Rất nhẹ nhiều áp đảo, nhưng lại không có viên nào ở 2 mức nặng và rất nặng

Nói tóm lại, các biểu đồ trên đã cho ta thấy rõ chi tiết nhất về các viên kim cương. Mỗi viên kim cương đều mang một nét đẹp về màu sắc, trọng lượng,… riêng biệt nên đó cũng là lý do khiến cho việc kiểm định chất lượng và định giá chúng rất khắt khe và cần tính chuẩn xác cực cao


Từng Màu sắc với Trọng lượng - Carat

Ta tiến hành chọn 4 màu G,E,I,J để xét dựa trên các mức trọng lượng

Chủ đích chọn 4 màu này là vì màu G - E là một trong những màu có số lượng nhiều nhất và màu I - J là ít nhất

KCI <- KC1 %>%
  group_by(TLCarat, color) %>%
  summarise(n = n()) %>%
  mutate(color = factor(color, levels = c("G", "E", "I", "J")))
## `summarise()` has grouped output by 'TLCarat'. You can override using the
## `.groups` argument.
KCI %>%
  ggplot(aes(x = TLCarat, y = n, fill = color)) + 
  geom_col(position = position_dodge()) + 
  labs(x = "Các mức trọng lượng", y = "Số lượng") +
  labs(caption = "Biểu đồ cột chồng các màu sắc")

Nhận xét

Giữa 2 màu nhiều nhất và 2 màu ít nhất được tách ra, sự chênh lệch đã được thể hiện rõ ràng hơn

  • So sánh 4 màu thì các viên kim cương ở nhóm Rất nhẹ vẫn là nhiều nhất

  • 2 màu G và E có số lượng áp đảo hoàn toàn so với I và J ở nhóm Rất nhẹ

  • Nhưng ở nhóm Nhẹ, lượng kim cương đã có khác biệt - sự cách biệt đã không còn

  • Màu G và I gần như có số lượng ngang nhau, màu E trở thành màu có số lượng ít nhất

  • Còn 2 mức cuối cùng là nặng và rất nặng, vì số kim cương ở 2 nhóm này cực kì ít và hiếm nên ta không dễ dàng như 3 nhóm còn lại

Như vậy có thể nói, tuy số lượng ở mỗi nhóm mức trọng lượng là khác nhau nhưng phải so sánh theo các màu thì ta mới có thấy rõ hơn sự chênh lệch đó


4. Clarity - Độ Tinh Khiết

Độ tinh khiết/ Độ trong của kim cương là số lượng và khả năng hiển thị của các đặc điểm bên trong (tạp chất) và bên ngoài(vết trầy xước) của một viên kim cương

  • Các tạp chất hay tỳ vết được tạo thành trong quá trình hình thành kim cương tự nhiên

  • Để đánh giá thì cần sử dụng các thiết bị kính loup với độ phóng đại x10

Cấp độ tinh khiết gồm có 6 nhóm với 11 cấp độ, những cấp độ tính từ cao xuống thấp như sau :

  • Flawless - FL : Sạch hoàn hảo, không tỳ vết

  • Internally Flawless - IF : Hoàn hảo bên trong, chỉ có tỳ vết không quan trọng bên ngoài

  • Very Very Slightly Included - VVS - gồm 2 cấp nhỏ (VVS1, VVS2) : Có những tạp chất, vết trầy nhỏ, khó thấy được

  • Very Slightly Included - VS - có 2 cấp nhỏ (VS1, VS2) : Có những tạp chất, vết trầy từ khó thấy đến dễ thấy

  • Slightly Included - SI - có 2 cấp nhỏ (SI1, SI2) : Có những tạp chất, vết trầy dễ thấy hoặc rất dễ thấy

  • Included - I - có 3 cấp nhỏ (I1,I2,I3) : Không hoàn hảo lẫn bên trong lẫn bên ngoài


Tóm tắt sơ lược

Ta đã nêu gồm 11 cấp độ tinh khiết khác nhau, nhưng với bộ dữ liệu này thì các cấp độ đó sẽ không đầy đủ như đã nêu bên trên, ta có thể thấy chỉ gồm :

table(KC$clarity)
## 
##    I1   SI2   SI1   VS2   VS1  VVS2  VVS1    IF 
##   741  9194 13065 12258  8171  5066  3655  1790

Chỉ có 8 cấp độ tinh khiết trong bộ dữ liệu, không có mức FL và I3

  • Các mức độ đều gồm số lượng kim cương tương ứng như bảng trên

  • Nhìn tổng quan trước, ta thấy các mức ST và VS chiếm đa số trong tổng thể

Và để thấy rõ hơn, ta lại vẽ biểu đồ thể hiện chúng


Biểu đồ thể hiện Độ tinh khiết

KC %>% group_by(clarity) %>% summarise(n = n()) %>%
  ggplot(aes(n,clarity)) +
    geom_col(fill='purple') +
    labs(title = " Biểu đồ thể hiện nhóm theo Clarity ") +
    geom_text(aes(label = n),vjust = 1, color = 'black') +
    labs(x = 'Số lượng', y = 'Độ tinh khiết')

Nhận xét Độ tinh khiết 1

  • Mức độ của các viên kim cương ở mỗi mức độ tinh khiết là không đồng đều nhau

  • Ta có thể thấy được số lượng các viên kim cương tương ứng với các mức độ tinh khiết như trong biểu đồ

  • Nổi bật ta thấy được mức SI1 chiếm số lượng nhiều nhất, với khoảng hơn 12,000 viên kim cương

    • Đây là những viên có lẫn những tạp chất, vết trầy dễ thấy hoặc rất dễ thấy

    • Vì được hình thành từ trong tự nhiên, nên xác suất gặp các viên kim cương chưa hoàn thiện là cao hơn hẳn

  • Theo ngay sau đó là VS2 và SI2, với số lượng đứng thứ 2,3 thì độ chênh lệch so với SI1 cũng là không quá nhiều

    • Khoảng cách rơi vào khoảng 1,000 và 4,000 viên cho mỗi mức tương ứng

    • Các viên kim cương ở 2 mức này đều có những tạp chất, vết trầy xước từ dễ thấy tới khó thấy rõ

  • 3 mức VS1, VVS2, VVS1 có số lượng lần lượt ít dần, cả 3 đều ở mức không quá nhiều cũng không quá ít

  • Ngược lại mức IF và mức I1 lần lượt có số lượng ít nhất

    • Khi so sánh mức nhiều nhất và ít nhất, ta thấy ST1 gấp hơn 10 lần so với mức ít nhất là I1**

    • Những viên kim cương hoàn hảo và không hoàn hảo là những viên có số lượng ít nhất


Tương tự như các tiêu chí trên, ta tính toán và chuyển số lượng sang dạng % để thấy cụ thể hơn

KC %>% group_by(clarity) %>% summarise(n = n()) %>%
  ggplot(aes(n, clarity)) +
    geom_col(fill='purple') +
    labs(title = "Biểu đồ thể hiện % thang đo Clarity ") +
    theme_classic() +
    geom_text(aes(label = percent(n/length(KC$clarity))),vjust = 1, color = 'black') +
    labs(x = 'Số lượng', y = 'Độ tinh khiết')

Nhận xét Độ tinh khiết 2

  • Tương tự với biểu đồ trên nhưng thay bằng %, với phần trăm là 24,2% - mức SI1 có tỷ lệ chiếm cao nhất

  • Các tỷ lệ đứng thứ 2,3,4 lần lượt là VS2 22,7% - SI2 17% - VS1 15,1%

    • Tỷ lệ của 3 mức độ này cách mức độ đứng đầu khoảng 2 - 10%

    • Từ đó ta thấy được, không có mức độ nào là có số lượng cao hơn hẳn/ rõ rệt hơn các mức còn lại

  • Mức VVS2 và VVS1 đứng gần áp chót của biểu đồ với tỷ lệ ít hơn : 9,4% và 6,8%

  • Và cuối cùng, mức có tỷ lệ ít nhất trong bảng lần lượt là IF - 3,3% và I1 - 1,1%

    • Khoảng cách của 2 mức nhiều và ít nhất là khoảng hơn 22%

Từng Màu sắc với Độ tinh khiết - Clarity

Tương tư như ta đã so sánh các màu với Trọng lượng và Giác cắt, ta cũng có thể tách riêng các màu ra để dễ nhận xét hơn

Ta chọn ngẫu nhiên 2 màu D và E để so sánh với nhau cùng với độ tinh khiết

KCD <- diamonds %>%
  group_by(clarity, color) %>%
  summarise(n = n()) %>%
  mutate(color = factor(color, levels = c("D", "E")))
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
KCD %>%
  ggplot(aes(x = clarity, y = n, fill = color)) + 
  geom_col(position = position_dodge()) + 
  labs(x = "Độ tinh khiết", y = "Số lượng") +
  labs(caption = "Biểu đồ thanh")

Nhận xét

  • Sự chênh lệch của 2 màu D và E cũng không quá đáng kể và rõ rệt

  • Nhiều nhất vẫn là 3 mức SI2 - SI1 - VS2, và màu E luôn nhiều hơn hẳn màu D

  • 5 mức còn lại với số kim cương ít hơn, nhưng màu E vẫn có số lượng nhiều hơn

  • Khoảng cách của mỗi mức sẽ rơi vào khoảng vài trăm đến vài ngàn viên


5. Depth - Độ sâu và Table - Bề mặt

Diamond Table và Depth là những yếu tố có vai trò quyết định cho chất lượng giác cắt của kim cương

  • Giúp xác định hình dạng vật lý, tạo nên vẻ ngoài rực rỡ và lấp lánh cho viên kim cương

  • Sự cân đối giữa 2 đặc điểm này sẽ giúp đạt được chất lượng và tính thẩm mỹ cao nhất

  • Đây cũng là 2 loại Giác cắt (Cut) thường gặp


Diamond Depth - Độ sâu

Chiều sâu hay còn là Chiều cao của kim cương

  • Chiều sâu sẽ được tính bằng cách chia tổng chiều sâu (tính từ đỉnh đến đáy) cho đường kính trung bình

    • Nếu viên kinh cương quá sâu thì sẽ dễ làm xuất hiện các vùng tối màu

    • Nếu viên kim cương quá nông thì có thể làm mất độ sáng

  • Tỷ lệ lý tưởng nhất ở thang đo chiều sâu sẽ trong khoảng từ 57,5 - 63%


Biểu đồ thể hiện Độ sâu

Dựa trên tỷ lệ lý tưởng từ 57,3-63%, ta sẽ phân các viên kim cương thành 2 nhóm : Lý tưởng và Chưa lý tưởng

  • Nhóm Lý tưởng là nhóm có các viên kim cương có Độ sâu từ 57,3 đến 63%

  • Nhóm Chưa lý tưởng là nhóm có các viên kim cương có Độ sâu dưới 57,3%trên 63%

Sau khi chia như vậy, ta được biểu đồ như sau :

KCLT <- diamonds
KCLT$depth.sau <- ifelse(KCLT$depth >= 57 & KCLT$depth <= 63, 'Lý tưởng', 'Chưa lý tưởng')
table(KCLT$depth.sau)
## 
## Chưa lý tưởng      Lý tưởng 
##          7274         46666
KCLT %>% group_by(depth.sau) %>% summarise(n = n()) %>%
  ggplot(aes(depth.sau,n)) +
    geom_col(fill='gray') +
    labs(title = " Biểu đồ thể hiện nhóm theo Depth ") +
    geom_text(aes(label = n),vjust = 2, color = 'black') +
    labs(x = 'Độ Lý tưởng theo Độ sâu', y = 'Số lượng') 

Nhận xét Độ sâu 1

  • Sau khi phân thành 2 nhóm lý tưởng hay không dựa trên thang đo độ sau, ta có được biểu đồ như trên

  • Đa phần các viên kim cương đều đạt mức lý tưởng với hơn 46,000 viên, chỉ có hơn 7,000 là chưa đạt

  • Giữa 2 mức lý tưởng và chưa lý tưởng cách nhau khoảng 39,000 viên

  • Chứng tỏ các viên kim cương đa phần đều có một Độ sâu hoàn hảo và lý tưởng


Từng màu sắc với Mức lý tưởng của Độ sâu

Nhưng biểu đồ trên chỉ có được nhận xét tổng quan, để cụ thể hơn ta cũng có thể vẽ các biểu đồ mức lý tưởn này trên từng loại màu sắc như sau :

KCLT %>% group_by(depth.sau,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = depth.sau,y = n)) +
    geom_col(position = 'dodge') +
    facet_wrap(~color) +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    labs(x = 'Độ lý tưởng theo Độ sâu', y = 'Số lượng')
## `summarise()` has grouped output by 'depth.sau'. You can override using the
## `.groups` argument.

Nhận xét Độ sâu 2

Nhìn chung ta đều thấy được, mức lý tưởng đều có số lượng nhiều hơn chưa lý tưởng ở tất cả các màu

  • 4 màu G, E, F, H là 4 màu có số lượng đạt mức lý tưởng nhiều nhất, với hơn 7,000 viên cho mỗi màu

  • 3 màu D, I, J có số lượng ít hơn, nhưng nếu so với mức chưa lý tưởng thì cũng đã nhiều hơn từ vài ngàn viên

  • Mức chưa lý tưởng có số lượng từ vài trăm đến vài ngàn viên, sự chênh lệch cũng khá rõ rệt giữa 2 mức


Ghép chồng các Màu sắc với Độ sâu

Với từng màu sắc như 7 biểu đồ trên cũng là quá rõ ràng cho chúng ta có thể nhận xét

Nhưng bây giờ ta sẽ xếp các cột chồng lên nhau để có thêm một góc nhìn khác nữa :

KCLT1 <- KCLT %>% group_by(depth.sau, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'depth.sau'. You can override using the
## `.groups` argument.
KCLT1 %>% ggplot(aes(x = depth.sau, y =n)) +
  geom_col(data = KCLT1 %>% filter(color == 'G'), fill = 'red') +
  geom_col(data = KCLT1 %>% filter(color == 'D'), fill = 'yellow') +
  geom_col(data = KCLT1 %>% filter(color == 'J'), fill = 'green') +
  labs(x = 'Độ Sâu', y = 'Số lượng')

Nhận xét Độ sâu 3

Ta quy định các màu trong biểu đồ như sau :

  • Màu đỏ trong biểu đồ chính là màu G

  • Màu vàng trong biểu đồ chính là màu D

  • Màu xanh lá trong biểu đồ chính là màu J

Khi tách 3 màu ra, với một góc nhìn khác, ta cũng có thể dễ dàng so sánh hơn

  • Màu G khi được xếp chồng lên vẫn có số lượng đứng nhiều nhất, tiếp theo là màu D và cuối cùng là J

  • Mức lý tưởng của màu G gần như gấp đôi màu Dgấp 3 lần màu J

  • Còn về mức chưa lý tưởng, cả 3 màu gần như có số lượng ngang nhau

Sự chênh lệch giữa các biểu đồ cột đơn, cột đôi, cột chồng về mặt số liệu là không hề thay đổi

Nhưng thông qua các biểu đồ khác nhau - các góc nhìn khác, ta cũng phần nào có thể thấy được sự chênh lệch đó rõ ràng hơn


Từng Mức giác cắt với Mức lý tưởng của Độ sâu

Ta cũng có thề làm tương tự nhưng không xét ở màu sắc nữa, mà ta sẽ xét ở mức độ Giác cắt Cut

Và ta cũng nhận xét tương tự như ở phần Màu sắc bên trên cho phần Độ sâu dưới đây :

KCLT %>% group_by(depth.sau,cut) %>% summarise(n=n()) %>%
  ggplot(aes(x = depth.sau,y = n)) +
    geom_col(position = 'dodge') +
    facet_wrap(~cut) +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    labs(x = 'Độ lý tưởng theo Độ sâu', y = 'Số lượng')
## `summarise()` has grouped output by 'depth.sau'. You can override using the
## `.groups` argument.

Nhận xét Độ sâu 4

  • Độ đạt lý tưởng của mỗi mức vẫn chiếm phần lớn

  • Riêng mức Fair có mức chưa lý tưởng nhiều hơn lý tưởng

  • Nhưng nhìn chung, khoảng cách giữa 2 độ đạt lý tưởng vẫn khá cách biệt


Ghép chồng mức độ Giác cắt với Độ sâu

Và ta cũng có nhận xét tương tự như phần màu sắc

KCLT2 <- KCLT %>% group_by(depth.sau, cut) %>% summarise(n = n())
## `summarise()` has grouped output by 'depth.sau'. You can override using the
## `.groups` argument.
KCLT2 %>% ggplot(aes(x = depth.sau, y =n)) +
  geom_col(data = KCLT2 %>% filter(cut == 'Ideal'), fill = 'green') +
  geom_col(data = KCLT2 %>% filter(cut == 'Premium'), fill = 'blue') 

Nhận xét Độ sâu 5

Ta có một biểu đồ tương tự như ở phần Màu sắc với Độ sâu với quy định như sau :

  • Màu xanh lá trong biểu đồ chính là đại diện cho mức Ideal

  • Màu xanh dương trong biểu đồ chính là đại diện cho mức Premium

Độ lý tưởng vẫn chiếm đại đa số so với chưa lý tưởng

  • Màu xanh lá đại diện cho mức Ideal cao hơn mức Premium - màu xanh dương ở độ lý tưởng

  • Nhưng ta thấy màu xanh dương cũng cao gần 2/3 của màu xanh lá

  • Chứng tỏ số lượng giữa chúng là có chênh lệch nhau, nhưng khoảng cách cũng không phải là quá rõ rệt

  • Còn độ chưa lý tưởng thì ta chỉ có thể thấy một tí màu xanh lá, có thể số lượng quá ít của 2 mức nên chưa thấy rõ


Diamond Table - Bề mặt

Diamond Table là loại giác cắt có hình lục giác đặc trưng, có bề mặt lớn nhất nằm trên đỉnh của viên kim cương

  • Nó có vai trò quan trọng trong việc xác định hình dáng của viên kim cương

  • Nó còn làm tăng khả năng khúc xạ các tia sáng, giúp cho kim cương trở nên lấp lánh hơn

    • Nếu bề mặt quá lớn sẽ thiếu chỗ cho sự phân tán ánh sáng

    • Nếu bề mặt quá nhỏ sẽ hạn chế ánh sáng chiếu vào làm giảm độ sáng tổng thể

  • Tỷ lệ lý tưởng nhất của một bề mặt hoàn hảo sẽ trong khoảng từ 53 - 65%


Biểu đồ thể hiện Bề mặt

Cũng tương tự và dựa trên tỷ lệ lý tưởng đã có sẵn, ta tiến hành phân chia kim cương thành 2 nhóm Đạt và Không Đạt

  • Nhóm Đạt là nhóm có các viên kim cương có Bề mặt từ 53 đến 65%

  • Nhóm Không đạt là nhóm có các viên kim cương có Bề mặt dưới 53%trên 65%

(Lưu ý : Ta sẽ dùng từ ‘Đạt’ để phân biệt với từ ‘Lý tưởng’ của phần Độ sâu, nên thật ra ‘Không đạt’ cũng chỉ là mức ‘Chưa lý tưởng’ mà thôi)

Ta tiến hành vẽ biểu đồ và có 2 nhóm như sau :

KCLTT <- diamonds
KCLTT$table.bemat <- ifelse(KCLTT$table >= 53 & KCLTT$table <= 65, 'Đạt', 'Không')

KCLTT %>% group_by(table.bemat) %>% summarise(n = n()) %>%
  ggplot(aes(table.bemat,n)) +
    geom_col(fill='gray') +
    labs(title = " Biểu đồ thể hiện theo Table ") +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    labs(x = 'Độ đạt theo Bề mặt', y = 'Số lượng')

Nhận xét Bề mặt 1

Những viên kim cương Đạt chuẩn hoàn toàn chiếm gần như tuyệt đối khi so với Không đạt

  • Mức Đạt chuẩn có số lượng hơn 53,000 viên, tỷ lệ hơn 99% - khoảng cách là rất rất cách biệt và chênh lệch

  • Mức Không đạt chỉ có 257 viên

  • Chứng tỏ các viên kim cương khi được thẩm định hay đánh giá đều phải có những giác cắt chuẩn xác đạt tới mức hoàn hảo


Các Màu sắc với Mức đạt của Bề mặt

Ta cũng sẽ tiến hành vẽ các biểu đồ của từng màu sắc cùng với Độ đạt chuẩn của Bề mặt như sau :

KCLTT %>% group_by(table.bemat,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = table.bemat,y = n)) +
    geom_col(position = 'dodge') +
    facet_wrap(~color) +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    labs(x = 'Độ đạt theo Bề mặt', y = 'Số lượng')
## `summarise()` has grouped output by 'table.bemat'. You can override using the
## `.groups` argument.

Nhận xét Bề mặt 2

  • Trong từng biểu đồ màu, độ đạt chuẩn cũng có tỷ lệ áp đảo như biểu đồ tổng

  • Trừ màu J ra, thì còn lại 6 màu đều có số kim cương đạt chuẩn lớn hơn 5,000 viên

  • Trong đa số các biểu đồ về màu sắc, màu J luôn có một số lượng khá khiêm tốn hơn

  • 4 màu E,F,G,H đều có số lượng ở mức đạt chuẩn trên 8,000 viên và hoàn toàn chênh lệch với mức chưa đạt

  • Các mức chưa đạt đều chỉ rơi vào khoảng mấy chục viên cho mỗi màu, số lượng không nhiều

Qua các màu sắc càng chứng tỏ bề mặt giác cắt luôn được đánh giá tỉ mỉ nhất


Từng màu sắc với Mức đạt của Bề mặt

Biểu đồ cột đôi với từng màu sắc, sẽ giúp ta dễ so sánh hơn

KCLTT1 <- KCLTT %>%
  group_by(table.bemat, color) %>%
  summarise(n = n()) %>%
  mutate(color = factor(color, levels = c("H", "I")))
## `summarise()` has grouped output by 'table.bemat'. You can override using the
## `.groups` argument.
KCLTT1 %>%
  ggplot(aes(x = table.bemat, y = n, fill = color)) + 
  geom_col(position = position_dodge()) + 
  labs(x = "Độ đạt bề mặt", y = "Số lượng") +
  labs(caption = "Biểu đồ thể hiện từng màu sắc")

Nhận xét Bề mặt 3

Ta chọn ngẫu nhiên màu H và I để so sánh về độ đạt chuẩn của bề mặt

  • Màu H chính là màu tím đậm trong biểu đồ

  • Màu I chính là màu vàng trong biểu đồ

  • Mức Đạt chuẩn của 2 màu có sự chênh lệch khoảng 2,000 viên

  • Còn mức không đạt vì số lượng quá ít nên ta chưa nhìn thấy rõ ràng


Ghép chồng các màu sắc với Bề mặt

Đây cũng là biểu đồ so sánh các màu sắc với nhau, như biểu đồ trên là cột đôi thì biểu đồ dưới đây sẽ là cột chồng

Về mặt số liệu thì chắc chắn sẽ không có gì khác, nhưng sẽ khác về cách thể hiện trên biểu đồ

KCLTT1 <- KCLTT %>% group_by(table.bemat, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'table.bemat'. You can override using the
## `.groups` argument.
KCLTT1 %>% ggplot(aes(x = table.bemat, y =n)) +
  geom_col(data = KCLTT1 %>% filter(color == 'H'), fill = 'pink') +
  geom_col(data = KCLTT1 %>% filter(color == 'I'), fill = 'purple') 

Nhận xét Bề mặt 4

Ta cũng chọn 2 màu là H và I như biểu đồ cột đôi, nhưng biểu đồ cột chồng này đã có sự khác biệt về góc nhìn, ta quy định như sau :

  • Màu H chính là màu hồng trong biểu đồ

  • Màu I chính là màu tím trong biểu đồ

  • Mức Đạt chuẩn của 2 màu vẫn có sự chênh lệch khoảng 2,000 viên

  • Và màu tím đại diện cho màu I chiếm hơn một nửa cột màu hồng - đại diện cho màu H

  • Còn mức không đạt vì số lượng quá ít nên ta cũng không thể nhìn thấy từ biểu đồ này


6. Price - Giá thành

Thế giới kim cương là biểu tượng cho một vẻ đẹp muôn màu, đa dạng. Mỗi một viên kim cương đều mang một hình dáng, độ lấp lánh, … riêng biệt và không có sự lặp lại, từng yếu tố đánh giá chất lượng đều sẽ gây ảnh hưởng đến giá thành của nó

  • 4 yếu tố trong Tiêu chí 4C đã phân tích ở trên đều có ảnh hưởng từ chất lượng đến giá trị

  • Tiêu chuẩn 4C của GIA đã trở thành một tiêu chuẩn trên toàn thế giới để phân loại và định giá kim cương

Với hơn 50,000 viên kim cương, đương nhiên mỗi viên kim cương đều mang giá trị của riêng nó

Ta sẽ tiến hành tính trung bình giá thành của tất cả chúng, để thấy được liệu để sở hữu được 1 viên kim cương cần bao nhiêu


Tính toán sơ lược

Trước tiên, ta sẽ chia nhỏ Giá thành Price thành 4 nhóm : Rất rẻ - Rẻ - Đắt - Rất đắt

  • Lưu ý : Việc đặt tên cho từng nhóm như thế này chỉ mang tính chất tượng trưng vì ta không rõ đơn vị tiền tệ của các viên kim cương là đơn vị nào

  • Giá thành của kim cương sẽ tùy thuộc vào nhiều yếu tố, ta chỉ đang xét giá trị các viên kim cương có trong bộ dữ liệu

table(cut(KC1$price,4))
## 
##      (308,4.95e+03] (4.95e+03,9.57e+03] (9.57e+03,1.42e+04] (1.42e+04,1.88e+04] 
##               39013                9285                3574                2068
KC1$price.t <- cut(KC1$price,4, labels = c('Rất rẻ','Rẻ','Đắt','Rất đắt')) 
table(KC1$price.t)
## 
##  Rất rẻ      Rẻ     Đắt Rất đắt 
##   39013    9285    3574    2068

Ta có được 4 nhóm giá thành được chia như sau : (tạm cho đơn vị là đơn vị tiền)

  • Mức giá thành Rất rẻ - có giá từ 308 - khoảng 4,000 đơn vị tiền

  • Mức giá thành Rẻ - có giá từ 4,000 - khoảng 9,000 đơn vị tiền

  • Mức giá thành Đắt - có giá từ 9,000 - khoảng 14,000 đơn vị tiền

  • Mức giá thành Rất đắt - có giá từ 14,000 - khoảng 18,000 đơn vị tiền

Sau đó tiến hành vẽ biểu đồ


Biểu đồ thể hiện Các mức giá thành

KC <- diamonds
KC2 <- KC %>% mutate(GiaPrice = cut(price,4, label = c('Rất rẻ', 'Rẻ','Đắt','Rất đắt')))
KC2 %>% group_by(GiaPrice) %>% summarise(n = n()) %>%
  ggplot(aes(GiaPrice,n)) +
    geom_col(fill='green') +
    labs(title = " Biểu đồ thể hiện giá thành ") +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    labs(x = 'Price', y = 'Số lượng')

Nhận xét Giá thành 1

  • Sự phân bổ không đồng đều mức giá của các viên kim cương là quá rõ rệt

  • Nhìn chung những giá thành càng đắt thì càng còn có số lượng kim cương càng giảm dần

  • Những viên kim cương có giá thành Rất rẻ có số lượng nhiều nhất với hơn 39,000 viên

  • Sự chênh lệch của giá Rất rẻ và giá thành Rẻ cũng đã là khá chênh lệch - hơn 30,000 viên

  • Còn giá thành Đắt và Rất đắt là có số lượng ít nhất

Các viên kim cương có giá thành rẻ là khá nhiều, nên việc sở hữu chúng có thể là dễ dàng hơn so với giá thành đắt

Nhưng nếu muốn sở hữu một viên kim cương lộng lẫy nhất, tuyệt đẹp nhất thì việc nó có giá Rất đẳ là chuyện rất bình thường


Biểu đồ thể hiện Trung bình - Mean giá thành

Sau khi nhìn rõ được số lượng kim cương ở mỗi mức giá, ta tiến hành vẽ tiếp một biểu đồ khác dựa trên mức giá đã được tính trung bình, biểu đồ như sau :

KC2 %>% group_by(GiaPrice) %>% summarise(m= mean(price)) %>%
  ggplot(aes(x = GiaPrice,y = m)) +
    geom_col(position = 'dodge') +
    geom_text(aes(label = round(m,2)), vjust = 2, color = 'green') +
    labs(x = 'Price', y = 'Mean')

Nhận xét Giá thành 2

Sau khi đã tính trung bình ở mỗi mức giá ta có số liệu như sau :

  • Mức giá Rất rẻ có giá trung bình là khoảng 1,897 đơn vị tiền

  • Mức giá Rẻ có giá trung bình là khoảng 6,759 đơn vị tiền

  • Mức giá Đắt có giá trung bình là khoảng 11,625 đơn vị tiền

  • Mức giá Rất đắt có giá trung bình là khoảng 16,340 đơn vị tiền

Nếu bạn muốn sở hữu một viên kim cương cho mình, thì trung bình bạn phải có ít nhất 1,900 đơn vị tiền trở lên để có nó, nếu không thì bạn phải trả thêm như sau :

  • Mức giá Rất đắt có giá thành đúng như cái tên, phải có hơn 16,000 đơn vị tiền mới có thể mua được

  • Các mức còn lại cũng có mức giá giảm dần nhưng khoảng chênh lệch so với mức rẻ nhất cũng là 5,000 đơn vị tiền trở lên

  • Mức giá thấp nhất và cao nhất có sự chênh lệch đến 15,000 đơn vị tiền


Biểu đồ thể hiện Trung vị - Median giá thành

Median - Số trung vị hay là một điểm trung tâm trong một danh sách được sắp xếp tăng hoặc giảm dần (nó khác trung bình ở chỗ nó chia đối tượng ra làm đôi và chưa chắc 2 bên đó sẽ cân bằng nhau)

  • Ban nãy, ta tính giá trung bình để có thể mua một viên kim cương - đó là số tiền trung bình nếu muốn sở hữu

  • Còn khi tính số trung vị - có nghĩa ta đã chia giá thành của lượng kim cương đó ra làm 2 phần

    • Số tiền ta tính ra được gọi là số trung vị/ hay gọi là con số trung tâm

    • Có nghĩa là 1 nửa lượng kim cương sẽ có giá thấp hơn mức giá đó và 1 nửa lượng bên còn lại sẽ có giá cao hơn

    • Nó hoàn toàn khác với giá trung bình đã tính

Ta có biểu đồ tính giá tiền trung vị trên mỗi mức giá như sau :

KC2 %>% group_by(GiaPrice) %>% summarise(m= median(price)) %>%
  ggplot(aes(x = GiaPrice,y = m)) +
    geom_col(position = 'dodge') +
    geom_text(aes(label = round(m,2)), vjust = 2, color = 'green') +
    labs(x = 'Price', y = 'Mean')

Nhận xét Giá thành 3

Sau khi đã tính trung vị ở mỗi mức giá ta có số liệu như sau :

  • Mức giá Rất rẻ có giá trung vị là khoảng 1,407 đơn vị tiền

  • Mức giá Rẻ có giá trung vị là khoảng 6,518 đơn vị tiền

  • Mức giá Đắt có giá trung vị là khoảng 11,474 đơn vị tiền

  • Mức giá Rất đắt có giá trung vị là khoảng 16,258 đơn vị tiền

  • Ta thấy từng mức giá trung vị cũng không chênh lệch với trung vị là bao

  • Nhưng nhìn chung, các mức giá vẫn xếp theo thứ tự : Rất đắt cao nhất, Đắt - Rẻ - Rất rẻ giảm dần theo sau

Ví dụ nếu bạn muốn mua một viên kim cương ở mức giá Đắt, thì theo số liệu giá thành trung vị là 11,474

  • Theo như số liệu có 3,574 viên kim cương ở giá thành này

  • Vậy có 1 nửa lượng các viên kim cương này có giá trên 11,474 đơn vị tiền

  • Còn lại có 1 nửa lượng các viên kim cương có giá dưới 11,474 đơn vị tiền

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA0Ig0KYXV0aG9yOiAidnF0diINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBkZl9wcmludDoga2FibGUNCiAgcGRmX2RvY3VtZW50Og0KICAgIGV4dHJhX2RlcGVuZGVuY2llczoNCiAgICAgIHZpZXRuYW06IHV0ZjgNCiAgICB0b2M6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQoNCiMgKipO4buZaSBkdW5nIGPhu6dhIE5oaeG7h20gduG7pSoqDQoNCi0gTmhp4buHbSB24bulIHnDqnUgY+G6p3UgduG6vSDDrXQgbmjhuqV0IDMwIMSR4buTIHRo4buLIGThuqFuZyAqKkJhciBjaGFydCoqDQoNCi0gQuG7mSBk4buvIGxp4buHdSB0aeG6v24gaMOgbmggdGjhu7FjIGhp4buHbiA6ICoqQuG7mSBk4buvIGxp4buHdSBkaWFtb25kcyoqIHRyb25nIHBhY2thZ2UgZ2dwbG90Mg0KDQojICoqVOG7lW5nIHF1YW4gduG7gSBC4buZIGThu68gbGnhu4d1IGRpYW1vbmRzKioNCg0KIyMgKioxLiBOZ3Xhu5NuIGfhu5FjIGPhu6dhIELhu5kgZOG7ryBsaeG7h3UqKg0KDQotIELhu5kgZOG7ryBsaeG7h3UgZGlhbW9uZHMgbMOgIG3hu5l0IHRyb25nIHPhu5EgY8OhYyBi4buZIGThu68gbGnhu4d1IGPhu6dhICoqcGFja2FnZSBnZ3Bsb3QyKioNCg0KLSBUYSBnw6FuIGLhu5kgZOG7ryBsaeG7h3UgZ+G7kWMgZGlhbW9uZHMgduG7m2kgdMOqbiBsw6AgKipLQyoqICh2aeG6v3QgdOG6r3QgY+G7p2EgS2ltIEPGsMahbmcpDQoNCi0gR2nhu5tpIHRoaeG7h3Ugc8ahIHbhu4EgKipwYWNrYWdlIGdncGxvdDIqKiA6IA0KDQogICAgLSAqKmdncGxvdDIqKiBsw6AgbeG7mXQgcGFja2FnZSBo4buXIHRy4bujIHZpc3VhbGl6YXRpb24sIHRhIGPDsyB0aOG7gyB24bq9IMSRxrDhu6NjIGPDoWMgxJHhu5MgdGjhu4sgZOG6oW5nIGJhciBjaGFydCwgZGVuc2l0eSwgcGllLOKApg0KICAgIA0KICAgIC0gKipnZ3Bsb3QyKiogY8OybiBjaG8gcGjDqXAgdMO5eSBjaOG7iW5oIG3DoHUgc+G6r2MsIGvDrWNoIGPhu6EsIHRoZW1lLCDigKYgxJHhu4MgxJHhu5MgdGjhu4sgxJHGsOG7o2MgxJHhurlwIGjGoW4NCiAgICANCi0gKipD4bqldSB0csO6YyBj4bunYSBnZ3Bsb3QyKiogxJHGsOG7o2MgY2hpYSBsw6BtIDIgcGjhuqduIDoNCg0KICAgIC0gKioqZ2dwbG90KCkqKio6IFBo4bqnbiBuw6B5IHF1eSDEkeG7i25oIMSR4buTIHRo4buLIHPhur0gc+G7rSBk4bulbmcgRGF0YSBuw6BvIChEYXRhIHBo4bqjaSBjw7MgZOG6oW5nIGRhdGEuZnJhbWUpDQoNCiAgICAtICoqKmdlb21fKGFlcyh4LHkpKSoqKiA6IFBo4bqnbiBuw6B5IHF1eSDEkeG7i25oIGtp4buDdSDEkeG7kyB0aOG7iyB2w6AgQ8OhYyB0cuG7pWMgdOG7jWEgxJHhu5kgdOG7qyBk4buvIGxp4buHdQ0KICAgIA0KICAgIC0gTuG6v3UgY2jhu4kgY8OzICoqKmdncGxvdCgpIG3DoCBraMO0bmcgdGjDqm0gZ2VvbV8oKSoqKiA6IHRow6wgY2jhu4kgbmjhuq1uIMSRxrDhu6NjIEJhY2tncm91bmQgbcOgIGtow7RuZyBjw7MgxJHhu5MgdGjhu4sNCiAgICANCiAgICAtIFRyb25nICoqKmdlb21fKCkqKiogcGjhuqNpIGtoYWkgYsOhbyB0aMOqbSB0cuG7pWMgdOG7jWEgxJHhu5kgdsOgbyBjw6FjICoqKmFyZ3VtZW50cyB4IHbDoCB5KioqIGPhu6dhIGFlcygpDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpkYXRhKHBhY2thZ2UgPSAnZ2dwbG90MicpDQpLQyA8LSBkaWFtb25kcw0KYGBgDQoNCg0KIyMgKioyLiBN4buZdCBz4buRIHRow7RuZyB0aW4gduG7gSBC4buZIGThu68gbGnhu4d1KioNCg0KVOG7qyB0w6puIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UgbMOgICoqZGlhbW9uZHMqKiwgY8WpbmcgxJHhu6cgY2hvIHRo4bqleSBk4buvIGxp4buHdSBiw6puIHRyb25nIGN1bmcgY+G6pXAgKipu4buZaSBkdW5nIHbDoCB0aMO0bmcgc+G7kSB24buBIEtpbSBDxrDGoW5nKioNCg0KLSAqKkLhu5kgZOG7ryBsaeG7h3UgS0MqKiBiYW8gZ+G7k20gOiAqKjUzLDk0MCBxdWFuIHPDoXQqKiB2w6AgKioxMCBiaeG6v24qKg0KDQogICAgLSAqKk3hu5dpIHF1YW4gc8OhdCAobeG7l2kgaMOgbmcpKiogxJHhuqFpIGRp4buHbiBjaG8gbeG7mXQgdmnDqm4ga2ltIGPGsMahbmcga2jDoWMgbmhhdSB2w6AgY8OzIHThu5VuZyAqKjUzLDk0MCB2acOqbiBraW0gY8awxqFuZyoqDQoNCiAgICAtIE3hu5dpIHZpw6puIGtpbSBjxrDGoW5nIMSRw7MgxJHhu4F1IGPDsyBjw6FjIHRow7RuZyBz4buRIGtow6FjIG5oYXUgduG7gSBtw6B1IHPhuq9jLCBrw61jaCB0aMaw4bubYywuLi4gdsOgIGPDsyB04buVbmcgKioxMCDEkeG6t2MgdMOtbmgqKg0KDQpgYGB7cn0NCmRpbShLQykNCmBgYA0KDQotLS0NCg0KLSBW4bubaSAqKjEwIGJp4bq/biB0xrDGoW5nIOG7qW5nKiosIG3hu5dpIGJp4bq/biBjdW5nIGPhuqVwICoqY8OhYyDEkeG6t2MgdMOtbmgvIHTDrW5oIGNo4bqldCoqIGPhu6dhIGtpbSBjxrDGoW5nLCBiYW8gZ+G7k20gbmjGsCBzYXUgOiANCg0KICAgICoqMS4gQ2FyYXQgLSBUcuG7jW5nIGzGsOG7o25nIDoqKiDEkMahbiB24buLIGTDuW5nIMSR4buDIMSRbyBraOG7kWkgbMaw4bujbmcgY+G7p2EgxJHDoSBxdcO9IG7Ds2kgY2h1bmcgKDEgY2FyYXQgPSAyMDAgbWlsbGlncmFtID0gMCwyIGdyYW0pDQogICAgDQogICAgKioyLiBDdXQgLSBHacOhYyBj4bqvdCA6KiogUXXDoSB0csOsbmggY2jhur8gdMOhYyB2acOqbiBraW0gY8awxqFuZyB04burIGThuqFuZyB0aMO0IHRow6BuaCBob8OgbiB0aGnhu4duIHbDoCBjw7Mgbmhp4buBdSBraeG7g3UgR2nDoWMgY+G6r3Qga2jDoWMgbmhhdQ0KICAgIA0KICAgICoqMy4gQ29sb3IgLSBNw6B1IHPhuq9jIDoqKiBNw6B1IHPhuq9jIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nDQogICAgDQogICAgKio0LiBDbGFyaXR5IC0gxJDhu5kgdHJvbmcvIMSQ4buZIHRpbmgga2hp4bq/dCA6KiogxJDDoW5oIGdpw6EgZOG7sWEgdsOgbyBz4buRIGzGsOG7o25nIGPDoWMgduG6v3QgdHLhuqd5IHjGsOG7m2MsIG3DoHUgc+G6r2MgduG6v3QgZ8OjeSwuLi5raGkgbmjDrG4gZMaw4bubaSBrw61uaCBsw7pwIDEweA0KICAgIA0KICAgICoqNS4gRGVwdGggLSDEkOG7mSBzw6J1IDoqKiBUaHXhuq10IG5n4buvIHRo4buDIGhp4buHbiDEkeG7mSBzw6J1IGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIHNvIHbhu5tpIMSRxrDhu51uZyBrw61uaCBj4bunYSBuw7MgKHTDrW5oIGLhurFuZyAlKQ0KICAgIA0KICAgICoqNi4gVGFibGUgLSBC4buBIG3hurd0IDoqKiBN4buXaSB2acOqbiBraW0gY8awxqFuZyDEkeG7gXUgY8OzIG3hu5l0IGLhu4EgbeG6t3QgcGjhurNuZyDhu58gdHLDqm4gxJHhu4luaCwgxJHDsyBjaMOtbmggbMOgIERpYW1vbmQgVGFibGUgKHTDrW5oIGLhurFuZyAlKQ0KICAgIA0KICAgICoqNy4gUHJpY2UgLSBHacOhIHRow6BuaCA6KiogROG7sWEgdHLDqm4gY8OhYyDEkeG6t2MgdMOtbmggxJHDoyBuw6p1IHRyw6puLCB04bqldCBj4bqjIHPhur0gcXV54bq/dCDEkeG7i25oIGdpw6EgdHLhu4sgY+G7p2EgbeG7mXQgdmnDqm4ga2nDqm0gY8awxqFuZyBsw6AgYmFvIG5oacOqdQ0KDQogICAgKio4LjkuMTAuIEfDrWEgdHLhu4sgeCAtIHkgLSB6IDoqKiBM4bqnbiBsxrDhu6N0IGzDoCBDaGnhu4F1IGTDoGkgLSBDaGnhu4F1IHLhu5luZyAtIMSQ4buZIHPDonUgKHTDrW5oIGLhurFuZyBtbSkgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcNCg0KDQpgYGB7cn0NCnN0cihLQykNCmBgYA0KDQotLS0gDQoNCk5nb8OgaSByYSBjw7JuIGPDsyBjw6FjIHRow7RuZyB0aW4ga2jDoWMgOiANCg0KDQpgYGB7cn0NCmxpYnJhcnkoc2tpbXIpDQpza2ltKEtDKQ0KYGBgDQoNCg0KIyAqKkPDoWMgxJDhurdjIHTDrW5oIGPhu6dhIEtpbSBjxrDGoW5nKioNCg0KxJDhu4MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIGPFqW5nIG5oxrAgZ2nDoSB0aMOgbmggbeG7mXQgdmnDqm4ga2ltIGPGsMahbmcsIGPDoWMgY2h1ecOqbiBnaWEgdGjGsOG7nW5nIGThu7FhIHRyw6puICoqNCB0acOqdSBjaMOtKiogLSBn4buNaSBsw6AgKip0acOqdSBjaMOtIDRDKioNCg0KLSBHSUEgxJHDoyB04bqhbyByYSB0acOqdSBjaHXhuqluIG7DoHkgxJHhuqd1IHRpw6puIHbDoCBoaeG7h24gxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiB0csOqbiB0b8OgbiBj4bqndQ0KDQotIFRpw6p1IGNodeG6qW4gNEMgZ+G7k20gOiAqKk3DoHUgc+G6r2MgQ29sb3IgLSDEkOG7mSB0aW5oIGtoaeG6v3QgQ2xhcml0eSAtIEdpw6FjIGPhuq90IEN1dCAtIFRy4buNbmcgbMaw4bujbmcgQ2FyYXQqKg0KDQpUYSBz4bq9IHRp4bq/biBow6BuaCAqKnBow6JuIHTDrWNoIHbDoCBuaOG6rW4geMOpdCoqIHThu6tuZyDEkeG6t2MgdMOtbmggY8OzIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeQ0KDQotLS0NCg0KIyMgKioxLiBDYXJhdCAtIFRy4buNbmcgbMaw4bujbmcqKg0KDQoqKlRy4buNbmcgbMaw4bujbmcqKiBjYXJhdCBj4bunYSBt4buZdCB2acOqbiBraW0gY8awxqFuZyDEkcaw4bujYyB4w6FjIMSR4buLbmggYuG6sW5nIGPDoWNoIGPDom4gdmnDqm4ga2ltIGPGsMahbmcgdHLDqm4gY8OibiDEkWnhu4duIHThu60gbeG7mXQgY8OhY2ggY2jDrW5oIHjDoWMNCg0KLSBUcuG7jW5nIGzGsOG7o25nIGNhcmF0IHRoxrDhu51uZyDEkcaw4bujYyBnaeG7ryAyIHPhu5EgdGjhuq1wIHBow6JuIGN14buRaSBjw7luZyAodmQgOiAxLjUzLCAxLjAwLC4uLikNCg0KLSBUcuG7jW5nIGzGsOG7o25nIGNow61uaCB4w6FjIGzDoCBy4bqldCBxdWFuIHRy4buNbmcsIOG6o25oIGjGsOG7n25nIHRy4buxYyB0aeG6v3AgxJHhur9uIHZp4buHYyDEkeG7i25oIGdpw6EgDQoNCi0gTmjGsG5nIGNoxrBhIGNo4bqvYyB2acOqbiBraW0gY8awxqFuZyBuw6BvIGPDsyB0cuG7jW5nIGzGsOG7o25nIG7hurduZyBoxqFuIHPhur0gY8OzIGdpw6EgY2FvIGjGoW4gdsOgIG5nxrDhu6NjIGzhuqFpLCB0cuG7jW5nIGzGsOG7o25nIGNo4buJIGzDoCAxIHRyb25nIGPDoWMgeeG6v3UgdOG7kSDEkeG7gyDEkcOhbmggZ2nDoSBtw6AgdGjDtGkNCg0KLS0tDQoNCiMjIyMgKipUw7NtIHThuq90IHPGoSBsxrDhu6NjKioNCg0KxJDhuqd1IHRpw6puLCB0YSAqKnTDs20gdOG6r3Qgc8ahIGzGsOG7o2MgduG7gSB0cuG7jW5nIGzGsOG7o25nKiogY+G7p2EgY8OhYyB2acOqbiBraW0gY8awxqFuZyBi4bqxbmcgY8OhY2ggOiANCg0KVGEgdGnhur9uIGjDoG5oICoqY3V0IGhheSBn4buNaSBsw6AgY2hpYSA1Myw5NDAgdmnDqm4ga2ltIGPGsMahbmcqKiB0aMOgbmggKio1IG5ow7NtKiogdGhlbyB0cuG7jW5nIGzGsOG7o25nIG5oxrAgc2F1IDogDQoNCg0KYGBge3J9DQp0YWJsZShjdXQoS0MkY2FyYXQsNSkpDQpgYGANCg0KYGBge3J9DQoNCktDJGNhcmF0LmM8LSBjdXQoS0MkY2FyYXQsNSwgbGFiZWxzID0gYygnUuG6pXQgbmjhurknLCdOaOG6uScsJ1bhu6thJywnTuG6t25nJywnUuG6pXQgbuG6t25nJykpDQp0YWJsZShLQyRjYXJhdC5jKQ0KYGBgDQoNClRhIMSRw6MgY2hpYSB0aMOgbmggNSBraG/huqNuZyB2w6AgdHJvbmcgKipt4buXaSBraG/huqNuZyB0cuG7jW5nIGzGsOG7o25nIGNhcmF0KiogxJHDsyBjw7MgYmFvIG5oacOqdSB2acOqbiBraW0gY8awxqFuZw0KDQotIELDqm4gY+G6oW5oIMSRw7MsIHRhIGPFqW5nIMSRxrBhIHJhIG5o4bqtbiB4w6l0IHRyxrDhu5tjIHRpw6puIGzDoCBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIGPDsyAqKnRy4buNbmcgbMaw4bujbmcgY8OgbmcgY2FvIHRow6wgY8Ogbmcgw610IGThuqduKioNCg0KLSA1IG5ow7NtIMSRxrDhu6NjIGNoaWEgcmEgbmjGsCBzYXUgOiANCg0KICAgIC0gKipOaMOzbSBS4bqldCBuaOG6uSoqIC0gY8OzIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgKip04burIDAuMTkgxJHhur9uIDEuMTYqKiwgdOG7lW5nICoqNDMsNzgxIHZpw6puKioNCiAgICANCiAgICAtICoqTmjDs20gTmjhurkqKiAtIGPDsyB0cuG7jW5nIGzGsOG7o25nIGNhcmF0ICoqdOG7qyAxLjE2IMSR4bq/biAyLjEyKiosIHThu5VuZyAqKjksNDc4IHZpw6puKioNCg0KICAgIC0gKipOaMOzbSBW4burYSoqIC0gY8OzIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgKip04burIDIuMTIgxJHhur9uIDMuMDkqKiwgdOG7lW5nICoqNjY3IHZpw6puKioNCiAgICANCiAgICAtICoqTmjDs20gTuG6t25nKiogLSBjw7MgdHLhu41uZyBsxrDhu6NuZyBjYXJhdCAqKnThu6sgMy4wOSDEkeG6v24gNC4wNSoqLCB04buVbmcgKioxMSB2acOqbioqDQoNCiAgICAtICoqTmjDs20gUuG6pXQgbuG6t25nKiogLSBjw7MgdHLhu41uZyBsxrDhu6NuZyBjYXJhdCAqKnThu6sgNC4wNSDEkeG6v24gNS4wMSoqLCB04buVbmcgKiozIHZpw6puKioNCiAgICANCiAgICANClNhdSDEkcOzLCB0YSAqKnRp4bq/biBow6BuaCB24bq9IGJp4buDdSDEkeG7kyoqIMSR4buDIHRo4bqleSByw7UgaMahbiDEkcaw4bujYyBz4buxIGtow6FjIGJp4buHdCBj4bunYSBt4buXaSBuaMOzbSB0cuG7jW5nIGzGsOG7o25nIGNhcmF0DQoNCi0tLSANCg0KIyMjICoqQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBUcuG7jW5nIGzGsOG7o25nKioNCg0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQoNCktDIDwtIGRpYW1vbmRzDQpLQzEgPC0gS0MgJT4lIG11dGF0ZShUTENhcmF0ID0gY3V0KGNhcmF0LDUsIGxhYmVsID0gYygnUuG6pXQgbmjhurknLCAnTmjhurknLCdW4burYScsJ07hurduZycsJ1LhuqV0IG7hurduZycpKSkNCktDMSAlPiUgZ3JvdXBfYnkoVExDYXJhdCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhUTENhcmF0LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYmx1ZScpICsNCiAgICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG5ow7NtIHRoZW8gQ2FyYXQgIikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDAsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdUcuG7jW5nIEzGsOG7o25nJywgeSA9ICdT4buRIGzGsOG7o25nJykNCg0KYGBgDQoNCg0KIyMjIyAqKk5o4bqtbiB4w6l0IFRy4buNbmcgbMaw4bujbmcgMSoqDQoNCi0gVHLGsOG7m2MgdGnDqm4gdGEgdGjhuqV5IGzGsOG7o25nIHBow6JuIGLhu5UgY+G7p2EgY8OhYyB2acOqbiBraW0gY8awxqFuZyB0aGVvIGPDoWMgbmjDs20gdHLhu41uZyBsxrDhu6NuZyBsw6Aga2jDtG5nIMSR4buTbmcgxJHhu4F1DQoNCi0gKipD4buZdCBS4bqldCBuaOG6uSoqIGNoaeG6v20gKipz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0LyDDoXAgxJHhuqNvIG5o4bqldCoqIHRyb25nIDUgY+G7mXQNCg0KICAgIC0gVuG7m2kgdOG7lW5nIGzDoCA0Myw3ODEgdmnDqm4gdHLDqm4gdOG7lW5nIDUzLDk0MCB2acOqbiBraW0gY8awxqFuZywgdsOgIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgbsOgeSBjw7MgdHLhu41uZyBsxrDhu6NuZyB04burIDAuMTk1IMSR4bq/biAxLjE2DQogICAgDQogICAgLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIGPDsyB0cuG7jW5nIGzGsOG7o25nIHLhuqV0IG5o4bq5IGzDoCAqKmNoaeG6v20gxJHhuqFpIMSRYSBz4buRIHbDoCBk4buFIHTDrG0gdGjhuqV5IGjGoW4qKiANCg0KLSBL4bq/IHRp4bq/cCBsw6AgMiAqKmPhu5l0IE5o4bq5IHbDoCBj4buZdCBW4burYSoqIHbhu5tpIHPhu5Ega2ltIGPGsMahbmcgbOG6p24gbMaw4bujdCBsw6AgOSw0NzggdsOgIDY2Nw0KDQogICAgLSBLaW0gY8awxqFuZyBjw7MgdHLhu41uZyBsxrDhu6NuZyBOaOG6uSB2w6AgVuG7q2EgdGjDrCAqKsOtdCBoxqFuIGjhurNuKiogc28gduG7m2kgUuG6pXQgbmjhurkNCiAgICANCiAgICAtIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgUuG6pXQgbmjhurkgKipn4bqlcCBoxqFuIDQgbOG6p24qKiBzbyB24bubaSBS4bqldCBuaOG6uSwgdsOgICoqZ+G6pXAgNjUgbOG6p24qKiBzbyB24bubaSBW4burYQ0KICAgIA0KICAgIC0gVOG7qyDEkcOzIGPDoG5nIGNobyB0aOG6pXkgc+G7sSDEkeG6oWkgdHLDoCBj4bunYSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRy4buNbmcgbMaw4bujbmcgUuG6pXQgbmjhurksIGPFqW5nIG5oxrAgc+G7sSDDrXQgY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBOaOG6uSB2w6AgVuG7q2ENCg0KLSBLaW0gY8awxqFuZyDhu58gKipj4buZdCBO4bq3bmcqKiBjaOG7iSBjw7MgMTEgdmnDqm4gdsOgICoqY+G7mXQgUuG6pXQgbuG6t25nKiog4bufIG3hu6ljIGPhu7FjIGhp4bq/bSBjaOG7iSBjw7MgMyB2acOqbg0KDQogICAgLSBDw6FjIHZpw6puIGtpbSBjxrDGoW5nIOG7nyAyIGPhu5l0IG7DoHkgY8OzIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgdHLDqm4gMywwOSBjYXJhdCwgY8OzIHRo4buDIHjhur9wIHbDoG8gbeG7pWMgY+G7sWMgaGnhur9tIHbDoCBraMOzIHTDrG0gdGjhuqV5DQogICAgDQogICAgLSBO4bq/dSBzbyBj4buZdCBS4bqldCBuaOG6uSB2w6AgUuG6pXQgbuG6t25nIHbhu5tpIG5oYXUgdGjDrCAqKmPhu5l0IFLhuqV0IG5o4bq5IGfhuqVwIGjGoW4gMTQsMDAwIGzhuqduKioNCg0KLS0tDQoNCkLDqm4gY+G6oW5oIMSRw7MsIHRhIGPDsyB0aOG7gyBjaHV54buDbiBj4bulIHRo4buDIHPhu5EgbMaw4bujbmcgbmjGsCB0csOqbiB0aMOgbmggJSBzbyB24bubaSB04buVbmcgc+G7kSwgxJHhu4MgZOG7hSBkw6BuZyBuaOG6rW4geMOpdCBoxqFuIG7hu69hDQoNCmBgYHtyfQ0KbGlicmFyeShzY2FsZXMpDQpLQzEgPC0gS0MgJT4lIG11dGF0ZShUTENhcmF0ID0gY3V0KGNhcmF0LDUsIGxhYmVsID0gYygnUuG6pXQgbmjhurknLCAnTmjhurknLCdW4burYScsJ07hurduZycsJ1LhuqV0IG7hurduZycpKSkNCktDMSAlPiUgZ3JvdXBfYnkoVExDYXJhdCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhUTENhcmF0LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYmx1ZScpICsNCiAgICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duICUgdGhhbmcgxJFvIENhcmF0ICIpICsNCiAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKEtDJGNhcmF0KSkpLHZqdXN0ID0gMCwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ1Ry4buNbmcgTMaw4bujbmcnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KDQpgYGANCg0KDQojIyMjICoqTmjhuq1uIHjDqXQgVHLhu41uZyBsxrDhu6NuZyAyKioNCg0KLSBW4bqrbiB0xrDGoW5nIHThu7EgbmjGsCBuaOG6rW4geMOpdCBwaMOtYSB0csOqbiwgKipj4buZdCBS4bqldCBuaOG6uSB24bubaSBoxqFuIDQwLDAwMCB2acOqbiAtIGNoaeG6v20gdOG7m2kgaMahbiA4MCUqKiB0csOqbiAxMDAlDQoNCi0gKipD4buZdCBOaOG6uSoqIMSR4bupbmcgdGjhu6kgMiwgc2F1IGPhu5l0IFLhuqV0IG5o4bq5IHbhu5tpICoqaMahbiAxNyUqKiAtIGtob+G6o25nIGPDoWNoIHbhu5tpIGPhu5l0IMSR4bupbmcgbmjhuqV0IGzDoCBoxqFuIDYwJQ0KDQotICoqMyBj4buZdCBW4burYSAtIE7hurduZyAtIFLhuqV0IG7hurduZyoqIHbhu5tpIHBo4bqnbiB0csSDbSBy4bqldCBuaOG7jywgdGjhuq1tIGNow60gbMOgIGPDsyB0aOG7gyB44bq/cCB2w6BvIG3hu6VjIGPhu7FjIGPhu7FjIGhp4bq/bSAtIGzhuqduIGzGsOG7o3QgbMOgICoqMS4yJSAtIDAsMDIlIC0gMCwwMDYlKioNCg0KLSBLaGkgZOG7sWEgdsOgbyBwaOG6p24gdHLEg20sIHRhIGPDoG5nIHRo4bqleSByw7UgaMahbiAqKsSR4buZIMSR4bqhaSB0csOgIGPFqW5nIG5oxrAgxJHhu5kgaGnhur9tKiogY+G7p2EgdOG7q25nIG3hu6ljIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgY+G7p2EgY8OhYyB2acOqbiBraW0gY8awxqFuZw0KDQotIE5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgY8OzICoqdHLhu41uZyBsxrDhu6NuZyBjw6BuZyBjYW8gdGjDrCBjw6BuZyBoaeG6v20gdGjhuqV5KiosIHbDoCB24bubaSB0cuG7jW5nIGzGsOG7o25nIG5o4bq5IHRow6wgbmfGsOG7o2MgbOG6oWkNCg0KTmjGsG5nIGNo4buJIG3hu5dpIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgdGjDtGkgdGjDrCBjaMawYSDEkeG7pyBjaHXhuqluIHjDoWMgxJHhu4MgxJHDoW5oIGdpw6EgaOG6v3QgbeG7mXQgdmnDqm4ga2ltIGPGsMahbmcsIHRhIHRp4bq/biBow6BuaCB4w6l0IHRp4bq/cCDEkeG6v24gdGnDqnUgY2jDrSB0aOG7qSBoYWkNCg0KLS0tDQoNCiMjICoqMi4gQ3V0IC0gR2nDoWMgY+G6r3QqKg0KDQoqKkdpw6FjIGPhuq90KiogaGF5IGPDsm4gZ+G7jWkgbMOgICoqduG6v3QgY+G6r3QgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcqKiwgxJHGsOG7o2MgeGVtIGzDoCDEkeG7mSBjaMOtbmggeMOhYyB24buBIGfDs2MgxJHhu5kgdsOgIHThu4kgbOG7hyBj4bqvdCB4w6luIGPhu6dhIGtpbSBjxrDGoW5nLCBraGkgxJHDoW5oIGdpw6EgdGjDrCB04burbmcgbeG6t3QgxJHGsOG7o2Mga2nhu4NtIHRyYSBjaGkgdGnhur90IHbDoCDEkW8gbMaw4budbmcgY+G7pSB0aOG7gyANCg0KLSDEkMOieSDEkcaw4bujYyB4ZW0gbMOgICoqeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcgbmjhuqV0KiogdHJvbmcgdGnDqnUgY2jDrSA0Qw0KDQotIFbDrCBuw7MgY8OzIHRo4buDICoq4bqjbmggaMaw4bufbmcgxJHhur9uIHbhursgxJHhurlwIHbDoCDEkeG7mSBs4bqlcCBsw6FuaCBiw6puIG5nb8OgaSoqIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nDQoNCi0gMiB54bq/dSB04buRIERpYW1vbmQgVGFibGUgdsOgIERpYW1vbmQgRGVwdGggY8WpbmcgYmFvIGfhu5NtIHRyb25nIHBo4bqnbiBHacOhYyBj4bqvdCBuw6B5DQoNCg0KKipUaGFuZyDEkW8gZ2nDoWMgY+G6r3QqKiBLaW0gY8awxqFuZyBiYW8gZ+G7k20gOg0KDQotIEdpw6FjIGPhuq90ICoqSWRlYWwgLSBMw70gdMaw4bufbmcqKg0KDQotIEdpw6FjIGPhuq90ICoqUHJlbWl1bS8gRXhjZWxsZW50IC0gVHV54buHdCBo4bqjbyoqDQoNCi0gR2nDoWMgY+G6r3QgKipWZXJ5IEdvb2QgLSBS4bqldCB04buRdCoqDQoNCi0gR2nDoWMgY+G6r3QgKipHb29kIC0gVOG7kXQqKg0KDQotIEdpw6FjIGPhuq90ICoqRmFpciAtIFRydW5nIGLDrG5oKioNCg0KLSBHacOhYyBj4bqvdCAqKlBvb3IgLSBLw6ltKiogDQoNCi0tLQ0KDQojIyMjICoqVMOzbSB04bqvdCBzxqEgbMaw4bujYyoqDQoNClbhu5tpIHRpw6p1IGNow60gduG7gSBHacOhYyBj4bqvdCwgdGEgdGjhuqV5IGNo4bqldCBsxrDhu6NuZyBraW0gY8awxqFuZyDEkcaw4bujYyAqKmNoaWEgcmEgbMOgbSA1IG5ow7NtKiogKGtow7RuZyBiYW8gZ+G7k20gdGhhbmcgxJFvIFBvb3IgbmjGsCDEkcOjIG7DqnUpLCBjaOG7iSBiYW8gZ+G7k20gOiANCg0KDQpgYGB7cn0NCnRhYmxlKEtDJGN1dCkNCmBgYA0KDQoNCi0gNSBuaMOzbSDEkcaw4bujYyBjaGlhIHRoZW8gY2jhuqV0IGzGsOG7o25nIGdpw6FjIGPhuq90IGfhu5NtIDogDQoNCiAgICAtICoqTmjDs20gRmFpcioqIC0gbeG7qWMgdHJ1bmcgYsOsbmgsIGPDsyB04buVbmcgKioxLDYxMCB2acOqbioqDQogICAgDQogICAgLSAqKk5ow7NtIEdvb2QqKiAtIG3hu6ljIHThu5F0LCBjw7MgdOG7lW5nICoqNCw5MDYgdmnDqm4qKg0KICAgIA0KICAgIC0gKipOaMOzbSBWZXJ5IEdvb2QqKiAtIG3hu6ljIHLhuqV0IHThu5F0LCBjw7MgdOG7lW5nICoqMTIsMDgyIHZpw6puKioNCiAgICANCiAgICAtICoqTmjDs20gUHJlbWl1bSoqIC0gbeG7qWMgdHV54buHdCBo4bqjbywgY8OzIHThu5VuZyAqKjEzLDc5MSB2acOqbioqDQoNCiAgICAtICoqTmjDs20gSWRlYWwqKiAtIG3hu6ljIGzDvSB0xrDhu59uZywgY8OzIHThu5VuZyAqKjIxLDU1MSB2acOqbioqDQogICAgDQpTYXUgxJHDsywgdGEgKip0aeG6v24gaMOgbmggduG6vSBiaeG7g3UgxJHhu5MqKiDEkeG7gyB0aOG6pXkgcsO1IGjGoW4gxJHGsOG7o2Mgc+G7sSBraMOhYyBiaeG7h3QgY+G7p2EgbeG7l2kgbmjDs20gDQoNCi0tLSANCg0KIyMjICoqQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBHacOhYyBj4bqvdCoqDQoNCg0KYGBge3J9DQpLQyAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKGN1dCxuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3llbGxvdycpICsNCiAgICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG5ow7NtIHRoZW8gQ3V0ICIpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArDQogICAgbGFicyh4ID0gJ1RoYW5nIMSRbyBDdXQnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KDQpgYGANCg0KDQojIyMjICoqTmjhuq1uIHjDqXQgR2nDoWMgY+G6r3QgMSoqDQoNCi0gVHLGsOG7m2MgdGnDqm4gdGEgdGjhuqV5IMSRxrDhu6NjIG3hu6ljIMSR4buZIGhvw6BuIHRoaeG7h24gZ2nDoWMgY+G6r3Qg4bufIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgbMOgIGtow7RuZyDEkeG7k25nIMSR4buBdQ0KDQotIE3hu6ljIHRhIGPDsyB0aOG7gyB0aOG6pXkgcsO1IHLDoG5nIG5o4bqldCBsw6AgKipt4bupYyBJZGVhbCoqIC0gY2hp4bq/bSAqKnPhu5EgbMaw4bujbmcgbmhp4buBdSBuaOG6pXQqKg0KDQogICAgLSBW4bubaSB04buVbmcgbMOgIDIxLDUxMSB2acOqbiB0csOqbiA1Myw5NDAgdmnDqm4ga2ltIGPGsMahbmcsIGNoaeG6v20gKipn4bqnbiBt4buZdCBu4butYSBzbyB24bubaSB04buVbmcgc+G7kSoqDQogICAgDQogICAgLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIMSRxrDhu6NjIGNo4bq/IHTDoWMg4bufICoqbeG7qWMgxJHhu5kgbMO9IHTGsOG7n25nKiogbMOgIGtow6Egbmhp4buBdQ0KICAgIA0KICAgIC0gxJDGsOG7o2MgYmnhur90IG5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgSWRlYWwgQ3V0IGzDoCBy4bqldCBob8OgbiBo4bqjbywgxJHDoyDEkcaw4bujYyB0w61uaCB0b8OhbiBj4bqpbiB0aOG6rW4gxJHhur9uIHThu6tuZyB04buJIGzhu4cgZ8OzYyBj4bqhbmgNCg0KLSBL4bq/IHRp4bq/cCBsw6AgY8OhYyAqKjIgbeG7qWMgUHJlbWl1bSB2w6AgbeG7qWMgVmVyeSBHb29kKiosIHbhu5tpIHPhu5Ega2ltIGPGsMahbmcgbOG6p24gbMaw4bujdCBsw6AgMTMsNzkxIHbDoCAxMiwwODIgdmnDqm4NCg0KICAgIC0gRMO5IMOtdCBoxqFuIHNvIHbhu5tpIG3hu6ljIGzDvSB0xrDhu59uZywgbmjGsG5nIDIgbeG7qWMgbsOgeSDEkeG7gXUgY8OzIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNoaeG6v20gdHJ1bmcgYsOsbmggdHLDqm4gdOG7lW5nIHPhu5ENCiAgICANCiAgICAtIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbeG7qWMgSWRlYWwgKipn4bqlcCBoxqFuIDEsNSBs4bqnbiBzbyB24bubaSBt4bupYyBQcmVtaXVtKiosIHbDoCAqKmfhuqVwIDEsNyBs4bqnbiBzbyB24bubaSBt4bupYyBWZXJ5IEdvb2QqKg0KICAgIA0KICAgIC0gTeG7qWMgUHJlbWl1bSB2w6AgVmVyeSBHb29kIGPFqW5nIGNo4buJIGNow6puaCBs4buHbmggbmhhdSBraG/huqNuZyAxLDAwMCB2acOqbiwgY8Wpbmcga2jDtG5nIHBo4bqjaSBsw6Aga2hv4bqjbmcgY2jDqm5oIGzhu4duaCBxdcOhIGzhu5tuDQogICAgDQogICAgLSBU4burIMSRw7MgY2hvIHRo4bqleSwgbeG7qWMgY8OhY2ggYmnhu4d0IGPhu6dhIDMgdGhhbmcgxJFvIMSR4bqndSB0acOqbiBjxaluZyBraMO0bmcgcXXDoSByw7UgcuG7h3QNCg0KLSBLaW0gY8awxqFuZyDhu58gKipt4bupYyBHb29kIHbDoCBGYWlyKiogbOG6p24gbMaw4bujdCBsw6AgNCw5MDYgdsOgIDEsNjEwIHZpw6puDQoNCiAgICAtIEPDoWMgdmnDqm4ga2ltIGPGsMahbmcgxJHGsOG7o2MgY2jhur8gdMOhYyDhu58gbeG7qWMgbsOgeSB0aMOsICoqw610IGjGoW4gaOG6s24qKiBzbyB24bubaSBjw6FjIG3hu6ljIOG7nyB24buLIHRyw60gxJHhuqd1DQogICAgDQogICAgLSBWw6wgxJHDonkgbMOgICoqMiBt4bupYyDEkcaw4bujYyDEkcOhbmggZ2nDoSB0aOG6pXAgbmjhuqV0KiogdHJvbmcgxJHDoW5oIGdpw6EgduG7gSBHacOhYyBj4bqvdCBuw6puIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY8Wpbmcgw610IGjGoW4gaOG6s24NCg0KLS0tDQoNCkPFqW5nIGdp4buRbmcgbmjGsCB0cuG7jW5nIGzGsOG7o25nLCB0YSBjw7MgdGjhu4MgY2h1eeG7g24gY+G7pSB0aOG7gyBz4buRIGzGsOG7o25nIHRow6BuaCAlIHNvIHbhu5tpIHThu5VuZyBz4buRLCDEkeG7gyBk4buFIGTDoG5nIG5o4bqtbiB4w6l0IGjGoW4NCg0KYGBge3J9DQoNCktDICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0neWVsbG93JykgKw0KICAgIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiAlIHRoYW5nIMSRbyBDdXQgIikgKw0KICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQobi9sZW5ndGgoS0MkY3V0KSkpLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICAgIGxhYnMoeCA9ICdUaGFuZyDEkW8gQ3V0JywgeSA9ICdT4buRIGzGsOG7o25nJykNCg0KYGBgDQoNCg0KIyMjIyAqKk5o4bqtbiB4w6l0IEdpw6FjIGPhuq90IDIqKg0KDQotIFbhuqtuIHTGsMahbmcgdOG7sSBuaMawIG5o4bqtbiB4w6l0IHBow61hIHRyw6puLCAqKm3hu6ljIGzDvSB0xrDhu59uZyAtIElkZWFsIGNoaeG6v20gNDAlKiogdHLDqm4gdOG7lW5nIHPhu5ENCg0KLSBN4bq3YyBkw7kgbeG7qWMgbMO9IHTGsOG7n25nIGNoaeG6v20gbmhp4buBdSBuaOG6pXQgKGfhuqduIG3hu5l0IG7hu61hKSwgbmjGsG5nIG7DsyBjw7Mgc+G7kSBsaeG7h3Uga2jDtG5nIHF1w6Egw6FwIMSR4bqjbyBzbyB24bubaSBjw6FjIG3hu6ljIGPDsm4gbOG6oWkNCg0KLSAqKk3hu6ljIFR1eeG7h3QgaOG6o28gUHJlbWl1bSB2w6AgUuG6pXQgdOG7kXQgVmVyeSBHb29kKiogxJHhu6luZyBs4bqnbiBsxrDhu6N0IHRo4bupIDIgdsOgIDMgduG7m2kgMjUuNiUgdsOgIDIyLDQlLCBt4buXaSBt4bupYyBjxaluZyBi4bqxbmcgaMahbiBt4buZdCBu4butYSBzbyB24bubaSBt4bupYyBJZGVhbA0KDQotIOG7niAqKjIgbeG7qWMgY3Xhu5FpIGPDuW5nIGzDoCBU4buRdCBHb29kIHbDoCBUcnVuZyBiw6xuaCBGYWlyKiogduG7m2kgcGjhuqduIHRyxINtIMOtdCBuaOG6pXQgbOG6p24gbMaw4bujdCBsw6AgOSwxJSB2w6AgMyUsIGNo4bupbmcgdOG7jyBt4bupYyBjaOG6vyB0w6FjIOG7nyAyIG3hu6ljIG7DoHkga2jDtG5nIMSRxrDhu6NjIMawYSBjaHXhu5luZyBi4bqxbmcgMyBt4bupYyBjw7JuIGzhuqFpDQoNCi0gS2hpIGThu7FhIHbDoG8gcGjhuqduIHRyxINtLCB0YSBjw6BuZyB0aOG6pXkgcsO1IGjGoW4gY8OhYyBt4bupYyDEkeG7mSB0aGFuaCDEkW8gduG7gSBt4bq3dCBj4bqvdCBj4bunYSBraW0gY8awxqFuZw0KDQotIEPDoWMgdmnDqm4gY8OzIHThu7cgbOG7hyBjaOG6vyB0w6FjIGPDoG5nIGhvw6BuIGjhuqNvIHRow6wgc+G6vSBjw7MgZ2nDoSB0aMOgbmggY2FvIHbDoCDEkcaw4bujYyDGsGEgY2h14buZbmcgaMahbg0KDQotLS0NCg0KIyMgKiozLiBDb2xvciAtIE3DoHUgc+G6r2MqKg0KDQoqKk3DoHUgc+G6r2MqKiBj4bunYSBraW0gY8awxqFuZyAoaGF5IGPDsm4gZ+G7jWkgbMOgIE7GsOG7m2Mga2ltIGPGsMahbmcpIGPDsyBy4bqldCBuaGnhu4F1IHbDoCBjw6FjIG3DoHUgc+G6r2MgxJHDsyDEkcaw4bujYyBwaMOibiBsb+G6oWkgZ+G7jWkgbMOgICoqQ+G6pXAgxJHhu5kgbcOgdSBz4bqvYyoqIA0KDQotIE3hu5l0IHZpw6puIGtpbSBjxrDGoW5nICoqY8OgbmcgY8OzIMOtdCBtw6B1IHPhuq9jIHRow6wgc+G6vSBwaOG6o24geOG6oSDDoW5oIHPDoW5nIGPDoG5nIGNow6JuIHRo4bqtdCoqDQoNCi0gVGjDtG5nIHRoxrDhu51uZyBz4bq9IG5ow6xuIHThu6sgcGjhuqduIMSRw6F5IGPhu6dhIGtpbSBjxrDGoW5nIMSR4buDIGdpw6FtIMSR4buLbmggbcOgdSBz4bqvYyBj4bunYSBuw7MNCg0KDQoqKkPhuqVwIMSR4buZIG3DoHUgc+G6r2MqKiBn4buTbSA1IGPhuqVwIMSR4buZIG3DoHUgdsOgIGPDsyAyMyBtw6B1IG5oxrAgc2F1IDogDQoNCi0gKipNw6B1IEQgLSBFIC0gRioqIDogeOG6v3AgdsOgbyAqKmxv4bqhaSBLaMO0bmcgbcOgdSAoQ29sb3JsZXNzKSoqDQoNCi0gKipNw6B1IEcgLSBIIC0gSSAtIEoqKiA6IHjhur9wIHbDoG8gKipsb+G6oWkgR+G6p24gbmjGsCBraMO0bmcgbcOgdSAoTmVhciBDb2xvcmxlc3MpKioNCg0KLSAqKk3DoHUgSyAtIEwgLSBNKiogOiB44bq/cCB2w6BvICoqbG/huqFpIE3DoHUgcuG6pXQgbmjhuqF0IChGYWludCBZZWxsb3cpKioNCg0KLSAqKk3DoHUgTiAtIE8gLSBQIC0gUSAtIFIqKiA6IHjhur9wIHbDoG8gKipsb+G6oWkgTcOgdSBuaOG6oXQgKFZlcnkgTGlnaHQgWWVsbG93KSoqDQoNCi0gKipNw6B1IFMgLSBUIC0gVSAtIFYgLSBXIC0gWCAtIFkgLSBaKiogOiB44bq/cCB2w6BvICoqbG/huqFpIE3DoHUgdsOgbmcgKExpZ2h0IFllbGxvdykqKg0KDQotLS0NCg0KIyMjIyAqKlTDs20gdOG6r3Qgc8ahIGzGsOG7o2MqKg0KDQpN4buXaSB2acOqbiBraW0gY8awxqFuZyDEkeG7gXUgY8OzIG3DoHUgc+G6r2MgcmnDqm5nIGJp4buHdCB2w6AgY8OzIHThu5tpIDIzIG3DoHUgc+G6r2MgZMOgbmggY2hvIHZp4buHYyDEkcOhbmggZ2nDoSBraW0gY8awxqFuZw0KDQpOaMawbmcgduG7m2kgYuG7mSBk4buvIGxp4buHdSB0aMOsIHPhur0ga2jDtG5nIMSR4bqneSDEkeG7pyB04bqldCBj4bqjIGPDoWMgbcOgdSDEkcOjIG7DqnUgLSAqKmNo4buJIGJhbyBn4buTbSA3IG3DoHUqKiBuaMawIHNhdSA6DQoNCmBgYHtyfQ0KdGFibGUoS0MkY29sb3IpDQpgYGANCg0KLSBUaGVvIG5oxrAgYuG6o25nIHThuqduIHPhu5EgxJHDoyBjaGlhIGLDqm4gdHLDqm4sIGPDsyA3IG3DoHUgc+G6r2MgdOG6pXQgY+G6oyANCg0KLSA3IG3DoHUgZ+G7k20gdOG7qyAqKkQgxJHhur9uIEoqKiwgbeG7l2kgbcOgdSBjw7MgKipz4buRIHZpw6puIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgbmjGsCBi4bqjbmcgdHLDqm4qKg0KDQotICoqMyBNw6B1IEQgLSBFIC0gRioqIGzDoCBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIHRodeG7mWMgY+G6pXAgKipraMO0bmcgbcOgdSoqDQoNCiAgICAtICoqTcOgdSBEKiogY8OzIHThu5VuZyBsw6AgNiw3NzUgdmnDqm4NCiAgICANCiAgICAtICoqTcOgdSBFKiogY8OzIHThu5VuZyBsw6AgOSw3OTcgdmnDqm4NCiAgICANCiAgICAtICoqTcOgdSBGKiogY8OzIHThu5VuZyBsw6AgOSw1NDIgdmnDqm4NCiAgICANCi0gKipNw6B1IEcgLSBIIC0gSSAtIEoqKiBsw6AgY8OhYyB2acOqbiBraW0gY8awxqFuZyB0aHXhu5ljIGPhuqVwICoqZ+G6p24gbmjGsCBraMO0bmcgbcOgdSoqDQoNCiAgICAtICoqTcOgdSBHKiogY8OzIHThu5VuZyBsw6AgMTEsMjkyIHZpw6puDQogICAgDQogICAgLSAqKk3DoHUgSCoqIGPDsyB04buVbmcgbMOgIDgsMzA0IHZpw6puDQogICAgDQogICAgLSAqKk3DoHUgSSoqIGPDsyB04buVbmcgbMOgIDUsNDIyIHZpw6puDQogICAgDQogICAgLSAqKk3DoHUgSioqIGPDsyB04buVbmcgbMOgIDIsODA4IHZpw6puDQoNCi0tLQ0KDQojIyMgKipCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIE3DoHUgc+G6r2MqKg0KDQpgYGB7cn0NCktDICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhuLGNvbG9yKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3BpbmsnKSArDQogICAgbGFicyh0aXRsZSA9ICIgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBuaMOzbSB0aGVvIENvbG9yICIpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAxLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnU+G7kSBsxrDhu6NuZycsIHkgPSAnQ8OhYyBtw6B1IHPhuq9jJykNCmBgYA0KDQoNCiMjIyMgKipOaOG6rW4geMOpdCBNw6B1IHPhuq9jIDEqKg0KDQotIE5ow6xuIHThu5VuZyBxdWFuIHRhIHRo4bqleSDEkcaw4bujYyBj4bqjIDcgbcOgdSBz4bqvYyDEkeG7gXUgY8OzIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcga2jDtG5nIHF1w6Egw610IGPFqW5nIGtow7RuZyBxdcOhIG5oaeG7gXUNCg0KLSBO4buVaSBi4bqtdCBuaOG6pXQgbMOgICoqbcOgdSBHKiogY2hp4bq/bSAqKnPhu5EgbMaw4bujbmcgbmhp4buBdSBuaOG6pXQqKiwgduG7m2kgMTEsMjkyIHZpw6puIHRyw6puIHThu5VuZyBz4buRDQoNCi0gTmfGsOG7o2MgbOG6oWkgKiptw6B1IEoqKiBjw7MgKipz4buRIGzGsOG7o25nIMOtdCBuaOG6pXQqKiwgduG7m2kgMiw4MDggdmnDqm4NCg0KLSBLaGkgc28gc8OhbmggMiBtw6B1IG5oaeG7gXUgbmjhuqV0IHbDoCDDrXQgbmjhuqV0LCB0YSB0aOG6pXkgKiptw6B1IEcgZ+G6pXAgaMahbiA0IGzhuqduIG3DoHUgSioqDQogICAgDQotIEPDoWMgKiptw6B1IEUsIEYsIEgqKiBs4bqnbiBsxrDhu6N0ICoqxJHhu6luZyB0aOG7qSAyLDMsNCBzYXUgbcOgdSBHKiosIHbhu5tpIHPhu5EgbMaw4bujbmcgdOG7q25nIGxv4bqhaSBjxaluZyBn4bqnbiBuaMawIG5nYW5nIGLhurFuZyBuaGF1DQoNCiAgIC0gTmjGsCBtw6B1IEUgdsOgIEYgY2jhu4kgY8OhY2ggbmhhdSBoxqFuIDIwMCB2acOqbiwgc+G7kSBsxrDhu6NuZyBjxaluZyBraMO0bmcgxJHDoW5nIGvhu4MNCiAgIA0KICAgLSBWw6AgbcOgdSBGIHbDoCBIIGPDoWMgbmhhdSBraG/huqNuZyBoxqFuIDEwMDAgdmnDqm4NCiAgIA0KLSAyIG3DoHUgc+G6r2MgKirDrXQgaMahbiBu4buvYSBsw6AgRCB2w6AgSSoqICwgduG7m2kgc+G7kSBsxrDhu6NuZyBs4bqnbiBsxrDhu6N0IGzDoCA2LDc3NSB2w6AgNSw0MjIgDQogICANCi0gROG7sWEgdsOgbyBz4buRIGzGsOG7o25nIHRyw6puLCB0YSB0aOG6pXkgY8OhYyBtw6B1IHPhuq9jIHRodeG7mWMgbmjDs20gZ+G6p24gbmjGsCBraMO0bmcgbcOgdSAoRyxILEksSikgY2hp4bq/bSBsxrDhu6NuZyBuaGnhu4F1IGjGoW4gc28gduG7m2kgbmjDs20ga2jDtG5nIG3DoHUgKEQsRSxGKQ0KICAgDQotLS0NCg0KQ8WpbmcgZ2nhu5FuZyBuaMawIDIgdGnDqnUgY2jDrSDEkcOjIG7Ds2kgdHLDqm4sIHRhIGNodXnhu4NuIHPhu5EgbMaw4bujbmcgY+G7pSB0aOG7gyB0aMOgbmggJSBzbyB24bubaSB04buVbmcgc+G7kSwgxJHhu4MgZOG7hSBkw6BuZyBuaOG6rW4geMOpdCBoxqFuDQoNCg0KYGBge3J9DQpLQyAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMobixjb2xvcikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdwaW5rJykgKw0KICAgIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiAlIHRoYW5nIMSRbyBDb2xvciAiKSArDQogICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aChLQyRjb2xvcikpKSx2anVzdCA9IDEsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdT4buRIGzGsOG7o25nJywgeSA9ICdDw6FjIG3DoHUgc+G6r2MnKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCBNw6B1IHPhuq9jIDIqKg0KDQotIFbhu5tpIHBo4bqnbiB0csSDbSBsw6AgKioyMCw5MyUgLSBNw6B1IHPhuq9jIEcqKiBjw7MgdOG7tyBs4buHIHPhu5EgdmnDqm4ga2ltIGPGsMahbmcgbmhp4buBdSBuaOG6pXQgdHLDqm4gdOG7lW5nIHPhu5ENCg0KLSBDw6FjICoqdOG7tyBs4buHIMSR4bupbmcgdGjhu6kgMiwzLDQqKiBs4bqnbiBsxrDhu6N0IGzDoCAqKm3DoHUgRSAtIDE4LDE2JSAsIG3DoHUgRiAtIDE3LDY5JSAsIG3DoHUgSCAtIDE1LDM5JSoqDQoNCiAgICAtIFThu7cgbOG7hyBj4bunYSAzIG3DoHUgbsOgeSBjw6FjaCBtw6B1IEcgxJHhu6luZyDEkeG6p3Uga2hv4bqjbmcgMi01JSwgY8Wpbmcga2jDtG5nIHBo4bqjaSBsw6AgY29uIHPhu5EgxJHDoW5nIGvhu4MNCiAgICANCiAgICAtIFThu6sgxJHDsyB0YSB0aOG6pXkgxJHGsOG7o2MsIGtow7RuZyBjw7MgbcOgdSBz4bqvYyBuw6BvIGzDoCBjw7Mgc+G7kSBsxrDhu6NuZyBjYW8gaMahbiBo4bqzbi8gcsO1IHLhu4d0IGjGoW4gY8OhYyBtw6B1IGPDsm4gbOG6oWkNCg0KLSAqKk3DoHUgRCB2w6AgSSoqIMSR4bupbmcgKipn4bqnbiDDoXAgYuG6o25nKiogduG7m2kgdOG7tyBs4buHIGtoacOqbSB04buRbiBoxqFuIDogKioxMiw1NiUgdsOgIDEwLDA1JSoqDQoNCi0gQ3Xhu5FpIGPDuW5nIG3DoHUgY8OzICoqdOG7tyBs4buHIMOtdCBuaOG6pXQqKiB0cm9uZyBiaeG7g3UgxJHhu5MgbMOgICoqbcOgdSBKIC0gY2jhu4kgduG7m2kgNSwyMSUqKg0KDQogICAgLSBLaG/huqNuZyBjw6FjaCBj4bunYSBtw6B1IG5oaeG7gXUgdsOgIMOtdCBuaOG6pXQgbMOgIGtob+G6o25nIDE1JQ0KICAgIA0KICAgIC0gVuG6rXkgdGEgY8WpbmcgY8OzIHRo4buDIG7Ds2kgcuG6sW5nIGTDuSBsw6AgbcOgdSDDrXQgbmjhuqV0IG5oxrBuZyBtw6B1IEogY8Wpbmcga2jDtG5nIHBo4bqjaSDhu58gbeG7qWMgY+G7sWMgaGnhur9tDQoNCi0tLSANCg0KIyMgKipM4buTbmcgZ2jDqXAgY8OhYyDEkeG6t2MgdMOtbmggduG7m2kgbmhhdSoqDQoNClRhIMSRw6MgdMOsbSBoaeG7g3UgdsOgIHjDqXQgcmnDqm5nIGJp4buHdCDEkcaw4bujYyAqKjMgdGnDqnUgY2jDrSoqIGzDoCA6IFRy4buNbmcgbMaw4bujbmcgQ2FyYXQgLSBHacOhYyBj4bqvdCBDdXQgLSBNw6B1IHPhuq9jIENvbG9yICANCg0KVHLGsOG7m2Mga2hpIMSR4bq/biB24bubaSB0acOqdSBjaMOtIHRo4bupIDQsIHRhIHPhur0gdGnhur9uIGjDoG5nICoqeMOpdCAzIHRpw6p1IGNow60gbsOgeSB24bubaSBuaGF1KiogKGtow7RuZyBjw7JuIHjDqXQgcmnDqm5nIGzhurspDQoNCi0gVmnhu4djIG7DoHkgY8OzIHRo4buDIGdpw7pwIHRo4bqleSByw7UgdHJvbmcgdOG7q25nIG3DoHUgc+G6r2MgY8OzIGJhbyBuaGnDqnUgdmnDqm4gbG/huqFpIG5oxrAgSWRlYWwsIFZlcnkgR29vZCwuLi4uLg0KDQotIEhheSB0cm9uZyB04burbmcgbG/huqFpIG3DoHUgc+G6r2MgY8OzIGJhbyBuaGnDqnUgdmnDqm4gY8OzIGPDom4gbuG6t25nIGTGsOG7m2kgMSwwMCBjYXJhdCwuLi4uIGNo4bqzbmcgaOG6oW4NCg0KLS0tDQoNCiMjIyAqKk3DoHUgc+G6r2MgLSBDb2xvciB2w6AgR2nDoWMgY+G6r3QgLSBDdXQqKg0KDQpLaGkgeMOpdCB04bubaSAyIHRpw6p1IGNow60gY8O5bmcgbeG7mXQgbMO6YywgdGEgc+G6vSB0aOG6pXkgxJHGsOG7o2MgY+G7pSB0aOG7gyBoxqFuIHNvIHbhu5tpIHjDqXQgcmnDqm5nIGJp4buHdA0KDQpU4burbmcgdmnDqm4ga2ltIGPGsMahbmcgdMawxqFuZyDhu6luZyB24bubaSBjw6FjIG3DoHUgc+G6r2MgdsOgIGdpw6FjIGPhuq90IHPhur0gcsO1IHLDoG5nIGjGoW4NCg0KDQpgYGB7cn0NCktDICU+JSBncm91cF9ieShjdXQsY29sb3IpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IG4pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAwLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBmYWNldF93cmFwKH5jb2xvcikgKw0KICAgIGxhYnMoeCA9ICdUaGFuZyDEkW8gQ3V0JywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNClbhu5tpIHThu5VuZyBz4buRICoqNyBtw6B1IHPhuq9jIGPDuW5nIHbhu5tpIDUgbG/huqFpIGdpw6FjIGPhuq90KiosIHRhIGPDsyB0aOG7gyB0aOG6pXkgNyBiaeG7g3UgxJHhu5MgdMawxqFuZyDhu6luZyB24bubaSB04burbmcgbcOgdSBz4bqvYyB2w6AgbeG7l2kgbcOgdSBz4bqvYyBjw7Mgc+G7kSBsxrDhu6NuZyBnacOhYyBj4bqvdCBj4bulIHRo4buDDQoNCi0gTmjDrG4gdOG7lW5nIHF1YW4sICoqY+G6oyA3IG3DoHUgxJHhu4F1IGPDsyBnacOhYyBj4bqvdCBMw70gdMaw4bufbmcgSWRlYWwgY2FvIG5o4bqldCB2w6AgRmFpciDDrXQgbmjhuqV0KioNCg0KLSBW4bubaSAqKkdpw6FjIGPhuq90IElkZWFsLCBtw6B1IEUgY8OzIHPhu5EgbMaw4bujbmcgbmhp4buBdSBuaOG6pXQgLSAzLDkwMyB2acOqbioqIHNvIHbhu5tpIGPDoWMgbcOgdSBjw7JuIGzhuqFpLCB0aGVvIHPDoXQgc2F1IGzDoCBtw6B1IEYgduG7m2kgMyw4MjYgdmnDqm4NCg0KLSBW4bubaSAqKm3hu6ljIFByZW1pdW0gdsOgIFZlcnkgR29vZCoqLCBjw6FjIG3DoHUgxJHhu4F1IGPDsyAqKnPhu5EgbMaw4bujbmcga2jDtG5nIHF1w6EgY2jDqm5oIGzhu4djaCoqLCB04bqldCBj4bqjIMSR4buBdSDhu58gbeG7qWMgdHJ1bmcgYsOsbmgsIGtow7RuZyBxdcOhIG5oaeG7gXUgdsOgIGPFqW5nIGtow7RuZyBxdcOhIMOtdA0KDQotIFbhu5tpICoqbeG7qWMgR29vZCB2w6AgRmFpcioqLCBz4buRIGzGsOG7o25nIMOtdCBoxqFuIGjhurNuIGPDoWMgbeG7qWMgY8OybiBs4bqhaSAtIHPhu7EgY2jDqm5oIGzhu4djaCB24bubaSBt4bupYyBJZGVhbCBsw6AgcXXDoSByw7UgcuG7h3QNCg0KS2hpIHRhIHjDqXQgdGnDqnUgY2jDrSB24buBIGdpw6FjIGPhuq90IGtow7RuZyB0aMO0aSBsw6AgY8WpbmcgxJHhu6cgxJHhu4MgdGEgaMOsbmggZHVuZyB24buBIGPDoWMgbmjDs20ga2ltIGPGsMahbmcgcGjDom4gYuG7lSBuaMawIHRo4bq/IG7DoG8sIG5oxrBuZyB2aeG7h2MgdMOhY2ggcmnDqm5nIHbDoCB0aMOqbSB54bq/dSB04buRIG3DoHUgc+G6r2MgdsOgbywgY2jhuq9jIGNo4bqvbiBz4bq9IGdpw7pwIGNobyBiaeG6v3QgdGjDqm0g4bufIG3DoHUgbsOgbyBsb+G6oWkgZ2nDoWMgY+G6r3QgbsOgbyBz4bq9IG5oaeG7gXUgbmjhuqV0IHbDoCDDrXQgbmjhuqV0DQoNCi0tLQ0KDQojIyMgKipU4burbmcgbcOgdSBz4bqvYyB24bubaSBHacOhYyBj4bqvdCAtIEN1dCoqDQoNClbhu5tpIDcgYmnhu4N1IMSR4buTIHThu6tuZyBtw6B1IHPhuq9jIHRyw6puIGNobyB0YSB0aOG6pXkgdOG7lW5nIHRo4buDIGPhu6dhIGPhuqMgNywgbmjGsG5nIG7hur91IG114buRbiBiaeG6v3QgY+G7pSB0aOG7gyAqKnPhu7EgY2jDqm5oIGzhu4djaCBraG/huqNuZyBjw6FjaCoqIGPhu6dhIDIgbcOgdSBjw7Mgc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCB2w6Agw610IG5o4bqldCBsw6AgKiptw6B1IEcgdsOgIG3DoHUgSioqLCB0YSBjw7MgdGjhu4MgxJFlbSBjaMO6bmcgc28gc8OhbmggbmjGsCBiaeG7g3UgxJHhu5Mgc2F1IDoNCg0KYGBge3J9DQpLQ0UgPC0gZGlhbW9uZHMgJT4lDQogIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIG11dGF0ZShjb2xvciA9IGZhY3Rvcihjb2xvciwgbGV2ZWxzID0gYygiRyIsICJKIikpKQ0KDQpLQ0UgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCwgeSA9IG4sIGZpbGwgPSBjb2xvcikpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKyANCiAgbGFicyh4ID0gIkPDoWMgbeG7qWMgxJHhu5kgR2nDoWMgY+G6r3QiLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIGxhYnMoY2FwdGlvbiA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu6tuZyBtw6B1IHPhuq9jIikNCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQqKg0KDQotIFbDrCB0YSDEkWFuZyBtdeG7kW4gdGjhuqV5IHPhu7EgcsO1IHPhu7EgY2jDqm5oIGzhu4djaCBj4bunYSAyIG3DoHUgbmhp4buBdSBuaOG6pXQgdsOgIMOtdCBuaOG6pXQgbsOqbiBraGkgbmjDrG4gdsOgbyBiaeG7g3UgxJHhu5MsIHRhIHRo4bqleSDEkcaw4bujYyAqKm3DoHUgRyB2w6AgbcOgdSBKIGPDsyBraG/huqNuZyBjw6FjaCBjw6FjaCBiaeG7h3QgcuG6pXQgbOG7m24qKg0KDQotIFRo4buDIGhp4buHbiByw7UgbmjhuqV0IGzDoCAqKjMgbeG7qWMgSWRlYWwgLSBQcmVtaXVtIC0gVmVyeSBHb29kKiosIG3DoHUgSiB0aOG6rW0gY2jhu4kgYuG6sW5nIGhv4bq3YyB0aOG6pXAgaMahbiAxLzMgbcOgdSBHDQoNCi0gU+G7sSBjaMOqbmggbOG7h2NoIGzhu5tuIG5o4bqldCBsw6Ag4bufIG3hu6ljIElkZWFsIC0gduG7m2kgc+G7kSBraW0gY8awxqFuZyAqKmPDoWNoIGJp4buHdCBsw6Aga2hv4bqjbmcgNCwwMDAgdmnDqm4qKg0KDQotIEPDsm4g4bufIDIgbeG7qWMgY3Xhu5FpIGzDoCBGYWlyIHbDoCBHb29kLCBkw7kga2jDtG5nIGjGoW4gcXXDoSBuaGnhu4F1IG5oxrAgMyBt4bupYyBjw7JuIGzhuqFpLCBuaMawbmcga2hv4bqjbmcgY8OhY2ggY8WpbmcgcsahaSB04bqnbSB2w6BpIGNo4bulYyDEkeG6v24gdsOgaSB0csSDbSB2acOqbg0KDQpOZ2/DoGkgMiBtw6B1IG7DoHkgcmEsIHRhIGPFqW5nIGPDsyB0aOG7gyBzbyBzw6FuaCBi4bqldCBj4bupIG3DoHUgbsOgbyB0YSBtdeG7kW4NCg0KVGEgY8OybiBjw7MgdGjhu4Mgc28gc8OhbmggMyBtw6B1LCA0IG3DoHUgY8O5bmcgbMO6YyBu4bq/dSBjw7Mgbmh1IGPhuqd1IA0KDQotLS0NCg0KIyMjICoqTcOgdSBz4bqvYyAtIENvbG9yIHbDoCBUcuG7jW5nIGzGsOG7o25nIC0gQ2FyYXQqKg0KDQpUYSB4w6l0IHRp4bq/cCB04bubaSAyIHTDrW5oIGNo4bqldCAqKk3DoHUgc+G6r2MgdsOgIFRy4buNbmcgbMaw4bujbmcgQ2FyYXQqKiBjw7luZyBsw7pjDQoNCi0g4bueIHBo4bqnbiB0cuG7jW5nIGzGsOG7o25nIENhcmF0LCB0YSDEkcOjIHBow6JuIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgdGjDoG5oICoqNSBuaMOzbSB0aGVvIHRy4buNbmcgbMaw4bujbmcqKiB2w6AgxJHhurd0IHTDqm4gY2hvIHThu6tuZyBuaMOzbQ0KDQotIELDqm4gY+G6oW5oIMSRw7MsIHRhIGPFqW5nIHThuqFvICoqYuG7mSBk4buvIGxp4buHdSBt4bubaSB04burIEtDIGzDoCBLQzEqKiwgYuG7mSBk4buvIGxp4buHdSBuw6B5IMSRxrDhu6NjICoqYuG7lSBzdW5nIHRow6ptIDEgYmnhur9uIHTDqm4gVExDYXJhdCoqLCBiaeG6v24gbsOgeSBjw7MgbuG7mWkgZHVuZyBn4buTbSA1IG5ow7NtIMSRxrDhu6NjIGNoaWEgdGhlbyB0cuG7jW5nIGzGsOG7o25nIMSRw6MgbsOzaSB0csOqbiwgYmFvIGfhu5NtIFLhuqV0IG5o4bq5LCBOaOG6uSwgVuG7q2EsIE7hurduZywgUuG6pXQgbuG6t25nDQoNClThu6sgxJHDsywgdGEgdGnhur9uIGjDoG5oIHbhur0gY8OhYyBiaeG7g3UgxJHhu5MgdOG7qyA3IG3DoHUgc+G6r2MgduG7m2kgNSBuaMOzbSB0cuG7jW5nIGzGsOG7o25nIG7DoHkgOg0KDQpgYGB7cn0NCktDMSAlPiUgZ3JvdXBfYnkoVExDYXJhdCxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IFRMQ2FyYXQseSA9IG4pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAwLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBmYWNldF93cmFwKH5jb2xvcikgKw0KICAgIGxhYnMoeCA9ICdUcuG7jW5nIGzGsOG7o25nIENhcmF0JywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQqKg0KDQpW4bubaSB04buVbmcgc+G7kSAqKjcgbcOgdSBjw7luZyB24bubaSA1IG3hu6ljIMSR4buZIHRy4buNbmcgbMaw4bujbmcqKiwgdGEgY8OzIHRo4buDIHRo4bqleSA3IGJp4buDdSDEkeG7kyB0xrDGoW5nIOG7qW5nIHbhu5tpIHThu6tuZyBtw6B1IHPhuq9jIHbDoCBt4buXaSBtw6B1IHPhuq9jIGPDsyBz4buRIHZpw6puIGtpbSBjxrDGoW5nIMSRxrDhu6NjIGNoaWEgdGhlbyB0cuG7jW5nIGzGsOG7o25nIGPhu6UgdGjhu4MNCg0KLSBOaMOsbiB04buVbmcgcXVhbiB04bqldCBj4bqjLCBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIOG7nyAqKm3hu6ljIFLhuqV0IG5o4bq5IGNoaeG6v20gxJHhuqFpIMSRYSBz4buRIHbDoCBn4bqnbiBuaMawIMOhcCDEkeG6o28gdHJvbmcgdOG7q25nIGJp4buDdSDEkeG7kyoqDQoNCi0gKipN4bupYyBOaOG6uSBjxaluZyDEkeG7qW5nIHRo4bupIDIqKiB0cm9uZyB04bqldCBj4bqjIGPDoWMgYmnhu4N1IMSR4buTLCBuaMawbmcgduG6pW4gY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBraMOhIGzhu5tuIHNvIHbhu5tpIG3hu6ljIFLhuqV0IG5o4bq5DQoNCi0gMiBt4bupYyAqKlbhu6thLCBO4bq3bmcgxJHhu4F1IHLhuqV0IMOtdCoqLCBjaOG7iSByxqFpIHbDoG8gdsOgaSB2acOqbiDEkeG6v24gdsOgaSB0csSDbSB2acOqbg0KDQotIMSQ4bq3YyBiaeG7h3QgbeG7qWMgUuG6pXQgbuG6t25nLCBjaOG7iSBjw7MgKioyIHZpw6puIOG7nyBtw6B1IEoqKiB2w6AgKioxIHZpw6puIOG7nyBtw6B1IEUqKiwgY8OhYyBtw6B1IGPDsm4gbOG6oWkga2jDtG5nIHPhu58gaOG7r3UgbeG7mXQgdmnDqm4gbsOgbw0KDQotICoqMyBtw6B1IEUsRixHKiogxJHhu4F1IGPDsyBraW0gY8awxqFuZyDhu58gbeG7qWMgUuG6pXQgbmjhurkgbmhp4buBdSDDoXAgxJHhuqNvLCBuaMawbmcgbOG6oWkga2jDtG5nIGPDsyB2acOqbiBuw6BvIOG7nyAyIG3hu6ljIG7hurduZyB2w6AgcuG6pXQgbuG6t25nDQoNCk7Ds2kgdMOzbSBs4bqhaSwgY8OhYyBiaeG7g3UgxJHhu5MgdHLDqm4gxJHDoyBjaG8gdGEgdGjhuqV5IHLDtSBjaGkgdGnhur90IG5o4bqldCB24buBIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcuIE3hu5dpIHZpw6puIGtpbSBjxrDGoW5nIMSR4buBdSBtYW5nIG3hu5l0IG7DqXQgxJHhurlwIHbhu4EgbcOgdSBz4bqvYywgdHLhu41uZyBsxrDhu6NuZywuLi4gcmnDqm5nIGJp4buHdCBuw6puIMSRw7MgY8WpbmcgbMOgIGzDvSBkbyBraGnhur9uIGNobyB2aeG7h2Mga2nhu4NtIMSR4buLbmggY2jhuqV0IGzGsOG7o25nIHbDoCDEkeG7i25oIGdpw6EgY2jDum5nIHLhuqV0IGto4bqvdCBraGUgdsOgIGPhuqduIHTDrW5oIGNodeG6qW4geMOhYyBj4buxYyBjYW8NCg0KLS0tDQoNCiMjIyAqKlThu6tuZyBNw6B1IHPhuq9jIHbhu5tpIFRy4buNbmcgbMaw4bujbmcgLSBDYXJhdCoqDQoNClRhIHRp4bq/biBow6BuaCBjaOG7jW4gKio0IG3DoHUgRyxFLEksSioqIMSR4buDIHjDqXQgZOG7sWEgdHLDqm4gY8OhYyBt4bupYyB0cuG7jW5nIGzGsOG7o25nDQoNCkNo4bunIMSRw61jaCBjaOG7jW4gNCBtw6B1IG7DoHkgbMOgIHbDrCBtw6B1IEcgLSBFIGzDoCBt4buZdCB0cm9uZyBuaOG7r25nIG3DoHUgY8OzIHPhu5EgbMaw4bujbmcgbmhp4buBdSBuaOG6pXQgdsOgIG3DoHUgSSAtIEogbMOgIMOtdCBuaOG6pXQNCg0KDQpgYGB7cn0NCktDSSA8LSBLQzEgJT4lDQogIGdyb3VwX2J5KFRMQ2FyYXQsIGNvbG9yKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBtdXRhdGUoY29sb3IgPSBmYWN0b3IoY29sb3IsIGxldmVscyA9IGMoIkciLCAiRSIsICJJIiwgIkoiKSkpDQoNCktDSSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gVExDYXJhdCwgeSA9IG4sIGZpbGwgPSBjb2xvcikpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKyANCiAgbGFicyh4ID0gIkPDoWMgbeG7qWMgdHLhu41uZyBsxrDhu6NuZyIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgbGFicyhjYXB0aW9uID0gIkJp4buDdSDEkeG7kyBj4buZdCBjaOG7k25nIGPDoWMgbcOgdSBz4bqvYyIpDQpgYGANCg0KIyMjIyAqKk5o4bqtbiB4w6l0KioNCg0KR2nhu69hIDIgbcOgdSBuaGnhu4F1IG5o4bqldCB2w6AgMiBtw6B1IMOtdCBuaOG6pXQgxJHGsOG7o2MgdMOhY2ggcmEsICoqc+G7sSBjaMOqbmggbOG7h2NoIMSRw6MgxJHGsOG7o2MgdGjhu4MgaGnhu4duIHLDtSByw6BuZyBoxqFuKioNCg0KLSBTbyBzw6FuaCA0IG3DoHUgdGjDrCBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIOG7nyBuaMOzbSBS4bqldCBuaOG6uSB24bqrbiBsw6Agbmhp4buBdSBuaOG6pXQNCg0KLSAqKjIgbcOgdSBHIHbDoCBFIGPDsyBz4buRIGzGsOG7o25nIMOhcCDEkeG6o28gaG/DoG4gdG/DoG4qKiBzbyB24bubaSBJIHbDoCBKIOG7nyBuaMOzbSBS4bqldCBuaOG6uQ0KDQotIE5oxrBuZyDhu58gbmjDs20gTmjhurksIGzGsOG7o25nIGtpbSBjxrDGoW5nIMSRw6MgY8OzIGtow6FjIGJp4buHdCAtIHPhu7EgY8OhY2ggYmnhu4d0IMSRw6Mga2jDtG5nIGPDsm4NCg0KLSBNw6B1IEcgdsOgIEkgZ+G6p24gbmjGsCBjw7Mgc+G7kSBsxrDhu6NuZyBuZ2FuZyBuaGF1LCBtw6B1IEUgdHLhu58gdGjDoG5oIG3DoHUgY8OzIHPhu5EgbMaw4bujbmcgw610IG5o4bqldA0KDQotIEPDsm4gMiBt4bupYyBjdeG7kWkgY8O5bmcgbMOgIG7hurduZyB2w6AgcuG6pXQgbuG6t25nLCB2w6wgc+G7kSBraW0gY8awxqFuZyDhu58gMiBuaMOzbSBuw6B5IGPhu7FjIGvDrCDDrXQgdsOgIGhp4bq/bSBuw6puIHRhIGtow7RuZyBk4buFIGTDoG5nIG5oxrAgMyBuaMOzbSBjw7JuIGzhuqFpDQoNCk5oxrAgduG6rXkgY8OzIHRo4buDIG7Ds2ksIHR1eSBz4buRIGzGsOG7o25nIOG7nyBt4buXaSBuaMOzbSBt4bupYyB0cuG7jW5nIGzGsOG7o25nIGzDoCBraMOhYyBuaGF1IG5oxrBuZyBwaOG6o2kgc28gc8OhbmggdGhlbyBjw6FjIG3DoHUgdGjDrCB0YSBt4bubaSBjw7MgdGjhuqV5IHLDtSBoxqFuIHPhu7EgY2jDqm5oIGzhu4djaCDEkcOzDQoNCi0tLQ0KDQojIyAqKjQuIENsYXJpdHkgLSDEkOG7mSBUaW5oIEtoaeG6v3QqKg0KDQoqKsSQ4buZIHRpbmgga2hp4bq/dC8gxJDhu5kgdHJvbmcqKiBj4bunYSBraW0gY8awxqFuZyBsw6Agc+G7kSBsxrDhu6NuZyB2w6Aga2jhuqMgbsSDbmcgaGnhu4NuIHRo4buLIGPhu6dhIGPDoWMgxJHhurdjIMSRaeG7g20gYsOqbiB0cm9uZyAodOG6oXAgY2jhuqV0KSB2w6AgYsOqbiBuZ2/DoGkoduG6v3QgdHLhuqd5IHjGsOG7m2MpIGPhu6dhIG3hu5l0IHZpw6puIGtpbSBjxrDGoW5nDQoNCi0gQ8OhYyB04bqhcCBjaOG6pXQgaGF5IHThu7MgduG6v3QgxJHGsOG7o2MgdOG6oW8gdGjDoG5oIHRyb25nIHF1w6EgdHLDrG5oIGjDrG5oIHRow6BuaCBraW0gY8awxqFuZyB04buxIG5oacOqbg0KDQotIMSQ4buDIMSRw6FuaCBnacOhIHRow6wgY+G6p24gc+G7rSBk4bulbmcgY8OhYyB0aGnhur90IGLhu4sga8OtbmggbG91cCB24bubaSDEkeG7mSBwaMOzbmcgxJHhuqFpIHgxMA0KDQoNCioqQ+G6pXAgxJHhu5kgdGluaCBraGnhur90KiogZ+G7k20gY8OzICoqNiBuaMOzbSB24bubaSAxMSBj4bqlcCDEkeG7mSoqLCBuaOG7r25nIGPhuqVwIMSR4buZIHTDrW5oIHThu6sgY2FvIHh14buRbmcgdGjhuqVwIG5oxrAgc2F1IDogDQoNCi0gKipGbGF3bGVzcyAtIEZMKiogOiBT4bqhY2ggaG/DoG4gaOG6o28sIGtow7RuZyB04buzIHbhur90DQoNCi0gKipJbnRlcm5hbGx5IEZsYXdsZXNzIC0gSUYqKiA6IEhvw6BuIGjhuqNvIGLDqm4gdHJvbmcsIGNo4buJIGPDsyB04buzIHbhur90IGtow7RuZyBxdWFuIHRy4buNbmcgYsOqbiBuZ2/DoGkNCg0KLSAqKlZlcnkgVmVyeSBTbGlnaHRseSBJbmNsdWRlZCAtIFZWUyoqIC0gZ+G7k20gMiBj4bqlcCBuaOG7jyAqKihWVlMxLCBWVlMyKSoqIDogQ8OzIG5o4buvbmcgdOG6oXAgY2jhuqV0LCB24bq/dCB0cuG6p3kgbmjhu48sIGtow7MgdGjhuqV5IMSRxrDhu6NjDQoNCi0gKipWZXJ5IFNsaWdodGx5IEluY2x1ZGVkIC0gVlMqKiAtIGPDsyAyIGPhuqVwIG5o4buPICoqKFZTMSwgVlMyKSoqIDogQ8OzIG5o4buvbmcgdOG6oXAgY2jhuqV0LCB24bq/dCB0cuG6p3kgdOG7qyBraMOzIHRo4bqleSDEkeG6v24gZOG7hSB0aOG6pXkNCg0KLSAqKlNsaWdodGx5IEluY2x1ZGVkIC0gU0kqKiAtIGPDsyAyIGPhuqVwIG5o4buPICoqKFNJMSwgU0kyKSoqIDogQ8OzIG5o4buvbmcgdOG6oXAgY2jhuqV0LCB24bq/dCB0cuG6p3kgZOG7hSB0aOG6pXkgaG/hurdjIHLhuqV0IGThu4UgdGjhuqV5DQoNCi0gKipJbmNsdWRlZCAtIEkqKiAtIGPDsyAzIGPhuqVwIG5o4buPICoqKEkxLEkyLEkzKSoqIDogS2jDtG5nIGhvw6BuIGjhuqNvIGzhuqtuIGLDqm4gdHJvbmcgbOG6q24gYsOqbiBuZ2/DoGkNCg0KLS0tDQoNCiMjIyMgKipUw7NtIHThuq90IHPGoSBsxrDhu6NjKioNCg0KVGEgxJHDoyBuw6p1IGfhu5NtIDExIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBraMOhYyBuaGF1LCBuaMawbmcgduG7m2kgYuG7mSBk4buvIGxp4buHdSBuw6B5IHRow6wgY8OhYyBj4bqlcCDEkeG7mSDEkcOzIHPhur0ga2jDtG5nIMSR4bqneSDEkeG7pyBuaMawIMSRw6MgbsOqdSBiw6puIHRyw6puLCB0YSBjw7MgdGjhu4MgdGjhuqV5IGNo4buJIGfhu5NtIDoNCg0KDQpgYGB7cn0NCnRhYmxlKEtDJGNsYXJpdHkpDQpgYGANCg0KQ2jhu4kgY8OzICoqOCBj4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgdHJvbmcgYuG7mSBk4buvIGxp4buHdSoqLCBraMO0bmcgY8OzIG3hu6ljIEZMIHbDoCBJMw0KDQotIEPDoWMgbeG7qWMgxJHhu5kgxJHhu4F1IGfhu5NtIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdMawxqFuZyDhu6luZyBuaMawIGLhuqNuZyB0csOqbg0KDQotIE5ow6xuIHThu5VuZyBxdWFuIHRyxrDhu5tjLCB0YSB0aOG6pXkgY8OhYyBt4bupYyBTVCB2w6AgVlMgY2hp4bq/bSDEkWEgc+G7kSB0cm9uZyB04buVbmcgdGjhu4MNCg0KVsOgIMSR4buDIHRo4bqleSByw7UgaMahbiwgdGEgbOG6oWkgduG6vSBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGNow7puZyANCg0KLS0tDQoNCiMjIyAqKkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gxJDhu5kgdGluaCBraGnhur90KioNCg0KDQpgYGB7cn0NCktDICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKG4sY2xhcml0eSkpICsNCiAgICBnZW9tX2NvbChmaWxsPSdwdXJwbGUnKSArDQogICAgbGFicyh0aXRsZSA9ICIgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBuaMOzbSB0aGVvIENsYXJpdHkgIikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDEsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdT4buRIGzGsOG7o25nJywgeSA9ICfEkOG7mSB0aW5oIGtoaeG6v3QnKQ0KYGBgDQoNCg0KIyMjIyAqKk5o4bqtbiB4w6l0IMSQ4buZIHRpbmgga2hp4bq/dCAxKioNCg0KLSBN4bupYyDEkeG7mSBj4bunYSBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIOG7nyBt4buXaSBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgbMOgIGtow7RuZyDEkeG7k25nIMSR4buBdSBuaGF1DQoNCi0gVGEgY8OzIHRo4buDIHRo4bqleSDEkcaw4bujYyBz4buRIGzGsOG7o25nIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgdMawxqFuZyDhu6luZyB24bubaSBjw6FjIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCBuaMawIHRyb25nIGJp4buDdSDEkeG7kw0KDQotIE7hu5VpIGLhuq10IHRhIHRo4bqleSDEkcaw4bujYyAqKm3hu6ljIFNJMSoqIGNoaeG6v20gKipz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0KiosIHbhu5tpIGtob+G6o25nICoqaMahbiAxMiwwMDAgdmnDqm4ga2ltIGPGsMahbmcqKg0KDQogICAgLSDEkMOieSBsw6Agbmjhu69uZyB2acOqbiBjw7MgbOG6q24gbmjhu69uZyB04bqhcCBjaOG6pXQsIHbhur90IHRy4bqneSBk4buFIHRo4bqleSBob+G6t2MgcuG6pXQgZOG7hSB0aOG6pXkNCiAgICANCiAgICAtIFbDrCDEkcaw4bujYyBow6xuaCB0aMOgbmggdOG7qyB0cm9uZyB04buxIG5oacOqbiwgbsOqbiB4w6FjIHN14bqldCBn4bq3cCBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIGNoxrBhIGhvw6BuIHRoaeG7h24gbMOgIGNhbyBoxqFuIGjhurNuDQoNCi0gVGhlbyBuZ2F5IHNhdSDEkcOzIGzDoCAqKlZTMiB2w6AgU0kyKiosIHbhu5tpIHPhu5EgbMaw4bujbmcgxJHhu6luZyB0aOG7qSAyLDMgdGjDrCAqKsSR4buZIGNow6puaCBs4buHY2ggc28gduG7m2kgU0kxIGPFqW5nIGzDoCBraMO0bmcgcXXDoSBuaGnhu4F1KioNCiAgIA0KICAgIC0gS2hv4bqjbmcgY8OhY2ggcsahaSB2w6BvIGtob+G6o25nIDEsMDAwIHbDoCA0LDAwMCB2acOqbiBjaG8gbeG7l2kgbeG7qWMgdMawxqFuZyDhu6luZw0KICAgIA0KICAgIC0gQ8OhYyB2acOqbiBraW0gY8awxqFuZyDhu58gMiBt4bupYyBuw6B5IMSR4buBdSBjw7Mgbmjhu69uZyB04bqhcCBjaOG6pXQsIHbhur90IHRy4bqneSB4xrDhu5tjIHThu6sgZOG7hSB0aOG6pXkgdOG7m2kga2jDsyB0aOG6pXkgcsO1DQoNCi0gKiozIG3hu6ljIFZTMSwgVlZTMiwgVlZTMSoqIGPDsyBz4buRIGzGsOG7o25nICoqbOG6p24gbMaw4bujdCDDrXQgZOG6p24qKiwgY+G6oyAzIMSR4buBdSDhu58gbeG7qWMga2jDtG5nIHF1w6Egbmhp4buBdSBjxaluZyBraMO0bmcgcXXDoSDDrXQNCg0KLSBOZ8aw4bujYyBs4bqhaSAqKm3hu6ljIElGIHbDoCBt4bupYyBJMSoqIGzhuqduIGzGsOG7o3QgY8OzICoqc+G7kSBsxrDhu6NuZyDDrXQgbmjhuqV0KioNCg0KICAgIC0gS2hpIHNvIHPDoW5oIG3hu6ljIG5oaeG7gXUgbmjhuqV0IHbDoCDDrXQgbmjhuqV0LCB0YSB0aOG6pXkgKipTVDEgZ+G6pXAgaMahbiAxMCBs4bqnbiBzbyB24bubaSBt4bupYyDDrXQgbmjhuqV0IGzDoCAqKkkxKioNCiAgICANCiAgICAtIE5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgaG/DoG4gaOG6o28gdsOgIGtow7RuZyBob8OgbiBo4bqjbyBsw6Agbmjhu69uZyB2acOqbiBjw7Mgc+G7kSBsxrDhu6NuZyDDrXQgbmjhuqV0DQogICAgDQotLS0NCiAgICANClTGsMahbmcgdOG7sSBuaMawIGPDoWMgdGnDqnUgY2jDrSB0csOqbiwgdGEgdMOtbmggdG/DoW4gdsOgIGNodXnhu4NuIHPhu5EgbMaw4bujbmcgc2FuZyBk4bqhbmcgJSDEkeG7gyB0aOG6pXkgY+G7pSB0aOG7gyBoxqFuDQoNCmBgYHtyfQ0KS0MgJT4lIGdyb3VwX2J5KGNsYXJpdHkpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMobiwgY2xhcml0eSkpICsNCiAgICBnZW9tX2NvbChmaWxsPSdwdXJwbGUnKSArDQogICAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duICUgdGhhbmcgxJFvIENsYXJpdHkgIikgKw0KICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQobi9sZW5ndGgoS0MkY2xhcml0eSkpKSx2anVzdCA9IDEsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdT4buRIGzGsOG7o25nJywgeSA9ICfEkOG7mSB0aW5oIGtoaeG6v3QnKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCDEkOG7mSB0aW5oIGtoaeG6v3QgMioqDQoNCi0gVMawxqFuZyB04buxIHbhu5tpIGJp4buDdSDEkeG7kyB0csOqbiBuaMawbmcgdGhheSBi4bqxbmcgJSwgduG7m2kgcGjhuqduIHRyxINtIGzDoCAqKjI0LDIlIC0gbeG7qWMgU0kxKiogY8OzIHThu7cgbOG7hyBjaGnhur9tIGNhbyBuaOG6pXQNCg0KLSBDw6FjICoqdOG7tyBs4buHIMSR4bupbmcgdGjhu6kgMiwzLDQqKiBs4bqnbiBsxrDhu6N0IGzDoCAqKlZTMiAyMiw3JSAtIFNJMiAxNyUgLSBWUzEgMTUsMSUqKg0KDQogICAgLSBU4bu3IGzhu4cgY+G7p2EgMyBt4bupYyDEkeG7mSBuw6B5IGPDoWNoIG3hu6ljIMSR4buZIMSR4bupbmcgxJHhuqd1IGtob+G6o25nIDIgLSAxMCUNCiAgICANCiAgICAtIFThu6sgxJHDsyB0YSB0aOG6pXkgxJHGsOG7o2MsIGtow7RuZyBjw7MgbeG7qWMgxJHhu5kgbsOgbyBsw6AgY8OzIHPhu5EgbMaw4bujbmcgY2FvIGjGoW4gaOG6s24vIHLDtSBy4buHdCBoxqFuIGPDoWMgbeG7qWMgY8OybiBs4bqhaQ0KDQotIE3hu6ljICoqVlZTMiB2w6AgVlZTMSoqIMSR4bupbmcgZ+G6p24gw6FwIGNow7N0IGPhu6dhIGJp4buDdSDEkeG7kyB24bubaSB04bu3IGzhu4cgw610IGjGoW4gOiAqKjksNCUgdsOgIDYsOCUqKg0KDQotIFbDoCBjdeG7kWkgY8O5bmcsIG3hu6ljIGPDsyAqKnThu7cgbOG7hyDDrXQgbmjhuqV0KiogdHJvbmcgYuG6o25nIGzhuqduIGzGsOG7o3QgbMOgICoqSUYgLSAzLDMlIHbDoCBJMSAtIDEsMSUqKg0KDQogICAgLSBLaG/huqNuZyBjw6FjaCBj4bunYSAyIG3hu6ljIG5oaeG7gXUgdsOgIMOtdCBuaOG6pXQgbMOgIGtob+G6o25nIGjGoW4gMjIlDQogICAgDQotLS0NCg0KIyMjICoqVOG7q25nIE3DoHUgc+G6r2MgduG7m2kgxJDhu5kgdGluaCBraGnhur90IC0gQ2xhcml0eSoqDQoNClTGsMahbmcgdMawIG5oxrAgdGEgxJHDoyBzbyBzw6FuaCBjw6FjIG3DoHUgduG7m2kgVHLhu41uZyBsxrDhu6NuZyB2w6AgR2nDoWMgY+G6r3QsIHRhIGPFqW5nIGPDsyB0aOG7gyB0w6FjaCByacOqbmcgY8OhYyBtw6B1IHJhIMSR4buDIGThu4Ugbmjhuq1uIHjDqXQgaMahbg0KDQpUYSBjaOG7jW4gbmfhuqt1IG5oacOqbiAyIG3DoHUgRCB2w6AgRSDEkeG7gyBzbyBzw6FuaCB24bubaSBuaGF1IGPDuW5nIHbhu5tpIMSR4buZIHRpbmgga2hp4bq/dA0KDQpgYGB7cn0NCktDRCA8LSBkaWFtb25kcyAlPiUNCiAgZ3JvdXBfYnkoY2xhcml0eSwgY29sb3IpICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIG11dGF0ZShjb2xvciA9IGZhY3Rvcihjb2xvciwgbGV2ZWxzID0gYygiRCIsICJFIikpKQ0KDQpLQ0QgJT4lDQogIGdncGxvdChhZXMoeCA9IGNsYXJpdHksIHkgPSBuLCBmaWxsID0gY29sb3IpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsgDQogIGxhYnMoeCA9ICLEkOG7mSB0aW5oIGtoaeG6v3QiLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIGxhYnMoY2FwdGlvbiA9ICJCaeG7g3UgxJHhu5MgdGhhbmgiKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCoqDQoNCi0gU+G7sSBjaMOqbmggbOG7h2NoIGPhu6dhICoqMiBtw6B1IEQgdsOgIEUgY8Wpbmcga2jDtG5nIHF1w6EgxJHDoW5nIGvhu4MgdsOgIHLDtSBy4buHdCoqDQoNCi0gTmhp4buBdSBuaOG6pXQgduG6q24gbMOgIDMgbeG7qWMgU0kyIC0gU0kxIC0gVlMyLCB2w6AgbcOgdSBFIGx1w7RuIG5oaeG7gXUgaMahbiBo4bqzbiBtw6B1IEQNCg0KLSA1IG3hu6ljIGPDsm4gbOG6oWkgduG7m2kgc+G7kSBraW0gY8awxqFuZyDDrXQgaMahbiwgbmjGsG5nIG3DoHUgRSB24bqrbiBjw7Mgc+G7kSBsxrDhu6NuZyBuaGnhu4F1IGjGoW4NCg0KLSBLaG/huqNuZyBjw6FjaCBj4bunYSBt4buXaSBt4bupYyBz4bq9IHLGoWkgdsOgbyBraG/huqNuZyB2w6BpIHRyxINtIMSR4bq/biB2w6BpIG5nw6BuIHZpw6puDQogICAgDQotLS0NCg0KIyMgKio1LiBEZXB0aCAtIMSQ4buZIHPDonUgdsOgIFRhYmxlIC0gQuG7gSBt4bq3dCoqDQoNCioqRGlhbW9uZCBUYWJsZSB2w6AgRGVwdGgqKiBsw6Agbmjhu69uZyB54bq/dSB04buRIGPDsyAqKnZhaSB0csOyIHF1eeG6v3QgxJHhu4tuaCBjaG8gY2jhuqV0IGzGsOG7o25nIGdpw6FjIGPhuq90KiogY+G7p2Ega2ltIGPGsMahbmcNCg0KLSBHacO6cCB4w6FjIMSR4buLbmggaMOsbmggZOG6oW5nIHbhuq10IGzDvSwgdOG6oW8gbsOqbiB24bq7IG5nb8OgaSBy4buxYyBy4buhIHbDoCBs4bqlcCBsw6FuaCBjaG8gdmnDqm4ga2ltIGPGsMahbmcNCg0KLSBT4buxIGPDom4gxJHhu5FpIGdp4buvYSAyIMSR4bq3YyDEkWnhu4NtIG7DoHkgc+G6vSBnacO6cCDEkeG6oXQgxJHGsOG7o2MgY2jhuqV0IGzGsOG7o25nIHbDoCB0w61uaCB0aOG6qW0gbeG7uSBjYW8gbmjhuqV0DQoNCi0gxJDDonkgY8WpbmcgbMOgICoqMiBsb+G6oWkgR2nDoWMgY+G6r3QgKEN1dCkgdGjGsOG7nW5nIGfhurdwKioNCg0KLS0tDQoNCiMjIyAqKkRpYW1vbmQgRGVwdGggLSDEkOG7mSBzw6J1KioNCg0KQ2hp4buBdSBzw6J1IGhheSBjw7JuIGzDoCBDaGnhu4F1IGNhbyBj4bunYSBraW0gY8awxqFuZw0KDQotIENoaeG7gXUgc8OidSBz4bq9IMSRxrDhu6NjIHTDrW5oIGLhurFuZyBjw6FjaCAqKmNoaWEgdOG7lW5nIGNoaeG7gXUgc8OidSoqICh0w61uaCB04burIMSR4buJbmggxJHhur9uIMSRw6F5KSBjaG8gKirEkcaw4budbmcga8OtbmggdHJ1bmcgYsOsbmgqKg0KDQogICAgLSBO4bq/dSB2acOqbiBraW5oIGPGsMahbmcgKipxdcOhIHPDonUqKiB0aMOsIHPhur0gZOG7hSBsw6BtIHh14bqldCBoaeG7h24gY8OhYyAqKnbDuW5nIHThu5FpIG3DoHUqKg0KDQogICAgLSBO4bq/dSB2acOqbiBraW0gY8awxqFuZyAqKnF1w6EgbsO0bmcqKiB0aMOsIGPDsyB0aOG7gyBsw6BtICoqbeG6pXQgxJHhu5kgc8OhbmcqKg0KDQotICoqVOG7tyBs4buHIGzDvSB0xrDhu59uZyBuaOG6pXQqKiDhu58gdGhhbmcgxJFvIGNoaeG7gXUgc8OidSBz4bq9IHRyb25nIGtob+G6o25nIHThu6sgKio1Nyw1IC0gNjMlKioNCg0KLS0tDQoNCiMjIyAqKkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gxJDhu5kgc8OidSoqDQogDQpE4buxYSB0csOqbiB04bu3IGzhu4cgbMO9IHTGsOG7n25nIHThu6sgNTcsMy02MyUsIHRhIHPhur0gcGjDom4gY8OhYyB2acOqbiBraW0gY8awxqFuZyB0aMOgbmggKioyIG5ow7NtKiogOiAqKkzDvSB0xrDhu59uZyB2w6AgQ2jGsGEgbMO9IHTGsOG7n25nKioNCg0KLSAqKk5ow7NtIEzDvSB0xrDhu59uZyoqIGzDoCBuaMOzbSBjw7MgY8OhYyB2acOqbiBraW0gY8awxqFuZyBjw7MgKirEkOG7mSBzw6J1IHThu6sgNTcsMyDEkeG6v24gNjMlKioNCg0KLSAqKk5ow7NtIENoxrBhIGzDvSB0xrDhu59uZyoqIGzDoCBuaMOzbSBjw7MgY8OhYyB2acOqbiBraW0gY8awxqFuZyBjw7MgKirEkOG7mSBzw6J1IGTGsOG7m2kgNTcsMyUqKiB2w6AgKip0csOqbiA2MyUqKg0KDQpTYXUga2hpIGNoaWEgbmjGsCB24bqteSwgdGEgxJHGsOG7o2MgYmnhu4N1IMSR4buTIG5oxrAgc2F1IDoNCg0KYGBge3J9DQpLQ0xUIDwtIGRpYW1vbmRzDQpLQ0xUJGRlcHRoLnNhdSA8LSBpZmVsc2UoS0NMVCRkZXB0aCA+PSA1NyAmIEtDTFQkZGVwdGggPD0gNjMsICdMw70gdMaw4bufbmcnLCAnQ2jGsGEgbMO9IHTGsOG7n25nJykNCnRhYmxlKEtDTFQkZGVwdGguc2F1KQ0KDQpLQ0xUICU+JSBncm91cF9ieShkZXB0aC5zYXUpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoZGVwdGguc2F1LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nZ3JheScpICsNCiAgICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG5ow7NtIHRoZW8gRGVwdGggIikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICfEkOG7mSBMw70gdMaw4bufbmcgdGhlbyDEkOG7mSBzw6J1JywgeSA9ICdT4buRIGzGsOG7o25nJykgDQpgYGANCg0KIyMjIyAqKk5o4bqtbiB4w6l0IMSQ4buZIHPDonUgMSoqDQoNCi0gU2F1IGtoaSBwaMOibiB0aMOgbmggMiBuaMOzbSBsw70gdMaw4bufbmcgaGF5IGtow7RuZyBk4buxYSB0csOqbiB0aGFuZyDEkW8gxJHhu5kgc2F1LCB0YSBjw7MgxJHGsOG7o2MgYmnhu4N1IMSR4buTIG5oxrAgdHLDqm4NCg0KLSDEkGEgcGjhuqduIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgKirEkeG7gXUgxJHhuqF0IG3hu6ljIGzDvSB0xrDhu59uZyB24bubaSBoxqFuIDQ2LDAwMCB2acOqbioqLCBjaOG7iSBjw7MgaMahbiAqKjcsMDAwIGzDoCBjaMawYSDEkeG6oXQqKg0KDQotIEdp4buvYSAyIG3hu6ljIGzDvSB0xrDhu59uZyB2w6AgY2jGsGEgbMO9IHTGsOG7n25nICoqY8OhY2ggbmhhdSBraG/huqNuZyAzOSwwMDAgdmnDqm4qKg0KDQotIENo4bupbmcgdOG7jyBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIMSRYSBwaOG6p24gxJHhu4F1IGPDsyBt4buZdCDEkOG7mSBzw6J1IGhvw6BuIGjhuqNvIHbDoCBsw70gdMaw4bufbmcNCg0KLS0tDQoNCiMjIyMgKipU4burbmcgbcOgdSBz4bqvYyB24bubaSBN4bupYyBsw70gdMaw4bufbmcgY+G7p2EgxJDhu5kgc8OidSoqDQoNCk5oxrBuZyBiaeG7g3UgxJHhu5MgdHLDqm4gY2jhu4kgY8OzIMSRxrDhu6NjIG5o4bqtbiB4w6l0IHThu5VuZyBxdWFuLCDEkeG7gyBj4bulIHRo4buDIGjGoW4gdGEgY8WpbmcgY8OzIHRo4buDIHbhur0gKipjw6FjIGJp4buDdSDEkeG7kyBt4bupYyBsw70gdMaw4bufbiBuw6B5IHRyw6puIHThu6tuZyBsb+G6oWkgbcOgdSBz4bqvYyoqIG5oxrAgc2F1IDogDQoNCg0KYGBge3J9DQoNCktDTFQgJT4lIGdyb3VwX2J5KGRlcHRoLnNhdSxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGRlcHRoLnNhdSx5ID0gbikpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsNCiAgICBmYWNldF93cmFwKH5jb2xvcikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDAsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICfEkOG7mSBsw70gdMaw4bufbmcgdGhlbyDEkOG7mSBzw6J1JywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQgxJDhu5kgc8OidSAyKioNCg0KTmjDrG4gY2h1bmcgdGEgxJHhu4F1IHRo4bqleSDEkcaw4bujYywgKipt4bupYyBsw70gdMaw4bufbmcgxJHhu4F1IGPDsyBz4buRIGzGsOG7o25nIG5oaeG7gXUgaMahbioqIGNoxrBhIGzDvSB0xrDhu59uZyDhu58gdOG6pXQgY+G6oyBjw6FjIG3DoHUNCg0KLSAqKjQgbcOgdSBHLCBFLCBGLCBIKiogbMOgIDQgbcOgdSBjw7Mgc+G7kSBsxrDhu6NuZyDEkeG6oXQgbeG7qWMgbMO9IHTGsOG7n25nIG5oaeG7gXUgbmjhuqV0LCB24bubaSBoxqFuIDcsMDAwIHZpw6puIGNobyBt4buXaSBtw6B1DQoNCi0gKiozIG3DoHUgRCwgSSwgSioqIGPDsyBz4buRIGzGsOG7o25nIMOtdCBoxqFuLCBuaMawbmcgbuG6v3Ugc28gduG7m2kgbeG7qWMgY2jGsGEgbMO9IHTGsOG7n25nIHRow6wgY8WpbmcgxJHDoyBuaGnhu4F1IGjGoW4gdOG7qyB2w6BpIG5nw6BuIHZpw6puDQoNCi0gTeG7qWMgY2jGsGEgbMO9IHTGsOG7n25nIGPDsyBz4buRIGzGsOG7o25nIHThu6sgdsOgaSB0csSDbSDEkeG6v24gdsOgaSBuZ8OgbiB2acOqbiwgc+G7sSBjaMOqbmggbOG7h2NoIGPFqW5nIGtow6EgcsO1IHLhu4d0IGdp4buvYSAyIG3hu6ljDQoNCi0tLQ0KDQojIyMjICoqR2jDqXAgY2jhu5NuZyBjw6FjIE3DoHUgc+G6r2MgduG7m2kgxJDhu5kgc8OidSoqDQoNClbhu5tpIHThu6tuZyBtw6B1IHPhuq9jIG5oxrAgNyBiaeG7g3UgxJHhu5MgdHLDqm4gY8WpbmcgbMOgIHF1w6EgcsO1IHLDoG5nIGNobyBjaMO6bmcgdGEgY8OzIHRo4buDIG5o4bqtbiB4w6l0DQoNCk5oxrBuZyBiw6J5IGdp4budIHRhIHPhur0geOG6v3AgKipjw6FjIGPhu5l0IGNo4buTbmcgbMOqbiBuaGF1KiogxJHhu4MgY8OzIHRow6ptIG3hu5l0IGfDs2MgbmjDrG4ga2jDoWMgbuG7r2EgOiANCg0KYGBge3J9DQpLQ0xUMSA8LSBLQ0xUICU+JSBncm91cF9ieShkZXB0aC5zYXUsIGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpDQpLQ0xUMSAlPiUgZ2dwbG90KGFlcyh4ID0gZGVwdGguc2F1LCB5ID1uKSkgKw0KICBnZW9tX2NvbChkYXRhID0gS0NMVDEgJT4lIGZpbHRlcihjb2xvciA9PSAnRycpLCBmaWxsID0gJ3JlZCcpICsNCiAgZ2VvbV9jb2woZGF0YSA9IEtDTFQxICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0QnKSwgZmlsbCA9ICd5ZWxsb3cnKSArDQogIGdlb21fY29sKGRhdGEgPSBLQ0xUMSAlPiUgZmlsdGVyKGNvbG9yID09ICdKJyksIGZpbGwgPSAnZ3JlZW4nKSArDQogIGxhYnMoeCA9ICfEkOG7mSBTw6J1JywgeSA9ICdT4buRIGzGsOG7o25nJykNCg0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCDEkOG7mSBzw6J1IDMqKg0KDQpUYSBxdXkgxJHhu4tuaCBjw6FjIG3DoHUgdHJvbmcgYmnhu4N1IMSR4buTIG5oxrAgc2F1IDoNCg0KLSAqKk3DoHUgxJHhu48qKiB0cm9uZyBiaeG7g3UgxJHhu5MgY2jDrW5oIGzDoCAqKm3DoHUgRyoqDQoNCi0gKipNw6B1IHbDoG5nKiogdHJvbmcgYmnhu4N1IMSR4buTIGNow61uaCBsw6AgKiptw6B1IEQqKg0KDQotICoqTcOgdSB4YW5oIGzDoSoqIHRyb25nIGJp4buDdSDEkeG7kyBjaMOtbmggbMOgICoqbcOgdSBKKioNCg0KS2hpIHTDoWNoIDMgbcOgdSByYSwgduG7m2kgbeG7mXQgZ8OzYyBuaMOsbiBraMOhYywgdGEgY8WpbmcgY8OzIHRo4buDIGThu4UgZMOgbmcgc28gc8OhbmggaMahbg0KDQotICoqTcOgdSBHKioga2hpIMSRxrDhu6NjIHjhur9wIGNo4buTbmcgbMOqbiB24bqrbiBjw7MgKipz4buRIGzGsOG7o25nIMSR4bupbmcgbmhp4buBdSBuaOG6pXQqKiwgdGnhur9wIHRoZW8gbMOgIG3DoHUgRCB2w6AgY3Xhu5FpIGPDuW5nIGzDoCBKDQoNCi0gTeG7qWMgbMO9IHTGsOG7n25nIGPhu6dhICoqbcOgdSBHIGfhuqduIG5oxrAgZ+G6pXAgxJHDtGkgbcOgdSBEKiogdsOgICoqZ+G6pXAgMyBs4bqnbiBtw6B1IEoqKg0KDQotIEPDsm4gduG7gSBt4bupYyBjaMawYSBsw70gdMaw4bufbmcsICoqY+G6oyAzIG3DoHUgZ+G6p24gbmjGsCBjw7Mgc+G7kSBsxrDhu6NuZyBuZ2FuZyBuaGF1KioNCg0KDQpT4buxIGNow6puaCBs4buHY2ggZ2nhu69hIGPDoWMgYmnhu4N1IMSR4buTIGPhu5l0IMSRxqFuLCBj4buZdCDEkcO0aSwgY+G7mXQgY2jhu5NuZyB24buBIG3hurd0IHPhu5EgbGnhu4d1IGzDoCBraMO0bmcgaOG7gSB0aGF5IMSR4buVaQ0KDQpOaMawbmcgdGjDtG5nIHF1YSBjw6FjIGJp4buDdSDEkeG7kyBraMOhYyBuaGF1IC0gY8OhYyBnw7NjIG5ow6xuIGtow6FjLCB0YSBjxaluZyBwaOG6p24gbsOgbyBjw7MgdGjhu4MgdGjhuqV5IMSRxrDhu6NjIHPhu7EgY2jDqm5oIGzhu4djaCDEkcOzIHLDtSByw6BuZyBoxqFuDQoNCg0KLS0tDQoNCiMjIyMgKipU4burbmcgTeG7qWMgZ2nDoWMgY+G6r3QgduG7m2kgTeG7qWMgbMO9IHTGsOG7n25nIGPhu6dhIMSQ4buZIHPDonUqKg0KDQpUYSBjxaluZyBjw7MgdGjhu4EgbMOgbSB0xrDGoW5nIHThu7EgbmjGsG5nIGtow7RuZyB4w6l0IOG7nyBtw6B1IHPhuq9jIG7hu69hLCBtw6AgdGEgc+G6vSAqKnjDqXQg4bufIG3hu6ljIMSR4buZIEdpw6FjIGPhuq90IEN1dCoqDQoNClbDoCB0YSBjxaluZyBuaOG6rW4geMOpdCB0xrDGoW5nIHThu7EgbmjGsCDhu58gcGjhuqduIE3DoHUgc+G6r2MgYsOqbiB0csOqbiBjaG8gcGjhuqduIMSQ4buZIHPDonUgZMaw4bubaSDEkcOieSA6DQoNCg0KYGBge3J9DQpLQ0xUICU+JSBncm91cF9ieShkZXB0aC5zYXUsY3V0KSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGVwdGguc2F1LHkgPSBuKSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICAgIGZhY2V0X3dyYXAofmN1dCkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDAsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICfEkOG7mSBsw70gdMaw4bufbmcgdGhlbyDEkOG7mSBzw6J1JywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQgxJDhu5kgc8OidSA0KioNCg0KLSDEkOG7mSDEkeG6oXQgbMO9IHTGsOG7n25nIGPhu6dhIG3hu5dpIG3hu6ljIHbhuqtuIGNoaeG6v20gcGjhuqduIGzhu5tuDQoNCi0gUmnDqm5nIG3hu6ljIEZhaXIgY8OzIG3hu6ljIGNoxrBhIGzDvSB0xrDhu59uZyBuaGnhu4F1IGjGoW4gbMO9IHTGsOG7n25nDQoNCi0gTmjGsG5nIG5ow6xuIGNodW5nLCBraG/huqNuZyBjw6FjaCBnaeG7r2EgMiDEkeG7mSDEkeG6oXQgbMO9IHTGsOG7n25nIHbhuqtuIGtow6EgY8OhY2ggYmnhu4d0DQoNCi0tLQ0KDQojIyMjICoqR2jDqXAgY2jhu5NuZyBt4bupYyDEkeG7mSBHacOhYyBj4bqvdCB24bubaSDEkOG7mSBzw6J1KioNCg0KVsOgIHRhIGPFqW5nIGPDsyBuaOG6rW4geMOpdCB0xrDGoW5nIHThu7EgbmjGsCBwaOG6p24gbcOgdSBz4bqvYw0KDQpgYGB7cn0NCktDTFQyIDwtIEtDTFQgJT4lIGdyb3VwX2J5KGRlcHRoLnNhdSwgY3V0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpDQpLQ0xUMiAlPiUgZ2dwbG90KGFlcyh4ID0gZGVwdGguc2F1LCB5ID1uKSkgKw0KICBnZW9tX2NvbChkYXRhID0gS0NMVDIgJT4lIGZpbHRlcihjdXQgPT0gJ0lkZWFsJyksIGZpbGwgPSAnZ3JlZW4nKSArDQogIGdlb21fY29sKGRhdGEgPSBLQ0xUMiAlPiUgZmlsdGVyKGN1dCA9PSAnUHJlbWl1bScpLCBmaWxsID0gJ2JsdWUnKSANCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQgxJDhu5kgc8OidSA1KioNCg0KVGEgY8OzIG3hu5l0IGJp4buDdSDEkeG7kyB0xrDGoW5nIHThu7EgbmjGsCDhu58gcGjhuqduIE3DoHUgc+G6r2MgduG7m2kgxJDhu5kgc8OidSB24bubaSBxdXkgxJHhu4tuaCBuaMawIHNhdSA6DQoNCi0gKipNw6B1IHhhbmggbMOhKiogdHJvbmcgYmnhu4N1IMSR4buTIGNow61uaCBsw6AgxJHhuqFpIGRp4buHbiBjaG8gbeG7qWMgKipJZGVhbCoqDQoNCi0gKipNw6B1IHhhbmggZMawxqFuZyoqIHRyb25nIGJp4buDdSDEkeG7kyBjaMOtbmggbMOgIMSR4bqhaSBkaeG7h24gY2hvIG3hu6ljICoqUHJlbWl1bSoqDQoNCsSQ4buZIGzDvSB0xrDhu59uZyB24bqrbiBjaGnhur9tIMSR4bqhaSDEkWEgc+G7kSBzbyB24bubaSBjaMawYSBsw70gdMaw4bufbmcNCg0KLSBNw6B1IHhhbmggbMOhIMSR4bqhaSBkaeG7h24gY2hvICoqbeG7qWMgSWRlYWwgY2FvIGjGoW4gbeG7qWMgUHJlbWl1bSoqIC0gbcOgdSB4YW5oIGTGsMahbmcg4bufIMSR4buZIGzDvSB0xrDhu59uZw0KDQotIE5oxrBuZyB0YSB0aOG6pXkgKiptw6B1IHhhbmggZMawxqFuZyBjxaluZyBjYW8gZ+G6p24gMi8zIGPhu6dhIG3DoHUgeGFuaCBsw6EqKg0KDQotIENo4bupbmcgdOG7jyBz4buRIGzGsOG7o25nIGdp4buvYSBjaMO6bmcgbMOgIGPDsyBjaMOqbmggbOG7h2NoIG5oYXUsIG5oxrBuZyAqKmtob+G6o25nIGPDoWNoIGPFqW5nIGtow7RuZyBwaOG6o2kgbMOgIHF1w6EgcsO1IHLhu4d0KioNCg0KLSBDw7JuICoqxJHhu5kgY2jGsGEgbMO9IHTGsOG7n25nKiogdGjDrCB0YSBjaOG7iSBjw7MgdGjhu4MgdGjhuqV5IG3hu5l0IHTDrSBtw6B1IHhhbmggbMOhLCBjw7MgdGjhu4MgKipz4buRIGzGsOG7o25nIHF1w6Egw610KiogY+G7p2EgMiBt4bupYyBuw6puIGNoxrBhIHRo4bqleSByw7UNCg0KLS0tDQoNCiMjIyAqKkRpYW1vbmQgVGFibGUgLSBC4buBIG3hurd0KioNCg0KKipEaWFtb25kIFRhYmxlKiogbMOgIGxv4bqhaSAqKmdpw6FjIGPhuq90IGPDsyBow6xuaCBs4bulYyBnacOhYyoqIMSR4bq3YyB0csawbmcsIGPDsyBi4buBIG3hurd0IGzhu5tuIG5o4bqldCBu4bqxbSB0csOqbiDEkeG7iW5oIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nDQoNCi0gTsOzIGPDsyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgdHJvbmcgdmnhu4djIHjDoWMgxJHhu4tuaCBow6xuaCBkw6FuZyBj4bunYSB2acOqbiBraW0gY8awxqFuZw0KDQotIE7DsyBjw7JuIGzDoG0gdMSDbmcga2jhuqMgbsSDbmcgKipraMO6YyB44bqhIGPDoWMgdGlhIHPDoW5nKiosIGdpw7pwIGNobyBraW0gY8awxqFuZyB0cuG7nyBuw6puIGzhuqVwIGzDoW5oIGjGoW4NCg0KICAgIC0gTuG6v3UgKipi4buBIG3hurd0IHF1w6EgbOG7m24qKiBz4bq9IHRoaeG6v3UgY2jhu5cgY2hvIHPhu7EgcGjDom4gdMOhbiDDoW5oIHPDoW5nDQogICAgDQogICAgLSBO4bq/dSAqKmLhu4EgbeG6t3QgcXXDoSBuaOG7jyoqIHPhur0gaOG6oW4gY2jhur8gw6FuaCBzw6FuZyBjaGnhur91IHbDoG8gbMOgbSBnaeG6o20gxJHhu5kgc8OhbmcgdOG7lW5nIHRo4buDDQoNCi0gKipU4bu3IGzhu4cgbMO9IHTGsOG7n25nIG5o4bqldCoqIGPhu6dhIG3hu5l0IGLhu4EgbeG6t3QgaG/DoG4gaOG6o28gc+G6vSB0cm9uZyBraG/huqNuZyB04burICoqNTMgLSA2NSUqKiANCg0KLS0tDQoNCiMjIyAqKkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gQuG7gSBt4bq3dCoqDQogDQpDxaluZyB0xrDGoW5nIHThu7EgdsOgIGThu7FhIHRyw6puIHThu7cgbOG7hyBsw70gdMaw4bufbmcgxJHDoyBjw7Mgc+G6tW4sIHRhIHRp4bq/biBow6BuaCBwaMOibiBjaGlhIGtpbSBjxrDGoW5nIHRow6BuaCAyIG5ow7NtICoqxJDhuqF0IHbDoCBLaMO0bmcgxJDhuqF0KioNCg0KLSAqKk5ow7NtIMSQ4bqhdCoqIGzDoCBuaMOzbSBjw7MgY8OhYyB2acOqbiBraW0gY8awxqFuZyBjw7MgKipC4buBIG3hurd0IHThu6sgNTMgxJHhur9uIDY1JSoqDQoNCi0gKipOaMOzbSBLaMO0bmcgxJHhuqF0KiogbMOgIG5ow7NtIGPDsyBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIGPDsyAqKkLhu4EgbeG6t3QgZMaw4bubaSA1MyUqKiB2w6AgKip0csOqbiA2NSUqKg0KDQooTMawdSDDvSA6IFRhIHPhur0gZMO5bmcgdOG7qyAnxJDhuqF0JyDEkeG7gyBwaMOibiBiaeG7h3QgduG7m2kgdOG7qyAnTMO9IHTGsOG7n25nJyBj4bunYSBwaOG6p24gxJDhu5kgc8OidSwgbsOqbiB0aOG6rXQgcmEgJ0tow7RuZyDEkeG6oXQnIGPFqW5nIGNo4buJIGzDoCBt4bupYyAnQ2jGsGEgbMO9IHTGsOG7n25nJyBtw6AgdGjDtGkpDQoNClRhIHRp4bq/biBow6BuaCB24bq9IGJp4buDdSDEkeG7kyB2w6AgY8OzIDIgbmjDs20gbmjGsCBzYXUgOg0KDQpgYGB7cn0NCktDTFRUIDwtIGRpYW1vbmRzDQpLQ0xUVCR0YWJsZS5iZW1hdCA8LSBpZmVsc2UoS0NMVFQkdGFibGUgPj0gNTMgJiBLQ0xUVCR0YWJsZSA8PSA2NSwgJ8SQ4bqhdCcsICdLaMO0bmcnKQ0KDQpLQ0xUVCAlPiUgZ3JvdXBfYnkodGFibGUuYmVtYXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXModGFibGUuYmVtYXQsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdncmF5JykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdGhlbyBUYWJsZSAiKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMCwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ8SQ4buZIMSR4bqhdCB0aGVvIELhu4EgbeG6t3QnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiMjIyMgKipOaOG6rW4geMOpdCBC4buBIG3hurd0IDEqKg0KDQpOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIMSQ4bqhdCBjaHXhuqluIGhvw6BuIHRvw6BuIGNoaeG6v20gKipn4bqnbiBuaMawIHR1eeG7h3QgxJHhu5FpKioga2hpIHNvIHbhu5tpIEtow7RuZyDEkeG6oXQNCg0KLSBN4bupYyDEkOG6oXQgY2h14bqpbiBjw7Mgc+G7kSBsxrDhu6NuZyAqKmjGoW4gNTMsMDAwIHZpw6puKiosIHThu7cgbOG7hyBoxqFuIDk5JSAtIGtob+G6o25nIGPDoWNoIGzDoCBy4bqldCBy4bqldCBjw6FjaCBiaeG7h3QgdsOgIGNow6puaCBs4buHY2gNCg0KLSBN4bupYyBLaMO0bmcgxJHhuqF0ICoqY2jhu4kgY8OzIDI1NyB2acOqbioqDQoNCi0gQ2jhu6luZyB04buPIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcga2hpIMSRxrDhu6NjIHRo4bqpbSDEkeG7i25oIGhheSDEkcOhbmggZ2nDoSDEkeG7gXUgcGjhuqNpIGPDsyBuaOG7r25nICoqZ2nDoWMgY+G6r3QgY2h14bqpbiB4w6FjIMSR4bqhdCB04bubaSBt4bupYyBob8OgbiBo4bqjbyoqDQoNCi0tLQ0KDQojIyMjICoqQ8OhYyBNw6B1IHPhuq9jIHbhu5tpIE3hu6ljIMSR4bqhdCBj4bunYSBC4buBIG3hurd0KioNCg0KVGEgY8Wpbmcgc+G6vSB0aeG6v24gaMOgbmggduG6vSBjw6FjIGJp4buDdSDEkeG7kyBj4bunYSAqKnThu6tuZyBtw6B1IHPhuq9jIGPDuW5nIHbhu5tpIMSQ4buZIMSR4bqhdCBjaHXhuqluIGPhu6dhIELhu4EgbeG6t3QqKiBuaMawIHNhdSA6IA0KDQpgYGB7cn0NCktDTFRUICU+JSBncm91cF9ieSh0YWJsZS5iZW1hdCxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHRhYmxlLmJlbWF0LHkgPSBuKSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICAgIGZhY2V0X3dyYXAofmNvbG9yKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMCwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ8SQ4buZIMSR4bqhdCB0aGVvIELhu4EgbeG6t3QnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCg0KIyMjIyAqKk5o4bqtbiB4w6l0IELhu4EgbeG6t3QgMioqDQoNCi0gVHJvbmcgdOG7q25nIGJp4buDdSDEkeG7kyBtw6B1LCAqKsSR4buZIMSR4bqhdCBjaHXhuqluIGPFqW5nIGPDsyB04bu3IGzhu4cgw6FwIMSR4bqjbyoqIG5oxrAgYmnhu4N1IMSR4buTIHThu5VuZw0KDQotIFRy4burIG3DoHUgSiByYSwgdGjDrCBjw7JuIGzhuqFpICoqNiBtw6B1IMSR4buBdSBjw7Mgc+G7kSBraW0gY8awxqFuZyDEkeG6oXQgY2h14bqpbioqIGzhu5tuIGjGoW4gNSwwMDAgdmnDqm4NCg0KLSBUcm9uZyDEkWEgc+G7kSBjw6FjIGJp4buDdSDEkeG7kyB24buBIG3DoHUgc+G6r2MsIG3DoHUgSiBsdcO0biBjw7MgbeG7mXQgc+G7kSBsxrDhu6NuZyBraMOhIGtoacOqbSB04buRbiBoxqFuDQoNCi0gKio0IG3DoHUgRSxGLEcsSCoqIMSR4buBdSBjw7Mgc+G7kSBsxrDhu6NuZyDhu58gbeG7qWMgxJHhuqF0IGNodeG6qW4gdHLDqm4gOCwwMDAgdmnDqm4gdsOgIGhvw6BuIHRvw6BuIGNow6puaCBs4buHY2ggduG7m2kgbeG7qWMgY2jGsGEgxJHhuqF0DQoNCi0gQ8OhYyBt4bupYyBjaMawYSDEkeG6oXQgxJHhu4F1IGNo4buJIHLGoWkgdsOgbyBraG/huqNuZyBt4bqleSBjaOG7pWMgdmnDqm4gY2hvIG3hu5dpIG3DoHUsIHPhu5EgbMaw4bujbmcga2jDtG5nIG5oaeG7gXUNCg0KUXVhIGPDoWMgbcOgdSBz4bqvYyBjw6BuZyBjaOG7qW5nIHThu48gYuG7gSBt4bq3dCBnacOhYyBj4bqvdCBsdcO0biDEkcaw4bujYyDEkcOhbmggZ2nDoSB04buJIG3hu4kgbmjhuqV0DQoNCi0tLQ0KDQojIyMjICoqVOG7q25nIG3DoHUgc+G6r2MgduG7m2kgTeG7qWMgxJHhuqF0IGPhu6dhIELhu4EgbeG6t3QqKg0KDQpCaeG7g3UgxJHhu5MgY+G7mXQgxJHDtGkgduG7m2kgdOG7q25nIG3DoHUgc+G6r2MsIHPhur0gZ2nDunAgdGEgZOG7hSBzbyBzw6FuaCBoxqFuIA0KDQpgYGB7cn0NCktDTFRUMSA8LSBLQ0xUVCAlPiUNCiAgZ3JvdXBfYnkodGFibGUuYmVtYXQsIGNvbG9yKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBtdXRhdGUoY29sb3IgPSBmYWN0b3IoY29sb3IsIGxldmVscyA9IGMoIkgiLCAiSSIpKSkNCg0KS0NMVFQxICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB0YWJsZS5iZW1hdCwgeSA9IG4sIGZpbGwgPSBjb2xvcikpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKyANCiAgbGFicyh4ID0gIsSQ4buZIMSR4bqhdCBi4buBIG3hurd0IiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICBsYWJzKGNhcHRpb24gPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04burbmcgbcOgdSBz4bqvYyIpDQpgYGANCg0KIyMjIyAqKk5o4bqtbiB4w6l0IELhu4EgbeG6t3QgMyoqDQoNClRhIGNo4buNbiBuZ+G6q3Ugbmhpw6puIG3DoHUgSCB2w6AgSSDEkeG7gyBzbyBzw6FuaCB24buBIMSR4buZIMSR4bqhdCBjaHXhuqluIGPhu6dhIGLhu4EgbeG6t3QNCg0KLSAqKk3DoHUgSCBjaMOtbmggbMOgIG3DoHUgdMOtbSDEkeG6rW0qKiB0cm9uZyBiaeG7g3UgxJHhu5MNCg0KLSAqKk3DoHUgSSBjaMOtbmggbMOgIG3DoHUgdsOgbmcqKiB0cm9uZyBiaeG7g3UgxJHhu5MNCg0KLSBN4bupYyDEkOG6oXQgY2h14bqpbiBj4bunYSAyIG3DoHUgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBraG/huqNuZyAyLDAwMCB2acOqbg0KDQotIEPDsm4gbeG7qWMga2jDtG5nIMSR4bqhdCB2w6wgc+G7kSBsxrDhu6NuZyBxdcOhIMOtdCBuw6puIHRhIGNoxrBhIG5ow6xuIHRo4bqleSByw7UgcsOgbmcNCg0KLS0tDQoNCiMjIyMgKipHaMOpcCBjaOG7k25nIGPDoWMgbcOgdSBz4bqvYyB24bubaSBC4buBIG3hurd0KioNCg0KxJDDonkgY8WpbmcgbMOgIGJp4buDdSDEkeG7kyBzbyBzw6FuaCBjw6FjIG3DoHUgc+G6r2MgduG7m2kgbmhhdSwgbmjGsCBiaeG7g3UgxJHhu5MgdHLDqm4gbMOgIGPhu5l0IMSRw7RpIHRow6wgYmnhu4N1IMSR4buTIGTGsOG7m2kgxJHDonkgc+G6vSBsw6AgY+G7mXQgY2jhu5NuZw0KDQpW4buBIG3hurd0IHPhu5EgbGnhu4d1IHRow6wgY2jhuq9jIGNo4bqvbiBz4bq9IGtow7RuZyBjw7MgZ8OsIGtow6FjLCBuaMawbmcgc+G6vSBraMOhYyB24buBIGPDoWNoIHRo4buDIGhp4buHbiB0csOqbiBiaeG7g3UgxJHhu5MNCg0KYGBge3J9DQpLQ0xUVDEgPC0gS0NMVFQgJT4lIGdyb3VwX2J5KHRhYmxlLmJlbWF0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KS0NMVFQxICU+JSBnZ3Bsb3QoYWVzKHggPSB0YWJsZS5iZW1hdCwgeSA9bikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IEtDTFRUMSAlPiUgZmlsdGVyKGNvbG9yID09ICdIJyksIGZpbGwgPSAncGluaycpICsNCiAgZ2VvbV9jb2woZGF0YSA9IEtDTFRUMSAlPiUgZmlsdGVyKGNvbG9yID09ICdJJyksIGZpbGwgPSAncHVycGxlJykgDQpgYGANCg0KIyMjIyAqKk5o4bqtbiB4w6l0IELhu4EgbeG6t3QgNCoqDQoNClRhIGPFqW5nIGNo4buNbiAyIG3DoHUgbMOgIEggdsOgIEkgbmjGsCBiaeG7g3UgxJHhu5MgY+G7mXQgxJHDtGksIG5oxrBuZyBiaeG7g3UgxJHhu5MgY+G7mXQgY2jhu5NuZyBuw6B5IMSRw6MgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgZ8OzYyBuaMOsbiwgdGEgcXV5IMSR4buLbmggbmjGsCBzYXUgOg0KDQotICoqTcOgdSBIIGNow61uaCBsw6AgbcOgdSBo4buTbmcqKiB0cm9uZyBiaeG7g3UgxJHhu5MNCg0KLSAqKk3DoHUgSSBjaMOtbmggbMOgIG3DoHUgdMOtbSoqIHRyb25nIGJp4buDdSDEkeG7kw0KDQotIE3hu6ljIMSQ4bqhdCBjaHXhuqluIGPhu6dhIDIgbcOgdSB24bqrbiBjw7Mgc+G7sSBjaMOqbmggbOG7h2NoIGtob+G6o25nIDIsMDAwIHZpw6puDQoNCi0gVsOgIG3DoHUgdMOtbSDEkeG6oWkgZGnhu4duIGNobyAqKm3DoHUgSSBjaGnhur9tIGjGoW4gbeG7mXQgbuG7rWEgY+G7mXQgbcOgdSBo4buTbmcgLSDEkeG6oWkgZGnhu4duIGNobyBtw6B1IEgqKg0KDQotIEPDsm4gbeG7qWMga2jDtG5nIMSR4bqhdCB2w6wgc+G7kSBsxrDhu6NuZyBxdcOhIMOtdCBuw6puIHRhIGPFqW5nIGtow7RuZyB0aOG7gyBuaMOsbiB0aOG6pXkgdOG7qyBiaeG7g3UgxJHhu5MgbsOgeQ0KDQotLS0NCg0KIyMgKio2LiBQcmljZSAtIEdpw6EgdGjDoG5oKioNCg0KVGjhur8gZ2nhu5tpIGtpbSBjxrDGoW5nIGzDoCBiaeG7g3UgdMaw4bujbmcgY2hvIG3hu5l0IHbhursgxJHhurlwIG11w7RuIG3DoHUsIMSRYSBk4bqhbmcuIE3hu5dpIG3hu5l0IHZpw6puIGtpbSBjxrDGoW5nIMSR4buBdSBtYW5nIG3hu5l0IGjDrG5oIGTDoW5nLCDEkeG7mSBs4bqlcCBsw6FuaCwgLi4uIHJpw6puZyBiaeG7h3QgdsOgIGtow7RuZyBjw7Mgc+G7sSBs4bq3cCBs4bqhaSwgdOG7q25nIHnhur91IHThu5EgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIMSR4buBdSBz4bq9IGfDonkg4bqjbmggaMaw4bufbmcgxJHhur9uIGdpw6EgdGjDoG5oIGPhu6dhIG7Dsw0KDQotICoqNCB54bq/dSB04buRKiogdHJvbmcgKipUacOqdSBjaMOtIDRDKiogxJHDoyBwaMOibiB0w61jaCDhu58gdHLDqm4gxJHhu4F1IGPDsyDhuqNuaCBoxrDhu59uZyB04burIGNo4bqldCBsxrDhu6NuZyDEkeG6v24gZ2nDoSB0cuG7iw0KDQotIFRpw6p1IGNodeG6qW4gNEMgY+G7p2EgR0lBIMSRw6MgdHLhu58gdGjDoG5oIG3hu5l0ICoqdGnDqnUgY2h14bqpbiB0csOqbiB0b8OgbiB0aOG6vyBnaeG7m2kqKiDEkeG7gyBwaMOibiBsb+G6oWkgdsOgIMSR4buLbmggZ2nDoSBraW0gY8awxqFuZw0KDQoNClbhu5tpIGjGoW4gNTAsMDAwIHZpw6puIGtpbSBjxrDGoW5nLCDEkcawxqFuZyBuaGnDqm4gbeG7l2kgdmnDqm4ga2ltIGPGsMahbmcgxJHhu4F1IG1hbmcgZ2nDoSB0cuG7iyBj4bunYSByacOqbmcgbsOzDQoNClRhIHPhur0gdGnhur9uIGjDoG5oICoqdMOtbmggdHJ1bmcgYsOsbmggZ2nDoSB0aMOgbmgqKiBj4bunYSB04bqldCBj4bqjIGNow7puZywgxJHhu4MgdGjhuqV5IMSRxrDhu6NjIGxp4buHdSDEkeG7gyBz4bufIGjhu691IMSRxrDhu6NjIDEgdmnDqm4ga2ltIGPGsMahbmcgY+G6p24gYmFvIG5oacOqdQ0KDQotLS0NCg0KIyMjIyAqKlTDrW5oIHRvw6FuIHPGoSBsxrDhu6NjKioNCg0KVHLGsOG7m2MgdGnDqm4sIHRhIHPhur0gY2hpYSBuaOG7jyBHacOhIHRow6BuaCBQcmljZSB0aMOgbmggKio0IG5ow7NtIDogUuG6pXQgcuG6uyAtIFLhursgLSDEkOG6r3QgLSBS4bqldCDEkeG6r3QqKg0KDQotIEzGsHUgw70gOiBWaeG7h2MgKirEkeG6t3QgdMOqbioqIGNobyB04burbmcgbmjDs20gbmjGsCB0aOG6vyBuw6B5IGNo4buJIG1hbmcgKip0w61uaCBjaOG6pXQgdMaw4bujbmcgdHLGsG5nKiogdsOsIHRhIGtow7RuZyByw7UgxJHGoW4gduG7iyB0aeG7gW4gdOG7hyBj4bunYSBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIGzDoCDEkcahbiB24buLIG7DoG8gDQoNCi0gR2nDoSB0aMOgbmggY+G7p2Ega2ltIGPGsMahbmcgc+G6vSB0w7l5IHRodeG7mWMgdsOgbyBuaGnhu4F1IHnhur91IHThu5EsIHRhIGNo4buJIMSRYW5nIHjDqXQgZ2nDoSB0cuG7iyBjw6FjIHZpw6puIGtpbSBjxrDGoW5nIGPDsyB0cm9uZyBi4buZIGThu68gbGnhu4d1DQoNCmBgYHtyfQ0KdGFibGUoY3V0KEtDMSRwcmljZSw0KSkNCmBgYA0KDQoNCmBgYHtyfQ0KS0MxJHByaWNlLnQgPC0gY3V0KEtDMSRwcmljZSw0LCBsYWJlbHMgPSBjKCdS4bqldCBy4bq7JywnUuG6uycsJ8SQ4bqvdCcsJ1LhuqV0IMSR4bqvdCcpKSANCnRhYmxlKEtDMSRwcmljZS50KQ0KYGBgDQoNCg0KVGEgY8OzIMSRxrDhu6NjICoqNCBuaMOzbSBnacOhIHRow6BuaCoqIMSRxrDhu6NjIGNoaWEgbmjGsCBzYXUgOiAodOG6oW0gY2hvIMSRxqFuIHbhu4sgbMOgIMSRxqFuIHbhu4sgdGnhu4FuKQ0KDQotICoqTeG7qWMgZ2nDoSB0aMOgbmggUuG6pXQgcuG6uyoqIC0gY8OzIGdpw6EgdOG7qyAzMDggLSBraG/huqNuZyA0LDAwMCDEkcahbiB24buLIHRp4buBbg0KICAgIA0KLSAqKk3hu6ljIGdpw6EgdGjDoG5oIFLhursqKiAtIGPDsyBnacOhIHThu6sgNCwwMDAgLSBraG/huqNuZyA5LDAwMCDEkcahbiB24buLIHRp4buBbg0KICAgIA0KLSAqKk3hu6ljIGdpw6EgdGjDoG5oIMSQ4bqvdCoqIC0gY8OzIGdpw6EgdOG7qyA5LDAwMCAtIGtob+G6o25nIDE0LDAwMCDEkcahbiB24buLIHRp4buBbg0KICAgIA0KLSAqKk3hu6ljIGdpw6EgdGjDoG5oIFLhuqV0IMSR4bqvdCoqIC0gY8OzIGdpw6EgdOG7qyAxNCwwMDAgLSBraG/huqNuZyAxOCwwMDAgxJHGoW4gduG7iyB0aeG7gW4NCiAgICANClNhdSDEkcOzICoqdGnhur9uIGjDoG5oIHbhur0gYmnhu4N1IMSR4buTKiogDQoNCi0tLSANCg0KIyMjICoqQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBDw6FjIG3hu6ljIGdpw6EgdGjDoG5oKioNCg0KDQpgYGB7cn0NCg0KS0MgPC0gZGlhbW9uZHMNCktDMiA8LSBLQyAlPiUgbXV0YXRlKEdpYVByaWNlID0gY3V0KHByaWNlLDQsIGxhYmVsID0gYygnUuG6pXQgcuG6uycsICdS4bq7JywnxJDhuq90JywnUuG6pXQgxJHhuq90JykpKQ0KS0MyICU+JSBncm91cF9ieShHaWFQcmljZSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhHaWFQcmljZSxuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZ2nDoSB0aMOgbmggIikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDAsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdQcmljZScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQoNCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQgR2nDoSB0aMOgbmggMSoqDQoNCi0gU+G7sSBwaMOibiBi4buVIGtow7RuZyDEkeG7k25nIMSR4buBdSBt4bupYyBnacOhIGPhu6dhIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgbMOgIHF1w6EgcsO1IHLhu4d0DQoNCi0gTmjDrG4gY2h1bmcgbmjhu69uZyAqKmdpw6EgdGjDoG5oIGPDoG5nIMSR4bqvdCoqIHRow6wgY8OgbmcgY8OybiBjw7MgKipz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDoG5nIGdp4bqjbSBk4bqnbioqIA0KDQotIE5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgY8OzICoqZ2nDoSB0aMOgbmggUuG6pXQgcuG6uyoqIGPDsyBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0IHbhu5tpIGjGoW4gMzksMDAwIHZpw6puDQoNCi0gU+G7sSBjaMOqbmggbOG7h2NoIGPhu6dhICoqZ2nDoSBS4bqldCBy4bq7IHbDoCBnacOhIHRow6BuaCBS4bq7KiogY8WpbmcgxJHDoyBsw6Aga2jDoSBjaMOqbmggbOG7h2NoIC0gaMahbiAzMCwwMDAgdmnDqm4NCg0KLSBDw7JuIGdpw6EgdGjDoG5oICoqxJDhuq90IHbDoCBS4bqldCDEkeG6r3QqKiBsw6AgY8OzIHPhu5EgbMaw4bujbmcgw610IG5o4bqldA0KDQpDw6FjIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBnacOhIHRow6BuaCBy4bq7IGzDoCBraMOhIG5oaeG7gXUsIG7Dqm4gdmnhu4djIHPhu58gaOG7r3UgY2jDum5nIGPDsyB0aOG7gyBsw6AgZOG7hSBkw6BuZyBoxqFuIHNvIHbhu5tpIGdpw6EgdGjDoG5oIMSR4bqvdA0KDQpOaMawbmcgbuG6v3UgbXXhu5FuIHPhu58gaOG7r3UgbeG7mXQgdmnDqm4ga2ltIGPGsMahbmcgbOG7mW5nIGzhuqt5IG5o4bqldCwgdHV54buHdCDEkeG6uXAgbmjhuqV0IHRow6wgdmnhu4djIG7DsyBjw7MgZ2nDoSBS4bqldCDEkeG6syBsw6AgY2h1eeG7h24gcuG6pXQgYsOsbmggdGjGsOG7nW5nDQoNCi0tLQ0KDQojIyMgKipCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIFRydW5nIGLDrG5oIC0gTWVhbiBnacOhIHRow6BuaCoqDQoNClNhdSBraGkgbmjDrG4gcsO1IMSRxrDhu6NjIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcg4bufIG3hu5dpIG3hu6ljIGdpw6EsIHRhIHRp4bq/biBow6BuaCB24bq9IHRp4bq/cCBt4buZdCBiaeG7g3UgxJHhu5Mga2jDoWMgZOG7sWEgdHLDqm4gKipt4bupYyBnacOhIMSRw6MgxJHGsOG7o2MgdMOtbmggdHJ1bmcgYsOsbmgqKiwgYmnhu4N1IMSR4buTIG5oxrAgc2F1IDogDQoNCg0KYGBge3J9DQoNCktDMiAlPiUgZ3JvdXBfYnkoR2lhUHJpY2UpICU+JSBzdW1tYXJpc2UobT0gbWVhbihwcmljZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBHaWFQcmljZSx5ID0gbSkpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnZ3JlZW4nKSArDQogICAgbGFicyh4ID0gJ1ByaWNlJywgeSA9ICdNZWFuJykNCmBgYA0KDQojIyMjICoqTmjhuq1uIHjDqXQgR2nDoSB0aMOgbmggMioqDQoNClNhdSBraGkgxJHDoyB0w61uaCB0cnVuZyBiw6xuaCDhu58gbeG7l2kgbeG7qWMgZ2nDoSB0YSBjw7Mgc+G7kSBsaeG7h3UgbmjGsCBzYXUgOg0KDQotICoqTeG7qWMgZ2nDoSBS4bqldCBy4bq7KiogY8OzIGdpw6EgdHJ1bmcgYsOsbmggbMOgIGtob+G6o25nICoqMSw4OTcgxJHGoW4gduG7iyB0aeG7gW4qKg0KDQotICoqTeG7qWMgZ2nDoSBS4bq7KiogY8OzIGdpw6EgdHJ1bmcgYsOsbmggbMOgIGtob+G6o25nICoqNiw3NTkgxJHGoW4gduG7iyB0aeG7gW4qKg0KDQotICoqTeG7qWMgZ2nDoSDEkOG6r3QqKiBjw7MgZ2nDoSB0cnVuZyBiw6xuaCBsw6Aga2hv4bqjbmcgKioxMSw2MjUgxJHGoW4gduG7iyB0aeG7gW4qKg0KDQotICoqTeG7qWMgZ2nDoSBS4bqldCDEkeG6r3QqKiBjw7MgZ2nDoSB0cnVuZyBiw6xuaCBsw6Aga2hv4bqjbmcgKioxNiwzNDAgxJHGoW4gduG7iyB0aeG7gW4qKg0KDQpO4bq/dSBi4bqhbiBtdeG7kW4gc+G7nyBo4buvdSBt4buZdCB2acOqbiBraW0gY8awxqFuZyBjaG8gbcOsbmgsIHRow6wgKip0cnVuZyBiw6xuaCBi4bqhbiBwaOG6o2kgY8OzIMOtdCBuaOG6pXQgMSw5MDAgxJHGoW4gduG7iyB0aeG7gW4gdHLhu58gbMOqbioqIMSR4buDIGPDsyBuw7MsIG7hur91IGtow7RuZyB0aMOsIGLhuqFuIHBo4bqjaSB0cuG6oyB0aMOqbSBuaMawIHNhdSA6IA0KDQotIE3hu6ljIGdpw6EgUuG6pXQgxJHhuq90IGPDsyBnacOhIHRow6BuaCDEkcO6bmcgbmjGsCBjw6FpIHTDqm4sIHBo4bqjaSAqKmPDsyBoxqFuIDE2LDAwMCDEkcahbiB24buLIHRp4buBbioqIG3hu5tpIGPDsyB0aOG7gyBtdWEgxJHGsOG7o2MNCg0KLSBDw6FjIG3hu6ljIGPDsm4gbOG6oWkgY8WpbmcgY8OzIG3hu6ljIGdpw6EgZ2nhuqNtIGThuqduIG5oxrBuZyBraG/huqNuZyBjaMOqbmggbOG7h2NoICoqc28gduG7m2kgbeG7qWMgcuG6uyBuaOG6pXQgY8WpbmcgbMOgIDUsMDAwIMSRxqFuIHbhu4sgdGnhu4FuIHRy4bufIGzDqm4qKg0KDQotIE3hu6ljIGdpw6EgKip0aOG6pXAgbmjhuqV0IHbDoCBjYW8gbmjhuqV0KiogY8OzIHPhu7EgY2jDqm5oIGzhu4djaCDEkeG6v24gKioxNSwwMDAgxJHGoW4gduG7iyB0aeG7gW4qKg0KDQotLS0NCg0KIyMjICoqQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBUcnVuZyB24buLIC0gTWVkaWFuIGdpw6EgdGjDoG5oKioNCg0KKipNZWRpYW4gLSBT4buRIHRydW5nIHbhu4sqKiBoYXkgbMOgIG3hu5l0ICoqxJFp4buDbSB0cnVuZyB0w6JtKiogdHJvbmcgbeG7mXQgZGFuaCBzw6FjaCDEkcaw4bujYyBz4bqvcCB44bq/cCB0xINuZyBob+G6t2MgZ2nhuqNtIGThuqduIChuw7Mga2jDoWMgdHJ1bmcgYsOsbmgg4bufIGNo4buXIG7DsyBjaGlhIMSR4buRaSB0xrDhu6NuZyByYSBsw6BtIMSRw7RpIHbDoCBjaMawYSBjaOG6r2MgMiBiw6puIMSRw7Mgc+G6vSBjw6JuIGLhurFuZyBuaGF1KQ0KDQotIEJhbiBuw6N5LCB0YSB0w61uaCBnacOhIHRydW5nIGLDrG5oIMSR4buDIGPDsyB0aOG7gyBtdWEgbeG7mXQgdmnDqm4ga2ltIGPGsMahbmcgLSDEkcOzIGzDoCBz4buRIHRp4buBbiB0cnVuZyBiw6xuaCBu4bq/dSBtdeG7kW4gc+G7nyBo4buvdQ0KDQotIEPDsm4ga2hpIHTDrW5oIHPhu5EgdHJ1bmcgduG7iyAtIGPDsyBuZ2jEqWEgdGEgxJHDoyBjaGlhIGdpw6EgdGjDoG5oIGPhu6dhIGzGsOG7o25nIGtpbSBjxrDGoW5nIMSRw7MgcmEgbMOgbSAyIHBo4bqnbg0KDQogICAgLSBT4buRIHRp4buBbiB0YSB0w61uaCByYSDEkcaw4bujYyBn4buNaSBsw6Agc+G7kSB0cnVuZyB24buLLyBoYXkgZ+G7jWkgbMOgIGNvbiBz4buRIHRydW5nIHTDom0NCiAgICANCiAgICAtIEPDsyBuZ2jEqWEgbMOgIDEgbuG7rWEgbMaw4bujbmcga2ltIGPGsMahbmcgc+G6vSBjw7MgZ2nDoSB0aOG6pXAgaMahbiBt4bupYyBnacOhIMSRw7MgdsOgIDEgbuG7rWEgbMaw4bujbmcgYsOqbiBjw7JuIGzhuqFpIHPhur0gY8OzIGdpw6EgY2FvIGjGoW4NCiAgICANCiAgICAtIE7DsyBob8OgbiB0b8OgbiBraMOhYyB24bubaSBnacOhIHRydW5nIGLDrG5oIMSRw6MgdMOtbmgNCg0KVGEgY8OzIGJp4buDdSDEkeG7kyB0w61uaCBnacOhIHRp4buBbiB0cnVuZyB24buLIHRyw6puIG3hu5dpIG3hu6ljIGdpw6EgbmjGsCBzYXUgOg0KDQoNCmBgYHtyfQ0KS0MyICU+JSBncm91cF9ieShHaWFQcmljZSkgJT4lIHN1bW1hcmlzZShtPSBtZWRpYW4ocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gR2lhUHJpY2UseSA9IG0pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IDIsIGNvbG9yID0gJ2dyZWVuJykgKw0KICAgIGxhYnMoeCA9ICdQcmljZScsIHkgPSAnTWVhbicpDQpgYGANCg0KIyMjIyAqKk5o4bqtbiB4w6l0IEdpw6EgdGjDoG5oIDMqKg0KDQpTYXUga2hpIMSRw6MgdMOtbmggdHJ1bmcgduG7iyDhu58gbeG7l2kgbeG7qWMgZ2nDoSB0YSBjw7Mgc+G7kSBsaeG7h3UgbmjGsCBzYXUgOg0KDQotICoqTeG7qWMgZ2nDoSBS4bqldCBy4bq7KiogY8OzIGdpw6EgdHJ1bmcgduG7iyBsw6Aga2hv4bqjbmcgKioxLDQwNyDEkcahbiB24buLIHRp4buBbioqDQoNCi0gKipN4bupYyBnacOhIFLhursqKiBjw7MgZ2nDoSB0cnVuZyB24buLIGzDoCBraG/huqNuZyAqKjYsNTE4IMSRxqFuIHbhu4sgdGnhu4FuKioNCg0KLSAqKk3hu6ljIGdpw6EgxJDhuq90KiogY8OzIGdpw6EgdHJ1bmcgduG7iyBsw6Aga2hv4bqjbmcgKioxMSw0NzQgxJHGoW4gduG7iyB0aeG7gW4qKg0KDQotICoqTeG7qWMgZ2nDoSBS4bqldCDEkeG6r3QqKiBjw7MgZ2nDoSB0cnVuZyB24buLIGzDoCBraG/huqNuZyAqKjE2LDI1OCDEkcahbiB24buLIHRp4buBbioqDQoNCi0gVGEgdGjhuqV5IHThu6tuZyBt4bupYyBnacOhIHRydW5nIHbhu4sgY8Wpbmcga2jDtG5nIGNow6puaCBs4buHY2ggduG7m2kgdHJ1bmcgduG7iyBsw6AgYmFvDQoNCi0gTmjGsG5nIG5ow6xuIGNodW5nLCBjw6FjIG3hu6ljIGdpw6EgduG6q24geOG6v3AgdGhlbyB0aOG7qSB04buxIDogUuG6pXQgxJHhuq90IGNhbyBuaOG6pXQsIMSQ4bqvdCAtIFLhursgLSBS4bqldCBy4bq7IGdp4bqjbSBk4bqnbiB0aGVvIHNhdQ0KDQpWw60gZOG7pSBu4bq/dSBi4bqhbiBtdeG7kW4gbXVhIG3hu5l0IHZpw6puIGtpbSBjxrDGoW5nIOG7nyAqKm3hu6ljIGdpw6EgxJDhuq90KiosIHRow6wgdGhlbyBz4buRIGxp4buHdSBnacOhIHRow6BuaCB0cnVuZyB24buLIGzDoCAxMSw0NzQNCg0KLSBUaGVvIG5oxrAgc+G7kSBsaeG7h3UgY8OzIDMsNTc0IHZpw6puIGtpbSBjxrDGoW5nIOG7nyBnacOhIHRow6BuaCBuw6B5DQoNCi0gVuG6rXkgY8OzICoqMSBu4butYSBsxrDhu6NuZyoqIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgbsOgeSBjw7MgKipnacOhIHRyw6puIDExLDQ3NCDEkcahbiB24buLIHRp4buBbioqDQoNCi0gQ8OybiBs4bqhaSBjw7MgKioxIG7hu61hIGzGsOG7o25nKiogY8OhYyB2acOqbiBraW0gY8awxqFuZyBjw7MgKipnacOhIGTGsOG7m2kgMTEsNDc0IMSRxqFuIHbhu4sgdGnhu4FuKioNCg0KDQoNCg==