04:19:56, 02 - 03 - 2024

NHIỆM VỤ 4


1. GIỚI THIỆU MỘT SỐ ĐỒ THỊ DẠNG BAR CHART CHO BỘ DỮ LIỆU DIAMOND

library(ggplot2)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
htp <- diamonds
htp$MG <- case_when(htp$price < 1000 ~'Loại  1', htp$price >= 1000 & htp$price < 5000 ~ ' Loại  2' , htp$price >= 5000 & htp$price< 10000 ~ 'Loại 3', htp$price >= 10000 & htp$price < 15000 ~ 'Loại 4', htp$price >= 15000 ~ 'Loại 5')

1.1 ĐỒ THỊ 1 - Biểu đồ Cột với Số Lượng Kim Cương theo Màu Sắc

htp %>% ggplot(aes(x = color)) +
    geom_bar(fill='navy') +
    labs(x = 'Loại ', y = 'Số lượng' )

  • Giải Thích Kết Quả:

-Trục X (“Màu Sắc”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi mức độ màu sắc.

Biểu đồ giúp thấy rõ sự phân bố của kim cương dựa trên mức độ màu sắc của chúng. Mỗi cột trên biểu đồ biểu thị số lượng kim cương tương ứng với mỗi mức độ màu sắc. Màu navy được chọn để tô màu cho tất cả các cột, không phân biệt giữa các mức độ màu sắc. Biểu đồ này không phân loại chi tiết hơn về mối quan hệ giữa màu sắc và số lượng kim cương, nó chỉ thể hiện phân bố tổng quan.

1.2 ĐỒ THỊ 2 - Biểu đồ Cột Ngang với Số Lượng Kim Cương theo Clarity

htp %>% ggplot(aes(x = clarity)) +
    geom_bar(fill='gold') +
    labs(x = 'Loại', y = 'Số lượng') +
    coord_flip()

  • Giải Thích Kết Quả:

-Trục Y (“Loại”): Trục này biểu diễn các loại clarity (SI1, VS2, VS1, SI2, VVS2, VVS1, IF).

-Trục X (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại clarity.

Biểu đồ giúp thấy rõ sự phân bố của kim cương dựa trên loại clarity của chúng. Mỗi cột trên biểu đồ biểu thị số lượng kim cương tương ứng với từng loại clarity. Hoán đổi trục giúp làm cho biểu đồ trở nên dễ đọc hơn khi so sánh số lượng kim cương giữa các loại clarity.

Biểu đồ này cung cấp một cái nhìn tổng quan về sự phân phối của kim cương dựa trên clarity và làm cho so sánh giữa các loại clarity trở nên trực quan hơn.

1.3 ĐỒ THỊ 3 - Biểu đồ Cột với Số Lượng Kim Cương theo Loại Cắt

htp %>% ggplot(aes(x = cut)) +
    geom_bar(fill='navy') +
    labs(x = 'Loại', y = 'Số lượng')

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương (Fair, Good, Very Good, Premium, Ideal).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại cắt.

Biểu đồ cung cấp cái nhìn tổng quan về sự phân phối của kim cương theo loại cắt. Nó giúp dễ dàng so sánh số lượng kim cương giữa các loại cắt khác nhau.

1.4 ĐỒ THỊ 4 - Biểu đồ Cột với Số Lượng Kim Cương theo Clarity

htp %>% group_by(clarity ) %>% summarise(n = n()) %>%
  ggplot(aes(clarity,n)) +
    geom_col(fill='gold') +
    geom_text(aes(label = n),vjust = 2, color = 'navy') +
    labs(x = 'Loại ', y = 'Số lượng')

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại clarity (SI1, VS2, VS1, SI2, VVS2, VVS1, IF).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại clarity.

Biểu đồ này thể hiện sự phân bố số lượng kim cương cho từng loại clarity. Mỗi cột biểu thị số lượng kim cương tương ứng với loại clarity.

Biểu đồ này giúp dễ dàng so sánh số lượng kim cương giữa các loại clarity và cung cấp cái nhìn tổng quan về phân phối của chúng trong bộ dữ liệu.

1.5 ĐỒ THỊ 5 - Biểu đồ Cột với Số Lượng Kim Cương theo Loại Cắt

htp %>% group_by(cut ) %>% summarise(n = n()) %>%
  ggplot(aes(cut,n)) +
    geom_col(fill='gold') +
    geom_text(aes(label = n),vjust = 2, color = 'navy') +
    labs(x = 'loại ', y = 'Số lượng')

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương (Fair, Good, Very Good, Premium, Ideal).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại cắt.

Biểu đồ này thể hiện sự phân bố số lượng kim cương cho từng loại cắt. Mỗi cột biểu thị số lượng kim cương tương ứng với loại cắt.

Biểu đồ này giúp dễ dàng so sánh số lượng kim cương giữa các loại cắt và cung cấp cái nhìn tổng quan về phân phối của chúng trong bộ dữ liệu.

1.6 ĐỒ THỊ 6 - Biểu đồ Cột với Số Lượng Kim Cương theo Màu Sắc

htp %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(color,n)) +
    geom_col(fill='gold') +
    geom_text(aes(label = n),vjust = 2, color = 'navy') +
    labs(x = 'loại  ', y = 'Số lượng')

  • Giải Thích Kết Quả:

-Trục X (“Màu Sắc”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi mức độ màu sắc.

Biểu đồ này thể hiện sự phân bố số lượng kim cương cho từng mức độ màu sắc. Mỗi cột biểu thị số lượng kim cương tương ứng với mỗi mức độ màu sắc.

Biểu đồ này giúp dễ dàng so sánh số lượng kim cương giữa các mức độ màu sắc và cung cấp cái nhìn tổng quan về phân phối của chúng trong bộ dữ liệu.

1.7 ĐỒ THỊ 7 - Biểu đồ Cột với Số Lượng Kim Cương theo Clarity

htp %>% group_by(clarity) %>% summarise(n = n()) %>%
  ggplot(aes(clarity,n)) +
    geom_col(fill='navy') +
    geom_text(aes(label = percent(n/length(htp$carat))),vjust = 2, color = 'gold') +
    labs(x = 'Loại', y = 'Số lượng')

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại clarity (SI1, VS2, VS1, SI2, VVS2, VVS1, IF).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại clarity.

Biểu đồ này thể hiện sự phân bố của số lượng kim cương cho từng loại clarity. Mỗi cột biểu thị số lượng kim cương tương ứng với loại clarity.

Biểu đồ này giúp thấy rõ sự phân bố của kim cương dựa trên clarity và cung cấp thông tin về tỷ lệ phần trăm của từng loại clarity trong toàn bộ bộ dữ liệu.

1.8 ĐỒ THỊ 8 - Biểu đồ Cột với Số Lượng Kim Cương theo Loại Cắt

htp %>% group_by(cut) %>% summarise(n = n()) %>%
  ggplot(aes(cut,n)) +
    geom_col(fill='navy') +
    geom_text(aes(label = percent(n/length(htp$carat))),vjust = 2, color = 'gold') +
    labs(x = 'Loại', y = 'Số lượng')

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương (Fair, Good, Very Good, Premium, Ideal).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại cắt.

Biểu đồ này thể hiện sự phân bố của số lượng kim cương cho từng loại cắt. Mỗi cột biểu thị số lượng kim cương tương ứng với loại cắt.

Biểu đồ này giúp thấy rõ sự phân bố của kim cương dựa trên loại cắt và cung cấp thông tin về tỷ lệ phần trăm của từng loại cắt trong toàn bộ bộ dữ liệu.

1.9 ĐỒ THỊ 9 - Biểu đồ Cột với Số Lượng Kim Cương theo Màu Sắc

htp %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(color,n)) +
    geom_col(fill='navy') +
    geom_text(aes(label = percent(n/length(htp$carat))),vjust = 2, color = 'gold') +
    labs(x = 'Loại', y = 'Số lượng')

  • Giải Thích Kết Quả:

-Trục X (“Màu Sắc”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi mức độ màu sắc.

Biểu đồ này thể hiện sự phân bố của số lượng kim cương cho từng mức độ màu sắc. Mỗi cột biểu thị số lượng kim cương tương ứng với mỗi mức độ màu sắc.

Biểu đồ này giúp thấy rõ sự phân bố của kim cương dựa trên mức độ màu sắc và cung cấp thông tin về tỷ lệ phần trăm của từng mức độ màu sắc trong toàn bộ bộ dữ liệu.

1.10 ĐỒ THỊ 10 - Biểu đồ Cột Dạng “Facet” với Số Lượng Kim Cương theo Màu Sắc và Clarity

htp %>% group_by(clarity,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = color,y = n)) +
    geom_col(fill="gold") +
    facet_wrap(~clarity) +
    labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi mức độ màu sắc.

Biểu đồ này thể hiện sự phân bố của số lượng kim cương cho từng mức độ màu sắc, được phân loại theo clarity. Thông qua các facets, bạn có thể thấy sự biến động của số lượng kim cương dựa trên clarity và màu sắc tương ứng.

Biểu đồ này mang lại cái nhìn tổng quan về mối quan hệ giữa màu sắc, clarity và số lượng kim cương trong bộ dữ liệu.

1.11 ĐỒ THỊ 11 - Biểu đồ Cột Dạng “Facet” với Số Lượng Kim Cương theo Clarity và Loại Cắt

htp %>% group_by(cut,clarity) %>% summarise(n=n()) %>%
  ggplot(aes(x = clarity,y = n)) +
    geom_col(fill="gold") +
    facet_wrap(~cut) +
    labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại clarity (SI1, VS2, VS1, SI2, VVS2, VVS1, IF).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại clarity.

Biểu đồ này thể hiện sự phân bố của số lượng kim cương cho từng loại clarity, được phân loại theo loại cắt. Thông qua các facets, bạn có thể thấy sự biến động của số lượng kim cương dựa trên loại cắt và clarity tương ứng.

Biểu đồ này mang lại cái nhìn tổng quan về mối quan hệ giữa loại cắt, clarity và số lượng kim cương trong bộ dữ liệu.

1.12 ĐỒ THỊ 12 - Biểu đồ Cột Dạng “Facet” với Số Lượng Kim Cương theo Màu Sắc và Loại Cắt

htp %>% group_by(cut,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = color,y = n)) +
    geom_col(fill="gold") +
    facet_wrap(~cut) +
    labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi mức độ màu sắc.

Biểu đồ này thể hiện sự phân bố của số lượng kim cương cho từng mức độ màu sắc, được phân loại theo loại cắt. Thông qua các facets, bạn có thể thấy sự biến động của số lượng kim cương dựa trên loại cắt và màu sắc tương ứng.

Biểu đồ này mang lại cái nhìn tổng quan về mối quan hệ giữa màu sắc, loại cắt và số lượng kim cương trong bộ dữ liệu.

1.13 ĐỒ THỊ 13 - Biểu đồ Cột Dạng “Facet” với Số Lượng Kim Cương theo Clarity và Loại Cắt

htp %>% group_by(clarity,cut) %>% summarise(n=n()) %>%
  ggplot(aes(x = clarity,y = n)) +
    geom_col( fill= 'navy') +
    facet_wrap(~ cut) +
    geom_text(aes(label = n),vjust = 2, color = 'gold') +
    labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại clarity (SI1, VS2, VS1, SI2, VVS2, VVS1, IF).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại clarity.

Biểu đồ này thể hiện mối quan hệ giữa số lượng kim cương, clarity và loại cắt. Mỗi cột biểu thị số lượng kim cương tương ứng với mỗi loại clarity, và các cột này được nhóm lại theo loại cắt.

Biểu đồ này giúp thấy rõ mối quan hệ giữa clarity, loại cắt và số lượng kim cương. Các facets cho phép bạn so sánh sự phân phối của kim cương theo clarity trong từng loại cắt khác nhau.

1.14 ĐỒ THỊ 14 - Biểu đồ Cột Dạng “Facet” với Số Lượng Kim Cương theo Màu Sắc và Clarity

