File Pdf

https://drive.google.com/file/d/1LU3Z7TgUWQYyDcP3BC7nfjZcBdPVzFuY/view?usp=sharing

File dữ liệu excel

https://docs.google.com/spreadsheets/d/1f_ZV6ymniLs4GNraO2HCuUA_B9W-ufss/edit?usp=sharing&ouid=111976047388761728103&rtpof=true&sd=true

1 PHẦN MỞ ĐẦU

1.1 Lý do chọn đề tài

Sữa là một trong những thực phẩm quan trọng và phổ biến trong chế độ dinh dưỡng của con người, đặc biệt là trẻ em. Sữa cung cấp nhiều chất dinh dưỡng cần thiết cho sự phát triển và bảo vệ sức khỏe của cơ thể. Tuy nhiên, chất lượng sữa có thể bị ảnh hưởng bởi nhiều yếu tố khác nhau, từ quá trình sản xuất, chế biến, bảo quản đến tiêu thụ. Việc đánh giá và kiểm soát chất lượng sữa là rất cần thiết để đảm bảo an toàn và hiệu quả cho người tiêu dùng.

Có nhiều yếu tố có thể ảnh hưởng đến chất lượng sữa, từ giai đoạn nuôi bò sữa, thu hoạch, vận chuyển, chế biến, bảo quản đến tiêu thụ. Nếu không được kiểm soát và quản lý tốt, các yếu tố này có thể làm giảm chất lượng sữa hoặc gây ra các nguy cơ an toàn thực phẩm cho người tiêu dùng. Ví dụ, nếu bò sữa bị nhiễm khuẩn hoặc sử dụng thuốc kháng sinh quá liều, sữa có thể chứa các vi sinh vật gây bệnh hoặc các dư lượng thuốc kháng sinh. Nếu sữa không được vận chuyển và bảo quản ở nhiệt độ thích hợp, sữa có thể bị ôi thiu hoặc chua. Nếu sữa không được chế biến theo quy trình tiêu chuẩn, sữa có thể bị pha trộn hoặc giảm hàm lượng dinh dưỡng.

Với mong muốn góp phần nâng cao chất lượng cuộc sống của người. Tôi đã nghĩ đến đè tài nghiên cứu Phân tích các yếu tố ảnh hưởng đến chất lượng sữa để góp phần tạo nên nguồn năng lượng từ sữa cho con người và phần nào giải quyết các vấn đề thực tiễn trong ngành công nghiệp sữa. Tôi hy vọng rằng qua đề tài này, tôi có thể đóng góp vào việc nâng cao nhận thức và kiến thức của người tiêu dùng về chất lượng sữa. Tôi cũng mong muốn rằng đề tài này sẽ là một nguồn thông tin hữu ích cho các nhà sản xuất, chế biến và quản lý sữa trong việc cải thiện và duy trì chất lượng sữa.

1.2 Mục tiêu nghiên cứu

Đánh giá các yếu tố có thể ảnh hưởng đến chất lượng sữa. Từ đó, giúp người nông dân chăn nuôi đơn lẻ hoặc các trang trại bò sữa có thể hiểu thêm về các yếu tố làm ảnh hưởng đến chất lượng nguồn sữa. Giúp họ có thể nhận ra các điểm yếu làm ảnh hưởng đến chất lượng sữa cũng như việc làm như thế nào để tạo ra nguồn sữa nhiều và chất lượng cung cấp ra thị trường.

1.3 Đối tượng và phạm vi nghiên cứu

  • Đối tượng:

    • Chất lượng sữa.
  • Phạm vi nghiên cứu:

    • Để thực hiện đề tài này, tôi đã thu thập được một bộ dữ liệu từ https://www.kaggle.com.
    • Bộ dữ liệu gồm có 1059 mẫu quan sát, có 7 biến là các yếu tố ảnh hưởng đến chất lượng sữa, bao gồm: pH, Temprature, Odor, Fat, Turbidity, Colour và Taste. Biến Grade chất lượng của sữa chính là biến phụ thuộc mà chúng ta cần phân tích .

1.4 Phương pháp nghiên cứu

Phương pháp phân tích dữ liệu định tính.

Tôi đã sử dụng các phương pháp thống kê toán học để mô tả và suy luận để khám phá và phân tích các mối quan hệ giữa các biến này. Tôi cũng đã xây dựng các mô hình hồi quy và phân loại để dự báo và phân loại chất lượng sữa dựa trên các biến đầu vào.

Phần mềm R & RStudio là một công cụ mới nhưng khá được ưa dùng trong thống kê và xử lý dữ liệu - sẽ vì các tính năng hỗ trợ phân tích cũng như vẽ biểu đồ nhanh chóng. Trong bài phân tích này R & RStudio sẽ hỗ trợ chính cho việc nghiên cứu, đánh giá.

1.5 Kết cấu đề tài

  • Bài nghiên cứu gồm có 4 chương:

    • Chương 1. Tổng quan lý thuyết.
    • Chương 2. Phương pháp nghiên cứu
    • Chương 3. Kết quả mô hình nghiên cứu.
    • Chương 4. Kết luận và hạn chế.

2 CHƯƠNG 1. TỔNG QUAN LÝ THUYẾT

2.1 Ngành công nghiệp sữa trong nước

Ngành công nghiệp sữa Việt Nam là một trong những ngành có vai trò quan trọng trong nền kinh tế và đời sống của người dân. Ngành này không chỉ cung cấp các sản phẩm dinh dưỡng, chăm sóc sức khỏe cho hàng triệu người tiêu dùng, mà còn góp phần phát triển nông nghiệp, tạo việc làm, tăng thu nhập cho các hộ chăn nuôi bò sữa, và đóng góp vào ngân sách nhà nước. Ngành sữa Việt Nam cũng đã có những bước tiến vượt bậc trong việc nâng cao chất lượng sản phẩm, đa dạng hóa mẫu mã và chủng loại, áp dụng công nghệ hiện đại, và mở rộng thị trường xuất khẩu.

Ngành sữa Việt Nam bắt đầu phát triển từ những năm 1920, khi các trang trại bò sữa nhỏ lẻ được thành lập để cung cấp sữa tươi cho thị trường địa phương. Sau đó, vào những năm 1970, các doanh nghiệp sản xuất sữa được hình thành và phát triển, trong đó có Công ty Cổ phần Sữa Việt Nam (Vinamilk) là doanh nghiệp tiên phong và lớn nhất trong ngành. Đến nay, ngành sữa Việt Nam đã có hơn 200 doanh nghiệp hoạt động với quy mô lớn nhỏ khác nhau, trong đó có các doanh nghiệp trong nước như Vinamilk, TH True Milk, Nutifood, Mộc Châu Milk, và các doanh nghiệp nước ngoài như FrieslandCampina (Dutch Lady), Nestlé, Abbott, Mead Johnson.

Theo Euromonitor, thị trường sữa Việt Nam đạt giá trị 135.000 tỷ đồng vào năm 2020, tăng hơn 8% so với năm 2019. Các sản phẩm chủ lực của ngành bao gồm sữa bột, sữa thanh trùng, sữa chua, pho mát, bơ và các sản phẩm từ sữa khác. Trong đó, sữa thanh trùng là phân khúc có giá trị lớn nhất và tăng trưởng cao nhất trong ngành.

2.2 Thuận lợi và khó khăn

2.2.1 Thuận lợi

Sự tăng trưởng của thị trường được thúc đẩy bởi các yếu tố sau:

  • Nhu cầu tiêu dùng sữa ngày càng tăng do dân số tăng, thu nhập người dân tăng và nhận thức về chăm sóc sức khỏe của người tiêu dùng cải thiện.

  • Chính sách hỗ trợ của nhà nước cho ngành sữa thông qua các chương trình như “Sữa học đường”, “Sản xuất bò sữa”, “Hỗ trợ giá sữa cho trẻ em” và các ưu đãi thuế cho các doanh nghiệp sản xuất sữa.

  • Sự đầu tư của các doanh nghiệp trong và ngoài nước vào ngành sữa thông qua việc xây dựng các nhà máy sản xuất hiện đại, mở rộng chuỗi cung ứng bò sữa, phát triển các sản phẩm mới theo xu hướng tiêu dùng, và tham gia các hiệp định thương mại tự do để mở rộng thị trường xuất khẩu.

2.2.2 Khó khăn

Tuy nhiên, ngành sữa Việt Nam cũng đang đối mặt với một số thách thức và cơ hội trong tương lai, như:

  • Sự cạnh tranh khốc liệt từ các doanh nghiệp nước ngoài có uy tín và chất lượng cao, đặc biệt là trong phân khúc sữa bột cho trẻ em.

  • Sự thiếu hụt nguồn cung sữa tươi trong nước do năng suất bò sữa thấp, chi phí chăn nuôi cao và thiếu hụt đất canh tác. Hiện nay, ngành sữa Việt Nam phải nhập khẩu khoảng 70% nguyên liệu sữa từ các nước như New Zealand, Mỹ, Australia và châu Âu.

  • Sự thay đổi của thị hiếu và nhu cầu của người tiêu dùng, đòi hỏi các doanh nghiệp phải liên tục cải tiến và đổi mới sản phẩm để phù hợp với xu hướng tiêu dùng. Một số xu hướng tiêu dùng hiện nay bao gồm các sản phẩm sữa hữu cơ, sữa không lactose, sữa chức năng và sữa thực vật.

Ngành công nghiệp sữa Việt Nam là một ngành có tiềm năng lớn để phát triển trong bối cảnh kinh tế toàn cầu hội nhập và hợp tác. Để duy trì và nâng cao vị thế của mình trên thị trường trong và ngoài nước, các doanh nghiệp ngành sữa cần phải tận dụng các cơ hội, vượt qua các thách thức, và không ngừng nâng cao năng lực sản xuất, chất lượng sản phẩm và hiệu quả kinh doanh.

3 CHƯƠNG 2. PHƯƠNG PHÁP NGHIÊN CỨU

3.1 Các package sử dụng trong bài

library(ggplot2)
library(readxl)
library(epitools)
library(caret)
## Loading required package: lattice
library(DescTools)
## 
## Attaching package: 'DescTools'
## The following objects are masked from 'package:caret':
## 
##     MAE, RMSE

3.2 Dữ liệu nghiên cứu

3.2.1 Mô tả bộ dữ liệu

Bộ dữ liệu này được sử dụng để phân tích và khám phá các mối quan hệ giữa các yếu tố ảnh hưởng đến chất lượng sữa, cũng như để xây dựng các mô hình dự báo và phân loại chất lượng sữa. Bộ dữ liệu này cũng có thể giúp cho các nhà sản xuất, chế biến và tiêu thụ sữa nâng cao hiểu biết và kiểm soát chất lượng sữa một cách tốt hơn.

Bộ dữ liệu này gồm có 1059 mẫu quan sát, có 7 biến là: pH, Temprature, Taste, Odor, Fat, Turbidity, Colour và 1 biến Grade là biến định tính phụ thuộc vào các biến này.

3.2.2 Mô tả các biến

  • Biến định tính
    • Taste: Đây là biến định tính có nghĩa là hương vị của sữa. Sữa có hương vị khi nếm vào không ngon sẽ được đánh số (0), sữa có hương vị khi nếm vào ngon sẽ được đánh số (1).
    • Odor: Đây là biến định tính có nghĩa là mùi của sữa. Sữa có mùi khi ngửi không thơm sẽ được đánh số (0), sữa có mùi khi ngửi thơm sẽ được đánh số (1).
    • Fat: Đây là biến định tính có nghĩa là độ béo của sữa. Sữa có độ béo thấp sẽ được đánh số (0), sữa có độ béo cao sẽ được đánh số (1).
    • Turbidity: Đây là biến định tính có nghĩa là độ đục của sữa. Sữa có độ đục thấp sẽ được đánh số (0), sữa có độ đục cao sẽ được đánh số (1).
    • Grade: Đây là biến định tính có nghĩa là chất lượng của sữa. Sữa có chất lượng thấp sẽ đánh số (0), sữa có chất lượng cao sẽ đánh số (1).
  • Biến định lượng:
    • pH: Đây là biến định lượng có nghĩa là độ pH của sữa. Độ pH của sữa dao động từ 3 đến 9,5, độ pH phù hợp nhất nằm ở khoảng 6,25 đến 6,90.
    • Temprature: Đây là biến định lượng có nghĩa là nhiệt độ của sữa. Nhiệt độ của sữa dao động từ 34 đến 90, nhiệt độ phù hợp nhất nằm ở khoảng 34 đến 45,20.
    • Colour: Đây là biến định lượng có nghĩa là màu của sữa. Màu của sữa dao động từ 240 đến 255, phân màu phù hợp nhất nằm ở khoảng 245 đến 255.

3.2.3 Dữ liệu

milknew <- read_excel("C:/Users/ASUS/Downloads/milknew.xlsx")
View(milknew)
library(DT)
milknew %>% DT::datatable(milknew)

3.3 Xác định biến phụ thuộc

3.3.1 Biến định tính

Biến định tính Grade sẽ được chọn là biến định tính phụ thuộc bởi vì:

  • Mục đích của bài là phân tích các yếu tố ảnh hưởng đến chất lượng sữa. Chính vì lẽ đó nên ta sẽ quan sát xem các biến pH, Temprature, Taste, Odor, Fat, Turbidity và Colour sẽ ảnh hưởng đến biến Grade thế nào.
  • Xét trên phương diện thực tế, chất lượng sữa cũng sẽ được đánh giá dựa trên các tiêu chí nồng độ, hương vị, độ béo, màu sắc,…

3.3.2 Biến định lượng

Biến định lượng Colour sẽ được chọn làm biến phụ thuộc bởi vì:

  • Màu sữa phần nào sẽ thể hiện được chất lượng của sữa và nó có thể bị ảnh hưởng bởi các yếu tố được nêu trong bộ dữ liệu.

3.4 Mô hình nghiên cứu

3.4.1 Mô hình tuyến tính

GLM (General Linear Model) là một mô hình tuyến tính tổng quát giải thích mối quan hệ giữa một hàm kỳ vọng có điều kiện với các biến giải thích thông qua một phương trình dự đoán có dạng tuyến tính.

GLM phổ biến vì nó có thể xử lý nhiều loại dữ liệu với các kiểu biến phản ứng khác nhua như nhị thức, Poisson hay đa thức.

Để mô hình hóa ảnh hưởng của X là sử dụng dạng hồi quy tuyến tính cổ điển, theo đó giá trị kỳ vọng có điều kiện của Y là một hàm tuyến tính của X.

\(\pi(x) = \beta_0 + \beta_1.x\)

Đây là GLM với thành phần ngẫu nhiên nhị thức và hàm liên kết đồng nhất. Mô hình này được gọi là mô hình xác suất tuyến tính hay LPM (Linear Probability Model). \(\beta_1\) biểu thị cho sự thay đổi xác suất cho mỗi đơn vị thay đổi của x.

3.4.2 Mô hình hồi quy Logistic

Để khắc phục một số hạn chế của LPM, người ta đề xuất một hàm liên kết mà nó đồng biến với xác suất \(\pi\) và giá trị biến thiên của nó là tùy ý đó là \(log(\frac{\pi(x)}{1 - \pi(x)})\), được gọi là hàm logistic hay logit(\(\pi\)).

Mô hình hồi quy logit:

\(log(\frac{\pi(x)}{1 - \pi(x)}) = \beta_0 + \beta_1.x_1 + \beta_2.x_2 + ... +\beta_m.x_m\)

Trong đó \(\beta_0, \beta_1,..., \beta_m\) là hệ số hồi quy.

3.4.3 Mô hình Probit

Mô hình Probit được sử dung để ước lượng mô hình có biến phụ thuộc dạng nhị phân. Mô hình Probit là một GLM với thành phần ngẫu nhiên nhị phân và liên kết Probit. Hàm hôi quy Probit có dạng:

\(\pi(x) = \phi(\alpha + \beta x)\)

Trong đó, \(\phi(x) = \frac{1}{\sqrt{2\pi}}\int_{-\infty}^{x}e^{-\frac{1}{2}t^2}dt\) là hàm phân phối chuẩn chính tắc. Với \(Probit(\pi(x)) = \phi^{-1}(\pi(x))\), ta có mô hình Probit:

\(Probit(\pi(x)) = \alpha + \beta x\)

3.4.4 Mô hình Cloglog

Trong trường hợp tỷ lệ cược phụ thuộc vào các biến giải thích dưới dạng hàm lũy thừa:

\(Odds(x)=\ \frac{\pi(x)}{1-\pi(x)}=\lambda.x_1^{\beta_1}.x_2^{\beta_2}....x_m^{\beta_m}\)

Ta nhận được mô hình logistic có các biến dự báo ở dạng log, gọi là mô hình logistic dạng log-log.

\(\log{\left(\frac{\pi(x)}{1-\pi(x)}\right)=\beta_0+\beta_1.logx_1+\beta_2.logx_2+...+\beta_m.logx_m}\)

3.4.5 Phân phối nhị thức

Phân phối nhị thức là một phân phối xác suất rời rạc với số lần xảy ra của một sự kiện thành công trong một số lần thử cố định, các tham số là n và p (n là số tự nhiên > 0, 0 < p < 1).

Nếu gọi Y là số lần thành công trong n lần lặp lại phép thử, thì theo công thức Becnoulli, xác suất để có k lần thành công là:

\(p_k = P(Y = k) = C\binom{n}{k}.p^k.(1 - p)^(n - k), k = 1,2,...,n\)

Như vậy mô hình lặp lại \(n\) lần một phép thử đã cho ra một biến ngẫu nhiên có phân phối Nhị thức \(B(n,p)\), đó là Y: Số lần thành công trong n lần thử.

Đối với biến \(Y ~ B(n,p)\), thì giá trị trung bình của nó là \(EY = n.p\) và phương sai là \(VarY = n.p.(1 - p)\).

Nếu \(Y_1, Y_2,..., Y_m\) là các biến ngẫu nhiên độc lập có cùng phân phối nhị thức \(B(n,p)\) thì \(Y = Y_1 + Y_2 + ... + Y_m\) là biến ngẫu nhiên có phân phối nhị thức \(B(mn,p)\).

3.4.6 Bảng tần số - Bảng tần suất

Bảng tần số - Bảng tần suất còn được gọi là bảng ngẫu nhiên. Khi lập bảng ngẫu nhiên cho 2 biến thì bảng đó được gọi là bảng ngẫu nhiên 2 chiều, nếu lập cho 3 biến thì gọi là bảng ngẫu nhiên 3 chiều và cứ thế tăng lên.

Đối với bảng tần số chúng ta quy ước biến phụ thuộc (dependent/outcome/response variable) được xắp xếp theo cột, biến độc lập (independent/explanatory/predictor variable) được xắp xếp theo hàng.

3.4.7 Phân phối Poisson