htp %>% group_by(clarity,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = color,y = n)) +
    geom_col( fill= 'navy') +
    facet_wrap(~clarity) +
    geom_text(aes(label = n),vjust = 2, color = 'gold') +
    labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi mức độ màu sắc.

Biểu đồ này thể hiện mối quan hệ giữa số lượng kim cương, màu sắc và clarity. Mỗi cột biểu thị số lượng kim cương tương ứng với mỗi mức độ màu sắc, và các cột này được nhóm lại theo clarity.

Biểu đồ này giúp thấy rõ mối quan hệ giữa màu sắc, clarity và số lượng kim cương. Các facets cho phép bạn so sánh sự phân phối của kim cương theo màu sắc trong từng loại clarity khác nhau.

1.15 ĐỒ THỊ 15 - Biểu đồ Cột Dạng “Facet” với Số Lượng Kim Cương theo Màu Sắc và Loại Cắt

htp %>% group_by(cut,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = color,y = n)) +
    geom_col( fill= 'navy') +
    facet_wrap(~cut) +
    geom_text(aes(label = n),vjust = 2, color = 'gold') +
    labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi mức độ màu sắc.

Biểu đồ này thể hiện mối quan hệ giữa số lượng kim cương, màu sắc và loại cắt. Mỗi cột biểu thị số lượng kim cương tương ứng với mỗi mức độ màu sắc, và các cột này được nhóm lại theo loại cắt.

Biểu đồ này giúp thấy rõ mối quan hệ giữa màu sắc, loại cắt và số lượng kim cương. Các facets cho phép bạn so sánh sự phân phối của kim cương theo màu sắc trong từng loại cắt khác nhau.

1.16 ĐỒ THỊ 16 - Biểu đồ Cột Dạng “Facet” với Giá Trị Trung Bình của Kim Cương theo Màu Sắc và Clarity

htp %>% group_by(clarity,color) %>% summarise(m = mean(price)) %>%
  ggplot(aes(x = color,y = m)) +
    geom_col(position = 'dodge', fill= 'gold') +
    facet_wrap(~clarity) +
    geom_text(aes(label = round(m))) +
    labs(x = 'Color ', y = 'Số lượng')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

  • Giải Thích Kết Quả:

-Trục X (“Color”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Giá Trị Trung Bình”): Trục này thể hiện giá trị trung bình của kim cương cho mỗi mức độ màu sắc.

Biểu đồ này thể hiện giá trị trung bình của kim cương dựa trên mức độ màu sắc và clarity. Mỗi cột biểu thị giá trị trung bình tương ứng với mỗi mức độ màu sắc, và các cột này được nhóm lại theo clarity.

Biểu đồ này giúp thấy rõ mối quan hệ giữa giá trị trung bình của kim cương, màu sắc và clarity. Các facets cho phép bạn so sánh giá trị trung bình của kim cương theo màu sắc trong từng loại clarity khác nhau.

1.17 ĐỒ THỊ 17 - Biểu đồ Cột Dạng “Facet” với Giá Trị Trung Bình của Kim Cương theo Clarity và Loại Cắt

htp %>% group_by(cut,clarity) %>% summarise(m = mean(price)) %>%
  ggplot(aes(x = clarity,y = m)) +
    geom_col(position = 'dodge', fill= 'gold') +
    facet_wrap(~cut ) +
    geom_text(aes(label = round(m))) +
    labs(x = 'clarity ', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

  • Giải Thích Kết Quả:

-Trục X (“Clarity”): Trục này biểu diễn các loại clarity (SI1, VS2, VS1, SI2, VVS2, VVS1, IF).

-Trục Y (“Giá Trị Trung Bình”): Trục này thể hiện giá trị trung bình của kim cương cho mỗi loại clarity.

Biểu đồ này thể hiện giá trị trung bình của kim cương dựa trên loại clarity và loại cắt. Mỗi cột biểu thị giá trị trung bình tương ứng với mỗi loại clarity, và các cột này được nhóm lại theo loại cắt.

Biểu đồ này giúp thấy rõ mối quan hệ giữa giá trị trung bình của kim cương, clarity và loại cắt. Các facets cho phép bạn so sánh giá trị trung bình của kim cương theo clarity trong từng loại cắt khác nhau.

1.18 ĐỒ THỊ 18 - Biểu đồ Cột Dạng “Facet” với Giá Trị Trung Bình của Kim Cương theo Màu Sắc và Loại Cắt

htp %>% group_by(cut,color) %>% summarise(m = mean(price)) %>%
  ggplot(aes(x = color,y = m)) +
    geom_col(position = 'dodge',fill= 'gold') +
    facet_wrap(~cut ) +
    geom_text(aes(label = round(m))) +
    labs(x = 'Color ', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

  • Giải Thích Kết Quả:

-Trục X (“Color”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Giá Trị Trung Bình”): Trục này thể hiện giá trị trung bình của kim cương cho mỗi mức độ màu sắc.

Biểu đồ này thể hiện giá trị trung bình của kim cương dựa trên mức độ màu sắc và loại cắt. Mỗi cột biểu thị giá trị trung bình tương ứng với mỗi mức độ màu sắc, và các cột này được nhóm lại theo loại cắt.

Biểu đồ này giúp thấy rõ mối quan hệ giữa giá trị trung bình của kim cương, màu sắc và loại cắt. Các facets cho phép bạn so sánh giá trị trung bình của kim cương theo màu sắc trong từng loại cắt khác nhau.

1.19 ĐỒ THỊ 19 - Biểu Đồ Cột với Phân Phối Giá Trị của Kim Cương theo Phân Khúc Giá

tp1 <- htp %>% mutate(Price = cut(price,5, label = c('rất thấp ', 'thấp','tb','cao','rất cao')))
tp1 %>% ggplot(aes(x = Price)) +
  geom_bar(fill = 'red')

  • Giải Thích Kết Quả:

-Trục X (“Giá Trị”): Trục này biểu diễn các phân khúc giá của kim cương (rất thấp, thấp, trung bình, cao, rất cao).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương trong mỗi phân khúc giá.

Biểu đồ này thể hiện phân phối của kim cương dựa trên phân khúc giá. Mỗi cột biểu thị số lượng kim cương tương ứng với mỗi phân khúc giá.

Biểu đồ này giúp trực quan hóa cách kim cương phân phối trong các phân khúc giá khác nhau, giúp nhìn nhận mức độ phổ biến của kim cương trong mỗi khoảng giá.

1.20 ĐỒ THỊ 20 - Biểu Đồ Cột với Phân Phối Trọng Lượng Carat của Kim Cương

tp2 <-htp %>% mutate(Carat = cut(carat,5, label = c('rất nhỏ', 'nhỏ','vừa','lớn','rất lớn')))
tp2 %>% ggplot(aes(x = Carat)) +
  geom_bar(fill = 'red')

  • Giải Thích Kết Quả:

-Trục X (“Carat”): Trục này biểu diễn các phân khúc trọng lượng carat của kim cương (rất nhỏ, nhỏ, vừa, lớn, rất lớn).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương trong mỗi phân khúc trọng lượng carat.

Biểu đồ này thể hiện phân phối của kim cương dựa trên trọng lượng carat. Mỗi cột biểu thị số lượng kim cương tương ứng với mỗi phân khúc trọng lượng carat.

Biểu đồ này giúp trực quan hóa cách kim cương phân phối trong các phân khúc trọng lượng carat khác nhau, giúp nhìn nhận mức độ phổ biến của kim cương dựa trên kích thước.

1.21 ĐỒ THỊ 21 - Biểu đồ Số lượng Kim cương theo Loại Cắt

htp <- diamonds
htp %>% ggplot(aes(x = cut)) +
    geom_bar(fill='navy') +
    labs(x = 'Loại', y = 'Số lượng')

  • Giải Thích Kết Quả:

Đồ thị này thể hiện số lượng kim cương cho mỗi loại cắt.

-Trục X (“Loại”): Trục này thể hiện các loại cắt khác nhau của kim cương. Các loại cắt có thể là “Fair”, “Good”, “Very Good”, “Premium”, và “Ideal”.

-Trục Y (“Số lượng”): Trục này biểu diễn số lượng kim cương tương ứng với từng loại cắt trên trục X.

Các thanh cột trên biểu đồ biểu thị số lượng kim cương thuộc mỗi loại cắt. Nếu thanh cột của một loại cắt càng cao, điều này có nghĩa là có nhiều kim cương thuộc loại cắt đó trong bộ dữ liệu.

1.22 ĐỒ THỊ 22 - Biểu đồ Cột Ngang với số lượng Kim cương theo Loại Cắt

htp <- diamonds
htp %>% ggplot(aes(x = cut)) +
    geom_bar(fill='gold') +
    labs(x = 'Loại', y = 'Số lượng') +
    coord_flip()

  • Giải Thích Kết Quả:

-Trục X (“Số lượng”): Trục này biểu diễn số lượng kim cương.

-Trục Y (“Loại”): Trục này thể hiện các loại cắt khác nhau của kim cương.

Biểu đồ này đã sử dụng coord_flip() để đảo ngược trục X và Y, biến nó từ một biểu đồ cột truyền thống thành một biểu đồ cột ngang. Các thanh cột ngang trên biểu đồ biểu thị số lượng kim cương cho mỗi loại cắt. Nếu thanh cột của một loại cắt càng dài, điều này chỉ ra rằng có nhiều kim cương thuộc loại cắt đó trong bộ dữ liệu.

1.23 ĐỒ THỊ 23 - Biểu đồ Cột với Số lượng Kim cương theo Loại Cắt

htp %>% group_by(cut) %>% summarise(n = n()) %>%
  ggplot(aes(cut,n)) +
    geom_col(fill='navy') +
    geom_text(aes(label = n),vjust = 2, color = 'gold') +
    labs(x = 'Loại', y = 'Số lượng')

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương.

-Trục Y (“Số lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại cắt.

Biểu đồ này giúp hiểu rõ hơn về phân phối của số lượng kim cương trong từng loại cắt và cung cấp thông tin chi tiết về giá trị cụ thể của mỗi cột.

1.24 ĐỒ THỊ 24 - Biểu đồ Cột với Tỉ lệ phần trăm Kim cương theo Loại Cắt

htp %>% group_by(cut) %>% summarise(n = n()) %>%
  ggplot(aes(cut,n)) +
    geom_col(fill='gold') +
    geom_text(aes(label = percent(n/length(htp$carat))),vjust = 2, color = 'navy') +
    labs(x = 'Loại', y = 'Số lượng')

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương.

-Trục Y (“Số lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại cắt.

Đồ thị này giúp thấy rõ tỉ lệ phần trăm của mỗi loại cắt so với tổng số lượng kim cương trong dữ liệu. Tính theo tỉ lệ phần trăm, bạn có thể thấy được sự phân phối của kim cương theo loại cắt một cách trực quan.

1.25 ĐỒ THỊ 25 - Biểu đồ Cột Dạng Đối xứng theo Màu Sắc và Loại Cắt của Kim Cương

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

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương.

-Trục Y (“Số lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại cắt.

Các cột trên biểu đồ được nhóm dựa trên loại cắt và tô màu theo màu sắc của kim cương. Hàm facet_wrap(~color) được sử dụng để tạo các phân khúc riêng biệt cho từng màu sắc trên biểu đồ.

Đồ thị này giúp hiểu rõ hơn về sự phân bố của kim cương theo cả loại cắt và màu sắc. Các phân khúc riêng biệt cho mỗi màu sắc giúp so sánh hiệu quả số lượng kim cương theo loại cắt trong từng nhóm màu sắc khác nhau.

1.26 ĐỒ THỊ 26 - Biểu đồ Cột Dạng Đối xứng với Số lượng Kim Cương theo Loại Cắt và Màu Sắc

htp %>% group_by(cut,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = cut,y = n)) +
    geom_col(position = 'dodge', fill='gold') +
    facet_wrap(~color) +
    geom_text(aes(label = n),vjust = 2, color = 'navy') +
    labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương.

-Trục Y (“Số lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại cắt.

Biểu đồ này giúp so sánh số lượng kim cương trong từng loại cắt, được phân loại theo màu sắc, và cung cấp cái nhìn tổng quan về phân phối của chúng trong bộ dữ liệu.

1.27 ĐỒ THỊ 27 - Biểu đồ Cột với Trung bình Trọng Lượng Carat của Kim Cương theo Loại Cắt

htp <- diamonds
htp %>% group_by(cut) %>% summarise(m= mean(carat)) %>%
  ggplot(aes(x = cut,y = m)) +
    geom_col(position = 'dodge', fill='navy') +
    geom_text(aes(label = round(m,2)), vjust = 2, color = 'gold') +
    labs(x = 'Màu', y = 'Mean')

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương.

-Trục Y (“Trung bình Trọng Lượng Carat”): Trục này thể hiện giá trị trung bình của trọng lượng carat cho mỗi loại cắt.

Các cột trên biểu đồ biểu thị giá trị trung bình của trọng lượng carat cho từng loại cắt. Chú thích giá trị trên đỉnh mỗi cột giúp hiển thị số liệu chính xác và chi tiết hơn về giá trị trung bình của từng loại cắt.

Biểu đồ này giúp so sánh giá trị trung bình của trọng lượng carat trong từng loại cắt và cung cấp cái nhìn tổng quan về phân phối của chúng trong bộ dữ liệu.

1.28 ĐỒ THỊ 28 - Biểu đồ Cột Dạng Đối xứng với Giá Trung bình của Kim Cương theo Loại Cắt và Màu Sắc

htp <- diamonds
htp %>% group_by(cut,color) %>% summarise(m = mean(price)) %>%
  ggplot(aes(x = cut,y = m)) +
    geom_col(position = 'dodge', fill='gold') +
    facet_wrap(~color) +
    geom_text(aes(label = round(m))) +
    labs(x = 'cut', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương.

-Trục Y (“Giá Trung bình”): Trục này thể hiện giá trung bình của kim cương cho mỗi loại cắt.

Các cột trên biểu đồ biểu thị giá trung bình của kim cương cho từng loại cắt và màu sắc. Phân khúc màu sắc và chú thích giá trung bình trên đỉnh mỗi cột giúp hiển thị sự phân phối của giá theo loại cắt và màu sắc.

Biểu đồ này giúp so sánh giá trung bình của kim cương trong từng loại cắt, được phân loại theo màu sắc, và cung cấp cái nhìn tổng quan về sự biến động giá theo các yếu tố này trong bộ dữ liệu.

1.29 ĐỒ THỊ 29 - So sánh Số lượng Kim Cương theo Loại Cắt và Màu Sắc (D và J)

htp <- diamonds
htp <- htp %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
htp %>% ggplot(aes(x = cut, y = n)) +
  geom_col(data = htp %>% filter(color == 'D'), fill = 'gold') +
  geom_col(data = htp %>% filter(color == 'J'), fill = 'navy')

  • Giải Thích Kết Quả:

-Trục X (“Loại”): Trục này biểu diễn các loại cắt khác nhau của kim cương.

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương cho mỗi loại cắt.

Các cột trên biểu đồ biểu thị số lượng kim cương cho mỗi loại cắt, nhưng chỉ giữ lại các dữ liệu liên quan đến màu sắc ‘D’ (vàng) và ‘J’ (navy). Mỗi màu sắc có một cột tương ứng trên biểu đồ, giúp so sánh số lượng kim cương của từng loại cắt giữa hai màu sắc khác nhau.

Biểu đồ này giúp thấy rõ sự chênh lệch trong số lượng kim cương giữa các loại cắt khi so sánh giữa màu sắc ‘D’ và ‘J’. Màu vàng biểu thị một mức độ và màu xanh navy biểu thị mức độ khác, giúp đánh bại sự chênh lệch giữa các nhóm.

1.30 ĐỒ THỊ 30 - Biểu đồ Cột với Số Lượng Kim Cương theo Phân loại Trọng Lượng Carat

htp <- diamonds 
htp <- htp %>% mutate(caratC = cut(carat,5, label = c('rất nhỏ', 'nhỏ','vừa','lớn','rất lớn')))
htp %>% ggplot(aes(x = caratC)) +
  geom_bar(fill = 'navy')

  • Giải Thích Kết Quả:

-Trục X (“Phân loại Trọng Lượng Carat”): Trục này biểu diễn các phân loại của trọng lượng carat, được xác định bằng hàm cut() từ thư viện dplyr.

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương thuộc từng phân loại.

Biểu đồ này giúp thấy rõ sự phân bố của kim cương theo trọng lượng carat, được chia thành các nhóm rất nhỏ, nhỏ, vừa, lớn và rất lớn.

1.31 ĐỒ THỊ 31 - Biểu Đồ Cột So Sánh Số Lượng Kim Cương Theo Màu Sắc và Clarity

htp2 <- htp %>% group_by(clarity, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
htp2 %>% ggplot(aes(x = color, y = n)) +
  geom_col(data = htp2 %>% filter(clarity == 'VS2'), fill = 'gold') +
  geom_col(data = htp2 %>% filter(clarity == 'VS1'), fill = 'navy')

  • Giải Thích Kết Quả:

-Trục X (“Màu Sắc”): Trục này biểu diễn các mức độ màu sắc của kim cương (D, E, F, G, H, I, J).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương tương ứng với mỗi mức độ màu sắc.

Biểu đồ này so sánh số lượng kim cương theo màu sắc và clarity. Có hai cột tương ứng với clarity ‘VS2’ và ‘VS1’, mỗi cột biểu thị số lượng kim cương tương ứng với mỗi mức độ màu sắc.

Biểu đồ này giúp thấy rõ sự phân phối của kim cương theo màu sắc và clarity, đồng thời làm nổi bật sự so sánh giữa clarity ‘VS2’ và ‘VS1’ cho mỗi mức độ màu sắc.

1.32 ĐỒ THỊ 32 - Biểu Đồ Cột So Sánh Số Lượng Kim Cương Theo Loại Cắt và Clarity

htp1 <- htp %>% group_by(cut, clarity) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
htp1 %>% ggplot(aes(x = cut, y = n)) +
  geom_col(data = htp1 %>% filter(clarity == 'VS2'), fill = 'gold') +
  geom_col(data = htp1 %>% filter(clarity == 'IF'), fill = 'navy')

  • Giải Thích Kết Quả:

-Trục X (“Loại Cắt”): Trục này biểu diễn các loại cắt của kim cương (Fair, Good, Very Good, Premium, Ideal).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương tương ứng với mỗi loại cắt.

Biểu đồ này so sánh số lượng kim cương theo loại cắt và clarity. Có hai cột tương ứng với clarity ‘VS2’ và ‘IF’, mỗi cột biểu thị số lượng kim cương tương ứng với mỗi loại cắt.

Biểu đồ này giúp thấy rõ sự phân phối của kim cương theo loại cắt và clarity, đồng thời làm nổi bật sự so sánh giữa clarity ‘VS2’ và ‘IF’ cho mỗi loại cắt.

1.33 ĐỒ THỊ 33 - Biểu Đồ Cột So Sánh Số Lượng Kim Cương Theo Loại Cắt và Màu Sắc

htp3 <- htp %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
htp3 %>% ggplot(aes(x = cut, y = n)) + 
  geom_col(data = htp3 %>% filter(color == 'D'), fill = 'gold') +
  geom_col(data = htp3 %>% filter(color == 'J'), fill = 'navy')

  • Giải Thích Kết Quả:

-Trục X (“Loại Cắt”): Trục này biểu diễn các loại cắt của kim cương (Fair, Good, Very Good, Premium, Ideal).

-Trục Y (“Số Lượng”): Trục này thể hiện số lượng kim cương tương ứng với mỗi loại cắt.

Biểu đồ này so sánh số lượng kim cương theo loại cắt và màu sắc. Có hai cột tương ứng với màu sắc ‘D’ và ‘J’, mỗi cột biểu thị số lượng kim cương tương ứng với mỗi loại cắt.

Biểu đồ này giúp thấy rõ sự phân phối của kim cương theo loại cắt và màu sắc, đồng thời làm nổi bật sự so sánh giữa màu sắc ‘D’ và ‘J’ cho mỗi loại cắt.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA0IC0gTcO0biBOZ8O0biBOZ+G7ryBM4bqtcCBUcsOsbmggVHJvbmcgUGjDom4gVMOtY2ggROG7ryBMaeG7h3UiDQphdXRob3I6ICJIb8OgbmcgVOG6pW4gUGjDoXQiDQpkYXRlOiANCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogVHJ1ZQ0KICAgIHRvYzogVHJ1ZQ0KICAgIHRvY19mbG9hdDogVHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQpgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyAqKk5ISeG7hk0gVuG7pCA0KioNCioqKg0KDQojIyAqKjEuIEdJ4buaSSBUSEnhu4ZVIE3hu5hUIFPhu5AgxJDhu5IgVEjhu4ogROG6oE5HIEJBUiBDSEFSVCBDSE8gQuG7mCBE4buuIExJ4buGVSBESUFNT05EKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KaHRwIDwtIGRpYW1vbmRzDQpodHAkTUcgPC0gY2FzZV93aGVuKGh0cCRwcmljZSA8IDEwMDAgfidMb+G6oWkgIDEnLCBodHAkcHJpY2UgPj0gMTAwMCAmIGh0cCRwcmljZSA8IDUwMDAgfiAnIExv4bqhaSAgMicgLCBodHAkcHJpY2UgPj0gNTAwMCAmIGh0cCRwcmljZTwgMTAwMDAgfiAnTG/huqFpIDMnLCBodHAkcHJpY2UgPj0gMTAwMDAgJiBodHAkcHJpY2UgPCAxNTAwMCB+ICdMb+G6oWkgNCcsIGh0cCRwcmljZSA+PSAxNTAwMCB+ICdMb+G6oWkgNScpDQpgYGANCg0KIyMjICoqMS4xIMSQ4buSIFRI4buKIDEgLSBCaeG7g3UgxJHhu5MgQ+G7mXQgduG7m2kgU+G7kSBMxrDhu6NuZyBLaW0gQ8awxqFuZyB0aGVvIE3DoHUgU+G6r2MqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ2dwbG90KGFlcyh4ID0gY29sb3IpKSArDQogICAgZ2VvbV9iYXIoZmlsbD0nbmF2eScpICsNCiAgICBsYWJzKHggPSAnTG/huqFpICcsIHkgPSAnU+G7kSBsxrDhu6NuZycgKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCi1UcuG7pWMgWCAoIk3DoHUgU+G6r2MiKTogVHLhu6VjIG7DoHkgYmnhu4N1IGRp4buFbiBjw6FjIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MgY+G7p2Ega2ltIGPGsMahbmcgKEQsIEUsIEYsIEcsIEgsIEksIEopLlwNCg0KLVRy4bulYyBZICgiU+G7kSBMxrDhu6NuZyIpOiBUcuG7pWMgbsOgeSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYy4NCg0KQmnhu4N1IMSR4buTIGdpw7pwIHRo4bqleSByw7Ugc+G7sSBwaMOibiBi4buRIGPhu6dhIGtpbSBjxrDGoW5nIGThu7FhIHRyw6puIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MgY+G7p2EgY2jDum5nLg0KTeG7l2kgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYy4NCk3DoHUgbmF2eSDEkcaw4bujYyBjaOG7jW4gxJHhu4MgdMO0IG3DoHUgY2hvIHThuqV0IGPhuqMgY8OhYyBj4buZdCwga2jDtG5nIHBow6JuIGJp4buHdCBnaeG7r2EgY8OhYyBt4bupYyDEkeG7mSBtw6B1IHPhuq9jLg0KQmnhu4N1IMSR4buTIG7DoHkga2jDtG5nIHBow6JuIGxv4bqhaSBjaGkgdGnhur90IGjGoW4gduG7gSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3DoHUgc+G6r2MgdsOgIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcsIG7DsyBjaOG7iSB0aOG7gyBoaeG7h24gcGjDom4gYuG7kSB04buVbmcgcXVhbi4NCg0KIyMjICoqMS4yIMSQ4buSIFRI4buKIDIgLSBCaeG7g3UgxJHhu5MgQ+G7mXQgTmdhbmcgduG7m2kgU+G7kSBMxrDhu6NuZyBLaW0gQ8awxqFuZyB0aGVvIENsYXJpdHkqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSkpICsNCiAgICBnZW9tX2JhcihmaWxsPSdnb2xkJykgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArDQogICAgY29vcmRfZmxpcCgpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBZICgiTG/huqFpIik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBsb+G6oWkgY2xhcml0eSAoU0kxLCBWUzIsIFZTMSwgU0kyLCBWVlMyLCBWVlMxLCBJRikuDQoNCi1UcuG7pWMgWCAoIlPhu5EgTMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIGxv4bqhaSBjbGFyaXR5Lg0KDQpCaeG7g3UgxJHhu5MgZ2nDunAgdGjhuqV5IHLDtSBz4buxIHBow6JuIGLhu5EgY+G7p2Ega2ltIGPGsMahbmcgZOG7sWEgdHLDqm4gbG/huqFpIGNsYXJpdHkgY+G7p2EgY2jDum5nLg0KTeG7l2kgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgdOG7q25nIGxv4bqhaSBjbGFyaXR5Lg0KSG/DoW4gxJHhu5VpIHRy4bulYyBnacO6cCBsw6BtIGNobyBiaeG7g3UgxJHhu5MgdHLhu58gbsOqbiBk4buFIMSR4buNYyBoxqFuIGtoaSBzbyBzw6FuaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIGxv4bqhaSBjbGFyaXR5Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBjdW5nIGPhuqVwIG3hu5l0IGPDoWkgbmjDrG4gdOG7lW5nIHF1YW4gduG7gSBz4buxIHBow6JuIHBo4buRaSBj4bunYSBraW0gY8awxqFuZyBk4buxYSB0csOqbiBjbGFyaXR5IHbDoCBsw6BtIGNobyBzbyBzw6FuaCBnaeG7r2EgY8OhYyBsb+G6oWkgY2xhcml0eSB0cuG7nyBuw6puIHRy4buxYyBxdWFuIGjGoW4uDQoNCiMjIyAqKjEuMyDEkOG7kiBUSOG7iiAzIC0gQmnhu4N1IMSR4buTIEPhu5l0IHbhu5tpIFPhu5EgTMaw4bujbmcgS2ltIEPGsMahbmcgdGhlbyBMb+G6oWkgQ+G6r3QqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0KSkgKw0KICAgIGdlb21fYmFyKGZpbGw9J25hdnknKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTG/huqFpIik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdSBj4bunYSBraW0gY8awxqFuZyAoRmFpciwgR29vZCwgVmVyeSBHb29kLCBQcmVtaXVtLCBJZGVhbCkuDQoNCi1UcuG7pWMgWSAoIlPhu5EgTMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIGxv4bqhaSBj4bqvdC4NCg0KQmnhu4N1IMSR4buTIGN1bmcgY+G6pXAgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIHPhu7EgcGjDom4gcGjhu5FpIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIGPhuq90LiBOw7MgZ2nDunAgZOG7hSBkw6BuZyBzbyBzw6FuaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1Lg0KDQojIyMgKioxLjQgxJDhu5IgVEjhu4ogNCAtIEJp4buDdSDEkeG7kyBD4buZdCB24bubaSBT4buRIEzGsOG7o25nIEtpbSBDxrDGoW5nIHRoZW8gQ2xhcml0eSoqDQoNCmBgYHtyfQ0KaHRwICU+JSBncm91cF9ieShjbGFyaXR5ICkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhjbGFyaXR5LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nZ29sZCcpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICduYXZ5JykgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWkgJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJMb+G6oWkiKTogVHLhu6VjIG7DoHkgYmnhu4N1IGRp4buFbiBjw6FjIGxv4bqhaSBjbGFyaXR5IChTSTEsIFZTMiwgVlMxLCBTSTIsIFZWUzIsIFZWUzEsIElGKS4NCg0KLVRy4bulYyBZICgiU+G7kSBMxrDhu6NuZyIpOiBUcuG7pWMgbsOgeSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gbeG7l2kgbG/huqFpIGNsYXJpdHkuDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBz4buxIHBow6JuIGLhu5Egc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gdOG7q25nIGxv4bqhaSBjbGFyaXR5Lg0KTeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdMawxqFuZyDhu6luZyB24bubaSBsb+G6oWkgY2xhcml0eS4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgZOG7hSBkw6BuZyBzbyBzw6FuaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIGxv4bqhaSBjbGFyaXR5IHbDoCBjdW5nIGPhuqVwIGPDoWkgbmjDrG4gdOG7lW5nIHF1YW4gduG7gSBwaMOibiBwaOG7kWkgY+G7p2EgY2jDum5nIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuDQoNCiMjIyAqKjEuNSDEkOG7kiBUSOG7iiA1IC0gQmnhu4N1IMSR4buTIEPhu5l0IHbhu5tpIFPhu5EgTMaw4bujbmcgS2ltIEPGsMahbmcgdGhlbyBMb+G6oWkgQ+G6r3QqKg0KDQoNCmBgYHtyfQ0KaHRwICU+JSBncm91cF9ieShjdXQgKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKGN1dCxuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J2dvbGQnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnbmF2eScpICsNCiAgICBsYWJzKHggPSAnbG/huqFpICcsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTG/huqFpIik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdSBj4bunYSBraW0gY8awxqFuZyAoRmFpciwgR29vZCwgVmVyeSBHb29kLCBQcmVtaXVtLCBJZGVhbCkuDQoNCi1UcuG7pWMgWSAoIlPhu5EgTMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIGxv4bqhaSBj4bqvdC4NCg0KQmnhu4N1IMSR4buTIG7DoHkgdGjhu4MgaGnhu4duIHPhu7EgcGjDom4gYuG7kSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyB04burbmcgbG/huqFpIGPhuq90Lg0KTeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdMawxqFuZyDhu6luZyB24bubaSBsb+G6oWkgY+G6r3QuDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGThu4UgZMOgbmcgc28gc8Ohbmggc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBnaeG7r2EgY8OhYyBsb+G6oWkgY+G6r3QgdsOgIGN1bmcgY+G6pXAgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIHBow6JuIHBo4buRaSBj4bunYSBjaMO6bmcgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4NCg0KIyMjICoqMS42IMSQ4buSIFRI4buKIDYgLSBCaeG7g3UgxJHhu5MgQ+G7mXQgduG7m2kgU+G7kSBMxrDhu6NuZyBLaW0gQ8awxqFuZyB0aGVvIE3DoHUgU+G6r2MqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdnb2xkJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ25hdnknKSArDQogICAgbGFicyh4ID0gJ2xv4bqhaSAgJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJNw6B1IFPhuq9jIik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBt4bupYyDEkeG7mSBtw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nIChELCBFLCBGLCBHLCBILCBJLCBKKS4NCg0KLVRy4bulYyBZICgiU+G7kSBMxrDhu6NuZyIpOiBUcuG7pWMgbsOgeSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYy4NCg0KQmnhu4N1IMSR4buTIG7DoHkgdGjhu4MgaGnhu4duIHPhu7EgcGjDom4gYuG7kSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyB04burbmcgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYy4NCk3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYy4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgZOG7hSBkw6BuZyBzbyBzw6FuaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MgdsOgIGN1bmcgY+G6pXAgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIHBow6JuIHBo4buRaSBj4bunYSBjaMO6bmcgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4NCg0KIyMjICoqMS43IMSQ4buSIFRI4buKIDcgLSBCaeG7g3UgxJHhu5MgQ+G7mXQgduG7m2kgU+G7kSBMxrDhu6NuZyBLaW0gQ8awxqFuZyB0aGVvIENsYXJpdHkqKg0KDQoNCmBgYHtyLCBlY2hvID0gVFJVRX0NCmh0cCAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhjbGFyaXR5LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nbmF2eScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aChodHAkY2FyYXQpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdnb2xkJykgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCi1UcuG7pWMgWCAoIkxv4bqhaSIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIGPDoWMgbG/huqFpIGNsYXJpdHkgKFNJMSwgVlMyLCBWUzEsIFNJMiwgVlZTMiwgVlZTMSwgSUYpLg0KDQotVHLhu6VjIFkgKCJT4buRIEzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyBt4buXaSBsb+G6oWkgY2xhcml0eS4NCg0KQmnhu4N1IMSR4buTIG7DoHkgdGjhu4MgaGnhu4duIHPhu7EgcGjDom4gYuG7kSBj4bunYSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyB04burbmcgbG/huqFpIGNsYXJpdHkuDQpN4buXaSBj4buZdCBiaeG7g3UgdGjhu4sgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0xrDGoW5nIOG7qW5nIHbhu5tpIGxv4bqhaSBjbGFyaXR5Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0aOG6pXkgcsO1IHPhu7EgcGjDom4gYuG7kSBj4bunYSBraW0gY8awxqFuZyBk4buxYSB0csOqbiBjbGFyaXR5IHbDoCBjdW5nIGPhuqVwIHRow7RuZyB0aW4gduG7gSB04bu3IGzhu4cgcGjhuqduIHRyxINtIGPhu6dhIHThu6tuZyBsb+G6oWkgY2xhcml0eSB0cm9uZyB0b8OgbiBi4buZIGLhu5kgZOG7ryBsaeG7h3UuDQoNCiMjIyAqKjEuOCDEkOG7kiBUSOG7iiA4IC0gQmnhu4N1IMSR4buTIEPhu5l0IHbhu5tpIFPhu5EgTMaw4bujbmcgS2ltIEPGsMahbmcgdGhlbyBMb+G6oWkgQ+G6r3QqKg0KDQoNCmBgYHtyfQ0KaHRwICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nbmF2eScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aChodHAkY2FyYXQpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdnb2xkJykgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCi1UcuG7pWMgWCAoIkxv4bqhaSIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIGPDoWMgbG/huqFpIGPhuq90IGtow6FjIG5oYXUgY+G7p2Ega2ltIGPGsMahbmcgKEZhaXIsIEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSwgSWRlYWwpLg0KDQotVHLhu6VjIFkgKCJT4buRIEzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyBt4buXaSBsb+G6oWkgY+G6r3QuDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBz4buxIHBow6JuIGLhu5EgY+G7p2Egc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gdOG7q25nIGxv4bqhaSBj4bqvdC4NCk3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbG/huqFpIGPhuq90Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0aOG6pXkgcsO1IHPhu7EgcGjDom4gYuG7kSBj4bunYSBraW0gY8awxqFuZyBk4buxYSB0csOqbiBsb+G6oWkgY+G6r3QgdsOgIGN1bmcgY+G6pXAgdGjDtG5nIHRpbiB24buBIHThu7cgbOG7hyBwaOG6p24gdHLEg20gY+G7p2EgdOG7q25nIGxv4bqhaSBj4bqvdCB0cm9uZyB0b8OgbiBi4buZIGLhu5kgZOG7ryBsaeG7h3UuDQoNCiMjIyAqKjEuOSDEkOG7kiBUSOG7iiA5IC0gQmnhu4N1IMSR4buTIEPhu5l0IHbhu5tpIFPhu5EgTMaw4bujbmcgS2ltIEPGsMahbmcgdGhlbyBNw6B1IFPhuq9jKioNCg0KDQpgYGB7cn0NCmh0cCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSduYXZ5JykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKGh0cCRjYXJhdCkpKSx2anVzdCA9IDIsIGNvbG9yID0gJ2dvbGQnKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTcOgdSBT4bqvYyIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIGPDoWMgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZyAoRCwgRSwgRiwgRywgSCwgSSwgSikuDQoNCi1UcuG7pWMgWSAoIlPhu5EgTMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MuDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBz4buxIHBow6JuIGLhu5EgY+G7p2Egc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gdOG7q25nIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MuDQpN4buXaSBj4buZdCBiaeG7g3UgdGjhu4sgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5dpIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MuDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHRo4bqleSByw7Ugc+G7sSBwaMOibiBi4buRIGPhu6dhIGtpbSBjxrDGoW5nIGThu7FhIHRyw6puIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MgdsOgIGN1bmcgY+G6pXAgdGjDtG5nIHRpbiB24buBIHThu7cgbOG7hyBwaOG6p24gdHLEg20gY+G7p2EgdOG7q25nIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MgdHJvbmcgdG/DoG4gYuG7mSBi4buZIGThu68gbGnhu4d1Lg0KDQoNCiMjIyAqKjEuMTAgxJDhu5IgVEjhu4ogMTAgLSBCaeG7g3UgxJHhu5MgQ+G7mXQgROG6oW5nICJGYWNldCIgduG7m2kgU+G7kSBMxrDhu6NuZyBLaW0gQ8awxqFuZyB0aGVvIE3DoHUgU+G6r2MgdsOgIENsYXJpdHkqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ3JvdXBfYnkoY2xhcml0eSxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGNvbG9yLHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9ImdvbGQiKSArDQogICAgZmFjZXRfd3JhcCh+Y2xhcml0eSkgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCi1UcuG7pWMgWCAoIkxv4bqhaSIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIGPDoWMgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZyAoRCwgRSwgRiwgRywgSCwgSSwgSikuDQoNCi1UcuG7pWMgWSAoIlPhu5EgTMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MuDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBz4buxIHBow6JuIGLhu5EgY+G7p2Egc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gdOG7q25nIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MsIMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aGVvIGNsYXJpdHkuDQpUaMO0bmcgcXVhIGPDoWMgZmFjZXRzLCBi4bqhbiBjw7MgdGjhu4MgdGjhuqV5IHPhu7EgYmnhur9uIMSR4buZbmcgY+G7p2Egc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBk4buxYSB0csOqbiBjbGFyaXR5IHbDoCBtw6B1IHPhuq9jIHTGsMahbmcg4bupbmcuDQoNCkJp4buDdSDEkeG7kyBuw6B5IG1hbmcgbOG6oWkgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbcOgdSBz4bqvYywgY2xhcml0eSB2w6Agc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0cm9uZyBi4buZIGThu68gbGnhu4d1Lg0KDQojIyMgKioxLjExIMSQ4buSIFRI4buKIDExIC0gQmnhu4N1IMSR4buTIEPhu5l0IEThuqFuZyAiRmFjZXQiIHbhu5tpIFPhu5EgTMaw4bujbmcgS2ltIEPGsMahbmcgdGhlbyBDbGFyaXR5IHbDoCBMb+G6oWkgQ+G6r3QqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ3JvdXBfYnkoY3V0LGNsYXJpdHkpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9ImdvbGQiKSArDQogICAgZmFjZXRfd3JhcCh+Y3V0KSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTG/huqFpIik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBsb+G6oWkgY2xhcml0eSAoU0kxLCBWUzIsIFZTMSwgU0kyLCBWVlMyLCBWVlMxLCBJRikuDQoNCi1UcuG7pWMgWSAoIlPhu5EgTMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIGxv4bqhaSBjbGFyaXR5Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSB0aOG7gyBoaeG7h24gc+G7sSBwaMOibiBi4buRIGPhu6dhIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIHThu6tuZyBsb+G6oWkgY2xhcml0eSwgxJHGsOG7o2MgcGjDom4gbG/huqFpIHRoZW8gbG/huqFpIGPhuq90Lg0KVGjDtG5nIHF1YSBjw6FjIGZhY2V0cywgYuG6oW4gY8OzIHRo4buDIHRo4bqleSBz4buxIGJp4bq/biDEkeG7mW5nIGPhu6dhIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgZOG7sWEgdHLDqm4gbG/huqFpIGPhuq90IHbDoCBjbGFyaXR5IHTGsMahbmcg4bupbmcuDQoNCkJp4buDdSDEkeG7kyBuw6B5IG1hbmcgbOG6oWkgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbG/huqFpIGPhuq90LCBjbGFyaXR5IHbDoCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuDQoNCiMjIyAqKjEuMTIgxJDhu5IgVEjhu4ogMTIgLSBCaeG7g3UgxJHhu5MgQ+G7mXQgROG6oW5nICJGYWNldCIgduG7m2kgU+G7kSBMxrDhu6NuZyBLaW0gQ8awxqFuZyB0aGVvIE3DoHUgU+G6r2MgdsOgIExv4bqhaSBD4bqvdCoqDQoNCmBgYHtyfQ0KaHRwICU+JSBncm91cF9ieShjdXQsY29sb3IpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjb2xvcix5ID0gbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSJnb2xkIikgKw0KICAgIGZhY2V0X3dyYXAofmN1dCkgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCi1UcuG7pWMgWCAoIkxv4bqhaSIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIGPDoWMgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZyAoRCwgRSwgRiwgRywgSCwgSSwgSikuDQoNCi1UcuG7pWMgWSAoIlPhu5EgTMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MuDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBz4buxIHBow6JuIGLhu5EgY+G7p2Egc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gdOG7q25nIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MsIMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aGVvIGxv4bqhaSBj4bqvdC4NClRow7RuZyBxdWEgY8OhYyBmYWNldHMsIGLhuqFuIGPDsyB0aOG7gyB0aOG6pXkgc+G7sSBiaeG6v24gxJHhu5luZyBj4bunYSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGThu7FhIHRyw6puIGxv4bqhaSBj4bqvdCB2w6AgbcOgdSBz4bqvYyB0xrDGoW5nIOG7qW5nLg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBtYW5nIGzhuqFpIGPDoWkgbmjDrG4gdOG7lW5nIHF1YW4gduG7gSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3DoHUgc+G6r2MsIGxv4bqhaSBj4bqvdCB2w6Agc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0cm9uZyBi4buZIGThu68gbGnhu4d1Lg0KDQojIyMgKioxLjEzIMSQ4buSIFRI4buKIDEzIC0gQmnhu4N1IMSR4buTIEPhu5l0IEThuqFuZyAiRmFjZXQiIHbhu5tpIFPhu5EgTMaw4bujbmcgS2ltIEPGsMahbmcgdGhlbyBDbGFyaXR5IHbDoCBMb+G6oWkgQ+G6r3QqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ3JvdXBfYnkoY2xhcml0eSxjdXQpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LHkgPSBuKSkgKw0KICAgIGdlb21fY29sKCBmaWxsPSAnbmF2eScpICsNCiAgICBmYWNldF93cmFwKH4gY3V0KSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnZ29sZCcpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJMb+G6oWkiKTogVHLhu6VjIG7DoHkgYmnhu4N1IGRp4buFbiBjw6FjIGxv4bqhaSBjbGFyaXR5IChTSTEsIFZTMiwgVlMxLCBTSTIsIFZWUzIsIFZWUzEsIElGKS4NCg0KLVRy4bulYyBZICgiU+G7kSBMxrDhu6NuZyIpOiBUcuG7pWMgbsOgeSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gbeG7l2kgbG/huqFpIGNsYXJpdHkuDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcsIGNsYXJpdHkgdsOgIGxv4bqhaSBj4bqvdC4NCk3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbG/huqFpIGNsYXJpdHksIHbDoCBjw6FjIGPhu5l0IG7DoHkgxJHGsOG7o2MgbmjDs20gbOG6oWkgdGhlbyBsb+G6oWkgY+G6r3QuDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHRo4bqleSByw7UgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjbGFyaXR5LCBsb+G6oWkgY+G6r3QgdsOgIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcuIEPDoWMgZmFjZXRzIGNobyBwaMOpcCBi4bqhbiBzbyBzw6FuaCBz4buxIHBow6JuIHBo4buRaSBj4bunYSBraW0gY8awxqFuZyB0aGVvIGNsYXJpdHkgdHJvbmcgdOG7q25nIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1Lg0KDQojIyMgKioxLjE0IMSQ4buSIFRI4buKIDE0IC0gQmnhu4N1IMSR4buTIEPhu5l0IEThuqFuZyAiRmFjZXQiIHbhu5tpIFPhu5EgTMaw4bujbmcgS2ltIEPGsMahbmcgdGhlbyBNw6B1IFPhuq9jIHbDoCBDbGFyaXR5KioNCg0KYGBge3J9DQpodHAgJT4lIGdyb3VwX2J5KGNsYXJpdHksY29sb3IpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjb2xvcix5ID0gbikpICsNCiAgICBnZW9tX2NvbCggZmlsbD0gJ25hdnknKSArDQogICAgZmFjZXRfd3JhcCh+Y2xhcml0eSkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ2dvbGQnKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTG/huqFpIik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBt4bupYyDEkeG7mSBtw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nIChELCBFLCBGLCBHLCBILCBJLCBKKS4NCg0KLVRy4bulYyBZICgiU+G7kSBMxrDhu6NuZyIpOiBUcuG7pWMgbsOgeSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYy4NCg0KQmnhu4N1IMSR4buTIG7DoHkgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2Egc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZywgbcOgdSBz4bqvYyB2w6AgY2xhcml0eS4NCk3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYywgdsOgIGPDoWMgY+G7mXQgbsOgeSDEkcaw4bujYyBuaMOzbSBs4bqhaSB0aGVvIGNsYXJpdHkuDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHRo4bqleSByw7UgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBtw6B1IHPhuq9jLCBjbGFyaXR5IHbDoCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nLiBDw6FjIGZhY2V0cyBjaG8gcGjDqXAgYuG6oW4gc28gc8Ohbmggc+G7sSBwaMOibiBwaOG7kWkgY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIHRyb25nIHThu6tuZyBsb+G6oWkgY2xhcml0eSBraMOhYyBuaGF1Lg0KDQojIyMgKioxLjE1IMSQ4buSIFRI4buKIDE1IC0gQmnhu4N1IMSR4buTIEPhu5l0IEThuqFuZyAiRmFjZXQiIHbhu5tpIFPhu5EgTMaw4bujbmcgS2ltIEPGsMahbmcgdGhlbyBNw6B1IFPhuq9jIHbDoCBMb+G6oWkgQ+G6r3QqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY29sb3IseSA9IG4pKSArDQogICAgZ2VvbV9jb2woIGZpbGw9ICduYXZ5JykgKw0KICAgIGZhY2V0X3dyYXAofmN1dCkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ2dvbGQnKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTG/huqFpIik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBt4bupYyDEkeG7mSBtw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nIChELCBFLCBGLCBHLCBILCBJLCBKKS4NCg0KLVRy4bulYyBZICgiU+G7kSBMxrDhu6NuZyIpOiBUcuG7pWMgbsOgeSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaG8gbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYy4NCg0KQmnhu4N1IMSR4buTIG7DoHkgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2Egc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZywgbcOgdSBz4bqvYyB2w6AgbG/huqFpIGPhuq90Lg0KTeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdMawxqFuZyDhu6luZyB24bubaSBt4buXaSBt4bupYyDEkeG7mSBtw6B1IHPhuq9jLCB2w6AgY8OhYyBj4buZdCBuw6B5IMSRxrDhu6NjIG5ow7NtIGzhuqFpIHRoZW8gbG/huqFpIGPhuq90Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0aOG6pXkgcsO1IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbcOgdSBz4bqvYywgbG/huqFpIGPhuq90IHbDoCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nLiBDw6FjIGZhY2V0cyBjaG8gcGjDqXAgYuG6oW4gc28gc8Ohbmggc+G7sSBwaMOibiBwaOG7kWkgY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIHRyb25nIHThu6tuZyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdS4NCg0KIyMjICoqMS4xNiDEkOG7kiBUSOG7iiAxNiAtIEJp4buDdSDEkeG7kyBD4buZdCBE4bqhbmcgIkZhY2V0IiB24bubaSBHacOhIFRy4buLIFRydW5nIELDrG5oIGPhu6dhIEtpbSBDxrDGoW5nIHRoZW8gTcOgdSBT4bqvYyB2w6AgQ2xhcml0eSoqDQoNCmBgYHtyfQ0KaHRwICU+JSBncm91cF9ieShjbGFyaXR5LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGNvbG9yLHkgPSBtKSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJywgZmlsbD0gJ2dvbGQnKSArDQogICAgZmFjZXRfd3JhcCh+Y2xhcml0eSkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtKSkpICsNCiAgICBsYWJzKHggPSAnQ29sb3IgJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJDb2xvciIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIGPDoWMgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZyAoRCwgRSwgRiwgRywgSCwgSSwgSikuDQoNCi1UcuG7pWMgWSAoIkdpw6EgVHLhu4sgVHJ1bmcgQsOsbmgiKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgY2hvIG3hu5dpIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MuDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIGThu7FhIHRyw6puIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MgdsOgIGNsYXJpdHkuDQpN4buXaSBj4buZdCBiaeG7g3UgdGjhu4sgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5dpIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MsIHbDoCBjw6FjIGPhu5l0IG7DoHkgxJHGsOG7o2MgbmjDs20gbOG6oWkgdGhlbyBjbGFyaXR5Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0aOG6pXkgcsO1IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBraW0gY8awxqFuZywgbcOgdSBz4bqvYyB2w6AgY2xhcml0eS4gQ8OhYyBmYWNldHMgY2hvIHBow6lwIGLhuqFuIHNvIHPDoW5oIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIHRyb25nIHThu6tuZyBsb+G6oWkgY2xhcml0eSBraMOhYyBuaGF1Lg0KDQojIyMgKioxLjE3IMSQ4buSIFRI4buKIDE3IC0gQmnhu4N1IMSR4buTIEPhu5l0IEThuqFuZyAiRmFjZXQiIHbhu5tpIEdpw6EgVHLhu4sgVHJ1bmcgQsOsbmggY+G7p2EgS2ltIEPGsMahbmcgdGhlbyBDbGFyaXR5IHbDoCBMb+G6oWkgQ+G6r3QqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ3JvdXBfYnkoY3V0LGNsYXJpdHkpICU+JSBzdW1tYXJpc2UobSA9IG1lYW4ocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSx5ID0gbSkpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScsIGZpbGw9ICdnb2xkJykgKw0KICAgIGZhY2V0X3dyYXAofmN1dCApICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSkpKSArDQogICAgbGFicyh4ID0gJ2NsYXJpdHkgJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJDbGFyaXR5Iik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBsb+G6oWkgY2xhcml0eSAoU0kxLCBWUzIsIFZTMSwgU0kyLCBWVlMyLCBWVlMxLCBJRikuDQoNCi1UcuG7pWMgWSAoIkdpw6EgVHLhu4sgVHJ1bmcgQsOsbmgiKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgY2hvIG3hu5dpIGxv4bqhaSBjbGFyaXR5Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBraW0gY8awxqFuZyBk4buxYSB0csOqbiBsb+G6oWkgY2xhcml0eSB2w6AgbG/huqFpIGPhuq90Lg0KTeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggdMawxqFuZyDhu6luZyB24bubaSBt4buXaSBsb+G6oWkgY2xhcml0eSwgdsOgIGPDoWMgY+G7mXQgbsOgeSDEkcaw4bujYyBuaMOzbSBs4bqhaSB0aGVvIGxv4bqhaSBj4bqvdC4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgdGjhuqV5IHLDtSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcsIGNsYXJpdHkgdsOgIGxv4bqhaSBj4bqvdC4gQ8OhYyBmYWNldHMgY2hvIHBow6lwIGLhuqFuIHNvIHPDoW5oIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBjbGFyaXR5IHRyb25nIHThu6tuZyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdS4NCg0KIyMjICoqMS4xOCDEkOG7kiBUSOG7iiAxOCAtIEJp4buDdSDEkeG7kyBD4buZdCBE4bqhbmcgIkZhY2V0IiB24bubaSBHacOhIFRy4buLIFRydW5nIELDrG5oIGPhu6dhIEtpbSBDxrDGoW5nIHRoZW8gTcOgdSBT4bqvYyB2w6AgTG/huqFpIEPhuq90KioNCg0KYGBge3J9DQpodHAgJT4lIGdyb3VwX2J5KGN1dCxjb2xvcikgJT4lIHN1bW1hcmlzZShtID0gbWVhbihwcmljZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjb2xvcix5ID0gbSkpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScsZmlsbD0gJ2dvbGQnKSArDQogICAgZmFjZXRfd3JhcCh+Y3V0ICkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtKSkpICsNCiAgICBsYWJzKHggPSAnQ29sb3IgJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJDb2xvciIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIGPDoWMgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZyAoRCwgRSwgRiwgRywgSCwgSSwgSikuDQoNCi1UcuG7pWMgWSAoIkdpw6EgVHLhu4sgVHJ1bmcgQsOsbmgiKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgY2hvIG3hu5dpIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MuDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIGThu7FhIHRyw6puIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MgdsOgIGxv4bqhaSBj4bqvdC4NCk3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBnacOhIHRy4buLIHRydW5nIGLDrG5oIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYywgdsOgIGPDoWMgY+G7mXQgbsOgeSDEkcaw4bujYyBuaMOzbSBs4bqhaSB0aGVvIGxv4bqhaSBj4bqvdC4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgdGjhuqV5IHLDtSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcsIG3DoHUgc+G6r2MgdsOgIGxv4bqhaSBj4bqvdC4gQ8OhYyBmYWNldHMgY2hvIHBow6lwIGLhuqFuIHNvIHPDoW5oIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIHRyb25nIHThu6tuZyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdS4NCg0KIyMjICoqMS4xOSDEkOG7kiBUSOG7iiAxOSAtIEJp4buDdSDEkOG7kyBD4buZdCB24bubaSBQaMOibiBQaOG7kWkgR2nDoSBUcuG7iyBj4bunYSBLaW0gQ8awxqFuZyB0aGVvIFBow6JuIEtow7pjIEdpw6EqKg0KDQpgYGB7cn0NCnRwMSA8LSBodHAgJT4lIG11dGF0ZShQcmljZSA9IGN1dChwcmljZSw1LCBsYWJlbCA9IGMoJ3LhuqV0IHRo4bqlcCAnLCAndGjhuqVwJywndGInLCdjYW8nLCdy4bqldCBjYW8nKSkpDQp0cDEgJT4lIGdncGxvdChhZXMoeCA9IFByaWNlKSkgKw0KICBnZW9tX2JhcihmaWxsID0gJ3JlZCcpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiR2nDoSBUcuG7iyIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIGPDoWMgcGjDom4ga2jDumMgZ2nDoSBj4bunYSBraW0gY8awxqFuZyAocuG6pXQgdGjhuqVwLCB0aOG6pXAsIHRydW5nIGLDrG5oLCBjYW8sIHLhuqV0IGNhbykuDQoNCi1UcuG7pWMgWSAoIlPhu5EgTMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdHJvbmcgbeG7l2kgcGjDom4ga2jDumMgZ2nDoS4NCg0KQmnhu4N1IMSR4buTIG7DoHkgdGjhu4MgaGnhu4duIHBow6JuIHBo4buRaSBj4bunYSBraW0gY8awxqFuZyBk4buxYSB0csOqbiBwaMOibiBraMO6YyBnacOhLg0KTeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdMawxqFuZyDhu6luZyB24bubaSBt4buXaSBwaMOibiBraMO6YyBnacOhLg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0cuG7sWMgcXVhbiBow7NhIGPDoWNoIGtpbSBjxrDGoW5nIHBow6JuIHBo4buRaSB0cm9uZyBjw6FjIHBow6JuIGtow7pjIGdpw6Ega2jDoWMgbmhhdSwgZ2nDunAgbmjDrG4gbmjhuq1uIG3hu6ljIMSR4buZIHBo4buVIGJp4bq/biBj4bunYSBraW0gY8awxqFuZyB0cm9uZyBt4buXaSBraG/huqNuZyBnacOhLg0KDQojIyMgKioxLjIwIMSQ4buSIFRI4buKIDIwIC0gQmnhu4N1IMSQ4buTIEPhu5l0IHbhu5tpIFBow6JuIFBo4buRaSBUcuG7jW5nIEzGsOG7o25nIENhcmF0IGPhu6dhIEtpbSBDxrDGoW5nKioNCg0KYGBge3J9DQp0cDIgPC1odHAgJT4lIG11dGF0ZShDYXJhdCA9IGN1dChjYXJhdCw1LCBsYWJlbCA9IGMoJ3LhuqV0IG5o4buPJywgJ25o4buPJywnduG7q2EnLCds4bubbicsJ3LhuqV0IGzhu5tuJykpKQ0KdHAyICU+JSBnZ3Bsb3QoYWVzKHggPSBDYXJhdCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICdyZWQnKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCi1UcuG7pWMgWCAoIkNhcmF0Iik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBwaMOibiBraMO6YyB0cuG7jW5nIGzGsOG7o25nIGNhcmF0IGPhu6dhIGtpbSBjxrDGoW5nIChy4bqldCBuaOG7jywgbmjhu48sIHbhu6thLCBs4bubbiwgcuG6pXQgbOG7m24pLg0KDQotVHLhu6VjIFkgKCJT4buRIEzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRyb25nIG3hu5dpIHBow6JuIGtow7pjIHRy4buNbmcgbMaw4bujbmcgY2FyYXQuDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBwaMOibiBwaOG7kWkgY+G7p2Ega2ltIGPGsMahbmcgZOG7sWEgdHLDqm4gdHLhu41uZyBsxrDhu6NuZyBjYXJhdC4NCk3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgcGjDom4ga2jDumMgdHLhu41uZyBsxrDhu6NuZyBjYXJhdC4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgdHLhu7FjIHF1YW4gaMOzYSBjw6FjaCBraW0gY8awxqFuZyBwaMOibiBwaOG7kWkgdHJvbmcgY8OhYyBwaMOibiBraMO6YyB0cuG7jW5nIGzGsOG7o25nIGNhcmF0IGtow6FjIG5oYXUsIGdpw7pwIG5ow6xuIG5o4bqtbiBt4bupYyDEkeG7mSBwaOG7lSBiaeG6v24gY+G7p2Ega2ltIGPGsMahbmcgZOG7sWEgdHLDqm4ga8OtY2ggdGjGsOG7m2MuDQoNCiMjIyAqKjEuMjEgxJDhu5IgVEjhu4ogMjEgLSBCaeG7g3UgxJHhu5MgU+G7kSBsxrDhu6NuZyBLaW0gY8awxqFuZyB0aGVvIExv4bqhaSBD4bqvdCAqKg0KDQpgYGB7cn0NCmh0cCA8LSBkaWFtb25kcw0KaHRwICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQpKSArDQogICAgZ2VvbV9iYXIoZmlsbD0nbmF2eScpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQrEkOG7kyB0aOG7iyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyBt4buXaSBsb+G6oWkgY+G6r3QuDQoNCi1UcuG7pWMgWCAoIkxv4bqhaSIpOiBUcuG7pWMgbsOgeSB0aOG7gyBoaeG7h24gY8OhYyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdSBj4bunYSBraW0gY8awxqFuZy4gQ8OhYyBsb+G6oWkgY+G6r3QgY8OzIHRo4buDIGzDoCAiRmFpciIsICJHb29kIiwgIlZlcnkgR29vZCIsICJQcmVtaXVtIiwgdsOgICJJZGVhbCIuDQoNCi1UcuG7pWMgWSAoIlPhu5EgbMaw4bujbmciKTogVHLhu6VjIG7DoHkgYmnhu4N1IGRp4buFbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgdOG7q25nIGxv4bqhaSBj4bqvdCB0csOqbiB0cuG7pWMgWC4NCg0KQ8OhYyB0aGFuaCBj4buZdCB0csOqbiBiaeG7g3UgxJHhu5MgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGh14buZYyBt4buXaSBsb+G6oWkgY+G6r3QuIE7hur91IHRoYW5oIGPhu5l0IGPhu6dhIG3hu5l0IGxv4bqhaSBj4bqvdCBjw6BuZyBjYW8sIMSRaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBjw7Mgbmhp4buBdSBraW0gY8awxqFuZyB0aHXhu5ljIGxv4bqhaSBj4bqvdCDEkcOzIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuDQoNCiMjIyAqKjEuMjIgxJDhu5IgVEjhu4ogMjIgLSBCaeG7g3UgxJHhu5MgQ+G7mXQgTmdhbmcgduG7m2kgc+G7kSBsxrDhu6NuZyBLaW0gY8awxqFuZyB0aGVvIExv4bqhaSBD4bqvdCoqDQoNCmBgYHtyfQ0KaHRwIDwtIGRpYW1vbmRzDQpodHAgJT4lIGdncGxvdChhZXMoeCA9IGN1dCkpICsNCiAgICBnZW9tX2JhcihmaWxsPSdnb2xkJykgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArDQogICAgY29vcmRfZmxpcCgpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiU+G7kSBsxrDhu6NuZyIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcuDQogDQotVHLhu6VjIFkgKCJMb+G6oWkiKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIGPDoWMgbG/huqFpIGPhuq90IGtow6FjIG5oYXUgY+G7p2Ega2ltIGPGsMahbmcuDQoNCkJp4buDdSDEkeG7kyBuw6B5IMSRw6Mgc+G7rSBk4bulbmcgY29vcmRfZmxpcCgpIMSR4buDIMSR4bqjbyBuZ8aw4bujYyB0cuG7pWMgWCB2w6AgWSwgYmnhur9uIG7DsyB04burIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0cnV54buBbiB0aOG7kW5nIHRow6BuaCBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgbmdhbmcuIEPDoWMgdGhhbmggY+G7mXQgbmdhbmcgdHLDqm4gYmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyBt4buXaSBsb+G6oWkgY+G6r3QuIE7hur91IHRoYW5oIGPhu5l0IGPhu6dhIG3hu5l0IGxv4bqhaSBj4bqvdCBjw6BuZyBkw6BpLCDEkWnhu4F1IG7DoHkgY2jhu4kgcmEgcuG6sW5nIGPDsyBuaGnhu4F1IGtpbSBjxrDGoW5nIHRodeG7mWMgbG/huqFpIGPhuq90IMSRw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4NCg0KIyMjICoqMS4yMyDEkOG7kiBUSOG7iiAyMyAtIEJp4buDdSDEkeG7kyBD4buZdCB24bubaSBT4buRIGzGsOG7o25nIEtpbSBjxrDGoW5nIHRoZW8gTG/huqFpIEPhuq90ICoqDQoNCmBgYHtyfQ0KaHRwICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nbmF2eScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdnb2xkJykgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCi1UcuG7pWMgWCAoIkxv4bqhaSIpOiBUcuG7pWMgbsOgeSBiaeG7g3UgZGnhu4VuIGPDoWMgbG/huqFpIGPhuq90IGtow6FjIG5oYXUgY+G7p2Ega2ltIGPGsMahbmcuDQoNCi1UcuG7pWMgWSAoIlPhu5EgbMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIGxv4bqhaSBj4bqvdC4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgaGnhu4N1IHLDtSBoxqFuIHbhu4EgcGjDom4gcGjhu5FpIGPhu6dhIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdHJvbmcgdOG7q25nIGxv4bqhaSBj4bqvdCB2w6AgY3VuZyBj4bqlcCB0aMO0bmcgdGluIGNoaSB0aeG6v3QgduG7gSBnacOhIHRy4buLIGPhu6UgdGjhu4MgY+G7p2EgbeG7l2kgY+G7mXQuDQoNCiMjIyAqKjEuMjQgxJDhu5IgVEjhu4ogMjQgLSBCaeG7g3UgxJHhu5MgQ+G7mXQgduG7m2kgVOG7iSBs4buHIHBo4bqnbiB0csSDbSBLaW0gY8awxqFuZyB0aGVvIExv4bqhaSBD4bqvdCAqKg0KDQpgYGB7cn0NCmh0cCAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKGN1dCxuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J2dvbGQnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQobi9sZW5ndGgoaHRwJGNhcmF0KSkpLHZqdXN0ID0gMiwgY29sb3IgPSAnbmF2eScpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJMb+G6oWkiKTogVHLhu6VjIG7DoHkgYmnhu4N1IGRp4buFbiBjw6FjIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nLg0KDQotVHLhu6VjIFkgKCJT4buRIGzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyBt4buXaSBsb+G6oWkgY+G6r3QuDQoNCsSQ4buTIHRo4buLIG7DoHkgZ2nDunAgdGjhuqV5IHLDtSB04buJIGzhu4cgcGjhuqduIHRyxINtIGPhu6dhIG3hu5dpIGxv4bqhaSBj4bqvdCBzbyB24bubaSB04buVbmcgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0cm9uZyBk4buvIGxp4buHdS4gVMOtbmggdGhlbyB04buJIGzhu4cgcGjhuqduIHRyxINtLCBi4bqhbiBjw7MgdGjhu4MgdGjhuqV5IMSRxrDhu6NjIHPhu7EgcGjDom4gcGjhu5FpIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIGPhuq90IG3hu5l0IGPDoWNoIHRy4buxYyBxdWFuLg0KDQojIyMgKioxLjI1IMSQ4buSIFRI4buKIDI1IC0gQmnhu4N1IMSR4buTIEPhu5l0IEThuqFuZyDEkOG7kWkgeOG7qW5nIHRoZW8gTcOgdSBT4bqvYyB2w6AgTG/huqFpIEPhuq90IGPhu6dhIEtpbSBDxrDGoW5nKioNCg0KYGBge3J9DQpodHAgJT4lIGdyb3VwX2J5KGN1dCxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbikpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScsIGZpbGw9J25hdnknKSArDQogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJMb+G6oWkiKTogVHLhu6VjIG7DoHkgYmnhu4N1IGRp4buFbiBjw6FjIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nLg0KDQotVHLhu6VjIFkgKCJT4buRIGzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyBt4buXaSBsb+G6oWkgY+G6r3QuDQoNCkPDoWMgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIMSRxrDhu6NjIG5ow7NtIGThu7FhIHRyw6puIGxv4bqhaSBj4bqvdCB2w6AgdMO0IG3DoHUgdGhlbyBtw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nLiBIw6BtIGZhY2V0X3dyYXAofmNvbG9yKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBjw6FjIHBow6JuIGtow7pjIHJpw6puZyBiaeG7h3QgY2hvIHThu6tuZyBtw6B1IHPhuq9jIHRyw6puIGJp4buDdSDEkeG7ky4NCg0KxJDhu5MgdGjhu4sgbsOgeSBnacO6cCBoaeG7g3UgcsO1IGjGoW4gduG7gSBz4buxIHBow6JuIGLhu5EgY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBj4bqjIGxv4bqhaSBj4bqvdCB2w6AgbcOgdSBz4bqvYy4gQ8OhYyBwaMOibiBraMO6YyByacOqbmcgYmnhu4d0IGNobyBt4buXaSBtw6B1IHPhuq9jIGdpw7pwIHNvIHPDoW5oIGhp4buHdSBxdeG6oyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIGPhuq90IHRyb25nIHThu6tuZyBuaMOzbSBtw6B1IHPhuq9jIGtow6FjIG5oYXUuDQoNCiMjIyAqKjEuMjYgxJDhu5IgVEjhu4ogMjYgLSBCaeG7g3UgxJHhu5MgQ+G7mXQgROG6oW5nIMSQ4buRaSB44bupbmcgduG7m2kgU+G7kSBsxrDhu6NuZyBLaW0gQ8awxqFuZyB0aGVvIExv4bqhaSBD4bqvdCB2w6AgTcOgdSBT4bqvYyoqDQoNCmBgYHtyfQ0KaHRwICU+JSBncm91cF9ieShjdXQsY29sb3IpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IG4pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnLCBmaWxsPSdnb2xkJykgKw0KICAgIGZhY2V0X3dyYXAofmNvbG9yKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnbmF2eScpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJMb+G6oWkiKTogVHLhu6VjIG7DoHkgYmnhu4N1IGRp4buFbiBjw6FjIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nLg0KDQotVHLhu6VjIFkgKCJT4buRIGzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyBt4buXaSBsb+G6oWkgY+G6r3QuDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHNvIHPDoW5oIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdHJvbmcgdOG7q25nIGxv4bqhaSBj4bqvdCwgxJHGsOG7o2MgcGjDom4gbG/huqFpIHRoZW8gbcOgdSBz4bqvYywgdsOgIGN1bmcgY+G6pXAgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIHBow6JuIHBo4buRaSBj4bunYSBjaMO6bmcgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4NCg0KIyMjICoqMS4yNyDEkOG7kiBUSOG7iiAyNyAtIEJp4buDdSDEkeG7kyBD4buZdCB24bubaSBUcnVuZyBiw6xuaCBUcuG7jW5nIEzGsOG7o25nIENhcmF0IGPhu6dhIEtpbSBDxrDGoW5nIHRoZW8gTG/huqFpIEPhuq90KioNCg0KYGBge3J9DQpodHAgPC0gZGlhbW9uZHMNCmh0cCAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKG09IG1lYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY3V0LHkgPSBtKSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJywgZmlsbD0nbmF2eScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnZ29sZCcpICsNCiAgICBsYWJzKHggPSAnTcOgdScsIHkgPSAnTWVhbicpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTG/huqFpIik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdSBj4bunYSBraW0gY8awxqFuZy4NCg0KLVRy4bulYyBZICgiVHJ1bmcgYsOsbmggVHLhu41uZyBMxrDhu6NuZyBDYXJhdCIpOiBUcuG7pWMgbsOgeSB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGNhcmF0IGNobyBt4buXaSBsb+G6oWkgY+G6r3QuDQoNCkPDoWMgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgY2hvIHThu6tuZyBsb+G6oWkgY+G6r3QuIENow7ogdGjDrWNoIGdpw6EgdHLhu4sgdHLDqm4gxJHhu4luaCBt4buXaSBj4buZdCBnacO6cCBoaeG7g24gdGjhu4sgc+G7kSBsaeG7h3UgY2jDrW5oIHjDoWMgdsOgIGNoaSB0aeG6v3QgaMahbiB24buBIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgdOG7q25nIGxv4bqhaSBj4bqvdC4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgc28gc8OhbmggZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGNhcmF0IHRyb25nIHThu6tuZyBsb+G6oWkgY+G6r3QgdsOgIGN1bmcgY+G6pXAgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIHBow6JuIHBo4buRaSBj4bunYSBjaMO6bmcgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4NCg0KIyMjICoqMS4yOCDEkOG7kiBUSOG7iiAyOCAtIEJp4buDdSDEkeG7kyBD4buZdCBE4bqhbmcgxJDhu5FpIHjhu6luZyB24bubaSBHacOhIFRydW5nIGLDrG5oIGPhu6dhIEtpbSBDxrDGoW5nIHRoZW8gTG/huqFpIEPhuq90IHbDoCBNw6B1IFPhuq9jKioNCg0KYGBge3J9DQpodHAgPC0gZGlhbW9uZHMNCmh0cCAlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbSkpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScsIGZpbGw9J2dvbGQnKSArDQogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSkpKSArDQogICAgbGFicyh4ID0gJ2N1dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTG/huqFpIik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdSBj4bunYSBraW0gY8awxqFuZy4NCg0KLVRy4bulYyBZICgiR2nDoSBUcnVuZyBiw6xuaCIpOiBUcuG7pWMgbsOgeSB0aOG7gyBoaeG7h24gZ2nDoSB0cnVuZyBiw6xuaCBj4bunYSBraW0gY8awxqFuZyBjaG8gbeG7l2kgbG/huqFpIGPhuq90Lg0KDQpDw6FjIGPhu5l0IHRyw6puIGJp4buDdSDEkeG7kyBiaeG7g3UgdGjhu4sgZ2nDoSB0cnVuZyBiw6xuaCBj4bunYSBraW0gY8awxqFuZyBjaG8gdOG7q25nIGxv4bqhaSBj4bqvdCB2w6AgbcOgdSBz4bqvYy4gUGjDom4ga2jDumMgbcOgdSBz4bqvYyB2w6AgY2jDuiB0aMOtY2ggZ2nDoSB0cnVuZyBiw6xuaCB0csOqbiDEkeG7iW5oIG3hu5dpIGPhu5l0IGdpw7pwIGhp4buDbiB0aOG7iyBz4buxIHBow6JuIHBo4buRaSBj4bunYSBnacOhIHRoZW8gbG/huqFpIGPhuq90IHbDoCBtw6B1IHPhuq9jLg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBzbyBzw6FuaCBnacOhIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIHRyb25nIHThu6tuZyBsb+G6oWkgY+G6r3QsIMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aGVvIG3DoHUgc+G6r2MsIHbDoCBjdW5nIGPhuqVwIGPDoWkgbmjDrG4gdOG7lW5nIHF1YW4gduG7gSBz4buxIGJp4bq/biDEkeG7mW5nIGdpw6EgdGhlbyBjw6FjIHnhur91IHThu5EgbsOgeSB0cm9uZyBi4buZIGThu68gbGnhu4d1Lg0KDQojIyMgKioxLjI5IMSQ4buSIFRI4buKIDI5IC0gU28gc8OhbmggU+G7kSBsxrDhu6NuZyBLaW0gQ8awxqFuZyB0aGVvIExv4bqhaSBD4bqvdCB2w6AgTcOgdSBT4bqvYyAoRCB2w6AgSikqKg0KDQpgYGB7cn0NCmh0cCA8LSBkaWFtb25kcw0KaHRwIDwtIGh0cCAlPiUgZ3JvdXBfYnkoY3V0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KaHRwICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSkgKw0KICBnZW9tX2NvbChkYXRhID0gaHRwICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0QnKSwgZmlsbCA9ICdnb2xkJykgKw0KICBnZW9tX2NvbChkYXRhID0gaHRwICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICduYXZ5JykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQotVHLhu6VjIFggKCJMb+G6oWkiKTogVHLhu6VjIG7DoHkgYmnhu4N1IGRp4buFbiBjw6FjIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nLg0KDQotVHLhu6VjIFkgKCJT4buRIEzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyBt4buXaSBsb+G6oWkgY+G6r3QuDQoNCkPDoWMgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNobyBt4buXaSBsb+G6oWkgY+G6r3QsIG5oxrBuZyBjaOG7iSBnaeG7ryBs4bqhaSBjw6FjIGThu68gbGnhu4d1IGxpw6puIHF1YW4gxJHhur9uIG3DoHUgc+G6r2MgJ0QnICh2w6BuZykgdsOgICdKJyAobmF2eSkuIE3hu5dpIG3DoHUgc+G6r2MgY8OzIG3hu5l0IGPhu5l0IHTGsMahbmcg4bupbmcgdHLDqm4gYmnhu4N1IMSR4buTLCBnacO6cCBzbyBzw6FuaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPhu6dhIHThu6tuZyBsb+G6oWkgY+G6r3QgZ2nhu69hIGhhaSBtw6B1IHPhuq9jIGtow6FjIG5oYXUuDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHRo4bqleSByw7Ugc+G7sSBjaMOqbmggbOG7h2NoIHRyb25nIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgZ2nhu69hIGPDoWMgbG/huqFpIGPhuq90IGtoaSBzbyBzw6FuaCBnaeG7r2EgbcOgdSBz4bqvYyAnRCcgdsOgICdKJy4gTcOgdSB2w6BuZyBiaeG7g3UgdGjhu4sgbeG7mXQgbeG7qWMgxJHhu5kgdsOgIG3DoHUgeGFuaCBuYXZ5IGJp4buDdSB0aOG7iyBt4bupYyDEkeG7mSBraMOhYywgZ2nDunAgxJHDoW5oIGLhuqFpIHPhu7EgY2jDqm5oIGzhu4djaCBnaeG7r2EgY8OhYyBuaMOzbS4NCg0KIyMjICoqMS4zMCDEkOG7kiBUSOG7iiAzMCAtIEJp4buDdSDEkeG7kyBD4buZdCB24bubaSBT4buRIEzGsOG7o25nIEtpbSBDxrDGoW5nIHRoZW8gUGjDom4gbG/huqFpIFRy4buNbmcgTMaw4bujbmcgQ2FyYXQqKg0KDQpgYGB7cn0NCmh0cCA8LSBkaWFtb25kcyANCmh0cCA8LSBodHAgJT4lIG11dGF0ZShjYXJhdEMgPSBjdXQoY2FyYXQsNSwgbGFiZWwgPSBjKCdy4bqldCBuaOG7jycsICduaOG7jycsJ3bhu6thJywnbOG7m24nLCdy4bqldCBs4bubbicpKSkNCmh0cCAlPiUgZ2dwbG90KGFlcyh4ID0gY2FyYXRDKSkgKw0KICBnZW9tX2JhcihmaWxsID0gJ25hdnknKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCi1UcuG7pWMgWCAoIlBow6JuIGxv4bqhaSBUcuG7jW5nIEzGsOG7o25nIENhcmF0Iik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBwaMOibiBsb+G6oWkgY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBjYXJhdCwgxJHGsOG7o2MgeMOhYyDEkeG7i25oIGLhurFuZyBow6BtIGN1dCgpIHThu6sgdGjGsCB2aeG7h24gZHBseXIuDQoNCi1UcuG7pWMgWSAoIlPhu5EgTMaw4bujbmciKTogVHLhu6VjIG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGh14buZYyB04burbmcgcGjDom4gbG/huqFpLg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0aOG6pXkgcsO1IHPhu7EgcGjDom4gYuG7kSBj4bunYSBraW0gY8awxqFuZyB0aGVvIHRy4buNbmcgbMaw4bujbmcgY2FyYXQsIMSRxrDhu6NjIGNoaWEgdGjDoG5oIGPDoWMgbmjDs20gcuG6pXQgbmjhu48sIG5o4buPLCB24burYSwgbOG7m24gdsOgIHLhuqV0IGzhu5tuLg0KDQojIyMgKioxLjMxIMSQ4buSIFRI4buKIDMxIC0gQmnhu4N1IMSQ4buTIEPhu5l0IFNvIFPDoW5oIFPhu5EgTMaw4bujbmcgS2ltIEPGsMahbmcgVGhlbyBNw6B1IFPhuq9jIHbDoCBDbGFyaXR5KioNCg0KYGBge3J9DQpodHAyIDwtIGh0cCAlPiUgZ3JvdXBfYnkoY2xhcml0eSwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCmh0cDIgJT4lIGdncGxvdChhZXMoeCA9IGNvbG9yLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGh0cDIgJT4lIGZpbHRlcihjbGFyaXR5ID09ICdWUzInKSwgZmlsbCA9ICdnb2xkJykgKw0KICBnZW9tX2NvbChkYXRhID0gaHRwMiAlPiUgZmlsdGVyKGNsYXJpdHkgPT0gJ1ZTMScpLCBmaWxsID0gJ25hdnknKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCi1UcuG7pWMgWCAoIk3DoHUgU+G6r2MiKTogVHLhu6VjIG7DoHkgYmnhu4N1IGRp4buFbiBjw6FjIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MgY+G7p2Ega2ltIGPGsMahbmcgKEQsIEUsIEYsIEcsIEgsIEksIEopLg0KDQotVHLhu6VjIFkgKCJT4buRIEzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYy4NCg0KQmnhu4N1IMSR4buTIG7DoHkgc28gc8Ohbmggc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2MgdsOgIGNsYXJpdHkuDQpDw7MgaGFpIGPhu5l0IHTGsMahbmcg4bupbmcgduG7m2kgY2xhcml0eSAnVlMyJyB2w6AgJ1ZTMScsIG3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYy4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgdGjhuqV5IHLDtSBz4buxIHBow6JuIHBo4buRaSBj4bunYSBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2MgdsOgIGNsYXJpdHksIMSR4buTbmcgdGjhu51pIGzDoG0gbuG7lWkgYuG6rXQgc+G7sSBzbyBzw6FuaCBnaeG7r2EgY2xhcml0eSAnVlMyJyB2w6AgJ1ZTMScgY2hvIG3hu5dpIG3hu6ljIMSR4buZIG3DoHUgc+G6r2MuDQoNCiMjIyAqKjEuMzIgxJDhu5IgVEjhu4ogMzIgLSBCaeG7g3UgxJDhu5MgQ+G7mXQgU28gU8OhbmggU+G7kSBMxrDhu6NuZyBLaW0gQ8awxqFuZyBUaGVvIExv4bqhaSBD4bqvdCB2w6AgQ2xhcml0eSoqDQoNCmBgYHtyfQ0KaHRwMSA8LSBodHAgJT4lIGdyb3VwX2J5KGN1dCwgY2xhcml0eSkgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KaHRwMSAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGh0cDEgJT4lIGZpbHRlcihjbGFyaXR5ID09ICdWUzInKSwgZmlsbCA9ICdnb2xkJykgKw0KICBnZW9tX2NvbChkYXRhID0gaHRwMSAlPiUgZmlsdGVyKGNsYXJpdHkgPT0gJ0lGJyksIGZpbGwgPSAnbmF2eScpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTG/huqFpIEPhuq90Iik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBsb+G6oWkgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcgKEZhaXIsIEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSwgSWRlYWwpLg0KDQotVHLhu6VjIFkgKCJT4buRIEzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbG/huqFpIGPhuq90Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBzbyBzw6FuaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIGPhuq90IHbDoCBjbGFyaXR5Lg0KQ8OzIGhhaSBj4buZdCB0xrDGoW5nIOG7qW5nIHbhu5tpIGNsYXJpdHkgJ1ZTMicgdsOgICdJRicsIG3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbG/huqFpIGPhuq90Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0aOG6pXkgcsO1IHPhu7EgcGjDom4gcGjhu5FpIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIGPhuq90IHbDoCBjbGFyaXR5LCDEkeG7k25nIHRo4budaSBsw6BtIG7hu5VpIGLhuq10IHPhu7Egc28gc8OhbmggZ2nhu69hIGNsYXJpdHkgJ1ZTMicgdsOgICdJRicgY2hvIG3hu5dpIGxv4bqhaSBj4bqvdC4NCg0KIyMjICoqMS4zMyDEkOG7kiBUSOG7iiAzMyAtIEJp4buDdSDEkOG7kyBD4buZdCBTbyBTw6FuaCBT4buRIEzGsOG7o25nIEtpbSBDxrDGoW5nIFRoZW8gTG/huqFpIEPhuq90IHbDoCBNw6B1IFPhuq9jKioNCg0KYGBge3J9DQpodHAzIDwtIGh0cCAlPiUgZ3JvdXBfYnkoY3V0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KaHRwMyAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsgDQogIGdlb21fY29sKGRhdGEgPSBodHAzICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0QnKSwgZmlsbCA9ICdnb2xkJykgKw0KICBnZW9tX2NvbChkYXRhID0gaHRwMyAlPiUgZmlsdGVyKGNvbG9yID09ICdKJyksIGZpbGwgPSAnbmF2eScpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KLVRy4bulYyBYICgiTG/huqFpIEPhuq90Iik6IFRy4bulYyBuw6B5IGJp4buDdSBkaeG7hW4gY8OhYyBsb+G6oWkgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcgKEZhaXIsIEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSwgSWRlYWwpLg0KDQotVHLhu6VjIFkgKCJT4buRIEzGsOG7o25nIik6IFRy4bulYyBuw6B5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbG/huqFpIGPhuq90Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBzbyBzw6FuaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIGPhuq90IHbDoCBtw6B1IHPhuq9jLg0KQ8OzIGhhaSBj4buZdCB0xrDGoW5nIOG7qW5nIHbhu5tpIG3DoHUgc+G6r2MgJ0QnIHbDoCAnSicsIG3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbG/huqFpIGPhuq90Lg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0aOG6pXkgcsO1IHPhu7EgcGjDom4gcGjhu5FpIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIGPhuq90IHbDoCBtw6B1IHPhuq9jLCDEkeG7k25nIHRo4budaSBsw6BtIG7hu5VpIGLhuq10IHPhu7Egc28gc8OhbmggZ2nhu69hIG3DoHUgc+G6r2MgJ0QnIHbDoCAnSicgY2hvIG3hu5dpIGxv4bqhaSBj4bqvdC4NCg0K