Phân phối Poisson với tham số \(\lambda (\lambda > 0\) có hàm phân phối xác suất như sau:

\(p_k = P(Y = k) = \frac{\lambda^k.e^{-\lambda}}{k!}, k = 0,1,2,...\)

Khi đó ta viết: \(Y\) ~ \(P(\lambda)\) để chỉ rằng: \(Y\) có phân phối xác suất Poisson với tham số \(\lambda\). Giá trị trung bình khi đó của nó là \(EY = \lambda\) và phương sai là \(VarY = \lambda\).

Nếu \(Y_1, Y_2,..., Y_m\) là các biến ngẫu nhiên độc lập có cùng phân phối Poisson \(P(\lambda)\) thì \(Y = Y_1 + Y_2 + ... + Y_m\) là biến ngẫu nhiên có phân phối Poisson \(P(m\lambda)\).

3.4.8 Rủi ro tương đối (Relative Risk)

Sự khác biệt giữa hai tỷ lệ \(\pi_1\)\(\pi_2\) được đánh giá qua sai số tuyệt đối (\(\pi_1 - \pi_2\)) chỉ dựa vào khoảng cách giữa hai tỷ lệ này và bỏ qua độ lớn và ý nghĩa của chúng, nghĩa là khoảng cách như nhau thì đánh giá sai lệch như nhau.

Giả sử \(\pi_1\)\(\pi_2\) là xác suất thành công của hai nhóm thì rủi ro tương đối giữa hai nhím này là tỷ lệ xác suất thành công của hai nhóm: \(\frac{\pi_1}{\pi_2}\)

Các tỷ lệ tổng thể \(\pi_1\)\(\pi_2\) là chưa biết, ta nhận được các tỷ lệ mẫu tương ứng là \(f_1\)\(f_2\). Khi đó, ta dùng rủi ro tương đối mẫu \(\frac{f_1}{f_2}\) để xấp xỉ cho rủi ro tương đối \(\frac{\pi_1}{\pi_2}\) trên tổng thể.

3.4.9 Tỷ lệ chênh (Odds Ratios)

Tỷ lệ cược (Odds) là tỷ lệ giữa khả năng thành công và khả năng không thành công trong cùng một điều kiện tác động của biến giải thích, ký hiệu \(odds_i\):

\(odds_i = \frac{\pi_i}{1 - \pi_i}\)

Tỷ lệ chênh (Odds Ratio) của hàng 1 và hàng 2, được ký hiệu là \(\theta\), là tỷ số giữa tỷ lệ cược của thành công ở hàng 1 và tỷ lệ cược của thành công ở hàng 2:

\(\theta = \frac{odds_1}{odds_2} = \frac{\pi_1(1 - \pi_2)}{\pi_2(1 - \pi_1)}\)

3.4.10 Chỉ số đánh giá mô hình AIC (Akaike Information Criterian)

Công thức được sử dụng cho AIC trong R là:

\(AIC = Deviance + 2.k\) (với k là tham số của mô hình)

AIC càng bé thì mô hình càng chính xác.

3.4.11 Chỉ số đánh giá mô hình Bier

Chỉ số Brier là trung bình của tổng bình phương các độ chênh lệch giữa giá trị của biến phụ thuộc Y và giá trị ước lượng của nó.

\(B = \frac{1}{n}\sum_{i = 1}^n(Y_i - \hat\pi_i)^2 = \frac{sum square resid}{n}\)

3.4.12 Chỉ số đánh giá mô hình Deviance

Deviance cũng là một tiêu chí rất phổ biến được sử dụng để đánh giá một mô hình hồi quy được ước lượng bởi phương pháp Hợp lý cực đại (ML). Một cách tổng quá, cũng giống như chỉ tiêu AIC, giá trị của Deviance càng nhỏ thì mô hình càng tốt.

3.4.13 Ma trận nhầm lẫn

Ma trận nhầm lẫn là yếu tố giúp so sánh giá trị thực tế và giá trị dự báo. Trong ma trận nhầm lẫn người ta xét các chỉ số: Độ chính xác toàn thể, độ nhạy, độ đặc hiệu,…

Trong ma trận nhầm lẫn, các chỉ số quan trọng được chú ý là độ nhạy và độ đặc hiệu. Các chỉ số này càng lớn càng tốt.

3.4.14 Độ nhạy và độ đặc hiệu

Độ nhạy (sensitivity) của một thí nghiệm: Là tỷ lệ (%) của số ca bị bệnh thực sự khi xét nghiệm và cho kết quả dương tính với tổng số ca bị bệnh. Công thức để tính độ nhạy:

Độ nhạy = số dương tính thật/(số đương tính thật + số âm tính giả)

Độ đặc hiệu (specificity) của một thí nghiệm: Là tỷ lệ (%) của số ca không bị bệnh và kết quả xét nghiệm không bị bệnh với tổng số người không bị bệnh. Công thức tính độ đặc hiệu:

Độ đặc hiệu = Số trường hợp âm tính thật/ (số trường hợp âm tính thật + số trường hợp dương tính giả)

4 CHƯƠNG 3. KẾT QUẢ MÔ HÌNH NGHIÊN CỨU

4.1 Thống kê mô tả từng biến

4.1.1 Biến định tính Taste

table(milknew$Taste)
## 
##   0   1 
## 480 579
table(milknew$Taste)/sum(table(milknew$Taste))*100
## 
##        0        1 
## 45.32578 54.67422
milknew |> ggplot( aes( x = Taste, y= after_stat(count))) + geom_bar(color='green', fill='blue') + geom_text(aes(label= scales :: percent(after_stat(count/sum(count)),accuracy=.01)), stat = 'count', color= 'black', vjust= -.5) + theme_classic() + xlab('Hương vị của sữa') + ylab('Số mẫu')

Nhìn vào các bảng, ta thấy:

  • Có 480 mẫu sữa có hương vị không ngon, chiếm 45.33%.
  • Có 579 mẫu sữa có hương vị ngon, chiếm 54.67%.

4.1.2 Biến định tính Odor

table(milknew$Odor)
## 
##   0   1 
## 601 458
table(milknew$Odor)/sum(table(milknew$Odor))*100
## 
##        0        1 
## 56.75165 43.24835
milknew |> ggplot( aes( x = Odor, y= after_stat(count))) + geom_bar(color='green', fill='blue') + geom_text(aes(label= scales :: percent(after_stat(count/sum(count)),accuracy=.01)), stat = 'count', color= 'black', vjust= -.5) + theme_classic() + xlab('Mùi của sữa') + ylab('Số mẫu')

Nhìn vào các bảng, ta thấy:

  • Có 601 mẫu sữa có mùi không thơm, chiếm 56.75%.
  • Có 458 mẫu sữa có mùi thơm, chiếm 43.25%.

4.1.3 Biến định tính Fat

table(milknew$Fat)
## 
##   0   1 
## 348 711
table(milknew$Fat)/sum(table(milknew$Fat))*100
## 
##        0        1 
## 32.86119 67.13881
milknew |> ggplot( aes( x = Fat, y= after_stat(count))) + geom_bar(color='green', fill='blue') + geom_text(aes(label= scales :: percent(after_stat(count/sum(count)),accuracy=.01)), stat = 'count', color= 'black', vjust= -.5) + theme_classic() + xlab('Độ béo của sữa') + ylab('Số mẫu')

Nhìn vào các bảng, ta thấy:

  • Có 348 mẫu sữa có độ béo thấp, chiếm 32.86%.
  • Có 711 mẫu sữa có độ béo cao, chiếm 67.14%.

4.1.4 Biến định tính Turbidity

table(milknew$Turbidity)
## 
##   0   1 
## 539 520
table(milknew$Turbidity)/sum(table(milknew$Turbidity))*100
## 
##        0        1 
## 50.89707 49.10293
milknew |> ggplot( aes( x = Turbidity, y= after_stat(count))) + geom_bar(color='green', fill='blue') + geom_text(aes(label= scales :: percent(after_stat(count/sum(count)),accuracy=.01)), stat = 'count', color= 'black', vjust= -.5) + theme_classic() + xlab('Độ đục của sữa') + ylab('Số mẫu')

Nhìn vào các bảng, ta thấy:

  • Có 539 mẫu sữa có độ đục thấp, chiếm 50.90%.
  • Có 520 mẫu sữa có độ đục cao, chiếm 49.1%.

4.1.5 Biến định tính Grade

table(milknew$Grade)
## 
##   0   1 
## 548 511
table(milknew$Grade)/sum(table(milknew$Grade))*100
## 
##        0        1 
## 51.74693 48.25307
milknew |> ggplot( aes( x = Grade, y= after_stat(count))) + geom_bar(color='green', fill='blue') + geom_text(aes(label= scales :: percent(after_stat(count/sum(count)),accuracy=.01)), stat = 'count', color= 'black', vjust= -.5) + theme_classic() + xlab('Chất lượng của sữa') + ylab('Số lượng')

Nhìn vào các bảng, ta thấy:

  • Có 548 mẫu sữa có chất lượng kém, chiếm 51.75%.
  • Có 511 mẫu sữa có chất lượng cao, chiếm 48.25%.

4.1.6 Biến định lượng pH

summary(milknew$pH)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    3.00    6.50    6.70    6.63    6.80    9.50
sd(milknew$pH)
## [1] 1.399679
milknew |> ggplot(aes(pH))+geom_bar(aes(y=(..count..)),color="orange",fill="blue")
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Nhìn vào bảng, ta thấy:

  • Độ pH của sữa dao động ở mức 3 đến 9.5, mức độ trung bình là 6.63.

  • Có 25% số mẫu trong dữ liệu có độ pH thấp hơn 6.5.

  • Có 50% số mẫu trong dữ liệu có độ pH thấp hơn 6.7.

  • Có 75% số mẫu trong dữ liệu có độ pH thấp hơn 6.8.

  • Độ pH có độ lệch chuẩn là 1.399679.

4.1.7 Biến định lượng Temprature

summary(milknew$Temprature)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   34.00   38.00   41.00   44.23   45.00   90.00
sd(milknew$Temprature)
## [1] 10.09836
milknew |> ggplot(aes(Temprature))+geom_bar(aes(y=(..count..)),color="orange",fill="blue")

Nhìn vào bảng, ta thấy:

  • Nhiệt độ của sữa dao động ở mức 34 đến 90, mức độ trung bình là 44.23.

  • Có 25% số mẫu trong dữ liệu có nhiệt độ thấp hơn 38.

  • Có 50% số mẫu trong dữ liệu có nhiệt độ thấp hơn 41.

  • Có 75% số mẫu trong dữ liệu có nhiệt độ thấp hơn 45.

  • Độ pH có độ lệch chuẩn là 10,09836.

4.1.8 Biến định lượng Colour

summary(milknew$Colour)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   240.0   250.0   255.0   251.8   255.0   255.0
sd(milknew$Colour)
## [1] 4.307424
milknew |> ggplot(aes(Colour))+geom_bar(aes(y=(..count..)),color="orange",fill="blue")

Nhìn vào bảng, ta thấy:

  • Màu của sữa dao động ở mức 240 đến 255, mức độ trung bình là 251.8.

  • Có 25% số mẫu trong dữ liệu có màu thấp hơn 250.

  • Có 50% số mẫu trong dữ liệu có màu thấp hơn 255.

  • Có 75% số mẫu trong dữ liệu có màu thấp hơn 255.

  • Độ pH có độ lệch chuẩn là 10.09836.

4.2 Thống kê mô tả và thống kê suy diễn hai biến

4.2.1 Mối quan hệ giữa biến Grade và biến Taste

  1. Bảng tần số, tần suất
ts1 <- table(milknew$Grade, milknew$Taste)
ts1
##    
##       0   1
##   0 251 297
##   1 229 282
ts11 <- prop.table(ts1)
addmargins(ts11)
##      
##               0         1       Sum
##   0   0.2370161 0.2804533 0.5174693
##   1   0.2162417 0.2662890 0.4825307
##   Sum 0.4532578 0.5467422 1.0000000

Nhìn vào bảng, ta thấy:

  • Có 282 mẫu sữa có hương vị ngon được đánh giá chất lượng cao, chiếm 26.63%.
  • Có 297 mẫu sữa có hương vị ngon được đánh giá chất lượng thấp, chiếm 28.05%.
  • Có 229 mẫu sữa có hương vị không ngon được đánh giá chất lượng cao, chiếm 21.62%.
  • Có 251 mẫu sữa có hương vị không ngon được đánh giá chất lượng thấp, chiếm 23.70%.
  1. Rủi ro tương đối và tỷ lệ chênh lệch
epitab(ts1, method = "riskratio")
## $tab
##    
##       0        p0   1        p1 riskratio    lower    upper   p.value
##   0 251 0.4580292 297 0.5419708  1.000000       NA       NA        NA
##   1 229 0.4481409 282 0.5518591  1.018245 0.912474 1.136277 0.7577342
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Nhìn vào kết quả ta thấy, rủi ro tương đối của chất lượng sữa theo hương vị là 1.0182. Tức là, tỉ lệ chất lượng sữa theo hương vị ngon cao hơn tỉ lệ chất lượng sữa theo hương vị không ngon. Tuy nhiên, giá trị p-value = 0.7577 cho thấy sự khác biệt này không đáng kể thống kê. Tức là, không có đủ bằng chứng thống kê để kết luận rằng tỷ lệ rủi ro giữa 2 nhóm khác nhau.

epitab(ts1, method = "oddsratio")
## $tab
##    
##       0        p0   1        p1 oddsratio     lower    upper   p.value
##   0 251 0.5229167 297 0.5129534  1.000000        NA       NA        NA
##   1 229 0.4770833 282 0.4870466  1.040713 0.8168966 1.325851 0.7577342
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Nhìn vào kết quả ta thấy, tỷ lệ chênh lệch của chất lượng sữa theo hương vị là 1,0407. Tức là, tỉ lệ chất lượng sữa theo hương vị ngon cao hơn tỉ lệ chất lượng sữa theo hương vị không ngon. Tuy nhiên, giá trị p-value = 0.7577 cho thấy sự khác biệt này không đáng kể thống kê. Tức là, không có đủ bằng chứng thống kê để kết luận rằng tỷ lệ chênh lệch giữa 2 nhóm khác nhau.

  1. Biểu đồ
ggplot(milknew, aes(Grade, fill = Taste)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

  1. Kiểm định tính độc lập

Giả thuyết:

\(H_0\): Biến Grade và biến Taste độc lập với nhau

\(H_1\): Biến Grade và biến Taste không độc lập với nhau

gil <- table (milknew$Grade, milknew$Taste)
gil
##    
##       0   1
##   0 251 297
##   1 229 282
chisq.test(gil)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  gil
## X-squared = 0.068246, df = 1, p-value = 0.7939

Vì p_value = 0.7939 > 0.05 nên ta chấp nhận giả thuyết \(H_0\). Nghĩa là biến Grade và biến Taste độc lập với nhau.

4.2.2 Mối quan hệ giữa biến Grade và biến Odor

  1. Bảng tần số, tần suất
ts2 <- table(milknew$Grade, milknew$Odor)
ts2
##    
##       0   1
##   0 338 210
##   1 263 248
ts22 <- prop.table(ts2)
addmargins(ts22)
##      
##               0         1       Sum
##   0   0.3191690 0.1983003 0.5174693
##   1   0.2483475 0.2341832 0.4825307
##   Sum 0.5675165 0.4324835 1.0000000

Nhìn vào bảng, ta thấy:

  • Có 248 mẫu sữa có mùi thơm được đánh giá chất lượng cao, chiếm 23.42%.
  • Có 210 mẫu sữa có mùi thơm được đánh giá chất lượng thấp, chiếm 19.83%.
  • Có 263 mẫu sữa có mùi không thơm được đánh giá chất lượng cao, chiếm 24.83%.
  • Có 338 mẫu sữa có mùi không thơm được đánh giá chất lượng thấp, chiếm 31.92%.
  1. Rủi ro tương đối và tỷ lệ chênh lệch
epitab(ts2, method = "riskratio")
## $tab
##    
##       0        p0   1        p1 riskratio    lower    upper      p.value
##   0 338 0.6167883 210 0.3832117  1.000000       NA       NA           NA
##   1 263 0.5146771 248 0.4853229  1.266462 1.102373 1.454975 0.0009941705
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Nhìn vào kết quả ta thấy, rủi ro tương đối của chất lượng sữa theo mùi thơm là 1,2665. Tức là, tỉ lệ chất lượng sữa theo mùi thơm cao hơn tỉ lệ chất lượng sữa theo mùi không thơm. Giá trị p-value = 0.001 rất nhỏ (gần bằng 0) cho thấy sự khác biệt này có ý nghĩa thống kê đáng kể.

epitab(ts2, method = "oddsratio")
## $tab
##    
##       0       p0   1        p1 oddsratio    lower    upper      p.value
##   0 338 0.562396 210 0.4585153  1.000000       NA       NA           NA
##   1 263 0.437604 248 0.5414847  1.517726 1.188589 1.938006 0.0009941705
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Nhìn vào kết quả ta thấy, tỷ lệ chênh lệch của chất lượng sữa theo hương vị là 1.5177. Tức là, tỉ lệ chất lượng sữa theo mùi thơm cao hơn tỉ lệ chất lượng sữa theo mùi không thơm. Giá trị p-value = 0.001 rất nhỏ (gần bằng 0) cho thấy sự khác biệt này có ý nghĩa thống kê đáng kể.

  1. Biểu đồ
ggplot(milknew, aes(Grade, fill = Odor)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

  1. Kiểm định tính độc lập

Giả thuyết:

\(H_0\): Biến Grade và biến Odor độc lập với nhau

\(H_1\): Biến Grade và biến Odor không độc lập với nhau

gil <- table (milknew$Grade, milknew$Odor)
gil
##    
##       0   1
##   0 338 210
##   1 263 248
chisq.test(gil)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  gil
## X-squared = 10.821, df = 1, p-value = 0.001004

Vì p_value = 0.001 < 0.05 nên ta chấp nhận giả thuyết \(H_1\). Nghĩa là biến Grade và biến Odor không độc lập với nhau.

4.2.3 Mối quan hệ giữa biến Grade và biến Fat

  1. Bảng tần số, tần suất
ts3 <- table(milknew$Grade, milknew$Fat)
ts3
##    
##       0   1
##   0 193 355
##   1 155 356
ts33 <- prop.table(ts3)
addmargins(ts33)
##      
##               0         1       Sum
##   0   0.1822474 0.3352219 0.5174693
##   1   0.1463645 0.3361662 0.4825307
##   Sum 0.3286119 0.6713881 1.0000000

Nhìn vào bảng, ta thấy:

  • Có 356 mẫu sữa có độ béo cao được đánh giá chất lượng cao, chiếm 33.62%.
  • Có 355 mẫu sữa có độ béo cao được đánh giá chất lượng thấp, chiếm 33.52%.
  • Có 155 mẫu sữa có độ béo thấp được đánh giá chất lượng cao, chiếm 14.64%.
  • Có 193 mẫu sữa có độ béo thấp được đánh giá chất lượng thấp, chiếm 18.22%.
  1. Rủi ro tương đối và tỷ lệ chênh lệch
epitab(ts3, method = "riskratio")
## $tab
##    
##       0        p0   1        p1 riskratio     lower    upper   p.value
##   0 193 0.3521898 355 0.6478102  1.000000        NA       NA        NA
##   1 155 0.3033268 356 0.6966732  1.075428 0.9886166 1.169862 0.1016743
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Nhìn vào kết quả ta thấy, rủi ro tương đối của chất lượng sữa theo độ béo là 1.0754. Tức là, tỉ lệ chất lượng sữa theo độ béo cao cao hơn tỉ lệ chất lượng sữa theo độ béo thấp. Tuy nhiên, giá trị p-value = 0.1017 cho thấy sự khác biệt này không đáng kể thống kê. Tức là không có đủ bằng chứng thống kể để kết luận rằng tỷ lệ rủi ro giữa 2 nhóm khác nhau.

epitab(ts3, method = "oddsratio")
## $tab
##    
##       0        p0   1        p1 oddsratio     lower   upper   p.value
##   0 193 0.5545977 355 0.4992968  1.000000        NA      NA        NA
##   1 155 0.4454023 356 0.5007032  1.248669 0.9652113 1.61537 0.1016743
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Nhìn vào kết quả ta thấy, tỷ lệ chênh lệch của chất lượng sữa theo độ béo là 1.2487. Tức là, tỉ lệ chất lượng sữa theo độ béo cao cao hơn tỉ lệ chất lượng sữa theo độ béo thấp. Tuy nhiên, giá trị p-value = 0.1017 cho thấy sự khác biệt này không đáng kể thống kê. Tức là không có đủ bằng chứng thống kể để kết luận rằng tỷ lệ rủi ro giữa 2 nhóm khác nhau.

  1. Biểu đồ
ggplot(milknew, aes(Grade, fill = Fat)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

  1. Kiểm định tính độc lập

Giả thuyết:

\(H_0\): Biến Grade và biến Fat độc lập với nhau

\(H_1\): Biến Grade và biến Fat không độc lập với nhau

gil <- table (milknew$Grade, milknew$Fat)
gil
##    
##       0   1
##   0 193 355
##   1 155 356
chisq.test(gil)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  gil
## X-squared = 2.6444, df = 1, p-value = 0.1039

Vì p_value = 2.2e-16 < 0.05 nên ta chấp nhận giả thuyết \(H_1\). Nghĩa là biến Grade và biến không độc lập với nhau.

4.2.4 Mối quan hệ giữa biến Grade và biến Turbidity

  1. Bảng tần số, tần suất
ts4 <- table(milknew$Grade, milknew$Turbidity)
ts4
##    
##       0   1
##   0 222 326
##   1 317 194
ts44 <- prop.table(ts4)
addmargins(ts44)
##      
##               0         1       Sum
##   0   0.2096317 0.3078376 0.5174693
##   1   0.2993390 0.1831917 0.4825307
##   Sum 0.5089707 0.4910293 1.0000000

Nhìn vào bảng, ta thấy:

  • Có 194 mẫu sữa có độ đục cao được đánh giá chất lượng cao, chiếm 18.32%.
  • Có 326 mẫu sữa có độ đục cao được đánh giá chất lượng thấp, chiếm 30.78%.
  • Có 317 mẫu sữa có độ đục thấp được đánh giá chất lượng cao, chiếm 29.93%.
  • Có 222 mẫu sữa có độ đục thấp được đánh giá chất lượng thấp, chiếm 20.96%.
  1. Rủi ro tương đối và tỷ lệ chênh lệch
epitab(ts4, method = "riskratio")
## $tab
##    
##       0        p0   1        p1 riskratio     lower     upper      p.value
##   0 222 0.4051095 326 0.5948905 1.0000000        NA        NA           NA
##   1 317 0.6203523 194 0.3796477 0.6381809 0.5600452 0.7272178 3.030392e-12
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Nhìn vào kết quả ta thấy, rủi ro tương đối của chất lượng sữa theo độ béo là 0.6382. Tức là, tỉ lệ chất lượng sữa theo độ đục cao thấp hơn tỉ lệ chất lượng sữa theo độ đục thấp. Giá trị p-value = 3.030392e-12 rất nhỏ (gần bằng 0) cho thấy sự khác biệt này là có ý nghĩa thống kê đáng kể.

epitab(ts4, method = "oddsratio")
## $tab
##    
##       0        p0   1        p1 oddsratio     lower     upper      p.value
##   0 222 0.4118738 326 0.6269231 1.0000000        NA        NA           NA
##   1 317 0.5881262 194 0.3730769 0.4167521 0.3255434 0.5335152 3.030392e-12
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Nhìn vào kết quả ta thấy, tỷ lệ chênh lệch của chất lượng sữa theo độ béo là 0.4168. Tức là, tỉ lệ chất lượng sữa theo độ đục cao thấp hơn tỉ lệ chất lượng sữa theo độ đục thấp. Giá trị p-value = 3.030392e-12 rất nhỏ (gần bằng 0) cho thấy sự khác biệt này là có ý nghĩa thống kê đáng kể.

  1. Biểu đồ
ggplot(milknew, aes(Grade, fill = Turbidity)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

  1. Kiểm định tính độc lập

Giả thuyết:

\(H_0\): Biến Grade và biến Turbidity độc lập với nhau

\(H_1\): Biến Grade và biến Turbidity không độc lập với nhau

gil <- table (milknew$Grade, milknew$Turbidity)
gil
##    
##       0   1
##   0 222 326
##   1 317 194
chisq.test(gil)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  gil
## X-squared = 48.161, df = 1, p-value = 3.926e-12

Vì p_value = 3.926e-12 < 0.05 nên ta chấp nhận giả thuyết \(H_1\). Nghĩa là biến Grade và biến Turbidity không độc lập với nhau.

4.2.5 Mối quan hệ giữa biến Grade và biến pH

Mã hóa biến định lượng pH thành định tính nhằm để thống kê mô tả biến

pH1 <- cut(milknew$pH, breaks = c(2,6.25,10), labels = c("không", "một"))
  1. Bảng tần số, tần suất
ts5 <- table(milknew$Grade, pH1)
ts5
##    pH1
##     không một
##   0   169 379
##   1     0 511
ts55 <- prop.table(ts5)
addmargins(ts55)
##      pH1
##           không       một       Sum
##   0   0.1595845 0.3578848 0.5174693
##   1   0.0000000 0.4825307 0.4825307
##   Sum 0.1595845 0.8404155 1.0000000

Nhìn vào bảng, ta thấy:

  • Có 511 mẫu sữa có độ pH phù hợp được đánh giá chất lượng cao, chiếm 48.25%.
  • Có 379 mẫu sữa có độ pH phù hợp được đánh giá chất lượng thấp, chiếm 35.79%.
  • Có 0 mẫu sữa có độ pH phù hợp được đánh giá chất lượng cao, chiếm 0%.
  • Có 169 mẫu sữa có độ pH không phù hợp được đánh giá chất lượng thấp, chiếm 16%.
  1. Biểu đồ
ggplot(milknew, aes(Grade, fill = pH1)) + geom_bar(position = 'dodge')

  1. Kiểm định tính độc lập

Giả thuyết:

\(H_0\): Biến Grade và biến pH độc lập với nhau

\(H_1\): Biến Grade và biến pH không độc lập với nhau

gil <- table (milknew$Grade, milknew$pH)
gil
##    
##       3 4.5 4.7 5.5 5.6 6.4 6.5 6.6 6.7 6.8 7.4 8.1 8.5 8.6   9 9.5
##   0  70  37  20  23  19   0  65  40   8  58  37  24  22  40  61  24
##   1   0   0   0   0   0   1 124 119  74 191   2   0   0   0   0   0
chisq.test(gil)
## Warning in chisq.test(gil): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  gil
## X-squared = 553.63, df = 15, p-value < 2.2e-16

Vì p_value = 2.2e-16 < 0.05 nên ta chấp nhận giả thuyết \(H_1\). Nghĩa là biến Grade và biến pH không độc lập với nhau.

4.2.6 Mối quan hệ giữa biến Grade và biến Temprature

Mã hóa biến định lượng Temprature thành định tính nhằm để thống kê mô tả biến

Temprature1 <- cut(milknew$Temprature, breaks = c(33,45.5,91), labels = c("một", "không"))
  1. Bảng tần số, tần suất
ts6 <- table(milknew$Grade, Temprature1)
ts6
##    Temprature1
##     một không
##   0 342   206
##   1 508     3
ts66 <- prop.table(ts6)
addmargins(ts66)
##      Temprature1
##               một       không         Sum
##   0   0.322946176 0.194523135 0.517469311
##   1   0.479697828 0.002832861 0.482530689
##   Sum 0.802644004 0.197355996 1.000000000

Nhìn vào bảng, ta thấy:

  • Có 508 mẫu sữa có nhiệt độ phù hợp được đánh giá chất lượng cao, chiếm 47.97%.
  • Có 342 mẫu sữa có nhiệt độ phù hợp được đánh giá chất lượng thấp, chiếm 32.29%.
  • Có 3 mẫu sữa có nhiệt độ không phù hợp được đánh giá chất lượng cao, chiếm 0.003%.
  • Có 206 mẫu sữa có nhiệt độ không phù hợp được đánh giá chất lượng thấp, chiếm 19.45%.
  1. Biểu đồ
ggplot(milknew, aes(Grade, fill = Turbidity)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

  1. Kiểm định tính độc lập

Giả thuyết:

\(H_0\): Biến Grade và biến Turbidity độc lập với nhau

\(H_1\): Biến Grade và biến Turbidity không độc lập với nhau

gil <- table (milknew$Grade, milknew$Turbidity)
gil
##    
##       0   1
##   0 222 326
##   1 317 194
chisq.test(gil)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  gil
## X-squared = 48.161, df = 1, p-value = 3.926e-12

Vì p_value = 3.926e-12 < 0.05 nên ta chấp nhận giả thuyết \(H_1\). Nghĩa là biến Grade và biến Turbidity không độc lập với nhau.

4.2.7 Mối quan hệ giữa biến Grade và biến Colour

Mã hóa biến định lượng Colour thành định tính nhằm để thống kê mô tả biến

Colour1 <- cut(milknew$Colour, breaks = c(239,243,256), labels = c("không", "một"))
  1. Bảng tần số, tần suất
ts7 <- table(milknew$Grade, Colour1)
ts7
##    Colour1
##     không một
##   0    13 535
##   1    19 492
ts77 <- prop.table(ts7)
addmargins(ts77)
##      Colour1
##            không        một        Sum
##   0   0.01227573 0.50519358 0.51746931
##   1   0.01794145 0.46458924 0.48253069
##   Sum 0.03021719 0.96978281 1.00000000

Nhìn vào bảng, ta thấy:

  • Có 492 mẫu sữa có màu phù hợp được đánh giá chất lượng cao, chiếm 46.46%.
  • Có 535 mẫu sữa có màu phù hợp được đánh giá chất lượng thấp, chiếm 50.52%.
  • Có 19 mẫu sữa có màu không phù hợp được đánh giá chất lượng cao, chiếm 1.79%.
  • Có 13 mẫu sữa có màu không phù hợp được đánh giá chất lượng thấp, chiếm 1.23%.
  1. Biểu đồ
ggplot(milknew, aes(Grade, fill = Colour)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

  1. Kiểm định tính độc lập

Giả thuyết:

\(H_0\): Biến Grade và biến Turbidity độc lập với nhau

\(H_1\): Biến Grade và biến Turbidity không độc lập với nhau

gil <- table (milknew$Grade, milknew$Colour)
gil
##    
##     240 245 246 247 248 250 253 254 255
##   0  13  26  35   8  23 100   0   0 343
##   1  19  89   9  40   0  46  22   1 285
chisq.test(gil)
## Warning in chisq.test(gil): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  gil
## X-squared = 142.55, df = 8, p-value < 2.2e-16

Vì p_value = 2.2e-16 < 0.05 nên ta chấp nhận giả thuyết \(H_1\). Nghĩa là biến Grade và biến Colour không độc lập với nhau.

4.3 Khoảng ước lượng tỷ lệ

4.3.1 Ước lượng tỷ lệ chất lượng sữa

a <- milknew[milknew$Grade == "1",]
prop.test(length(a$Grade), length(milknew$Grade))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(a$Grade) out of length(milknew$Grade), null probability 0.5
## X-squared = 1.2238, df = 1, p-value = 0.2686
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4520830 0.5131066
## sample estimates:
##         p 
## 0.4825307

Với khoảng tin cậy 95%, tỷ lệ chất lượng sữa cao so với tổng thể nằm trong khoảng 45.21% đến 51.31%. Hay nói cách khác, tỷ lệ chất lượng sữa thấp so với tổng thể nằm trong khoảng 48.69% đến 54.79%.

4.3.2 Ước lượng tỷ lệ mùi của sữa

b <- milknew[milknew$Odor == "1",]
prop.test(length(b$Odor), length(milknew$Odor))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(b$Odor) out of length(milknew$Odor), null probability 0.5
## X-squared = 19.041, df = 1, p-value = 1.28e-05
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4024756 0.4629871
## sample estimates:
##         p 
## 0.4324835

Với khoảng tin cậy 95%, tỷ lệ mùi sữa thơm so với tổng thể nằm trong khoảng 40.25% đến 46.3%. Hay nói cách khác, tỷ lệ mùi sữa không thơm so với tổng thể nằm trong khoảng 53.7% đến 59.75%.

4.3.3 Ước lượng tỷ lệ độ béo của sữa

c <- milknew[milknew$Fat == "1",]
prop.test(length(c$Fat), length(milknew$Fat))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(c$Fat) out of length(milknew$Fat), null probability 0.5
## X-squared = 123.74, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.6420426 0.6994741
## sample estimates:
##         p 
## 0.6713881

Với khoảng tin cậy 95%, tỷ lệ độ béo sữa cao so với tổng thể nằm trong khoảng 64.20% đến 69.95%. Hay nói cách khác, tỷ lệ độ béo sữa thấp so với tổng thể nằm trong khoảng 30.05% đến 35.80%.

4.3.4 Ước lượng tỷ lệ độ đục của sữa

d <- milknew[milknew$Turbidity == "1",]
prop.test(length(d$Grade), length(milknew$Turbidity))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(d$Grade) out of length(milknew$Turbidity), null probability 0.5
## X-squared = 0.30595, df = 1, p-value = 0.5802
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4605370 0.5215875
## sample estimates:
##         p 
## 0.4910293

Với khoảng tin cậy 95%, tỷ lệ độ đục sữa cao so với tổng thể nằm trong khoảng 46.05% đến 52.16%. Hay nói cách khác, tỷ lệ độ đục sữa thấp so với tổng thể nằm trong khoảng 47.84% đến 53.95%.

4.4 Ước lượng mô hình hồi quy

4.4.1 Hồi quy với hàm probit

# Hồi quy với hàm probit
fit1 <- glm(Grade ~ milknew$Odor + milknew$Fat + milknew$Turbidity + milknew$pH + milknew$Temprature + milknew$Colour , family = binomial(link = "probit"), data = milknew)
summary(fit1)
## 
## Call:
## glm(formula = Grade ~ milknew$Odor + milknew$Fat + milknew$Turbidity + 
##     milknew$pH + milknew$Temprature + milknew$Colour, family = binomial(link = "probit"), 
##     data = milknew)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         7.049541   2.575967   2.737  0.00621 ** 
## milknew$Odor        0.642031   0.103548   6.200 5.63e-10 ***
## milknew$Fat         0.315081   0.097373   3.236  0.00121 ** 
## milknew$Turbidity  -0.818292   0.104527  -7.828 4.94e-15 ***
## milknew$pH          0.139542   0.031035   4.496 6.92e-06 ***
## milknew$Temprature -0.065175   0.006522  -9.993  < 2e-16 ***
## milknew$Colour     -0.021043   0.009951  -2.115  0.03446 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1466.8  on 1058  degrees of freedom
## Residual deviance: 1194.7  on 1052  degrees of freedom
## AIC: 1208.7
## 
## Number of Fisher Scoring iterations: 5
# Kiểm định sự phù hợp của mô hình bằng cách tính giá trị Prob(LR statistic)
lr_test <- anova(fit1, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 0.0007973808

Kiểm định sự phù hợp của mô hình:

  • \(H_0\): Mô hình không phù hợp
  • \(H_1\): Mô hình phù hợp

Với P-value = Prob(LR) < 0 chấp nhận giả thuyết \(H_1\) nên mô hình phù hợp với dữ liệu.

# Giá trị BrierScore
BrierScore(fit1)
## [1] 0.1878503
# Ma trận nhầm lẫn
predictions <- predict(fit1, newdata = milknew, type = "response")
predicted_classes <- ifelse(predictions > 0.5, "1", "0")
predictions1<-factor(predicted_classes, levels = c("0","1"))
actual<- factor(milknew$Grade, labels = c("0","1"))
confusionMatrix(table(predictions1, actual))
## Confusion Matrix and Statistics
## 
##             actual
## predictions1   0   1
##            0 374 102
##            1 174 409
##                                           
##                Accuracy : 0.7394          
##                  95% CI : (0.7118, 0.7656)
##     No Information Rate : 0.5175          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.4806          
##                                           
##  Mcnemar's Test P-Value : 1.923e-05       
##                                           
##             Sensitivity : 0.6825          
##             Specificity : 0.8004          
##          Pos Pred Value : 0.7857          
##          Neg Pred Value : 0.7015          
##              Prevalence : 0.5175          
##          Detection Rate : 0.3532          
##    Detection Prevalence : 0.4495          
##       Balanced Accuracy : 0.7414          
##                                           
##        'Positive' Class : 0               
## 

4.4.2 Hồi quy với hàm logit

# Hồi quy với hàm logit
fit2 <- glm(Grade ~ milknew$Odor + milknew$Fat + milknew$Turbidity + milknew$pH + milknew$Temprature + milknew$Colour , family = binomial(link = "logit"), data = milknew)
summary(fit2)
## 
## Call:
## glm(formula = Grade ~ milknew$Odor + milknew$Fat + milknew$Turbidity + 
##     milknew$pH + milknew$Temprature + milknew$Colour, family = binomial(link = "logit"), 
##     data = milknew)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        13.22758    4.34496   3.044  0.00233 ** 
## milknew$Odor        1.20102    0.18119   6.628 3.39e-11 ***
## milknew$Fat         0.53201    0.16607   3.204  0.00136 ** 
## milknew$Turbidity  -1.41430    0.18200  -7.771 7.79e-15 ***
## milknew$pH          0.24414    0.05255   4.646 3.39e-06 ***
## milknew$Temprature -0.12650    0.01289  -9.815  < 2e-16 ***
## milknew$Colour     -0.03851    0.01672  -2.303  0.02126 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1466.8  on 1058  degrees of freedom
## Residual deviance: 1180.9  on 1052  degrees of freedom
## AIC: 1194.9
## 
## Number of Fisher Scoring iterations: 5
# Kiểm định sự phù hợp của mô hình bằng cách tính giá trị Prob(LR statistic)
lr_test <- anova(fit2, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 0.0007973808

Kiểm định sự phù hợp của mô hình:

  • \(H_0\): Mô hình không phù hợp
  • \(H_1\): Mô hình phù hợp

Với P-value = Prob(LR) < 0 chấp nhận giả thuyết \(H_1\) nên mô hình phù hợp với dữ liệu.

# Giá trị BrierScore
BrierScore(fit2)
## [1] 0.1865416
# Ma trận nhầm lẫn
predictions <- predict(fit2, newdata = milknew, type = "response")
predicted_classes <- ifelse(predictions > 0.5, "1", "0")
predictions1<-factor(predicted_classes, levels = c("0","1"))
actual<- factor(milknew$Grade, labels = c("0","1"))
confusionMatrix(table(predictions1, actual))
## Confusion Matrix and Statistics
## 
##             actual
## predictions1   0   1
##            0 357 108
##            1 191 403
##                                           
##                Accuracy : 0.7177          
##                  95% CI : (0.6895, 0.7446)
##     No Information Rate : 0.5175          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.4377          
##                                           
##  Mcnemar's Test P-Value : 2.114e-06       
##                                           
##             Sensitivity : 0.6515          
##             Specificity : 0.7886          
##          Pos Pred Value : 0.7677          
##          Neg Pred Value : 0.6785          
##              Prevalence : 0.5175          
##          Detection Rate : 0.3371          
##    Detection Prevalence : 0.4391          
##       Balanced Accuracy : 0.7201          
##                                           
##        'Positive' Class : 0               
## 

4.4.3 Hồi quy với hàm cloglog

# Hồi quy với hàm probit
fit3 <- glm(Grade ~ milknew$Odor + milknew$Fat + milknew$Turbidity + milknew$pH + milknew$Temprature + milknew$Colour , family = binomial(link = "cloglog"), data = milknew)
summary(fit3)
## 
## Call:
## glm(formula = Grade ~ milknew$Odor + milknew$Fat + milknew$Turbidity + 
##     milknew$pH + milknew$Temprature + milknew$Colour, family = binomial(link = "cloglog"), 
##     data = milknew)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         7.558708   2.925973   2.583 0.009786 ** 
## milknew$Odor        0.933924   0.123004   7.593 3.14e-14 ***
## milknew$Fat         0.476555   0.107909   4.416 1.00e-05 ***
## milknew$Turbidity  -1.147420   0.126655  -9.059  < 2e-16 ***
## milknew$pH          0.140271   0.037860   3.705 0.000211 ***
## milknew$Temprature -0.089932   0.009436  -9.531  < 2e-16 ***
## milknew$Colour     -0.021026   0.011094  -1.895 0.058059 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1466.8  on 1058  degrees of freedom
## Residual deviance: 1177.5  on 1052  degrees of freedom
## AIC: 1191.5
## 
## Number of Fisher Scoring iterations: 16
# Kiểm định sự phù hợp của mô hình bằng cách tính giá trị Prob(LR statistic)
lr_test <- anova(fit3, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 0.0007973808

Kiểm định sự phù hợp của mô hình:

  • \(H_0\): Mô hình không phù hợp
  • \(H_1\): Mô hình phù hợp

Với P-value = Prob(LR) < 0 chấp nhận giả thuyết \(H_1\) nên mô hình phù hợp với dữ liệu.

# Giá trị BrierScore
BrierScore(fit3)
## [1] 0.1878635
# Ma trận nhầm lẫn
predictions <- predict(fit3, newdata = milknew, type = "response")
predicted_classes <- ifelse(predictions > 0.5, "1", "0")
predictions1<-factor(predicted_classes, levels = c("0","1"))
actual<- factor(milknew$Grade, labels = c("0","1"))
confusionMatrix(table(predictions1, actual))
## Confusion Matrix and Statistics
## 
##             actual
## predictions1   0   1
##            0 362 138
##            1 186 373
##                                           
##                Accuracy : 0.6941          
##                  95% CI : (0.6653, 0.7217)
##     No Information Rate : 0.5175          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.3893          
##                                           
##  Mcnemar's Test P-Value : 0.009025        
##                                           
##             Sensitivity : 0.6606          
##             Specificity : 0.7299          
##          Pos Pred Value : 0.7240          
##          Neg Pred Value : 0.6673          
##              Prevalence : 0.5175          
##          Detection Rate : 0.3418          
##    Detection Prevalence : 0.4721          
##       Balanced Accuracy : 0.6953          
##                                           
##        'Positive' Class : 0               
## 

4.4.4 Lựa chọn mô hình phù hợp

Mô hình AIC Deviance Brier Score Độ chính xác Độ nhạy Độ đặc hiệu
Probit 1208.7 1194.9 0.1878503 0.7394 0.6825 0.8004
Logit 1194.9 1180.9 0.1865416 0.7177 0.6515 0.7886
Cloglog 1191.5 1177.5 0.1878635 0.6941 0.6606 0.7299
Lựa chọn MH3 MH3 MH2 MH1 MH1 MH1

Từ kết quả thu được, mô hình Probit là mô hình thỏa mãn các tiêu chi đánh giá nhất trong 3 mô hình đề xuất. Do đó, mô hình Probit là mô hình tối ưu nhất.

4.4.5 Giải thích mô hình

Hệ số chặn là 7.049541, có nghĩa là khi tất cả các biến độc lập bằng không, xác suất chất lượng sữa là \(\phi\)(7.049541), trong đó \(\phi\) là hàm phân phối chuẩn tích lũy.

Hệ số Odor là 0.642031, có nghĩa là khi mùi của sữa tăng lên một đơn vị (từ 0 sang 1), xác suất chất lượng sữa tăng lên \(\phi\)(0.642031) đơn vị chuẩn hoá, giữ nguyên các biến khác.

Hệ số Fat là 0.315081, có nghĩa là khi độ béo của sữa tăng lên một đơn vị (từ 0 sang 1), xác suất chất lượng sữa tăng lên \(\phi\)(0.315081) đơn vị chuẩn hoá, giữ nguyên các biến khác.

Hệ số Turbidity của sữa là -0.818292, có nghĩa là khi độ đục của sữa tăng lên một đơn vị (từ 0 sang 1), xác suất chất lượng sữa giảm đi \(\phi\)(-0.818292) đơn vị chuẩn hoá, giữ nguyên các biến khác.

Hệ số pH là 0.139542, có nghĩa là khi độ pH của sữa tăng lên một đơn vị, xác suất chất lượng sữa tăng lên \(\phi\)(0.139542) đơn vị chuẩn hoá, giữ nguyên các biến khác.

Hệ số Temprature là -0.065175, có nghĩa là khi nhiệt độ của sữa tăng lên một đơn vị, xác suất chất lượng sữa giảm đi \(\phi\)(-0.065175) đơn vị chuẩn hoá, giữ nguyên các biến khác.

Hệ số Colour của sữa là -0.021043, có nghĩa là khi màu của sữa tăng lên một đơn vị, xác suất chất lượng sữa giảm đi \(\phi\)(-0.021043) đơn vị chuẩn hoá, giữ nguyên các biến khác.

Các Pr(>|z|) của các hệ số đều nhỏ hơn 0.05, cho thấy rằng 6 biến đưa vào mô hình hồi quy để phân tích đều có ý nghĩa thống kê.

5 CHƯƠNG 4. KẾT LUẬN VÀ HẠN CHẾ

5.1 Kết luận

Với mục đích chính là Phân tích các yếu tố ảnh hưởng đến chất lượng sữa, tôi đã sử dụng bộ dữ liệu được thu thập từ năm 2022 để tiến hành đánh giá các yếu tố ảnh hưởng đến chất lượng sữa. Mô hình tối ưu giúp việc đánh giá hiệu quả là mô hình Probit.

Kết quả phân tích cho thấy 6 yếu tố trong bộ dữ liệu nhằm phân tích đánh giá chất lượng sữa đều có ý nghĩa. Qua đó, ta có thể phát triển tìm hiểu sâu hơn về các yếu tố này nhằm có thể đánh giá chất lượng sữa chính xác hơn nữa.

Qua bài phân tích, các hộ nông dân chăn nuôi đơn lẻ hoặc trang trại bò sữa có thể dựa theo đó mà tạo ra môi trường thích hợp nhất để đàn bò có thể cho ra các sản phẩm sữa chất lượng, dinh dưỡng nhất đến tay người tiêu dùng.

5.2 Hạn chế

Bộ dữ liệu được thu thập từ nước ngoài và được đăng tải trên internet nên tỷ lệ chính xác sẽ không tuyệt đối nên. Đó cũng chính là nguyên nhân dẫn đến một số bất cập trong quá trình nghiên cứu, làm xuất hiện các biến NA không xác định.

Bài phân tích được thực hiện trên phân mềm R & RStudio. Nhưng do đây cũng là phần mềm mới xuất hiện từ khoảng những năm 1993 nên việc có những nghiên cứu sâu sắc về nó tương đối ít. Cộng thêm sự non kém kinh nghiệm của sinh viên nên khi thực hiện nghiên cứu bằng phần mềm này còn nhiều bất cập và chỗ chưa chính xác.

6 TÀI LIỆU THAM KHẢO

[1] Rajendran, S. (2022) Milk quality prediction, Kaggle. Available at: https://www.kaggle.com/datasets/cpluzshrijayan/milkquality.

[2] Trần Kim Thanh, Trần Mạnh Tường, Vũ Anh Linh Duy: “Giáo trình Phân tích dữ liệu định tính”, trường Đại học Tài chính – Marketing, Thành phố Hồ Chí Minh.

LS0tDQp0aXRsZTogIlRp4buDdSBsdeG6rW4iDQphdXRob3I6ICJOZ3V54buFbiBRdeG7kWMgVmluaCINCmRhdGU6ICIyMDIzLTA3LTMxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IG5vDQogICAgICBkZl9wcmludDogcGFnZWQNCiAgICAgIGhpZ2hsaWdodDoga2F0ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KRmlsZSBQZGYNCg0KaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xTFUzWjdUZ1VXUVl5RGNQM0JDN25malpjQmRQVnpGdVkvdmlldz91c3A9c2hhcmluZw0KDQpGaWxlIGThu68gbGnhu4d1IGV4Y2VsDQoNCmh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFmX1pWNnltbmlMczRHTnJhTzJIQ3VVQV9COVctdWZzcy9lZGl0P3VzcD1zaGFyaW5nJm91aWQ9MTExOTc2MDQ3Mzg4NzYxNzI4MTAzJnJ0cG9mPXRydWUmc2Q9dHJ1ZQ0KDQojIFBI4bqmTiBN4bueIMSQ4bqmVQ0KDQojIyBMw70gZG8gY2jhu41uIMSR4buBIHTDoGkgDQoNClPhu69hIGzDoCBt4buZdCB0cm9uZyBuaOG7r25nIHRo4buxYyBwaOG6qW0gcXVhbiB0cuG7jW5nIHbDoCBwaOG7lSBiaeG6v24gdHJvbmcgY2jhur8gxJHhu5kgZGluaCBkxrDhu6FuZyBj4bunYSBjb24gbmfGsOG7nWksIMSR4bq3YyBiaeG7h3QgbMOgIHRy4bq7IGVtLiBT4buvYSBjdW5nIGPhuqVwIG5oaeG7gXUgY2jhuqV0IGRpbmggZMaw4buhbmcgY+G6p24gdGhp4bq/dCBjaG8gc+G7sSBwaMOhdCB0cmnhu4NuIHbDoCBi4bqjbyB24buHIHPhu6ljIGto4buPZSBj4bunYSBjxqEgdGjhu4MuIFR1eSBuaGnDqm4sIGNo4bqldCBsxrDhu6NuZyBz4buvYSBjw7MgdGjhu4MgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSBuaGnhu4F1IHnhur91IHThu5Ega2jDoWMgbmhhdSwgdOG7qyBxdcOhIHRyw6xuaCBz4bqjbiB4deG6pXQsIGNo4bq/IGJp4bq/biwgYuG6o28gcXXhuqNuIMSR4bq/biB0acOqdSB0aOG7pS4gVmnhu4djIMSRw6FuaCBnacOhIHbDoCBraeG7g20gc2/DoXQgY2jhuqV0IGzGsOG7o25nIHPhu69hIGzDoCBy4bqldCBj4bqnbiB0aGnhur90IMSR4buDIMSR4bqjbSBi4bqjbyBhbiB0b8OgbiB2w6AgaGnhu4d1IHF14bqjIGNobyBuZ8aw4budaSB0acOqdSBkw7luZy4gDQoNCkPDsyBuaGnhu4F1IHnhur91IHThu5EgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBjaOG6pXQgbMaw4bujbmcgc+G7r2EsIHThu6sgZ2lhaSDEkW/huqFuIG51w7RpIGLDsiBz4buvYSwgdGh1IGhv4bqhY2gsIHbhuq1uIGNodXnhu4NuLCBjaOG6vyBiaeG6v24sIGLhuqNvIHF14bqjbiDEkeG6v24gdGnDqnUgdGjhu6UuIE7hur91IGtow7RuZyDEkcaw4bujYyBraeG7g20gc2/DoXQgdsOgIHF14bqjbiBsw70gdOG7kXQsIGPDoWMgeeG6v3UgdOG7kSBuw6B5IGPDsyB0aOG7gyBsw6BtIGdp4bqjbSBjaOG6pXQgbMaw4bujbmcgc+G7r2EgaG/hurdjIGfDonkgcmEgY8OhYyBuZ3V5IGPGoSBhbiB0b8OgbiB0aOG7sWMgcGjhuqltIGNobyBuZ8aw4budaSB0acOqdSBkw7luZy4gVsOtIGThu6UsIG7hur91IGLDsiBz4buvYSBi4buLIG5oaeG7hW0ga2h14bqpbiBob+G6t2Mgc+G7rSBk4bulbmcgdGh14buRYyBraMOhbmcgc2luaCBxdcOhIGxp4buBdSwgc+G7r2EgY8OzIHRo4buDIGNo4bupYSBjw6FjIHZpIHNpbmggduG6rXQgZ8OieSBi4buHbmggaG/hurdjIGPDoWMgZMawIGzGsOG7o25nIHRodeG7kWMga2jDoW5nIHNpbmguIE7hur91IHPhu69hIGtow7RuZyDEkcaw4bujYyB24bqtbiBjaHV54buDbiB2w6AgYuG6o28gcXXhuqNuIOG7nyBuaGnhu4d0IMSR4buZIHRow61jaCBo4bujcCwgc+G7r2EgY8OzIHRo4buDIGLhu4sgw7RpIHRoaXUgaG/hurdjIGNodWEuIE7hur91IHPhu69hIGtow7RuZyDEkcaw4bujYyBjaOG6vyBiaeG6v24gdGhlbyBxdXkgdHLDrG5oIHRpw6p1IGNodeG6qW4sIHPhu69hIGPDsyB0aOG7gyBi4buLIHBoYSB0cuG7mW4gaG/hurdjIGdp4bqjbSBow6BtIGzGsOG7o25nIGRpbmggZMaw4buhbmcuDQoNClbhu5tpIG1vbmcgbXXhu5FuIGfDs3AgcGjhuqduIG7Dom5nIGNhbyBjaOG6pXQgbMaw4bujbmcgY3Xhu5ljIHPhu5FuZyBj4bunYSBuZ8aw4budaS4gVMO0aSDEkcOjIG5naMSpIMSR4bq/biDEkcOoIHTDoGkgbmdoacOqbiBj4bupdSAqKlBow6JuIHTDrWNoIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gY2jhuqV0IGzGsOG7o25nIHPhu69hKiogxJHhu4MgZ8OzcCBwaOG6p24gdOG6oW8gbsOqbiBuZ3Xhu5NuIG7Eg25nIGzGsOG7o25nIHThu6sgc+G7r2EgY2hvIGNvbiBuZ8aw4budaSB2w6AgcGjhuqduIG7DoG8gZ2nhuqNpIHF1eeG6v3QgY8OhYyB24bqlbiDEkeG7gSB0aOG7sWMgdGnhu4VuIHRyb25nIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCBz4buvYS4gVMO0aSBoeSB24buNbmcgcuG6sW5nIHF1YSDEkeG7gSB0w6BpIG7DoHksIHTDtGkgY8OzIHRo4buDIMSRw7NuZyBnw7NwIHbDoG8gdmnhu4djIG7Dom5nIGNhbyBuaOG6rW4gdGjhu6ljIHbDoCBraeG6v24gdGjhu6ljIGPhu6dhIG5nxrDhu51pIHRpw6p1IGTDuW5nIHbhu4EgY2jhuqV0IGzGsOG7o25nIHPhu69hLiBUw7RpIGPFqW5nIG1vbmcgbXXhu5FuIHLhurFuZyDEkeG7gSB0w6BpIG7DoHkgc+G6vSBsw6AgbeG7mXQgbmd14buTbiB0aMO0bmcgdGluIGjhu691IMOtY2ggY2hvIGPDoWMgbmjDoCBz4bqjbiB4deG6pXQsIGNo4bq/IGJp4bq/biB2w6AgcXXhuqNuIGzDvSBz4buvYSB0cm9uZyB2aeG7h2MgY+G6o2kgdGhp4buHbiB2w6AgZHV5IHRyw6wgY2jhuqV0IGzGsOG7o25nIHPhu69hLg0KDQojIyBN4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1DQoNCsSQw6FuaCBnacOhIGPDoWMgeeG6v3UgdOG7kSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGNo4bqldCBsxrDhu6NuZyBz4buvYS4gVOG7qyDEkcOzLCBnacO6cCBuZ8aw4budaSBuw7RuZyBkw6JuIGNoxINuIG51w7RpIMSRxqFuIGzhursgaG/hurdjIGPDoWMgdHJhbmcgdHLhuqFpIGLDsiBz4buvYSBjw7MgdGjhu4MgaGnhu4N1IHRow6ptIHbhu4EgY8OhYyB54bq/dSB04buRIGzDoG0g4bqjbmggaMaw4bufbmcgxJHhur9uIGNo4bqldCBsxrDhu6NuZyBuZ3Xhu5NuIHPhu69hLiBHacO6cCBo4buNIGPDsyB0aOG7gyBuaOG6rW4gcmEgY8OhYyDEkWnhu4NtIHnhur91IGzDoG0g4bqjbmggaMaw4bufbmcgxJHhur9uIGNo4bqldCBsxrDhu6NuZyBz4buvYSBjxaluZyBuaMawIHZp4buHYyBsw6BtIG5oxrAgdGjhur8gbsOgbyDEkeG7gyB04bqhbyByYSBuZ3Xhu5NuIHPhu69hIG5oaeG7gXUgdsOgIGNo4bqldCBsxrDhu6NuZyBjdW5nIGPhuqVwIHJhIHRo4buLIHRyxrDhu51uZy4NCg0KIyMgxJDhu5FpIHTGsOG7o25nIHbDoCBwaOG6oW0gdmkgbmdoacOqbiBj4bupdQ0KDQoqIMSQ4buRaSB0xrDhu6NuZzogDQoNCiAgKiBDaOG6pXQgbMaw4bujbmcgc+G7r2EuDQoNCiogUGjhuqFtIHZpIG5naGnDqm4gY+G7qXU6DQoNCiAgKiDEkOG7gyB0aOG7sWMgaGnhu4duIMSR4buBIHTDoGkgbsOgeSwgdMO0aSDEkcOjIHRodSB0aOG6rXAgxJHGsOG7o2MgbeG7mXQgYuG7mSBk4buvIGxp4buHdSB04burIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20uIA0KICAqIELhu5kgZOG7ryBsaeG7h3UgZ+G7k20gY8OzIDEwNTkgbeG6q3UgcXVhbiBzw6F0LCBjw7MgNyBiaeG6v24gbMOgIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gY2jhuqV0IGzGsOG7o25nIHPhu69hLCBiYW8gZ+G7k206IHBILCBUZW1wcmF0dXJlLCBPZG9yLCBGYXQsIFR1cmJpZGl0eSwgQ29sb3VyIHbDoCBUYXN0ZS4gQmnhur9uIEdyYWRlICpjaOG6pXQgbMaw4bujbmcgY+G7p2Egc+G7r2EqIGNow61uaCBsw6AgYmnhur9uIHBo4bulIHRodeG7mWMgbcOgIGNow7puZyB0YSBj4bqnbiBwaMOibiB0w61jaCAuIA0KDQojIyBQaMawxqFuZyBwaMOhcCBuZ2hpw6puIGPhu6l1DQoNClBoxrDGoW5nIHBow6FwIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmguDQoNClTDtGkgxJHDoyBz4butIGThu6VuZyBjw6FjIHBoxrDGoW5nIHBow6FwIHRo4buRbmcga8OqIHRvw6FuIGjhu41jIMSR4buDIG3DtCB04bqjIHbDoCBzdXkgbHXhuq1uIMSR4buDIGtow6FtIHBow6EgdsOgIHBow6JuIHTDrWNoIGPDoWMgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biBuw6B5LiBUw7RpIGPFqW5nIMSRw6MgeMOieSBk4buxbmcgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IHbDoCBwaMOibiBsb+G6oWkgxJHhu4MgZOG7sSBiw6FvIHbDoCBwaMOibiBsb+G6oWkgY2jhuqV0IGzGsOG7o25nIHPhu69hIGThu7FhIHRyw6puIGPDoWMgYmnhur9uIMSR4bqndSB2w6BvLg0KDQpQaOG6p24gbeG7gW0gUiAmIFJTdHVkaW8gbMOgIG3hu5l0IGPDtG5nIGPhu6UgbeG7m2kgbmjGsG5nIGtow6EgxJHGsOG7o2MgxrBhIGTDuW5nIHRyb25nIHRo4buRbmcga8OqIHbDoCB44butIGzDvSBk4buvIGxp4buHdSAtIHPhur0gIHbDrCBjw6FjIHTDrW5oIG7Eg25nIGjhu5cgdHLhu6MgcGjDom4gdMOtY2ggY8WpbmcgbmjGsCB24bq9IGJp4buDdSDEkeG7kyBuaGFuaCBjaMOzbmcuIFRyb25nIGLDoGkgcGjDom4gdMOtY2ggbsOgeSBSICYgUlN0dWRpbyBz4bq9IGjhu5cgdHLhu6MgY2jDrW5oIGNobyB2aeG7h2MgbmdoacOqbiBj4bupdSwgxJHDoW5oIGdpw6EuDQoNCiMjIEvhur90IGPhuqV1IMSR4buBIHTDoGkNCiogQsOgaSBuZ2hpw6puIGPhu6l1IGfhu5NtIGPDsyA0IGNoxrDGoW5nOg0KDQogICogQ2jGsMahbmcgMS4gVOG7lW5nIHF1YW4gbMO9IHRodXnhur90Lg0KICAqIENoxrDGoW5nIDIuIFBoxrDGoW5nIHBow6FwIG5naGnDqm4gY+G7qXUNCiAgKiBDaMawxqFuZyAzLiBL4bq/dCBxdeG6oyBtw7QgaMOsbmggbmdoacOqbiBj4bupdS4NCiAgKiBDaMawxqFuZyA0LiBL4bq/dCBsdeG6rW4gdsOgIGjhuqFuIGNo4bq/Lg0KDQojIENIxq/GoE5HIDEuIFThu5RORyBRVUFOIEzDnSBUSFVZ4bq+VA0KDQojIyBOZ8OgbmggY8O0bmcgbmdoaeG7h3Agc+G7r2EgdHJvbmcgbsaw4bubYw0KDQpOZ8OgbmggY8O0bmcgbmdoaeG7h3Agc+G7r2EgVmnhu4d0IE5hbSBsw6AgbeG7mXQgdHJvbmcgbmjhu69uZyBuZ8OgbmggY8OzIHZhaSB0csOyIHF1YW4gdHLhu41uZyB0cm9uZyBu4buBbiBraW5oIHThur8gdsOgIMSR4budaSBz4buRbmcgY+G7p2EgbmfGsOG7nWkgZMOibi4gTmfDoG5oIG7DoHkga2jDtG5nIGNo4buJIGN1bmcgY+G6pXAgY8OhYyBz4bqjbiBwaOG6qW0gZGluaCBkxrDhu6FuZywgY2jEg20gc8OzYyBz4bupYyBraOG7j2UgY2hvIGjDoG5nIHRyaeG7h3UgbmfGsOG7nWkgdGnDqnUgZMO5bmcsIG3DoCBjw7JuIGfDs3AgcGjhuqduIHBow6F0IHRyaeG7g24gbsO0bmcgbmdoaeG7h3AsIHThuqFvIHZp4buHYyBsw6BtLCB0xINuZyB0aHUgbmjhuq1wIGNobyBjw6FjIGjhu5kgY2jEg24gbnXDtGkgYsOyIHPhu69hLCB2w6AgxJHDs25nIGfDs3AgdsOgbyBuZ8OibiBzw6FjaCBuaMOgIG7GsOG7m2MuIE5nw6BuaCBz4buvYSBWaeG7h3QgTmFtIGPFqW5nIMSRw6MgY8OzIG5o4buvbmcgYsaw4bubYyB0aeG6v24gdsaw4bujdCBi4bqtYyB0cm9uZyB2aeG7h2MgbsOibmcgY2FvIGNo4bqldCBsxrDhu6NuZyBz4bqjbiBwaOG6qW0sIMSRYSBk4bqhbmcgaMOzYSBt4bqrdSBtw6MgdsOgIGNo4bunbmcgbG/huqFpLCDDoXAgZOG7pW5nIGPDtG5nIG5naOG7hyBoaeG7h24gxJHhuqFpLCB2w6AgbeG7nyBy4buZbmcgdGjhu4sgdHLGsOG7nW5nIHh14bqldCBraOG6qXUuDQoNCk5nw6BuaCBz4buvYSBWaeG7h3QgTmFtIGLhuq90IMSR4bqndSBwaMOhdCB0cmnhu4NuIHThu6sgbmjhu69uZyBuxINtIDE5MjAsIGtoaSBjw6FjIHRyYW5nIHRy4bqhaSBiw7Igc+G7r2Egbmjhu48gbOG6uyDEkcaw4bujYyB0aMOgbmggbOG6rXAgxJHhu4MgY3VuZyBj4bqlcCBz4buvYSB0xrDGoWkgY2hvIHRo4buLIHRyxrDhu51uZyDEkeG7i2EgcGjGsMahbmcuIFNhdSDEkcOzLCB2w6BvIG5o4buvbmcgbsSDbSAxOTcwLCBjw6FjIGRvYW5oIG5naGnhu4dwIHPhuqNuIHh14bqldCBz4buvYSDEkcaw4bujYyBow6xuaCB0aMOgbmggdsOgIHBow6F0IHRyaeG7g24sIHRyb25nIMSRw7MgY8OzIEPDtG5nIHR5IEPhu5UgcGjhuqduIFPhu69hIFZp4buHdCBOYW0gKFZpbmFtaWxrKSBsw6AgZG9hbmggbmdoaeG7h3AgdGnDqm4gcGhvbmcgdsOgIGzhu5tuIG5o4bqldCB0cm9uZyBuZ8OgbmguIMSQ4bq/biBuYXksIG5nw6BuaCBz4buvYSBWaeG7h3QgTmFtIMSRw6MgY8OzIGjGoW4gMjAwIGRvYW5oIG5naGnhu4dwIGhv4bqhdCDEkeG7mW5nIHbhu5tpIHF1eSBtw7QgbOG7m24gbmjhu48ga2jDoWMgbmhhdSwgdHJvbmcgxJHDsyBjw7MgY8OhYyBkb2FuaCBuZ2hp4buHcCB0cm9uZyBuxrDhu5tjIG5oxrAgVmluYW1pbGssIFRIIFRydWUgTWlsaywgTnV0aWZvb2QsIE3hu5ljIENow6J1IE1pbGssIHbDoCBjw6FjIGRvYW5oIG5naGnhu4dwIG7GsOG7m2Mgbmdvw6BpIG5oxrAgRnJpZXNsYW5kQ2FtcGluYSAoRHV0Y2ggTGFkeSksIE5lc3Rsw6ksIEFiYm90dCwgTWVhZCBKb2huc29uLg0KDQpUaGVvIEV1cm9tb25pdG9yLCB0aOG7iyB0csaw4budbmcgc+G7r2EgVmnhu4d0IE5hbSDEkeG6oXQgZ2nDoSB0cuG7iyAxMzUuMDAwIHThu7cgxJHhu5NuZyB2w6BvIG7Eg20gMjAyMCwgdMSDbmcgaMahbiA4JSBzbyB24bubaSBuxINtIDIwMTkuIEPDoWMgc+G6o24gcGjhuqltIGNo4bunIGzhu7FjIGPhu6dhIG5nw6BuaCBiYW8gZ+G7k20gc+G7r2EgYuG7mXQsIHPhu69hIHRoYW5oIHRyw7luZywgc+G7r2EgY2h1YSwgcGhvIG3DoXQsIGLGoSB2w6AgY8OhYyBz4bqjbiBwaOG6qW0gdOG7qyBz4buvYSBraMOhYy4gVHJvbmcgxJHDsywgc+G7r2EgdGhhbmggdHLDuW5nIGzDoCBwaMOibiBraMO6YyBjw7MgZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQgdsOgIHTEg25nIHRyxrDhu59uZyBjYW8gbmjhuqV0IHRyb25nIG5nw6BuaC4gDQoNCiMjIFRodeG6rW4gbOG7o2kgdsOgIGtow7Mga2jEg24NCg0KIyMjIFRodeG6rW4gbOG7o2kNCg0KU+G7sSB0xINuZyB0csaw4bufbmcgY+G7p2EgdGjhu4sgdHLGsOG7nW5nIMSRxrDhu6NjIHRow7pjIMSR4bqpeSBi4bufaSBjw6FjIHnhur91IHThu5Egc2F1Og0KDQotIE5odSBj4bqndSB0acOqdSBkw7luZyBz4buvYSBuZ8OgeSBjw6BuZyB0xINuZyBkbyBkw6JuIHPhu5EgdMSDbmcsIHRodSBuaOG6rXAgbmfGsOG7nWkgZMOibiB0xINuZyB2w6Agbmjhuq1uIHRo4bupYyB24buBIGNoxINtIHPDs2Mgc+G7qWMga2jhu49lIGPhu6dhIG5nxrDhu51pIHRpw6p1IGTDuW5nIGPhuqNpIHRoaeG7h24uDQoNCi0gQ2jDrW5oIHPDoWNoIGjhu5cgdHLhu6MgY+G7p2EgbmjDoCBuxrDhu5tjIGNobyBuZ8Ogbmggc+G7r2EgdGjDtG5nIHF1YSBjw6FjIGNoxrDGoW5nIHRyw6xuaCBuaMawICJT4buvYSBo4buNYyDEkcaw4budbmciLCAiU+G6o24geHXhuqV0IGLDsiBz4buvYSIsICJI4buXIHRy4bujIGdpw6Egc+G7r2EgY2hvIHRy4bq7IGVtIiB2w6AgY8OhYyDGsHUgxJHDo2kgdGh14bq/IGNobyBjw6FjIGRvYW5oIG5naGnhu4dwIHPhuqNuIHh14bqldCBz4buvYS4NCg0KLSBT4buxIMSR4bqndSB0xrAgY+G7p2EgY8OhYyBkb2FuaCBuZ2hp4buHcCB0cm9uZyB2w6Agbmdvw6BpIG7GsOG7m2MgdsOgbyBuZ8Ogbmggc+G7r2EgdGjDtG5nIHF1YSB2aeG7h2MgeMOieSBk4buxbmcgY8OhYyBuaMOgIG3DoXkgc+G6o24geHXhuqV0IGhp4buHbiDEkeG6oWksIG3hu58gcuG7mW5nIGNodeG7l2kgY3VuZyDhu6luZyBiw7Igc+G7r2EsIHBow6F0IHRyaeG7g24gY8OhYyBz4bqjbiBwaOG6qW0gbeG7m2kgdGhlbyB4dSBoxrDhu5tuZyB0acOqdSBkw7luZywgdsOgIHRoYW0gZ2lhIGPDoWMgaGnhu4dwIMSR4buLbmggdGjGsMahbmcgbeG6oWkgdOG7sSBkbyDEkeG7gyBt4bufIHLhu5luZyB0aOG7iyB0csaw4budbmcgeHXhuqV0IGto4bqpdS4NCg0KIyMjIEtow7Mga2jEg24NCg0KVHV5IG5oacOqbiwgbmfDoG5oIHPhu69hIFZp4buHdCBOYW0gY8WpbmcgxJFhbmcgxJHhu5FpIG3hurd0IHbhu5tpIG3hu5l0IHPhu5EgdGjDoWNoIHRo4bupYyB2w6AgY8ahIGjhu5lpIHRyb25nIHTGsMahbmcgbGFpLCBuaMawOg0KDQotIFPhu7EgY+G6oW5oIHRyYW5oIGto4buRYyBsaeG7h3QgdOG7qyBjw6FjIGRvYW5oIG5naGnhu4dwIG7GsOG7m2Mgbmdvw6BpIGPDsyB1eSB0w61uIHbDoCBjaOG6pXQgbMaw4bujbmcgY2FvLCDEkeG6t2MgYmnhu4d0IGzDoCB0cm9uZyBwaMOibiBraMO6YyBz4buvYSBi4buZdCBjaG8gdHLhursgZW0uDQoNCi0gU+G7sSB0aGnhur91IGjhu6V0IG5ndeG7k24gY3VuZyBz4buvYSB0xrDGoWkgdHJvbmcgbsaw4bubYyBkbyBuxINuZyBzdeG6pXQgYsOyIHPhu69hIHRo4bqlcCwgY2hpIHBow60gY2jEg24gbnXDtGkgY2FvIHbDoCB0aGnhur91IGjhu6V0IMSR4bqldCBjYW5oIHTDoWMuIEhp4buHbiBuYXksIG5nw6BuaCBz4buvYSBWaeG7h3QgTmFtIHBo4bqjaSBuaOG6rXAga2jhuql1IGtob+G6o25nIDcwJSBuZ3V5w6puIGxp4buHdSBz4buvYSB04burIGPDoWMgbsaw4bubYyBuaMawIE5ldyBaZWFsYW5kLCBN4bu5LCBBdXN0cmFsaWEgdsOgIGNow6J1IMOCdS4NCg0KLSBT4buxIHRoYXkgxJHhu5VpIGPhu6dhIHRo4buLIGhp4bq/dSB2w6Agbmh1IGPhuqd1IGPhu6dhIG5nxrDhu51pIHRpw6p1IGTDuW5nLCDEkcOyaSBo4buPaSBjw6FjIGRvYW5oIG5naGnhu4dwIHBo4bqjaSBsacOqbiB04bulYyBj4bqjaSB0aeG6v24gdsOgIMSR4buVaSBt4bubaSBz4bqjbiBwaOG6qW0gxJHhu4MgcGjDuSBo4bujcCB24bubaSB4dSBoxrDhu5tuZyB0acOqdSBkw7luZy4gTeG7mXQgc+G7kSB4dSBoxrDhu5tuZyB0acOqdSBkw7luZyBoaeG7h24gbmF5IGJhbyBn4buTbSBjw6FjIHPhuqNuIHBo4bqpbSBz4buvYSBo4buvdSBjxqEsIHPhu69hIGtow7RuZyBsYWN0b3NlLCBz4buvYSBjaOG7qWMgbsSDbmcgdsOgIHPhu69hIHRo4buxYyB24bqtdC4NCg0KTmfDoG5oIGPDtG5nIG5naGnhu4dwIHPhu69hIFZp4buHdCBOYW0gbMOgIG3hu5l0IG5nw6BuaCBjw7MgdGnhu4FtIG7Eg25nIGzhu5tuIMSR4buDIHBow6F0IHRyaeG7g24gdHJvbmcgYuG7kWkgY+G6o25oIGtpbmggdOG6vyB0b8OgbiBj4bqndSBo4buZaSBuaOG6rXAgdsOgIGjhu6NwIHTDoWMuIMSQ4buDIGR1eSB0csOsIHbDoCBuw6JuZyBjYW8gduG7iyB0aOG6vyBj4bunYSBtw6xuaCB0csOqbiB0aOG7iyB0csaw4budbmcgdHJvbmcgdsOgIG5nb8OgaSBuxrDhu5tjLCBjw6FjIGRvYW5oIG5naGnhu4dwIG5nw6BuaCBz4buvYSBj4bqnbiBwaOG6o2kgdOG6rW4gZOG7pW5nIGPDoWMgY8ahIGjhu5lpLCB2xrDhu6N0IHF1YSBjw6FjIHRow6FjaCB0aOG7qWMsIHbDoCBraMO0bmcgbmfhu6tuZyBuw6JuZyBjYW8gbsSDbmcgbOG7sWMgc+G6o24geHXhuqV0LCBjaOG6pXQgbMaw4bujbmcgc+G6o24gcGjhuqltIHbDoCBoaeG7h3UgcXXhuqMga2luaCBkb2FuaC4NCg0KIyBDSMavxqBORyAyLiBQSMavxqBORyBQSMOBUCBOR0hJw4pOIEPhu6hVDQoNCiMjIEPDoWMgcGFja2FnZSBz4butIGThu6VuZyB0cm9uZyBiw6BpDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShjYXJldCkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KYGBgDQoNCiMjIEThu68gbGnhu4d1IG5naGnDqm4gY+G7qXUNCg0KIyMjIE3DtCB04bqjIGLhu5kgZOG7ryBsaeG7h3UNCg0KQuG7mSBk4buvIGxp4buHdSBuw6B5IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHBow6JuIHTDrWNoIHbDoCBraMOhbSBwaMOhIGPDoWMgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGNo4bqldCBsxrDhu6NuZyBz4buvYSwgY8WpbmcgbmjGsCDEkeG7gyB4w6J5IGThu7FuZyBjw6FjIG3DtCBow6xuaCBk4buxIGLDoW8gdsOgIHBow6JuIGxv4bqhaSBjaOG6pXQgbMaw4bujbmcgc+G7r2EuIELhu5kgZOG7ryBsaeG7h3UgbsOgeSBjxaluZyBjw7MgdGjhu4MgZ2nDunAgY2hvIGPDoWMgbmjDoCBz4bqjbiB4deG6pXQsIGNo4bq/IGJp4bq/biB2w6AgdGnDqnUgdGjhu6Ugc+G7r2EgbsOibmcgY2FvIGhp4buDdSBiaeG6v3QgdsOgIGtp4buDbSBzb8OhdCBjaOG6pXQgbMaw4bujbmcgc+G7r2EgbeG7mXQgY8OhY2ggdOG7kXQgaMahbi4NCg0KQuG7mSBk4buvIGxp4buHdSBuw6B5IGfhu5NtIGPDsyAxMDU5IG3huqt1IHF1YW4gc8OhdCwgY8OzIDcgYmnhur9uIGzDoDogcEgsIFRlbXByYXR1cmUsIFRhc3RlLCBPZG9yLCBGYXQsIFR1cmJpZGl0eSwgQ29sb3VyIHbDoCAxIGJp4bq/biBHcmFkZSBsw6AgYmnhur9uIMSR4buLbmggdMOtbmggcGjhu6UgdGh14buZYyB2w6BvIGPDoWMgYmnhur9uIG7DoHkuDQoNCiMjIyBNw7QgdOG6oyBjw6FjIGJp4bq/bg0KDQoqIEJp4bq/biDEkeG7i25oIHTDrW5oICANCiAgKiBUYXN0ZTogxJDDonkgbMOgIGJp4bq/biDEkeG7i25oIHTDrW5oIGPDsyBuZ2jEqWEgbMOgICpoxrDGoW5nIHbhu4sqIGPhu6dhIHPhu69hLiBT4buvYSBjw7MgaMawxqFuZyB24buLIGtoaSBu4bq/bSB2w6BvIGtow7RuZyBuZ29uIHPhur0gxJHGsOG7o2MgxJHDoW5oIHPhu5EgKDApLCBz4buvYSBjw7MgaMawxqFuZyB24buLIGtoaSBu4bq/bSB2w6BvIG5nb24gc+G6vSDEkcaw4bujYyDEkcOhbmggc+G7kSAoMSkuDQogICogT2RvcjogxJDDonkgbMOgIGJp4bq/biDEkeG7i25oIHTDrW5oIGPDsyBuZ2jEqWEgbMOgICptw7lpKiBj4bunYSBz4buvYS4gU+G7r2EgY8OzIG3DuWkga2hpIG5n4butaSBraMO0bmcgdGjGoW0gc+G6vSDEkcaw4bujYyDEkcOhbmggc+G7kSAoMCksIHPhu69hIGPDsyBtw7lpIGtoaSBuZ+G7rWkgdGjGoW0gc+G6vSDEkcaw4bujYyDEkcOhbmggc+G7kSAoMSkuDQogICogRmF0OiDEkMOieSBsw6AgYmnhur9uIMSR4buLbmggdMOtbmggY8OzIG5naMSpYSBsw6AgKsSR4buZIGLDqW8qIGPhu6dhIHPhu69hLiBT4buvYSBjw7MgxJHhu5kgYsOpbyB0aOG6pXAgc+G6vSDEkcaw4bujYyDEkcOhbmggc+G7kSAoMCksIHPhu69hIGPDsyDEkeG7mSBiw6lvIGNhbyBz4bq9IMSRxrDhu6NjIMSRw6FuaCBz4buRICgxKS4NCiAgKiBUdXJiaWRpdHk6IMSQw6J5IGzDoCBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgbmdoxKlhIGzDoCAqxJHhu5kgxJHhu6VjKiBj4bunYSBz4buvYS4gU+G7r2EgY8OzIMSR4buZIMSR4bulYyB0aOG6pXAgc+G6vSDEkcaw4bujYyDEkcOhbmggc+G7kSAoMCksIHPhu69hIGPDsyDEkeG7mSDEkeG7pWMgY2FvIHPhur0gxJHGsOG7o2MgxJHDoW5oIHPhu5EgKDEpLiAgDQogICogR3JhZGU6IMSQw6J5IGzDoCBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgbmdoxKlhIGzDoCAqY2jhuqV0IGzGsOG7o25nKiBj4bunYSBz4buvYS4gU+G7r2EgY8OzIGNo4bqldCBsxrDhu6NuZyB0aOG6pXAgc+G6vSDEkcOhbmggc+G7kSAoMCksIHPhu69hIGPDsyBjaOG6pXQgbMaw4bujbmcgY2FvIHPhur0gxJHDoW5oIHPhu5EgKDEpLg0KDQoqIEJp4bq/biDEkeG7i25oIGzGsOG7o25nOiAgDQogICogcEg6IMSQw6J5IGzDoCBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyBjw7MgbmdoxKlhIGzDoCAqxJHhu5kgcEgqIGPhu6dhIHPhu69hLiDEkOG7mSBwSCBj4bunYSBz4buvYSBkYW8gxJHhu5luZyB04burIDMgxJHhur9uIDksNSwgxJHhu5kgcEggcGjDuSBo4bujcCBuaOG6pXQgbuG6sW0g4bufIGtob+G6o25nIDYsMjUgxJHhur9uIDYsOTAuDQogICogVGVtcHJhdHVyZTogxJDDonkgbMOgIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGPDsyBuZ2jEqWEgbMOgICpuaGnhu4d0IMSR4buZKiBj4bunYSBz4buvYS4gTmhp4buHdCDEkeG7mSBj4bunYSBz4buvYSBkYW8gxJHhu5luZyB04burIDM0IMSR4bq/biA5MCwgbmhp4buHdCDEkeG7mSBwaMO5IGjhu6NwIG5o4bqldCBu4bqxbSDhu58ga2hv4bqjbmcgMzQgxJHhur9uIDQ1LDIwLg0KICAqIENvbG91cjogxJDDonkgbMOgIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGPDsyBuZ2jEqWEgbMOgICptw6B1KiBj4bunYSBz4buvYS4gTcOgdSBj4bunYSBz4buvYSBkYW8gxJHhu5luZyB04burIDI0MCDEkeG6v24gMjU1LCBwaMOibiBtw6B1IHBow7kgaOG7o3AgbmjhuqV0IG7hurFtIOG7nyBraG/huqNuZyAyNDUgxJHhur9uIDI1NS4NCiAgDQojIyMgROG7ryBsaeG7h3UNCmBgYHtyfQ0KbWlsa25ldyA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9BU1VTL0Rvd25sb2Fkcy9taWxrbmV3Lnhsc3giKQ0KVmlldyhtaWxrbmV3KQ0KbGlicmFyeShEVCkNCm1pbGtuZXcgJT4lIERUOjpkYXRhdGFibGUobWlsa25ldykNCmBgYA0KDQojIyBYw6FjIMSR4buLbmggYmnhur9uIHBo4bulIHRodeG7mWMNCg0KIyMjIEJp4bq/biDEkeG7i25oIHTDrW5oDQoNCkJp4bq/biDEkeG7i25oIHTDrW5oIEdyYWRlIHPhur0gxJHGsOG7o2MgY2jhu41uIGzDoCBiaeG6v24gxJHhu4tuaCB0w61uaCBwaOG7pSB0aHXhu5ljIGLhu59pIHbDrDogIA0KDQoqIE3hu6VjIMSRw61jaCBj4bunYSBiw6BpIGzDoCBwaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGNo4bqldCBsxrDhu6NuZyBz4buvYS4gQ2jDrW5oIHbDrCBs4bq9IMSRw7MgbsOqbiB0YSBz4bq9IHF1YW4gc8OhdCB4ZW0gY8OhYyBiaeG6v24gcEgsIFRlbXByYXR1cmUsIFRhc3RlLCBPZG9yLCBGYXQsIFR1cmJpZGl0eSB2w6AgQ29sb3VyIHPhur0g4bqjbmggaMaw4bufbmcgxJHhur9uIGJp4bq/biBHcmFkZSB0aOG6vyBuw6BvLg0KKiBYw6l0IHRyw6puIHBoxrDGoW5nIGRp4buHbiB0aOG7sWMgdOG6vywgY2jhuqV0IGzGsOG7o25nIHPhu69hIGPFqW5nIHPhur0gxJHGsOG7o2MgxJHDoW5oIGdpw6EgZOG7sWEgdHLDqm4gY8OhYyB0acOqdSBjaMOtIG7hu5NuZyDEkeG7mSwgaMawxqFuZyB24buLLCDEkeG7mSBiw6lvLCBtw6B1IHPhuq9jLC4uLg0KDQojIyMgQmnhur9uIMSR4buLbmggbMaw4bujbmcNCg0KQmnhur9uIMSR4buLbmggbMaw4bujbmcgQ29sb3VyIHPhur0gxJHGsOG7o2MgY2jhu41uIGzDoG0gYmnhur9uIHBo4bulIHRodeG7mWMgYuG7n2kgdsOsOg0KDQoqIE3DoHUgc+G7r2EgcGjhuqduIG7DoG8gc+G6vSB0aOG7gyBoaeG7h24gxJHGsOG7o2MgY2jhuqV0IGzGsOG7o25nIGPhu6dhIHPhu69hIHbDoCBuw7MgY8OzIHRo4buDIGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgY8OhYyB54bq/dSB04buRIMSRxrDhu6NjIG7DqnUgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4NCg0KIyMgTcO0IGjDrG5oIG5naGnDqm4gY+G7qXUNCg0KIyMjIE3DtCBow6xuaCB0dXnhur9uIHTDrW5oDQoNCkdMTSAoR2VuZXJhbCBMaW5lYXIgTW9kZWwpIGzDoCBt4buZdCBtw7QgaMOsbmggdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgZ2nhuqNpIHRow61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3hu5l0IGjDoG0ga+G7syB24buNbmcgY8OzIMSRaeG7gXUga2nhu4duIHbhu5tpIGPDoWMgYmnhur9uIGdp4bqjaSB0aMOtY2ggdGjDtG5nIHF1YSBt4buZdCBwaMawxqFuZyB0csOsbmggZOG7sSDEkW/DoW4gY8OzIGThuqFuZyB0dXnhur9uIHTDrW5oLg0KICANCkdMTSBwaOG7lSBiaeG6v24gdsOsIG7DsyBjw7MgdGjhu4MgeOG7rSBsw70gbmhp4buBdSBsb+G6oWkgZOG7ryBsaeG7h3UgduG7m2kgY8OhYyBraeG7g3UgYmnhur9uIHBo4bqjbiDhu6luZyBraMOhYyBuaHVhIG5oxrAgbmjhu4sgdGjhu6ljLCBQb2lzc29uIGhheSDEkWEgdGjhu6ljLg0KICANCsSQ4buDIG3DtCBow6xuaCBow7NhIOG6o25oIGjGsOG7n25nIGPhu6dhIFggbMOgIHPhu60gZOG7pW5nIGThuqFuZyBo4buTaSBxdXkgdHV54bq/biB0w61uaCBj4buVIMSRaeG7g24sIHRoZW8gxJHDsyBnacOhIHRy4buLIGvhu7MgduG7jW5nIGPDsyDEkWnhu4F1IGtp4buHbiBj4bunYSBZIGzDoCBt4buZdCBow6BtIHR1eeG6v24gdMOtbmggY+G7p2EgWC4NCiAgDQogICRccGkoeCkgPSBcYmV0YV8wICsgXGJldGFfMS54JA0KICANCsSQw6J5IGzDoCBHTE0gduG7m2kgdGjDoG5oIHBo4bqnbiBuZ+G6q3Ugbmhpw6puIG5o4buLIHRo4bupYyB2w6AgaMOgbSBsacOqbiBr4bq/dCDEkeG7k25nIG5o4bqldC4gTcO0IGjDrG5oIG7DoHkgxJHGsOG7o2MgZ+G7jWkgbMOgIG3DtCBow6xuaCB4w6FjIHN14bqldCB0dXnhur9uIHTDrW5oIGhheSBMUE0gKF9MaW5lYXIgUHJvYmFiaWxpdHkgTW9kZWxfKS4gJFxiZXRhXzEkIGJp4buDdSB0aOG7iyBjaG8gc+G7sSB0aGF5IMSR4buVaSB4w6FjIHN14bqldCBjaG8gbeG7l2kgxJHGoW4gduG7iyB0aGF5IMSR4buVaSBj4bunYSB4Lg0KICANCiMjIyBNw7QgaMOsbmggaOG7k2kgcXV5IExvZ2lzdGljDQoNCsSQ4buDIGto4bqvYyBwaOG7pWMgbeG7mXQgc+G7kSBo4bqhbiBjaOG6vyBj4bunYSBMUE0sIG5nxrDhu51pIHRhIMSR4buBIHh14bqldCBt4buZdCBow6BtIGxpw6puIGvhur90IG3DoCBuw7MgxJHhu5NuZyBiaeG6v24gduG7m2kgeMOhYyBzdeG6pXQgJFxwaSQgdsOgIGdpw6EgdHLhu4sgYmnhur9uIHRoacOqbiBj4bunYSBuw7MgbMOgIHTDuXkgw70gxJHDsyBsw6AgJGxvZyhcZnJhY3tccGkoeCl9ezEgLSBccGkoeCl9KSQsIMSRxrDhu6NjIGfhu41pIGzDoCBow6BtIGxvZ2lzdGljIGhheSBsb2dpdCgkXHBpJCkuDQogIA0KTcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpdDoNCiAgDQogICRsb2coXGZyYWN7XHBpKHgpfXsxIC0gXHBpKHgpfSkgPSBcYmV0YV8wICsgXGJldGFfMS54XzEgKyBcYmV0YV8yLnhfMiArIC4uLiArXGJldGFfbS54X20kDQogIA0KVHJvbmcgxJHDsyAkXGJldGFfMCwgXGJldGFfMSwuLi4sIFxiZXRhX20kIGzDoCBo4buHIHPhu5EgaOG7k2kgcXV5Lg0KICANCiMjIyBNw7QgaMOsbmggUHJvYml0DQoNCk3DtCBow6xuaCBQcm9iaXQgxJHGsOG7o2Mgc+G7rSBkdW5nIMSR4buDIMaw4bubYyBsxrDhu6NuZyBtw7QgaMOsbmggY8OzIGJp4bq/biBwaOG7pSB0aHXhu5ljIGThuqFuZyBuaOG7iyBwaMOibi4gTcO0IGjDrG5oIFByb2JpdCBsw6AgbeG7mXQgR0xNIHbhu5tpIHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiBuaOG7iyBwaMOibiB2w6AgbGnDqm4ga+G6v3QgUHJvYml0LiBIw6BtIGjDtGkgcXV5IFByb2JpdCBjw7MgZOG6oW5nOg0KICANCiAgJFxwaSh4KSA9IFxwaGkoXGFscGhhICsgXGJldGEgeCkkDQogIA0KVHJvbmcgxJHDsywgJFxwaGkoeCkgPSBcZnJhY3sxfXtcc3FydHsyXHBpfX1caW50X3stXGluZnR5fV57eH1lXnstXGZyYWN7MX17Mn10XjJ9ZHQkIGzDoCBow6BtIHBow6JuIHBo4buRaSBjaHXhuqluIGNow61uaCB04bqvYy4NClbhu5tpICRQcm9iaXQoXHBpKHgpKSA9IFxwaGleey0xfShccGkoeCkpJCwgdGEgY8OzIG3DtCBow6xuaCBQcm9iaXQ6DQogIA0KICAkUHJvYml0KFxwaSh4KSkgPSBcYWxwaGEgKyBcYmV0YSB4JA0KDQojIyMgTcO0IGjDrG5oIENsb2dsb2cNCg0KVHJvbmcgdHLGsOG7nW5nIGjhu6NwIHThu7cgbOG7hyBjxrDhu6NjIHBo4bulIHRodeG7mWMgdsOgbyBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoIGTGsOG7m2kgZOG6oW5nIGjDoG0gbMWpeSB0aOG7q2E6DQoNCiRPZGRzKHgpPVwgXGZyYWN7XHBpKHgpfXsxLVxwaSh4KX09XGxhbWJkYS54XzFee1xiZXRhXzF9LnhfMl57XGJldGFfMn0uLi4ueF9tXntcYmV0YV9tfSQNCg0KVGEgbmjhuq1uIMSRxrDhu6NjIG3DtCBow6xuaCBsb2dpc3RpYyBjw7MgY8OhYyBiaeG6v24gZOG7sSBiw6FvIOG7nyBk4bqhbmcgbG9nLCBn4buNaSBsw6AgbcO0IGjDrG5oIGxvZ2lzdGljIGThuqFuZyBsb2ctbG9nLg0KDQokXGxvZ3tcbGVmdChcZnJhY3tccGkoeCl9ezEtXHBpKHgpfVxyaWdodCk9XGJldGFfMCtcYmV0YV8xLmxvZ3hfMStcYmV0YV8yLmxvZ3hfMisuLi4rXGJldGFfbS5sb2d4X219JA0KDQojIyMgUGjDom4gcGjhu5FpIG5o4buLIHRo4bupYw0KDQpQaMOibiBwaOG7kWkgbmjhu4sgdGjhu6ljIGzDoCBt4buZdCBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQgcuG7nWkgcuG6oWMgduG7m2kgc+G7kSBs4bqnbiB44bqjeSByYSBj4bunYSBt4buZdCBz4buxIGtp4buHbiB0aMOgbmggY8O0bmcgdHJvbmcgbeG7mXQgc+G7kSBs4bqnbiB0aOG7rSBj4buRIMSR4buLbmgsIGPDoWMgdGhhbSBz4buRIGzDoCBuIHbDoCBwIChuIGzDoCBz4buRIHThu7Egbmhpw6puID4gMCwgMCA8IHAgPCAxKS4NCiAgDQpO4bq/dSBn4buNaSBZIGzDoCBz4buRIGzhuqduIHRow6BuaCBjw7RuZyB0cm9uZyAqbiogbOG6p24gbOG6t3AgbOG6oWkgcGjDqXAgdGjhu60sIHRow6wgdGhlbyBjw7RuZyB0aOG7qWMgQmVjbm91bGxpLCB4w6FjIHN14bqldCDEkeG7gyBjw7MgKmsqIGzhuqduIHRow6BuaCBjw7RuZyBsw6A6DQogIA0KJHBfayA9IFAoWSA9IGspID0gQ1xiaW5vbXtufXtrfS5wXmsuKDEgLSBwKV4obiAtIGspLCBrID0gMSwyLC4uLixuJA0KICANCk5oxrAgduG6rXkgbcO0IGjDrG5oIGzhurdwIGzhuqFpICRuJCBs4bqnbiBt4buZdCBwaMOpcCB0aOG7rSDEkcOjIGNobyByYSBt4buZdCBiaeG6v24gbmfhuqt1IG5oacOqbiBjw7MgcGjDom4gcGjhu5FpIE5o4buLIHRo4bupYyAkQihuLHApJCwgxJHDsyBsw6AgWTogU+G7kSBs4bqnbiB0aMOgbmggY8O0bmcgdHJvbmcgbiBs4bqnbiB0aOG7rS4gDQoNCsSQ4buRaSB24bubaSBiaeG6v24gJFkgfiBCKG4scCkkLCB0aMOsIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgbsOzIGzDoCAkRVkgPSBuLnAkIHbDoCBwaMawxqFuZyBzYWkgbMOgICRWYXJZID0gbi5wLigxIC0gcCkkLg0KICANCk7hur91ICRZXzEsIFlfMiwuLi4sIFlfbSQgbMOgIGPDoWMgYmnhur9uIG5n4bqrdSBuaGnDqm4gxJHhu5ljIGzhuq1wIGPDsyBjw7luZyBwaMOibiBwaOG7kWkgbmjhu4sgdGjhu6ljICRCKG4scCkkIHRow6wgJFkgPSBZXzEgKyBZXzIgKyAuLi4gKyBZX20kIGzDoCBiaeG6v24gbmfhuqt1IG5oacOqbiBjw7MgcGjDom4gcGjhu5FpIG5o4buLIHRo4bupYyAkQihtbixwKSQuDQoNCiMjIyBC4bqjbmcgdOG6p24gc+G7kSAtIELhuqNuZyB04bqnbiBzdeG6pXQNCg0KQuG6o25nIHThuqduIHPhu5EgLSBC4bqjbmcgdOG6p24gc3XhuqV0IGPDsm4gxJHGsOG7o2MgZ+G7jWkgbMOgIGLhuqNuZyBuZ+G6q3Ugbmhpw6puLiBLaGkgbOG6rXAgYuG6o25nIG5n4bqrdSBuaGnDqm4gY2hvIDIgYmnhur9uIHRow6wgYuG6o25nIMSRw7MgxJHGsOG7o2MgZ+G7jWkgbMOgIGLhuqNuZyBuZ+G6q3Ugbmhpw6puIDIgY2hp4buBdSwgbuG6v3UgbOG6rXAgY2hvIDMgYmnhur9uIHRow6wgZ+G7jWkgbMOgIGLhuqNuZyBuZ+G6q3Ugbmhpw6puIDMgY2hp4buBdSB2w6AgY+G7qSB0aOG6vyB0xINuZyBsw6puLg0KDQrEkOG7kWkgduG7m2kgYuG6o25nIHThuqduIHPhu5EgY2jDum5nIHRhIHF1eSDGsOG7m2MgYmnhur9uIHBo4bulIHRodeG7mWMgKGRlcGVuZGVudC9vdXRjb21lL3Jlc3BvbnNlIHZhcmlhYmxlKSDEkcaw4bujYyB44bqvcCB44bq/cCB0aGVvIGPhu5l0LCBiaeG6v24gxJHhu5ljIGzhuq1wIChpbmRlcGVuZGVudC9leHBsYW5hdG9yeS9wcmVkaWN0b3IgdmFyaWFibGUpIMSRxrDhu6NjIHjhuq9wIHjhur9wIHRoZW8gaMOgbmcuDQoNCiMjIyBQaMOibiBwaOG7kWkgUG9pc3Nvbg0KDQpQaMOibiBwaOG7kWkgUG9pc3NvbiB24bubaSB0aGFtIHPhu5EgJFxsYW1iZGEgKFxsYW1iZGEgPiAwJCBjw7MgaMOgbSBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQgbmjGsCBzYXU6DQogIA0KICAkcF9rID0gUChZID0gaykgPSBcZnJhY3tcbGFtYmRhXmsuZV57LVxsYW1iZGF9fXtrIX0sIGsgPSAwLDEsMiwuLi4kDQogIA0KS2hpIMSRw7MgdGEgdmnhur90OiAkWSQgfiAkUChcbGFtYmRhKSQgxJHhu4MgY2jhu4kgcuG6sW5nOiAkWSQgY8OzIHBow6JuIHBo4buRaSB4w6FjIHN14bqldCBQb2lzc29uIHbhu5tpIHRoYW0gc+G7kSAkXGxhbWJkYSQuIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgga2hpIMSRw7MgY+G7p2EgbsOzIGzDoCAkRVkgPSBcbGFtYmRhJCB2w6AgcGjGsMahbmcgc2FpIGzDoCAkVmFyWSA9IFxsYW1iZGEkLg0KICANCk7hur91ICRZXzEsIFlfMiwuLi4sIFlfbSQgbMOgIGPDoWMgYmnhur9uIG5n4bqrdSBuaGnDqm4gxJHhu5ljIGzhuq1wIGPDsyBjw7luZyBwaMOibiBwaOG7kWkgUG9pc3NvbiAkUChcbGFtYmRhKSQgdGjDrCAkWSA9IFlfMSArIFlfMiArIC4uLiArIFlfbSQgbMOgIGJp4bq/biBuZ+G6q3Ugbmhpw6puIGPDsyBwaMOibiBwaOG7kWkgUG9pc3NvbiAkUChtXGxhbWJkYSkkLg0KICANCiMjIyBS4bunaSBybyB0xrDGoW5nIMSR4buRaSAoUmVsYXRpdmUgUmlzaykNCg0KU+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGhhaSB04bu3IGzhu4cgJFxwaV8xJCB2w6AgJFxwaV8yJCDEkcaw4bujYyDEkcOhbmggZ2nDoSBxdWEgc2FpIHPhu5EgdHV54buHdCDEkeG7kWkgKCRccGlfMSAtIFxwaV8yJCkgY2jhu4kgZOG7sWEgdsOgbyBraG/huqNuZyBjw6FjaCBnaeG7r2EgaGFpIHThu7cgbOG7hyBuw6B5IHbDoCBi4buPIHF1YSDEkeG7mSBs4bubbiB2w6Agw70gbmdoxKlhIGPhu6dhIGNow7puZywgbmdoxKlhIGzDoCBraG/huqNuZyBjw6FjaCBuaMawIG5oYXUgdGjDrCDEkcOhbmggZ2nDoSBzYWkgbOG7h2NoIG5oxrAgbmhhdS4NCiAgDQpHaeG6oyBz4butICRccGlfMSQgdsOgICRccGlfMiQgbMOgIHjDoWMgc3XhuqV0IHRow6BuaCBjw7RuZyBj4bunYSBoYWkgbmjDs20gdGjDrCBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBnaeG7r2EgaGFpIG5ow61tIG7DoHkgbMOgIHThu7cgbOG7hyB4w6FjIHN14bqldCB0aMOgbmggY8O0bmcgY+G7p2EgaGFpIG5ow7NtOiAkXGZyYWN7XHBpXzF9e1xwaV8yfSQNCiAgDQpDw6FjIHThu7cgbOG7hyB04buVbmcgdGjhu4MgJFxwaV8xJCB2w6AgJFxwaV8yJCBsw6AgY2jGsGEgYmnhur90LCB0YSBuaOG6rW4gxJHGsOG7o2MgY8OhYyB04bu3IGzhu4cgbeG6q3UgdMawxqFuZyDhu6luZyBsw6AgJGZfMSQgdsOgICRmXzIkLiBLaGkgxJHDsywgdGEgZMO5bmcgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgbeG6q3UgJFxmcmFje2ZfMX17Zl8yfSQgxJHhu4MgeOG6pXAgeOG7iSBjaG8gcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgJFxmcmFje1xwaV8xfXtccGlfMn0kIHRyw6puIHThu5VuZyB0aOG7gy4NCg0KIyMjIFThu7cgbOG7hyBjaMOqbmggKE9kZHMgUmF0aW9zKQ0KDQpU4bu3IGzhu4cgY8aw4bujYyAoT2RkcykgbMOgIHThu7cgbOG7hyBnaeG7r2Ega2jhuqMgbsSDbmcgdGjDoG5oIGPDtG5nIHbDoCBraOG6oyBuxINuZyBraMO0bmcgdGjDoG5oIGPDtG5nIHRyb25nIGPDuW5nIG3hu5l0IMSRaeG7gXUga2nhu4duIHTDoWMgxJHhu5luZyBj4bunYSBiaeG6v24gZ2nhuqNpIHRow61jaCwga8O9IGhp4buHdSAkb2Rkc19pJDoNCiAgDQogICRvZGRzX2kgPSBcZnJhY3tccGlfaX17MSAtIFxwaV9pfSQNCiAgDQpU4bu3IGzhu4cgY2jDqm5oIChPZGRzIFJhdGlvKSBj4bunYSBow6BuZyAxIHbDoCBow6BuZyAyLCDEkcaw4bujYyBrw70gaGnhu4d1IGzDoCAkXHRoZXRhJCwgbMOgIHThu7cgc+G7kSBnaeG7r2EgdOG7tyBs4buHIGPGsOG7o2MgY+G7p2EgdGjDoG5oIGPDtG5nIOG7nyBow6BuZyAxIHbDoCB04bu3IGzhu4cgY8aw4bujYyBj4bunYSB0aMOgbmggY8O0bmcg4bufIGjDoG5nIDI6DQogIA0KICAkXHRoZXRhID0gXGZyYWN7b2Rkc18xfXtvZGRzXzJ9ID0gXGZyYWN7XHBpXzEoMSAtIFxwaV8yKX17XHBpXzIoMSAtIFxwaV8xKX0kDQoNCiMjIyBDaOG7iSBz4buRIMSRw6FuaCBnacOhIG3DtCBow6xuaCBBSUMgKEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpYW4pDQoNCkPDtG5nIHRo4bupYyDEkcaw4bujYyBz4butIGThu6VuZyBjaG8gQUlDIHRyb25nIFIgbMOgOg0KDQogICRBSUMgPSBEZXZpYW5jZSArIDIuayQgKHbhu5tpIGsgbMOgIHRoYW0gc+G7kSBj4bunYSBtw7QgaMOsbmgpDQogIA0KQUlDIGPDoG5nIGLDqSB0aMOsIG3DtCBow6xuaCBjw6BuZyBjaMOtbmggeMOhYy4NCiAgDQojIyMgQ2jhu4kgc+G7kSDEkcOhbmggZ2nDoSBtw7QgaMOsbmggQmllcg0KDQpDaOG7iSBz4buRIEJyaWVyIGzDoCB0cnVuZyBiw6xuaCBj4bunYSB04buVbmcgYsOsbmggcGjGsMahbmcgY8OhYyDEkeG7mSBjaMOqbmggbOG7h2NoIGdp4buvYSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBwaOG7pSB0aHXhu5ljIFkgdsOgIGdpw6EgdHLhu4sgxrDhu5tjIGzGsOG7o25nIGPhu6dhIG7Dsy4NCg0KICAkQiA9IFxmcmFjezF9e259XHN1bV97aSA9IDF9Xm4oWV9pIC0gXGhhdFxwaV9pKV4yID0gXGZyYWN7c3VtIHNxdWFyZSByZXNpZH17bn0kDQogIA0KIyMjIENo4buJIHPhu5EgxJHDoW5oIGdpw6EgbcO0IGjDrG5oIERldmlhbmNlDQoNCkRldmlhbmNlIGPFqW5nIGzDoCBt4buZdCB0acOqdSBjaMOtIHLhuqV0IHBo4buVIGJp4bq/biDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkcOhbmggZ2nDoSBt4buZdCBtw7QgaMOsbmggaOG7k2kgcXV5IMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBi4bufaSBwaMawxqFuZyBwaMOhcCBI4bujcCBsw70gY+G7sWMgxJHhuqFpIChNTCkuIE3hu5l0IGPDoWNoIHThu5VuZyBxdcOhLCBjxaluZyBnaeG7kW5nIG5oxrAgY2jhu4kgdGnDqnUgQUlDLCBnacOhIHRy4buLIGPhu6dhIERldmlhbmNlIGPDoG5nIG5o4buPIHRow6wgbcO0IGjDrG5oIGPDoG5nIHThu5F0Lg0KDQojIyMgTWEgdHLhuq1uIG5o4bqnbSBs4bqrbg0KDQpNYSB0cuG6rW4gbmjhuqdtIGzhuqtuIGzDoCB54bq/dSB04buRIGdpw7pwIHNvIHPDoW5oIGdpw6EgdHLhu4sgdGjhu7FjIHThur8gdsOgIGdpw6EgdHLhu4sgZOG7sSBiw6FvLiBUcm9uZyBtYSB0cuG6rW4gbmjhuqdtIGzhuqtuIG5nxrDhu51pIHRhIHjDqXQgY8OhYyBjaOG7iSBz4buROiDEkOG7mSBjaMOtbmggeMOhYyB0b8OgbiB0aOG7gywgxJHhu5kgbmjhuqF5LCDEkeG7mSDEkeG6t2MgaGnhu4d1LC4uLg0KICANClRyb25nIG1hIHRy4bqtbiBuaOG6p20gbOG6q24sIGPDoWMgY2jhu4kgc+G7kSBxdWFuIA0KdHLhu41uZyDEkcaw4bujYyBjaMO6IMO9IGzDoCDEkeG7mSBuaOG6oXkgdsOgIMSR4buZIMSR4bq3YyBoaeG7h3UuIEPDoWMgY2jhu4kgc+G7kSBuw6B5IGPDoG5nIGzhu5tuIGPDoG5nIHThu5F0Lg0KICANCiMjIyDEkOG7mSBuaOG6oXkgdsOgIMSR4buZIMSR4bq3YyBoaeG7h3UNCg0KKirEkOG7mSBuaOG6oXkgKHNlbnNpdGl2aXR5KSoqIGPhu6dhIG3hu5l0IHRow60gbmdoaeG7h206IEzDoCB04bu3IGzhu4cgKCUpIGPhu6dhIHPhu5EgY2EgYuG7iyBi4buHbmggdGjhu7FjIHPhu7Ega2hpIHjDqXQgbmdoaeG7h20gdsOgIGNobyBr4bq/dCBxdeG6oyBkxrDGoW5nIHTDrW5oIHbhu5tpIHThu5VuZyBz4buRIGNhIGLhu4sgYuG7h25oLiBDw7RuZyB0aOG7qWMgxJHhu4MgdMOtbmggxJHhu5kgbmjhuqF5Og0KDQrEkOG7mSBuaOG6oXkgPSBz4buRIGTGsMahbmcgdMOtbmggdGjhuq10Lyhz4buRIMSRxrDGoW5nIHTDrW5oIHRo4bqtdCArIHPhu5Egw6JtIHTDrW5oIGdp4bqjKQ0KDQoqKsSQ4buZIMSR4bq3YyBoaeG7h3UgKHNwZWNpZmljaXR5KSoqIGPhu6dhIG3hu5l0IHRow60gbmdoaeG7h206IEzDoCB04bu3IGzhu4cgKCUpIGPhu6dhIHPhu5EgY2Ega2jDtG5nIGLhu4sgYuG7h25oIHbDoCBr4bq/dCBxdeG6oyB4w6l0IG5naGnhu4dtIGtow7RuZyBi4buLIGLhu4duaCB24bubaSB04buVbmcgc+G7kSBuZ8aw4budaSBraMO0bmcgYuG7iyBi4buHbmguIEPDtG5nIHRo4bupYyB0w61uaCDEkeG7mSDEkeG6t2MgaGnhu4d1Og0KDQrEkOG7mSDEkeG6t2MgaGnhu4d1ID0gU+G7kSB0csaw4budbmcgaOG7o3Agw6JtIHTDrW5oIHRo4bqtdC8gKHPhu5EgdHLGsOG7nW5nIGjhu6NwIMOibSB0w61uaCB0aOG6rXQgKyBz4buRIHRyxrDhu51uZyBo4bujcCBkxrDGoW5nIHTDrW5oIGdp4bqjKQ0KDQojIENIxq/GoE5HIDMuIEvhur5UIFFV4bqiIE3DlCBIw4xOSCBOR0hJw4pOIEPhu6hVDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIHThu6tuZyBiaeG6v24NCg0KIyMjIEJp4bq/biDEkeG7i25oIHTDrW5oIFRhc3RlDQoNCmBgYHtyfQ0KdGFibGUobWlsa25ldyRUYXN0ZSkNCmBgYA0KDQpgYGB7cn0NCnRhYmxlKG1pbGtuZXckVGFzdGUpL3N1bSh0YWJsZShtaWxrbmV3JFRhc3RlKSkqMTAwDQpgYGBgYGANCg0KYGBge3J9DQptaWxrbmV3IHw+IGdncGxvdCggYWVzKCB4ID0gVGFzdGUsIHk9IGFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2Jhcihjb2xvcj0nZ3JlZW4nLCBmaWxsPSdibHVlJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLGFjY3VyYWN5PS4wMSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3I9ICdibGFjaycsIHZqdXN0PSAtLjUpICsgdGhlbWVfY2xhc3NpYygpICsgeGxhYignSMawxqFuZyB24buLIGPhu6dhIHPhu69hJykgKyB5bGFiKCdT4buRIG3huqt1JykNCmBgYA0KDQpOaMOsbiB2w6BvIGPDoWMgYuG6o25nLCB0YSB0aOG6pXk6DQoNCiogQ8OzIDQ4MCBt4bqrdSBz4buvYSBjw7MgaMawxqFuZyB24buLIGtow7RuZyBuZ29uLCBjaGnhur9tIDQ1LjMzJS4gIA0KKiBDw7MgNTc5IG3huqt1IHPhu69hIGPDsyBoxrDGoW5nIHbhu4sgbmdvbiwgY2hp4bq/bSA1NC42NyUuDQoNCiMjIyBCaeG6v24gxJHhu4tuaCB0w61uaCBPZG9yDQoNCmBgYHtyfQ0KdGFibGUobWlsa25ldyRPZG9yKQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUobWlsa25ldyRPZG9yKS9zdW0odGFibGUobWlsa25ldyRPZG9yKSkqMTAwDQpgYGANCg0KYGBge3J9DQptaWxrbmV3IHw+IGdncGxvdCggYWVzKCB4ID0gT2RvciwgeT0gYWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGNvbG9yPSdncmVlbicsIGZpbGw9J2JsdWUnKSArIGdlb21fdGV4dChhZXMobGFiZWw9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksYWNjdXJhY3k9LjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvcj0gJ2JsYWNrJywgdmp1c3Q9IC0uNSkgKyB0aGVtZV9jbGFzc2ljKCkgKyB4bGFiKCdNw7lpIGPhu6dhIHPhu69hJykgKyB5bGFiKCdT4buRIG3huqt1JykNCmBgYA0KDQpOaMOsbiB2w6BvIGPDoWMgYuG6o25nLCB0YSB0aOG6pXk6DQoNCiogQ8OzIDYwMSBt4bqrdSBz4buvYSBjw7MgbcO5aSBraMO0bmcgdGjGoW0sIGNoaeG6v20gNTYuNzUlLiAgDQoqIEPDsyA0NTggbeG6q3Ugc+G7r2EgY8OzIG3DuWkgdGjGoW0sIGNoaeG6v20gNDMuMjUlLg0KDQojIyMgQmnhur9uIMSR4buLbmggdMOtbmggRmF0DQoNCmBgYHtyfQ0KdGFibGUobWlsa25ldyRGYXQpDQpgYGANCg0KYGBge3J9DQp0YWJsZShtaWxrbmV3JEZhdCkvc3VtKHRhYmxlKG1pbGtuZXckRmF0KSkqMTAwDQpgYGANCg0KYGBge3J9DQptaWxrbmV3IHw+IGdncGxvdCggYWVzKCB4ID0gRmF0LCB5PSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoY29sb3I9J2dyZWVuJywgZmlsbD0nYmx1ZScpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSxhY2N1cmFjeT0uMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yPSAnYmxhY2snLCB2anVzdD0gLS41KSArIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ8SQ4buZIGLDqW8gY+G7p2Egc+G7r2EnKSArIHlsYWIoJ1Phu5EgbeG6q3UnKQ0KYGBgDQoNCk5ow6xuIHbDoG8gY8OhYyBi4bqjbmcsIHRhIHRo4bqleToNCg0KKiBDw7MgMzQ4IG3huqt1IHPhu69hIGPDsyDEkeG7mSBiw6lvIHRo4bqlcCwgY2hp4bq/bSAzMi44NiUuICANCiogQ8OzIDcxMSBt4bqrdSBz4buvYSBjw7MgxJHhu5kgYsOpbyBjYW8sIGNoaeG6v20gNjcuMTQlLg0KDQojIyMgQmnhur9uIMSR4buLbmggdMOtbmggVHVyYmlkaXR5DQoNCmBgYHtyfQ0KdGFibGUobWlsa25ldyRUdXJiaWRpdHkpDQpgYGANCg0KYGBge3J9DQp0YWJsZShtaWxrbmV3JFR1cmJpZGl0eSkvc3VtKHRhYmxlKG1pbGtuZXckVHVyYmlkaXR5KSkqMTAwDQpgYGANCg0KYGBge3J9DQptaWxrbmV3IHw+IGdncGxvdCggYWVzKCB4ID0gVHVyYmlkaXR5LCB5PSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoY29sb3I9J2dyZWVuJywgZmlsbD0nYmx1ZScpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSxhY2N1cmFjeT0uMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yPSAnYmxhY2snLCB2anVzdD0gLS41KSArIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ8SQ4buZIMSR4bulYyBj4bunYSBz4buvYScpICsgeWxhYignU+G7kSBt4bqrdScpDQpgYGANCg0KTmjDrG4gdsOgbyBjw6FjIGLhuqNuZywgdGEgdGjhuqV5Og0KDQoqIEPDsyA1MzkgbeG6q3Ugc+G7r2EgY8OzIMSR4buZIMSR4bulYyB0aOG6pXAsIGNoaeG6v20gNTAuOTAlLiAgDQoqIEPDsyA1MjAgbeG6q3Ugc+G7r2EgY8OzIMSR4buZIMSR4bulYyBjYW8sIGNoaeG6v20gNDkuMSUuDQoNCiMjIyBCaeG6v24gxJHhu4tuaCB0w61uaCBHcmFkZQ0KDQpgYGB7cn0NCnRhYmxlKG1pbGtuZXckR3JhZGUpDQpgYGANCg0KYGBge3J9DQp0YWJsZShtaWxrbmV3JEdyYWRlKS9zdW0odGFibGUobWlsa25ldyRHcmFkZSkpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KbWlsa25ldyB8PiBnZ3Bsb3QoIGFlcyggeCA9IEdyYWRlLCB5PSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoY29sb3I9J2dyZWVuJywgZmlsbD0nYmx1ZScpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSxhY2N1cmFjeT0uMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yPSAnYmxhY2snLCB2anVzdD0gLS41KSArIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ0No4bqldCBsxrDhu6NuZyBj4bunYSBz4buvYScpICsgeWxhYignU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KTmjDrG4gdsOgbyBjw6FjIGLhuqNuZywgdGEgdGjhuqV5Og0KDQoqIEPDsyA1NDggbeG6q3Ugc+G7r2EgY8OzIGNo4bqldCBsxrDhu6NuZyBrw6ltLCBjaGnhur9tIDUxLjc1JS4gIA0KKiBDw7MgNTExIG3huqt1IHPhu69hIGPDsyBjaOG6pXQgbMaw4bujbmcgY2FvLCBjaGnhur9tIDQ4LjI1JS4NCg0KIyMjIEJp4bq/biDEkeG7i25oIGzGsOG7o25nIHBIDQoNCmBgYHtyfQ0Kc3VtbWFyeShtaWxrbmV3JHBIKQ0KYGBgDQoNCmBgYHtyfQ0Kc2QobWlsa25ldyRwSCkNCmBgYA0KDQpgYGB7cn0NCm1pbGtuZXcgfD4gZ2dwbG90KGFlcyhwSCkpK2dlb21fYmFyKGFlcyh5PSguLmNvdW50Li4pKSxjb2xvcj0ib3JhbmdlIixmaWxsPSJibHVlIikNCmBgYA0KDQpOaMOsbiB2w6BvIGLhuqNuZywgdGEgdGjhuqV5Og0KDQoqIMSQ4buZIHBIIGPhu6dhIHPhu69hIGRhbyDEkeG7mW5nIOG7nyBt4bupYyAzIMSR4bq/biA5LjUsIG3hu6ljIMSR4buZIHRydW5nIGLDrG5oIGzDoCA2LjYzLg0KDQoqIEPDsyAyNSUgc+G7kSBt4bqrdSB0cm9uZyBk4buvIGxp4buHdSBjw7MgxJHhu5kgcEggdGjhuqVwIGjGoW4gNi41Lg0KDQoqIEPDsyA1MCUgc+G7kSBt4bqrdSB0cm9uZyBk4buvIGxp4buHdSBjw7MgxJHhu5kgcEggdGjhuqVwIGjGoW4gNi43Lg0KDQoqIEPDsyA3NSUgc+G7kSBt4bqrdSB0cm9uZyBk4buvIGxp4buHdSBjw7MgxJHhu5kgcEggdGjhuqVwIGjGoW4gNi44Lg0KDQoqIMSQ4buZIHBIIGPDsyDEkeG7mSBs4buHY2ggY2h14bqpbiBsw6AgMS4zOTk2NzkuDQoNCiMjIyBCaeG6v24gxJHhu4tuaCBsxrDhu6NuZyBUZW1wcmF0dXJlDQoNCmBgYHtyfQ0Kc3VtbWFyeShtaWxrbmV3JFRlbXByYXR1cmUpDQpgYGANCg0KYGBge3J9DQpzZChtaWxrbmV3JFRlbXByYXR1cmUpDQpgYGANCg0KYGBge3J9DQptaWxrbmV3IHw+IGdncGxvdChhZXMoVGVtcHJhdHVyZSkpK2dlb21fYmFyKGFlcyh5PSguLmNvdW50Li4pKSxjb2xvcj0ib3JhbmdlIixmaWxsPSJibHVlIikNCmBgYA0KDQpOaMOsbiB2w6BvIGLhuqNuZywgdGEgdGjhuqV5Og0KDQoqIE5oaeG7h3QgxJHhu5kgY+G7p2Egc+G7r2EgZGFvIMSR4buZbmcg4bufIG3hu6ljIDM0IMSR4bq/biA5MCwgbeG7qWMgxJHhu5kgdHJ1bmcgYsOsbmggbMOgIDQ0LjIzLg0KDQoqIEPDsyAyNSUgc+G7kSBt4bqrdSB0cm9uZyBk4buvIGxp4buHdSBjw7Mgbmhp4buHdCDEkeG7mSB0aOG6pXAgaMahbiAzOC4NCg0KKiBDw7MgNTAlIHPhu5EgbeG6q3UgdHJvbmcgZOG7ryBsaeG7h3UgY8OzIG5oaeG7h3QgxJHhu5kgdGjhuqVwIGjGoW4gNDEuDQoNCiogQ8OzIDc1JSBz4buRIG3huqt1IHRyb25nIGThu68gbGnhu4d1IGPDsyBuaGnhu4d0IMSR4buZIHRo4bqlcCBoxqFuIDQ1Lg0KDQoqIMSQ4buZIHBIIGPDsyDEkeG7mSBs4buHY2ggY2h14bqpbiBsw6AgMTAsMDk4MzYuDQoNCiMjIyBCaeG6v24gxJHhu4tuaCBsxrDhu6NuZyBDb2xvdXINCg0KYGBge3J9DQpzdW1tYXJ5KG1pbGtuZXckQ29sb3VyKQ0KYGBgDQoNCmBgYHtyfQ0Kc2QobWlsa25ldyRDb2xvdXIpDQpgYGANCg0KYGBge3J9DQptaWxrbmV3IHw+IGdncGxvdChhZXMoQ29sb3VyKSkrZ2VvbV9iYXIoYWVzKHk9KC4uY291bnQuLikpLGNvbG9yPSJvcmFuZ2UiLGZpbGw9ImJsdWUiKQ0KYGBgDQoNCk5ow6xuIHbDoG8gYuG6o25nLCB0YSB0aOG6pXk6DQoNCiogTcOgdSBj4bunYSBz4buvYSBkYW8gxJHhu5luZyDhu58gbeG7qWMgMjQwIMSR4bq/biAyNTUsIG3hu6ljIMSR4buZIHRydW5nIGLDrG5oIGzDoCAyNTEuOC4NCg0KKiBDw7MgMjUlIHPhu5EgbeG6q3UgdHJvbmcgZOG7ryBsaeG7h3UgY8OzIG3DoHUgdGjhuqVwIGjGoW4gMjUwLg0KDQoqIEPDsyA1MCUgc+G7kSBt4bqrdSB0cm9uZyBk4buvIGxp4buHdSBjw7MgbcOgdSB0aOG6pXAgaMahbiAyNTUuDQoNCiogQ8OzIDc1JSBz4buRIG3huqt1IHRyb25nIGThu68gbGnhu4d1IGPDsyBtw6B1IHRo4bqlcCBoxqFuIDI1NS4NCg0KKiDEkOG7mSBwSCBjw7MgxJHhu5kgbOG7h2NoIGNodeG6qW4gbMOgIDEwLjA5ODM2Lg0KDQojIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyB2w6AgdGjhu5FuZyBrw6ogc3V5IGRp4buFbiBoYWkgYmnhur9uDQoNCiMjIyBN4buRaSBxdWFuIGjhu4cgZ2nhu69hIGJp4bq/biBHcmFkZSB2w6AgYmnhur9uIFRhc3RlDQoNCmEpIELhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQp0czEgPC0gdGFibGUobWlsa25ldyRHcmFkZSwgbWlsa25ldyRUYXN0ZSkNCnRzMQ0KYGBgDQoNCmBgYHtyfQ0KdHMxMSA8LSBwcm9wLnRhYmxlKHRzMSkNCmFkZG1hcmdpbnModHMxMSkNCmBgYA0KDQpOaMOsbiB2w6BvIGLhuqNuZywgdGEgdGjhuqV5Og0KDQoqIEPDsyAyODIgbeG6q3Ugc+G7r2EgY8OzIGjGsMahbmcgduG7iyBuZ29uIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyBjYW8sIGNoaeG6v20gMjYuNjMlLg0KKiBDw7MgMjk3IG3huqt1IHPhu69hIGPDsyBoxrDGoW5nIHbhu4sgbmdvbiDEkcaw4bujYyDEkcOhbmggZ2nDoSBjaOG6pXQgbMaw4bujbmcgdGjhuqVwLCBjaGnhur9tIDI4LjA1JS4NCiogQ8OzIDIyOSBt4bqrdSBz4buvYSBjw7MgaMawxqFuZyB24buLIGtow7RuZyBuZ29uIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyBjYW8sIGNoaeG6v20gMjEuNjIlLg0KKiBDw7MgMjUxIG3huqt1IHPhu69hIGPDsyBoxrDGoW5nIHbhu4sga2jDtG5nIG5nb24gxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIHRo4bqlcCwgY2hp4bq/bSAyMy43MCUuDQoNCmIpIFLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIHbDoCB04bu3IGzhu4cgY2jDqm5oIGzhu4djaA0KDQpgYGB7cn0NCmVwaXRhYih0czEsIG1ldGhvZCA9ICJyaXNrcmF0aW8iKQ0KYGBgDQoNCk5ow6xuIHbDoG8ga+G6v3QgcXXhuqMgdGEgdGjhuqV5LCBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBj4bunYSBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyBoxrDGoW5nIHbhu4sgbMOgIDEuMDE4Mi4gVOG7qWMgbMOgLCB04buJIGzhu4cgY2jhuqV0IGzGsOG7o25nIHPhu69hIHRoZW8gaMawxqFuZyB24buLIG5nb24gY2FvIGjGoW4gdOG7iSBs4buHIGNo4bqldCBsxrDhu6NuZyBz4buvYSB0aGVvIGjGsMahbmcgduG7iyBraMO0bmcgbmdvbi4gVHV5IG5oacOqbiwgZ2nDoSB0cuG7iyBwLXZhbHVlID0gMC43NTc3IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBraMO0bmcgxJHDoW5nIGvhu4MgdGjhu5FuZyBrw6ouIFThu6ljIGzDoCwga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBy4bunaSBybyBnaeG7r2EgMiBuaMOzbSBraMOhYyBuaGF1Lg0KDQpgYGB7cn0NCmVwaXRhYih0czEsIG1ldGhvZCA9ICJvZGRzcmF0aW8iKQ0KYGBgDQoNCk5ow6xuIHbDoG8ga+G6v3QgcXXhuqMgdGEgdGjhuqV5LCB04bu3IGzhu4cgY2jDqm5oIGzhu4djaCBj4bunYSBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyBoxrDGoW5nIHbhu4sgbMOgIDEsMDQwNy4gVOG7qWMgbMOgLCB04buJIGzhu4cgY2jhuqV0IGzGsOG7o25nIHPhu69hIHRoZW8gaMawxqFuZyB24buLIG5nb24gY2FvIGjGoW4gdOG7iSBs4buHIGNo4bqldCBsxrDhu6NuZyBz4buvYSB0aGVvIGjGsMahbmcgduG7iyBraMO0bmcgbmdvbi4gVHV5IG5oacOqbiwgZ2nDoSB0cuG7iyBwLXZhbHVlID0gMC43NTc3IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBraMO0bmcgxJHDoW5nIGvhu4MgdGjhu5FuZyBrw6ouIFThu6ljIGzDoCwga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBjaMOqbmggbOG7h2NoIGdp4buvYSAyIG5ow7NtIGtow6FjIG5oYXUuDQoNCmMpIEJp4buDdSDEkeG7kw0KDQpgYGB7cn0NCmdncGxvdChtaWxrbmV3LCBhZXMoR3JhZGUsIGZpbGwgPSBUYXN0ZSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KYGBgDQoNCmQpIEtp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcA0KDQpHaeG6oyB0aHV54bq/dDoNCg0KJEhfMCQ6IEJp4bq/biBHcmFkZSB2w6AgYmnhur9uIFRhc3RlIMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCiRIXzEkOiBCaeG6v24gR3JhZGUgdsOgIGJp4bq/biBUYXN0ZSBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KYGBge3J9DQpnaWwgPC0gdGFibGUgKG1pbGtuZXckR3JhZGUsIG1pbGtuZXckVGFzdGUpDQpnaWwNCmBgYA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoZ2lsKQ0KYGBgDQpWw6wgcF92YWx1ZSA9IDAuNzkzOSA+IDAuMDUgbsOqbiB0YSBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLiBOZ2jEqWEgbMOgIGJp4bq/biBHcmFkZSB2w6AgYmnhur9uIFRhc3RlIMSR4buZYyBs4bqtcCB24bubaSBuaGF1Lg0KDQojIyMgTeG7kWkgcXVhbiBo4buHIGdp4buvYSBiaeG6v24gR3JhZGUgdsOgIGJp4bq/biBPZG9yDQoNCmEpIELhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQp0czIgPC0gdGFibGUobWlsa25ldyRHcmFkZSwgbWlsa25ldyRPZG9yKQ0KdHMyDQpgYGANCg0KYGBge3J9DQp0czIyIDwtIHByb3AudGFibGUodHMyKQ0KYWRkbWFyZ2lucyh0czIyKQ0KYGBgDQoNCk5ow6xuIHbDoG8gYuG6o25nLCB0YSB0aOG6pXk6DQoNCiogQ8OzIDI0OCBt4bqrdSBz4buvYSBjw7MgbcO5aSB0aMahbSDEkcaw4bujYyDEkcOhbmggZ2nDoSBjaOG6pXQgbMaw4bujbmcgY2FvLCBjaGnhur9tIDIzLjQyJS4NCiogQ8OzIDIxMCBt4bqrdSBz4buvYSBjw7MgbcO5aSB0aMahbSDEkcaw4bujYyDEkcOhbmggZ2nDoSBjaOG6pXQgbMaw4bujbmcgdGjhuqVwLCBjaGnhur9tIDE5LjgzJS4NCiogQ8OzIDI2MyBt4bqrdSBz4buvYSBjw7MgbcO5aSBraMO0bmcgdGjGoW0gxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIGNhbywgY2hp4bq/bSAyNC44MyUuDQoqIEPDsyAzMzggbeG6q3Ugc+G7r2EgY8OzIG3DuWkga2jDtG5nIHRoxqFtIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyB0aOG6pXAsIGNoaeG6v20gMzEuOTIlLg0KDQpiKSBS4bunaSBybyB0xrDGoW5nIMSR4buRaSB2w6AgdOG7tyBs4buHIGNow6puaCBs4buHY2gNCg0KYGBge3J9DQplcGl0YWIodHMyLCBtZXRob2QgPSAicmlza3JhdGlvIikNCmBgYA0KDQpOaMOsbiB2w6BvIGvhur90IHF14bqjIHRhIHRo4bqleSwgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgY+G7p2EgY2jhuqV0IGzGsOG7o25nIHPhu69hIHRoZW8gbcO5aSB0aMahbSBsw6AgMSwyNjY1LiBU4bupYyBsw6AsIHThu4kgbOG7hyBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyBtw7lpIHRoxqFtIGNhbyBoxqFuIHThu4kgbOG7hyBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyBtw7lpIGtow7RuZyB0aMahbS4gR2nDoSB0cuG7iyBwLXZhbHVlID0gMC4wMDEgcuG6pXQgbmjhu48gKGfhuqduIGLhurFuZyAwKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDEkcOhbmcga+G7gy4NCg0KYGBge3J9DQplcGl0YWIodHMyLCBtZXRob2QgPSAib2Rkc3JhdGlvIikNCmBgYA0KDQpOaMOsbiB2w6BvIGvhur90IHF14bqjIHRhIHRo4bqleSwgdOG7tyBs4buHIGNow6puaCBs4buHY2ggY+G7p2EgY2jhuqV0IGzGsOG7o25nIHPhu69hIHRoZW8gaMawxqFuZyB24buLIGzDoCAxLjUxNzcuIFThu6ljIGzDoCwgdOG7iSBs4buHIGNo4bqldCBsxrDhu6NuZyBz4buvYSB0aGVvIG3DuWkgdGjGoW0gY2FvIGjGoW4gdOG7iSBs4buHIGNo4bqldCBsxrDhu6NuZyBz4buvYSB0aGVvIG3DuWkga2jDtG5nIHRoxqFtLiBHacOhIHRy4buLIHAtdmFsdWUgPSAwLjAwMSBy4bqldCBuaOG7jyAoZ+G6p24gYuG6sW5nIDApIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIMSRw6FuZyBr4buDLg0KDQpjKSBCaeG7g3UgxJHhu5MNCg0KYGBge3J9DQpnZ3Bsb3QobWlsa25ldywgYWVzKEdyYWRlLCBmaWxsID0gT2RvcikpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KYGBgDQoNCmQpIEtp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcA0KDQpHaeG6oyB0aHV54bq/dDoNCg0KJEhfMCQ6IEJp4bq/biBHcmFkZSB2w6AgYmnhur9uIE9kb3IgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KJEhfMSQ6IEJp4bq/biBHcmFkZSB2w6AgYmnhur9uIE9kb3Iga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCmBgYHtyfQ0KZ2lsIDwtIHRhYmxlIChtaWxrbmV3JEdyYWRlLCBtaWxrbmV3JE9kb3IpDQpnaWwNCmBgYA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoZ2lsKQ0KYGBgDQpWw6wgcF92YWx1ZSA9IDAuMDAxIDwgMC4wNSBuw6puIHRhIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMSQuIE5naMSpYSBsw6AgYmnhur9uIEdyYWRlIHbDoCBiaeG6v24gT2RvciBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUuDQoNCiMjIyBN4buRaSBxdWFuIGjhu4cgZ2nhu69hIGJp4bq/biBHcmFkZSB2w6AgYmnhur9uIEZhdA0KDQphKSBC4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KdHMzIDwtIHRhYmxlKG1pbGtuZXckR3JhZGUsIG1pbGtuZXckRmF0KQ0KdHMzDQpgYGANCg0KYGBge3J9DQp0czMzIDwtIHByb3AudGFibGUodHMzKQ0KYWRkbWFyZ2lucyh0czMzKQ0KYGBgDQoNCk5ow6xuIHbDoG8gYuG6o25nLCB0YSB0aOG6pXk6DQoNCiogQ8OzIDM1NiBt4bqrdSBz4buvYSBjw7MgxJHhu5kgYsOpbyBjYW8gxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIGNhbywgY2hp4bq/bSAzMy42MiUuDQoqIEPDsyAzNTUgbeG6q3Ugc+G7r2EgY8OzIMSR4buZIGLDqW8gY2FvIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyB0aOG6pXAsIGNoaeG6v20gMzMuNTIlLg0KKiBDw7MgMTU1IG3huqt1IHPhu69hIGPDsyDEkeG7mSBiw6lvIHRo4bqlcCDEkcaw4bujYyDEkcOhbmggZ2nDoSBjaOG6pXQgbMaw4bujbmcgY2FvLCBjaGnhur9tIDE0LjY0JS4NCiogQ8OzIDE5MyBt4bqrdSBz4buvYSBjw7MgxJHhu5kgYsOpbyB0aOG6pXAgxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIHRo4bqlcCwgY2hp4bq/bSAxOC4yMiUuDQoNCmIpIFLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIHbDoCB04bu3IGzhu4cgY2jDqm5oIGzhu4djaA0KDQpgYGB7cn0NCmVwaXRhYih0czMsIG1ldGhvZCA9ICJyaXNrcmF0aW8iKQ0KYGBgDQoNCk5ow6xuIHbDoG8ga+G6v3QgcXXhuqMgdGEgdGjhuqV5LCBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBj4bunYSBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyDEkeG7mSBiw6lvIGzDoCAxLjA3NTQuIFThu6ljIGzDoCwgdOG7iSBs4buHIGNo4bqldCBsxrDhu6NuZyBz4buvYSB0aGVvIMSR4buZIGLDqW8gY2FvIGNhbyBoxqFuIHThu4kgbOG7hyBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyDEkeG7mSBiw6lvIHRo4bqlcC4gVHV5IG5oacOqbiwgZ2nDoSB0cuG7iyBwLXZhbHVlID0gMC4xMDE3IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBraMO0bmcgxJHDoW5nIGvhu4MgdGjhu5FuZyBrw6ouIFThu6ljIGzDoCBraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga+G7gyDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBy4bunaSBybyBnaeG7r2EgMiBuaMOzbSBraMOhYyBuaGF1Lg0KDQpgYGB7cn0NCmVwaXRhYih0czMsIG1ldGhvZCA9ICJvZGRzcmF0aW8iKQ0KYGBgDQoNCk5ow6xuIHbDoG8ga+G6v3QgcXXhuqMgdGEgdGjhuqV5LCB04bu3IGzhu4cgY2jDqm5oIGzhu4djaCBj4bunYSBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyDEkeG7mSBiw6lvIGzDoCAxLjI0ODcuIFThu6ljIGzDoCwgdOG7iSBs4buHIGNo4bqldCBsxrDhu6NuZyBz4buvYSB0aGVvIMSR4buZIGLDqW8gY2FvIGNhbyBoxqFuIHThu4kgbOG7hyBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyDEkeG7mSBiw6lvIHRo4bqlcC4gVHV5IG5oacOqbiwgZ2nDoSB0cuG7iyBwLXZhbHVlID0gMC4xMDE3IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBraMO0bmcgxJHDoW5nIGvhu4MgdGjhu5FuZyBrw6ouIFThu6ljIGzDoCBraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga+G7gyDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBy4bunaSBybyBnaeG7r2EgMiBuaMOzbSBraMOhYyBuaGF1Lg0KDQpjKSBCaeG7g3UgxJHhu5MNCg0KYGBge3J9DQpnZ3Bsb3QobWlsa25ldywgYWVzKEdyYWRlLCBmaWxsID0gRmF0KSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQpgYGANCg0KZCkgS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wDQoNCkdp4bqjIHRodXnhur90Og0KDQokSF8wJDogQmnhur9uIEdyYWRlIHbDoCBiaeG6v24gRmF0IMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCiRIXzEkOiBCaeG6v24gR3JhZGUgdsOgIGJp4bq/biBGYXQga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCmBgYHtyfQ0KZ2lsIDwtIHRhYmxlIChtaWxrbmV3JEdyYWRlLCBtaWxrbmV3JEZhdCkNCmdpbA0KYGBgDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChnaWwpDQpgYGANClbDrCBwX3ZhbHVlID0gMi4yZS0xNiA8IDAuMDUgbsOqbiB0YSBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzEkLiBOZ2jEqWEgbMOgIGJp4bq/biBHcmFkZSB2w6AgYmnhur9uIGtow7RuZyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdS4NCg0KIyMjIE3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIEdyYWRlIHbDoCBiaeG6v24gVHVyYmlkaXR5DQoNCmEpIELhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQp0czQgPC0gdGFibGUobWlsa25ldyRHcmFkZSwgbWlsa25ldyRUdXJiaWRpdHkpDQp0czQNCmBgYA0KDQpgYGB7cn0NCnRzNDQgPC0gcHJvcC50YWJsZSh0czQpDQphZGRtYXJnaW5zKHRzNDQpDQpgYGANCg0KTmjDrG4gdsOgbyBi4bqjbmcsIHRhIHRo4bqleToNCg0KKiBDw7MgMTk0IG3huqt1IHPhu69hIGPDsyDEkeG7mSDEkeG7pWMgY2FvIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyBjYW8sIGNoaeG6v20gMTguMzIlLg0KKiBDw7MgMzI2IG3huqt1IHPhu69hIGPDsyDEkeG7mSDEkeG7pWMgY2FvIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyB0aOG6pXAsIGNoaeG6v20gMzAuNzglLg0KKiBDw7MgMzE3IG3huqt1IHPhu69hIGPDsyDEkeG7mSDEkeG7pWMgdGjhuqVwIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyBjYW8sIGNoaeG6v20gMjkuOTMlLg0KKiBDw7MgMjIyIG3huqt1IHPhu69hIGPDsyDEkeG7mSDEkeG7pWMgdGjhuqVwIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyB0aOG6pXAsIGNoaeG6v20gMjAuOTYlLg0KDQpiKSBS4bunaSBybyB0xrDGoW5nIMSR4buRaSB2w6AgdOG7tyBs4buHIGNow6puaCBs4buHY2gNCg0KYGBge3J9DQplcGl0YWIodHM0LCBtZXRob2QgPSAicmlza3JhdGlvIikNCmBgYA0KDQpOaMOsbiB2w6BvIGvhur90IHF14bqjIHRhIHRo4bqleSwgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgY+G7p2EgY2jhuqV0IGzGsOG7o25nIHPhu69hIHRoZW8gxJHhu5kgYsOpbyBsw6AgMC42MzgyLiBU4bupYyBsw6AsIHThu4kgbOG7hyBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyDEkeG7mSDEkeG7pWMgY2FvIHRo4bqlcCBoxqFuIHThu4kgbOG7hyBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGhlbyDEkeG7mSDEkeG7pWMgdGjhuqVwLiBHacOhIHRy4buLIHAtdmFsdWUgPSAzLjAzMDM5MmUtMTIgcuG6pXQgbmjhu48gKGfhuqduIGLhurFuZyAwKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogxJHDoW5nIGvhu4MuDQoNCmBgYHtyfQ0KZXBpdGFiKHRzNCwgbWV0aG9kID0gIm9kZHNyYXRpbyIpDQpgYGANCg0KTmjDrG4gdsOgbyBr4bq/dCBxdeG6oyB0YSB0aOG6pXksIHThu7cgbOG7hyBjaMOqbmggbOG7h2NoIGPhu6dhIGNo4bqldCBsxrDhu6NuZyBz4buvYSB0aGVvIMSR4buZIGLDqW8gbMOgIDAuNDE2OC4gVOG7qWMgbMOgLCB04buJIGzhu4cgY2jhuqV0IGzGsOG7o25nIHPhu69hIHRoZW8gxJHhu5kgxJHhu6VjIGNhbyB0aOG6pXAgaMahbiB04buJIGzhu4cgY2jhuqV0IGzGsOG7o25nIHPhu69hIHRoZW8gxJHhu5kgxJHhu6VjIHRo4bqlcC4gR2nDoSB0cuG7iyBwLXZhbHVlID0gMy4wMzAzOTJlLTEyIHLhuqV0IG5o4buPIChn4bqnbiBi4bqxbmcgMCkgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBuw6B5IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIMSRw6FuZyBr4buDLg0KDQpjKSBCaeG7g3UgxJHhu5MNCg0KYGBge3J9DQpnZ3Bsb3QobWlsa25ldywgYWVzKEdyYWRlLCBmaWxsID0gVHVyYmlkaXR5KSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQpgYGANCg0KZCkgS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wDQoNCkdp4bqjIHRodXnhur90Og0KDQokSF8wJDogQmnhur9uIEdyYWRlIHbDoCBiaeG6v24gVHVyYmlkaXR5IMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCiRIXzEkOiBCaeG6v24gR3JhZGUgdsOgIGJp4bq/biBUdXJiaWRpdHkga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCmBgYHtyfQ0KZ2lsIDwtIHRhYmxlIChtaWxrbmV3JEdyYWRlLCBtaWxrbmV3JFR1cmJpZGl0eSkNCmdpbA0KYGBgDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChnaWwpDQpgYGANClbDrCBwX3ZhbHVlID0gMy45MjZlLTEyIDwgMC4wNSBuw6puIHRhIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMSQuIE5naMSpYSBsw6AgYmnhur9uIEdyYWRlIHbDoCBiaeG6v24gVHVyYmlkaXR5IGtow7RuZyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdS4NCg0KIyMjIE3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIEdyYWRlIHbDoCBiaeG6v24gcEgNCg0KTcOjIGjDs2EgYmnhur9uIMSR4buLbmggbMaw4bujbmcgcEggdGjDoG5oIMSR4buLbmggdMOtbmggbmjhurFtIMSR4buDIHRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/bg0KDQpgYGB7cn0NCnBIMSA8LSBjdXQobWlsa25ldyRwSCwgYnJlYWtzID0gYygyLDYuMjUsMTApLCBsYWJlbHMgPSBjKCJraMO0bmciLCAibeG7mXQiKSkNCmBgYA0KDQphKSBC4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KdHM1IDwtIHRhYmxlKG1pbGtuZXckR3JhZGUsIHBIMSkNCnRzNQ0KYGBgDQoNCmBgYHtyfQ0KdHM1NSA8LSBwcm9wLnRhYmxlKHRzNSkNCmFkZG1hcmdpbnModHM1NSkNCmBgYA0KDQpOaMOsbiB2w6BvIGLhuqNuZywgdGEgdGjhuqV5Og0KDQoqIEPDsyA1MTEgbeG6q3Ugc+G7r2EgY8OzIMSR4buZIHBIIHBow7kgaOG7o3AgxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIGNhbywgY2hp4bq/bSA0OC4yNSUuDQoqIEPDsyAzNzkgbeG6q3Ugc+G7r2EgY8OzIMSR4buZIHBIIHBow7kgaOG7o3AgxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIHRo4bqlcCwgY2hp4bq/bSAzNS43OSUuDQoqIEPDsyAwIG3huqt1IHPhu69hIGPDsyDEkeG7mSBwSCBwaMO5IGjhu6NwIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyBjYW8sIGNoaeG6v20gMCUuDQoqIEPDsyAxNjkgbeG6q3Ugc+G7r2EgY8OzIMSR4buZIHBIIGtow7RuZyBwaMO5IGjhu6NwIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyB0aOG6pXAsIGNoaeG6v20gMTYlLg0KDQpiKSBCaeG7g3UgxJHhu5MNCg0KYGBge3J9DQpnZ3Bsb3QobWlsa25ldywgYWVzKEdyYWRlLCBmaWxsID0gcEgxKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQpgYGANCg0KYykgS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wDQoNCkdp4bqjIHRodXnhur90Og0KDQokSF8wJDogQmnhur9uIEdyYWRlIHbDoCBiaeG6v24gcEggxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KJEhfMSQ6IEJp4bq/biBHcmFkZSB2w6AgYmnhur9uIHBIIGtow7RuZyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdQ0KDQpgYGB7cn0NCmdpbCA8LSB0YWJsZSAobWlsa25ldyRHcmFkZSwgbWlsa25ldyRwSCkNCmdpbA0KYGBgDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChnaWwpDQpgYGANCg0KVsOsIHBfdmFsdWUgPSAyLjJlLTE2IDwgMC4wNSBuw6puIHRhIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMSQuIE5naMSpYSBsw6AgYmnhur9uIEdyYWRlIHbDoCBiaeG6v24gcEgga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBuaGF1Lg0KDQojIyMgTeG7kWkgcXVhbiBo4buHIGdp4buvYSBiaeG6v24gR3JhZGUgdsOgIGJp4bq/biBUZW1wcmF0dXJlDQoNCk3DoyBow7NhIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIFRlbXByYXR1cmUgdGjDoG5oIMSR4buLbmggdMOtbmggbmjhurFtIMSR4buDIHRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/bg0KDQpgYGB7cn0NClRlbXByYXR1cmUxIDwtIGN1dChtaWxrbmV3JFRlbXByYXR1cmUsIGJyZWFrcyA9IGMoMzMsNDUuNSw5MSksIGxhYmVscyA9IGMoIm3hu5l0IiwgImtow7RuZyIpKQ0KYGBgDQoNCmEpIELhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQp0czYgPC0gdGFibGUobWlsa25ldyRHcmFkZSwgVGVtcHJhdHVyZTEpDQp0czYNCmBgYA0KDQpgYGB7cn0NCnRzNjYgPC0gcHJvcC50YWJsZSh0czYpDQphZGRtYXJnaW5zKHRzNjYpDQpgYGANCg0KTmjDrG4gdsOgbyBi4bqjbmcsIHRhIHRo4bqleToNCg0KKiBDw7MgNTA4IG3huqt1IHPhu69hIGPDsyBuaGnhu4d0IMSR4buZIHBow7kgaOG7o3AgxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIGNhbywgY2hp4bq/bSA0Ny45NyUuDQoqIEPDsyAzNDIgbeG6q3Ugc+G7r2EgY8OzIG5oaeG7h3QgxJHhu5kgcGjDuSBo4bujcCDEkcaw4bujYyDEkcOhbmggZ2nDoSBjaOG6pXQgbMaw4bujbmcgdGjhuqVwLCBjaGnhur9tIDMyLjI5JS4NCiogQ8OzIDMgbeG6q3Ugc+G7r2EgY8OzIG5oaeG7h3QgxJHhu5kga2jDtG5nIHBow7kgaOG7o3AgxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIGNhbywgY2hp4bq/bSAwLjAwMyUuDQoqIEPDsyAyMDYgbeG6q3Ugc+G7r2EgY8OzIG5oaeG7h3QgxJHhu5kga2jDtG5nIHBow7kgaOG7o3AgxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIHRo4bqlcCwgY2hp4bq/bSAxOS40NSUuDQoNCmIpIEJp4buDdSDEkeG7kw0KDQpgYGB7cn0NCmdncGxvdChtaWxrbmV3LCBhZXMoR3JhZGUsIGZpbGwgPSBUdXJiaWRpdHkpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJykNCmBgYA0KDQpjKSBLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiRIXzAkOiBCaeG6v24gR3JhZGUgdsOgIGJp4bq/biBUdXJiaWRpdHkgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KJEhfMSQ6IEJp4bq/biBHcmFkZSB2w6AgYmnhur9uIFR1cmJpZGl0eSBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KYGBge3J9DQpnaWwgPC0gdGFibGUgKG1pbGtuZXckR3JhZGUsIG1pbGtuZXckVHVyYmlkaXR5KQ0KZ2lsDQpgYGANCg0KYGBge3J9DQpjaGlzcS50ZXN0KGdpbCkNCmBgYA0KVsOsIHBfdmFsdWUgPSAzLjkyNmUtMTIgPCAwLjA1IG7Dqm4gdGEgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8xJC4gTmdoxKlhIGzDoCBiaeG6v24gR3JhZGUgdsOgIGJp4bq/biBUdXJiaWRpdHkga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBuaGF1Lg0KDQojIyMgTeG7kWkgcXVhbiBo4buHIGdp4buvYSBiaeG6v24gR3JhZGUgdsOgIGJp4bq/biBDb2xvdXINCg0KTcOjIGjDs2EgYmnhur9uIMSR4buLbmggbMaw4bujbmcgQ29sb3VyIHRow6BuaCDEkeG7i25oIHTDrW5oIG5o4bqxbSDEkeG7gyB0aOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24NCg0KYGBge3J9DQpDb2xvdXIxIDwtIGN1dChtaWxrbmV3JENvbG91ciwgYnJlYWtzID0gYygyMzksMjQzLDI1NiksIGxhYmVscyA9IGMoImtow7RuZyIsICJt4buZdCIpKQ0KYGBgDQoNCmEpIELhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQp0czcgPC0gdGFibGUobWlsa25ldyRHcmFkZSwgQ29sb3VyMSkNCnRzNw0KYGBgDQoNCmBgYHtyfQ0KdHM3NyA8LSBwcm9wLnRhYmxlKHRzNykNCmFkZG1hcmdpbnModHM3NykNCmBgYA0KDQpOaMOsbiB2w6BvIGLhuqNuZywgdGEgdGjhuqV5Og0KDQoqIEPDsyA0OTIgbeG6q3Ugc+G7r2EgY8OzIG3DoHUgcGjDuSBo4bujcCDEkcaw4bujYyDEkcOhbmggZ2nDoSBjaOG6pXQgbMaw4bujbmcgY2FvLCBjaGnhur9tIDQ2LjQ2JS4NCiogQ8OzIDUzNSBt4bqrdSBz4buvYSBjw7MgbcOgdSBwaMO5IGjhu6NwIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyB0aOG6pXAsIGNoaeG6v20gNTAuNTIlLg0KKiBDw7MgMTkgbeG6q3Ugc+G7r2EgY8OzIG3DoHUga2jDtG5nIHBow7kgaOG7o3AgxJHGsOG7o2MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIGNhbywgY2hp4bq/bSAxLjc5JS4NCiogQ8OzIDEzIG3huqt1IHPhu69hIGPDsyBtw6B1IGtow7RuZyBwaMO5IGjhu6NwIMSRxrDhu6NjIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyB0aOG6pXAsIGNoaeG6v20gMS4yMyUuDQoNCmIpIEJp4buDdSDEkeG7kw0KDQpgYGB7cn0NCmdncGxvdChtaWxrbmV3LCBhZXMoR3JhZGUsIGZpbGwgPSBDb2xvdXIpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJykNCmBgYA0KDQpjKSBLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiRIXzAkOiBCaeG6v24gR3JhZGUgdsOgIGJp4bq/biBUdXJiaWRpdHkgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KJEhfMSQ6IEJp4bq/biBHcmFkZSB2w6AgYmnhur9uIFR1cmJpZGl0eSBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KYGBge3J9DQpnaWwgPC0gdGFibGUgKG1pbGtuZXckR3JhZGUsIG1pbGtuZXckQ29sb3VyKQ0KZ2lsDQpgYGANCg0KYGBge3J9DQpjaGlzcS50ZXN0KGdpbCkNCmBgYA0KVsOsIHBfdmFsdWUgPSAyLjJlLTE2IDwgMC4wNSBuw6puIHRhIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMSQuIE5naMSpYSBsw6AgYmnhur9uIEdyYWRlIHbDoCBiaeG6v24gQ29sb3VyIGtow7RuZyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdS4NCg0KIyMgS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hw0KDQojIyMgxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyBjaOG6pXQgbMaw4bujbmcgc+G7r2ENCg0KYGBge3J9DQphIDwtIG1pbGtuZXdbbWlsa25ldyRHcmFkZSA9PSAiMSIsXQ0KcHJvcC50ZXN0KGxlbmd0aChhJEdyYWRlKSwgbGVuZ3RoKG1pbGtuZXckR3JhZGUpKQ0KYGBgDQoNClbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUsIHThu7cgbOG7hyBjaOG6pXQgbMaw4bujbmcgc+G7r2EgY2FvIHNvIHbhu5tpIHThu5VuZyB0aOG7gyBu4bqxbSB0cm9uZyBraG/huqNuZyA0NS4yMSUgxJHhur9uIDUxLjMxJS4gSGF5IG7Ds2kgY8OhY2gga2jDoWMsIHThu7cgbOG7hyBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdGjhuqVwIHNvIHbhu5tpIHThu5VuZyB0aOG7gyBu4bqxbSB0cm9uZyBraG/huqNuZyA0OC42OSUgxJHhur9uIDU0Ljc5JS4NCg0KIyMjIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgbcO5aSBj4bunYSBz4buvYQ0KDQpgYGB7cn0NCmIgPC0gbWlsa25ld1ttaWxrbmV3JE9kb3IgPT0gIjEiLF0NCnByb3AudGVzdChsZW5ndGgoYiRPZG9yKSwgbGVuZ3RoKG1pbGtuZXckT2RvcikpDQpgYGANCg0KVuG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSwgdOG7tyBs4buHIG3DuWkgc+G7r2EgdGjGoW0gc28gduG7m2kgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIDQwLjI1JSDEkeG6v24gNDYuMyUuIEhheSBuw7NpIGPDoWNoIGtow6FjLCB04bu3IGzhu4cgbcO5aSBz4buvYSBraMO0bmcgdGjGoW0gc28gduG7m2kgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIDUzLjclIMSR4bq/biA1OS43NSUuDQoNCiMjIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIMSR4buZIGLDqW8gY+G7p2Egc+G7r2ENCg0KYGBge3J9DQpjIDwtIG1pbGtuZXdbbWlsa25ldyRGYXQgPT0gIjEiLF0NCnByb3AudGVzdChsZW5ndGgoYyRGYXQpLCBsZW5ndGgobWlsa25ldyRGYXQpKQ0KYGBgDQoNClbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUsIHThu7cgbOG7hyDEkeG7mSBiw6lvIHPhu69hIGNhbyBzbyB24bubaSB04buVbmcgdGjhu4MgbuG6sW0gdHJvbmcga2hv4bqjbmcgNjQuMjAlIMSR4bq/biA2OS45NSUuIEhheSBuw7NpIGPDoWNoIGtow6FjLCB04bu3IGzhu4cgxJHhu5kgYsOpbyBz4buvYSB0aOG6pXAgc28gduG7m2kgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIDMwLjA1JSDEkeG6v24gMzUuODAlLg0KDQojIyMgxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyDEkeG7mSDEkeG7pWMgY+G7p2Egc+G7r2ENCg0KYGBge3J9DQpkIDwtIG1pbGtuZXdbbWlsa25ldyRUdXJiaWRpdHkgPT0gIjEiLF0NCnByb3AudGVzdChsZW5ndGgoZCRHcmFkZSksIGxlbmd0aChtaWxrbmV3JFR1cmJpZGl0eSkpDQpgYGANCg0KVuG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSwgdOG7tyBs4buHIMSR4buZIMSR4bulYyBz4buvYSBjYW8gc28gduG7m2kgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIDQ2LjA1JSDEkeG6v24gNTIuMTYlLiBIYXkgbsOzaSBjw6FjaCBraMOhYywgdOG7tyBs4buHIMSR4buZIMSR4bulYyBz4buvYSB0aOG6pXAgc28gduG7m2kgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIDQ3Ljg0JSDEkeG6v24gNTMuOTUlLg0KDQojIyDGr+G7m2MgbMaw4bujbmcgbcO0IGjDrG5oIGjhu5NpIHF1eQ0KDQojIyMgSOG7k2kgcXV5IHbhu5tpIGjDoG0gcHJvYml0DQoNCmBgYHtyfQ0KIyBI4buTaSBxdXkgduG7m2kgaMOgbSBwcm9iaXQNCmZpdDEgPC0gZ2xtKEdyYWRlIH4gbWlsa25ldyRPZG9yICsgbWlsa25ldyRGYXQgKyBtaWxrbmV3JFR1cmJpZGl0eSArIG1pbGtuZXckcEggKyBtaWxrbmV3JFRlbXByYXR1cmUgKyBtaWxrbmV3JENvbG91ciAsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IiksIGRhdGEgPSBtaWxrbmV3KQ0Kc3VtbWFyeShmaXQxKQ0KYGBgDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBz4buxIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oIGLhurFuZyBjw6FjaCB0w61uaCBnacOhIHRy4buLIFByb2IoTFIgc3RhdGlzdGljKQ0KbHJfdGVzdCA8LSBhbm92YShmaXQxLCB0ZXN0ID0gIkNoaXNxIikNCnBfdmFsdWUgPC0gbHJfdGVzdCRQclsyXSANCnBfdmFsdWUNCmBgYA0KDQpLaeG7g20gxJHhu4tuaCBz4buxIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oOg0KDQoqICRIXzAkOiBNw7QgaMOsbmgga2jDtG5nIHBow7kgaOG7o3ANCiogJEhfMSQ6IE3DtCBow6xuaCBwaMO5IGjhu6NwDQoNClbhu5tpIFAtdmFsdWUgPSBQcm9iKExSKSA8IDAgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8xJCBuw6puIG3DtCBow6xuaCBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1Lg0KDQpgYGB7cn0NCiMgR2nDoSB0cuG7iyBCcmllclNjb3JlDQpCcmllclNjb3JlKGZpdDEpDQpgYGANCg0KYGBge3J9DQojIE1hIHRy4bqtbiBuaOG6p20gbOG6q24NCnByZWRpY3Rpb25zIDwtIHByZWRpY3QoZml0MSwgbmV3ZGF0YSA9IG1pbGtuZXcsIHR5cGUgPSAicmVzcG9uc2UiKQ0KcHJlZGljdGVkX2NsYXNzZXMgPC0gaWZlbHNlKHByZWRpY3Rpb25zID4gMC41LCAiMSIsICIwIikNCnByZWRpY3Rpb25zMTwtZmFjdG9yKHByZWRpY3RlZF9jbGFzc2VzLCBsZXZlbHMgPSBjKCIwIiwiMSIpKQ0KYWN0dWFsPC0gZmFjdG9yKG1pbGtuZXckR3JhZGUsIGxhYmVscyA9IGMoIjAiLCIxIikpDQpjb25mdXNpb25NYXRyaXgodGFibGUocHJlZGljdGlvbnMxLCBhY3R1YWwpKQ0KYGBgDQoNCiMjIyBI4buTaSBxdXkgduG7m2kgaMOgbSBsb2dpdA0KDQpgYGB7cn0NCiMgSOG7k2kgcXV5IHbhu5tpIGjDoG0gbG9naXQNCmZpdDIgPC0gZ2xtKEdyYWRlIH4gbWlsa25ldyRPZG9yICsgbWlsa25ldyRGYXQgKyBtaWxrbmV3JFR1cmJpZGl0eSArIG1pbGtuZXckcEggKyBtaWxrbmV3JFRlbXByYXR1cmUgKyBtaWxrbmV3JENvbG91ciAsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSwgZGF0YSA9IG1pbGtuZXcpDQpzdW1tYXJ5KGZpdDIpDQpgYGANCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIHPhu7EgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggYuG6sW5nIGPDoWNoIHTDrW5oIGdpw6EgdHLhu4sgUHJvYihMUiBzdGF0aXN0aWMpDQpscl90ZXN0IDwtIGFub3ZhKGZpdDIsIHRlc3QgPSAiQ2hpc3EiKQ0KcF92YWx1ZSA8LSBscl90ZXN0JFByWzJdIA0KcF92YWx1ZQ0KYGBgDQoNCktp4buDbSDEkeG7i25oIHPhu7EgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmg6DQoNCiogJEhfMCQ6IE3DtCBow6xuaCBraMO0bmcgcGjDuSBo4bujcA0KKiAkSF8xJDogTcO0IGjDrG5oIHBow7kgaOG7o3ANCg0KVuG7m2kgUC12YWx1ZSA9IFByb2IoTFIpIDwgMCBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzEkIG7Dqm4gbcO0IGjDrG5oIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UuDQoNCmBgYHtyfQ0KIyBHacOhIHRy4buLIEJyaWVyU2NvcmUNCkJyaWVyU2NvcmUoZml0MikNCmBgYA0KDQpgYGB7cn0NCiMgTWEgdHLhuq1uIG5o4bqnbSBs4bqrbg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdChmaXQyLCBuZXdkYXRhID0gbWlsa25ldywgdHlwZSA9ICJyZXNwb25zZSIpDQpwcmVkaWN0ZWRfY2xhc3NlcyA8LSBpZmVsc2UocHJlZGljdGlvbnMgPiAwLjUsICIxIiwgIjAiKQ0KcHJlZGljdGlvbnMxPC1mYWN0b3IocHJlZGljdGVkX2NsYXNzZXMsIGxldmVscyA9IGMoIjAiLCIxIikpDQphY3R1YWw8LSBmYWN0b3IobWlsa25ldyRHcmFkZSwgbGFiZWxzID0gYygiMCIsIjEiKSkNCmNvbmZ1c2lvbk1hdHJpeCh0YWJsZShwcmVkaWN0aW9uczEsIGFjdHVhbCkpDQpgYGANCg0KIyMjIEjhu5NpIHF1eSB24bubaSBow6BtIGNsb2dsb2cNCg0KYGBge3J9DQojIEjhu5NpIHF1eSB24bubaSBow6BtIHByb2JpdA0KZml0MyA8LSBnbG0oR3JhZGUgfiBtaWxrbmV3JE9kb3IgKyBtaWxrbmV3JEZhdCArIG1pbGtuZXckVHVyYmlkaXR5ICsgbWlsa25ldyRwSCArIG1pbGtuZXckVGVtcHJhdHVyZSArIG1pbGtuZXckQ29sb3VyICwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJjbG9nbG9nIiksIGRhdGEgPSBtaWxrbmV3KQ0Kc3VtbWFyeShmaXQzKQ0KYGBgDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBz4buxIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oIGLhurFuZyBjw6FjaCB0w61uaCBnacOhIHRy4buLIFByb2IoTFIgc3RhdGlzdGljKQ0KbHJfdGVzdCA8LSBhbm92YShmaXQzLCB0ZXN0ID0gIkNoaXNxIikNCnBfdmFsdWUgPC0gbHJfdGVzdCRQclsyXSANCnBfdmFsdWUNCmBgYA0KDQpLaeG7g20gxJHhu4tuaCBz4buxIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oOg0KDQoqICRIXzAkOiBNw7QgaMOsbmgga2jDtG5nIHBow7kgaOG7o3ANCiogJEhfMSQ6IE3DtCBow6xuaCBwaMO5IGjhu6NwDQoNClbhu5tpIFAtdmFsdWUgPSBQcm9iKExSKSA8IDAgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8xJCBuw6puIG3DtCBow6xuaCBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1Lg0KDQpgYGB7cn0NCiMgR2nDoSB0cuG7iyBCcmllclNjb3JlDQpCcmllclNjb3JlKGZpdDMpDQpgYGANCg0KYGBge3J9DQojIE1hIHRy4bqtbiBuaOG6p20gbOG6q24NCnByZWRpY3Rpb25zIDwtIHByZWRpY3QoZml0MywgbmV3ZGF0YSA9IG1pbGtuZXcsIHR5cGUgPSAicmVzcG9uc2UiKQ0KcHJlZGljdGVkX2NsYXNzZXMgPC0gaWZlbHNlKHByZWRpY3Rpb25zID4gMC41LCAiMSIsICIwIikNCnByZWRpY3Rpb25zMTwtZmFjdG9yKHByZWRpY3RlZF9jbGFzc2VzLCBsZXZlbHMgPSBjKCIwIiwiMSIpKQ0KYWN0dWFsPC0gZmFjdG9yKG1pbGtuZXckR3JhZGUsIGxhYmVscyA9IGMoIjAiLCIxIikpDQpjb25mdXNpb25NYXRyaXgodGFibGUocHJlZGljdGlvbnMxLCBhY3R1YWwpKQ0KYGBgDQoNCiMjIyBM4buxYSBjaOG7jW4gbcO0IGjDrG5oIHBow7kgaOG7o3ANCg0KfCBNw7QgaMOsbmggfCAgQUlDICAgfCBEZXZpYW5jZSB8IEJyaWVyIFNjb3JlIHwgxJDhu5kgY2jDrW5oIHjDoWMgfMSQ4buZIG5o4bqheSB8xJDhu5kgxJHhurdjIGhp4buHdSB8DQp8LS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS18DQp8IFByb2JpdCAgfCAxMjA4LjcgfCAgMTE5NC45ICB8ICAwLjE4Nzg1MDMgIHwgICAgMC43Mzk0ICAgIHwgMC42ODI1IHwgICAwLjgwMDQgICB8DQp8IExvZ2l0ICAgfCAxMTk0LjkgfCAgMTE4MC45ICB8ICAwLjE4NjU0MTYgIHwgICAgMC43MTc3ICAgIHwgMC42NTE1IHwgICAwLjc4ODYgICB8DQp8IENsb2dsb2cgfCAxMTkxLjUgfCAgMTE3Ny41ICB8ICAwLjE4Nzg2MzUgIHwgICAgMC42OTQxICAgIHwgMC42NjA2IHwgICAwLjcyOTkgICB8DQp8TOG7sWEgY2jhu41uIHwgIE1IMyAgIHwgICAgTUgzICAgfCAgICAgTUgyICAgICB8ICAgICAgTUgxICAgICB8ICAgTUgxICB8ICAgICBNSDEgICAgfA0KDQoNClThu6sga+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjLCBtw7QgaMOsbmggKipQcm9iaXQqKiBsw6AgbcO0IGjDrG5oIHRo4buPYSBtw6NuIGPDoWMgdGnDqnUgY2hpIMSRw6FuaCBnacOhIG5o4bqldCB0cm9uZyAzIG3DtCBow6xuaCDEkeG7gSB4deG6pXQuIERvIMSRw7MsIG3DtCBow6xuaCAqKlByb2JpdCoqIGzDoCBtw7QgaMOsbmggdOG7kWkgxrB1IG5o4bqldC4NCg0KIyMjIEdp4bqjaSB0aMOtY2ggbcO0IGjDrG5oDQoNCkjhu4cgc+G7kSBjaOG6t24gbMOgIDcuMDQ5NTQxLCBjw7MgbmdoxKlhIGzDoCBraGkgdOG6pXQgY+G6oyBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgYuG6sW5nIGtow7RuZywgeMOhYyBzdeG6pXQgY2jhuqV0IGzGsOG7o25nIHPhu69hIGzDoCAkXHBoaSQoNy4wNDk1NDEpLCB0cm9uZyDEkcOzICRccGhpJCBsw6AgaMOgbSBwaMOibiBwaOG7kWkgY2h14bqpbiB0w61jaCBsxal5Lg0KDQpI4buHIHPhu5EgT2RvciBsw6AgMC42NDIwMzEsIGPDsyBuZ2jEqWEgbMOgIGtoaSBtw7lpIGPhu6dhIHPhu69hIHTEg25nIGzDqm4gbeG7mXQgxJHGoW4gduG7iyAodOG7qyAwIHNhbmcgMSksIHjDoWMgc3XhuqV0IGNo4bqldCBsxrDhu6NuZyBz4buvYSB0xINuZyBsw6puICRccGhpJCgwLjY0MjAzMSkgxJHGoW4gduG7iyBjaHXhuqluIGhvw6EsIGdp4buvIG5ndXnDqm4gY8OhYyBiaeG6v24ga2jDoWMuDQoNCkjhu4cgc+G7kSBGYXQgbMOgIDAuMzE1MDgxLCBjw7MgbmdoxKlhIGzDoCBraGkgxJHhu5kgYsOpbyBj4bunYSBz4buvYSB0xINuZyBsw6puIG3hu5l0IMSRxqFuIHbhu4sgKHThu6sgMCBzYW5nIDEpLCB4w6FjIHN14bqldCBjaOG6pXQgbMaw4bujbmcgc+G7r2EgdMSDbmcgbMOqbiAkXHBoaSQoMC4zMTUwODEpIMSRxqFuIHbhu4sgY2h14bqpbiBob8OhLCBnaeG7ryBuZ3V5w6puIGPDoWMgYmnhur9uIGtow6FjLg0KDQpI4buHIHPhu5EgVHVyYmlkaXR5IGPhu6dhIHPhu69hIGzDoCAtMC44MTgyOTIsIGPDsyBuZ2jEqWEgbMOgIGtoaSDEkeG7mSDEkeG7pWMgY+G7p2Egc+G7r2EgdMSDbmcgbMOqbiBt4buZdCDEkcahbiB24buLICh04burIDAgc2FuZyAxKSwgeMOhYyBzdeG6pXQgY2jhuqV0IGzGsOG7o25nIHPhu69hIGdp4bqjbSDEkWkgJFxwaGkkKC0wLjgxODI5MikgxJHGoW4gduG7iyBjaHXhuqluIGhvw6EsIGdp4buvIG5ndXnDqm4gY8OhYyBiaeG6v24ga2jDoWMuDQoNCkjhu4cgc+G7kSBwSCBsw6AgMC4xMzk1NDIsIGPDsyBuZ2jEqWEgbMOgIGtoaSDEkeG7mSBwSCBj4bunYSBz4buvYSB0xINuZyBsw6puIG3hu5l0IMSRxqFuIHbhu4ssIHjDoWMgc3XhuqV0IGNo4bqldCBsxrDhu6NuZyBz4buvYSB0xINuZyBsw6puICRccGhpJCgwLjEzOTU0MikgxJHGoW4gduG7iyBjaHXhuqluIGhvw6EsIGdp4buvIG5ndXnDqm4gY8OhYyBiaeG6v24ga2jDoWMuDQoNCkjhu4cgc+G7kSBUZW1wcmF0dXJlIGzDoCAtMC4wNjUxNzUsIGPDsyBuZ2jEqWEgbMOgIGtoaSBuaGnhu4d0IMSR4buZIGPhu6dhIHPhu69hIHTEg25nIGzDqm4gbeG7mXQgxJHGoW4gduG7iywgeMOhYyBzdeG6pXQgY2jhuqV0IGzGsOG7o25nIHPhu69hIGdp4bqjbSDEkWkgJFxwaGkkKC0wLjA2NTE3NSkgxJHGoW4gduG7iyBjaHXhuqluIGhvw6EsIGdp4buvIG5ndXnDqm4gY8OhYyBiaeG6v24ga2jDoWMuDQoNCkjhu4cgc+G7kSBDb2xvdXIgY+G7p2Egc+G7r2EgbMOgIC0wLjAyMTA0MywgY8OzIG5naMSpYSBsw6Aga2hpIG3DoHUgY+G7p2Egc+G7r2EgdMSDbmcgbMOqbiBt4buZdCDEkcahbiB24buLLCB4w6FjIHN14bqldCBjaOG6pXQgbMaw4bujbmcgc+G7r2EgZ2nhuqNtIMSRaSAkXHBoaSQoLTAuMDIxMDQzKSDEkcahbiB24buLIGNodeG6qW4gaG/DoSwgZ2nhu68gbmd1ecOqbiBjw6FjIGJp4bq/biBraMOhYy4NCg0KQ8OhYyBQcig+fHp8KSBj4bunYSBjw6FjIGjhu4cgc+G7kSDEkeG7gXUgbmjhu48gaMahbiAwLjA1LCBjaG8gdGjhuqV5IHLhurFuZyA2IGJp4bq/biDEkcawYSB2w6BvIG3DtCBow6xuaCBo4buTaSBxdXkgxJHhu4MgcGjDom4gdMOtY2ggxJHhu4F1IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCiMgQ0jGr8agTkcgNC4gS+G6vlQgTFXhuqxOIFbDgCBI4bqgTiBDSOG6vg0KDQojIyBL4bq/dCBsdeG6rW4NCg0KVuG7m2kgbeG7pWMgxJHDrWNoIGNow61uaCBsw6AgKipQaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGNo4bqldCBsxrDhu6NuZyBz4buvYSoqLCB0w7RpIMSRw6Mgc+G7rSBk4bulbmcgYuG7mSBk4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIHThu6sgbsSDbSAyMDIyIMSR4buDIHRp4bq/biBow6BuaCDEkcOhbmggZ2nDoSBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGNo4bqldCBsxrDhu6NuZyBz4buvYS4gTcO0IGjDrG5oIHThu5FpIMawdSBnacO6cCB2aeG7h2MgxJHDoW5oIGdpw6EgaGnhu4d1IHF14bqjIGzDoCBtw7QgaMOsbmggKlByb2JpdCouDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIGNobyB0aOG6pXkgNiB54bq/dSB04buRIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbmjhurFtIHBow6JuIHTDrWNoIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyBz4buvYSDEkeG7gXUgY8OzIMO9IG5naMSpYS4gUXVhIMSRw7MsIHRhIGPDsyB0aOG7gyBwaMOhdCB0cmnhu4NuIHTDrG0gaGnhu4N1IHPDonUgaMahbiB24buBIGPDoWMgeeG6v3UgdOG7kSBuw6B5IG5o4bqxbSBjw7MgdGjhu4MgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIHPhu69hIGNow61uaCB4w6FjIGjGoW4gbuG7r2EuDQoNClF1YSBiw6BpIHBow6JuIHTDrWNoLCBjw6FjIGjhu5kgbsO0bmcgZMOibiBjaMSDbiBudcO0aSDEkcahbiBs4bq7IGhv4bq3YyB0cmFuZyB0cuG6oWkgYsOyIHPhu69hIGPDsyB0aOG7gyBk4buxYSB0aGVvIMSRw7MgbcOgIHThuqFvIHJhIG3DtGkgdHLGsOG7nW5nIHRow61jaCBo4bujcCBuaOG6pXQgxJHhu4MgxJHDoG4gYsOyIGPDsyB0aOG7gyBjaG8gcmEgY8OhYyBz4bqjbiBwaOG6qW0gc+G7r2EgY2jhuqV0IGzGsOG7o25nLCBkaW5oIGTGsOG7oW5nIG5o4bqldCDEkeG6v24gdGF5IG5nxrDhu51pIHRpw6p1IGTDuW5nLg0KDQojIyBI4bqhbiBjaOG6vw0KDQpC4buZIGThu68gbGnhu4d1IMSRxrDhu6NjIHRodSB0aOG6rXAgdOG7qyBuxrDhu5tjIG5nb8OgaSB2w6AgxJHGsOG7o2MgxJHEg25nIHThuqNpIHRyw6puIGludGVybmV0IG7Dqm4gdOG7tyBs4buHIGNow61uaCB4w6FjIHPhur0ga2jDtG5nIHR1eeG7h3QgxJHhu5FpIG7Dqm4uIMSQw7MgY8WpbmcgY2jDrW5oIGzDoCBuZ3V5w6puIG5ow6JuIGThuqtuIMSR4bq/biBt4buZdCBz4buRIGLhuqV0IGPhuq1wIHRyb25nIHF1w6EgdHLDrG5oIG5naGnDqm4gY+G7qXUsIGzDoG0geHXhuqV0IGhp4buHbiBjw6FjIGJp4bq/biBOQSBraMO0bmcgeMOhYyDEkeG7i25oLg0KDQpCw6BpIHBow6JuIHTDrWNoIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gdHLDqm4gcGjDom4gbeG7gW0gUiAmIFJTdHVkaW8uIE5oxrBuZyBkbyDEkcOieSBjxaluZyBsw6AgcGjhuqduIG3hu4FtIG3hu5tpIHh14bqldCBoaeG7h24gdOG7qyBraG/huqNuZyBuaOG7r25nIG7Eg20gMTk5MyBuw6puIHZp4buHYyBjw7Mgbmjhu69uZyBuZ2hpw6puIGPhu6l1IHPDonUgc+G6r2MgduG7gSBuw7MgdMawxqFuZyDEkeG7kWkgw610LiBD4buZbmcgdGjDqm0gc+G7sSBub24ga8OpbSBraW5oIG5naGnhu4dtIGPhu6dhIHNpbmggdmnDqm4gbsOqbiBraGkgdGjhu7FjIGhp4buHbiBuZ2hpw6puIGPhu6l1IGLhurFuZyBwaOG6p24gbeG7gW0gbsOgeSBjw7JuIG5oaeG7gXUgYuG6pXQgY+G6rXAgdsOgIGNo4buXIGNoxrBhIGNow61uaCB4w6FjLg0KDQojIFTDgEkgTEnhu4ZVIFRIQU0gS0jhuqJPDQoNClsxXSBSYWplbmRyYW4sIFMuICgyMDIyKSBNaWxrIHF1YWxpdHkgcHJlZGljdGlvbiwgS2FnZ2xlLiBBdmFpbGFibGUgYXQ6IGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvY3BsdXpzaHJpamF5YW4vbWlsa3F1YWxpdHkuIA0KDQpbMl0gVHLhuqduIEtpbSBUaGFuaCwgVHLhuqduIE3huqFuaCBUxrDhu51uZywgVsWpIEFuaCBMaW5oIER1eTog4oCcR2nDoW8gdHLDrG5oIFBow6JuIHTDrWNoIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmjigJ0sIHRyxrDhu51uZyDEkOG6oWkgaOG7jWMgVMOgaSBjaMOtbmgg4oCTIE1hcmtldGluZywgVGjDoG5oIHBo4buRIEjhu5MgQ2jDrSBNaW5oLg0K