PHÂN TÍCH CÁC YẾU TỐ ẢNH HƯỞNG ĐẾN QUYẾT ĐỊNH ĐĂNG KÝ TIỀN GỬI CÓ KỲ HẠN CỦA KHÁCH HÀNG

Giảng viên hướng dẫn: ThS. Trần Mạnh Tường

Sinh viên thực hiện: Lê Ngọc Tường Vy

Thành phố Hồ Chí Minh, tháng 08 năm 2025

LỜI CẢM ƠN

Em xin gửi lời cảm ơn chân thành và sâu sắc nhất đến ThS. Trần Mạnh Tường vì Thầy đã truyền đạt cho em những kiến thức quý báu của môn Phân Tích Dữ Liệu Định Tính. Nhờ sự giảng dạy tận tâm và nhiệt huyết của Thầy, em đã có cơ hội tiếp cận và hiểu rõ hơn về những khái niệm phức tạp và ứng dụng thực tiễn của môn học. Đặc biệt, em rất biết ơn sự hỗ trợ và hướng dẫn của Thầy trong suốt quá trình em làm tiểu luận Phân Tích Dữ Liệu Định Tính. Những gợi ý và góp ý của Thầy đã giúp em hoàn thiện và nâng cao chất lượng bài tiểu luận của mình. Em cảm thấy rất may mắn và trân trọng khi có Thầy là người dẫn dắt và hỗ trợ trong quá trình học tập. Một lần nữa, em xin chân thành cảm ơn Thầy vì tất cả những gì Thầy đã làm cho em và các bạn sinh viên. Em kính chúc Thầy luôn mạnh khỏe, hạnh phúc và thành công trong sự nghiệp giảng dạy.

LỜI CAM ĐOAN

Tôi xin cam kết rằng tiểu luận “Phân Tích Dữ Liệu Định Tính” này là kết quả của quá trình nghiên cứu và làm việc nghiêm túc của bản thân tôi, dưới sự hướng dẫn tận tình của Thầy Trần Mạnh Tường. Trong quá trình thực hiện, tôi đã hết sức cẩn trọng trong việc thu thập, phân tích dữ liệu và tuân thủ đầy đủ các quy định về trích dẫn tài liệu, đảm bảo tính trung thực và khoa học của tiểu luận. Tôi xin khẳng định rằng mọi nội dung trong tiểu luận đều do tôi tự nghiên cứu và không sao chép từ bất kỳ nguồn tài liệu hay công trình nào khác. Nếu có sử dụng tài liệu tham khảo, tôi đã nêu rõ nguồn gốc. Tôi hiểu rằng việc gian lận, sao chép hay vi phạm bản quyền sẽ bị xử lý nghiêm theo quy định của nhà trường, và tôi hoàn toàn chịu trách nhiệm về những gì đã trình bày trong tiểu luận này. Bằng tất cả sự nghiêm túc và lòng tôn trọng đối với học thuật, tôi cam đoan những gì trình bày là kết quả của sự nỗ lực chân thành của bản thân mình.


1 . CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI

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

Trong những năm gần đây, thị trường tài chính - ngân hàng đang chứng kiến sự cạnh tranh ngày càng gay gắt giữa các tổ chức tín dụng trong việc thu hút và duy trì nguồn tiền gửi từ khách hàng cá nhân. Trong đó, tiền gửi có kỳ hạn là một sản phẩm quan trọng bởi nó không chỉ giúp ngân hàng ổn định nguồn vốn trung dài hạn mà còn phản ánh niềm tin của khách hàng vào chính sách lãi suất và uy tín tổ chức tài chính. Tuy nhiên, thực tế cho thấy tỷ lệ khách hàng tham gia tiền gửi có kỳ hạn vẫn còn nhiều biến động, phụ thuộc vào nhiều yếu tố khác nhau như nhân khẩu học, tình trạng tài chính, phương thức tiếp cận hay trải nghiệm dịch vụ. Điều này đặt ra câu hỏi cấp thiết: điều gì thực sự ảnh hưởng đến quyết định đăng ký tiền gửi có kỳ hạn của khách hàng?

Từ đó, tác giả quyết định sử dụng bộ dữ liệu Bank Marketing đến từ Bồ Đào Nha, nơi đã ghi lại chi tiết các thông tin về đặc điểm khách hàng và kết quả sau mỗi cuộc gọi tiếp thị nhằm mời chào họ gửi tiền. Dữ liệu không chỉ có quy mô lớn (hơn 45.000 quan sát) mà còn phản ánh chân thực cách thức khách hàng phản hồi với chiến dịch tiếp thị qua điện thoại, một hình thức vẫn đang được nhiều ngân hàng tại Việt Nam áp dụng. Mặc dù được thu thập tại châu Âu, bộ dữ liệu này có giá trị tham khảo cao do nhiều yếu tố hành vi và tâm lý người tiêu dùng có tính phổ quát. Do đó, việc khai thác dữ liệu này không chỉ giúp tác giả tiếp cận góc nhìn quốc tế mà còn cung cấp nền tảng để rút ra những hàm ý có giá trị thực tiễn đối với thị trường Việt Nam.

Về mặt thực tiễn, nghiên cứu kỳ vọng sẽ đưa ra các hàm ý giúp ngân hàng hiểu rõ hơn nhóm khách hàng mục tiêu, từ đó điều chỉnh chiến lược tiếp thị một cách tinh gọn, cá nhân hóa và tiết kiệm chi phí. Đồng thời, việc xác định được các yếu tố có ảnh hưởng tích cực đến khả năng đăng ký tiền gửi có kỳ hạn sẽ hỗ trợ các nhà quản trị thiết kế sản phẩm phù hợp với nhu cầu và hành vi của khách hàng trong từng phân khúc cụ thể. Đây không chỉ là đóng góp cho hoạt động kinh doanh, mà còn là cầu nối giữa nghiên cứu học thuật và thực tiễn thị trường tài chính - ngân hàng hiện đại. Chính vì những lý do kể trên, việc thực hiện đề tài “Phân tích các yếu tố ảnh hưởng đến quyết định đăng ký tiền gửi có kỳ hạn của khách hàng” là vô cùng cần thiết và có ý nghĩa cả về mặt lý luận lẫn thực tiễn.

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

Mục tiêu tổng quát: xác định và phân tích các yếu tố ảnh hưởng đến quyết định đăng ký tiền gửi có kỳ hạn của khách hàng, thông qua việc ứng dụng các mô hình hồi quy trên bộ dữ liệu thực tế từ một ngân hàng tại Bồ Đào Nha.

Mục tiêu chi tiết:

  • Xác định các biến số có ý nghĩa thống kê ảnh hưởng đến hành vi đăng ký tiền gửi của khách hàng (chẳng hạn như Khách hàng có nợ xấu hay không, Khách hàng có vay mua nhà không, Khách hàng có vay tiêu dùng không…)

  • Đánh giá mức độ ảnh hưởng của từng yếu tố đến xác suất khách hàng đồng ý đăng ký tiền gửi có kỳ hạn.

  • Đề xuất các khuyến nghị thực tiễn giúp ngân hàng tối ưu hóa chiến dịch tiếp thị và nâng cao hiệu quả thu hút khách hàng gửi tiết kiệm.

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

Đối tượng nghiên cứu của đề tài là các yếu tố cá nhân và thông tin giao dịch ảnh hưởng đến quyết định đăng ký tiền gửi có kỳ hạn của khách hàng trong một chiến dịch tiếp thị ngân hàng.

Phạm vi nghiên cứu được xác định như sau:

  • Về không gian: Dữ liệu được thu thập từ một ngân hàng tại Bồ Đào Nha, trong khuôn khổ chiến dịch tiếp thị qua điện thoại nhằm thuyết phục khách hàng đăng ký tiền gửi có kỳ hạn.

  • Về thời gian: Dữ liệu phản ánh hành vi và đặc điểm của khách hàng trong các chiến dịch diễn ra từ năm 2008 đến năm 2010.

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

Nghiên cứu sử dụng phương pháp thống kê mô tả nhằm cung cấp cái nhìn tổng quan về bộ dữ liệu khách hàng trong chiến dịch tiếp thị. Tiếp đến, các chỉ số như odds ratio, relative risk và bảng tần số được phân tích để đánh giá mối quan hệ giữa các cặp biến độc lập và quyết định đăng ký tiền gửi của khách hàng. Ngoài ra, các mô hình xác suất tuyến tính, logit và probit cũng được triển khai nhằm ước lượng xác suất khách hàng đồng ý gửi tiền có kỳ hạn.

1.5 . Đóng góp của nghiên cứu

Nghiên cứu này mang lại những đóng góp thiết thực trên cả phương diện học thuật và thực tiễn. Về mặt học thuật, nghiên cứu vận dụng các mô hình hồi quy nhị phân như Linear Probability Model (LPM), Logit, Probit và đặc biệt là mô hình Complementary Log-Log (Cloglog) để phân tích xác suất khách hàng đăng ký tiền gửi có kỳ hạn. Việc kết hợp nhiều mô hình giúp đánh giá độ nhạy và độ phù hợp của từng phương pháp với dữ liệu thực tế, đồng thời góp phần làm phong phú thêm các nghiên cứu định lượng trong lĩnh vực hành vi tài chính cá nhân tại Việt Nam.

Về mặt thực tiễn, kết quả nghiên cứu cung cấp căn cứ định lượng cho các ngân hàng trong việc xác định và thấu hiểu các yếu tố ảnh hưởng đến quyết định gửi tiền có kỳ hạn, như độ tuổi, trình độ học vấn, phương thức liên hệ, thời điểm tương tác,… Từ đó, ngân hàng có thể xây dựng các chiến lược tiếp thị phù hợp, phân khúc khách hàng hiệu quả hơn, tối ưu hóa chi phí tiếp cận và nâng cao tỷ lệ chuyển đổi trong các chiến dịch huy động vốn.

1.6 . Kết cấu của đề tài

Đề tài được chia thành 5 chương, cụ thể như sau:

  • Chương 1. Giới thiệu: Trình bày lý do chọn đề tài, mục tiêu nghiên cứu, đối tượng – phạm vi nghiên cứu và cấu trúc tổng quát của đề tài.

  • Chương 2. Cơ sở lý thuyết: Trình bày tổng quan về tiền gửi có kỳ hạn và hệ thống hóa các lý thuyết liên quan đến đề tài.

  • Chương 3. Phương pháp nghiên cứu: Mô tả thiết kế nghiên cứu, nguồn dữ liệu, phương pháp xử lý dữ liệu và các mô hình phân tích được sử dụng.

  • Chương 4. Kết quả nghiên cứu: Trình bày kết quả thống kê mô tả và kết quả phân tích định lượng bằng các mô hình hồi quy phù hợp.

  • Chương 5. Kết luận và Khuyến nghị: Tóm tắt các kết quả chính, nêu bật ý nghĩa thực tiễn, trình bày những hạn chế của nghiên cứu và đề xuất các hướng phát triển trong tương lai.


2 . CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

2.1 . Cơ sở lý luận về tiền gửi có kỳ hạn

  • Khái niệm tiền gửi có kỳ hạn

Tiền gửi có kỳ hạn là một hình thức huy động vốn quan trọng của ngân hàng thương mại, trong đó khách hàng gửi một khoản tiền trong một thời gian xác định và được nhận lãi suất cố định theo thỏa thuận. So với tiền gửi không kỳ hạn, tiền gửi có kỳ hạn thường có lãi suất cao hơn do khách hàng cam kết không rút tiền trước hạn (Ngân hàng Nhà nước Việt Nam, 2023).

Theo Mishkin (2019), tiền gửi tiết kiệm có kỳ hạn đóng vai trò quan trọng trong việc chuyển nguồn vốn từ khu vực dân cư sang lĩnh vực đầu tư và sản xuất, góp phần ổn định hệ thống tài chính.

  • Lý thuyết hành vi khách hàng trong tài chính cá nhân

Quyết định gửi tiền có kỳ hạn là một dạng hành vi tài chính cá nhân, chịu ảnh hưởng bởi nhiều yếu tố, bao gồm lợi ích kỳ vọng, mức độ rủi ro và tác động tâm lý. Trong lĩnh vực tài chính hành vi, các học giả cho rằng con người không luôn hành động theo lý trí tuyệt đối, mà còn chịu ảnh hưởng bởi cảm xúc và thiên kiến nhận thức (Thaler, 1999).

Theo lý thuyết lựa chọn hợp lý Rrational Choice Theory), cá nhân sẽ gửi tiền nếu lợi ích kỳ vọng (lãi suất, an toàn vốn) vượt trội hơn các hình thức sử dụng tiền khác. Trong khi đó, lý thuyết triển vọng (prospect theory) của Kahneman và Tversky (1979) cho thấy khách hàng thường có xu hướng né tránh rủi ro trong lĩnh vực tài chính cá nhân và có thể chọn gửi tiền có kỳ hạn như một cách đảm bảo an toàn tài sản.

Ngoài ra, mô hình hành vi tài chính cá nhân của Xiao và Porto (2017) cũng nhấn mạnh rằng hành vi tài chính bị chi phối bởi các yếu tố: kiến thức tài chính, tình trạng tài chính, niềm tin và kinh nghiệm tài chính quá khứ.

2.2 . Các yếu tố tài chính ảnh hưởng đến quyết định gửi tiền có kỳ hạn

  • Biến “default” (nợ xấu)

Biến này phản ánh khả năng tín dụng của khách hàng. Một người có lịch sử nợ xấu thường có tình hình tài chính không ổn định, khả năng thanh khoản thấp và ít dư tiền để gửi tiết kiệm. Nghiên cứu của Godwin (1994) cho thấy những cá nhân có điểm tín dụng thấp thường không tích cực trong các hành vi tiết kiệm, bao gồm cả tiết kiệm có kỳ hạn.

Ngoài ra, nghiên cứu của Lusardi và Mitchell (2014) cũng cho thấy mức độ hiểu biết tài chính và lịch sử nợ ảnh hưởng rõ rệt đến hành vi tiết kiệm trong dân cư, đặc biệt ở nhóm thu nhập thấp.

  • Biến “housing” (vay mua nhà)

Khoản vay mua nhà đại diện cho nghĩa vụ tài chính dài hạn, thường làm giảm thu nhập khả dụng hàng tháng của khách hàng. Theo nghiên cứu của Lee và Hanna (2015), những người có vay thế chấp thường giảm mức tiết kiệm ngắn hạn, bao gồm cả tiết kiệm có kỳ hạn, do phần lớn dòng tiền bị phân bổ vào việc trả nợ gốc và lãi hàng tháng.

Tuy nhiên, một số khách hàng có thu nhập cao có thể vẫn gửi tiền có kỳ hạn song song như một chiến lược phân bổ tài sản – nhằm đối phó với rủi ro lãi suất và đảm bảo tính thanh khoản dự phòng (Mankiw, 2016).

  • Biến “loan” (vay tiêu dùng)

Khoản vay tiêu dùng thường liên quan đến các chi tiêu cá nhân như mua sắm, du lịch, hoặc chi trả các dịch vụ, thể hiện khuynh hướng tiêu dùng hiện tại cao hơn tiết kiệm. Theo khảo sát của FINRA Investor Education Foundation (2019), những cá nhân đang có khoản vay tiêu dùng có xu hướng ít tiết kiệm hơn và mức độ ưu tiên cho việc gửi tiền tiết kiệm cũng thấp hơn.

Hơn nữa, Gathergood và Weber (2014) cho rằng tình trạng nợ tiêu dùng có mối liên hệ tiêu cực với hành vi lập kế hoạch tài chính và tích lũy tài sản dài hạn, từ đó làm giảm khả năng gửi tiết kiệm có kỳ hạn.

2.3 . Các nghiên cứu liên quan

Theo nghiên cứu của Rogg (2000) được công bố trên Inter‑American Development Bank Publications, việc cá nhân sử dụng các khoản vay tiêu dùng có thể làm suy giảm khả năng tích lũy tài sản thông qua hình thức gửi tiền có kỳ hạn, do phần lớn dòng tiền được ưu tiên phân bổ cho việc trả nợ thay vì tiết kiệm dài hạn.

Tương tự, Gunes và Tunc (2018) trong công trình công bố trên Journal of Consumer Affairs cũng chỉ ra rằng các khoản vay mua nhà – mặc dù mang tính đầu tư – vẫn có thể làm giảm năng lực gửi tiết kiệm có kỳ hạn, do khách hàng phải đối mặt với áp lực tài chính thường xuyên trong quá trình trả góp.

Mới đây, nghiên cứu của De Giorgi và cộng sự (2023) được đăng tải trên arXiv cho thấy tình trạng nợ xấu là một yếu tố đáng lưu ý, vì nó không chỉ làm suy yếu dòng tiền nhàn rỗi mà còn hạn chế đáng kể khả năng gửi tiền tiết kiệm có kỳ hạn của khách hàng, từ đó ảnh hưởng đến hành vi tài chính cá nhân trong dài hạn.


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

Trong nghiên cứu này, biến phụ thuộc là Y - Quyết định đăng ký tiền gửi có kỳ hạn của khách hàng là một biến nhị phân (yes/no tương ứng 1/0). Với đặc điểm dạng nhị phân như vậy, các mô hình hồi quy nhị phân là lựa chọn phù hợp để phân tích và dự báo hành vi khách hàng.

3.1 . Thiết kế mô hình nghiên cứu

Hình 3.1. Mô hình nghiên cứu

Hình 3.1. Mô hình nghiên cứu

Hình 3.1 minh họa mô hình nghiên cứu được xây dựng nhằm phân tích các yếu tố ảnh hưởng đến quyết định đăng ký tiền gửi có kỳ hạn của khách hàng (biến phụ thuộc Y). Cụ thể, mô hình xem xét tác động của ba biến độc lập gồm: tình trạng vay mua nhà (housing), tình trạng vay tiêu dùng cá nhân (loan) và tình trạng nợ xấu (default). Mỗi yếu tố này được kỳ vọng có thể ảnh hưởng đến khả năng hoặc xu hướng gửi tiết kiệm của khách hàng. Các biến đều mang tính nhị phân (có/không), phù hợp để đưa vào mô hình hồi quy logistic nhị phân nhằm ước lượng xác suất khách hàng lựa chọn gửi tiền có kỳ hạn.

3.2 . Mô hình hồi quy cho dữ liệu nhị phân

3.2.1 . Mô hình Hồi quy Logistic (Logit Model)

Mô hình Logit được sử dụng để ước lượng xác suất xảy ra của một sự kiện nhị phân (có/không, đúng/sai…). Hàm phân phối xác suất có dạng hàm logistic, cho phép xác suất nằm trong khoảng (0,1).

Phương trình mô hình:

\[ P(Y = 1 \mid X) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k)}} \]

Trong đó:

\(P(Y = 1 \mid X)\) là xác suất xảy ra sự kiện (ví dụ: khách hàng gửi tiết kiệm),

\(\beta_0\) là hệ số chặn, \(\beta_1, \dots, \beta_k\) là hệ số hồi quy tương ứng với các biến độc lập \(X_1, \dots, X_k\).

Hàm logit (log-odds) được xác định bởi:

\[ \text{logit}(P) = \log\left(\frac{P}{1 - P}\right) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \]

3.2.2 . Mô hình hồi quy Probit (Probit Model)

Mô hình Probit cũng được sử dụng để dự đoán xác suất của một biến phụ thuộc nhị phân, tuy nhiên giả định phân phối sai số là phân phối chuẩn tích lũy (CDF của \(N(0,1)\)).

Phương trình mô hình:

\[ P(Y = 1 \mid X) = \Phi(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k) \]

Trong đó:

\(\Phi(.)\) là hàm phân phối tích lũy chuẩn (CDF),

Còn lại các ký hiệu tương tự như mô hình Logit.

Mô hình Probit thích hợp trong các trường hợp giả định rằng mối quan hệ giữa biến giải thích và xác suất xảy ra là dạng chữ S đối xứng và “mềm” hơn Logit.

3.2.3 . Mô hình Complementary log-log (Cloglog Model)

Mô hình Cloglog được sử dụng khi xác suất xảy ra của sự kiện là rất thấp hoặc rất cao (bất đối xứng). Phương trình xác suất:

\[ P(Y = 1 \mid X) = 1 - \exp\left[-\exp\left(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k\right)\right] \]

Tương ứng với đó là:

\[ \log\left( -\log(1 - P(Y = 1)) \right) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \]

Mô hình Cloglog có đuôi phân phối dài hơn Logit/Probit nên phù hợp trong trường hợp phân phối xác suất không đối xứng.

3.3 . Các chỉ tiêu đánh giá mô hình

3.3.1 . Chỉ số AIC

Chỉ số AIC (Akaike Information Criterion) được dùng để đánh giá mức độ phù hợp của mô hình, đồng thời có tính đến số lượng tham số được sử dụng. Công thức tính AIC là:

\[ AIC = -2 \cdot \log(L) + 2k \]

Trong đó:

  • \(L\): là hàm hợp lý (likelihood),

  • \(k\): là số lượng tham số trong mô hình.

3.3.2 . Hệ số Brier Score

Chỉ số Brier Score đo độ chính xác của dự đoán xác suất trong các mô hình nhị phân. Công thức tính là:

\[ \text{Brier Score} = \frac{1}{n} \sum_{i=1}^{n} \left( \hat{p}_i - y_i \right)^2 \]

Trong đó:

  • \(n\): số quan sát,

  • \(\hat{p}_i\): xác suất dự đoán \(P(Y_i = 1 \mid X_i)\),

  • \(y_i\): giá trị thực tế (0 hoặc 1).

3.3.3 . Log-likelihood

Log-likelihood là hàm log của hàm hợp lý, phản ánh mức độ phù hợp giữa mô hình và dữ liệu quan sát. Với mô hình nhị phân, được tính như sau:

\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]

Trong đó:

  • \(\ell(\beta)\) là hàm log-likelihood theo hệ số \(\beta\),

  • \(y_i\) là biến phản hồi (0 hoặc 1),

  • \(\pi_i\) là xác suất dự báo tại quan sát \(i\) (ví dụ: \(\pi_i = \hat{P}(y_i = 1 \mid x_i)\)).

Log-likelihood càng lớn (ít âm) thì mô hình càng phù hợp với dữ liệu.


4 . CHƯƠNG 4: KẾT QUẢ NGHIÊN CỨU

4.1 . Tổng quan về bộ dữ liệu

4.1.1 . Giới thiệu về bộ dữ liệu

Dữ liệu được sử dụng trong bài có tên là Bank Marketing Dataset. Dữ liệu được tác giả thu thập từ trang web UCI Machine Learning Repository . Bộ dữ liệu này ghi lại thông tin từ các chiến dịch tiếp thị trực tiếp qua điện thoại của một ngân hàng tại Bồ Đào Nha, với các thuộc tính chi tiết liên quan đến hồ sơ khách hàng, nội dung cuộc gọi và kết quả phản hồi. Mục tiêu thuyết phục khách hàng đăng ký sản phẩm tiền gửi có kỳ hạn. Trong nhiều trường hợp, khách hàng được liên hệ nhiều lần để xác định quyết định cuối cùng là “yes” (đăng ký) hoặc “no” (không đăng ký).Bộ dữ liệu này có thể dùng để phân tích hành vi khách hàng, mô hình hóa quyết định đăng ký sản phẩm tài chính, và đánh giá hiệu quả của các chiến dịch tiếp thị. Đây là nguồn dữ liệu phù hợp cho các dự án học máy (machine learning), phân tích dữ liệu định tính và xây dựng mô hình hồi quy nhị phân.

4.1.2 . Đọc bộ dữ liệu

Ta tiến hành đọc tệp Excel và gán dữ liệu vào một đối tượng có tên là tieuluan để phục vụ cho quá trình phân tích.

library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(DT)
library(readxl)
tieuluan <- read_excel("/Users/lengoctuongvy/Downloads/TLHK2:2025/T2_PHÂN TÍCH DỮ LIỆU ĐỊNH TÍNH/bank-full.xlsx")
datatable(tieuluan)
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html

4.2 . Đôi nét về bộ dữ liệu

Ta sử dụng hàm dim() để kiểm tra số lượng biến (cột) và số lượng quan sát (dòng) trong bộ dữ liệu.

dim(tieuluan)
## [1] 45211    17

Nhận xét tổng quan về dữ liệu:Bộ dữ liệu gồm 45.211 quan sát và 17 biến, thể hiện quy mô tương đối lớn, phù hợp để triển khai các phương pháp phân tích thống kê cũng như xây dựng mô hình dự báo có độ tin cậy cao. Với sự kết hợp giữa các biến định tính và biến định lượng , bộ dữ liệu này cung cấp nền tảng phong phú để khai thác thông tin, nhận diện hành vi khách hàng và khám phá các yếu tố ảnh hưởng đến quyết định tài chính. Quy mô dữ liệu lớn không chỉ đảm bảo độ bao phủ về mặt thông tin mà còn tạo điều kiện thuận lợi cho việc áp dụng các thuật toán học máy hiện đại nhằm tối ưu hóa hiệu quả phân tích và dự báo.

Tiếp theo, ta xem xét danh sách tên các biến có trong bộ dữ liệu nhằm phục vụ cho quá trình phân tích.

names(tieuluan)
##  [1] "age"       "job"       "marital"   "education" "default"   "balance"  
##  [7] "housing"   "loan"      "contact"   "day"       "month"     "duration" 
## [13] "campaign"  "pdays"     "previous"  "poutcome"  "Y"

Dữ liệu bao gồm các biến sau, được tổng hợp chi tiết trong bảng dưới đây nhằm phục vụ cho quá trình phân tích:

library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
# Tạo bảng dữ liệu mô tả có thêm cột số thứ tự
des <- data.frame(
  STT = 1:17,
  Tên_biến = c("age", "job", "marital", "education", "default", "balance", "housing", 
               "loan", "contact", "day", "month", "duration", "campaign", "pdays", 
               "previous", "poutcome", "Y"),
  Mô_tả = c("Tuổi của khách hàng",
            "Nghề nghiệp của khách hàng",
            "Tình trạng hôn nhân",
            "Trình độ học vấn",
            "Khách hàng có nợ xấu hay không",
            "Số dư trung bình hàng năm trong tài khoản (EUR)",
            "Khách hàng có vay mua nhà không",
            "Khách hàng có vay tiêu dùng không",
            "Phương thức liên hệ (cellular, telephone)",
            "Ngày khách hàng được liên hệ",
            "Tháng khách hàng được liên hệ",
            "Thời lượng cuộc gọi cuối cùng (giây)",
            "Số lần liên hệ trong chiến dịch hiện tại",
            "Số ngày kể từ lần liên hệ gần nhất",
            "Số lần liên hệ trong chiến dịch trước đó",
            "Kết quả chiến dịch trước đó",
            "Quyết định đăng ký tiền gửi có kỳ hạn của khách hàng (no, yes)")
)

# Hiển thị bảng có tiêu đề căn giữa và in đậm
des %>%
  kable("html", align = "c", 
        col.names = c("**STT**", "**Tên biến**", "**Mô tả**"),
        caption = "<div style='text-align: center;'><b>Bảng 8.1. Danh sách các biến có trong dữ liệu</b></div>") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center", font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#6495ED") %>%
  column_spec(1:3, border_right = TRUE)
Bảng 8.1. Danh sách các biến có trong dữ liệu
STT Tên biến Mô tả
1 age Tuổi của khách hàng
2 job Nghề nghiệp của khách hàng
3 marital Tình trạng hôn nhân
4 education Trình độ học vấn
5 default Khách hàng có nợ xấu hay không
6 balance Số dư trung bình hàng năm trong tài khoản (EUR)
7 housing Khách hàng có vay mua nhà không
8 loan Khách hàng có vay tiêu dùng không
9 contact Phương thức liên hệ (cellular, telephone)
10 day Ngày khách hàng được liên hệ
11 month Tháng khách hàng được liên hệ
12 duration Thời lượng cuộc gọi cuối cùng (giây)
13 campaign Số lần liên hệ trong chiến dịch hiện tại
14 pdays Số ngày kể từ lần liên hệ gần nhất
15 previous Số lần liên hệ trong chiến dịch trước đó
16 poutcome Kết quả chiến dịch trước đó
17 Y Quyết định đăng ký tiền gửi có kỳ hạn của khách hàng (no, yes)

Tiếp theo, ta tiến hành kiểm tra xem bộ dữ liệu có chứa giá trị thiếu (missing values) hay không. Việc này giúp đảm bảo tính toàn vẹn và độ tin cậy của dữ liệu trước khi thực hiện các phân tích tiếp theo.

sum(is.na(tieuluan))
## [1] 0

Để kiểm tra xem tập dữ liệu có chứa giá trị bị thiếu hay không, ta sử dụng hàm is.na() trong R. Hàm này giúp xác định các ô có giá trị thiếu (NA), với kết quả trả về là TRUE tại những vị trí bị thiếu và FALSE ở những vị trí đầy đủ. Khi kết hợp với hàm sum(), ta có thể đếm tổng số giá trị bị thiếu trong toàn bộ dữ liệu, vì trong R, TRUE được quy đổi thành 1 và FALSE là 0. Do đó, biểu thức sum(is.na(tieuluan)) sẽ trả về tổng số ô NA trong dataset. Kết quả kiểm tra cho thấy giá trị trả về bằng 0, điều này đồng nghĩa với việc không có giá trị bị thiếu nào trong tập dữ liệu. Như vậy, dữ liệu đã đầy đủ và có thể sử dụng trực tiếp cho các bước phân tích tiếp theo mà không cần xử lý thiếu dữ liệu.

Trước khi tiến hành các phân tích sâu hơn, ta cần xem xét cấu trúc tổng quát của bộ dữ liệu để hiểu rõ về số lượng quan sát, số lượng biến cũng như kiểu dữ liệu của từng biến.

str(tieuluan)
## tibble [45,211 × 17] (S3: tbl_df/tbl/data.frame)
##  $ age      : num [1:45211] 58 44 33 47 33 35 28 42 58 43 ...
##  $ job      : chr [1:45211] "management" "technician" "entrepreneur" "blue-collar" ...
##  $ marital  : chr [1:45211] "married" "single" "married" "married" ...
##  $ education: chr [1:45211] "tertiary" "secondary" "secondary" "unknown" ...
##  $ default  : chr [1:45211] "no" "no" "no" "no" ...
##  $ balance  : num [1:45211] 2143 29 2 1506 1 ...
##  $ housing  : chr [1:45211] "yes" "yes" "yes" "yes" ...
##  $ loan     : chr [1:45211] "no" "no" "yes" "no" ...
##  $ contact  : chr [1:45211] "unknown" "unknown" "unknown" "unknown" ...
##  $ day      : num [1:45211] 5 5 5 5 5 5 5 5 5 5 ...
##  $ month    : chr [1:45211] "may" "may" "may" "may" ...
##  $ duration : num [1:45211] 261 151 76 92 198 139 217 380 50 55 ...
##  $ campaign : num [1:45211] 1 1 1 1 1 1 1 1 1 1 ...
##  $ pdays    : num [1:45211] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ previous : num [1:45211] 0 0 0 0 0 0 0 0 0 0 ...
##  $ poutcome : chr [1:45211] "unknown" "unknown" "unknown" "unknown" ...
##  $ Y        : chr [1:45211] "no" "no" "no" "no" ...

Nhận xét về cấu trúc dữ liệu: Bộ dữ liệu có kích thước 45.211 quan sát × 17 biến, được lưu dưới dạng tibble, thuận tiện cho xử lý và hiển thị trong R.

Trong đó:

  • Có nhiều biến định tính dạng ký tự (chr), như: job, marital, education, default, housing, loan, contact, month, poutcome, y. Đây là các thông tin mô tả đặc điểm nhân khẩu học và phản hồi của khách hàng.

  • Một số biến định lượng dạng số (num), bao gồm: age, balance, day, duration, campaign, pdays, previous. Các biến này có thể dùng cho thống kê mô tả, phân tích mối quan hệ và mô hình hóa hành vi khách hàng.

  • Biến thời gian gồm: day (ngày) và month (tháng), hiện đang lưu dưới dạng số và ký tự, nhưng có thể kết hợp và chuyển đổi về định dạng Date để phục vụ các phân tích chuỗi thời gian.

  • Các biến như balance, duration, campaign, pdays, previous phản ánh lịch sử tương tác giữa khách hàng và ngân hàng, rất hữu ích để phân tích hành vi tiếp thị và mức độ thành công của các chiến dịch trước đó.

Bộ dữ liệu rất phù hợp cho các bài toán phân tích hành vi khách hàng, đánh giá hiệu quả chiến dịch tiếp thị và xây dựng mô hình dự đoán phản hồi trong lĩnh vực ngân hàng và tài chính.

4.3 . Phân tích mô tả một biến định tính

4.3.1 . Biến Y (Quyết định đăng ký tiền gửi có kỳ hạn của khách hàng)

Tần số - Tần suất

Để hiểu rõ đặc điểm phân bố của biến phụ thuộc Y, ta tiến hành thống kê mô tả nhằm xác định mức độ xuất hiện của các giá trị trong biến này thông qua tần số và tần suất.

cbind(Frequency = table(tieuluan$Y), Proportion = prop.table(table(tieuluan$Y)))
##     Frequency Proportion
## no      39922  0.8830152
## yes      5289  0.1169848

Trực quan hóa

Tác giả đã tiến hành trực quan hóa dữ liệu bằng biểu đồ nhằm thể hiện tần số và tần suất của quyết định đăng ký tiền gửi có kỳ hạn của khách hàng. Thông qua biểu đồ này, có thể quan sát được mức độ phổ biến của từng quyết định, từ đó giúp làm rõ xu hướng hành vi của khách hàng đối với sản phẩm tiền gửi có kỳ hạn mà ngân hàng cung cấp.

# Load thư viện
library(dplyr)
library(ggplot2)
library(patchwork)

# Bảng tần số và tần suất của biến Y
freq_table <- tieuluan %>%
  count(Y) %>%
  mutate(percent = 100 * n / sum(n),
         label_percent = paste0(round(percent, 1), "%"),
         label_freq = paste0(n))

# Biểu đồ cột (hiện tần số)
bar_plot <- ggplot(freq_table, aes(x = Y, y = n, fill = Y)) +
  geom_col(width = 0.7, show.legend = FALSE) +
  geom_text(aes(label = label_freq), vjust = -0.5) +
  labs(title = "Biểu đồ cột biến Y",
       x = "Giá trị của Y",
       y = "Tần số") +
  ylim(0, max(freq_table$n) * 1.2) +
  theme_minimal()

# Biểu đồ tròn (hiện phần trăm)
pie_plot <- ggplot(freq_table, aes(x = "", y = percent, fill = Y)) +
  geom_col(width = 1, show.legend = TRUE) +
  coord_polar(theta = "y") +
  geom_text(aes(label = label_percent), 
            position = position_stack(vjust = 0.5)) +
  labs(title = "Biểu đồ tròn biến Y", fill = "Giá trị Y") +
  theme_void()

# Ghép 2 biểu đồ
bar_plot + pie_plot

Hình 4.1. Biểu đồ cột và biểu đồ tròn thể hiện tần số và tần suất quyết định đăng ký tiền gửi có kỳ hạn của khách hàng

Hình 4.1 thể hiện tần số và tần suất quyết định đăng ký tiền gửi có kỳ hạn của khách hàng. Kết quả thống kê cho thấy trong tổng số 45.211 khách hàng được khảo sát, có 5.289 (11.7%) người quyết định đăng ký tiền gửi có kỳ hạn, trong khi 39.922(88.3%) người không đăng ký. Số lượng khách hàng không đăng ký cao hơn nhóm đăng ký đến 34.633 người (76.60%), cho thấy sự chênh lệch rất lớn giữa hai nhóm. Điều này phản ánh rằng phần lớn khách hàng chưa có nhu cầu hoặc không lựa chọn hình thức tiền gửi có kỳ hạn, từ đó đặt ra yêu cầu cho ngân hàng trong việc xem xét lại chính sách sản phẩm, cách thức tiếp cận hoặc truyền thông để cải thiện tỷ lệ đăng ký trong tương lai.

4.3.2 . Biến “default” - Khách hàng có nợ xấu hay không

Tần số - Tần suất

Để hiểu rõ đặc điểm phân bố của biến default, ta tiến hành thống kê mô tả nhằm xác định mức độ xuất hiện của các giá trị trong biến này thông qua tần số và tần suất.

cbind(Frequency = table(tieuluan$default), Proportion = prop.table(table(tieuluan$default)))
##     Frequency Proportion
## no      44396 0.98197341
## yes       815 0.01802659

Trực quan hóa

Tác giả đã sử dụng biểu đồ để trực quan hóa tần số và tần suất của biến default nhằm phản ánh tình trạng nợ xấu của khách hàng.

# Bảng tần số và tần suất của biến default
freq_table <- tieuluan %>%
  count(default) %>%
  mutate(percent = 100 * n / sum(n),
         label_percent = paste0(round(percent, 1), "%"),
         label_freq = paste0(n))

# Màu sắc tùy chọn cho từng giá trị
custom_colors <- c("yes" = "red", "no" = "#66CCFF")  # Bạn có thể thay đổi mã màu

# Biểu đồ cột
bar_plot <- ggplot(freq_table, aes(x = default, y = n, fill = default)) +
  geom_col(width = 0.7, show.legend = FALSE) +
  geom_text(aes(label = label_freq), vjust = -0.5) +
  scale_fill_manual(values = custom_colors) +
  labs(title = "Biểu đồ cột biến default",
       x = "Giá trị của default",
       y = "Tần số") +
  ylim(0, max(freq_table$n) * 1.2) +
  theme_minimal()

# Biểu đồ tròn
pie_plot <- ggplot(freq_table, aes(x = "", y = percent, fill = default)) +
  geom_col(width = 1, show.legend = TRUE) +
  coord_polar(theta = "y") +
  geom_text(aes(label = label_percent), 
            position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = custom_colors) +
  labs(title = "Biểu đồ tròn biến default", fill = "Giá trị default") +
  theme_void()

# Ghép biểu đồ
bar_plot + pie_plot

Hình 4.2. Biểu đồ cột và biểu đồ tròn thể hiện tần số và tần suất của tình trạng nợ xấu của khách hàng

Hình 4.2 thể hiện tần số và tần suất của tình trạng nợ xấu của khách hàng. Kết quả thống kê cho thấy trong tổng số 45.211 khách hàng được khảo sát, có 815(1.8%) người có nợ xấu, trong khi 44.396(98.2%) người không có nợ xấu. Điều này đồng nghĩa với việc nhóm khách hàng không có nợ xấu cao hơn nhóm có nợ xấu đến 43.581 người, tương ứng 96,4%. Tỷ lệ chênh lệch rất lớn giữa hai nhóm cho thấy nợ xấu là hiện tượng hiếm gặp trong mẫu khảo sát.

4.3.3 . Biến “loan” - Khách hàng có vay tiêu dùng hay không

Tần số - Tần suất

Để hiểu rõ đặc điểm phân bố của biến loan, ta tiến hành thống kê mô tả nhằm xác định mức độ xuất hiện của các giá trị trong biến này thông qua tần số và tần suất.

cbind(Frequency = table(tieuluan$loan), Proportion = prop.table(table(tieuluan$loan)))
##     Frequency Proportion
## no      37967  0.8397735
## yes      7244  0.1602265

Trực quan hóa

Tác giả đã sử dụng biểu đồ để trực quan hóa tần số và tần suất của biến loan nhằm phản ánh tình trạng vay tiêu dùng của khách hàng.

# Bảng tần số và tần suất của biến loan
freq_table <- tieuluan %>%
  count(loan) %>%
  mutate(percent = 100 * n / sum(n),
         label_percent = paste0(round(percent, 1), "%"),
         label_freq = paste0(n))

# Màu sắc tùy chọn cho từng giá trị
custom_colors <- c("yes" = "#D204A5", "no" = "#6495ED")  

# Biểu đồ cột
bar_plot <- ggplot(freq_table, aes(x = loan, y = n, fill = loan)) +
  geom_col(width = 0.7, show.legend = FALSE) +
  geom_text(aes(label = label_freq), vjust = -0.5) +
  scale_fill_manual(values = custom_colors) +
  labs(title = "Biểu đồ cột biến loan",
       x = "Giá trị của loan",
       y = "Tần số") +
  ylim(0, max(freq_table$n) * 1.2) +
  theme_minimal()

# Biểu đồ tròn
pie_plot <- ggplot(freq_table, aes(x = "", y = percent, fill = loan)) +
  geom_col(width = 1, show.legend = TRUE) +
  coord_polar(theta = "y") +
  geom_text(aes(label = label_percent), 
            position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = custom_colors) +
  labs(title = "Biểu đồ tròn biến loan", fill = "Giá trị loan") +
  theme_void()

# Ghép biểu đồ
bar_plot + pie_plot

Hình 4.3. Biểu đồ cột và biểu đồ tròn thể hiện tần số và tần suất của tình trạng vay tiêu dùng của khách hàng

Hình 4.3 thể hiện tần số và tần suất của tình trạng vay tiêu dùng của khách hàng. Kết quả thống kê cho thấy trong tổng số 45.211 khách hàng được khảo sát, có 7244(16%) người có vay tiêu dùng, trong khi 37.967(84%) người không có vay tiêu dùng. Như vậy, số lượng khách hàng không vay tiêu dùng cao hơn nhóm có vay tiêu dùng với chênh lệch lên đến 30.723 người, tương ứng 68%. Điều này cho thấy phần lớn khách hàng trong mẫu khảo sát không có vay tiêu dùng tại thời điểm khảo sát.

4.3.4 . Biến “housing” - Khách hàng có vay mua nhà hay không

Tần số - Tần suất

Để hiểu rõ đặc điểm phân bố của biến housing, ta tiến hành thống kê mô tả nhằm xác định mức độ xuất hiện của các giá trị trong biến này thông qua tần số và tần suất.

cbind(Frequency = table(tieuluan$housing), Proportion = prop.table(table(tieuluan$housing)))
##     Frequency Proportion
## no      20081  0.4441618
## yes     25130  0.5558382

Trực quan hóa

Tác giả đã sử dụng biểu đồ để trực quan hóa tần số và tần suất của biến default nhằm phản ánh tình trạng vay mua tiêu dùng của khách hàng.

# Bảng tần số và tần suất của biến housing
freq_table <- tieuluan %>%
  count(housing) %>%
  mutate(percent = 100 * n / sum(n),
         label_percent = paste0(round(percent, 1), "%"),
         label_freq = paste0(n))

# Màu sắc tùy chọn cho từng giá trị
custom_colors <- c("yes" = "#FFD700", "no" = "#D8B")  # Bạn có thể thay đổi mã màu

# Biểu đồ cột
bar_plot <- ggplot(freq_table, aes(x = housing, y = n, fill = housing)) +
  geom_col(width = 0.7, show.legend = FALSE) +
  geom_text(aes(label = label_freq), vjust = -0.5) +
  scale_fill_manual(values = custom_colors) +
  labs(title = "Biểu đồ cột biến housing",
       x = "Giá trị của housing",
       y = "Tần số") +
  ylim(0, max(freq_table$n) * 1.2) +
  theme_minimal()

# Biểu đồ tròn
pie_plot <- ggplot(freq_table, aes(x = "", y = percent, fill = housing)) +
  geom_col(width = 1, show.legend = TRUE) +
  coord_polar(theta = "y") +
  geom_text(aes(label = label_percent), 
            position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = custom_colors) +
  labs(title = "Biểu đồ tròn biến housing", fill = "Giá trị housing") +
  theme_void()

# Ghép biểu đồ
bar_plot + pie_plot

Hình 4.4. Biểu đồ cột và biểu đồ tròn thể hiện tần số và tần suất của tình trạng vay mua nhà của khách hàng

Hình 4.4 thể hiện tần số và tần suất của tình trạng vay mua nhà của khách hàng. Kết quả thống kê cho thấy trong tổng số 45.211 khách hàng được khảo sát, có 25.130(55.6%) người có vay mua nhà, trong khi 20.081(44.4%) người không có vay mua nhà. Như vậy, số lượng khách hàng không vay mua nhà cao hơn nhóm có vay tiêu dùng với chênh lệch là 5.049 người, tương ứng 11.2%. Điều này cho thấy hơn một nửa số khách hàng trong mẫu khảo sát lựa chọn hình thức vay vốn để mua nhà, phản ánh mức độ phổ biến của nhu cầu nhà ở và khả năng tiếp cận tín dụng bất động sản trong cộng đồng khách hàng.

4.4 . Phân tích mối quan hệ giữa hai biến định tính

4.4.1 . Cặp biến Y và default

Tần số - Tần suất biên

Tác giả tiến hành thống kê tần số, tần suất biên cho cặp biến quyết định gửi tiền (Y) và tình trạng nợ xấu (default) nhằm phân tích đặc điểm hành vi khách hàng theo từng nhóm.

g1 <- table(tieuluan$Y, tieuluan$default)
addmargins(g1) 
##      
##          no   yes   Sum
##   no  39159   763 39922
##   yes  5237    52  5289
##   Sum 44396   815 45211
addmargins(prop.table(table(tieuluan$Y, tieuluan$default)))
##      
##                no         yes         Sum
##   no  0.866138772 0.016876424 0.883015195
##   yes 0.115834642 0.001150163 0.116984805
##   Sum 0.981973414 0.018026586 1.000000000

Trực quan hóa

Tác giả sử dụng biểu đồ để trực quan hóa tần số và tần suất biên cho cặp biến quyết định gửi tiền (Y) và tình trạng nợ xấu (default) nhằm phân tích đặc điểm hành vi khách hàng theo từng nhóm.

library(dplyr)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.4     ✔ tidyr     1.3.1
## ✔ readr     2.1.5     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter()          masks stats::filter()
## ✖ kableExtra::group_rows() masks dplyr::group_rows()
## ✖ dplyr::lag()             masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
ggplot(tieuluan %>% group_by(Y, default) %>% summarise(count = n()) %>% ungroup(), 
       aes(x = Y, y = count, fill = default)) +
  geom_col(position = position_dodge(width = 0.9)) +
  geom_text(aes(label = count), 
            position = position_dodge(width = 0.9), 
            vjust = -0.3, 
            size = 3.5) +
  labs(
    title = "Phân phối tình trạng nợ xấu theo quyết định gửi tiền có kỳ hạn",
    y = "Số lượng khách hàng",
    x = "Quyết định gửi tiền có kỳ hạn",
    fill = "Tình trạng nợ xấu"
  ) +
  theme_minimal()
## `summarise()` has grouped output by 'Y'. You can override using the `.groups`
## argument.

Hình 5.1. Biểu đồ cột thể hiện phản ảnh mối liên hệ giữa tình trạng nợ xấu và quyết định gửi tiền có kỳ hạn

Hình 5.1 phản ảnh mối liên hệ giữa tình trạng nợ và quyết định gửi tiền có kỳ hạn. Biểu đồ cho thấy, ở nhóm khách hàng không gửi tiền, đa số là khách hàng không có nợ xấu (39.159 người), trong khi chỉ có 763 người có nợ xấu không gửi tiền. Ở nhóm khách hàng có gửi tiền, số lượng khách hàng không có nợ xấu quyết định gửi tiền vẫn chiếm ưu thế (5.237 người), còn nhóm có nợ xấu quyết định gửi tiền chỉ có 52 người. Tỷ lệ này cho thấy rằng khách hàng không có nợ xấu có xu hướng gửi tiền cao hơn so với nhóm có nợ xấu. Sự khác biệt đáng kể về số lượng giữa hai nhóm gợi ý rằng tình trạng nợ xấu có thể là yếu tố ảnh hưởng đến quyết định gửi tiền của khách hàng.

Kiểm định Chi bình phương

chisq.test(table(tieuluan$Y, tieuluan$default))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(tieuluan$Y, tieuluan$default)
## X-squared = 22.202, df = 1, p-value = 2.454e-06

Bài toán kiểm định

\[ \left\{ \begin{array}{ll} H_0: & \text{Quyết định gửi tiền có kỳ hạn và tình trạng nợ xấu là độc lập}\\ H_1: & \text{Quyết định gửi tiền có kỳ hạn và tình trạng nợ xấu có mối liên hệ} \end{array} \right. \] Mức ý nghĩa 5%.

Ta thấy giá trị p_value = 2.454e-06 < 0.05, đủ bằng chứng để bác bỏ H0. Vậy Quyết định gửi tiền có kỳ hạn và tình trạng nợ xấu có mối liên hệ với nhau.

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

library(epitools)
library(DescTools)
riskratio(g1) 
## $data
##        
##            no yes Total
##   no    39159 763 39922
##   yes    5237  52  5289
##   Total 44396 815 45211
## 
## $measure
##      risk ratio with 95% C.I.
##        estimate    lower     upper
##   no  1.0000000       NA        NA
##   yes 0.5144196 0.389008 0.6802624
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   no            NA           NA           NA
##   yes 2.866558e-07 3.671885e-07 1.870659e-06
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Theo bảng kết quả, nhóm khách hàng không gửi tiền có kỳ hạn (Y = “no”) được chọn làm nhóm tham chiếu với RR = 1.0000. Nhóm khách hàng gửi tiền có kỳ hạn (Y = “yes”) có RR = 0.5144, tức là tỷ lệ khách hàng có nợ xấu trong nhóm gửi tiền có kỳ hạn bằng khoảng 0.5144 lần so với nhóm không gửi tiền. Khoảng ước lượng là (0.3890;0.6803) với độ tin cậy 95%.

Tỷ lệ chênh (Odds ratio)

oddsratio(g1)
## $data
##        
##            no yes Total
##   no    39159 763 39922
##   yes    5237  52  5289
##   Total 44396 815 45211
## 
## $measure
##      odds ratio with 95% C.I.
##        estimate     lower     upper
##   no  1.0000000        NA        NA
##   yes 0.5111137 0.3806813 0.6706704
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   no            NA           NA           NA
##   yes 2.866558e-07 3.671885e-07 1.870659e-06
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Theo bảng kết quả, tỷ lệ khách hàng không có nợ xấu trong nhóm không gửi tiền có kỳ hạn bằng 0.5111 lần so với nhóm khách hàng gửi tiền có kỳ hạn. Khoảng ước lượng là (0.3807;0.6707) với độ tin cậy 95%.

4.4.2 . Cặp biến Y và loan

Tần số - Tần suất biên

Tác giả tiến hành thống kê tần số, tần suất biên cho cặp biến quyết định gửi tiền (Y) và tình trạng vay tiêu dùng (loan) nhằm phân tích đặc điểm hành vi khách hàng theo từng nhóm.

g2 <- table(tieuluan$Y, tieuluan$loan)
addmargins(g2) 
##      
##          no   yes   Sum
##   no  33162  6760 39922
##   yes  4805   484  5289
##   Sum 37967  7244 45211
addmargins(prop.table(table(tieuluan$Y, tieuluan$loan)))
##      
##               no        yes        Sum
##   no  0.73349406 0.14952113 0.88301520
##   yes 0.10627945 0.01070536 0.11698480
##   Sum 0.83977351 0.16022649 1.00000000

Trực quan hóa

Tác giả sử dụng biểu đồ để trực quan hóa tần số và tần suất biên cho cặp biến quyết định gửi tiền (Y) và tình trạng vay tiêu dùng (loan) nhằm phân tích đặc điểm hành vi khách hàng theo từng nhóm.

# Màu sắc tùy chọn cho từng giá trị của loan
custom_colors <- c("yes" = "#D204A5", "no" = "#6495ED")  

# Vẽ biểu đồ cột
ggplot(tieuluan %>% 
         group_by(Y, loan) %>% 
         summarise(count = n()) %>% 
         ungroup(), 
       aes(x = Y, y = count, fill = loan)) +
  geom_col(position = position_dodge(width = 0.9)) +
  geom_text(aes(label = count), 
            position = position_dodge(width = 0.9), 
            vjust = -0.3, 
            size = 3.5) +
  scale_fill_manual(values = custom_colors) +  # Áp dụng màu tùy chỉnh
  labs(
    title = "Phân phối tình trạng vay tiêu dùng theo quyết định gửi tiền có kỳ hạn",
    y = "Số lượng khách hàng",
    x = "Quyết định gửi tiền có kỳ hạn",
    fill = "Tình trạng vay tiêu dùng"
  ) +
  theme_minimal()
## `summarise()` has grouped output by 'Y'. You can override using the `.groups`
## argument.

Hình 5.2. Biểu đồ cột thể hiện phản ảnh mối liên hệ giữa tình trạng vay tiêu dùng và quyết định gửi tiền có kỳ hạn

Hình 5.2 phản ảnh mối liên hệ giữa tình trạng vay tiêu dùng và quyết định gửi tiền có kỳ hạn. Biểu đồ cho thấy, ở nhóm khách hàng không gửi tiền, đa số là khách hàng không có vay tiêu dùng (33.162 người), trong khi có 6.760 người có vay tiêu dùng không gửi tiền. Ở nhóm khách hàng có gửi tiền, số lượng khách hàng không có vay tiêu dùng quyết định gửi tiền vẫn chiếm ưu thế (4.805 người), còn nhóm có vay tiêu dùng quyết định gửi tiền chỉ có 484 người. Tỷ lệ này cho thấy rằng khách hàng không có vay tiêu dùng có xu hướng gửi tiền cao hơn so với nhóm có vay tiêu dùng. Sự khác biệt đáng kể về số lượng giữa hai nhóm gợi ý rằng tình trạng vay tiêu dùng có thể là yếu tố ảnh hưởng đến quyết định gửi tiền của khách hàng.

Kiểm định Chi bình phương

chisq.test(table(tieuluan$Y, tieuluan$loan))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(tieuluan$Y, tieuluan$loan)
## X-squared = 209.62, df = 1, p-value < 2.2e-16

Bài toán kiểm định

\[ \left\{ \begin{array}{ll} H_0: & \text{Quyết định gửi tiền có kỳ hạn và tình trạng vay tiêu dùng là độc lập}\\ H_1: & \text{Quyết định gửi tiền có kỳ hạn và tình trạng vay tiêu dùng có mối liên hệ} \end{array} \right. \] Mức ý nghĩa 5%.

Ta thấy giá trị p_value < 2.2e-16 (bé hơn rất nhiếu so với 0.05), đủ bằng chứng để bác bỏ H0. Vậy Quyết định gửi tiền có kỳ hạn và tình trạng vay tiêu dùng có mối liên hệ với nhau.

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

riskratio(g2) 
## $data
##        
##            no  yes Total
##   no    33162 6760 39922
##   yes    4805  484  5289
##   Total 37967 7244 45211
## 
## $measure
##      risk ratio with 95% C.I.
##        estimate     lower     upper
##   no  1.0000000        NA        NA
##   yes 0.5404274 0.4950753 0.5899342
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact  chi.square
##   no          NA           NA          NA
##   yes          0 1.463279e-53 1.24548e-47
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Theo bảng kết quả, nhóm khách hàng không gửi tiền có kỳ hạn (Y = “no”) được chọn làm nhóm tham chiếu với RR = 1.0000. Nhóm khách hàng gửi tiền có kỳ hạn (Y = “yes”) có RR = 0.5404, tức là tỷ lệ khách hàng có vay tiêu dùng trong nhóm gửi tiền có kỳ hạn bằng khoảng 0.5404 lần so với nhóm không gửi tiền. Khoảng ước lượng là (0.4951;0.5899) với độ tin cậy 95%.

Tỷ số chênh (Odds ratio)

oddsratio(g2)
## $data
##        
##            no  yes Total
##   no    33162 6760 39922
##   yes    4805  484  5289
##   Total 37967 7244 45211
## 
## $measure
##      odds ratio with 95% C.I.
##        estimate     lower    upper
##   no  1.0000000        NA       NA
##   yes 0.4942653 0.4480634 0.544081
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact  chi.square
##   no          NA           NA          NA
##   yes          0 1.463279e-53 1.24548e-47
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Theo bảng kết quả, tỷ lệ khách hàng không có vay tiêu dùng trong nhóm không gửi tiền có kỳ hạn bằng khoảng 0.4943 lần so với nhóm khách hàng gửi tiền có kỳ hạn. Khoảng ước lượng là (0.4481;0.5441) với độ tin cậy 95%.

4.4.3 . Cặp biến Y và housing

Tần số - Tần suất biên

Tác giả tiến hành thống kê tần số, tần suất biên cho cặp biến quyết định gửi tiền (Y) và tình trạng vay mua nhà (housing) nhằm phân tích đặc điểm hành vi khách hàng theo từng nhóm.

g3 <- table(tieuluan$Y, tieuluan$housing)
addmargins(g3) 
##      
##          no   yes   Sum
##   no  16727 23195 39922
##   yes  3354  1935  5289
##   Sum 20081 25130 45211
addmargins(prop.table(table(tieuluan$Y, tieuluan$housing)))
##      
##               no        yes        Sum
##   no  0.36997633 0.51303886 0.88301520
##   yes 0.07418549 0.04279932 0.11698480
##   Sum 0.44416182 0.55583818 1.00000000

Trực quan hóa

Tác giả sử dụng biểu đồ để trực quan hóa tần số và tần suất biên cho cặp biến quyết định gửi tiền (Y) và tình trạng vay mua nhà (housing) nhằm phân tích đặc điểm hành vi khách hàng theo từng nhóm.

# Màu sắc tùy chọn cho từng giá trị của loan
custom_colors <- c("yes" = "#FFD700", "no" = "#D8B") 

# Vẽ biểu đồ cột
ggplot(tieuluan %>% 
         group_by(Y, housing) %>% 
         summarise(count = n()) %>% 
         ungroup(), 
       aes(x = Y, y = count, fill = housing)) +
  geom_col(position = position_dodge(width = 0.9)) +
  geom_text(aes(label = count), 
            position = position_dodge(width = 0.9), 
            vjust = -0.3, 
            size = 3.5) +
  scale_fill_manual(values = custom_colors) +  # Áp dụng màu tùy chỉnh
  labs(
    title = "Phân phối tình trạng vay mua nhà theo quyết định gửi tiền có kỳ hạn",
    y = "Số lượng khách hàng",
    x = "Quyết định gửi tiền có kỳ hạn",
    fill = "Tình trạng vay mua nhà"
  ) +
  theme_minimal()
## `summarise()` has grouped output by 'Y'. You can override using the `.groups`
## argument.

Hình 5.3. Biểu đồ cột thể hiện phản ảnh mối liên hệ giữa tình trạng vay mua nhà và quyết định gửi tiền có kỳ hạn

Hình 5.3 phản ánh mối quan hệ giữa tình trạng vay mua nhà và quyết định gửi tiền có kỳ hạn. Ở nhóm khách hàng không gửi tiền, phần lớn là những người có khoản vay mua nhà với 23.195 người, trong khi số khách hàng không có khoản vay mua nhà là 16.727 người. Điều này cho thấy, việc đang có một khoản vay mua nhà có thể khiến khách hàng ưu tiên trả nợ hơn là gửi tiết kiệm. Ngược lại, ở nhóm khách hàng có gửi tiền, tỷ lệ khách hàng không vay mua nhà chiếm ưu thế với 3.354 người, cao hơn rõ rệt so với 1.935 người có vay mua nhà. Điều này hàm ý rằng việc không có khoản nợ vay mua nhà có thể tạo điều kiện thuận lợi hơn cho khách hàng trong việc tích lũy và gửi tiền tiết kiệm có kỳ hạn.

Kiểm định Chi bình phương

chisq.test(table(tieuluan$Y, tieuluan$housing))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(tieuluan$Y, tieuluan$housing)
## X-squared = 874.82, df = 1, p-value < 2.2e-16

Bài toán kiểm định

\[ \left\{ \begin{array}{ll} H_0: & \text{Quyết định gửi tiền có kỳ hạn và tình trạng vay mua nhà là độc lập}\\ H_1: & \text{Quyết định gửi tiền có kỳ hạn và tình trạng vay mua nhà có mối liên hệ} \end{array} \right. \] Mức ý nghĩa 5%.

Ta thấy giá trị p_value < 2.2e-16 (bé hơn rất nhiếu so với 0.05), đủ bằng chứng để bác bỏ H0. Vậy Quyết định gửi tiền có kỳ hạn và tình trạng vay mua nhà có mối liên hệ với nhau.

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

riskratio(g3)
## $data
##        
##            no   yes Total
##   no    16727 23195 39922
##   yes    3354  1935  5289
##   Total 20081 25130 45211
## 
## $measure
##      risk ratio with 95% C.I.
##        estimate     lower    upper
##   no  1.0000000        NA       NA
##   yes 0.6296879 0.6071513 0.653061
## 
## $p.value
##      two-sided
##       midp.exact  fisher.exact    chi.square
##   no          NA            NA            NA
##   yes          0 8.517531e-192 1.887099e-192
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Theo bảng kết quả, nhóm khách hàng không gửi tiền có kỳ hạn (Y = “no”) được chọn làm nhóm tham chiếu với RR = 1.0000. Nhóm khách hàng gửi tiền có kỳ hạn (Y = “yes”) có RR = 0.6297, tức là tỷ lệ khách hàng có vay mua nhà trong nhóm gửi tiền có kỳ hạn bằng khoảng 0.6297 lần so với nhóm không gửi tiền. Khoảng ước lượng là (0.6072;0.6531) với độ tin cậy 95%.

Tỷ số chênh (Odds ratio)

oddsratio(g3)
## $data
##        
##            no   yes Total
##   no    16727 23195 39922
##   yes    3354  1935  5289
##   Total 20081 25130 45211
## 
## $measure
##      odds ratio with 95% C.I.
##        estimate     lower    upper
##   no  1.0000000        NA       NA
##   yes 0.4160568 0.3920292 0.441468
## 
## $p.value
##      two-sided
##       midp.exact  fisher.exact    chi.square
##   no          NA            NA            NA
##   yes          0 8.517531e-192 1.887099e-192
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Theo bảng kết quả, tỷ lệ khách hàng không có vay mua nhà trong nhóm không gửi tiền có kỳ hạn bằng khoảng 0.4161 lần so với nhóm khách hàng gửi tiền có kỳ hạn. Khoảng ước lượng là (0.3920;0.4415) với độ tin cậy 95%.

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

4.5.1 . Kiểm tra đa cộng tuyến cho dữ liệu

tieuluan$housing_bin <- ifelse(tieuluan$housing == "yes", 1, 0)
tieuluan$loan_bin <- ifelse(tieuluan$loan == "yes", 1, 0)
tieuluan$default_bin <- ifelse(tieuluan$default == "yes", 1, 0)
tieuluan$Y_bin <- ifelse(tieuluan$Y == "yes", 1, 0)

# Chạy mô hình logistic với 3 biến độc lập
model <- glm(Y_bin ~ housing_bin + loan_bin + default_bin, data = tieuluan, family = binomial)

# Tính VIF
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:DescTools':
## 
##     Recode
## The following object is masked from 'package:purrr':
## 
##     some
## The following object is masked from 'package:dplyr':
## 
##     recode
vif_results <- vif(model)

# Chuyển sang dataframe để vẽ biểu đồ
vif_df <- data.frame(Variable = names(vif_results), VIF = vif_results)
library(ggplot2)
library(ggthemes)
high_vif_threshold <- 5
# Tạo biểu đồ VIF thẩm mỹ hơn
ggplot(vif_df, aes(x = reorder(Variable, -VIF), y = VIF, fill = VIF)) +
  geom_col(width = 0.6, show.legend = FALSE) +
  geom_text(aes(label = round(VIF, 2)), vjust = -0.5, color = "black", size = 4.5) +
  geom_hline(yintercept = high_vif_threshold, linetype = "dashed", color = "#D72638", size = 1.2) +
  annotate("text", x = 1, y = high_vif_threshold + 0.5, label = paste("Ngưỡng =", high_vif_threshold), 
           color = "#D72638", size = 4.2, hjust = 0) +
  scale_fill_gradient(low = "#A6CEE3", high = "#1F78B4") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
  labs(
    title = "Kiểm tra đa cộng tuyến bằng chỉ số VIF",
    subtitle = "Biểu đồ trực quan hoá giá trị VIF của các biến giải thích",
    x = "Tên biến độc lập",
    y = "Giá trị VIF"
  ) +
  theme_minimal(base_family = "Helvetica") +
  theme(
    plot.title = element_text(hjust = 0.5, size = 17, face = "bold", color = "#003366"),
    plot.subtitle = element_text(hjust = 0.5, size = 13, color = "#666666"),
    axis.title = element_text(size = 13, face = "bold"),
    axis.text.x = element_text(angle = 20, vjust = 0.7, size = 11),
    axis.text.y = element_text(size = 11)
  )
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Hình 6.1. Kết quả kiểm tra đa cộng tuyến của các biến độc lập

Hình 6.1 thể hiện kết quả kiểm tra đa cộng tuyến của các biến độc lập. Biểu đồ kiểm tra đa cộng tuyến bằng chỉ số VIF cho thấy tất cả các biến độc lập trong mô hình gồm loan_bin, default_bin và housing_bin đều có giá trị VIF bằng 1, nằm rất xa dưới ngưỡng cảnh báo phổ biến là 5. Điều này cho thấy mô hình không gặp vấn đề đa cộng tuyến, tức là các biến giải thích không có mối tương quan tuyến tính đáng kể với nhau và có thể được sử dụng đồng thời trong hồi quy mà không ảnh hưởng đến độ tin cậy của các ước lượng.

4.5.2 . Hồi quy cho dữ liệu nhị phân

Mô hình hồi quy cho biến độc lập default

tieuluan$default <- relevel(as.factor(tieuluan$default), ref = "yes")
logit_default <- glm(Y_bin ~ default, data = tieuluan, family = binomial(link = "logit"))

probit_default<- glm(Y_bin ~ default, data = tieuluan, family = binomial(link = "probit"))

cloglog_default<- glm(Y_bin ~ default, data = tieuluan, family = binomial(link = "cloglog"))
library(stargazer)
## 
## Please cite as:
##  Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
stargazer(logit_default, probit_default, cloglog_default,
          type = "text",  # hoặc "html", "latex"
          title = "So sánh 3 mô hình hồi quy nhị phân",
          column.labels = c("Logit", "Probit", "Cloglog"),
          dep.var.labels = "Y_bin",
          align = TRUE, 
          no.space = TRUE,
          digits = 4)
## 
## So sánh 3 mô hình hồi quy nhị phân
## ==========================================================
##                             Dependent variable:           
##                   ----------------------------------------
##                                      Y                    
##                     logistic      probit    glm: binomial 
##                                             link = cloglog
##                      Logit        Probit       Cloglog    
##                       (1)          (2)           (3)      
## ----------------------------------------------------------
## defaultno          0.6741***    0.3384***     0.6439***   
##                     (0.1441)     (0.0689)      (0.1394)   
## Constant           -2.6860***   -1.5236***    -2.7192***  
##                     (0.1433)     (0.0685)      (0.1387)   
## ----------------------------------------------------------
## Observations         45,211       45,211        45,211    
## Log Likelihood    -16,302.1700 -16,302.1700  -16,302.1700 
## Akaike Inf. Crit. 32,608.3500  32,608.3500   32,608.3500  
## ==========================================================
## Note:                          *p<0.1; **p<0.05; ***p<0.01

Từ bảng thống kê kết quả mô hình hồi quy, ta có như sau

Mô hình hồi quy Logit

\[ \hat{\pi} = \frac{1}{1 + \exp(-(-2.6860 + 0.6741 \cdot \text{default}_{\text{no}}))} \] - Hệ số chặn \(\hat{\beta}_0 = -2.6860\) và có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Điều này có nghĩa là khi khách hàng thuộc nhóm tham chiếu (tức là default = “yes”, có nợ xấu), thì logit (log odds) đăng ký gửi tiền có kỳ hạn là \(-2.6860\).

  • Hệ số \(\hat{\beta}_1 = 0.6741\) và có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Hệ số này thể hiện mức chênh lệch logit giữa nhóm khách hàng không có nợ xấu (default = “no”) và nhóm có nợ xấu (default = “yes”). Cụ thể, khi các yếu tố khác không đổi, log odds đăng ký gửi tiền của khách hàng không có nợ xấu cao hơn 0.6741 đơn vị so với khách hàng có nợ xấu.

Mô hình hồi quy Probit

\[ \hat{\pi} = \Phi(-1.5236 + 0.3384 \cdot \text{default}_{\text{no}}) \]

  • Hệ số chặn \(\hat{\beta}_0 = -1.5236\) và có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Điều này có nghĩa là khi khách hàng thuộc nhóm tham chiếu (tức là default = “yes”, có nợ xấu), thì xác suất đăng ký gửi tiền có kỳ hạn là \(\Phi(-1.5236)\).

  • Hệ số \(\hat{\beta}_1 = 0.3384\) có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Hệ số này thể hiện mức chênh lệch về giá trị hàm \(\Phi(\cdot)\) giữa nhóm khách hàng không có nợ xấu và nhóm khách hàng có nợ xấu. Cụ thể, khi các yếu tố khác không đổi, xác suất gửi tiền có kỳ hạn của khách hàng không có nợ xấu cao hơn \(\Phi(0.3384)\) so với phần xác suất gốc từ nhóm có nợ xấu.

Mô hình hồi quy Cloglog

\[ \hat{\pi} = 1 - \exp\left(-\exp(-2.7192 + 0.6439 \cdot \text{default}_{\text{no}})\right) \]

  • Hệ số chặn \(\hat{\beta}_0 = -2.7192\) có ý nghĩa thống kê, nghĩa là nếu một khách hàng có nợ xấu (default = “yes”), giá trị biến liên kết η rất âm, dẫn đến xác suất gửi tiền có kỳ hạn ở mức rất thấp.

  • Hệ số \(\hat{\beta}_1 = 0.6439\) cũng có ý nghĩa thống kê. Khi khách hàng không có nợ xấu (default = “no”), giá trị η tăng 0.6439 đơn vị so với nhóm có nợ xấu, kéo theo xác suất gửi tiền có kỳ hạn cao hơn, vì hệ số dương phản ánh tác động tích cực đến khả năng gửi tiền.

newd <-data.frame(default = c("yes", "no"))
predict(logit_default, newdata = newd, type = "response")
##          1          2 
## 0.06380368 0.11796108
predict(probit_default, newdata = newd, type = "response")
##          1          2 
## 0.06380378 0.11796108
predict(cloglog_default, newdata = newd, type = "response")
##          1          2 
## 0.06380368 0.11796108

Dựa vào kết quả dự báo từ ba mô hình hồi quy nhị phân (logit, probit và cloglog), ta nhận thấy rằng xác suất trở thành khách hàng gửi tiết kiệm có kỳ hạn (Y = yes) đối với nhóm có nợ quá hạn (default = “yes”) xác suất này chỉ khoảng 6.38%, trong khi với nhóm khách hàng không có nợ quá hạn (default = “no”) dao động khoảng 11.80%

Mặc dù kết quả dự báo có sự khác biệt rất nhỏ giữa ba mô hình, nhưng về mặt xu hướng, cả ba đều cho thấy: những khách hàng không có nợ quá hạn có khả năng đăng ký gửi tiết kiệm cao hơn đáng kể so với nhóm còn lại. Điều này cho thấy biến default có ảnh hưởng rõ rệt đến hành vi gửi tiết kiệm: các ngân hàng có thể ưu tiên tiếp cận những khách hàng không có nợ quá hạn để gia tăng tỷ lệ thành công khi chào mời sản phẩm tiết kiệm.

Mô hình hồi quy cho biến độc lập loan

tieuluan$loan <- relevel(as.factor(tieuluan$loan), ref = "yes")
logit_loan <- glm(Y_bin ~ loan, data = tieuluan, family = binomial(link = "logit"))

probit_loan <- glm(Y_bin ~ loan, data = tieuluan, family = binomial(link = "probit"))

cloglog_loan <- glm(Y_bin ~ loan, data = tieuluan, family = binomial(link = "cloglog"))
library(stargazer)
stargazer(logit_loan, probit_loan, cloglog_loan,
          type = "text",  # hoặc "html", "latex"
          title = "So sánh 3 mô hình hồi quy nhị phân",
          column.labels = c("Logit", "Probit", "Cloglog"),
          dep.var.labels = "Y_bin",
          align = TRUE, 
          no.space = TRUE,
          digits = 4)
## 
## So sánh 3 mô hình hồi quy nhị phân
## ==========================================================
##                             Dependent variable:           
##                   ----------------------------------------
##                                      Y                    
##                     logistic      probit    glm: binomial 
##                                             link = cloglog
##                      Logit        Probit       Cloglog    
##                       (1)          (2)           (3)      
## ----------------------------------------------------------
## loanno             0.7049***    0.3571***     0.6713***   
##                     (0.0495)     (0.0241)      (0.0477)   
## Constant           -2.6367***   -1.4999***    -2.6715***  
##                     (0.0471)     (0.0226)      (0.0455)   
## ----------------------------------------------------------
## Observations         45,211       45,211        45,211    
## Log Likelihood    -16,196.5500 -16,196.5500  -16,196.5500 
## Akaike Inf. Crit. 32,397.1000  32,397.1000   32,397.1000  
## ==========================================================
## Note:                          *p<0.1; **p<0.05; ***p<0.01

Từ bảng thống kê kết quả mô hình hồi quy, ta có như sau

Mô hình hồi quy Logit

\[ \hat{\pi} = \frac{1}{1 + \exp(-(-2.6367 + 0.7049 \cdot \text{loan}_{\text{no}}))} \] - Hệ số chặn \(\hat{\beta}_0 = -2.6367\) và có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Điều này có nghĩa là khi khách hàng thuộc nhóm tham chiếu (tức là loan = “yes”, có vay tiêu dùng), thì logit (log odds) đăng ký gửi tiền có kỳ hạn là \(-2.6367\).

  • Hệ số \(\hat{\beta}_1 = 0.7049\) và có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Hệ số này thể hiện mức chênh lệch logit giữa nhóm khách hàng không có vay tiêu dùng (loan = “no”) và nhóm có vay tiêu dùng (loan = “yes”). Cụ thể, khi các yếu tố khác không đổi, log odds đăng ký gửi tiền của khách hàng không có vay tiêu dùng cao hơn 0.7049 đơn vị so với khách hàng có vay tiêu dùng.

Mô hình hồi quy Probit

\[ \hat{\pi} = \Phi(-1.4999 + 0.3571 \cdot \text{loan}_{\text{no}}) \]

  • Hệ số chặn \(\hat{\beta}_0 = -1.4999\) và có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Điều này có nghĩa là khi khách hàng thuộc nhóm tham chiếu (tức là loan = “yes”, có vay tiêu dùng), thì xác suất đăng ký gửi tiền có kỳ hạn là $(-1.4999).

  • Hệ số \(\hat{\beta}_1 = 0.3571\) có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Hệ số này thể hiện mức chênh lệch về giá trị hàm \(\Phi(\cdot)\) giữa nhóm khách hàng không có vay tiêu dùng và nhóm khách hàng có vay tiêu dùng. Cụ thể, khi các yếu tố khác không đổi, xác suất gửi tiền có kỳ hạn của khách hàng không có vay tiêu dùng cao hơn \(\Phi(0.3571)\) so với phần xác suất gốc từ nhóm có vay tiêu dùng.

Mô hình hồi quy Cloglog

\[ \hat{\pi} = 1 - \exp\left(-\exp(-2.6715 + 0.6713 \cdot \text{loan}_{\text{no}})\right) \]

  • Hệ số chặn \(\hat{\beta}_0 = -2.6715\) và có ý nghĩa thống kê, nghĩa là nếu một khách hàng có vay tiêu dùng (loan = “yes”), giá trị biến liên kết η rất âm, dẫn đến xác suất gửi tiền có kỳ hạn ở mức rất thấp.

  • Hệ số \(\hat{\beta}_1 = 0.6713\) cũng có ý nghĩa thống kê. Khi khách hàng không có vay tiêu dùng (loan = “no”), giá trị η tăng 0.6713 đơn vị so với nhóm có vay tiêu dùng, kéo theo xác suất gửi tiền có kỳ hạn cao hơn, vì hệ số dương phản ánh tác động tích cực đến khả năng gửi tiền.

newl <-data.frame(loan = c("yes", "no"))
predict(logit_loan, newdata = newl, type = "response")
##          1          2 
## 0.06681391 0.12655727
predict(probit_loan, newdata = newl, type = "response")
##          1          2 
## 0.06681391 0.12655727
predict(cloglog_loan, newdata = newl, type = "response")
##          1          2 
## 0.06681392 0.12655727

Dựa vào kết quả dự báo từ ba mô hình hồi quy nhị phân (logit, probit và cloglog), ta nhận thấy rằng xác suất trở thành khách hàng gửi tiết kiệm có kỳ hạn (Y = yes) đối với nhóm có vay tiêu dùng (loan = “yes”) xác suất này chỉ khoảng 6.68%, trong khi với nhóm khách hàng không có vay tiêu dùng (loan = “no”) dao động khoảng 12.66%

Mặc dù kết quả dự báo có sự khác biệt rất nhỏ giữa ba mô hình, nhưng về mặt xu hướng, cả ba đều cho thấy: những khách hàng không có vay tiêu dùng có khả năng đăng ký gửi tiết kiệm cao hơn đáng kể so với nhóm còn lại. Điều này cho thấy biến loan có ảnh hưởng rõ rệt đến hành vi gửi tiết kiệm: các ngân hàng có thể ưu tiên tiếp cận những khách hàng không có vay tiêu dùng để gia tăng tỷ lệ thành công khi chào mời sản phẩm tiết kiệm.

Mô hình hồi quy cho biến độc lập housing

tieuluan$housing <- relevel(as.factor(tieuluan$housing), ref = "yes")
logit_housing <- glm(Y_bin ~ housing, data = tieuluan, family = binomial(link = "logit"))

probit_housing <- glm(Y_bin ~ housing, data = tieuluan, family = binomial(link = "probit"))

cloglog_housing <- glm(Y_bin ~ housing, data = tieuluan, family = binomial(link = "cloglog"))
library(stargazer)
stargazer(logit_housing, probit_housing, cloglog_housing,
          type = "text",  # hoặc "html", "latex"
          title = "So sánh 3 mô hình hồi quy nhị phân",
          column.labels = c("Logit", "Probit", "Cloglog"),
          dep.var.labels = "Y_bin",
          align = TRUE, 
          no.space = TRUE,
          digits = 4)
## 
## So sánh 3 mô hình hồi quy nhị phân
## ==========================================================
##                             Dependent variable:           
##                   ----------------------------------------
##                                      Y                    
##                     logistic      probit    glm: binomial 
##                                             link = cloglog
##                      Logit        Probit       Cloglog    
##                       (1)          (2)           (3)      
## ----------------------------------------------------------
## housingno          0.8770***    0.4596***     0.8245***   
##                     (0.0303)     (0.0157)      (0.0286)   
## Constant           -2.4838***   -1.4255***    -2.5242***  
##                     (0.0237)     (0.0116)      (0.0227)   
## ----------------------------------------------------------
## Observations         45,211       45,211        45,211    
## Log Likelihood    -15,879.0100 -15,879.0100  -15,879.0100 
## Akaike Inf. Crit. 31,762.0200  31,762.0200   31,762.0200  
## ==========================================================
## Note:                          *p<0.1; **p<0.05; ***p<0.01

Từ bảng thống kê kết quả mô hình hồi quy, ta có như sau

Mô hình hồi quy Logit

\[ \hat{\pi} = \frac{1}{1 + \exp(-(-2.4838 + 0.8770 \cdot \text{housing}_{\text{no}}))} \] - Hệ số chặn \(\hat{\beta}_0 = -2.4838\) và có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Điều này có nghĩa là khi khách hàng thuộc nhóm tham chiếu (tức là housing = “yes”, có vay mua nhà), thì logit (log odds) đăng ký gửi tiền có kỳ hạn là \(-2.4838\).

  • Hệ số \(\hat{\beta}_1 = 0.8770\) và có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Hệ số này thể hiện mức chênh lệch logit giữa nhóm khách hàng không có vay mua nhà (housing = “no”) và nhóm có vay mua nhà (housing = “yes”). Cụ thể, khi các yếu tố khác không đổi, log odds đăng ký gửi tiền của khách hàng không có vay mua nhà cao hơn 0.8770 đơn vị so với khách hàng có vay mua nhà.

Mô hình hồi quy Probit

\[ \hat{\pi} = \Phi(-1.4255 + 0.4596 \cdot \text{housing}_{\text{no}}) \]

  • Hệ số chặn \(\hat{\beta}_0 = -1.4255\) và có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Điều này có nghĩa là khi khách hàng thuộc nhóm tham chiếu (tức là housing = “yes”, có vay mua nhà), thì xác suất đăng ký gửi tiền có kỳ hạn là \(\Phi(-1.4255)\).

  • Hệ số \(\hat{\beta}_1 = 0.4596\) có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Hệ số này thể hiện mức chênh lệch về giá trị hàm \(\Phi(\cdot)\) giữa nhóm khách hàng không có vay mua nhà và nhóm khách hàng có vay mua nhà. Cụ thể, khi các yếu tố khác không đổi, xác suất gửi tiền có kỳ hạn của khách hàng không có vay mua nhà cao hơn \(\Phi(0.4596)\) so với phần xác suất gốc từ nhóm có vay mua nhà.

Mô hình hồi quy Cloglog

\[ \hat{\pi} = 1 - \exp\left(-\exp(-2.5242 + 0.8245 \cdot \text{housing}_{\text{no}})\right) \]

  • Hệ số chặn \(\hat{\beta}_0 = -2.5242\) có ý nghĩa thống kê, nghĩa là nếu một khách hàng có vay mua nhà (housing = “yes”), giá trị biến liên kết η rất âm, dẫn đến xác suất gửi tiền có kỳ hạn ở mức rất thấp.

  • Hệ số \(\hat{\beta}_1 = 0.8245\) cũng có ý nghĩa thống kê. Khi khách hàng không có vay mua nhà (housing = “no”), giá trị η tăng 0.8245 đơn vị so với nhóm có vay mua nhà, kéo theo xác suất gửi tiền có kỳ hạn cao hơn, vì hệ số dương phản ánh tác động tích cực đến khả năng gửi tiền.

newh <-data.frame(housing = c("yes", "no"))
predict(logit_housing, newdata = newh, type = "response")
##         1         2 
## 0.0769996 0.1670236
predict(probit_housing, newdata = newh, type = "response")
##         1         2 
## 0.0769996 0.1670236
predict(cloglog_housing, newdata = newh, type = "response")
##         1         2 
## 0.0769996 0.1670236

Dựa vào kết quả dự báo từ ba mô hình hồi quy nhị phân (logit, probit và cloglog), ta nhận thấy rằng xác suất trở thành khách hàng gửi tiết kiệm có kỳ hạn (Y = yes) đối với nhóm có vay mua nhà (housing = “yes”) xác suất này chỉ khoảng 7.69%, trong khi với nhóm khách hàng không có vay mua nhà (housing = “no”) dao động khoảng 16.70%

Mặc dù kết quả dự báo có sự khác biệt rất nhỏ giữa ba mô hình, nhưng về mặt xu hướng, cả ba đều cho thấy: những khách hàng không có vay mua nhà có khả năng đăng ký gửi tiết kiệm cao hơn đáng kể so với nhóm còn lại. Điều này cho thấy biến housing có ảnh hưởng rõ rệt đến hành vi gửi tiết kiệm: các ngân hàng có thể ưu tiên tiếp cận những khách hàng không có vay mua nhà để gia tăng tỷ lệ thành công khi chào mời sản phẩm tiết kiệm.

4.5.3 . Hồi quy đa biến

logit_model <- glm(Y_bin ~ default + loan + housing, data = tieuluan, family = binomial(link = "logit"))

probit_model <- glm(Y_bin ~ default + loan + housing, data = tieuluan, family = binomial(link = "probit"))

cloglog_model <- glm(Y_bin ~ default + loan + housing, data = tieuluan, family = binomial(link = "cloglog"))
library(stargazer)
stargazer(logit_model, probit_model, cloglog_model,
          type = "text",  # hoặc "html", "latex"
          title = "So sánh 3 mô hình hồi quy nhị phân",
          column.labels = c("Logit", "Probit", "Cloglog"),
          dep.var.labels = "Y_bin",
          align = TRUE, 
          no.space = TRUE,
          digits = 4)
## 
## So sánh 3 mô hình hồi quy nhị phân
## ==========================================================
##                             Dependent variable:           
##                   ----------------------------------------
##                                      Y                    
##                     logistic      probit    glm: binomial 
##                                             link = cloglog
##                      Logit        Probit       Cloglog    
##                       (1)          (2)           (3)      
## ----------------------------------------------------------
## defaultno          0.5675***    0.2732***     0.5433***   
##                     (0.1454)     (0.0698)      (0.1400)   
## loanno             0.6515***    0.3204***     0.6210***   
##                     (0.0499)     (0.0244)      (0.0479)   
## housingno          0.8643***    0.4502***     0.8127***   
##                     (0.0304)     (0.0157)      (0.0286)   
## Constant           -3.6056***   -1.9675***    -3.5970***  
##                     (0.1500)     (0.0718)      (0.1445)   
## ----------------------------------------------------------
## Observations         45,211       45,211        45,211    
## Log Likelihood    -15,766.4900 -15,773.2300  -15,764.5100 
## Akaike Inf. Crit. 31,540.9900  31,554.4600   31,537.0200  
## ==========================================================
## Note:                          *p<0.1; **p<0.05; ***p<0.01

Từ bảng thống kê kết quả mô hình hồi quy, ta có như sau

Mô hình hồi quy Logit

\[ \hat{\pi} = \frac{1}{1 + \exp\left[-\left(-3.6056 + 0.5675 \cdot default\_no + 0.6515 \cdot loan\_no + 0.8643 \cdot housing\_no\right)\right]} \] - Hệ số chặn \(\hat{\beta}_0 = -3.6056\) và có ý nghĩa thống kê nếu p-value nhỏ hơn 0.05. Điều này có nghĩa là khi khách hàng thuộc nhóm tham chiếu (cụ thể là: default = “yes”, loan = “yes”, housing = “yes”), thì logit (tức là log odds) của xác suất đăng ký gửi tiền có kỳ hạn là \(-3.6056\).

  • Hệ số \(\hat{\beta}_1 = 0.5675\) của biến default_no thể hiện mức chênh lệch logit giữa khách hàng không có nợ xấu (default = “no”) và khách hàng có nợ xấu (default = “yes”). Khi các yếu tố khác không đổi, log odds đăng ký gửi tiền có kỳ hạn của khách hàng không có nợ xấu cao hơn 0.5675 đơn vị so với khách hàng có nợ xấu.

  • Hệ số \(\hat{\beta}_2 = 0.6515\) của biến loan_no thể hiện mức chênh lệch logit giữa khách hàng không có khoản vay tiêu dùng (loan = “no”) và khách hàng có khoản vay (loan = “yes”). Khi các yếu tố khác không đổi, log odds đăng ký gửi tiền của khách hàng không có khoản vay cao hơn 0.6515 đơn vị so với nhóm có khoản vay.

  • Hệ số \(\hat{\beta}_3 = 0.8643\) của biến housing_no thể hiện mức chênh lệch logit giữa khách hàng không vay mua nhà (housing = “no”) và khách hàng có vay mua nhà (housing = “yes”). Khi các yếu tố khác không đổi, log odds đăng ký gửi tiền của khách hàng không vay mua nhà cao hơn 0.8643 đơn vị so với khách hàng có vay mua nhà.

Mô hình hồi quy Probit

\[ \hat{\pi} = \Phi\left(-1.9675 + 0.2732 \cdot default\_no + 0.3204 \cdot loan\_no + 0.4502 \cdot housing\_no\right) \] - Hệ số chặn \(\hat{\beta}_0 = -1.9675\) có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Điều này có nghĩa là khi khách hàng thuộc nhóm tham chiếu (tức là default = yes, loan = yes, housing = yes), thì xác suất đăng ký gửi tiền có kỳ hạn là \(\Phi(-1.9675)\).

  • Hệ số \(\hat{\beta}_1 = 0.2732\) (biến default_no) có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Hệ số này thể hiện mức chênh lệch về giá trị hàm \(\Phi(\cdot)\) giữa nhóm khách hàng không có nợ xấu (default = no) và nhóm có nợ xấu (default = yes). Cụ thể, khi các yếu tố khác không đổi, xác suất gửi tiền có kỳ hạn của khách hàng không có nợ xấu cao hơn \(\Phi(0.2732)\) so với phần xác suất gốc từ nhóm có nợ xấu.

  • Hệ số \(\hat{\beta}_2 = 0.3204\) (biến loan_no) có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Điều này cho thấy khách hàng không có khoản vay cá nhân (loan = no) sẽ có xác suất gửi tiền có kỳ hạn cao hơn \(\Phi(0.3204)\) so với nhóm có khoản vay cá nhân (loan = yes), giả định các yếu tố khác không đổi.

  • Hệ số \(\hat{\beta}_3 = 0.4502\) (biến housing_no) cũng có ý nghĩa thống kê khi p-value nhỏ hơn 0.05. Điều này hàm ý rằng khách hàng không có vay mua nhà (housing = no) có xác suất gửi tiền có kỳ hạn cao hơn \(\Phi(0.4502)\) so với nhóm có vay mua nhà (housing = yes), trong điều kiện các yếu tố khác giữ nguyên.

Mô hình hồi quy Cloglog

\[ \hat{\pi} = 1 - \exp\left[-\exp\left(-3.5970 + 0.5433 \cdot default\_no + 0.6210 \cdot loan\_no + 0.8127 \cdot housing\_no\right)\right] \]

  • Hệ số chặn \(\hat{\beta}_0 = -3.5970\) có ý nghĩa thống kê, cho thấy khi khách hàng có nợ xấu, có khoản vay tiêu dùng và có vay mua nhà (tức cả ba biến ở mức tham chiếu = “yes”), giá trị biến liên kết η rất âm, dẫn đến xác suất gửi tiền có kỳ hạn ở mức rất thấp.

  • Hệ số \(\hat{\beta}_1 = 0.5433\) ứng với default_no:có ý nghĩa thống kê. Khi khách hàng không có nợ xấu, giá trị η tăng 0.5433 đơn vị so với nhóm có nợ xấu, kéo theo xác suất gửi tiền có kỳ hạn tăng, giữ nguyên các yếu tố khác.

  • Hệ số \(\hat{\beta}_2 = 0.6210\) ứng với loan_no: có ý nghĩa thống kê. Khi khách hàng không có khoản vay tiêu dùng, η tăng 0.6210 đơn vị so với nhóm có vay, làm xác suất gửi tiền có kỳ hạn cao hơn.

  • Hệ số \(\hat{\beta}_3 = 0.8127\) ứng với housing_no: có ý nghĩa thống kê và là lớn nhất trong ba biến. Việc không vay mua nhà làm η tăng 0.8127 đơn vị so với nhóm vay mua nhà, tác động tích cực mạnh nhất đến xác suất gửi tiền có kỳ hạn.

newm <-data.frame(default = c("yes", "no"), loan = c("yes", "no"), housing = c("yes", "no"))
predict(logit_model, newdata = newm, type = "response")
##          1          2 
## 0.02645265 0.17913212
predict(probit_model, newdata = newm, type = "response")
##          1          2 
## 0.02456488 0.17783589
predict(cloglog_model, newdata = newm, type = "response")
##          1          2 
## 0.02703297 0.17954166

Kết quả dự báo xác suất khách hàng gửi tiền có kỳ hạn đối với hai nhóm khách hàng cho thấy sự thống nhất khá cao giữa ba mô hình hồi quy: Logit, Probit và Complementary Log-log (Cloglog). Cụ thể:

Với nhóm khách hàng có nợ tín dụng quá hạn (default = yes), có khoản vay cá nhân (loan = yes) và có vay mua nhà (housing = yes):

  • Mô hình Probit dự báo xác suất là 2.46%.

  • Mô hình Logit cho kết quả gần tương đương với 2.65%.

  • Mô hình Cloglog dự báo cao nhất với 2.70%.

→ Nhìn chung, cả ba mô hình đều dự báo xác suất rất thấp, dao động trong khoảng 2.46% – 2.70%, cho thấy khách hàng có ràng buộc tài chính nặng thường khó có khả năng gửi tiền có kỳ hạn.

Với nhóm khách hàng không có nợ quá hạn, không có khoản vay cá nhân và không vay mua nhà (default = no, loan = no, housing = no):

  • Mô hình Probit dự báo xác suất là 17.78%.

  • Mô hình Logit dự báo ở mức 17.91%.

  • Mô hình Cloglog cho xác suất cao nhất là 17.95%.

→ Trong nhóm này, xác suất dao động từ 17.78% – 17.95%, cao gấp khoảng 7 lần so với nhóm đầu tiên, phản ánh rằng khách hàng có tình hình tài chính ổn định hơn sẽ có xu hướng gửi tiết kiệm kỳ hạn cao hơn đáng kể.

Tổng thể, cả ba mô hình đều cho kết quả dự báo nhất quán về xu hướng và mức độ khác biệt giữa hai nhóm khách hàng, cho thấy độ tin cậy của các mô hình là khá tốt trong việc phân loại hành vi gửi tiền dựa trên đặc điểm tài chính cá nhân.

4.5.4 . Đánh giá mô hình

  • AIC
aic_values <- data.frame(
  Model = c("Logit", "Probit", "Cloglog"),
  AIC = c(
    AIC(logit_model),
    AIC(probit_model),
    AIC(cloglog_model)
  )
)

print(aic_values)
##     Model      AIC
## 1   Logit 31540.99
## 2  Probit 31554.46
## 3 Cloglog 31537.02

Xét theo tiêu chí Akaike Information Criterion (AIC), mô hình Complementary Log-log (Cloglog) có giá trị AIC thấp nhất (31537.02), cho thấy đây là mô hình phù hợp nhất trong ba mô hình được so sánh. Mô hình Logit có AIC là 31540.99, cao hơn một chút, trong khi mô hình Probit có AIC cao nhất (31554.46), cho thấy mức độ phù hợp thấp hơn so với hai mô hình còn lại. Như vậy, mô hình Cloglog là lựa chọn tối ưu về mặt cân bằng giữa độ phù hợp và độ phức tạp của mô hình theo tiêu chí AIC.

  • Brier Score
# Tính từng Brier Score
brier_logit <- BrierScore(logit_model)
brier_probit <- BrierScore(probit_model)
brier_cloglog <- BrierScore(cloglog_model)

# Ghép lại thành data frame
brier_df <- data.frame(
  Model = c("Logit", "Probit", "Cloglog"),
  BrierScore = c(brier_logit, brier_probit, brier_cloglog)
)

# In ra bảng
print(brier_df)
##     Model BrierScore
## 1   Logit  0.1006749
## 2  Probit  0.1007011
## 3 Cloglog  0.1006678

Xét theo Brier Score – chỉ số đánh giá độ chính xác của dự đoán xác suất, mô hình Complementary Log-log (Cloglog) tiếp tục cho kết quả tốt nhất với Brier Score thấp nhất là 0.1006678, cho thấy sai số trung bình bình phương giữa xác suất dự báo và thực tế là nhỏ nhất. Mô hình Logit có Brier Score gần tương đương (0.1006749), xếp thứ hai, trong khi mô hình Probit có chỉ số cao nhất (0.1007011), cho thấy hiệu suất dự báo kém hơn đôi chút. Nhìn chung, mô hình Cloglog cho hiệu quả dự báo xác suất cao nhất trong ba mô hình xét theo tiêu chí Brier Score.

# Lấy giá trị log-likelihood
logLik_values <- data.frame(
  Model = c("Logit", "Probit", "Cloglog"),
  LogLik = c(
    as.numeric(logLik(logit_model)),
    as.numeric(logLik(probit_model)),
    as.numeric(logLik(cloglog_model))
  )
)

# Hiển thị bảng
print(logLik_values)
##     Model    LogLik
## 1   Logit -15766.49
## 2  Probit -15773.23
## 3 Cloglog -15764.51

Xét theo giá trị Log-Likelihood – đại diện cho mức độ phù hợp của mô hình với dữ liệu, mô hình Complementary Log-log (Cloglog) có Log-Likelihood cao nhất là -15764.51, cho thấy mô hình này giải thích dữ liệu tốt nhất trong ba mô hình. Tiếp theo là mô hình Logit với Log-Likelihood là -15766.49, xếp ở vị trí thứ hai. Mô hình Probit có Log-Likelihood thấp nhất (-15773.23), phản ánh mức độ phù hợp với dữ liệu kém hơn. Tổng thể, Cloglog tiếp tục là mô hình có hiệu suất phù hợp tốt nhất theo tiêu chí Log-Likelihood.


5 . CHƯƠNG 5: KẾT LUẬN VÀ KHUYẾN NGHỊ

5.1 . Kết luận

Thứ nhất, kết quả hồi quy nhị phân với từng biến độc lập cho thấy cả ba yếu tố: default, housing, và loan đều có ảnh hưởng thống kê ý nghĩa đến quyết định gửi tiết kiệm có kỳ hạn của khách hàng. Trong đó, khách hàng không có nợ xấu (default = no), không vay mua nhà (housing = no) và không vay tiêu dùng (loan = no) có xác suất cao hơn đáng kể để đăng ký gửi tiền. Điều này gợi ý rằng các đặc điểm tài chính ổn định và không chịu áp lực vay nợ góp phần thúc đẩy xu hướng tiết kiệm dài hạn của khách hàng.

Thứ hai, trong phân tích hồi quy đa biến với ba biến độc lập là default, loan và housing, kết quả ước lượng từ cả ba mô hình (Logit, Probit và Cloglog) đều cho thấy các hệ số đều dương và có ý nghĩa thống kê, phản ánh mối liên hệ tích cực giữa tình hình tài chính ổn định và khả năng gửi tiết kiệm. Cụ thể, khách hàng không có nợ quá hạn (default = no), không vay tiêu dùng (loan = no) và không vay mua nhà (housing = no) đều có xác suất gửi tiền cao hơn đáng kể so với nhóm đối nghịch. Trong mô hình Cloglog, hệ số ảnh hưởng của housing_no là lớn nhất (0.8127), cho thấy đây là yếu tố có tác động mạnh nhất đến hành vi gửi tiền có kỳ hạn. Nhìn chung, các biến tài chính đều đóng vai trò quan trọng trong việc phân loại khả năng khách hàng trở thành người gửi tiết kiệm.

Thứ ba, Khi so sánh hiệu quả dự báo của ba mô hình, cả Logit, Probit và Cloglog đều cho kết quả nhất quán về xu hướng: nhóm khách hàng có tình hình tài chính không ràng buộc (default = no, loan = no, housing = no) có xác suất gửi tiền cao gấp 7 lần so với nhóm có nhiều ràng buộc tài chính. Cụ thể, xác suất gửi tiền ở nhóm tài chính ổn định dao động từ 17.78% đến 17.95%, trong khi nhóm có ràng buộc tài chính chỉ từ 2.46% đến 2.70%. Điều này chứng tỏ rằng các mô hình đều có khả năng phân loại tốt và đáng tin cậy trong việc dự báo hành vi gửi tiết kiệm của khách hàng dựa trên các đặc điểm tài chính cá nhân.

Thứ tư, Dựa trên ba tiêu chí đánh giá mô hình gồm Akaike Information Criterion (AIC), Brier Score và Log-Likelihood, mô hình Complementary Log-log (Cloglog) cho thấy hiệu suất tốt nhất. Cloglog có AIC thấp nhất (31537.02), Brier Score nhỏ nhất (0.1006678) và Log-Likelihood cao nhất (-15764.51), phản ánh sự cân bằng tối ưu giữa độ phù hợp, độ chính xác và mức độ giải thích dữ liệu. Do đó, mô hình Cloglog được xem là lựa chọn phù hợp nhất trong ba mô hình được so sánh.

5.2 . Khuyến nghị

1. Khuyến nghị 1: Ưu tiên nhóm khách hàng không vay tiêu dùng và không vay mua nhà

Kết quả hồi quy cho thấy khách hàng không vay tiêu dùng và không vay mua nhà có xác suất gửi tiền có kỳ hạn cao hơn đáng kể. Do đó, ngân hàng nên tập trung vào các chiến lược tiếp cận nhóm khách hàng này thông qua các gói tiết kiệm ưu đãi, chăm sóc khách hàng thân thiết và truyền thông hướng đến nhu cầu tích lũy tài sản an toàn.

2. Khuyến nghị 2: Thận trọng khi tiếp cận nhóm có lịch sử nợ xấu

Khách hàng không có nợ quá hạn trong quá khứ có khả năng đăng ký tiền gửi cao hơn. Vì vậy, ngân hàng nên sử dụng thông tin tín dụng để sàng lọc khách hàng và ưu tiên nguồn lực tiếp thị vào những cá nhân có hồ sơ tín dụng sạch, đồng thời áp dụng các chính sách riêng biệt đối với nhóm khách hàng từng có nợ quá hạn nhằm hạn chế rủi ro.

3. Khuyến nghị 3: Tích hợp mô hình Cloglog vào hệ thống dự báo hành vi khách hàng

Mô hình Cloglog được xác định là có hiệu suất dự báo cao nhất trong ba mô hình đã kiểm định. Ngân hàng nên tích hợp mô hình này vào hệ thống CRM (Customer Relationship Management ) để phân loại khách hàng tiềm năng, từ đó cá nhân hóa chiến dịch marketing và tối ưu hóa chi phí huy động vốn.

4. Khuyến nghị 4: Đa dạng hóa sản phẩm tiết kiệm theo hồ sơ khách hàng

Do đặc điểm tài chính của khách hàng có ảnh hưởng đến quyết định gửi tiền, ngân hàng nên thiết kế các sản phẩm tiết kiệm linh hoạt, phù hợp với từng phân khúc như: gói tiết kiệm cho người không vay tiêu dùng, gói tiết kiệm tích lũy cho người đang trả nợ mua nhà, hay ưu đãi cho khách hàng duy trì lịch sử tín dụng tốt.

5.3 . Hạn chế của đề tài

  1. Giới hạn dữ liệu: Dữ liệu nghiên cứu chủ yếu dựa trên thông tin khảo sát/sẵn có từ một nguồn cụ thể trong một khoảng thời gian nhất định, có thể chưa phản ánh đầy đủ sự đa dạng về hành vi của khách hàng tại các ngân hàng khác hoặc trong các giai đoạn kinh tế khác nhau.

  2. Mô hình phân tích: Nghiên cứu chỉ sử dụng một số mô hình hồi quy nhị phân (như Logit, Probit, Cloglog) để đánh giá ảnh hưởng của các biến độc lập đến quyết định gửi tiền, chưa xét đến các mô hình học máy có khả năng phân loại phức tạp hơn.

  3. Thiếu yếu tố tâm lý và xã hội: Các yếu tố thuộc về tâm lý hành vi, niềm tin vào ngân hàng, ảnh hưởng từ người thân, hoặc xu hướng tài chính cá nhân chưa được đưa vào mô hình, trong khi đây có thể là những yếu tố ảnh hưởng mạnh đến quyết định gửi tiết kiệm.

5.4 . Hướng nghiên cứu tiếp theo

  1. Mở rộng phạm vi dữ liệu: Nghiên cứu tiếp theo có thể thu thập dữ liệu từ nhiều ngân hàng khác nhau hoặc mở rộng về mặt thời gian để đảm bảo tính đại diện và nâng cao độ tin cậy của kết quả.

  2. Ứng dụng mô hình học máy: Áp dụng các phương pháp như Random Forest, XGBoost, hoặc mô hình mạng nơ-ron nhân tạo (ANN) để cải thiện độ chính xác của mô hình dự đoán và phát hiện các tương tác phi tuyến giữa các biến.

  3. Khảo sát yếu tố tâm lý tài chính: Bổ sung các chỉ số về xu hướng đầu tư, mức độ chấp nhận rủi ro, niềm tin vào ngân hàng và xu hướng tài chính cá nhân để mô hình phản ánh rõ hơn quyết định thực tế của khách hàng.

  4. Phân tích theo phân khúc khách hàng: Xây dựng mô hình riêng biệt cho từng phân khúc (theo độ tuổi, nghề nghiệp, thu nhập…) để đưa ra khuyến nghị phù hợp và chính sách chăm sóc khách hàng mục tiêu.

TÀI LIỆU THAM KHẢO

[1] Trần Mạnh Tường (2025), Giáo trình Phân tích Dữ liệu Định tính.

[2] De Giorgi, G., & Naguib, C. (2023). Life after (soft) default. arXiv.

[3] FINRA Investor Education Foundation. (2019). National Financial Capability Study.

[4] Gathergood, J., & Weber, J. (2014). Self-control, financial literacy and the use of consumer credit. Journal of Economic Behavior & Organization, 107, 548–566.

[5] Godwin, D. D. (1994). Antecedents and consequences of newlyweds’ cash flow management. Financial Counseling and Planning, 5, 161–190.

[6] Günes, E., & Tunc, A. (2018). Saving impact of mortgage payments: A micro-level study for U.S. households. Journal of Consumer Affairs.

[7] Kahneman, D., & Tversky, A. (1979). Prospect theory: An analysis of decision under risk. Econometrica, 47(2), 263–291.

[8] Lee, J., & Hanna, S. D. (2015). Savings goals and saving behavior from a perspective of Maslow’s hierarchy of needs. Journal of Financial Counseling and Planning, 26(2), 129–147.

[9] Lusardi, A., & Mitchell, O. S. (2014). The economic importance of financial literacy: Theory and evidence. Journal of Economic Literature, 52(1), 5–44.

[10] Mankiw, N. G. (2016). Principles of Economics (7th ed.). Cengage Learning . [11] Mishkin, F. S. (2019). The Economics of Money, Banking and Financial Markets (12th ed.). Pearson.

[12] Moro, S., Cortez, P., & Rita, P. (2014). A data-driven approach to predict the success of bank telemarketing. Decision Support Systems, 62, 22–31.

[13] Ngân hàng Nhà nước Việt Nam. (2023). Thông tin hoạt động ngân hàng quý I.

[14] Rogg, C. S. (2000). The impact of access to credit on the saving behavior of microentrepreneurs: Evidence from three Latin American countries. Inter‑American Development Bank Publications.

[15] Thaler, R. H. (1999). Mental accounting matters. Journal of Behavioral Decision Making, 12(3), 183–206.

[16] Xiao, J. J., & Porto, N. (2017). Financial education and financial satisfaction: Financial literacy, behavior, and capability as mediators. International Journal of Bank Marketing, 35(5), 805–817.

Ci0tLQpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNzczogaGVhZGluZy1ib2xkLmNzcwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBkZl9wcmludDoga2FibGUKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogImRlZmF1bHQiCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgoKPGRpdiBhbGlnbj0ianVzdGlmeSI+CgoKICA8Y2VudGVyPgogIDxoMSBzdHlsZT0iY29sb3I6IDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IDMwcHQ7Ij4KICAgICAgUEjDgk4gVMONQ0ggQ8OBQyBZ4bq+VSBU4buQIOG6ok5IIEjGr+G7nk5HIMSQ4bq+TiBRVVnhur5UIMSQ4buKTkggxJDEgk5HIEvDnSBUSeG7gE4gR+G7rEkgQ8OTIEvhu7IgSOG6oE4gQ+G7pkEgS0jDgUNIIEjDgE5HCiAgICA8L2gxPgogICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4KICAgICAgR2nhuqNuZyB2acOqbiBoxrDhu5tuZyBk4bqrbjogVGhTLiBUcuG6p24gTeG6oW5oIFTGsOG7nW5nCiAgICA8L3A+CiAgICA8cCBzdHlsZT0iZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXdlaWdodDogYm9sZDsiPgogICAgICBTaW5oIHZpw6puIHRo4buxYyBoaeG7h246IEzDqiBOZ+G7jWMgVMaw4budbmcgVnkKICAgIDwvcD4KICAgIDxwIHN0eWxlPSJmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtd2VpZ2h0OiBib2xkOyI+CiAgICAgIFRow6BuaCBwaOG7kSBI4buTIENow60gTWluaCwgdGjDoW5nIDA4IG7Eg20gMjAyNQogICAgPC9wPgogIDwvY2VudGVyPgoKPC9kaXY+Cgo8c3R5bGU+CiAgYm9keSB7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGZvbnQtc2l6ZTogMTNwdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgfQoKICBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogIH0KPC9zdHlsZT4KCgoKPGRpdiBhbGlnbj0ianVzdGlmeSI+CgoKCgojIEzhu5xJIEPhuqJNIMagTiB7LnVubnVtYmVyZWR9CgoKRW0geGluIGfhu61pIGzhu51pIGPhuqNtIMahbiBjaMOibiB0aMOgbmggdsOgIHPDonUgc+G6r2MgbmjhuqV0IMSR4bq/biBUaFMuIFRy4bqnbiBN4bqhbmggVMaw4budbmcgdsOsIFRo4bqneSDEkcOjIHRydXnhu4FuIMSR4bqhdCBjaG8gZW0gbmjhu69uZyBraeG6v24gdGjhu6ljIHF1w70gYsOhdSBj4bunYSBtw7RuIFBow6JuIFTDrWNoIEThu68gTGnhu4d1IMSQ4buLbmggVMOtbmguIE5o4budIHPhu7EgZ2nhuqNuZyBk4bqheSB04bqtbiB0w6JtIHbDoCBuaGnhu4d0IGh1eeG6v3QgY+G7p2EgVGjhuqd5LCBlbSDEkcOjIGPDsyBjxqEgaOG7mWkgdGnhur9wIGPhuq1uIHbDoCBoaeG7g3UgcsO1IGjGoW4gduG7gSBuaOG7r25nIGtow6FpIG5p4buHbSBwaOG7qWMgdOG6oXAgdsOgIOG7qW5nIGThu6VuZyB0aOG7sWMgdGnhu4VuIGPhu6dhIG3DtG4gaOG7jWMuIMSQ4bq3YyBiaeG7h3QsIGVtIHLhuqV0IGJp4bq/dCDGoW4gc+G7sSBo4buXIHRy4bujIHbDoCBoxrDhu5tuZyBk4bqrbiBj4bunYSBUaOG6p3kgdHJvbmcgc3Xhu5F0IHF1w6EgdHLDrG5oIGVtIGzDoG0gdGnhu4N1IGx14bqtbiBQaMOibiBUw61jaCBE4buvIExp4buHdSDEkOG7i25oIFTDrW5oLiBOaOG7r25nIGfhu6NpIMO9IHbDoCBnw7NwIMO9IGPhu6dhIFRo4bqneSDEkcOjIGdpw7pwIGVtIGhvw6BuIHRoaeG7h24gdsOgIG7Dom5nIGNhbyBjaOG6pXQgbMaw4bujbmcgYsOgaSB0aeG7g3UgbHXhuq1uIGPhu6dhIG3DrG5oLiBFbSBj4bqjbSB0aOG6pXkgcuG6pXQgbWF5IG3huq9uIHbDoCB0csOibiB0cuG7jW5nIGtoaSBjw7MgVGjhuqd5IGzDoCBuZ8aw4budaSBk4bqrbiBk4bqvdCB2w6AgaOG7lyB0cuG7oyB0cm9uZyBxdcOhIHRyw6xuaCBo4buNYyB04bqtcC4gTeG7mXQgbOG6p24gbuG7r2EsIGVtIHhpbiBjaMOibiB0aMOgbmggY+G6o20gxqFuIFRo4bqneSB2w6wgdOG6pXQgY+G6oyBuaOG7r25nIGfDrCBUaOG6p3kgxJHDoyBsw6BtIGNobyBlbSB2w6AgY8OhYyBi4bqhbiBzaW5oIHZpw6puLiBFbSBrw61uaCBjaMO6YyBUaOG6p3kgbHXDtG4gbeG6oW5oIGto4buPZSwgaOG6oW5oIHBow7pjIHbDoCB0aMOgbmggY8O0bmcgdHJvbmcgc+G7sSBuZ2hp4buHcCBnaeG6o25nIGThuqF5LgoKIyBM4bucSSBDQU0gxJBPQU4gey51bm51bWJlcmVkfQoKVMO0aSB4aW4gY2FtIGvhur90IHLhurFuZyB0aeG7g3UgbHXhuq1uIOKAnFBow6JuIFTDrWNoIEThu68gTGnhu4d1IMSQ4buLbmggVMOtbmjigJ0gbsOgeSBsw6Aga+G6v3QgcXXhuqMgY+G7p2EgcXXDoSB0csOsbmggbmdoacOqbiBj4bupdSB2w6AgbMOgbSB2aeG7h2MgbmdoacOqbSB0w7pjIGPhu6dhIGLhuqNuIHRow6JuIHTDtGksIGTGsOG7m2kgc+G7sSBoxrDhu5tuZyBk4bqrbiB04bqtbiB0w6xuaCBj4bunYSBUaOG6p3kgVHLhuqduIE3huqFuaCBUxrDhu51uZy4gVHJvbmcgcXXDoSB0csOsbmggdGjhu7FjIGhp4buHbiwgdMO0aSDEkcOjIGjhur90IHPhu6ljIGPhuqluIHRy4buNbmcgdHJvbmcgdmnhu4djIHRodSB0aOG6rXAsIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IHbDoCB0dcOibiB0aOG7pyDEkeG6p3kgxJHhu6cgY8OhYyBxdXkgxJHhu4tuaCB24buBIHRyw61jaCBk4bqrbiB0w6BpIGxp4buHdSwgxJHhuqNtIGLhuqNvIHTDrW5oIHRydW5nIHRo4buxYyB2w6Aga2hvYSBo4buNYyBj4bunYSB0aeG7g3UgbHXhuq1uLiBUw7RpIHhpbiBraOG6s25nIMSR4buLbmggcuG6sW5nIG3hu41pIG7hu5lpIGR1bmcgdHJvbmcgdGnhu4N1IGx14bqtbiDEkeG7gXUgZG8gdMO0aSB04buxIG5naGnDqm4gY+G7qXUgdsOgIGtow7RuZyBzYW8gY2jDqXAgdOG7qyBi4bqldCBr4buzIG5ndeG7k24gdMOgaSBsaeG7h3UgaGF5IGPDtG5nIHRyw6xuaCBuw6BvIGtow6FjLiBO4bq/dSBjw7Mgc+G7rSBk4bulbmcgdMOgaSBsaeG7h3UgdGhhbSBraOG6o28sIHTDtGkgxJHDoyBuw6p1IHLDtSBuZ3Xhu5NuIGfhu5FjLiBUw7RpIGhp4buDdSBy4bqxbmcgdmnhu4djIGdpYW4gbOG6rW4sIHNhbyBjaMOpcCBoYXkgdmkgcGjhuqFtIGLhuqNuIHF1eeG7gW4gc+G6vSBi4buLIHjhu60gbMO9IG5naGnDqm0gdGhlbyBxdXkgxJHhu4tuaCBj4bunYSBuaMOgIHRyxrDhu51uZywgdsOgIHTDtGkgaG/DoG4gdG/DoG4gY2jhu4t1IHRyw6FjaCBuaGnhu4dtIHbhu4Egbmjhu69uZyBnw6wgxJHDoyB0csOsbmggYsOgeSB0cm9uZyB0aeG7g3UgbHXhuq1uIG7DoHkuIELhurFuZyB04bqldCBj4bqjIHPhu7EgbmdoacOqbSB0w7pjIHbDoCBsw7JuZyB0w7RuIHRy4buNbmcgxJHhu5FpIHbhu5tpIGjhu41jIHRodeG6rXQsIHTDtGkgY2FtIMSRb2FuIG5o4buvbmcgZ8OsIHRyw6xuaCBiw6B5IGzDoCBr4bq/dCBxdeG6oyBj4bunYSBz4buxIG7hu5cgbOG7sWMgY2jDom4gdGjDoG5oIGPhu6dhIGLhuqNuIHRow6JuIG3DrG5oLgoKLS0tCgoKCiMgLiBDSMavxqBORyAxOiBHSeG7mkkgVEhJ4buGVSDEkOG7gCBUw4BJIAoKCiMjIC4gTMO9IGRvIGNo4buNbiDEkeG7gSB0w6BpCgpUcm9uZyBuaOG7r25nIG7Eg20gZ+G6p24gxJHDonksIHRo4buLIHRyxrDhu51uZyB0w6BpIGNow61uaCAtIG5nw6JuIGjDoG5nIMSRYW5nIGNo4bupbmcga2nhur9uIHPhu7EgY+G6oW5oIHRyYW5oIG5nw6B5IGPDoG5nIGdheSBn4bqvdCBnaeG7r2EgY8OhYyB04buVIGNo4bupYyB0w61uIGThu6VuZyB0cm9uZyB2aeG7h2MgdGh1IGjDunQgdsOgIGR1eSB0csOsIG5ndeG7k24gdGnhu4FuIGfhu61pIHThu6sga2jDoWNoIGjDoG5nIGPDoSBuaMOibi4gVHJvbmcgxJHDsywgdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIGzDoCBt4buZdCBz4bqjbiBwaOG6qW0gcXVhbiB0cuG7jW5nIGLhu59pIG7DsyBraMO0bmcgY2jhu4kgZ2nDunAgbmfDom4gaMOgbmcg4buVbiDEkeG7i25oIG5ndeG7k24gduG7kW4gdHJ1bmcgZMOgaSBo4bqhbiBtw6AgY8OybiBwaOG6o24gw6FuaCBuaeG7gW0gdGluIGPhu6dhIGtow6FjaCBow6BuZyB2w6BvIGNow61uaCBzw6FjaCBsw6NpIHN14bqldCB2w6AgdXkgdMOtbiB04buVIGNo4bupYyB0w6BpIGNow61uaC4gVHV5IG5oacOqbiwgdGjhu7FjIHThur8gY2hvIHRo4bqleSB04bu3IGzhu4cga2jDoWNoIGjDoG5nIHRoYW0gZ2lhIHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbiB24bqrbiBjw7JuIG5oaeG7gXUgYmnhur9uIMSR4buZbmcsIHBo4bulIHRodeG7mWMgdsOgbyBuaGnhu4F1IHnhur91IHThu5Ega2jDoWMgbmhhdSBuaMawIG5ow6JuIGto4bqpdSBo4buNYywgdMOsbmggdHLhuqFuZyB0w6BpIGNow61uaCwgcGjGsMahbmcgdGjhu6ljIHRp4bq/cCBj4bqtbiBoYXkgdHLhuqNpIG5naGnhu4dtIGThu4tjaCB24bulLiDEkGnhu4F1IG7DoHkgxJHhurd0IHJhIGPDonUgaOG7j2kgY+G6pXAgdGhp4bq/dDogxJFp4buBdSBnw6wgdGjhu7FjIHPhu7Eg4bqjbmggaMaw4bufbmcgxJHhur9uIHF1eeG6v3QgxJHhu4tuaCDEkcSDbmcga8O9IHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbiBj4bunYSBraMOhY2ggaMOgbmc/CgpU4burIMSRw7MsIHTDoWMgZ2nhuqMgcXV54bq/dCDEkeG7i25oIHPhu60gZOG7pW5nIGLhu5kgZOG7ryBsaeG7h3UgQmFuayBNYXJrZXRpbmcgxJHhur9uIHThu6sgQuG7kyDEkMOgbyBOaGEsIG7GoWkgxJHDoyBnaGkgbOG6oWkgY2hpIHRp4bq/dCBjw6FjIHRow7RuZyB0aW4gduG7gSDEkeG6t2MgxJFp4buDbSBraMOhY2ggaMOgbmcgdsOgIGvhur90IHF14bqjIHNhdSBt4buXaSBjdeG7mWMgZ+G7jWkgdGnhur9wIHRo4buLIG5o4bqxbSBt4budaSBjaMOgbyBo4buNIGfhu61pIHRp4buBbi4gROG7ryBsaeG7h3Uga2jDtG5nIGNo4buJIGPDsyBxdXkgbcO0IGzhu5tuIChoxqFuIDQ1LjAwMCBxdWFuIHPDoXQpIG3DoCBjw7JuIHBo4bqjbiDDoW5oIGNow6JuIHRo4buxYyBjw6FjaCB0aOG7qWMga2jDoWNoIGjDoG5nIHBo4bqjbiBo4buTaSB24bubaSBjaGnhur9uIGThu4tjaCB0aeG6v3AgdGjhu4sgcXVhIMSRaeG7h24gdGhv4bqhaSwgbeG7mXQgaMOsbmggdGjhu6ljIHbhuqtuIMSRYW5nIMSRxrDhu6NjIG5oaeG7gXUgbmfDom4gaMOgbmcgdOG6oWkgVmnhu4d0IE5hbSDDoXAgZOG7pW5nLiBN4bq3YyBkw7kgxJHGsOG7o2MgdGh1IHRo4bqtcCB04bqhaSBjaMOidSDDgnUsIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgZ2nDoSB0cuG7iyB0aGFtIGto4bqjbyBjYW8gZG8gbmhp4buBdSB54bq/dSB04buRIGjDoG5oIHZpIHbDoCB0w6JtIGzDvSBuZ8aw4budaSB0acOqdSBkw7luZyBjw7MgdMOtbmggcGjhu5UgcXXDoXQuIERvIMSRw7MsIHZp4buHYyBraGFpIHRow6FjIGThu68gbGnhu4d1IG7DoHkga2jDtG5nIGNo4buJIGdpw7pwIHTDoWMgZ2nhuqMgdGnhur9wIGPhuq1uIGfDs2MgbmjDrG4gcXXhu5FjIHThur8gbcOgIGPDsm4gY3VuZyBj4bqlcCBu4buBbiB04bqjbmcgxJHhu4MgcsO6dCByYSBuaOG7r25nIGjDoG0gw70gY8OzIGdpw6EgdHLhu4sgdGjhu7FjIHRp4buFbiDEkeG7kWkgduG7m2kgdGjhu4sgdHLGsOG7nW5nIFZp4buHdCBOYW0uCgoKVuG7gSBt4bq3dCB0aOG7sWMgdGnhu4VuLCBuZ2hpw6puIGPhu6l1IGvhu7MgduG7jW5nIHPhur0gxJHGsGEgcmEgY8OhYyBow6BtIMO9IGdpw7pwIG5nw6JuIGjDoG5nIGhp4buDdSByw7UgaMahbiBuaMOzbSBraMOhY2ggaMOgbmcgbeG7pWMgdGnDqnUsIHThu6sgxJHDsyDEkWnhu4F1IGNo4buJbmggY2hp4bq/biBsxrDhu6NjIHRp4bq/cCB0aOG7iyBt4buZdCBjw6FjaCB0aW5oIGfhu41uLCBjw6EgbmjDom4gaMOzYSB2w6AgdGnhur90IGtp4buHbSBjaGkgcGjDrS4gxJDhu5NuZyB0aOG7nWksIHZp4buHYyB4w6FjIMSR4buLbmggxJHGsOG7o2MgY8OhYyB54bq/dSB04buRIGPDsyDhuqNuaCBoxrDhu59uZyB0w61jaCBj4buxYyDEkeG6v24ga2jhuqMgbsSDbmcgxJHEg25nIGvDvSB0aeG7gW4gZ+G7rWkgY8OzIGvhu7MgaOG6oW4gc+G6vSBo4buXIHRy4bujIGPDoWMgbmjDoCBxdeG6o24gdHLhu4sgdGhp4bq/dCBr4bq/IHPhuqNuIHBo4bqpbSBwaMO5IGjhu6NwIHbhu5tpIG5odSBj4bqndSB2w6AgaMOgbmggdmkgY+G7p2Ega2jDoWNoIGjDoG5nIHRyb25nIHThu6tuZyBwaMOibiBraMO6YyBj4bulIHRo4buDLiDEkMOieSBraMO0bmcgY2jhu4kgbMOgIMSRw7NuZyBnw7NwIGNobyBob+G6oXQgxJHhu5luZyBraW5oIGRvYW5oLCBtw6AgY8OybiBsw6AgY+G6p3UgbuG7kWkgZ2nhu69hIG5naGnDqm4gY+G7qXUgaOG7jWMgdGh14bqtdCB2w6AgdGjhu7FjIHRp4buFbiB0aOG7iyB0csaw4budbmcgdMOgaSBjaMOtbmggLSBuZ8OibiBow6BuZyBoaeG7h24gxJHhuqFpLiBDaMOtbmggdsOsIG5o4buvbmcgbMO9IGRvIGvhu4MgdHLDqm4sIHZp4buHYyB0aOG7sWMgaGnhu4duIMSR4buBIHTDoGkgKirigJxQaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIHF1eeG6v3QgxJHhu4tuaCDEkcSDbmcga8O9IHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbiBj4bunYSBraMOhY2ggaMOgbmfigJ0qKiBsw6AgdsO0IGPDuW5nIGPhuqduIHRoaeG6v3QgdsOgIGPDsyDDvSBuZ2jEqWEgY+G6oyB24buBIG3hurd0IGzDvSBsdeG6rW4gbOG6q24gdGjhu7FjIHRp4buFbi4KCgoKCiMjIC4gTeG7pWMgdGnDqnUgbmdoacOqbiBj4bupdQoKKipN4bulYyB0acOqdSB04buVbmcgcXXDoXQqKjogeMOhYyDEkeG7i25oIHbDoCBwaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIHF1eeG6v3QgxJHhu4tuaCDEkcSDbmcga8O9IHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbiBj4bunYSBraMOhY2ggaMOgbmcsIHRow7RuZyBxdWEgdmnhu4djIOG7qW5nIGThu6VuZyBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdHLDqm4gYuG7mSBk4buvIGxp4buHdSB0aOG7sWMgdOG6vyB04burIG3hu5l0IG5nw6JuIGjDoG5nIHThuqFpIELhu5MgxJDDoG8gTmhhLgoKKipN4bulYyB0acOqdSBjaGkgdGnhur90Kio6CgotIFjDoWMgxJHhu4tuaCBjw6FjIGJp4bq/biBz4buRIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPhu6dhIGtow6FjaCBow6BuZyAoY2jhurNuZyBo4bqhbiBuaMawIEtow6FjaCBow6BuZyBjw7MgbuG7oyB44bqldSBoYXkga2jDtG5nLCBLaMOhY2ggaMOgbmcgY8OzIHZheSBtdWEgbmjDoCBraMO0bmcsIEtow6FjaCBow6BuZyBjw7MgdmF5IHRpw6p1IGTDuW5nIGtow7RuZy4uLikKCi0gxJDDoW5oIGdpw6EgbeG7qWMgxJHhu5kg4bqjbmggaMaw4bufbmcgY+G7p2EgdOG7q25nIHnhur91IHThu5EgxJHhur9uIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyDEkeG7k25nIMO9IMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuLgoKLSDEkOG7gSB4deG6pXQgY8OhYyBraHV54bq/biBuZ2jhu4sgdGjhu7FjIHRp4buFbiBnacO6cCBuZ8OibiBow6BuZyB04buRaSDGsHUgaMOzYSBjaGnhur9uIGThu4tjaCB0aeG6v3AgdGjhu4sgdsOgIG7Dom5nIGNhbyBoaeG7h3UgcXXhuqMgdGh1IGjDunQga2jDoWNoIGjDoG5nIGfhu61pIHRp4bq/dCBraeG7h20uCgoKCiMjIC4gxJDhu5FpIHTGsOG7o25nIHbDoCBwaOG6oW0gdmkgbmdoacOqbiBj4bupdQoKxJDhu5FpIHTGsOG7o25nIG5naGnDqm4gY+G7qXUgY+G7p2EgxJHhu4EgdMOgaSBsw6AgY8OhYyB54bq/dSB04buRIGPDoSBuaMOibiB2w6AgdGjDtG5nIHRpbiBnaWFvIGThu4tjaCDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIGPhu6dhIGtow6FjaCBow6BuZyB0cm9uZyBt4buZdCBjaGnhur9uIGThu4tjaCB0aeG6v3AgdGjhu4sgbmfDom4gaMOgbmcuCgpQaOG6oW0gdmkgbmdoacOqbiBj4bupdSDEkcaw4bujYyB4w6FjIMSR4buLbmggbmjGsCBzYXU6CgotIFbhu4Ega2jDtG5nIGdpYW46IEThu68gbGnhu4d1IMSRxrDhu6NjIHRodSB0aOG6rXAgdOG7qyBt4buZdCBuZ8OibiBow6BuZyB04bqhaSBC4buTIMSQw6BvIE5oYSwgdHJvbmcga2h1w7RuIGto4buVIGNoaeG6v24gZOG7i2NoIHRp4bq/cCB0aOG7iyBxdWEgxJFp4buHbiB0aG/huqFpIG5o4bqxbSB0aHV54bq/dCBwaOG7pWMga2jDoWNoIGjDoG5nIMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuLgoKLSBW4buBIHRo4budaSBnaWFuOiBE4buvIGxp4buHdSBwaOG6o24gw6FuaCBow6BuaCB2aSB2w6AgxJHhurdjIMSRaeG7g20gY+G7p2Ega2jDoWNoIGjDoG5nIHRyb25nIGPDoWMgY2hp4bq/biBk4buLY2ggZGnhu4VuIHJhIHThu6sgbsSDbSAyMDA4IMSR4bq/biBuxINtIDIwMTAuCgoKCiMjIC4gUGjGsMahbmcgcGjDoXAgbmdoacOqbiBj4bupdQoKTmdoacOqbiBj4bupdSBz4butIGThu6VuZyBwaMawxqFuZyBwaMOhcCB0aOG7kW5nIGvDqiBtw7QgdOG6oyBuaOG6sW0gY3VuZyBj4bqlcCBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbhu4EgYuG7mSBk4buvIGxp4buHdSBraMOhY2ggaMOgbmcgdHJvbmcgY2hp4bq/biBk4buLY2ggdGnhur9wIHRo4buLLiBUaeG6v3AgxJHhur9uLCBjw6FjIGNo4buJIHPhu5EgbmjGsCBvZGRzIHJhdGlvLCByZWxhdGl2ZSByaXNrIHbDoCBi4bqjbmcgdOG6p24gc+G7kSDEkcaw4bujYyBwaMOibiB0w61jaCDEkeG7gyDEkcOhbmggZ2nDoSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgY+G6t3AgYmnhur9uIMSR4buZYyBs4bqtcCB2w6AgcXV54bq/dCDEkeG7i25oIMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPhu6dhIGtow6FjaCBow6BuZy4gTmdvw6BpIHJhLCBjw6FjIG3DtCBow6xuaCB4w6FjIHN14bqldCB0dXnhur9uIHTDrW5oLCBsb2dpdCB2w6AgcHJvYml0IGPFqW5nIMSRxrDhu6NjIHRyaeG7g24ga2hhaSBuaOG6sW0gxrDhu5tjIGzGsOG7o25nIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyDEkeG7k25nIMO9IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbi4KCgoKIyMgLiDEkMOzbmcgZ8OzcCBj4bunYSBuZ2hpw6puIGPhu6l1CgpOZ2hpw6puIGPhu6l1IG7DoHkgbWFuZyBs4bqhaSBuaOG7r25nIMSRw7NuZyBnw7NwIHRoaeG6v3QgdGjhu7FjIHRyw6puIGPhuqMgcGjGsMahbmcgZGnhu4duIGjhu41jIHRodeG6rXQgdsOgIHRo4buxYyB0aeG7hW4uIFbhu4EgbeG6t3QgaOG7jWMgdGh14bqtdCwgbmdoacOqbiBj4bupdSB24bqtbiBk4bulbmcgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIG5oxrAgTGluZWFyIFByb2JhYmlsaXR5IE1vZGVsIChMUE0pLCBMb2dpdCwgUHJvYml0IHbDoCDEkeG6t2MgYmnhu4d0IGzDoCBtw7QgaMOsbmggQ29tcGxlbWVudGFyeSBMb2ctTG9nIChDbG9nbG9nKSDEkeG7gyBwaMOibiB0w61jaCB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgxJHEg25nIGvDvSB0aeG7gW4gZ+G7rWkgY8OzIGvhu7MgaOG6oW4uIFZp4buHYyBr4bq/dCBo4bujcCBuaGnhu4F1IG3DtCBow6xuaCBnacO6cCDEkcOhbmggZ2nDoSDEkeG7mSBuaOG6oXkgdsOgIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgdOG7q25nIHBoxrDGoW5nIHBow6FwIHbhu5tpIGThu68gbGnhu4d1IHRo4buxYyB04bq/LCDEkeG7k25nIHRo4budaSBnw7NwIHBo4bqnbiBsw6BtIHBob25nIHBow7ogdGjDqm0gY8OhYyBuZ2hpw6puIGPhu6l1IMSR4buLbmggbMaw4bujbmcgdHJvbmcgbMSpbmggduG7sWMgaMOgbmggdmkgdMOgaSBjaMOtbmggY8OhIG5ow6JuIHThuqFpIFZp4buHdCBOYW0uCgpW4buBIG3hurd0IHRo4buxYyB0aeG7hW4sIGvhur90IHF14bqjIG5naGnDqm4gY+G7qXUgY3VuZyBj4bqlcCBjxINuIGPhu6kgxJHhu4tuaCBsxrDhu6NuZyBjaG8gY8OhYyBuZ8OibiBow6BuZyB0cm9uZyB2aeG7h2MgeMOhYyDEkeG7i25oIHbDoCB0aOG6pXUgaGnhu4N1IGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiwgbmjGsCDEkeG7mSB0deG7lWksIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiwgcGjGsMahbmcgdGjhu6ljIGxpw6puIGjhu4csIHRo4budaSDEkWnhu4NtIHTGsMahbmcgdMOhYyzigKYgVOG7qyDEkcOzLCBuZ8OibiBow6BuZyBjw7MgdGjhu4MgeMOieSBk4buxbmcgY8OhYyBjaGnhur9uIGzGsOG7o2MgdGnhur9wIHRo4buLIHBow7kgaOG7o3AsIHBow6JuIGtow7pjIGtow6FjaCBow6BuZyBoaeG7h3UgcXXhuqMgaMahbiwgdOG7kWkgxrB1IGjDs2EgY2hpIHBow60gdGnhur9wIGPhuq1uIHbDoCBuw6JuZyBjYW8gdOG7tyBs4buHIGNodXnhu4NuIMSR4buVaSB0cm9uZyBjw6FjIGNoaeG6v24gZOG7i2NoIGh1eSDEkeG7mW5nIHbhu5FuLgoKCiMjIC4gS+G6v3QgY+G6pXUgY+G7p2EgxJHhu4EgdMOgaQoKxJDhu4EgdMOgaSDEkcaw4bujYyBjaGlhIHRow6BuaCA1IGNoxrDGoW5nLCBj4bulIHRo4buDIG5oxrAgc2F1OgoKLSAqKkNoxrDGoW5nIDEuIEdp4bubaSB0aGnhu4d1OioqIFRyw6xuaCBiw6B5IGzDvSBkbyBjaOG7jW4gxJHhu4EgdMOgaSwgbeG7pWMgdGnDqnUgbmdoacOqbiBj4bupdSwgxJHhu5FpIHTGsOG7o25nIOKAkyBwaOG6oW0gdmkgbmdoacOqbiBj4bupdSB2w6AgY+G6pXUgdHLDumMgdOG7lW5nIHF1w6F0IGPhu6dhIMSR4buBIHTDoGkuCgotICoqQ2jGsMahbmcgMi4gQ8ahIHPhu58gbMO9IHRodXnhur90OioqIFRyw6xuaCBiw6B5IHThu5VuZyBxdWFuIHbhu4EgdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIHbDoCBo4buHIHRo4buRbmcgaMOzYSBjw6FjIGzDvSB0aHV54bq/dCBsacOqbiBxdWFuIMSR4bq/biDEkeG7gSB0w6BpLgoKLSAqKkNoxrDGoW5nIDMuIFBoxrDGoW5nIHBow6FwIG5naGnDqm4gY+G7qXU6KiogTcO0IHThuqMgdGhp4bq/dCBr4bq/IG5naGnDqm4gY+G7qXUsIG5ndeG7k24gZOG7ryBsaeG7h3UsIHBoxrDGoW5nIHBow6FwIHjhu60gbMO9IGThu68gbGnhu4d1IHbDoCBjw6FjIG3DtCBow6xuaCBwaMOibiB0w61jaCDEkcaw4bujYyBz4butIGThu6VuZy4KCi0gKipDaMawxqFuZyA0LiBL4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1OioqIFRyw6xuaCBiw6B5IGvhur90IHF14bqjIHRo4buRbmcga8OqIG3DtCB04bqjIHbDoCBr4bq/dCBxdeG6oyBwaMOibiB0w61jaCDEkeG7i25oIGzGsOG7o25nIGLhurFuZyBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgcGjDuSBo4bujcC4KCi0gKipDaMawxqFuZyA1LiBL4bq/dCBsdeG6rW4gdsOgIEtodXnhur9uIG5naOG7izoqKiBUw7NtIHThuq90IGPDoWMga+G6v3QgcXXhuqMgY2jDrW5oLCBuw6p1IGLhuq10IMO9IG5naMSpYSB0aOG7sWMgdGnhu4VuLCB0csOsbmggYsOgeSBuaOG7r25nIGjhuqFuIGNo4bq/IGPhu6dhIG5naGnDqm4gY+G7qXUgdsOgIMSR4buBIHh14bqldCBjw6FjIGjGsOG7m25nIHBow6F0IHRyaeG7g24gdHJvbmcgdMawxqFuZyBsYWkuCgpfX18KCgojIC4gQ0jGr8agTkcgMjogQ8agIFPhu54gTMOdIFRIVVnhur5UCgojIyAuIEPGoSBz4bufIGzDvSBsdeG6rW4gduG7gSB0aeG7gW4gZ+G7rWkgY8OzIGvhu7MgaOG6oW4gCgotICoqS2jDoWkgbmnhu4dtIHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbioqCgpUaeG7gW4gZ+G7rWkgY8OzIGvhu7MgaOG6oW4gbMOgIG3hu5l0IGjDrG5oIHRo4bupYyBodXkgxJHhu5luZyB24buRbiBxdWFuIHRy4buNbmcgY+G7p2EgbmfDom4gaMOgbmcgdGjGsMahbmcgbeG6oWksIHRyb25nIMSRw7Mga2jDoWNoIGjDoG5nIGfhu61pIG3hu5l0IGtob+G6o24gdGnhu4FuIHRyb25nIG3hu5l0IHRo4budaSBnaWFuIHjDoWMgxJHhu4tuaCB2w6AgxJHGsOG7o2Mgbmjhuq1uIGzDo2kgc3XhuqV0IGPhu5EgxJHhu4tuaCB0aGVvIHRo4buPYSB0aHXhuq1uLiBTbyB24bubaSB0aeG7gW4gZ+G7rWkga2jDtG5nIGvhu7MgaOG6oW4sIHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbiB0aMaw4budbmcgY8OzIGzDo2kgc3XhuqV0IGNhbyBoxqFuIGRvIGtow6FjaCBow6BuZyBjYW0ga+G6v3Qga2jDtG5nIHLDunQgdGnhu4FuIHRyxrDhu5tjIGjhuqFuIChOZ8OibiBow6BuZyBOaMOgIG7GsOG7m2MgVmnhu4d0IE5hbSwgMjAyMykuCgpUaGVvIE1pc2hraW4gKDIwMTkpLCB0aeG7gW4gZ+G7rWkgdGnhur90IGtp4buHbSBjw7Mga+G7syBo4bqhbiDEkcOzbmcgdmFpIHRyw7IgcXVhbiB0cuG7jW5nIHRyb25nIHZp4buHYyBjaHV54buDbiBuZ3Xhu5NuIHbhu5FuIHThu6sga2h1IHbhu7FjIGTDom4gY8awIHNhbmcgbMSpbmggduG7sWMgxJHhuqd1IHTGsCB2w6Agc+G6o24geHXhuqV0LCBnw7NwIHBo4bqnbiDhu5VuIMSR4buLbmggaOG7hyB0aOG7kW5nIHTDoGkgY2jDrW5oLgoKLSAqKkzDvSB0aHV54bq/dCBow6BuaCB2aSBraMOhY2ggaMOgbmcgdHJvbmcgdMOgaSBjaMOtbmggY8OhIG5ow6JuKioKClF1eeG6v3QgxJHhu4tuaCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gbMOgIG3hu5l0IGThuqFuZyBow6BuaCB2aSB0w6BpIGNow61uaCBjw6EgbmjDom4sIGNo4buLdSDhuqNuaCBoxrDhu59uZyBi4bufaSBuaGnhu4F1IHnhur91IHThu5EsIGJhbyBn4buTbSBs4bujaSDDrWNoIGvhu7MgduG7jW5nLCBt4bupYyDEkeG7mSBy4bunaSBybyB2w6AgdMOhYyDEkeG7mW5nIHTDom0gbMO9LiBUcm9uZyBsxKluaCB24buxYyB0w6BpIGNow61uaCBow6BuaCB2aSwgY8OhYyBo4buNYyBnaeG6oyBjaG8gcuG6sW5nIGNvbiBuZ8aw4budaSBraMO0bmcgbHXDtG4gaMOgbmggxJHhu5luZyB0aGVvIGzDvSB0csOtIHR1eeG7h3QgxJHhu5FpLCBtw6AgY8OybiBjaOG7i3Ug4bqjbmggaMaw4bufbmcgYuG7n2kgY+G6o20geMO6YyB2w6AgdGhpw6puIGtp4bq/biBuaOG6rW4gdGjhu6ljIChUaGFsZXIsIDE5OTkpLgoKVGhlbyBsw70gdGh1eeG6v3QgbOG7sWEgY2jhu41uIGjhu6NwIGzDvSBScmF0aW9uYWwgQ2hvaWNlIFRoZW9yeSksIGPDoSBuaMOibiBz4bq9IGfhu61pIHRp4buBbiBu4bq/dSBs4bujaSDDrWNoIGvhu7MgduG7jW5nIChsw6NpIHN14bqldCwgYW4gdG/DoG4gduG7kW4pIHbGsOG7o3QgdHLhu5lpIGjGoW4gY8OhYyBow6xuaCB0aOG7qWMgc+G7rSBk4bulbmcgdGnhu4FuIGtow6FjLiBUcm9uZyBraGkgxJHDsywgbMO9IHRodXnhur90IHRyaeG7g24gduG7jW5nIChwcm9zcGVjdCB0aGVvcnkpIGPhu6dhIEthaG5lbWFuIHbDoCBUdmVyc2t5ICgxOTc5KSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyB0aMaw4budbmcgY8OzIHh1IGjGsOG7m25nIG7DqSB0csOhbmggcuG7p2kgcm8gdHJvbmcgbMSpbmggduG7sWMgdMOgaSBjaMOtbmggY8OhIG5ow6JuIHbDoCBjw7MgdGjhu4MgY2jhu41uIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBuaMawIG3hu5l0IGPDoWNoIMSR4bqjbSBi4bqjbyBhbiB0b8OgbiB0w6BpIHPhuqNuLgoKTmdvw6BpIHJhLCBtw7QgaMOsbmggaMOgbmggdmkgdMOgaSBjaMOtbmggY8OhIG5ow6JuIGPhu6dhIFhpYW8gdsOgIFBvcnRvICgyMDE3KSBjxaluZyBuaOG6pW4gbeG6oW5oIHLhurFuZyBow6BuaCB2aSB0w6BpIGNow61uaCBi4buLIGNoaSBwaOG7kWkgYuG7n2kgY8OhYyB54bq/dSB04buROiBraeG6v24gdGjhu6ljIHTDoGkgY2jDrW5oLCB0w6xuaCB0cuG6oW5nIHTDoGkgY2jDrW5oLCBuaeG7gW0gdGluIHbDoCBraW5oIG5naGnhu4dtIHTDoGkgY2jDrW5oIHF1w6Ega2jhu6kuCgojIyAuIEPDoWMgeeG6v3UgdOG7kSB0w6BpIGNow61uaCDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbgoKCi0gKipCaeG6v24g4oCcZGVmYXVsdOKAnSAobuG7oyB44bqldSkqKgoKQmnhur9uIG7DoHkgcGjhuqNuIMOhbmgga2jhuqMgbsSDbmcgdMOtbiBk4bulbmcgY+G7p2Ega2jDoWNoIGjDoG5nLiBN4buZdCBuZ8aw4budaSBjw7MgbOG7i2NoIHPhu60gbuG7oyB44bqldSB0aMaw4budbmcgY8OzIHTDrG5oIGjDrG5oIHTDoGkgY2jDrW5oIGtow7RuZyDhu5VuIMSR4buLbmgsIGto4bqjIG7Eg25nIHRoYW5oIGtob+G6o24gdGjhuqVwIHbDoCDDrXQgZMawIHRp4buBbiDEkeG7gyBn4butaSB0aeG6v3Qga2nhu4dtLiBOZ2hpw6puIGPhu6l1IGPhu6dhIEdvZHdpbiAoMTk5NCkgY2hvIHRo4bqleSBuaOG7r25nIGPDoSBuaMOibiBjw7MgxJFp4buDbSB0w61uIGThu6VuZyB0aOG6pXAgdGjGsOG7nW5nIGtow7RuZyB0w61jaCBj4buxYyB0cm9uZyBjw6FjIGjDoG5oIHZpIHRp4bq/dCBraeG7h20sIGJhbyBn4buTbSBj4bqjIHRp4bq/dCBraeG7h20gY8OzIGvhu7MgaOG6oW4uCgpOZ2/DoGkgcmEsIG5naGnDqm4gY+G7qXUgY+G7p2EgTHVzYXJkaSB2w6AgTWl0Y2hlbGwgKDIwMTQpIGPFqW5nIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgaGnhu4N1IGJp4bq/dCB0w6BpIGNow61uaCB2w6AgbOG7i2NoIHPhu60gbuG7oyDhuqNuaCBoxrDhu59uZyByw7UgcuG7h3QgxJHhur9uIGjDoG5oIHZpIHRp4bq/dCBraeG7h20gdHJvbmcgZMOibiBjxrAsIMSR4bq3YyBiaeG7h3Qg4bufIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwLgoKLSAqKkJp4bq/biDigJxob3VzaW5n4oCdICh2YXkgbXVhIG5ow6ApKioKCktob+G6o24gdmF5IG11YSBuaMOgIMSR4bqhaSBkaeG7h24gY2hvIG5naMSpYSB24bulIHTDoGkgY2jDrW5oIGTDoGkgaOG6oW4sIHRoxrDhu51uZyBsw6BtIGdp4bqjbSB0aHUgbmjhuq1wIGto4bqjIGThu6VuZyBow6BuZyB0aMOhbmcgY+G7p2Ega2jDoWNoIGjDoG5nLiBUaGVvIG5naGnDqm4gY+G7qXUgY+G7p2EgTGVlIHbDoCBIYW5uYSAoMjAxNSksIG5o4buvbmcgbmfGsOG7nWkgY8OzIHZheSB0aOG6vyBjaOG6pXAgdGjGsOG7nW5nIGdp4bqjbSBt4bupYyB0aeG6v3Qga2nhu4dtIG5n4bqvbiBo4bqhbiwgYmFvIGfhu5NtIGPhuqMgdGnhur90IGtp4buHbSBjw7Mga+G7syBo4bqhbiwgZG8gcGjhuqduIGzhu5tuIGTDsm5nIHRp4buBbiBi4buLIHBow6JuIGLhu5UgdsOgbyB2aeG7h2MgdHLhuqMgbuG7oyBn4buRYyB2w6AgbMOjaSBow6BuZyB0aMOhbmcuCgpUdXkgbmhpw6puLCBt4buZdCBz4buRIGtow6FjaCBow6BuZyBjw7MgdGh1IG5o4bqtcCBjYW8gY8OzIHRo4buDIHbhuqtuIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBzb25nIHNvbmcgbmjGsCBt4buZdCBjaGnhur9uIGzGsOG7o2MgcGjDom4gYuG7lSB0w6BpIHPhuqNuIOKAkyBuaOG6sW0gxJHhu5FpIHBow7MgduG7m2kgcuG7p2kgcm8gbMOjaSBzdeG6pXQgdsOgIMSR4bqjbSBi4bqjbyB0w61uaCB0aGFuaCBraG/huqNuIGThu7EgcGjDsm5nIChNYW5raXcsIDIwMTYpLgoKLSAqKkJp4bq/biDigJxsb2Fu4oCdICh2YXkgdGnDqnUgZMO5bmcpKioKCktob+G6o24gdmF5IHRpw6p1IGTDuW5nIHRoxrDhu51uZyBsacOqbiBxdWFuIMSR4bq/biBjw6FjIGNoaSB0acOqdSBjw6EgbmjDom4gbmjGsCBtdWEgc+G6r20sIGR1IGzhu4tjaCwgaG/hurdjIGNoaSB0cuG6oyBjw6FjIGThu4tjaCB24bulLCB0aOG7gyBoaeG7h24ga2h1eW5oIGjGsOG7m25nIHRpw6p1IGTDuW5nIGhp4buHbiB04bqhaSBjYW8gaMahbiB0aeG6v3Qga2nhu4dtLiBUaGVvIGto4bqjbyBzw6F0IGPhu6dhIEZJTlJBIEludmVzdG9yIEVkdWNhdGlvbiBGb3VuZGF0aW9uICgyMDE5KSwgbmjhu69uZyBjw6EgbmjDom4gxJFhbmcgY8OzIGtob+G6o24gdmF5IHRpw6p1IGTDuW5nIGPDsyB4dSBoxrDhu5tuZyDDrXQgdGnhur90IGtp4buHbSBoxqFuIHbDoCBt4bupYyDEkeG7mSDGsHUgdGnDqm4gY2hvIHZp4buHYyBn4butaSB0aeG7gW4gdGnhur90IGtp4buHbSBjxaluZyB0aOG6pXAgaMahbi4KCkjGoW4gbuG7r2EsIEdhdGhlcmdvb2QgdsOgIFdlYmVyICgyMDE0KSBjaG8gcuG6sW5nIHTDrG5oIHRy4bqhbmcgbuG7oyB0acOqdSBkw7luZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyB0acOqdSBj4buxYyB24bubaSBow6BuaCB2aSBs4bqtcCBr4bq/IGhv4bqhY2ggdMOgaSBjaMOtbmggdsOgIHTDrWNoIGzFqXkgdMOgaSBz4bqjbiBkw6BpIGjhuqFuLCB04burIMSRw7MgbMOgbSBnaeG6o20ga2jhuqMgbsSDbmcgZ+G7rWkgdGnhur90IGtp4buHbSBjw7Mga+G7syBo4bqhbi4KCiMjIC4gQ8OhYyBuZ2hpw6puIGPhu6l1IGxpw6puIHF1YW4KCgpUaGVvIG5naGnDqm4gY+G7qXUgY+G7p2EgUm9nZyAoMjAwMCkgxJHGsOG7o2MgY8O0bmcgYuG7kSB0csOqbiBJbnRlcuKAkUFtZXJpY2FuIERldmVsb3BtZW50IEJhbmsgUHVibGljYXRpb25zLCB2aeG7h2MgY8OhIG5ow6JuIHPhu60gZOG7pW5nIGPDoWMga2hv4bqjbiB2YXkgdGnDqnUgZMO5bmcgY8OzIHRo4buDIGzDoG0gc3V5IGdp4bqjbSBraOG6oyBuxINuZyB0w61jaCBsxal5IHTDoGkgc+G6o24gdGjDtG5nIHF1YSBow6xuaCB0aOG7qWMgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuLCBkbyBwaOG6p24gbOG7m24gZMOybmcgdGnhu4FuIMSRxrDhu6NjIMawdSB0acOqbiBwaMOibiBi4buVIGNobyB2aeG7h2MgdHLhuqMgbuG7oyB0aGF5IHbDrCB0aeG6v3Qga2nhu4dtIGTDoGkgaOG6oW4uCgpUxrDGoW5nIHThu7EsIEd1bmVzIHbDoCBUdW5jICgyMDE4KSB0cm9uZyBjw7RuZyB0csOsbmggY8O0bmcgYuG7kSB0csOqbiBKb3VybmFsIG9mIENvbnN1bWVyIEFmZmFpcnMgY8WpbmcgY2jhu4kgcmEgcuG6sW5nIGPDoWMga2hv4bqjbiB2YXkgbXVhIG5ow6Ag4oCTIG3hurdjIGTDuSBtYW5nIHTDrW5oIMSR4bqndSB0xrAg4oCTIHbhuqtuIGPDsyB0aOG7gyBsw6BtIGdp4bqjbSBuxINuZyBs4buxYyBn4butaSB0aeG6v3Qga2nhu4dtIGPDsyBr4buzIGjhuqFuLCBkbyBraMOhY2ggaMOgbmcgcGjhuqNpIMSR4buRaSBt4bq3dCB24bubaSDDoXAgbOG7sWMgdMOgaSBjaMOtbmggdGjGsOG7nW5nIHh1ecOqbiB0cm9uZyBxdcOhIHRyw6xuaCB0cuG6oyBnw7NwLgoKTeG7m2kgxJHDonksIG5naGnDqm4gY+G7qXUgY+G7p2EgRGUgR2lvcmdpIHbDoCBj4buZbmcgc+G7sSAoMjAyMykgxJHGsOG7o2MgxJHEg25nIHThuqNpIHRyw6puIGFyWGl2IGNobyB0aOG6pXkgdMOsbmggdHLhuqFuZyBu4bujIHjhuqV1IGzDoCBt4buZdCB54bq/dSB04buRIMSRw6FuZyBsxrB1IMO9LCB2w6wgbsOzIGtow7RuZyBjaOG7iSBsw6BtIHN1eSB54bq/dSBkw7JuZyB0aeG7gW4gbmjDoG4gcuG7l2kgbcOgIGPDsm4gaOG6oW4gY2jhur8gxJHDoW5nIGvhu4Mga2jhuqMgbsSDbmcgZ+G7rWkgdGnhu4FuIHRp4bq/dCBraeG7h20gY8OzIGvhu7MgaOG6oW4gY+G7p2Ega2jDoWNoIGjDoG5nLCB04burIMSRw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIHTDoGkgY2jDrW5oIGPDoSBuaMOibiB0cm9uZyBkw6BpIGjhuqFuLgoKCl9fXwoKCiMgLiBDSMavxqBORyAzLiBQSMavxqBORyBQSMOBUCBOR0hJw4pOIEPhu6hVCgpUcm9uZyBuZ2hpw6puIGPhu6l1IG7DoHksIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBZIC0gUXV54bq/dCDEkeG7i25oIMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIGPhu6dhIGtow6FjaCBow6BuZyBsw6AgbeG7mXQgYmnhur9uIG5o4buLIHBow6JuICh5ZXMvbm8gdMawxqFuZyDhu6luZyAxLzApLiBW4bubaSDEkeG6t2MgxJFp4buDbSBk4bqhbmcgbmjhu4sgcGjDom4gbmjGsCB24bqteSwgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIGzDoCBs4buxYSBjaOG7jW4gcGjDuSBo4bujcCDEkeG7gyBwaMOibiB0w61jaCB2w6AgZOG7sSBiw6FvIGjDoG5oIHZpIGtow6FjaCBow6BuZy4KCiMjIC4gVGhp4bq/dCBr4bq/IG3DtCBow6xuaCBuZ2hpw6puIGPhu6l1CgoKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+CiAgPGltZyBzcmM9Ii9Vc2Vycy9sZW5nb2N0dW9uZ3Z5L0Rvd25sb2Fkcy9Db2xvcmZ1bCBJbGx1c3RyYXRpdmUgTWluZCBNYXAgQnJhaW5zdG9ybS5wbmciIGFsdD0iSMOsbmggMy4xLiBNw7QgaMOsbmggbmdoacOqbiBj4bupdSIgd2lkdGg9IjYwMCIvPgogIDxwPjxzdHJvbmc+SMOsbmggMy4xLiBNw7QgaMOsbmggbmdoacOqbiBj4bupdTwvc3Ryb25nPjwvcD4KPC9kaXY+CgoKSMOsbmggMy4xIG1pbmggaOG7jWEgbcO0IGjDrG5oIG5naGnDqm4gY+G7qXUgxJHGsOG7o2MgeMOieSBk4buxbmcgbmjhurFtIHBow6JuIHTDrWNoIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIGPhu6dhIGtow6FjaCBow6BuZyAoYmnhur9uIHBo4bulIHRodeG7mWMgWSkuIEPhu6UgdGjhu4MsIG3DtCBow6xuaCB4ZW0geMOpdCB0w6FjIMSR4buZbmcgY+G7p2EgYmEgYmnhur9uIMSR4buZYyBs4bqtcCBn4buTbTogdMOsbmggdHLhuqFuZyB2YXkgbXVhIG5ow6AgKGhvdXNpbmcpLCB0w6xuaCB0cuG6oW5nIHZheSB0acOqdSBkw7luZyBjw6EgbmjDom4gKGxvYW4pIHbDoCB0w6xuaCB0cuG6oW5nIG7hu6MgeOG6pXUgKGRlZmF1bHQpLiBN4buXaSB54bq/dSB04buRIG7DoHkgxJHGsOG7o2Mga+G7syB24buNbmcgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyBob+G6t2MgeHUgaMaw4bubbmcgZ+G7rWkgdGnhur90IGtp4buHbSBj4bunYSBraMOhY2ggaMOgbmcuIEPDoWMgYmnhur9uIMSR4buBdSBtYW5nIHTDrW5oIG5o4buLIHBow6JuIChjw7Mva2jDtG5nKSwgcGjDuSBo4bujcCDEkeG7gyDEkcawYSB2w6BvIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgbmjhu4sgcGjDom4gbmjhurFtIMaw4bubYyBsxrDhu6NuZyB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgbOG7sWEgY2jhu41uIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbi4KCiMjIC4gTcO0IGjDrG5oIGjhu5NpIHF1eSBjaG8gZOG7ryBsaeG7h3Ugbmjhu4sgcGjDom4KCiMjIyAuIE3DtCBow6xuaCBI4buTaSBxdXkgTG9naXN0aWMgKExvZ2l0IE1vZGVsKQoKTcO0IGjDrG5oIExvZ2l0IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMaw4bubYyBsxrDhu6NuZyB4w6FjIHN14bqldCB44bqjeSByYSBj4bunYSBt4buZdCBz4buxIGtp4buHbiBuaOG7iyBwaMOibiAoY8OzL2tow7RuZywgxJHDum5nL3NhaS4uLikuIEjDoG0gcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IGPDsyBk4bqhbmcgaMOgbSBsb2dpc3RpYywgY2hvIHBow6lwIHjDoWMgc3XhuqV0IG7hurFtIHRyb25nIGtob+G6o25nICgwLDEpLgoKUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaDoKCiQkClAoWSA9IDEgXG1pZCBYKSA9IFxmcmFjezF9ezEgKyBlXnstKFxiZXRhXzAgKyBcYmV0YV8xIFhfMSArIFxjZG90cyArIFxiZXRhX2sgWF9rKX19CiQkCgpUcm9uZyDEkcOzOgoKJFAoWSA9IDEgXG1pZCBYKSQgbMOgIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHPhu7Ega2nhu4duICh2w60gZOG7pToga2jDoWNoIGjDoG5nIGfhu61pIHRp4bq/dCBraeG7h20pLAoKJFxiZXRhXzAkIGzDoCBo4buHIHPhu5EgY2jhurduLCAkXGJldGFfMSwgXGRvdHMsIFxiZXRhX2skIGzDoCBo4buHIHPhu5EgaOG7k2kgcXV5IHTGsMahbmcg4bupbmcgduG7m2kgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wICRYXzEsIFxkb3RzLCBYX2skLgoKSMOgbSBsb2dpdCAobG9nLW9kZHMpIMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBi4bufaToKCgokJApcdGV4dHtsb2dpdH0oUCkgPSBcbG9nXGxlZnQoXGZyYWN7UH17MSAtIFB9XHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFhfMSArIFxjZG90cyArIFxiZXRhX2sgWF9rCiQkCgoKIyMjIC4gTcO0IGjDrG5oIGjhu5NpIHF1eSBQcm9iaXQgKFByb2JpdCBNb2RlbCkKCgpNw7QgaMOsbmggUHJvYml0IGPFqW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGThu7EgxJFvw6FuIHjDoWMgc3XhuqV0IGPhu6dhIG3hu5l0IGJp4bq/biBwaOG7pSB0aHXhu5ljIG5o4buLIHBow6JuLCB0dXkgbmhpw6puIGdp4bqjIMSR4buLbmggcGjDom4gcGjhu5FpIHNhaSBz4buRIGzDoCBwaMOibiBwaOG7kWkgY2h14bqpbiB0w61jaCBsxal5IChDREYgY+G7p2EgJE4oMCwxKSQpLgoKUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaDoKCiQkClAoWSA9IDEgXG1pZCBYKSA9IFxQaGkoXGJldGFfMCArIFxiZXRhXzEgWF8xICsgXGNkb3RzICsgXGJldGFfayBYX2spCiQkCgpUcm9uZyDEkcOzOgoKJFxQaGkoLikkIGzDoCBow6BtIHBow6JuIHBo4buRaSB0w61jaCBsxal5IGNodeG6qW4gKENERiksCgpDw7JuIGzhuqFpIGPDoWMga8O9IGhp4buHdSB0xrDGoW5nIHThu7EgbmjGsCBtw7QgaMOsbmggTG9naXQuCgpNw7QgaMOsbmggUHJvYml0IHRow61jaCBo4bujcCB0cm9uZyBjw6FjIHRyxrDhu51uZyBo4bujcCBnaeG6oyDEkeG7i25oIHLhurFuZyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGJp4bq/biBnaeG6o2kgdGjDrWNoIHbDoCB4w6FjIHN14bqldCB44bqjeSByYSBsw6AgZOG6oW5nIGNo4buvIFMgxJHhu5FpIHjhu6luZyB2w6Ag4oCcbeG7gW3igJ0gaMahbiBMb2dpdC4KCgoKIyMjIC4gTcO0IGjDrG5oIENvbXBsZW1lbnRhcnkgbG9nLWxvZyAoQ2xvZ2xvZyBNb2RlbCkKCgpNw7QgaMOsbmggQ2xvZ2xvZyDEkcaw4bujYyBz4butIGThu6VuZyBraGkgeMOhYyBzdeG6pXQgeOG6o3kgcmEgY+G7p2Egc+G7sSBraeG7h24gbMOgIHLhuqV0IHRo4bqlcCBob+G6t2MgcuG6pXQgY2FvIChi4bqldCDEkeG7kWkgeOG7qW5nKS4gUGjGsMahbmcgdHLDrG5oIHjDoWMgc3XhuqV0OgoKJCQKUChZID0gMSBcbWlkIFgpID0gMSAtIFxleHBcbGVmdFstXGV4cFxsZWZ0KFxiZXRhXzAgKyBcYmV0YV8xIFhfMSArIFxjZG90cyArIFxiZXRhX2sgWF9rXHJpZ2h0KVxyaWdodF0KJCQKClTGsMahbmcg4bupbmcgduG7m2kgxJHDsyBsw6A6CgokJApcbG9nXGxlZnQoIC1cbG9nKDEgLSBQKFkgPSAxKSkgXHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFhfMSArIFxjZG90cyArIFxiZXRhX2sgWF9rCiQkCgoKTcO0IGjDrG5oIENsb2dsb2cgY8OzIMSRdcO0aSBwaMOibiBwaOG7kWkgZMOgaSBoxqFuIExvZ2l0L1Byb2JpdCBuw6puIHBow7kgaOG7o3AgdHJvbmcgdHLGsOG7nW5nIGjhu6NwIHBow6JuIHBo4buRaSB4w6FjIHN14bqldCBraMO0bmcgxJHhu5FpIHjhu6luZy4KCgojIyAuIEPDoWMgY2jhu4kgdGnDqnUgxJHDoW5oIGdpw6EgbcO0IGjDrG5oCgojIyMgLiBDaOG7iSBz4buRIEFJQwoKQ2jhu4kgc+G7kSBBSUMgKEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24pIMSRxrDhu6NjIGTDuW5nIMSR4buDIMSRw6FuaCBnacOhIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oLCDEkeG7k25nIHRo4budaSBjw7MgdMOtbmggxJHhur9uIHPhu5EgbMaw4bujbmcgdGhhbSBz4buRIMSRxrDhu6NjIHPhu60gZOG7pW5nLiBDw7RuZyB0aOG7qWMgdMOtbmggQUlDIGzDoDoKCiQkCkFJQyA9IC0yIFxjZG90IFxsb2coTCkgKyAyawokJAoKClRyb25nIMSRw7M6CgotICRMJDogbMOgIGjDoG0gaOG7o3AgbMO9IChsaWtlbGlob29kKSwKCi0gJGskOiBsw6Agc+G7kSBsxrDhu6NuZyB0aGFtIHPhu5EgdHJvbmcgbcO0IGjDrG5oLgoKCgoKIyMjIC4gSOG7hyBz4buRIEJyaWVyIFNjb3JlCgpDaOG7iSBz4buRIEJyaWVyIFNjb3JlIMSRbyDEkeG7mSBjaMOtbmggeMOhYyBj4bunYSBk4buxIMSRb8OhbiB4w6FjIHN14bqldCB0cm9uZyBjw6FjIG3DtCBow6xuaCBuaOG7iyBwaMOibi4gQ8O0bmcgdGjhu6ljIHTDrW5oIGzDoDoKCiQkClx0ZXh0e0JyaWVyIFNjb3JlfSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259IFxsZWZ0KCBcaGF0e3B9X2kgLSB5X2kgXHJpZ2h0KV4yCiQkCgpUcm9uZyDEkcOzOgoKLSAkbiQ6IHPhu5EgcXVhbiBzw6F0LAoKLSAkXGhhdHtwfV9pJDogeMOhYyBzdeG6pXQgZOG7sSDEkW/DoW4gJFAoWV9pID0gMSBcbWlkIFhfaSkkLAoKLSAkeV9pJDogZ2nDoSB0cuG7iyB0aOG7sWMgdOG6vyAoMCBob+G6t2MgMSkuCgoKIyMjIC4gTG9nLWxpa2VsaWhvb2QKCkxvZy1saWtlbGlob29kIGzDoCBow6BtIGxvZyBj4bunYSBow6BtIGjhu6NwIGzDvSwgcGjhuqNuIMOhbmggbeG7qWMgxJHhu5kgcGjDuSBo4bujcCBnaeG7r2EgbcO0IGjDrG5oIHbDoCBk4buvIGxp4buHdSBxdWFuIHPDoXQuIFbhu5tpIG3DtCBow6xuaCBuaOG7iyBwaMOibiwgxJHGsOG7o2MgdMOtbmggbmjGsCBzYXU6CgokJApcZWxsKFxiZXRhKSA9IFxzdW1fe2k9MX1ee259IFxsZWZ0WyB5X2kgXGxvZyhccGlfaSkgKyAoMSAtIHlfaSkgXGxvZygxIC0gXHBpX2kpIFxyaWdodF0KJCQKClRyb25nIMSRw7M6CgotICRcZWxsKFxiZXRhKSQgbMOgIGjDoG0gbG9nLWxpa2VsaWhvb2QgdGhlbyBo4buHIHPhu5EgJFxiZXRhJCwKCi0gJHlfaSQgbMOgIGJp4bq/biBwaOG6o24gaOG7k2kgKDAgaG/hurdjIDEpLAoKLSAkXHBpX2kkIGzDoCB4w6FjIHN14bqldCBk4buxIGLDoW8gdOG6oWkgcXVhbiBzw6F0ICRpJCAodsOtIGThu6U6ICRccGlfaSA9IFxoYXR7UH0oeV9pID0gMSBcbWlkIHhfaSkkKS4KCkxvZy1saWtlbGlob29kIGPDoG5nIGzhu5tuICjDrXQgw6JtKSB0aMOsIG3DtCBow6xuaCBjw6BuZyBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1LgoKX19fCgojIC4gQ0jGr8agTkcgNDogS+G6vlQgUVXhuqIgTkdIScOKTiBD4buoVQoKIyMgLiBU4buVbmcgcXVhbiB24buBIGLhu5kgZOG7ryBsaeG7h3UKCiMjIyAuIEdp4bubaSB0aGnhu4d1IHbhu4EgYuG7mSBk4buvIGxp4buHdQoKROG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgYsOgaSBjw7MgdMOqbiBsw6AgIFtCYW5rIE1hcmtldGluZyBEYXRhc2V0XShodHRwczovL2FyY2hpdmUuaWNzLnVjaS5lZHUvZGF0YXNldC8yMjIvYmFuayttYXJrZXRpbmcpLiBE4buvIGxp4buHdSDEkcaw4bujYyB0w6FjIGdp4bqjIHRodSB0aOG6rXAgdOG7qyB0cmFuZyB3ZWIgW1VDSSBNYWNoaW5lIExlYXJuaW5nIFJlcG9zaXRvcnldKGh0dHBzOi8vYXJjaGl2ZS5pY3MudWNpLmVkdS8pIC4gQuG7mSBk4buvIGxp4buHdSBuw6B5IGdoaSBs4bqhaSB0aMO0bmcgdGluIHThu6sgY8OhYyBjaGnhur9uIGThu4tjaCB0aeG6v3AgdGjhu4sgdHLhu7FjIHRp4bq/cCBxdWEgxJFp4buHbiB0aG/huqFpIGPhu6dhIG3hu5l0IG5nw6JuIGjDoG5nIHThuqFpIELhu5MgxJDDoG8gTmhhLCB24bubaSBjw6FjIHRodeG7mWMgdMOtbmggY2hpIHRp4bq/dCBsacOqbiBxdWFuIMSR4bq/biBo4buTIHPGoSBraMOhY2ggaMOgbmcsIG7hu5lpIGR1bmcgY3Xhu5ljIGfhu41pIHbDoCBr4bq/dCBxdeG6oyBwaOG6o24gaOG7k2kuIE3hu6VjIHRpw6p1IHRodXnhur90IHBo4bulYyBraMOhY2ggaMOgbmcgxJHEg25nIGvDvSBz4bqjbiBwaOG6qW0gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuLiBUcm9uZyBuaGnhu4F1IHRyxrDhu51uZyBo4bujcCwga2jDoWNoIGjDoG5nIMSRxrDhu6NjIGxpw6puIGjhu4cgbmhp4buBdSBs4bqnbiDEkeG7gyB4w6FjIMSR4buLbmggcXV54bq/dCDEkeG7i25oIGN14buRaSBjw7luZyBsw6AgInllcyIgKMSRxINuZyBrw70pIGhv4bq3YyAibm8iIChraMO0bmcgxJHEg25nIGvDvSkuQuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyB0aOG7gyBkw7luZyDEkeG7gyBwaMOibiB0w61jaCBow6BuaCB2aSBraMOhY2ggaMOgbmcsIG3DtCBow6xuaCBow7NhIHF1eeG6v3QgxJHhu4tuaCDEkcSDbmcga8O9IHPhuqNuIHBo4bqpbSB0w6BpIGNow61uaCwgdsOgIMSRw6FuaCBnacOhIGhp4buHdSBxdeG6oyBj4bunYSBjw6FjIGNoaeG6v24gZOG7i2NoIHRp4bq/cCB0aOG7iy4gxJDDonkgbMOgIG5ndeG7k24gZOG7ryBsaeG7h3UgcGjDuSBo4bujcCBjaG8gY8OhYyBk4buxIMOhbiBo4buNYyBtw6F5IChtYWNoaW5lIGxlYXJuaW5nKSwgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCB2w6AgeMOieSBk4buxbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSBuaOG7iyBwaMOibi4KCgojIyMgLiDEkOG7jWMgYuG7mSBk4buvIGxp4buHdQoKVGEgdGnhur9uIGjDoG5oIMSR4buNYyB04buHcCBFeGNlbCB2w6AgZ8OhbiBk4buvIGxp4buHdSB2w6BvIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBjw7MgdMOqbiBsw6AgdGlldWx1YW4gxJHhu4MgcGjhu6VjIHbhu6UgY2hvIHF1w6EgdHLDrG5oIHBow6JuIHTDrWNoLgoKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoRFQpCmxpYnJhcnkocmVhZHhsKQoKYGBgCgoKYGBge3J9CnRpZXVsdWFuIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9sZW5nb2N0dW9uZ3Z5L0Rvd25sb2Fkcy9UTEhLMjoyMDI1L1QyX1BIQcyCTiBUScyBQ0ggRFXMm8yDIExJRcyjzIJVIMSQScyjTkggVEnMgU5IL2JhbmstZnVsbC54bHN4IikKZGF0YXRhYmxlKHRpZXVsdWFuKQpgYGAKCiMjIC4gxJDDtGkgbsOpdCB24buBIGLhu5kgZOG7ryBsaeG7h3UKClRhIHPhu60gZOG7pW5nIGjDoG0gZGltKCkgxJHhu4Mga2nhu4NtIHRyYSBz4buRIGzGsOG7o25nIGJp4bq/biAoY+G7mXQpIHbDoCBz4buRIGzGsOG7o25nIHF1YW4gc8OhdCAoZMOybmcpIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuCgpgYGB7cn0KZGltKHRpZXVsdWFuKQpgYGAKCioqTmjhuq1uIHjDqXQgdOG7lW5nIHF1YW4gduG7gSBk4buvIGxp4buHdSoqOkLhu5kgZOG7ryBsaeG7h3UgZ+G7k20gNDUuMjExIHF1YW4gc8OhdCB2w6AgMTcgYmnhur9uLCB0aOG7gyBoaeG7h24gcXV5IG3DtCB0xrDGoW5nIMSR4buRaSBs4bubbiwgcGjDuSBo4bujcCDEkeG7gyB0cmnhu4NuIGtoYWkgY8OhYyBwaMawxqFuZyBwaMOhcCBwaMOibiB0w61jaCB0aOG7kW5nIGvDqiBjxaluZyBuaMawIHjDonkgZOG7sW5nIG3DtCBow6xuaCBk4buxIGLDoW8gY8OzIMSR4buZIHRpbiBj4bqteSBjYW8uIFbhu5tpIHPhu7Ega+G6v3QgaOG7o3AgZ2nhu69hIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggIHbDoCBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyAsIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjdW5nIGPhuqVwIG7hu4FuIHThuqNuZyBwaG9uZyBwaMO6IMSR4buDIGtoYWkgdGjDoWMgdGjDtG5nIHRpbiwgbmjhuq1uIGRp4buHbiBow6BuaCB2aSBraMOhY2ggaMOgbmcgdsOgIGtow6FtIHBow6EgY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggdMOgaSBjaMOtbmguIFF1eSBtw7QgZOG7ryBsaeG7h3UgbOG7m24ga2jDtG5nIGNo4buJIMSR4bqjbSBi4bqjbyDEkeG7mSBiYW8gcGjhu6cgduG7gSBt4bq3dCB0aMO0bmcgdGluIG3DoCBjw7JuIHThuqFvIMSRaeG7gXUga2nhu4duIHRodeG6rW4gbOG7o2kgY2hvIHZp4buHYyDDoXAgZOG7pW5nIGPDoWMgdGh14bqtdCB0b8OhbiBo4buNYyBtw6F5IGhp4buHbiDEkeG6oWkgbmjhurFtIHThu5FpIMawdSBow7NhIGhp4buHdSBxdeG6oyBwaMOibiB0w61jaCB2w6AgZOG7sSBiw6FvLgoKVGnhur9wIHRoZW8sIHRhIHhlbSB4w6l0IGRhbmggc8OhY2ggdMOqbiBjw6FjIGJp4bq/biBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuaOG6sW0gcGjhu6VjIHbhu6UgY2hvIHF1w6EgdHLDrG5oIHBow6JuIHTDrWNoLgoKYGBge3J9Cm5hbWVzKHRpZXVsdWFuKQpgYGAKCkThu68gbGnhu4d1IGJhbyBn4buTbSBjw6FjIGJp4bq/biBzYXUsIMSRxrDhu6NjIHThu5VuZyBo4bujcCBjaGkgdGnhur90IHRyb25nIGLhuqNuZyBkxrDhu5tpIMSRw6J5IG5o4bqxbSBwaOG7pWMgduG7pSBjaG8gcXXDoSB0csOsbmggcGjDom4gdMOtY2g6CgoKCmBgYHtyfQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIFThuqFvIGLhuqNuZyBk4buvIGxp4buHdSBtw7QgdOG6oyBjw7MgdGjDqm0gY+G7mXQgc+G7kSB0aOG7qSB04buxCmRlcyA8LSBkYXRhLmZyYW1lKAogIFNUVCA9IDE6MTcsCiAgVMOqbl9iaeG6v24gPSBjKCJhZ2UiLCAiam9iIiwgIm1hcml0YWwiLCAiZWR1Y2F0aW9uIiwgImRlZmF1bHQiLCAiYmFsYW5jZSIsICJob3VzaW5nIiwgCiAgICAgICAgICAgICAgICJsb2FuIiwgImNvbnRhY3QiLCAiZGF5IiwgIm1vbnRoIiwgImR1cmF0aW9uIiwgImNhbXBhaWduIiwgInBkYXlzIiwgCiAgICAgICAgICAgICAgICJwcmV2aW91cyIsICJwb3V0Y29tZSIsICJZIiksCiAgTcO0X3ThuqMgPSBjKCJUdeG7lWkgY+G7p2Ega2jDoWNoIGjDoG5nIiwKICAgICAgICAgICAgIk5naOG7gSBuZ2hp4buHcCBj4bunYSBraMOhY2ggaMOgbmciLAogICAgICAgICAgICAiVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIiwKICAgICAgICAgICAgIlRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiIsCiAgICAgICAgICAgICJLaMOhY2ggaMOgbmcgY8OzIG7hu6MgeOG6pXUgaGF5IGtow7RuZyIsCiAgICAgICAgICAgICJT4buRIGTGsCB0cnVuZyBiw6xuaCBow6BuZyBuxINtIHRyb25nIHTDoGkga2hv4bqjbiAoRVVSKSIsCiAgICAgICAgICAgICJLaMOhY2ggaMOgbmcgY8OzIHZheSBtdWEgbmjDoCBraMO0bmciLAogICAgICAgICAgICAiS2jDoWNoIGjDoG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcga2jDtG5nIiwKICAgICAgICAgICAgIlBoxrDGoW5nIHRo4bupYyBsacOqbiBo4buHIChjZWxsdWxhciwgdGVsZXBob25lKSIsCiAgICAgICAgICAgICJOZ8OgeSBraMOhY2ggaMOgbmcgxJHGsOG7o2MgbGnDqm4gaOG7hyIsCiAgICAgICAgICAgICJUaMOhbmcga2jDoWNoIGjDoG5nIMSRxrDhu6NjIGxpw6puIGjhu4ciLAogICAgICAgICAgICAiVGjhu51pIGzGsOG7o25nIGN14buZYyBn4buNaSBjdeG7kWkgY8O5bmcgKGdpw6J5KSIsCiAgICAgICAgICAgICJT4buRIGzhuqduIGxpw6puIGjhu4cgdHJvbmcgY2hp4bq/biBk4buLY2ggaGnhu4duIHThuqFpIiwKICAgICAgICAgICAgIlPhu5EgbmfDoHkga+G7gyB04burIGzhuqduIGxpw6puIGjhu4cgZ+G6p24gbmjhuqV0IiwKICAgICAgICAgICAgIlPhu5EgbOG6p24gbGnDqm4gaOG7hyB0cm9uZyBjaGnhur9uIGThu4tjaCB0csaw4bubYyDEkcOzIiwKICAgICAgICAgICAgIkvhur90IHF14bqjIGNoaeG6v24gZOG7i2NoIHRyxrDhu5tjIMSRw7MiLAogICAgICAgICAgICAiUXV54bq/dCDEkeG7i25oIMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIGPhu6dhIGtow6FjaCBow6BuZyAobm8sIHllcykiKQopCgojIEhp4buDbiB0aOG7iyBi4bqjbmcgY8OzIHRpw6p1IMSR4buBIGPEg24gZ2nhu69hIHbDoCBpbiDEkeG6rW0KZGVzICU+JQogIGthYmxlKCJodG1sIiwgYWxpZ24gPSAiYyIsIAogICAgICAgIGNvbC5uYW1lcyA9IGMoIioqU1RUKioiLCAiKipUw6puIGJp4bq/bioqIiwgIioqTcO0IHThuqMqKiIpLAogICAgICAgIGNhcHRpb24gPSAiPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjogY2VudGVyOyc+PGI+QuG6o25nIDguMS4gRGFuaCBzw6FjaCBjw6FjIGJp4bq/biBjw7MgdHJvbmcgZOG7ryBsaeG7h3U8L2I+PC9kaXY+IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJjZW50ZXIiLCBmb250X3NpemUgPSAxNCkgJT4lCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiIzY0OTVFRCIpICU+JQogIGNvbHVtbl9zcGVjKDE6MywgYm9yZGVyX3JpZ2h0ID0gVFJVRSkKCmBgYAoKClRp4bq/cCB0aGVvLCB0YSB0aeG6v24gaMOgbmgga2nhu4NtIHRyYSB4ZW0gYuG7mSBk4buvIGxp4buHdSBjw7MgY2jhu6lhIGdpw6EgdHLhu4sgdGhp4bq/dSAobWlzc2luZyB2YWx1ZXMpIGhheSBraMO0bmcuIFZp4buHYyBuw6B5IGdpw7pwIMSR4bqjbSBi4bqjbyB0w61uaCB0b8OgbiB24bq5biB2w6AgxJHhu5kgdGluIGPhuq15IGPhu6dhIGThu68gbGnhu4d1IHRyxrDhu5tjIGtoaSB0aOG7sWMgaGnhu4duIGPDoWMgcGjDom4gdMOtY2ggdGnhur9wIHRoZW8uCgpgYGB7cn0Kc3VtKGlzLm5hKHRpZXVsdWFuKSkKYGBgCgrEkOG7gyBraeG7g20gdHJhIHhlbSB04bqtcCBk4buvIGxp4buHdSBjw7MgY2jhu6lhIGdpw6EgdHLhu4sgYuG7iyB0aGnhur91IGhheSBraMO0bmcsIHRhIHPhu60gZOG7pW5nIGjDoG0gaXMubmEoKSB0cm9uZyBSLiBIw6BtIG7DoHkgZ2nDunAgeMOhYyDEkeG7i25oIGPDoWMgw7QgY8OzIGdpw6EgdHLhu4sgdGhp4bq/dSAoTkEpLCB24bubaSBr4bq/dCBxdeG6oyB0cuG6oyB24buBIGzDoCBUUlVFIHThuqFpIG5o4buvbmcgduG7iyB0csOtIGLhu4sgdGhp4bq/dSB2w6AgRkFMU0Ug4bufIG5o4buvbmcgduG7iyB0csOtIMSR4bqneSDEkeG7py4gS2hpIGvhur90IGjhu6NwIHbhu5tpIGjDoG0gc3VtKCksIHRhIGPDsyB0aOG7gyDEkeG6v20gdOG7lW5nIHPhu5EgZ2nDoSB0cuG7iyBi4buLIHRoaeG6v3UgdHJvbmcgdG/DoG4gYuG7mSBk4buvIGxp4buHdSwgdsOsIHRyb25nIFIsIFRSVUUgxJHGsOG7o2MgcXV5IMSR4buVaSB0aMOgbmggMSB2w6AgRkFMU0UgbMOgIDAuIERvIMSRw7MsIGJp4buDdSB0aOG7qWMgc3VtKGlzLm5hKHRpZXVsdWFuKSkgc+G6vSB0cuG6oyB24buBIHThu5VuZyBz4buRIMO0IE5BIHRyb25nIGRhdGFzZXQuIEvhur90IHF14bqjIGtp4buDbSB0cmEgY2hvIHRo4bqleSBnacOhIHRy4buLIHRy4bqjIHbhu4EgYuG6sW5nIDAsIMSRaeG7gXUgbsOgeSDEkeG7k25nIG5naMSpYSB24bubaSB2aeG7h2Mga2jDtG5nIGPDsyBnacOhIHRy4buLIGLhu4sgdGhp4bq/dSBuw6BvIHRyb25nIHThuq1wIGThu68gbGnhu4d1LiBOaMawIHbhuq15LCBk4buvIGxp4buHdSDEkcOjIMSR4bqneSDEkeG7pyB2w6AgY8OzIHRo4buDIHPhu60gZOG7pW5nIHRy4buxYyB0aeG6v3AgY2hvIGPDoWMgYsaw4bubYyBwaMOibiB0w61jaCB0aeG6v3AgdGhlbyBtw6Aga2jDtG5nIGPhuqduIHjhu60gbMO9IHRoaeG6v3UgZOG7ryBsaeG7h3UuCgpUcsaw4bubYyBraGkgdGnhur9uIGjDoG5oIGPDoWMgcGjDom4gdMOtY2ggc8OidSBoxqFuLCB0YSBj4bqnbiB4ZW0geMOpdCBj4bqldSB0csO6YyB04buVbmcgcXXDoXQgY+G7p2EgYuG7mSBk4buvIGxp4buHdSDEkeG7gyBoaeG7g3UgcsO1IHbhu4Egc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQsIHPhu5EgbMaw4bujbmcgYmnhur9uIGPFqW5nIG5oxrAga2nhu4N1IGThu68gbGnhu4d1IGPhu6dhIHThu6tuZyBiaeG6v24uCgpgYGB7cn0Kc3RyKHRpZXVsdWFuKQpgYGAKCioqTmjhuq1uIHjDqXQgduG7gSBj4bqldSB0csO6YyBk4buvIGxp4buHdToqKiBC4buZIGThu68gbGnhu4d1IGPDsyBrw61jaCB0aMaw4bubYyA0NS4yMTEgcXVhbiBzw6F0IMOXIDE3IGJp4bq/biwgxJHGsOG7o2MgbMawdSBkxrDhu5tpIGThuqFuZyB0aWJibGUsIHRodeG6rW4gdGnhu4duIGNobyB44butIGzDvSB2w6AgaGnhu4NuIHRo4buLIHRyb25nIFIuCgpUcm9uZyDEkcOzOgoKLSBDw7Mgbmhp4buBdSBiaeG6v24gxJHhu4tuaCB0w61uaCBk4bqhbmcga8O9IHThu7EgKGNociksIG5oxrA6IGpvYiwgbWFyaXRhbCwgZWR1Y2F0aW9uLCBkZWZhdWx0LCBob3VzaW5nLCBsb2FuLCBjb250YWN0LCBtb250aCwgcG91dGNvbWUsIHkuIMSQw6J5IGzDoCBjw6FjIHRow7RuZyB0aW4gbcO0IHThuqMgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIHbDoCBwaOG6o24gaOG7k2kgY+G7p2Ega2jDoWNoIGjDoG5nLgoKLSBN4buZdCBz4buRIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGThuqFuZyBz4buRIChudW0pLCBiYW8gZ+G7k206IGFnZSwgYmFsYW5jZSwgZGF5LCBkdXJhdGlvbiwgY2FtcGFpZ24sIHBkYXlzLCBwcmV2aW91cy4gQ8OhYyBiaeG6v24gbsOgeSBjw7MgdGjhu4MgZMO5bmcgY2hvIHRo4buRbmcga8OqIG3DtCB04bqjLCBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgdsOgIG3DtCBow6xuaCBow7NhIGjDoG5oIHZpIGtow6FjaCBow6BuZy4KCi0gQmnhur9uIHRo4budaSBnaWFuIGfhu5NtOiBkYXkgKG5nw6B5KSB2w6AgbW9udGggKHRow6FuZyksIGhp4buHbiDEkWFuZyBsxrB1IGTGsOG7m2kgZOG6oW5nIHPhu5EgdsOgIGvDvSB04buxLCBuaMawbmcgY8OzIHRo4buDIGvhur90IGjhu6NwIHbDoCBjaHV54buDbiDEkeG7lWkgduG7gSDEkeG7i25oIGThuqFuZyBEYXRlIMSR4buDIHBo4bulYyB24bulIGPDoWMgcGjDom4gdMOtY2ggY2h14buXaSB0aOG7nWkgZ2lhbi4KCi0gQ8OhYyBiaeG6v24gbmjGsCBiYWxhbmNlLCBkdXJhdGlvbiwgY2FtcGFpZ24sIHBkYXlzLCBwcmV2aW91cyBwaOG6o24gw6FuaCBs4buLY2ggc+G7rSB0xrDGoW5nIHTDoWMgZ2nhu69hIGtow6FjaCBow6BuZyB2w6AgbmfDom4gaMOgbmcsIHLhuqV0IGjhu691IMOtY2ggxJHhu4MgcGjDom4gdMOtY2ggaMOgbmggdmkgdGnhur9wIHRo4buLIHbDoCBt4bupYyDEkeG7mSB0aMOgbmggY8O0bmcgY+G7p2EgY8OhYyBjaGnhur9uIGThu4tjaCB0csaw4bubYyDEkcOzLgoKQuG7mSBk4buvIGxp4buHdSBy4bqldCBwaMO5IGjhu6NwIGNobyBjw6FjIGLDoGkgdG/DoW4gcGjDom4gdMOtY2ggaMOgbmggdmkga2jDoWNoIGjDoG5nLCDEkcOhbmggZ2nDoSBoaeG7h3UgcXXhuqMgY2hp4bq/biBk4buLY2ggdGnhur9wIHRo4buLIHbDoCB4w6J5IGThu7FuZyBtw7QgaMOsbmggZOG7sSDEkW/DoW4gcGjhuqNuIGjhu5NpIHRyb25nIGzEqW5oIHbhu7FjIG5nw6JuIGjDoG5nIHbDoCB0w6BpIGNow61uaC4KCiMjIC4gUGjDom4gdMOtY2ggbcO0IHThuqMgbeG7mXQgYmnhur9uIMSR4buLbmggdMOtbmggCgojIyMgLiBCaeG6v24gWSAoUXV54bq/dCDEkeG7i25oIMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIGPhu6dhIGtow6FjaCBow6BuZykKCioqVOG6p24gc+G7kSAtIFThuqduIHN14bqldCoqCgrEkOG7gyBoaeG7g3UgcsO1IMSR4bq3YyDEkWnhu4NtIHBow6JuIGLhu5EgY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgWSwgdGEgdGnhur9uIGjDoG5oIHRo4buRbmcga8OqIG3DtCB04bqjIG5o4bqxbSB4w6FjIMSR4buLbmggbeG7qWMgxJHhu5kgeHXhuqV0IGhp4buHbiBj4bunYSBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgYmnhur9uIG7DoHkgdGjDtG5nIHF1YSB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQuCgoKYGBge3J9CmNiaW5kKEZyZXF1ZW5jeSA9IHRhYmxlKHRpZXVsdWFuJFkpLCBQcm9wb3J0aW9uID0gcHJvcC50YWJsZSh0YWJsZSh0aWV1bHVhbiRZKSkpCgpgYGAKCioqVHLhu7FjIHF1YW4gaMOzYSoqCgpUw6FjIGdp4bqjIMSRw6MgdGnhur9uIGjDoG5oIHRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UgYuG6sW5nIGJp4buDdSDEkeG7kyBuaOG6sW0gdGjhu4MgaGnhu4duIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBj4bunYSBxdXnhur90IMSR4buLbmggxJHEg25nIGvDvSB0aeG7gW4gZ+G7rWkgY8OzIGvhu7MgaOG6oW4gY+G7p2Ega2jDoWNoIGjDoG5nLiBUaMO0bmcgcXVhIGJp4buDdSDEkeG7kyBuw6B5LCBjw7MgdGjhu4MgcXVhbiBzw6F0IMSRxrDhu6NjIG3hu6ljIMSR4buZIHBo4buVIGJp4bq/biBj4bunYSB04burbmcgcXV54bq/dCDEkeG7i25oLCB04burIMSRw7MgZ2nDunAgbMOgbSByw7UgeHUgaMaw4bubbmcgaMOgbmggdmkgY+G7p2Ega2jDoWNoIGjDoG5nIMSR4buRaSB24bubaSBz4bqjbiBwaOG6qW0gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIG3DoCBuZ8OibiBow6BuZyBjdW5nIGPhuqVwLgoKCgpgYGB7cn0KIyBMb2FkIHRoxrAgdmnhu4duCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwYXRjaHdvcmspCgojIELhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIFkKZnJlcV90YWJsZSA8LSB0aWV1bHVhbiAlPiUKICBjb3VudChZKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IDEwMCAqIG4gLyBzdW0obiksCiAgICAgICAgIGxhYmVsX3BlcmNlbnQgPSBwYXN0ZTAocm91bmQocGVyY2VudCwgMSksICIlIiksCiAgICAgICAgIGxhYmVsX2ZyZXEgPSBwYXN0ZTAobikpCgojIEJp4buDdSDEkeG7kyBj4buZdCAoaGnhu4duIHThuqduIHPhu5EpCmJhcl9wbG90IDwtIGdncGxvdChmcmVxX3RhYmxlLCBhZXMoeCA9IFksIHkgPSBuLCBmaWxsID0gWSkpICsKICBnZW9tX2NvbCh3aWR0aCA9IDAuNywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbF9mcmVxKSwgdmp1c3QgPSAtMC41KSArCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgYmnhur9uIFkiLAogICAgICAgeCA9ICJHacOhIHRy4buLIGPhu6dhIFkiLAogICAgICAgeSA9ICJU4bqnbiBz4buRIikgKwogIHlsaW0oMCwgbWF4KGZyZXFfdGFibGUkbikgKiAxLjIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgQmnhu4N1IMSR4buTIHRyw7JuIChoaeG7h24gcGjhuqduIHRyxINtKQpwaWVfcGxvdCA8LSBnZ3Bsb3QoZnJlcV90YWJsZSwgYWVzKHggPSAiIiwgeSA9IHBlcmNlbnQsIGZpbGwgPSBZKSkgKwogIGdlb21fY29sKHdpZHRoID0gMSwgc2hvdy5sZWdlbmQgPSBUUlVFKSArCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWxfcGVyY2VudCksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkgKwogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHRyw7JuIGJp4bq/biBZIiwgZmlsbCA9ICJHacOhIHRy4buLIFkiKSArCiAgdGhlbWVfdm9pZCgpCgojIEdow6lwIDIgYmnhu4N1IMSR4buTCmJhcl9wbG90ICsgcGllX3Bsb3QKCmBgYAoKKipIw6xuaCA0LjEuIEJp4buDdSDEkeG7kyBj4buZdCB2w6AgYmnhu4N1IMSR4buTIHRyw7JuIHRo4buDIGhp4buHbiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgcXV54bq/dCDEkeG7i25oIMSRxINuZyBrw70gdGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIGPhu6dhIGtow6FjaCBow6BuZyoqCgpIw6xuaCA0LjEgdGjhu4MgaGnhu4duIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBxdXnhur90IMSR4buLbmggxJHEg25nIGvDvSB0aeG7gW4gZ+G7rWkgY8OzIGvhu7MgaOG6oW4gY+G7p2Ega2jDoWNoIGjDoG5nLiBL4bq/dCBxdeG6oyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5IHRyb25nIHThu5VuZyBz4buRIDQ1LjIxMSBraMOhY2ggaMOgbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQsIGPDsyA1LjI4OSAoMTEuNyUpIG5nxrDhu51pIHF1eeG6v3QgxJHhu4tuaCDEkcSDbmcga8O9IHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbiwgdHJvbmcga2hpIDM5LjkyMig4OC4zJSkgbmfGsOG7nWkga2jDtG5nIMSRxINuZyBrw70uIFPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGtow7RuZyDEkcSDbmcga8O9IGNhbyBoxqFuIG5ow7NtIMSRxINuZyBrw70gxJHhur9uIDM0LjYzMyBuZ8aw4budaSAoNzYuNjAlKSwgY2hvIHRo4bqleSBz4buxIGNow6puaCBs4buHY2ggcuG6pXQgbOG7m24gZ2nhu69hIGhhaSBuaMOzbS4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIHLhurFuZyBwaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nIGNoxrBhIGPDsyBuaHUgY+G6p3UgaG/hurdjIGtow7RuZyBs4buxYSBjaOG7jW4gaMOsbmggdGjhu6ljIHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbiwgdOG7qyDEkcOzIMSR4bq3dCByYSB5w6p1IGPhuqd1IGNobyBuZ8OibiBow6BuZyB0cm9uZyB2aeG7h2MgeGVtIHjDqXQgbOG6oWkgY2jDrW5oIHPDoWNoIHPhuqNuIHBo4bqpbSwgY8OhY2ggdGjhu6ljIHRp4bq/cCBj4bqtbiBob+G6t2MgdHJ1eeG7gW4gdGjDtG5nIMSR4buDIGPhuqNpIHRoaeG7h24gdOG7tyBs4buHIMSRxINuZyBrw70gdHJvbmcgdMawxqFuZyBsYWkuCgoKIyMjIC4gQmnhur9uICJkZWZhdWx0IiAtIEtow6FjaCBow6BuZyBjw7MgbuG7oyB44bqldSBoYXkga2jDtG5nCgoqKlThuqduIHPhu5EgLSBU4bqnbiBzdeG6pXQqKgoKxJDhu4MgaGnhu4N1IHLDtSDEkeG6t2MgxJFp4buDbSBwaMOibiBi4buRIGPhu6dhIGJp4bq/biBkZWZhdWx0LCB0YSB0aeG6v24gaMOgbmggdGjhu5FuZyBrw6ogbcO0IHThuqMgbmjhurFtIHjDoWMgxJHhu4tuaCBt4bupYyDEkeG7mSB4deG6pXQgaGnhu4duIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gbsOgeSB0aMO0bmcgcXVhIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldC4KCgpgYGB7cn0KY2JpbmQoRnJlcXVlbmN5ID0gdGFibGUodGlldWx1YW4kZGVmYXVsdCksIFByb3BvcnRpb24gPSBwcm9wLnRhYmxlKHRhYmxlKHRpZXVsdWFuJGRlZmF1bHQpKSkKCmBgYAoKKipUcuG7sWMgcXVhbiBow7NhKioKClTDoWMgZ2nhuqMgxJHDoyBz4butIGThu6VuZyBiaeG7g3UgxJHhu5MgxJHhu4MgdHLhu7FjIHF1YW4gaMOzYSB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIGRlZmF1bHQgbmjhurFtIHBo4bqjbiDDoW5oIHTDrG5oIHRy4bqhbmcgbuG7oyB44bqldSBj4bunYSBraMOhY2ggaMOgbmcuCgpgYGB7cn0KIyBC4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBkZWZhdWx0CmZyZXFfdGFibGUgPC0gdGlldWx1YW4gJT4lCiAgY291bnQoZGVmYXVsdCkgJT4lCiAgbXV0YXRlKHBlcmNlbnQgPSAxMDAgKiBuIC8gc3VtKG4pLAogICAgICAgICBsYWJlbF9wZXJjZW50ID0gcGFzdGUwKHJvdW5kKHBlcmNlbnQsIDEpLCAiJSIpLAogICAgICAgICBsYWJlbF9mcmVxID0gcGFzdGUwKG4pKQoKIyBNw6B1IHPhuq9jIHTDuXkgY2jhu41uIGNobyB04burbmcgZ2nDoSB0cuG7iwpjdXN0b21fY29sb3JzIDwtIGMoInllcyIgPSAicmVkIiwgIm5vIiA9ICIjNjZDQ0ZGIikgICMgQuG6oW4gY8OzIHRo4buDIHRoYXkgxJHhu5VpIG3DoyBtw6B1CgojIEJp4buDdSDEkeG7kyBj4buZdApiYXJfcGxvdCA8LSBnZ3Bsb3QoZnJlcV90YWJsZSwgYWVzKHggPSBkZWZhdWx0LCB5ID0gbiwgZmlsbCA9IGRlZmF1bHQpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjcsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWxfZnJlcSksIHZqdXN0ID0gLTAuNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsKICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCBiaeG6v24gZGVmYXVsdCIsCiAgICAgICB4ID0gIkdpw6EgdHLhu4sgY+G7p2EgZGVmYXVsdCIsCiAgICAgICB5ID0gIlThuqduIHPhu5EiKSArCiAgeWxpbSgwLCBtYXgoZnJlcV90YWJsZSRuKSAqIDEuMikgKwogIHRoZW1lX21pbmltYWwoKQoKIyBCaeG7g3UgxJHhu5MgdHLDsm4KcGllX3Bsb3QgPC0gZ2dwbG90KGZyZXFfdGFibGUsIGFlcyh4ID0gIiIsIHkgPSBwZXJjZW50LCBmaWxsID0gZGVmYXVsdCkpICsKICBnZW9tX2NvbCh3aWR0aCA9IDEsIHNob3cubGVnZW5kID0gVFJVRSkgKwogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsX3BlcmNlbnQpLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdHLDsm4gYmnhur9uIGRlZmF1bHQiLCBmaWxsID0gIkdpw6EgdHLhu4sgZGVmYXVsdCIpICsKICB0aGVtZV92b2lkKCkKCiMgR2jDqXAgYmnhu4N1IMSR4buTCmJhcl9wbG90ICsgcGllX3Bsb3QKCmBgYAoKKipIw6xuaCA0LjIuIEJp4buDdSDEkeG7kyBj4buZdCB2w6AgYmnhu4N1IMSR4buTIHRyw7JuIHRo4buDIGhp4buHbiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY+G7p2EgdMOsbmggdHLhuqFuZyBu4bujIHjhuqV1IGPhu6dhIGtow6FjaCBow6BuZyoqCgpIw6xuaCA0LjIgdGjhu4MgaGnhu4duIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBj4bunYSB0w6xuaCB0cuG6oW5nIG7hu6MgeOG6pXUgY+G7p2Ega2jDoWNoIGjDoG5nLiBL4bq/dCBxdeG6oyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5IHRyb25nIHThu5VuZyBz4buRIDQ1LjIxMSBraMOhY2ggaMOgbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQsIGPDsyA4MTUoMS44JSkgbmfGsOG7nWkgY8OzIG7hu6MgeOG6pXUsIHRyb25nIGtoaSA0NC4zOTYoOTguMiUpIG5nxrDhu51pIGtow7RuZyBjw7MgbuG7oyB44bqldS4gxJBp4buBdSBuw6B5IMSR4buTbmcgbmdoxKlhIHbhu5tpIHZp4buHYyBuaMOzbSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBu4bujIHjhuqV1IGNhbyBoxqFuIG5ow7NtIGPDsyBu4bujIHjhuqV1IMSR4bq/biA0My41ODEgbmfGsOG7nWksIHTGsMahbmcg4bupbmcgOTYsNCUuIFThu7cgbOG7hyBjaMOqbmggbOG7h2NoIHLhuqV0IGzhu5tuIGdp4buvYSBoYWkgbmjDs20gY2hvIHRo4bqleSBu4bujIHjhuqV1IGzDoCBoaeG7h24gdMaw4bujbmcgaGnhur9tIGfhurdwIHRyb25nIG3huqt1IGto4bqjbyBzw6F0LgoKCiMjIyAuIEJp4bq/biAibG9hbiIgLSBLaMOhY2ggaMOgbmcgY8OzIHZheSB0acOqdSBkw7luZyBoYXkga2jDtG5nCgoqKlThuqduIHPhu5EgLSBU4bqnbiBzdeG6pXQqKgoKxJDhu4MgaGnhu4N1IHLDtSDEkeG6t2MgxJFp4buDbSBwaMOibiBi4buRIGPhu6dhIGJp4bq/biBsb2FuLCB0YSB0aeG6v24gaMOgbmggdGjhu5FuZyBrw6ogbcO0IHThuqMgbmjhurFtIHjDoWMgxJHhu4tuaCBt4bupYyDEkeG7mSB4deG6pXQgaGnhu4duIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gbsOgeSB0aMO0bmcgcXVhIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldC4KCgoKYGBge3J9CmNiaW5kKEZyZXF1ZW5jeSA9IHRhYmxlKHRpZXVsdWFuJGxvYW4pLCBQcm9wb3J0aW9uID0gcHJvcC50YWJsZSh0YWJsZSh0aWV1bHVhbiRsb2FuKSkpCgpgYGAKCgoqKlRy4buxYyBxdWFuIGjDs2EqKgoKVMOhYyBnaeG6oyDEkcOjIHPhu60gZOG7pW5nIGJp4buDdSDEkeG7kyDEkeG7gyB0cuG7sWMgcXVhbiBow7NhIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gbG9hbiBuaOG6sW0gcGjhuqNuIMOhbmggdMOsbmggdHLhuqFuZyB2YXkgdGnDqnUgZMO5bmcgY+G7p2Ega2jDoWNoIGjDoG5nLgoKYGBge3J9CiMgQuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gbG9hbgpmcmVxX3RhYmxlIDwtIHRpZXVsdWFuICU+JQogIGNvdW50KGxvYW4pICU+JQogIG11dGF0ZShwZXJjZW50ID0gMTAwICogbiAvIHN1bShuKSwKICAgICAgICAgbGFiZWxfcGVyY2VudCA9IHBhc3RlMChyb3VuZChwZXJjZW50LCAxKSwgIiUiKSwKICAgICAgICAgbGFiZWxfZnJlcSA9IHBhc3RlMChuKSkKCiMgTcOgdSBz4bqvYyB0w7l5IGNo4buNbiBjaG8gdOG7q25nIGdpw6EgdHLhu4sKY3VzdG9tX2NvbG9ycyA8LSBjKCJ5ZXMiID0gIiNEMjA0QTUiLCAibm8iID0gIiM2NDk1RUQiKSAgCgojIEJp4buDdSDEkeG7kyBj4buZdApiYXJfcGxvdCA8LSBnZ3Bsb3QoZnJlcV90YWJsZSwgYWVzKHggPSBsb2FuLCB5ID0gbiwgZmlsbCA9IGxvYW4pKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjcsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWxfZnJlcSksIHZqdXN0ID0gLTAuNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsKICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCBiaeG6v24gbG9hbiIsCiAgICAgICB4ID0gIkdpw6EgdHLhu4sgY+G7p2EgbG9hbiIsCiAgICAgICB5ID0gIlThuqduIHPhu5EiKSArCiAgeWxpbSgwLCBtYXgoZnJlcV90YWJsZSRuKSAqIDEuMikgKwogIHRoZW1lX21pbmltYWwoKQoKIyBCaeG7g3UgxJHhu5MgdHLDsm4KcGllX3Bsb3QgPC0gZ2dwbG90KGZyZXFfdGFibGUsIGFlcyh4ID0gIiIsIHkgPSBwZXJjZW50LCBmaWxsID0gbG9hbikpICsKICBnZW9tX2NvbCh3aWR0aCA9IDEsIHNob3cubGVnZW5kID0gVFJVRSkgKwogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsX3BlcmNlbnQpLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdHLDsm4gYmnhur9uIGxvYW4iLCBmaWxsID0gIkdpw6EgdHLhu4sgbG9hbiIpICsKICB0aGVtZV92b2lkKCkKCiMgR2jDqXAgYmnhu4N1IMSR4buTCmJhcl9wbG90ICsgcGllX3Bsb3QKCmBgYAoKKipIw6xuaCA0LjMuIEJp4buDdSDEkeG7kyBj4buZdCB2w6AgYmnhu4N1IMSR4buTIHRyw7JuIHRo4buDIGhp4buHbiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY+G7p2EgdMOsbmggdHLhuqFuZyB2YXkgdGnDqnUgZMO5bmcgY+G7p2Ega2jDoWNoIGjDoG5nKioKCgpIw6xuaCA0LjMgdGjhu4MgaGnhu4duIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBj4bunYSB0w6xuaCB0cuG6oW5nIHZheSB0acOqdSBkw7luZyBj4bunYSBraMOhY2ggaMOgbmcuIEvhur90IHF14bqjIHRo4buRbmcga8OqIGNobyB0aOG6pXkgdHJvbmcgdOG7lW5nIHPhu5EgNDUuMjExIGtow6FjaCBow6BuZyDEkcaw4bujYyBraOG6o28gc8OhdCwgY8OzIDcyNDQoMTYlKSBuZ8aw4budaSBjw7MgdmF5IHRpw6p1IGTDuW5nLCB0cm9uZyBraGkgMzcuOTY3KDg0JSkgbmfGsOG7nWkga2jDtG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcuIE5oxrAgduG6rXksIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGtow7RuZyB2YXkgdGnDqnUgZMO5bmcgY2FvIGjGoW4gbmjDs20gY8OzIHZheSB0acOqdSBkw7luZyB24bubaSBjaMOqbmggbOG7h2NoIGzDqm4gxJHhur9uIDMwLjcyMyBuZ8aw4budaSwgdMawxqFuZyDhu6luZyA2OCUuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBraMOhY2ggaMOgbmcgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQga2jDtG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcgdOG6oWkgdGjhu51pIMSRaeG7g20ga2jhuqNvIHPDoXQuCgoKCgojIyMgLiBCaeG6v24gImhvdXNpbmciIC0gS2jDoWNoIGjDoG5nIGPDsyB2YXkgbXVhIG5ow6AgaGF5IGtow7RuZwoKKipU4bqnbiBz4buRIC0gVOG6p24gc3XhuqV0KioKCsSQ4buDIGhp4buDdSByw7UgxJHhurdjIMSRaeG7g20gcGjDom4gYuG7kSBj4bunYSBiaeG6v24gaG91c2luZywgdGEgdGnhur9uIGjDoG5oIHRo4buRbmcga8OqIG3DtCB04bqjIG5o4bqxbSB4w6FjIMSR4buLbmggbeG7qWMgxJHhu5kgeHXhuqV0IGhp4buHbiBj4bunYSBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgYmnhur9uIG7DoHkgdGjDtG5nIHF1YSB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQuCgoKYGBge3J9CmNiaW5kKEZyZXF1ZW5jeSA9IHRhYmxlKHRpZXVsdWFuJGhvdXNpbmcpLCBQcm9wb3J0aW9uID0gcHJvcC50YWJsZSh0YWJsZSh0aWV1bHVhbiRob3VzaW5nKSkpCgpgYGAKCioqVHLhu7FjIHF1YW4gaMOzYSoqCgpUw6FjIGdp4bqjIMSRw6Mgc+G7rSBk4bulbmcgYmnhu4N1IMSR4buTIMSR4buDIHRy4buxYyBxdWFuIGjDs2EgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBkZWZhdWx0IG5o4bqxbSBwaOG6o24gw6FuaCB0w6xuaCB0cuG6oW5nIHZheSBtdWEgdGnDqnUgZMO5bmcgY+G7p2Ega2jDoWNoIGjDoG5nLgoKYGBge3J9CiMgQuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gaG91c2luZwpmcmVxX3RhYmxlIDwtIHRpZXVsdWFuICU+JQogIGNvdW50KGhvdXNpbmcpICU+JQogIG11dGF0ZShwZXJjZW50ID0gMTAwICogbiAvIHN1bShuKSwKICAgICAgICAgbGFiZWxfcGVyY2VudCA9IHBhc3RlMChyb3VuZChwZXJjZW50LCAxKSwgIiUiKSwKICAgICAgICAgbGFiZWxfZnJlcSA9IHBhc3RlMChuKSkKCiMgTcOgdSBz4bqvYyB0w7l5IGNo4buNbiBjaG8gdOG7q25nIGdpw6EgdHLhu4sKY3VzdG9tX2NvbG9ycyA8LSBjKCJ5ZXMiID0gIiNGRkQ3MDAiLCAibm8iID0gIiNEOEIiKSAgIyBC4bqhbiBjw7MgdGjhu4MgdGhheSDEkeG7lWkgbcOjIG3DoHUKCiMgQmnhu4N1IMSR4buTIGPhu5l0CmJhcl9wbG90IDwtIGdncGxvdChmcmVxX3RhYmxlLCBhZXMoeCA9IGhvdXNpbmcsIHkgPSBuLCBmaWxsID0gaG91c2luZykpICsKICBnZW9tX2NvbCh3aWR0aCA9IDAuNywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbF9mcmVxKSwgdmp1c3QgPSAtMC41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKwogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IGJp4bq/biBob3VzaW5nIiwKICAgICAgIHggPSAiR2nDoSB0cuG7iyBj4bunYSBob3VzaW5nIiwKICAgICAgIHkgPSAiVOG6p24gc+G7kSIpICsKICB5bGltKDAsIG1heChmcmVxX3RhYmxlJG4pICogMS4yKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIEJp4buDdSDEkeG7kyB0csOybgpwaWVfcGxvdCA8LSBnZ3Bsb3QoZnJlcV90YWJsZSwgYWVzKHggPSAiIiwgeSA9IHBlcmNlbnQsIGZpbGwgPSBob3VzaW5nKSkgKwogIGdlb21fY29sKHdpZHRoID0gMSwgc2hvdy5sZWdlbmQgPSBUUlVFKSArCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWxfcGVyY2VudCksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsKICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB0csOybiBiaeG6v24gaG91c2luZyIsIGZpbGwgPSAiR2nDoSB0cuG7iyBob3VzaW5nIikgKwogIHRoZW1lX3ZvaWQoKQoKIyBHaMOpcCBiaeG7g3UgxJHhu5MKYmFyX3Bsb3QgKyBwaWVfcGxvdAoKYGBgCgoqKkjDrG5oIDQuNC4gQmnhu4N1IMSR4buTIGPhu5l0IHbDoCBiaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBj4bunYSB0w6xuaCB0cuG6oW5nIHZheSBtdWEgbmjDoCBj4bunYSBraMOhY2ggaMOgbmcqKgoKSMOsbmggNC40IHRo4buDIGhp4buHbiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY+G7p2EgdMOsbmggdHLhuqFuZyB2YXkgbXVhIG5ow6AgY+G7p2Ega2jDoWNoIGjDoG5nLiBL4bq/dCBxdeG6oyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5IHRyb25nIHThu5VuZyBz4buRIDQ1LjIxMSBraMOhY2ggaMOgbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQsIGPDsyAyNS4xMzAoNTUuNiUpIG5nxrDhu51pIGPDsyB2YXkgbXVhIG5ow6AsIHRyb25nIGtoaSAyMC4wODEoNDQuNCUpIG5nxrDhu51pIGtow7RuZyBjw7MgdmF5IG11YSBuaMOgLiBOaMawIHbhuq15LCBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBraMO0bmcgdmF5IG11YSBuaMOgIGNhbyBoxqFuIG5ow7NtIGPDsyB2YXkgdGnDqnUgZMO5bmcgduG7m2kgY2jDqm5oIGzhu4djaCBsw6AgNS4wNDkgbmfGsOG7nWksIHTGsMahbmcg4bupbmcgMTEuMiUuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGjGoW4gbeG7mXQgbuG7rWEgc+G7kSBraMOhY2ggaMOgbmcgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbOG7sWEgY2jhu41uIGjDrG5oIHRo4bupYyB2YXkgduG7kW4gxJHhu4MgbXVhIG5ow6AsIHBo4bqjbiDDoW5oIG3hu6ljIMSR4buZIHBo4buVIGJp4bq/biBj4bunYSBuaHUgY+G6p3UgbmjDoCDhu58gdsOgIGto4bqjIG7Eg25nIHRp4bq/cCBj4bqtbiB0w61uIGThu6VuZyBi4bqldCDEkeG7mW5nIHPhuqNuIHRyb25nIGPhu5luZyDEkeG7k25nIGtow6FjaCBow6BuZy4KCgojIyAuIFBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/biDEkeG7i25oIHTDrW5oCgojIyMgLiBD4bq3cCBiaeG6v24gWSB2w6AgZGVmYXVsdAoKKipU4bqnbiBz4buRIC0gVOG6p24gc3XhuqV0IGJpw6puKioKCgpUw6FjIGdp4bqjIHRp4bq/biBow6BuaCB0aOG7kW5nIGvDqiB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgYmnDqm4gY2hvIGPhurdwIGJp4bq/biBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIChZKSB2w6AgdMOsbmggdHLhuqFuZyBu4bujIHjhuqV1IChkZWZhdWx0KSBuaOG6sW0gcGjDom4gdMOtY2ggxJHhurdjIMSRaeG7g20gaMOgbmggdmkga2jDoWNoIGjDoG5nIHRoZW8gdOG7q25nIG5ow7NtLgoKCgpgYGB7cn0KZzEgPC0gdGFibGUodGlldWx1YW4kWSwgdGlldWx1YW4kZGVmYXVsdCkKYWRkbWFyZ2lucyhnMSkgCgpgYGAKCmBgYHtyfQphZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUodGlldWx1YW4kWSwgdGlldWx1YW4kZGVmYXVsdCkpKQpgYGAKKipUcuG7sWMgcXVhbiBow7NhKioKClTDoWMgZ2nhuqMgc+G7rSBk4bulbmcgYmnhu4N1IMSR4buTIMSR4buDIHRy4buxYyBxdWFuIGjDs2EgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGJpw6puIGNobyBj4bq3cCBiaeG6v24gcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiAoWSkgdsOgIHTDrG5oIHRy4bqhbmcgbuG7oyB44bqldSAoZGVmYXVsdCkgbmjhurFtIHBow6JuIHTDrWNoIMSR4bq3YyDEkWnhu4NtIGjDoG5oIHZpIGtow6FjaCBow6BuZyB0aGVvIHThu6tuZyBuaMOzbS4KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmdncGxvdCh0aWV1bHVhbiAlPiUgZ3JvdXBfYnkoWSwgZGVmYXVsdCkgJT4lIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIHVuZ3JvdXAoKSwgCiAgICAgICBhZXMoeCA9IFksIHkgPSBjb3VudCwgZmlsbCA9IGRlZmF1bHQpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnQpLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIAogICAgICAgICAgICB2anVzdCA9IC0wLjMsIAogICAgICAgICAgICBzaXplID0gMy41KSArCiAgbGFicygKICAgIHRpdGxlID0gIlBow6JuIHBo4buRaSB0w6xuaCB0cuG6oW5nIG7hu6MgeOG6pXUgdGhlbyBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIiwKICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmciLAogICAgeCA9ICJRdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIiwKICAgIGZpbGwgPSAiVMOsbmggdHLhuqFuZyBu4bujIHjhuqV1IgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoqKkjDrG5oIDUuMS4gQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBwaOG6o24g4bqjbmggbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyBu4bujIHjhuqV1IHbDoCBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuKioKCkjDrG5oIDUuMSBwaOG6o24g4bqjbmggbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyBu4bujIHbDoCBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuLiBCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSwg4bufIG5ow7NtIGtow6FjaCBow6BuZyBraMO0bmcgZ+G7rWkgdGnhu4FuLCDEkWEgc+G7kSBsw6Aga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgbuG7oyB44bqldSAoMzkuMTU5IG5nxrDhu51pKSwgdHJvbmcga2hpIGNo4buJIGPDsyA3NjMgbmfGsOG7nWkgY8OzIG7hu6MgeOG6pXUga2jDtG5nIGfhu61pIHRp4buBbi4g4bueIG5ow7NtIGtow6FjaCBow6BuZyBjw7MgZ+G7rWkgdGnhu4FuLCBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIG7hu6MgeOG6pXUgcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiB24bqrbiBjaGnhur9tIMawdSB0aOG6vyAoNS4yMzcgbmfGsOG7nWkpLCBjw7JuIG5ow7NtIGPDsyBu4bujIHjhuqV1IHF1eeG6v3QgxJHhu4tuaCBn4butaSB0aeG7gW4gY2jhu4kgY8OzIDUyIG5nxrDhu51pLiBU4bu3IGzhu4cgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBu4bujIHjhuqV1IGPDsyB4dSBoxrDhu5tuZyBn4butaSB0aeG7gW4gY2FvIGjGoW4gc28gduG7m2kgbmjDs20gY8OzIG7hu6MgeOG6pXUuIFPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIHbhu4Egc+G7kSBsxrDhu6NuZyBnaeG7r2EgaGFpIG5ow7NtIGfhu6NpIMO9IHLhurFuZyB0w6xuaCB0cuG6oW5nIG7hu6MgeOG6pXUgY8OzIHRo4buDIGzDoCB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPhu6dhIGtow6FjaCBow6BuZy4KCioqS2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nKioKCmBgYHtyfQpjaGlzcS50ZXN0KHRhYmxlKHRpZXVsdWFuJFksIHRpZXVsdWFuJGRlZmF1bHQpKQpgYGAKKipCw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oKioKCiQkClxsZWZ0XHsKXGJlZ2lue2FycmF5fXtsbH0KSF8wOiAmIFx0ZXh0e1F1eeG6v3QgxJHhu4tuaCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gdsOgIHTDrG5oIHRy4bqhbmcgbuG7oyB44bqldSBsw6AgxJHhu5ljIGzhuq1wfVxcCkhfMTogJiBcdGV4dHtRdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIHbDoCB0w6xuaCB0cuG6oW5nIG7hu6MgeOG6pXUgY8OzIG3hu5FpIGxpw6puIGjhu4d9IApcZW5ke2FycmF5fQpccmlnaHQuCiQkCk3hu6ljIMO9IG5naMSpYSA1JS4KClRhIHRo4bqleSBnacOhIHRy4buLIHBfdmFsdWUgPSAyLjQ1NGUtMDYgPCAwLjA1LCDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gSDAuIFbhuq15IFF1eeG6v3QgxJHhu4tuaCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gdsOgIHTDrG5oIHRy4bqhbmcgbuG7oyB44bqldSBjw7MgbeG7kWkgbGnDqm4gaOG7hyB24bubaSBuaGF1LgoKCioqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgKFJlbGF0aXZlIFJpc2spKioKCmBgYHtyfQpsaWJyYXJ5KGVwaXRvb2xzKQpsaWJyYXJ5KERlc2NUb29scykKcmlza3JhdGlvKGcxKSAKYGBgCgoqKk5o4bqtbiB4w6l0OioqIFRoZW8gYuG6o25nIGvhur90IHF14bqjLCBuaMOzbSBraMOhY2ggaMOgbmcga2jDtG5nIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiAoWSA9ICJubyIpIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSB24bubaSBSUiA9IDEuMDAwMC4gTmjDs20ga2jDoWNoIGjDoG5nIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiAoWSA9ICJ5ZXMiKSBjw7MgUlIgPSAwLjUxNDQsIHThu6ljIGzDoCB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGPDsyBu4bujIHjhuqV1IHRyb25nIG5ow7NtIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBi4bqxbmcga2hv4bqjbmcgMC41MTQ0IGzhuqduIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBn4butaSB0aeG7gW4uIEtob+G6o25nIMaw4bubYyBsxrDhu6NuZyBsw6AgKDAuMzg5MDswLjY4MDMpIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUuCgoKCioqVOG7tyBs4buHIGNow6puaCAoT2RkcyByYXRpbykqKgoKCmBgYHtyfQpvZGRzcmF0aW8oZzEpCmBgYAoKCioqTmjhuq1uIHjDqXQ6KiogVGhlbyBi4bqjbmcga+G6v3QgcXXhuqMsIHThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBu4bujIHjhuqV1IHRyb25nIG5ow7NtIGtow7RuZyBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gYuG6sW5nIDAuNTExMSBs4bqnbiBzbyB24bubaSBuaMOzbSBraMOhY2ggaMOgbmcgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuLiBLaG/huqNuZyDGsOG7m2MgbMaw4bujbmcgbMOgICgwLjM4MDc7MC42NzA3KSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLgoKCgoKIyMjIC4gQ+G6t3AgYmnhur9uIFkgdsOgIGxvYW4KCioqVOG6p24gc+G7kSAtIFThuqduIHN14bqldCBiacOqbioqCgpUw6FjIGdp4bqjIHRp4bq/biBow6BuaCB0aOG7kW5nIGvDqiB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgYmnDqm4gY2hvIGPhurdwIGJp4bq/biBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIChZKSB2w6AgdMOsbmggdHLhuqFuZyB2YXkgdGnDqnUgZMO5bmcgKGxvYW4pIG5o4bqxbSBwaMOibiB0w61jaCDEkeG6t2MgxJFp4buDbSBow6BuaCB2aSBraMOhY2ggaMOgbmcgdGhlbyB04burbmcgbmjDs20uCgoKYGBge3J9CmcyIDwtIHRhYmxlKHRpZXVsdWFuJFksIHRpZXVsdWFuJGxvYW4pCmFkZG1hcmdpbnMoZzIpIAoKYGBgCgoKYGBge3J9CmFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZSh0aWV1bHVhbiRZLCB0aWV1bHVhbiRsb2FuKSkpCmBgYAoKKipUcuG7sWMgcXVhbiBow7NhKioKClTDoWMgZ2nhuqMgc+G7rSBk4bulbmcgYmnhu4N1IMSR4buTIMSR4buDIHRy4buxYyBxdWFuIGjDs2EgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGJpw6puIGNobyBj4bq3cCBiaeG6v24gcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiAoWSkgdsOgIHTDrG5oIHRy4bqhbmcgdmF5IHRpw6p1IGTDuW5nIChsb2FuKSBuaOG6sW0gcGjDom4gdMOtY2ggxJHhurdjIMSRaeG7g20gaMOgbmggdmkga2jDoWNoIGjDoG5nIHRoZW8gdOG7q25nIG5ow7NtLgoKYGBge3J9CiMgTcOgdSBz4bqvYyB0w7l5IGNo4buNbiBjaG8gdOG7q25nIGdpw6EgdHLhu4sgY+G7p2EgbG9hbgpjdXN0b21fY29sb3JzIDwtIGMoInllcyIgPSAiI0QyMDRBNSIsICJubyIgPSAiIzY0OTVFRCIpICAKCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQKZ2dwbG90KHRpZXVsdWFuICU+JSAKICAgICAgICAgZ3JvdXBfYnkoWSwgbG9hbikgJT4lIAogICAgICAgICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSAKICAgICAgICAgdW5ncm91cCgpLCAKICAgICAgIGFlcyh4ID0gWSwgeSA9IGNvdW50LCBmaWxsID0gbG9hbikpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudCksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgCiAgICAgICAgICAgIHNpemUgPSAzLjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIMOBcCBk4bulbmcgbcOgdSB0w7l5IGNo4buJbmgKICBsYWJzKAogICAgdGl0bGUgPSAiUGjDom4gcGjhu5FpIHTDrG5oIHRy4bqhbmcgdmF5IHRpw6p1IGTDuW5nIHRoZW8gcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiIsCiAgICB5ID0gIlPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIiwKICAgIHggPSAiUXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiIsCiAgICBmaWxsID0gIlTDrG5oIHRy4bqhbmcgdmF5IHRpw6p1IGTDuW5nIgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoqKkjDrG5oIDUuMi4gQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBwaOG6o24g4bqjbmggbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyB2YXkgdGnDqnUgZMO5bmcgdsOgIHF1eeG6v3QgxJHhu4tuaCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4qKgoKSMOsbmggNS4yIHBo4bqjbiDhuqNuaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIHZheSB0acOqdSBkw7luZyB2w6AgcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbi4gQmnhu4N1IMSR4buTIGNobyB0aOG6pXksIOG7nyBuaMOzbSBraMOhY2ggaMOgbmcga2jDtG5nIGfhu61pIHRp4buBbiwgxJFhIHPhu5EgbMOgIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIHZheSB0acOqdSBkw7luZyAoMzMuMTYyIG5nxrDhu51pKSwgdHJvbmcga2hpIGPDsyA2Ljc2MCBuZ8aw4budaSBjw7MgdmF5IHRpw6p1IGTDuW5nIGtow7RuZyBn4butaSB0aeG7gW4uIOG7niBuaMOzbSBraMOhY2ggaMOgbmcgY8OzIGfhu61pIHRp4buBbiwgc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcgcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiB24bqrbiBjaGnhur9tIMawdSB0aOG6vyAoNC44MDUgbmfGsOG7nWkpLCBjw7JuIG5ow7NtIGPDsyB2YXkgdGnDqnUgZMO5bmcgcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjaOG7iSBjw7MgNDg0IG5nxrDhu51pLiBU4bu3IGzhu4cgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcgY8OzIHh1IGjGsOG7m25nIGfhu61pIHRp4buBbiBjYW8gaMahbiBzbyB24bubaSBuaMOzbSBjw7MgdmF5IHRpw6p1IGTDuW5nLiBT4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIHPhu5EgbMaw4bujbmcgZ2nhu69hIGhhaSBuaMOzbSBn4bujaSDDvSBy4bqxbmcgdMOsbmggdHLhuqFuZyB2YXkgdGnDqnUgZMO5bmcgY8OzIHRo4buDIGzDoCB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPhu6dhIGtow6FjaCBow6BuZy4KCioqS2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nKioKCmBgYHtyfQpjaGlzcS50ZXN0KHRhYmxlKHRpZXVsdWFuJFksIHRpZXVsdWFuJGxvYW4pKQpgYGAKKipCw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oKioKCiQkClxsZWZ0XHsKXGJlZ2lue2FycmF5fXtsbH0KSF8wOiAmIFx0ZXh0e1F1eeG6v3QgxJHhu4tuaCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gdsOgIHTDrG5oIHRy4bqhbmcgdmF5IHRpw6p1IGTDuW5nIGzDoCDEkeG7mWMgbOG6rXB9XFwKSF8xOiAmIFx0ZXh0e1F1eeG6v3QgxJHhu4tuaCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gdsOgIHTDrG5oIHRy4bqhbmcgdmF5IHRpw6p1IGTDuW5nIGPDsyBt4buRaSBsacOqbiBo4buHfSAKXGVuZHthcnJheX0KXHJpZ2h0LgokJApN4bupYyDDvSBuZ2jEqWEgNSUuCgpUYSB0aOG6pXkgZ2nDoSB0cuG7iyBwX3ZhbHVlIDwgMi4yZS0xNiAoYsOpIGjGoW4gcuG6pXQgbmhp4bq/dSBzbyB24bubaSAwLjA1KSwgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIEgwLiBW4bqteSBRdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIHbDoCB0w6xuaCB0cuG6oW5nIHZheSB0acOqdSBkw7luZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyB24bubaSBuaGF1LgoKCioqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkoUmVsYXRpdmUgUmlzaykqKgoKYGBge3J9CnJpc2tyYXRpbyhnMikgCmBgYAoKKipOaOG6rW4geMOpdDoqKiBUaGVvIGLhuqNuZyBr4bq/dCBxdeG6oywgbmjDs20ga2jDoWNoIGjDoG5nIGtow7RuZyBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gKFkgPSAibm8iKSDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgduG7m2kgUlIgPSAxLjAwMDAuIE5ow7NtIGtow6FjaCBow6BuZyBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gKFkgPSAieWVzIikgY8OzIFJSID0gMC41NDA0LCB04bupYyBsw6AgdOG7tyBs4buHIGtow6FjaCBow6BuZyAgY8OzIHZheSB0acOqdSBkw7luZyB0cm9uZyBuaMOzbSBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gYuG6sW5nIGtob+G6o25nIDAuNTQwNCBs4bqnbiBzbyB24bubaSBuaMOzbSBraMO0bmcgZ+G7rWkgdGnhu4FuLiBLaG/huqNuZyDGsOG7m2MgbMaw4bujbmcgbMOgICgwLjQ5NTE7MC41ODk5KSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLgoKCioqVOG7tyBz4buRIGNow6puaCAoT2RkcyByYXRpbykqKgoKCmBgYHtyfQpvZGRzcmF0aW8oZzIpCmBgYAoKKipOaOG6rW4geMOpdDoqKiBUaGVvIGLhuqNuZyBr4bq/dCBxdeG6oywgdOG7tyBs4buHIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIHZheSB0acOqdSBkw7luZyB0cm9uZyBuaMOzbSBraMO0bmcgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIGLhurFuZyBraG/huqNuZyAwLjQ5NDMgbOG6p24gc28gduG7m2kgbmjDs20ga2jDoWNoIGjDoG5nIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbi4gS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGzDoCAoMC40NDgxOzAuNTQ0MSkgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JS4KCgoKCiMjIyAuIEPhurdwIGJp4bq/biBZIHbDoCBob3VzaW5nCgoqKlThuqduIHPhu5EgLSBU4bqnbiBzdeG6pXQgYmnDqm4qKgoKVMOhYyBnaeG6oyB0aeG6v24gaMOgbmggdGjhu5FuZyBrw6ogdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IGJpw6puIGNobyBj4bq3cCBiaeG6v24gcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiAoWSkgdsOgIHTDrG5oIHRy4bqhbmcgdmF5IG11YSBuaMOgIChob3VzaW5nKSBuaOG6sW0gcGjDom4gdMOtY2ggxJHhurdjIMSRaeG7g20gaMOgbmggdmkga2jDoWNoIGjDoG5nIHRoZW8gdOG7q25nIG5ow7NtLgoKCmBgYHtyfQpnMyA8LSB0YWJsZSh0aWV1bHVhbiRZLCB0aWV1bHVhbiRob3VzaW5nKQphZGRtYXJnaW5zKGczKSAKCmBgYAoKCgpgYGB7cn0KYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKHRpZXVsdWFuJFksIHRpZXVsdWFuJGhvdXNpbmcpKSkKYGBgCgoqKlRy4buxYyBxdWFuIGjDs2EqKgoKVMOhYyBnaeG6oyBz4butIGThu6VuZyBiaeG7g3UgxJHhu5MgxJHhu4MgdHLhu7FjIHF1YW4gaMOzYSB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgYmnDqm4gY2hvIGPhurdwIGJp4bq/biBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIChZKSB2w6AgdMOsbmggdHLhuqFuZyB2YXkgbXVhIG5ow6AgKGhvdXNpbmcpIG5o4bqxbSBwaMOibiB0w61jaCDEkeG6t2MgxJFp4buDbSBow6BuaCB2aSBraMOhY2ggaMOgbmcgdGhlbyB04burbmcgbmjDs20uCgoKYGBge3J9CiMgTcOgdSBz4bqvYyB0w7l5IGNo4buNbiBjaG8gdOG7q25nIGdpw6EgdHLhu4sgY+G7p2EgbG9hbgpjdXN0b21fY29sb3JzIDwtIGMoInllcyIgPSAiI0ZGRDcwMCIsICJubyIgPSAiI0Q4QiIpIAoKIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdApnZ3Bsb3QodGlldWx1YW4gJT4lIAogICAgICAgICBncm91cF9ieShZLCBob3VzaW5nKSAlPiUgCiAgICAgICAgIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIAogICAgICAgICB1bmdyb3VwKCksIAogICAgICAgYWVzKHggPSBZLCB5ID0gY291bnQsIGZpbGwgPSBob3VzaW5nKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdW50KSwgCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCAKICAgICAgICAgICAgdmp1c3QgPSAtMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDMuNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgw4FwIGThu6VuZyBtw6B1IHTDuXkgY2jhu4luaAogIGxhYnMoCiAgICB0aXRsZSA9ICJQaMOibiBwaOG7kWkgdMOsbmggdHLhuqFuZyB2YXkgbXVhIG5ow6AgdGhlbyBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIiwKICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmciLAogICAgeCA9ICJRdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIiwKICAgIGZpbGwgPSAiVMOsbmggdHLhuqFuZyB2YXkgbXVhIG5ow6AiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCgpgYGAKCioqSMOsbmggNS4zLiBCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHBo4bqjbiDhuqNuaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIHZheSBtdWEgbmjDoCB2w6AgcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbioqCgpIw6xuaCA1LjMgcGjhuqNuIMOhbmggbeG7kWkgcXVhbiBo4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIHZheSBtdWEgbmjDoCB2w6AgcXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbi4g4bueIG5ow7NtIGtow6FjaCBow6BuZyBraMO0bmcgZ+G7rWkgdGnhu4FuLCBwaOG6p24gbOG7m24gbMOgIG5o4buvbmcgbmfGsOG7nWkgY8OzIGtob+G6o24gdmF5IG11YSBuaMOgIHbhu5tpIDIzLjE5NSBuZ8aw4budaSwgdHJvbmcga2hpIHPhu5Ega2jDoWNoIGjDoG5nIGtow7RuZyBjw7Mga2hv4bqjbiB2YXkgbXVhIG5ow6AgbMOgIDE2LjcyNyBuZ8aw4budaS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXksIHZp4buHYyDEkWFuZyBjw7MgbeG7mXQga2hv4bqjbiB2YXkgbXVhIG5ow6AgY8OzIHRo4buDIGtoaeG6v24ga2jDoWNoIGjDoG5nIMawdSB0acOqbiB0cuG6oyBu4bujIGjGoW4gbMOgIGfhu61pIHRp4bq/dCBraeG7h20uIE5nxrDhu6NjIGzhuqFpLCDhu58gbmjDs20ga2jDoWNoIGjDoG5nIGPDsyBn4butaSB0aeG7gW4sIHThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIHZheSBtdWEgbmjDoCBjaGnhur9tIMawdSB0aOG6vyB24bubaSAzLjM1NCBuZ8aw4budaSwgY2FvIGjGoW4gcsO1IHLhu4d0IHNvIHbhu5tpIDEuOTM1IG5nxrDhu51pIGPDsyB2YXkgbXVhIG5ow6AuIMSQaeG7gXUgbsOgeSBow6BtIMO9IHLhurFuZyB2aeG7h2Mga2jDtG5nIGPDsyBraG/huqNuIG7hu6MgdmF5IG11YSBuaMOgIGPDsyB0aOG7gyB04bqhbyDEkWnhu4F1IGtp4buHbiB0aHXhuq1uIGzhu6NpIGjGoW4gY2hvIGtow6FjaCBow6BuZyB0cm9uZyB2aeG7h2MgdMOtY2ggbMWpeSB2w6AgZ+G7rWkgdGnhu4FuIHRp4bq/dCBraeG7h20gY8OzIGvhu7MgaOG6oW4uCgoKCgoqKktp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZyoqCgpgYGB7cn0KY2hpc3EudGVzdCh0YWJsZSh0aWV1bHVhbiRZLCB0aWV1bHVhbiRob3VzaW5nKSkKYGBgCgoqKkLDoGkgdG/DoW4ga2nhu4NtIMSR4buLbmgqKgoKJCQKXGxlZnRcewpcYmVnaW57YXJyYXl9e2xsfQpIXzA6ICYgXHRleHR7UXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiB2w6AgdMOsbmggdHLhuqFuZyB2YXkgbXVhIG5ow6AgbMOgIMSR4buZYyBs4bqtcH1cXApIXzE6ICYgXHRleHR7UXV54bq/dCDEkeG7i25oIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiB2w6AgdMOsbmggdHLhuqFuZyB2YXkgbXVhIG5ow6AgY8OzIG3hu5FpIGxpw6puIGjhu4d9IApcZW5ke2FycmF5fQpccmlnaHQuCiQkCk3hu6ljIMO9IG5naMSpYSA1JS4KClRhIHRo4bqleSBnacOhIHRy4buLIHBfdmFsdWUgPCAyLjJlLTE2IChiw6kgaMahbiBy4bqldCBuaGnhur91IHNvIHbhu5tpIDAuMDUpLCDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gSDAuIFbhuq15IFF1eeG6v3QgxJHhu4tuaCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gdsOgIHTDrG5oIHRy4bqhbmcgdmF5IG11YSBuaMOgIGPDsyBt4buRaSBsacOqbiBo4buHIHbhu5tpIG5oYXUuCgoKCioqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkoUmVsYXRpdmUgUmlzaykqKgoKCgpgYGB7cn0Kcmlza3JhdGlvKGczKQpgYGAKCgoKKipOaOG6rW4geMOpdDoqKiBUaGVvIGLhuqNuZyBr4bq/dCBxdeG6oywgbmjDs20ga2jDoWNoIGjDoG5nIGtow7RuZyBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gKFkgPSAibm8iKSDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgduG7m2kgUlIgPSAxLjAwMDAuIE5ow7NtIGtow6FjaCBow6BuZyBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gKFkgPSAieWVzIikgY8OzIFJSID0gMC42Mjk3LCB04bupYyBsw6AgdOG7tyBs4buHIGtow6FjaCBow6BuZyAgY8OzIHZheSBtdWEgbmjDoCB0cm9uZyBuaMOzbSBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gYuG6sW5nIGtob+G6o25nIDAuNjI5NyBs4bqnbiBzbyB24bubaSBuaMOzbSBraMO0bmcgZ+G7rWkgdGnhu4FuLiBLaG/huqNuZyDGsOG7m2MgbMaw4bujbmcgbMOgICgwLjYwNzI7MC42NTMxKSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLgoKCgoqKlThu7cgc+G7kSBjaMOqbmggKE9kZHMgcmF0aW8pKioKCmBgYHtyfQpvZGRzcmF0aW8oZzMpCgpgYGAKCioqTmjhuq1uIHjDqXQ6KiogVGhlbyBi4bqjbmcga+G6v3QgcXXhuqMsIHThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgbXVhIG5ow6AgdHJvbmcgbmjDs20ga2jDtG5nIGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBi4bqxbmcga2hv4bqjbmcgMC40MTYxIGzhuqduIHNvIHbhu5tpIG5ow7NtIGtow6FjaCBow6BuZyBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4uIEtob+G6o25nIMaw4bubYyBsxrDhu6NuZyBsw6AgKDAuMzkyMDswLjQ0MTUpIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUuCgoKCiMjIC4gxq/hu5tjIGzGsOG7o25nIG3DtCBow6xuaCBo4buTaSBxdXkKCiMjIyAuIEtp4buDbSB0cmEgxJFhIGPhu5luZyB0dXnhur9uIGNobyBk4buvIGxp4buHdQoKYGBge3J9Cgp0aWV1bHVhbiRob3VzaW5nX2JpbiA8LSBpZmVsc2UodGlldWx1YW4kaG91c2luZyA9PSAieWVzIiwgMSwgMCkKdGlldWx1YW4kbG9hbl9iaW4gPC0gaWZlbHNlKHRpZXVsdWFuJGxvYW4gPT0gInllcyIsIDEsIDApCnRpZXVsdWFuJGRlZmF1bHRfYmluIDwtIGlmZWxzZSh0aWV1bHVhbiRkZWZhdWx0ID09ICJ5ZXMiLCAxLCAwKQp0aWV1bHVhbiRZX2JpbiA8LSBpZmVsc2UodGlldWx1YW4kWSA9PSAieWVzIiwgMSwgMCkKCiMgQ2jhuqF5IG3DtCBow6xuaCBsb2dpc3RpYyB24bubaSAzIGJp4bq/biDEkeG7mWMgbOG6rXAKbW9kZWwgPC0gZ2xtKFlfYmluIH4gaG91c2luZ19iaW4gKyBsb2FuX2JpbiArIGRlZmF1bHRfYmluLCBkYXRhID0gdGlldWx1YW4sIGZhbWlseSA9IGJpbm9taWFsKQoKIyBUw61uaCBWSUYKbGlicmFyeShjYXIpCnZpZl9yZXN1bHRzIDwtIHZpZihtb2RlbCkKCiMgQ2h1eeG7g24gc2FuZyBkYXRhZnJhbWUgxJHhu4MgduG6vSBiaeG7g3UgxJHhu5MKdmlmX2RmIDwtIGRhdGEuZnJhbWUoVmFyaWFibGUgPSBuYW1lcyh2aWZfcmVzdWx0cyksIFZJRiA9IHZpZl9yZXN1bHRzKQoKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2d0aGVtZXMpCmhpZ2hfdmlmX3RocmVzaG9sZCA8LSA1CiMgVOG6oW8gYmnhu4N1IMSR4buTIFZJRiB0aOG6qW0gbeG7uSBoxqFuCmdncGxvdCh2aWZfZGYsIGFlcyh4ID0gcmVvcmRlcihWYXJpYWJsZSwgLVZJRiksIHkgPSBWSUYsIGZpbGwgPSBWSUYpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjYsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoVklGLCAyKSksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gNC41KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gaGlnaF92aWZfdGhyZXNob2xkLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICIjRDcyNjM4Iiwgc2l6ZSA9IDEuMikgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEsIHkgPSBoaWdoX3ZpZl90aHJlc2hvbGQgKyAwLjUsIGxhYmVsID0gcGFzdGUoIk5nxrDhu6FuZyA9IiwgaGlnaF92aWZfdGhyZXNob2xkKSwgCiAgICAgICAgICAgY29sb3IgPSAiI0Q3MjYzOCIsIHNpemUgPSA0LjIsIGhqdXN0ID0gMCkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIiNBNkNFRTMiLCBoaWdoID0gIiMxRjc4QjQiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjEpKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJLaeG7g20gdHJhIMSRYSBj4buZbmcgdHV54bq/biBi4bqxbmcgY2jhu4kgc+G7kSBWSUYiLAogICAgc3VidGl0bGUgPSAiQmnhu4N1IMSR4buTIHRy4buxYyBxdWFuIGhvw6EgZ2nDoSB0cuG7iyBWSUYgY+G7p2EgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCIsCiAgICB4ID0gIlTDqm4gYmnhur9uIMSR4buZYyBs4bqtcCIsCiAgICB5ID0gIkdpw6EgdHLhu4sgVklGIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9mYW1pbHkgPSAiSGVsdmV0aWNhIikgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE3LCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMDAzMzY2IiksCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTMsIGNvbG9yID0gIiM2NjY2NjYiKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzLCBmYWNlID0gImJvbGQiKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMjAsIHZqdXN0ID0gMC43LCBzaXplID0gMTEpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKQogICkKCmBgYAoKKipIw6xuaCA2LjEuIEvhur90IHF14bqjIGtp4buDbSB0cmEgxJFhIGPhu5luZyB0dXnhur9uIGPhu6dhIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCoqCgoKSMOsbmggNi4xIHRo4buDIGhp4buHbiBr4bq/dCBxdeG6oyBraeG7g20gdHJhIMSRYSBj4buZbmcgdHV54bq/biBj4bunYSBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAuIEJp4buDdSDEkeG7kyBraeG7g20gdHJhIMSRYSBj4buZbmcgdHV54bq/biBi4bqxbmcgY2jhu4kgc+G7kSBWSUYgY2hvIHRo4bqleSB04bqldCBj4bqjIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCB0cm9uZyBtw7QgaMOsbmggZ+G7k20gbG9hbl9iaW4sIGRlZmF1bHRfYmluIHbDoCBob3VzaW5nX2JpbiDEkeG7gXUgY8OzIGdpw6EgdHLhu4sgVklGIGLhurFuZyAxLCBu4bqxbSBy4bqldCB4YSBkxrDhu5tpIG5nxrDhu6FuZyBj4bqjbmggYsOhbyBwaOG7lSBiaeG6v24gbMOgIDUuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG3DtCBow6xuaCBraMO0bmcgZ+G6t3AgduG6pW4gxJHhu4EgxJFhIGPhu5luZyB0dXnhur9uLCB04bupYyBsw6AgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCBraMO0bmcgY8OzIG3hu5FpIHTGsMahbmcgcXVhbiB0dXnhur9uIHTDrW5oIMSRw6FuZyBr4buDIHbhu5tpIG5oYXUgdsOgIGPDsyB0aOG7gyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7k25nIHRo4budaSB0cm9uZyBo4buTaSBxdXkgbcOgIGtow7RuZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gxJHhu5kgdGluIGPhuq15IGPhu6dhIGPDoWMgxrDhu5tjIGzGsOG7o25nLgoKCiMjIyAuIEjhu5NpIHF1eSBjaG8gZOG7ryBsaeG7h3Ugbmjhu4sgcGjDom4KCioqTcO0IGjDrG5oIGjhu5NpIHF1eSBjaG8gYmnhur9uIMSR4buZYyBs4bqtcCBkZWZhdWx0KioKCmBgYHtyfQoKdGlldWx1YW4kZGVmYXVsdCA8LSByZWxldmVsKGFzLmZhY3Rvcih0aWV1bHVhbiRkZWZhdWx0KSwgcmVmID0gInllcyIpCmxvZ2l0X2RlZmF1bHQgPC0gZ2xtKFlfYmluIH4gZGVmYXVsdCwgZGF0YSA9IHRpZXVsdWFuLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpCgpwcm9iaXRfZGVmYXVsdDwtIGdsbShZX2JpbiB+IGRlZmF1bHQsIGRhdGEgPSB0aWV1bHVhbiwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkKCmNsb2dsb2dfZGVmYXVsdDwtIGdsbShZX2JpbiB+IGRlZmF1bHQsIGRhdGEgPSB0aWV1bHVhbiwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJjbG9nbG9nIikpCgoKCmBgYAoKCgpgYGB7cn0KbGlicmFyeShzdGFyZ2F6ZXIpCnN0YXJnYXplcihsb2dpdF9kZWZhdWx0LCBwcm9iaXRfZGVmYXVsdCwgY2xvZ2xvZ19kZWZhdWx0LAogICAgICAgICAgdHlwZSA9ICJ0ZXh0IiwgICMgaG/hurdjICJodG1sIiwgImxhdGV4IgogICAgICAgICAgdGl0bGUgPSAiU28gc8OhbmggMyBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIiwKICAgICAgICAgIGNvbHVtbi5sYWJlbHMgPSBjKCJMb2dpdCIsICJQcm9iaXQiLCAiQ2xvZ2xvZyIpLAogICAgICAgICAgZGVwLnZhci5sYWJlbHMgPSAiWV9iaW4iLAogICAgICAgICAgYWxpZ24gPSBUUlVFLCAKICAgICAgICAgIG5vLnNwYWNlID0gVFJVRSwKICAgICAgICAgIGRpZ2l0cyA9IDQpCgpgYGAKClThu6sgYuG6o25nIHRo4buRbmcga8OqIGvhur90IHF14bqjIG3DtCBow6xuaCBo4buTaSBxdXksIHRhIGPDsyBuaMawIHNhdQoKKipNw7QgaMOsbmggaOG7k2kgcXV5IExvZ2l0KioKCiQkClxoYXR7XHBpfSA9IFxmcmFjezF9ezEgKyBcZXhwKC0oLTIuNjg2MCArIDAuNjc0MSBcY2RvdCBcdGV4dHtkZWZhdWx0fV97XHRleHR7bm99fSkpfQokJAotIEjhu4cgc+G7kSBjaOG6t24gJFxoYXR7XGJldGF9XzAgPSAtMi42ODYwJCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBraGkgcC12YWx1ZSBuaOG7jyBoxqFuIDAuMDUuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBraGkga2jDoWNoIGjDoG5nIHRodeG7mWMgbmjDs20gdGhhbSBjaGnhur91ICh04bupYyBsw6AgZGVmYXVsdCA9ICJ5ZXMiLCBjw7MgbuG7oyB44bqldSksIHRow6wgbG9naXQgKGxvZyBvZGRzKSDEkcSDbmcga8O9IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBsw6AgJC0yLjY4NjAkLgoKLSBI4buHIHPhu5EgJFxoYXR7XGJldGF9XzEgPSAwLjY3NDEkIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGtoaSBwLXZhbHVlIG5o4buPIGjGoW4gMC4wNS4gSOG7hyBz4buRIG7DoHkgdGjhu4MgaGnhu4duIG3hu6ljIGNow6puaCBs4buHY2ggbG9naXQgZ2nhu69hIG5ow7NtIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIG7hu6MgeOG6pXUgKGRlZmF1bHQgPSAibm8iKSB2w6AgbmjDs20gY8OzIG7hu6MgeOG6pXUgKGRlZmF1bHQgPSAieWVzIikuIEPhu6UgdGjhu4MsIGtoaSBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgbG9nIG9kZHMgxJHEg25nIGvDvSBn4butaSB0aeG7gW4gY+G7p2Ega2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgbuG7oyB44bqldSBjYW8gaMahbiAwLjY3NDEgxJHGoW4gduG7iyBzbyB24bubaSBraMOhY2ggaMOgbmcgY8OzIG7hu6MgeOG6pXUuCgoKCioqTcO0IGjDrG5oIGjhu5NpIHF1eSBQcm9iaXQqKgoKCiQkClxoYXR7XHBpfSA9IFxQaGkoLTEuNTIzNiArICAwLjMzODQgXGNkb3QgXHRleHR7ZGVmYXVsdH1fe1x0ZXh0e25vfX0pCiQkCgotIEjhu4cgc+G7kSBjaOG6t24gJFxoYXR7XGJldGF9XzAgPSAtMS41MjM2JCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBraGkgcC12YWx1ZSBuaOG7jyBoxqFuIDAuMDUuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBraGkga2jDoWNoIGjDoG5nIHRodeG7mWMgbmjDs20gdGhhbSBjaGnhur91ICh04bupYyBsw6AgZGVmYXVsdCA9ICJ5ZXMiLCBjw7MgbuG7oyB44bqldSksIHRow6wgeMOhYyBzdeG6pXQgxJHEg25nIGvDvSBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gbMOgICRcUGhpKC0xLjUyMzYpJC4KCi0gSOG7hyBz4buRICRcaGF0e1xiZXRhfV8xID0gMC4zMzg0JCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGtoaSBwLXZhbHVlIG5o4buPIGjGoW4gMC4wNS4gSOG7hyBz4buRIG7DoHkgdGjhu4MgaGnhu4duIG3hu6ljIGNow6puaCBs4buHY2ggduG7gSBnacOhIHRy4buLIGjDoG0gJFxQaGkoXGNkb3QpJCBnaeG7r2EgbmjDs20ga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgbuG7oyB44bqldSB2w6AgbmjDs20ga2jDoWNoIGjDoG5nIGPDsyBu4bujIHjhuqV1LiBD4bulIHRo4buDLCBraGkgY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWksIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBj4bunYSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBu4bujIHjhuqV1IGNhbyBoxqFuICRcUGhpKDAuMzM4NCkkIHNvIHbhu5tpIHBo4bqnbiB4w6FjIHN14bqldCBn4buRYyB04burIG5ow7NtIGPDsyBu4bujIHjhuqV1LgoKCioqTcO0IGjDrG5oIGjhu5NpIHF1eSBDbG9nbG9nKioKCiQkClxoYXR7XHBpfSA9IDEgLSBcZXhwXGxlZnQoLVxleHAoLTIuNzE5MiArICAgMC42NDM5IFxjZG90IFx0ZXh0e2RlZmF1bHR9X3tcdGV4dHtub319KVxyaWdodCkKJCQKCgotIEjhu4cgc+G7kSBjaOG6t24gJFxoYXR7XGJldGF9XzAgPSAtMi43MTkyJCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLCBuZ2jEqWEgbMOgIG7hur91IG3hu5l0IGtow6FjaCBow6BuZyBjw7MgbuG7oyB44bqldSAoZGVmYXVsdCA9ICJ5ZXMiKSwgZ2nDoSB0cuG7iyBiaeG6v24gbGnDqm4ga+G6v3QgzrcgcuG6pXQgw6JtLCBk4bqrbiDEkeG6v24geMOhYyBzdeG6pXQgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIOG7nyBt4bupYyBy4bqldCB0aOG6pXAuCgotIEjhu4cgc+G7kSAkXGhhdHtcYmV0YX1fMSA9IDAuNjQzOSQgY8WpbmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gS2hpIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIG7hu6MgeOG6pXUgKGRlZmF1bHQgPSAibm8iKSwgZ2nDoSB0cuG7iyDOtyB0xINuZyAwLjY0MzkgxJHGoW4gduG7iyBzbyB24bubaSBuaMOzbSBjw7MgbuG7oyB44bqldSwga8OpbyB0aGVvIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBjYW8gaMahbiwgdsOsIGjhu4cgc+G7kSBkxrDGoW5nIHBo4bqjbiDDoW5oIHTDoWMgxJHhu5luZyB0w61jaCBj4buxYyDEkeG6v24ga2jhuqMgbsSDbmcgZ+G7rWkgdGnhu4FuLgoKCgpgYGB7cn0KbmV3ZCA8LWRhdGEuZnJhbWUoZGVmYXVsdCA9IGMoInllcyIsICJubyIpKQpwcmVkaWN0KGxvZ2l0X2RlZmF1bHQsIG5ld2RhdGEgPSBuZXdkLCB0eXBlID0gInJlc3BvbnNlIikKcHJlZGljdChwcm9iaXRfZGVmYXVsdCwgbmV3ZGF0YSA9IG5ld2QsIHR5cGUgPSAicmVzcG9uc2UiKQpwcmVkaWN0KGNsb2dsb2dfZGVmYXVsdCwgbmV3ZGF0YSA9IG5ld2QsIHR5cGUgPSAicmVzcG9uc2UiKQpgYGAKROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBk4buxIGLDoW8gdOG7qyBiYSBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIChsb2dpdCwgcHJvYml0IHbDoCBjbG9nbG9nKSwgdGEgbmjhuq1uIHRo4bqleSBy4bqxbmcgeMOhYyBzdeG6pXQgdHLhu58gdGjDoG5oIGtow6FjaCBow6BuZyBn4butaSB0aeG6v3Qga2nhu4dtIGPDsyBr4buzIGjhuqFuIChZID0geWVzKSDEkeG7kWkgduG7m2kgbmjDs20gY8OzIG7hu6MgcXXDoSBo4bqhbiAoZGVmYXVsdCA9ICJ5ZXMiKSB4w6FjIHN14bqldCBuw6B5IGNo4buJIGtob+G6o25nIDYuMzglLCB0cm9uZyBraGkgduG7m2kgbmjDs20ga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgbuG7oyBxdcOhIGjhuqFuIChkZWZhdWx0ID0gIm5vIikgZGFvIMSR4buZbmcga2hv4bqjbmcgMTEuODAlCgpN4bq3YyBkw7kga+G6v3QgcXXhuqMgZOG7sSBiw6FvIGPDsyBz4buxIGtow6FjIGJp4buHdCBy4bqldCBuaOG7jyBnaeG7r2EgYmEgbcO0IGjDrG5oLCBuaMawbmcgduG7gSBt4bq3dCB4dSBoxrDhu5tuZywgY+G6oyBiYSDEkeG7gXUgY2hvIHRo4bqleTogbmjhu69uZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBu4bujIHF1w6EgaOG6oW4gY8OzIGto4bqjIG7Eg25nIMSRxINuZyBrw70gZ+G7rWkgdGnhur90IGtp4buHbSBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaMOzbSBjw7JuIGzhuqFpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBiaeG6v24gZGVmYXVsdCBjw7Mg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IMSR4bq/biBow6BuaCB2aSBn4butaSB0aeG6v3Qga2nhu4dtOiBjw6FjIG5nw6JuIGjDoG5nIGPDsyB0aOG7gyDGsHUgdGnDqm4gdGnhur9wIGPhuq1uIG5o4buvbmcga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgbuG7oyBxdcOhIGjhuqFuIMSR4buDIGdpYSB0xINuZyB04bu3IGzhu4cgdGjDoG5oIGPDtG5nIGtoaSBjaMOgbyBt4budaSBz4bqjbiBwaOG6qW0gdGnhur90IGtp4buHbS4KCgoKKipNw7QgaMOsbmggaOG7k2kgcXV5IGNobyBiaeG6v24gxJHhu5ljIGzhuq1wIGxvYW4qKgoKYGBge3J9CnRpZXVsdWFuJGxvYW4gPC0gcmVsZXZlbChhcy5mYWN0b3IodGlldWx1YW4kbG9hbiksIHJlZiA9ICJ5ZXMiKQpsb2dpdF9sb2FuIDwtIGdsbShZX2JpbiB+IGxvYW4sIGRhdGEgPSB0aWV1bHVhbiwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQoKcHJvYml0X2xvYW4gPC0gZ2xtKFlfYmluIH4gbG9hbiwgZGF0YSA9IHRpZXVsdWFuLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpKQoKY2xvZ2xvZ19sb2FuIDwtIGdsbShZX2JpbiB+IGxvYW4sIGRhdGEgPSB0aWV1bHVhbiwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJjbG9nbG9nIikpCgoKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KHN0YXJnYXplcikKc3RhcmdhemVyKGxvZ2l0X2xvYW4sIHByb2JpdF9sb2FuLCBjbG9nbG9nX2xvYW4sCiAgICAgICAgICB0eXBlID0gInRleHQiLCAgIyBob+G6t2MgImh0bWwiLCAibGF0ZXgiCiAgICAgICAgICB0aXRsZSA9ICJTbyBzw6FuaCAzIG3DtCBow6xuaCBo4buTaSBxdXkgbmjhu4sgcGjDom4iLAogICAgICAgICAgY29sdW1uLmxhYmVscyA9IGMoIkxvZ2l0IiwgIlByb2JpdCIsICJDbG9nbG9nIiksCiAgICAgICAgICBkZXAudmFyLmxhYmVscyA9ICJZX2JpbiIsCiAgICAgICAgICBhbGlnbiA9IFRSVUUsIAogICAgICAgICAgbm8uc3BhY2UgPSBUUlVFLAogICAgICAgICAgZGlnaXRzID0gNCkKCmBgYAoKClThu6sgYuG6o25nIHRo4buRbmcga8OqIGvhur90IHF14bqjIG3DtCBow6xuaCBo4buTaSBxdXksIHRhIGPDsyBuaMawIHNhdQoKKipNw7QgaMOsbmggaOG7k2kgcXV5IExvZ2l0KioKCiQkClxoYXR7XHBpfSA9IFxmcmFjezF9ezEgKyBcZXhwKC0oLTIuNjM2NyArIDAuNzA0OSBcY2RvdCBcdGV4dHtsb2FufV97XHRleHR7bm99fSkpfQokJAotIEjhu4cgc+G7kSBjaOG6t24gJFxoYXR7XGJldGF9XzAgPSAtMi42MzY3JCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBraGkgcC12YWx1ZSBuaOG7jyBoxqFuIDAuMDUuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBraGkga2jDoWNoIGjDoG5nIHRodeG7mWMgbmjDs20gdGhhbSBjaGnhur91ICh04bupYyBsw6AgbG9hbiA9ICJ5ZXMiLCBjw7MgdmF5IHRpw6p1IGTDuW5nKSwgdGjDrCBsb2dpdCAobG9nIG9kZHMpIMSRxINuZyBrw70gZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIGzDoCAkLTIuNjM2NyQuCgotIEjhu4cgc+G7kSAkXGhhdHtcYmV0YX1fMSA9IDAuNzA0OSQgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oga2hpIHAtdmFsdWUgbmjhu48gaMahbiAwLjA1LiBI4buHIHPhu5EgbsOgeSB0aOG7gyBoaeG7h24gbeG7qWMgY2jDqm5oIGzhu4djaCBsb2dpdCBnaeG7r2EgbmjDs20ga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgdmF5IHRpw6p1IGTDuW5nIChsb2FuID0gIm5vIikgdsOgIG5ow7NtIGPDsyB2YXkgdGnDqnUgZMO5bmcgKGxvYW4gPSAieWVzIikuIEPhu6UgdGjhu4MsIGtoaSBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgbG9nIG9kZHMgxJHEg25nIGvDvSBn4butaSB0aeG7gW4gY+G7p2Ega2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgdmF5IHRpw6p1IGTDuW5nIGNhbyBoxqFuIDAuNzA0OSDEkcahbiB24buLIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjw7MgdmF5IHRpw6p1IGTDuW5nLgoKCgoqKk3DtCBow6xuaCBo4buTaSBxdXkgUHJvYml0KioKCgokJApcaGF0e1xwaX0gPSBcUGhpKC0xLjQ5OTkgKyAgMC4zNTcxIFxjZG90IFx0ZXh0e2xvYW59X3tcdGV4dHtub319KQokJAoKLSBI4buHIHPhu5EgY2jhurduICRcaGF0e1xiZXRhfV8wID0gLTEuNDk5OSQgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oga2hpIHAtdmFsdWUgbmjhu48gaMahbiAwLjA1LiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6Aga2hpIGtow6FjaCBow6BuZyB0aHXhu5ljIG5ow7NtIHRoYW0gY2hp4bq/dSAodOG7qWMgbMOgIGxvYW4gPSAieWVzIiwgY8OzIHZheSB0acOqdSBkw7luZyksIHRow6wgeMOhYyBzdeG6pXQgxJHEg25nIGvDvSBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gbMOgICRcUGhpKC0xLjQ5OTkpLgoKLSBI4buHIHPhu5EgJFxoYXR7XGJldGF9XzEgPSAwLjM1NzEkIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oga2hpIHAtdmFsdWUgbmjhu48gaMahbiAwLjA1LiBI4buHIHPhu5EgbsOgeSB0aOG7gyBoaeG7h24gbeG7qWMgY2jDqm5oIGzhu4djaCB24buBIGdpw6EgdHLhu4sgaMOgbSAkXFBoaShcY2RvdCkkIGdp4buvYSBuaMOzbSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcgdsOgIG5ow7NtIGtow6FjaCBow6BuZyBjw7MgdmF5IHRpw6p1IGTDuW5nLiBD4bulIHRo4buDLCBraGkgY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWksIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBj4bunYSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcgY2FvIGjGoW4gJFxQaGkoMC4zNTcxKSQgc28gduG7m2kgcGjhuqduIHjDoWMgc3XhuqV0IGfhu5FjIHThu6sgbmjDs20gY8OzIHZheSB0acOqdSBkw7luZy4KCgoKCioqTcO0IGjDrG5oIGjhu5NpIHF1eSBDbG9nbG9nKioKCgokJApcaGF0e1xwaX0gPSAxIC0gXGV4cFxsZWZ0KC1cZXhwKC0yLjY3MTUgKyAgMC42NzEzIFxjZG90IFx0ZXh0e2xvYW59X3tcdGV4dHtub319KVxyaWdodCkKJCQKCgotIEjhu4cgc+G7kSBjaOG6t24gJFxoYXR7XGJldGF9XzAgPSAtMi42NzE1JCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiwgbmdoxKlhIGzDoCBu4bq/dSBt4buZdCBraMOhY2ggaMOgbmcgY8OzIHZheSB0acOqdSBkw7luZyAobG9hbiA9ICJ5ZXMiKSwgZ2nDoSB0cuG7iyBiaeG6v24gbGnDqm4ga+G6v3QgzrcgcuG6pXQgw6JtLCBk4bqrbiDEkeG6v24geMOhYyBzdeG6pXQgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIOG7nyBt4bupYyBy4bqldCB0aOG6pXAuCgotIEjhu4cgc+G7kSAkXGhhdHtcYmV0YX1fMSA9IDAuNjcxMyQgY8WpbmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gS2hpIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIHZheSB0acOqdSBkw7luZyAobG9hbiA9ICJubyIpLCBnacOhIHRy4buLIM63IHTEg25nIDAuNjcxMyDEkcahbiB24buLIHNvIHbhu5tpIG5ow7NtIGPDsyB2YXkgdGnDqnUgZMO5bmcsIGvDqW8gdGhlbyB4w6FjIHN14bqldCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gY2FvIGjGoW4sIHbDrCBo4buHIHPhu5EgZMawxqFuZyBwaOG6o24gw6FuaCB0w6FjIMSR4buZbmcgdMOtY2ggY+G7sWMgxJHhur9uIGto4bqjIG7Eg25nIGfhu61pIHRp4buBbi4KCgoKYGBge3J9Cm5ld2wgPC1kYXRhLmZyYW1lKGxvYW4gPSBjKCJ5ZXMiLCAibm8iKSkKcHJlZGljdChsb2dpdF9sb2FuLCBuZXdkYXRhID0gbmV3bCwgdHlwZSA9ICJyZXNwb25zZSIpCnByZWRpY3QocHJvYml0X2xvYW4sIG5ld2RhdGEgPSBuZXdsLCB0eXBlID0gInJlc3BvbnNlIikKcHJlZGljdChjbG9nbG9nX2xvYW4sIG5ld2RhdGEgPSBuZXdsLCB0eXBlID0gInJlc3BvbnNlIikKYGBgCgpE4buxYSB2w6BvIGvhur90IHF14bqjIGThu7EgYsOhbyB04burIGJhIG3DtCBow6xuaCBo4buTaSBxdXkgbmjhu4sgcGjDom4gKGxvZ2l0LCBwcm9iaXQgdsOgIGNsb2dsb2cpLCB0YSBuaOG6rW4gdGjhuqV5IHLhurFuZyB4w6FjIHN14bqldCB0cuG7nyB0aMOgbmgga2jDoWNoIGjDoG5nIGfhu61pIHRp4bq/dCBraeG7h20gY8OzIGvhu7MgaOG6oW4gKFkgPSB5ZXMpIMSR4buRaSB24bubaSBuaMOzbSBjw7MgdmF5IHRpw6p1IGTDuW5nIChsb2FuID0gInllcyIpIHjDoWMgc3XhuqV0IG7DoHkgY2jhu4kga2hv4bqjbmcgNi42OCUsIHRyb25nIGtoaSB24bubaSBuaMOzbSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcgKGxvYW4gPSAibm8iKSBkYW8gxJHhu5luZyBraG/huqNuZyAxMi42NiUKCk3hurdjIGTDuSBr4bq/dCBxdeG6oyBk4buxIGLDoW8gY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHLhuqV0IG5o4buPIGdp4buvYSBiYSBtw7QgaMOsbmgsIG5oxrBuZyB24buBIG3hurd0IHh1IGjGsOG7m25nLCBj4bqjIGJhIMSR4buBdSBjaG8gdGjhuqV5OiBuaOG7r25nIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIHZheSB0acOqdSBkw7luZyBjw7Mga2jhuqMgbsSDbmcgxJHEg25nIGvDvSBn4butaSB0aeG6v3Qga2nhu4dtIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5ow7NtIGPDsm4gbOG6oWkuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGJp4bq/biBsb2FuIGPDsyDhuqNuaCBoxrDhu59uZyByw7UgcuG7h3QgxJHhur9uIGjDoG5oIHZpIGfhu61pIHRp4bq/dCBraeG7h206IGPDoWMgbmfDom4gaMOgbmcgY8OzIHRo4buDIMawdSB0acOqbiB0aeG6v3AgY+G6rW4gbmjhu69uZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcgxJHhu4MgZ2lhIHTEg25nIHThu7cgbOG7hyB0aMOgbmggY8O0bmcga2hpIGNow6BvIG3hu51pIHPhuqNuIHBo4bqpbSB0aeG6v3Qga2nhu4dtLgoKCioqTcO0IGjDrG5oIGjhu5NpIHF1eSBjaG8gYmnhur9uIMSR4buZYyBs4bqtcCBob3VzaW5nKioKCgpgYGB7cn0KdGlldWx1YW4kaG91c2luZyA8LSByZWxldmVsKGFzLmZhY3Rvcih0aWV1bHVhbiRob3VzaW5nKSwgcmVmID0gInllcyIpCmxvZ2l0X2hvdXNpbmcgPC0gZ2xtKFlfYmluIH4gaG91c2luZywgZGF0YSA9IHRpZXVsdWFuLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpCgpwcm9iaXRfaG91c2luZyA8LSBnbG0oWV9iaW4gfiBob3VzaW5nLCBkYXRhID0gdGlldWx1YW4sIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpCgpjbG9nbG9nX2hvdXNpbmcgPC0gZ2xtKFlfYmluIH4gaG91c2luZywgZGF0YSA9IHRpZXVsdWFuLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImNsb2dsb2ciKSkKCgpgYGAKCgoKYGBge3J9CmxpYnJhcnkoc3RhcmdhemVyKQpzdGFyZ2F6ZXIobG9naXRfaG91c2luZywgcHJvYml0X2hvdXNpbmcsIGNsb2dsb2dfaG91c2luZywKICAgICAgICAgIHR5cGUgPSAidGV4dCIsICAjIGhv4bq3YyAiaHRtbCIsICJsYXRleCIKICAgICAgICAgIHRpdGxlID0gIlNvIHPDoW5oIDMgbcO0IGjDrG5oIGjhu5NpIHF1eSBuaOG7iyBwaMOibiIsCiAgICAgICAgICBjb2x1bW4ubGFiZWxzID0gYygiTG9naXQiLCAiUHJvYml0IiwgIkNsb2dsb2ciKSwKICAgICAgICAgIGRlcC52YXIubGFiZWxzID0gIllfYmluIiwKICAgICAgICAgIGFsaWduID0gVFJVRSwgCiAgICAgICAgICBuby5zcGFjZSA9IFRSVUUsCiAgICAgICAgICBkaWdpdHMgPSA0KQoKYGBgCgoKClThu6sgYuG6o25nIHRo4buRbmcga8OqIGvhur90IHF14bqjIG3DtCBow6xuaCBo4buTaSBxdXksIHRhIGPDsyBuaMawIHNhdQoKKipNw7QgaMOsbmggaOG7k2kgcXV5IExvZ2l0KioKCiQkClxoYXR7XHBpfSA9IFxmcmFjezF9ezEgKyBcZXhwKC0oLTIuNDgzOCArIDAuODc3MCBcY2RvdCBcdGV4dHtob3VzaW5nfV97XHRleHR7bm99fSkpfQokJAotIEjhu4cgc+G7kSBjaOG6t24gJFxoYXR7XGJldGF9XzAgPSAtMi40ODM4JCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBraGkgcC12YWx1ZSBuaOG7jyBoxqFuIDAuMDUuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBraGkga2jDoWNoIGjDoG5nIHRodeG7mWMgbmjDs20gdGhhbSBjaGnhur91ICh04bupYyBsw6AgaG91c2luZyA9ICJ5ZXMiLCBjw7MgdmF5IG11YSBuaMOgKSwgdGjDrCBsb2dpdCAobG9nIG9kZHMpIMSRxINuZyBrw70gZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIGzDoCAkLTIuNDgzOCQuCgotIEjhu4cgc+G7kSAkXGhhdHtcYmV0YX1fMSA9IDAuODc3MCQgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oga2hpIHAtdmFsdWUgbmjhu48gaMahbiAwLjA1LiBI4buHIHPhu5EgbsOgeSB0aOG7gyBoaeG7h24gbeG7qWMgY2jDqm5oIGzhu4djaCBsb2dpdCBnaeG7r2EgbmjDs20ga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgdmF5IG11YSBuaMOgIChob3VzaW5nID0gIm5vIikgdsOgIG5ow7NtIGPDsyB2YXkgbXVhIG5ow6AgKGhvdXNpbmcgPSAieWVzIikuIEPhu6UgdGjhu4MsIGtoaSBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgbG9nIG9kZHMgxJHEg25nIGvDvSBn4butaSB0aeG7gW4gY+G7p2Ega2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgdmF5IG11YSBuaMOgIGNhbyBoxqFuIDAuODc3MCDEkcahbiB24buLIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjw7MgdmF5IG11YSBuaMOgLgoKKipNw7QgaMOsbmggaOG7k2kgcXV5IFByb2JpdCoqCgokJApcaGF0e1xwaX0gPSBcUGhpKC0xLjQyNTUgKyAwLjQ1OTYgXGNkb3QgXHRleHR7aG91c2luZ31fe1x0ZXh0e25vfX0pCiQkCgotIEjhu4cgc+G7kSBjaOG6t24gJFxoYXR7XGJldGF9XzAgPSAtMS40MjU1JCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBraGkgcC12YWx1ZSBuaOG7jyBoxqFuIDAuMDUuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBraGkga2jDoWNoIGjDoG5nIHRodeG7mWMgbmjDs20gdGhhbSBjaGnhur91ICh04bupYyBsw6AgaG91c2luZyA9ICJ5ZXMiLCBjw7MgdmF5IG11YSBuaMOgKSwgdGjDrCB4w6FjIHN14bqldCDEkcSDbmcga8O9IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBsw6AgJFxQaGkoLTEuNDI1NSkkLgoKLSBI4buHIHPhu5EgJFxoYXR7XGJldGF9XzEgPSAwLjQ1OTYkIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oga2hpIHAtdmFsdWUgbmjhu48gaMahbiAwLjA1LiBI4buHIHPhu5EgbsOgeSB0aOG7gyBoaeG7h24gbeG7qWMgY2jDqm5oIGzhu4djaCB24buBIGdpw6EgdHLhu4sgaMOgbSAkXFBoaShcY2RvdCkkIGdp4buvYSBuaMOzbSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgbXVhIG5ow6AgdsOgIG5ow7NtIGtow6FjaCBow6BuZyBjw7MgdmF5IG11YSBuaMOgLiBD4bulIHRo4buDLCBraGkgY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWksIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBj4bunYSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgbXVhIG5ow6AgY2FvIGjGoW4gJFxQaGkoMC40NTk2KSQgc28gduG7m2kgcGjhuqduIHjDoWMgc3XhuqV0IGfhu5FjIHThu6sgbmjDs20gY8OzIHZheSBtdWEgbmjDoC4KCgoqKk3DtCBow6xuaCBo4buTaSBxdXkgQ2xvZ2xvZyoqCgoKJCQKXGhhdHtccGl9ID0gMSAtIFxleHBcbGVmdCgtXGV4cCgtMi41MjQyICsgMC44MjQ1IFxjZG90IFx0ZXh0e2hvdXNpbmd9X3tcdGV4dHtub319KVxyaWdodCkKJCQKCgotIEjhu4cgc+G7kSBjaOG6t24gJFxoYXR7XGJldGF9XzAgPSAtMi41MjQyJCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLCBuZ2jEqWEgbMOgIG7hur91IG3hu5l0IGtow6FjaCBow6BuZyBjw7MgdmF5IG11YSBuaMOgIChob3VzaW5nID0gInllcyIpLCBnacOhIHRy4buLIGJp4bq/biBsacOqbiBr4bq/dCDOtyBy4bqldCDDom0sIGThuqtuIMSR4bq/biB4w6FjIHN14bqldCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4g4bufIG3hu6ljIHLhuqV0IHRo4bqlcC4KCi0gSOG7hyBz4buRICRcaGF0e1xiZXRhfV8xID0gMC44MjQ1JCBjxaluZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiBLaGkga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgdmF5IG11YSBuaMOgIChob3VzaW5nID0gIm5vIiksIGdpw6EgdHLhu4sgzrcgdMSDbmcgMC44MjQ1IMSRxqFuIHbhu4sgc28gduG7m2kgbmjDs20gY8OzIHZheSBtdWEgbmjDoCwga8OpbyB0aGVvIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBjYW8gaMahbiwgdsOsIGjhu4cgc+G7kSBkxrDGoW5nIHBo4bqjbiDDoW5oIHTDoWMgxJHhu5luZyB0w61jaCBj4buxYyDEkeG6v24ga2jhuqMgbsSDbmcgZ+G7rWkgdGnhu4FuLgoKCgoKCmBgYHtyfQpuZXdoIDwtZGF0YS5mcmFtZShob3VzaW5nID0gYygieWVzIiwgIm5vIikpCnByZWRpY3QobG9naXRfaG91c2luZywgbmV3ZGF0YSA9IG5ld2gsIHR5cGUgPSAicmVzcG9uc2UiKQpwcmVkaWN0KHByb2JpdF9ob3VzaW5nLCBuZXdkYXRhID0gbmV3aCwgdHlwZSA9ICJyZXNwb25zZSIpCnByZWRpY3QoY2xvZ2xvZ19ob3VzaW5nLCBuZXdkYXRhID0gbmV3aCwgdHlwZSA9ICJyZXNwb25zZSIpCmBgYAoKROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBk4buxIGLDoW8gdOG7qyBiYSBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIChsb2dpdCwgcHJvYml0IHbDoCBjbG9nbG9nKSwgdGEgbmjhuq1uIHRo4bqleSBy4bqxbmcgeMOhYyBzdeG6pXQgdHLhu58gdGjDoG5oIGtow6FjaCBow6BuZyBn4butaSB0aeG6v3Qga2nhu4dtIGPDsyBr4buzIGjhuqFuIChZID0geWVzKSDEkeG7kWkgduG7m2kgbmjDs20gY8OzIHZheSBtdWEgbmjDoCAoaG91c2luZyA9ICJ5ZXMiKSB4w6FjIHN14bqldCBuw6B5IGNo4buJIGtob+G6o25nIDcuNjklLCB0cm9uZyBraGkgduG7m2kgbmjDs20ga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgdmF5IG11YSBuaMOgIChob3VzaW5nID0gIm5vIikgZGFvIMSR4buZbmcga2hv4bqjbmcgMTYuNzAlCgpN4bq3YyBkw7kga+G6v3QgcXXhuqMgZOG7sSBiw6FvIGPDsyBz4buxIGtow6FjIGJp4buHdCBy4bqldCBuaOG7jyBnaeG7r2EgYmEgbcO0IGjDrG5oLCBuaMawbmcgduG7gSBt4bq3dCB4dSBoxrDhu5tuZywgY+G6oyBiYSDEkeG7gXUgY2hvIHRo4bqleTogbmjhu69uZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2YXkgbXVhIG5ow6AgY8OzIGto4bqjIG7Eg25nIMSRxINuZyBrw70gZ+G7rWkgdGnhur90IGtp4buHbSBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaMOzbSBjw7JuIGzhuqFpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBiaeG6v24gaG91c2luZyBjw7Mg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IMSR4bq/biBow6BuaCB2aSBn4butaSB0aeG6v3Qga2nhu4dtOiBjw6FjIG5nw6JuIGjDoG5nIGPDsyB0aOG7gyDGsHUgdGnDqm4gdGnhur9wIGPhuq1uIG5o4buvbmcga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgdmF5IG11YSBuaMOgIMSR4buDIGdpYSB0xINuZyB04bu3IGzhu4cgdGjDoG5oIGPDtG5nIGtoaSBjaMOgbyBt4budaSBz4bqjbiBwaOG6qW0gdGnhur90IGtp4buHbS4KCgoKIyMjIC4gSOG7k2kgcXV5IMSRYSBiaeG6v24KCgpgYGB7cn0KbG9naXRfbW9kZWwgPC0gZ2xtKFlfYmluIH4gZGVmYXVsdCArIGxvYW4gKyBob3VzaW5nLCBkYXRhID0gdGlldWx1YW4sIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkKCnByb2JpdF9tb2RlbCA8LSBnbG0oWV9iaW4gfiBkZWZhdWx0ICsgbG9hbiArIGhvdXNpbmcsIGRhdGEgPSB0aWV1bHVhbiwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkKCmNsb2dsb2dfbW9kZWwgPC0gZ2xtKFlfYmluIH4gZGVmYXVsdCArIGxvYW4gKyBob3VzaW5nLCBkYXRhID0gdGlldWx1YW4sIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpKQoKCmBgYAoKCgpgYGB7cn0KbGlicmFyeShzdGFyZ2F6ZXIpCnN0YXJnYXplcihsb2dpdF9tb2RlbCwgcHJvYml0X21vZGVsLCBjbG9nbG9nX21vZGVsLAogICAgICAgICAgdHlwZSA9ICJ0ZXh0IiwgICMgaG/hurdjICJodG1sIiwgImxhdGV4IgogICAgICAgICAgdGl0bGUgPSAiU28gc8OhbmggMyBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIiwKICAgICAgICAgIGNvbHVtbi5sYWJlbHMgPSBjKCJMb2dpdCIsICJQcm9iaXQiLCAiQ2xvZ2xvZyIpLAogICAgICAgICAgZGVwLnZhci5sYWJlbHMgPSAiWV9iaW4iLAogICAgICAgICAgYWxpZ24gPSBUUlVFLCAKICAgICAgICAgIG5vLnNwYWNlID0gVFJVRSwKICAgICAgICAgIGRpZ2l0cyA9IDQpCgpgYGAKCgpU4burIGLhuqNuZyB0aOG7kW5nIGvDqiBr4bq/dCBxdeG6oyBtw7QgaMOsbmggaOG7k2kgcXV5LCB0YSBjw7MgbmjGsCBzYXUKCioqTcO0IGjDrG5oIGjhu5NpIHF1eSBMb2dpdCoqCgoKJCQKXGhhdHtccGl9ID0gXGZyYWN7MX17MSArIFxleHBcbGVmdFstXGxlZnQoLTMuNjA1NiArIDAuNTY3NSBcY2RvdCBkZWZhdWx0XF9ubyArIDAuNjUxNSBcY2RvdCBsb2FuXF9ubyArIDAuODY0MyBcY2RvdCBob3VzaW5nXF9ub1xyaWdodClccmlnaHRdfQokJAotIEjhu4cgc+G7kSBjaOG6t24gJFxoYXR7XGJldGF9XzAgPSAtMy42MDU2JCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBu4bq/dSBwLXZhbHVlIG5o4buPIGjGoW4gMC4wNS4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGtoaSBraMOhY2ggaMOgbmcgdGh14buZYyBuaMOzbSB0aGFtIGNoaeG6v3UgKGPhu6UgdGjhu4MgbMOgOiBkZWZhdWx0ID0gInllcyIsIGxvYW4gPSAieWVzIiwgaG91c2luZyA9ICJ5ZXMiKSwgdGjDrCBsb2dpdCAodOG7qWMgbMOgIGxvZyBvZGRzKSBj4bunYSB4w6FjIHN14bqldCDEkcSDbmcga8O9IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBsw6AgJC0zLjYwNTYkLgoKLSBI4buHIHPhu5EgJFxoYXR7XGJldGF9XzEgPSAwLjU2NzUkIGPhu6dhIGJp4bq/biBkZWZhdWx0X25vIHRo4buDIGhp4buHbiBt4bupYyBjaMOqbmggbOG7h2NoIGxvZ2l0IGdp4buvYSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBu4bujIHjhuqV1IChkZWZhdWx0ID0gIm5vIikgdsOgIGtow6FjaCBow6BuZyBjw7MgbuG7oyB44bqldSAoZGVmYXVsdCA9ICJ5ZXMiKS4gS2hpIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBsb2cgb2RkcyDEkcSDbmcga8O9IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBj4bunYSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBu4bujIHjhuqV1IGNhbyBoxqFuIDAuNTY3NSDEkcahbiB24buLIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjw7MgbuG7oyB44bqldS4KCi0gSOG7hyBz4buRICRcaGF0e1xiZXRhfV8yID0gMC42NTE1JCBj4bunYSBiaeG6v24gbG9hbl9ubyB0aOG7gyBoaeG7h24gbeG7qWMgY2jDqm5oIGzhu4djaCBsb2dpdCBnaeG7r2Ega2jDoWNoIGjDoG5nIGtow7RuZyBjw7Mga2hv4bqjbiB2YXkgdGnDqnUgZMO5bmcgKGxvYW4gPSAibm8iKSB2w6Aga2jDoWNoIGjDoG5nIGPDsyBraG/huqNuIHZheSAobG9hbiA9ICJ5ZXMiKS4gS2hpIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBsb2cgb2RkcyDEkcSDbmcga8O9IGfhu61pIHRp4buBbiBj4bunYSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBraG/huqNuIHZheSBjYW8gaMahbiAwLjY1MTUgxJHGoW4gduG7iyBzbyB24bubaSBuaMOzbSBjw7Mga2hv4bqjbiB2YXkuCgotIEjhu4cgc+G7kSAkXGhhdHtcYmV0YX1fMyA9IDAuODY0MyQgY+G7p2EgYmnhur9uIGhvdXNpbmdfbm8gdGjhu4MgaGnhu4duIG3hu6ljIGNow6puaCBs4buHY2ggbG9naXQgZ2nhu69hIGtow6FjaCBow6BuZyBraMO0bmcgdmF5IG11YSBuaMOgIChob3VzaW5nID0gIm5vIikgdsOgIGtow6FjaCBow6BuZyBjw7MgdmF5IG11YSBuaMOgIChob3VzaW5nID0gInllcyIpLiBLaGkgY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWksIGxvZyBvZGRzIMSRxINuZyBrw70gZ+G7rWkgdGnhu4FuIGPhu6dhIGtow6FjaCBow6BuZyBraMO0bmcgdmF5IG11YSBuaMOgIGNhbyBoxqFuIDAuODY0MyDEkcahbiB24buLIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjw7MgdmF5IG11YSBuaMOgLgoKCgoqKk3DtCBow6xuaCBo4buTaSBxdXkgUHJvYml0KioKCgokJApcaGF0e1xwaX0gPSBcUGhpXGxlZnQoLTEuOTY3NSArIDAuMjczMiBcY2RvdCBkZWZhdWx0XF9ubyArIDAuMzIwNCBcY2RvdCBsb2FuXF9ubyArIDAuNDUwMiBcY2RvdCBob3VzaW5nXF9ub1xyaWdodCkKJCQKLSBI4buHIHPhu5EgY2jhurduICRcaGF0e1xiZXRhfV8wID0gLTEuOTY3NSQgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBraGkgcC12YWx1ZSBuaOG7jyBoxqFuIDAuMDUuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBraGkga2jDoWNoIGjDoG5nIHRodeG7mWMgbmjDs20gdGhhbSBjaGnhur91ICh04bupYyBsw6AgZGVmYXVsdCA9IHllcywgbG9hbiA9IHllcywgaG91c2luZyA9IHllcyksIHRow6wgeMOhYyBzdeG6pXQgxJHEg25nIGvDvSBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gbMOgICRcUGhpKC0xLjk2NzUpJC4KCi0gSOG7hyBz4buRICRcaGF0e1xiZXRhfV8xID0gMC4yNzMyJCAoYmnhur9uIGRlZmF1bHRfbm8pIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oga2hpIHAtdmFsdWUgbmjhu48gaMahbiAwLjA1LiBI4buHIHPhu5EgbsOgeSB0aOG7gyBoaeG7h24gbeG7qWMgY2jDqm5oIGzhu4djaCB24buBIGdpw6EgdHLhu4sgaMOgbSAkXFBoaShcY2RvdCkkIGdp4buvYSBuaMOzbSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBu4bujIHjhuqV1IChkZWZhdWx0ID0gbm8pIHbDoCBuaMOzbSBjw7MgbuG7oyB44bqldSAoZGVmYXVsdCA9IHllcykuIEPhu6UgdGjhu4MsIGtoaSBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgeMOhYyBzdeG6pXQgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIGPhu6dhIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIG7hu6MgeOG6pXUgY2FvIGjGoW4gJFxQaGkoMC4yNzMyKSQgc28gduG7m2kgcGjhuqduIHjDoWMgc3XhuqV0IGfhu5FjIHThu6sgbmjDs20gY8OzIG7hu6MgeOG6pXUuCgotIEjhu4cgc+G7kSAkXGhhdHtcYmV0YX1fMiA9IDAuMzIwNCQgKGJp4bq/biBsb2FuX25vKSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGtoaSBwLXZhbHVlIG5o4buPIGjGoW4gMC4wNS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDoWNoIGjDoG5nIGtow7RuZyBjw7Mga2hv4bqjbiB2YXkgY8OhIG5ow6JuIChsb2FuID0gbm8pIHPhur0gY8OzIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiBjYW8gaMahbiAkXFBoaSgwLjMyMDQpJCBzbyB24bubaSBuaMOzbSBjw7Mga2hv4bqjbiB2YXkgY8OhIG5ow6JuIChsb2FuID0geWVzKSwgZ2nhuqMgxJHhu4tuaCBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaS4KCi0gSOG7hyBz4buRICRcaGF0e1xiZXRhfV8zID0gMC40NTAyJCAoYmnhur9uIGhvdXNpbmdfbm8pIGPFqW5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oga2hpIHAtdmFsdWUgbmjhu48gaMahbiAwLjA1LiDEkGnhu4F1IG7DoHkgaMOgbSDDvSBy4bqxbmcga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgdmF5IG11YSBuaMOgIChob3VzaW5nID0gbm8pIGPDsyB4w6FjIHN14bqldCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gY2FvIGjGoW4gJFxQaGkoMC40NTAyKSQgc28gduG7m2kgbmjDs20gY8OzIHZheSBtdWEgbmjDoCAoaG91c2luZyA9IHllcyksIHRyb25nIMSRaeG7gXUga2nhu4duIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBnaeG7ryBuZ3V5w6puLgoKCgoqKk3DtCBow6xuaCBo4buTaSBxdXkgQ2xvZ2xvZyoqCgoKJCQKXGhhdHtccGl9ID0gMSAtIFxleHBcbGVmdFstXGV4cFxsZWZ0KC0zLjU5NzAgKyAwLjU0MzMgXGNkb3QgZGVmYXVsdFxfbm8gKyAwLjYyMTAgXGNkb3QgbG9hblxfbm8gKyAwLjgxMjcgXGNkb3QgaG91c2luZ1xfbm9ccmlnaHQpXHJpZ2h0XQokJAoKLSBI4buHIHPhu5EgY2jhurduICRcaGF0e1xiZXRhfV8wID0gLTMuNTk3MCQgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiwgY2hvIHRo4bqleSBraGkga2jDoWNoIGjDoG5nIGPDsyBu4bujIHjhuqV1LCBjw7Mga2hv4bqjbiB2YXkgdGnDqnUgZMO5bmcgdsOgIGPDsyB2YXkgbXVhIG5ow6AgKHThu6ljIGPhuqMgYmEgYmnhur9uIOG7nyBt4bupYyB0aGFtIGNoaeG6v3UgPSAieWVzIiksIGdpw6EgdHLhu4sgYmnhur9uIGxpw6puIGvhur90IM63IHLhuqV0IMOibSwgZOG6q24gxJHhur9uIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiBjw7Mga+G7syBo4bqhbiDhu58gbeG7qWMgcuG6pXQgdGjhuqVwLgoKLSBI4buHIHPhu5EgJFxoYXR7XGJldGF9XzEgPSAwLjU0MzMkIOG7qW5nIHbhu5tpIGRlZmF1bHRfbm86Y8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gS2hpIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIG7hu6MgeOG6pXUsIGdpw6EgdHLhu4sgzrcgdMSDbmcgMC41NDMzIMSRxqFuIHbhu4sgc28gduG7m2kgbmjDs20gY8OzIG7hu6MgeOG6pXUsIGvDqW8gdGhlbyB4w6FjIHN14bqldCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gdMSDbmcsIGdp4buvIG5ndXnDqm4gY8OhYyB54bq/dSB04buRIGtow6FjLgoKLSBI4buHIHPhu5EgJFxoYXR7XGJldGF9XzIgPSAwLjYyMTAkIOG7qW5nIHbhu5tpIGxvYW5fbm86IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIEtoaSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBraG/huqNuIHZheSB0acOqdSBkw7luZywgzrcgdMSDbmcgMC42MjEwIMSRxqFuIHbhu4sgc28gduG7m2kgbmjDs20gY8OzIHZheSwgbMOgbSB4w6FjIHN14bqldCBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4gY2FvIGjGoW4uCgotIEjhu4cgc+G7kSAkXGhhdHtcYmV0YX1fMyA9IDAuODEyNyQg4bupbmcgduG7m2kgaG91c2luZ19ubzogY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiB2w6AgbMOgIGzhu5tuIG5o4bqldCB0cm9uZyBiYSBiaeG6v24uIFZp4buHYyBraMO0bmcgdmF5IG11YSBuaMOgIGzDoG0gzrcgdMSDbmcgMC44MTI3IMSRxqFuIHbhu4sgc28gduG7m2kgbmjDs20gdmF5IG11YSBuaMOgLCB0w6FjIMSR4buZbmcgdMOtY2ggY+G7sWMgbeG6oW5oIG5o4bqldCDEkeG6v24geMOhYyBzdeG6pXQgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuLgoKCgoKYGBge3J9Cm5ld20gPC1kYXRhLmZyYW1lKGRlZmF1bHQgPSBjKCJ5ZXMiLCAibm8iKSwgbG9hbiA9IGMoInllcyIsICJubyIpLCBob3VzaW5nID0gYygieWVzIiwgIm5vIikpCnByZWRpY3QobG9naXRfbW9kZWwsIG5ld2RhdGEgPSBuZXdtLCB0eXBlID0gInJlc3BvbnNlIikKcHJlZGljdChwcm9iaXRfbW9kZWwsIG5ld2RhdGEgPSBuZXdtLCB0eXBlID0gInJlc3BvbnNlIikKcHJlZGljdChjbG9nbG9nX21vZGVsLCBuZXdkYXRhID0gbmV3bSwgdHlwZSA9ICJyZXNwb25zZSIpCmBgYAoKCkvhur90IHF14bqjIGThu7EgYsOhbyB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIMSR4buRaSB24bubaSBoYWkgbmjDs20ga2jDoWNoIGjDoG5nIGNobyB0aOG6pXkgc+G7sSB0aOG7kW5nIG5o4bqldCBraMOhIGNhbyBnaeG7r2EgYmEgbcO0IGjDrG5oIGjhu5NpIHF1eTogTG9naXQsIFByb2JpdCB2w6AgQ29tcGxlbWVudGFyeSBMb2ctbG9nIChDbG9nbG9nKS4gQ+G7pSB0aOG7gzoKClbhu5tpIG5ow7NtIGtow6FjaCBow6BuZyBjw7MgbuG7oyB0w61uIGThu6VuZyBxdcOhIGjhuqFuIChkZWZhdWx0ID0geWVzKSwgY8OzIGtob+G6o24gdmF5IGPDoSBuaMOibiAobG9hbiA9IHllcykgdsOgIGPDsyB2YXkgbXVhIG5ow6AgKGhvdXNpbmcgPSB5ZXMpOgoKLSBNw7QgaMOsbmggUHJvYml0IGThu7EgYsOhbyB4w6FjIHN14bqldCBsw6AgMi40NiUuCgotIE3DtCBow6xuaCBMb2dpdCBjaG8ga+G6v3QgcXXhuqMgZ+G6p24gdMawxqFuZyDEkcawxqFuZyB24bubaSAyLjY1JS4KCi0gTcO0IGjDrG5oIENsb2dsb2cgZOG7sSBiw6FvIGNhbyBuaOG6pXQgduG7m2kgMi43MCUuCgrihpIgTmjDrG4gY2h1bmcsIGPhuqMgYmEgbcO0IGjDrG5oIMSR4buBdSBk4buxIGLDoW8geMOhYyBzdeG6pXQgcuG6pXQgdGjhuqVwLCBkYW8gxJHhu5luZyB0cm9uZyBraG/huqNuZyAyLjQ2JSDigJMgMi43MCUsIGNobyB0aOG6pXkga2jDoWNoIGjDoG5nIGPDsyByw6BuZyBideG7mWMgdMOgaSBjaMOtbmggbuG6t25nIHRoxrDhu51uZyBraMOzIGPDsyBraOG6oyBuxINuZyBn4butaSB0aeG7gW4gY8OzIGvhu7MgaOG6oW4uCgpW4bubaSBuaMOzbSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBu4bujIHF1w6EgaOG6oW4sIGtow7RuZyBjw7Mga2hv4bqjbiB2YXkgY8OhIG5ow6JuIHbDoCBraMO0bmcgdmF5IG11YSBuaMOgIChkZWZhdWx0ID0gbm8sIGxvYW4gPSBubywgaG91c2luZyA9IG5vKToKCi0gTcO0IGjDrG5oIFByb2JpdCBk4buxIGLDoW8geMOhYyBzdeG6pXQgbMOgIDE3Ljc4JS4KCi0gTcO0IGjDrG5oIExvZ2l0IGThu7EgYsOhbyDhu58gbeG7qWMgMTcuOTElLgoKLSBNw7QgaMOsbmggQ2xvZ2xvZyBjaG8geMOhYyBzdeG6pXQgY2FvIG5o4bqldCBsw6AgMTcuOTUlLgoK4oaSIFRyb25nIG5ow7NtIG7DoHksIHjDoWMgc3XhuqV0IGRhbyDEkeG7mW5nIHThu6sgMTcuNzglIOKAkyAxNy45NSUsIGNhbyBn4bqlcCBraG/huqNuZyA3IGzhuqduIHNvIHbhu5tpIG5ow7NtIMSR4bqndSB0acOqbiwgcGjhuqNuIMOhbmggcuG6sW5nIGtow6FjaCBow6BuZyBjw7MgdMOsbmggaMOsbmggdMOgaSBjaMOtbmgg4buVbiDEkeG7i25oIGjGoW4gc+G6vSBjw7MgeHUgaMaw4bubbmcgZ+G7rWkgdGnhur90IGtp4buHbSBr4buzIGjhuqFuIGNhbyBoxqFuIMSRw6FuZyBr4buDLgoKVOG7lW5nIHRo4buDLCBj4bqjIGJhIG3DtCBow6xuaCDEkeG7gXUgY2hvIGvhur90IHF14bqjIGThu7EgYsOhbyBuaOG6pXQgcXXDoW4gduG7gSB4dSBoxrDhu5tuZyB2w6AgbeG7qWMgxJHhu5kga2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgbmjDs20ga2jDoWNoIGjDoG5nLCBjaG8gdGjhuqV5IMSR4buZIHRpbiBj4bqteSBj4bunYSBjw6FjIG3DtCBow6xuaCBsw6Aga2jDoSB04buRdCB0cm9uZyB2aeG7h2MgcGjDom4gbG/huqFpIGjDoG5oIHZpIGfhu61pIHRp4buBbiBk4buxYSB0csOqbiDEkeG6t2MgxJFp4buDbSB0w6BpIGNow61uaCBjw6EgbmjDom4uCgoKCiMjIyAuIMSQw6FuaCBnacOhIG3DtCBow6xuaAoKLSAqKkFJQyoqCgoKYGBge3J9CmFpY192YWx1ZXMgPC0gZGF0YS5mcmFtZSgKICBNb2RlbCA9IGMoIkxvZ2l0IiwgIlByb2JpdCIsICJDbG9nbG9nIiksCiAgQUlDID0gYygKICAgIEFJQyhsb2dpdF9tb2RlbCksCiAgICBBSUMocHJvYml0X21vZGVsKSwKICAgIEFJQyhjbG9nbG9nX21vZGVsKQogICkKKQoKcHJpbnQoYWljX3ZhbHVlcykKCmBgYAoKWMOpdCB0aGVvIHRpw6p1IGNow60gQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbiAoQUlDKSwgbcO0IGjDrG5oIENvbXBsZW1lbnRhcnkgTG9nLWxvZyAoQ2xvZ2xvZykgY8OzIGdpw6EgdHLhu4sgQUlDIHRo4bqlcCBuaOG6pXQgKDMxNTM3LjAyKSwgY2hvIHRo4bqleSDEkcOieSBsw6AgbcO0IGjDrG5oIHBow7kgaOG7o3AgbmjhuqV0IHRyb25nIGJhIG3DtCBow6xuaCDEkcaw4bujYyBzbyBzw6FuaC4gTcO0IGjDrG5oIExvZ2l0IGPDsyBBSUMgbMOgIDMxNTQwLjk5LCBjYW8gaMahbiBt4buZdCBjaMO6dCwgdHJvbmcga2hpIG3DtCBow6xuaCBQcm9iaXQgY8OzIEFJQyBjYW8gbmjhuqV0ICgzMTU1NC40NiksIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCB0aOG6pXAgaMahbiBzbyB24bubaSBoYWkgbcO0IGjDrG5oIGPDsm4gbOG6oWkuIE5oxrAgduG6rXksIG3DtCBow6xuaCBDbG9nbG9nIGzDoCBs4buxYSBjaOG7jW4gdOG7kWkgxrB1IHbhu4EgbeG6t3QgY8OibiBi4bqxbmcgZ2nhu69hIMSR4buZIHBow7kgaOG7o3AgdsOgIMSR4buZIHBo4bupYyB04bqhcCBj4bunYSBtw7QgaMOsbmggdGhlbyB0acOqdSBjaMOtIEFJQy4KCgotICoqQnJpZXIgU2NvcmUqKgoKYGBge3J9CiMgVMOtbmggdOG7q25nIEJyaWVyIFNjb3JlCmJyaWVyX2xvZ2l0IDwtIEJyaWVyU2NvcmUobG9naXRfbW9kZWwpCmJyaWVyX3Byb2JpdCA8LSBCcmllclNjb3JlKHByb2JpdF9tb2RlbCkKYnJpZXJfY2xvZ2xvZyA8LSBCcmllclNjb3JlKGNsb2dsb2dfbW9kZWwpCgojIEdow6lwIGzhuqFpIHRow6BuaCBkYXRhIGZyYW1lCmJyaWVyX2RmIDwtIGRhdGEuZnJhbWUoCiAgTW9kZWwgPSBjKCJMb2dpdCIsICJQcm9iaXQiLCAiQ2xvZ2xvZyIpLAogIEJyaWVyU2NvcmUgPSBjKGJyaWVyX2xvZ2l0LCBicmllcl9wcm9iaXQsIGJyaWVyX2Nsb2dsb2cpCikKCiMgSW4gcmEgYuG6o25nCnByaW50KGJyaWVyX2RmKQoKYGBgCgoKCljDqXQgdGhlbyBCcmllciBTY29yZSDigJMgY2jhu4kgc+G7kSDEkcOhbmggZ2nDoSDEkeG7mSBjaMOtbmggeMOhYyBj4bunYSBk4buxIMSRb8OhbiB4w6FjIHN14bqldCwgbcO0IGjDrG5oIENvbXBsZW1lbnRhcnkgTG9nLWxvZyAoQ2xvZ2xvZykgdGnhur9wIHThu6VjIGNobyBr4bq/dCBxdeG6oyB04buRdCBuaOG6pXQgduG7m2kgQnJpZXIgU2NvcmUgdGjhuqVwIG5o4bqldCBsw6AgMC4xMDA2Njc4LCBjaG8gdGjhuqV5IHNhaSBz4buRIHRydW5nIGLDrG5oIGLDrG5oIHBoxrDGoW5nIGdp4buvYSB4w6FjIHN14bqldCBk4buxIGLDoW8gdsOgIHRo4buxYyB04bq/IGzDoCBuaOG7jyBuaOG6pXQuIE3DtCBow6xuaCBMb2dpdCBjw7MgQnJpZXIgU2NvcmUgZ+G6p24gdMawxqFuZyDEkcawxqFuZyAoMC4xMDA2NzQ5KSwgeOG6v3AgdGjhu6kgaGFpLCB0cm9uZyBraGkgbcO0IGjDrG5oIFByb2JpdCBjw7MgY2jhu4kgc+G7kSBjYW8gbmjhuqV0ICgwLjEwMDcwMTEpLCBjaG8gdGjhuqV5IGhp4buHdSBzdeG6pXQgZOG7sSBiw6FvIGvDqW0gaMahbiDEkcO0aSBjaMO6dC4gTmjDrG4gY2h1bmcsIG3DtCBow6xuaCBDbG9nbG9nIGNobyBoaeG7h3UgcXXhuqMgZOG7sSBiw6FvIHjDoWMgc3XhuqV0IGNhbyBuaOG6pXQgdHJvbmcgYmEgbcO0IGjDrG5oIHjDqXQgdGhlbyB0acOqdSBjaMOtIEJyaWVyIFNjb3JlLgoKCmBgYHtyfQojIEzhuqV5IGdpw6EgdHLhu4sgbG9nLWxpa2VsaWhvb2QKbG9nTGlrX3ZhbHVlcyA8LSBkYXRhLmZyYW1lKAogIE1vZGVsID0gYygiTG9naXQiLCAiUHJvYml0IiwgIkNsb2dsb2ciKSwKICBMb2dMaWsgPSBjKAogICAgYXMubnVtZXJpYyhsb2dMaWsobG9naXRfbW9kZWwpKSwKICAgIGFzLm51bWVyaWMobG9nTGlrKHByb2JpdF9tb2RlbCkpLAogICAgYXMubnVtZXJpYyhsb2dMaWsoY2xvZ2xvZ19tb2RlbCkpCiAgKQopCgojIEhp4buDbiB0aOG7iyBi4bqjbmcKcHJpbnQobG9nTGlrX3ZhbHVlcykKCmBgYAoKCljDqXQgdGhlbyBnacOhIHRy4buLIExvZy1MaWtlbGlob29kIOKAkyDEkeG6oWkgZGnhu4duIGNobyBt4bupYyDEkeG7mSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCB24bubaSBk4buvIGxp4buHdSwgbcO0IGjDrG5oIENvbXBsZW1lbnRhcnkgTG9nLWxvZyAoQ2xvZ2xvZykgY8OzIExvZy1MaWtlbGlob29kIGNhbyBuaOG6pXQgbMOgIC0xNTc2NC41MSwgY2hvIHRo4bqleSBtw7QgaMOsbmggbsOgeSBnaeG6o2kgdGjDrWNoIGThu68gbGnhu4d1IHThu5F0IG5o4bqldCB0cm9uZyBiYSBtw7QgaMOsbmguIFRp4bq/cCB0aGVvIGzDoCBtw7QgaMOsbmggTG9naXQgduG7m2kgTG9nLUxpa2VsaWhvb2QgbMOgIC0xNTc2Ni40OSwgeOG6v3Ag4bufIHbhu4sgdHLDrSB0aOG7qSBoYWkuIE3DtCBow6xuaCBQcm9iaXQgY8OzIExvZy1MaWtlbGlob29kIHRo4bqlcCBuaOG6pXQgKC0xNTc3My4yMyksIHBo4bqjbiDDoW5oIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3Uga8OpbSBoxqFuLiBU4buVbmcgdGjhu4MsIENsb2dsb2cgdGnhur9wIHThu6VjIGzDoCBtw7QgaMOsbmggY8OzIGhp4buHdSBzdeG6pXQgcGjDuSBo4bujcCB04buRdCBuaOG6pXQgdGhlbyB0acOqdSBjaMOtIExvZy1MaWtlbGlob29kLgoKLS0tCgoKIyAuIENIxq/GoE5HIDU6IEvhur5UIExV4bqsTiBWw4AgS0hVWeG6vk4gTkdI4buKCgojIyAuIEvhur90IGx14bqtbgoKVGjhu6kgbmjhuqV0LCBr4bq/dCBxdeG6oyBo4buTaSBxdXkgbmjhu4sgcGjDom4gduG7m2kgdOG7q25nIGJp4bq/biDEkeG7mWMgbOG6rXAgY2hvIHRo4bqleSBj4bqjIGJhIHnhur91IHThu5E6IGRlZmF1bHQsIGhvdXNpbmcsIHbDoCBsb2FuIMSR4buBdSBjw7Mg4bqjbmggaMaw4bufbmcgdGjhu5FuZyBrw6ogw70gbmdoxKlhIMSR4bq/biBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhur90IGtp4buHbSBjw7Mga+G7syBo4bqhbiBj4bunYSBraMOhY2ggaMOgbmcuIFRyb25nIMSRw7MsIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIG7hu6MgeOG6pXUgKGRlZmF1bHQgPSBubyksIGtow7RuZyB2YXkgbXVhIG5ow6AgKGhvdXNpbmcgPSBubykgdsOgIGtow7RuZyB2YXkgdGnDqnUgZMO5bmcgKGxvYW4gPSBubykgY8OzIHjDoWMgc3XhuqV0IGNhbyBoxqFuIMSRw6FuZyBr4buDIMSR4buDIMSRxINuZyBrw70gZ+G7rWkgdGnhu4FuLiDEkGnhu4F1IG7DoHkgZ+G7o2kgw70gcuG6sW5nIGPDoWMgxJHhurdjIMSRaeG7g20gdMOgaSBjaMOtbmgg4buVbiDEkeG7i25oIHbDoCBraMO0bmcgY2jhu4t1IMOhcCBs4buxYyB2YXkgbuG7oyBnw7NwIHBo4bqnbiB0aMO6YyDEkeG6qXkgeHUgaMaw4bubbmcgdGnhur90IGtp4buHbSBkw6BpIGjhuqFuIGPhu6dhIGtow6FjaCBow6BuZy4KClRo4bupIGhhaSwgdHJvbmcgcGjDom4gdMOtY2ggaOG7k2kgcXV5IMSRYSBiaeG6v24gduG7m2kgYmEgYmnhur9uIMSR4buZYyBs4bqtcCBsw6AgZGVmYXVsdCwgbG9hbiB2w6AgaG91c2luZywga+G6v3QgcXXhuqMgxrDhu5tjIGzGsOG7o25nIHThu6sgY+G6oyBiYSBtw7QgaMOsbmggKExvZ2l0LCBQcm9iaXQgdsOgIENsb2dsb2cpIMSR4buBdSBjaG8gdGjhuqV5IGPDoWMgaOG7hyBz4buRIMSR4buBdSBkxrDGoW5nIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLCBwaOG6o24gw6FuaCBt4buRaSBsacOqbiBo4buHIHTDrWNoIGPhu7FjIGdp4buvYSB0w6xuaCBow6xuaCB0w6BpIGNow61uaCDhu5VuIMSR4buLbmggdsOgIGto4bqjIG7Eg25nIGfhu61pIHRp4bq/dCBraeG7h20uIEPhu6UgdGjhu4MsIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIG7hu6MgcXXDoSBo4bqhbiAoZGVmYXVsdCA9IG5vKSwga2jDtG5nIHZheSB0acOqdSBkw7luZyAobG9hbiA9IG5vKSB2w6Aga2jDtG5nIHZheSBtdWEgbmjDoCAoaG91c2luZyA9IG5vKSDEkeG7gXUgY8OzIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaMOzbSDEkeG7kWkgbmdo4buLY2guIFRyb25nIG3DtCBow6xuaCBDbG9nbG9nLCBo4buHIHPhu5Eg4bqjbmggaMaw4bufbmcgY+G7p2EgaG91c2luZ19ubyBsw6AgbOG7m24gbmjhuqV0ICgwLjgxMjcpLCBjaG8gdGjhuqV5IMSRw6J5IGzDoCB54bq/dSB04buRIGPDsyB0w6FjIMSR4buZbmcgbeG6oW5oIG5o4bqldCDEkeG6v24gaMOgbmggdmkgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuLiBOaMOsbiBjaHVuZywgY8OhYyBiaeG6v24gdMOgaSBjaMOtbmggxJHhu4F1IMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgdHJvbmcgdmnhu4djIHBow6JuIGxv4bqhaSBraOG6oyBuxINuZyBraMOhY2ggaMOgbmcgdHLhu58gdGjDoG5oIG5nxrDhu51pIGfhu61pIHRp4bq/dCBraeG7h20uCgoKVGjhu6kgYmEsIEtoaSBzbyBzw6FuaCBoaeG7h3UgcXXhuqMgZOG7sSBiw6FvIGPhu6dhIGJhIG3DtCBow6xuaCwgY+G6oyBMb2dpdCwgUHJvYml0IHbDoCBDbG9nbG9nIMSR4buBdSBjaG8ga+G6v3QgcXXhuqMgbmjhuqV0IHF1w6FuIHbhu4EgeHUgaMaw4bubbmc6IG5ow7NtIGtow6FjaCBow6BuZyBjw7MgdMOsbmggaMOsbmggdMOgaSBjaMOtbmgga2jDtG5nIHLDoG5nIGJ14buZYyAoZGVmYXVsdCA9IG5vLCBsb2FuID0gbm8sIGhvdXNpbmcgPSBubykgY8OzIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiBjYW8gZ+G6pXAgNyBs4bqnbiBzbyB24bubaSBuaMOzbSBjw7Mgbmhp4buBdSByw6BuZyBideG7mWMgdMOgaSBjaMOtbmguIEPhu6UgdGjhu4MsIHjDoWMgc3XhuqV0IGfhu61pIHRp4buBbiDhu58gbmjDs20gdMOgaSBjaMOtbmgg4buVbiDEkeG7i25oIGRhbyDEkeG7mW5nIHThu6sgMTcuNzglIMSR4bq/biAxNy45NSUsIHRyb25nIGtoaSBuaMOzbSBjw7MgcsOgbmcgYnXhu5ljIHTDoGkgY2jDrW5oIGNo4buJIHThu6sgMi40NiUgxJHhur9uIDIuNzAlLiDEkGnhu4F1IG7DoHkgY2jhu6luZyB04buPIHLhurFuZyBjw6FjIG3DtCBow6xuaCDEkeG7gXUgY8OzIGto4bqjIG7Eg25nIHBow6JuIGxv4bqhaSB04buRdCB2w6AgxJHDoW5nIHRpbiBj4bqteSB0cm9uZyB2aeG7h2MgZOG7sSBiw6FvIGjDoG5oIHZpIGfhu61pIHRp4bq/dCBraeG7h20gY+G7p2Ega2jDoWNoIGjDoG5nIGThu7FhIHRyw6puIGPDoWMgxJHhurdjIMSRaeG7g20gdMOgaSBjaMOtbmggY8OhIG5ow6JuLgoKClRo4bupIHTGsCwgROG7sWEgdHLDqm4gYmEgdGnDqnUgY2jDrSDEkcOhbmggZ2nDoSBtw7QgaMOsbmggZ+G7k20gQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbiAoQUlDKSwgQnJpZXIgU2NvcmUgdsOgIExvZy1MaWtlbGlob29kLCBtw7QgaMOsbmggQ29tcGxlbWVudGFyeSBMb2ctbG9nIChDbG9nbG9nKSBjaG8gdGjhuqV5IGhp4buHdSBzdeG6pXQgdOG7kXQgbmjhuqV0LiBDbG9nbG9nIGPDsyBBSUMgdGjhuqVwIG5o4bqldCAoMzE1MzcuMDIpLCBCcmllciBTY29yZSBuaOG7jyBuaOG6pXQgKDAuMTAwNjY3OCkgdsOgIExvZy1MaWtlbGlob29kIGNhbyBuaOG6pXQgKC0xNTc2NC41MSksIHBo4bqjbiDDoW5oIHPhu7EgY8OibiBi4bqxbmcgdOG7kWkgxrB1IGdp4buvYSDEkeG7mSBwaMO5IGjhu6NwLCDEkeG7mSBjaMOtbmggeMOhYyB2w6AgbeG7qWMgxJHhu5kgZ2nhuqNpIHRow61jaCBk4buvIGxp4buHdS4gRG8gxJHDsywgbcO0IGjDrG5oIENsb2dsb2cgxJHGsOG7o2MgeGVtIGzDoCBs4buxYSBjaOG7jW4gcGjDuSBo4bujcCBuaOG6pXQgdHJvbmcgYmEgbcO0IGjDrG5oIMSRxrDhu6NjIHNvIHPDoW5oLgoKIyMgLiBLaHV54bq/biBuZ2jhu4sKCioqMS4gS2h1eeG6v24gbmdo4buLIDE6IMavdSB0acOqbiBuaMOzbSBraMOhY2ggaMOgbmcga2jDtG5nIHZheSB0acOqdSBkw7luZyB2w6Aga2jDtG5nIHZheSBtdWEgbmjDoCoqCgpL4bq/dCBxdeG6oyBo4buTaSBxdXkgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcga2jDtG5nIHZheSB0acOqdSBkw7luZyB2w6Aga2jDtG5nIHZheSBtdWEgbmjDoCBjw7MgeMOhYyBzdeG6pXQgZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuIGNhbyBoxqFuIMSRw6FuZyBr4buDLiBEbyDEkcOzLCBuZ8OibiBow6BuZyBuw6puIHThuq1wIHRydW5nIHbDoG8gY8OhYyBjaGnhur9uIGzGsOG7o2MgdGnhur9wIGPhuq1uIG5ow7NtIGtow6FjaCBow6BuZyBuw6B5IHRow7RuZyBxdWEgY8OhYyBnw7NpIHRp4bq/dCBraeG7h20gxrB1IMSRw6NpLCBjaMSDbSBzw7NjIGtow6FjaCBow6BuZyB0aMOibiB0aGnhur90IHbDoCB0cnV54buBbiB0aMO0bmcgaMaw4bubbmcgxJHhur9uIG5odSBj4bqndSB0w61jaCBsxal5IHTDoGkgc+G6o24gYW4gdG/DoG4uCgoqKjIuIEtodXnhur9uIG5naOG7iyAyOiBUaOG6rW4gdHLhu41uZyBraGkgdGnhur9wIGPhuq1uIG5ow7NtIGPDsyBs4buLY2ggc+G7rSBu4bujIHjhuqV1KioKCktow6FjaCBow6BuZyBraMO0bmcgY8OzIG7hu6MgcXXDoSBo4bqhbiB0cm9uZyBxdcOhIGto4bupIGPDsyBraOG6oyBuxINuZyDEkcSDbmcga8O9IHRp4buBbiBn4butaSBjYW8gaMahbi4gVsOsIHbhuq15LCBuZ8OibiBow6BuZyBuw6puIHPhu60gZOG7pW5nIHRow7RuZyB0aW4gdMOtbiBk4bulbmcgxJHhu4Mgc8OgbmcgbOG7jWMga2jDoWNoIGjDoG5nIHbDoCDGsHUgdGnDqm4gbmd14buTbiBs4buxYyB0aeG6v3AgdGjhu4sgdsOgbyBuaOG7r25nIGPDoSBuaMOibiBjw7MgaOG7kyBzxqEgdMOtbiBk4bulbmcgc+G6oWNoLCDEkeG7k25nIHRo4budaSDDoXAgZOG7pW5nIGPDoWMgY2jDrW5oIHPDoWNoIHJpw6puZyBiaeG7h3QgxJHhu5FpIHbhu5tpIG5ow7NtIGtow6FjaCBow6BuZyB04burbmcgY8OzIG7hu6MgcXXDoSBo4bqhbiBuaOG6sW0gaOG6oW4gY2jhur8gcuG7p2kgcm8uCgoqKjMuIEtodXnhur9uIG5naOG7iyAzOiBUw61jaCBo4bujcCBtw7QgaMOsbmggQ2xvZ2xvZyB2w6BvIGjhu4cgdGjhu5FuZyBk4buxIGLDoW8gaMOgbmggdmkga2jDoWNoIGjDoG5nKioKCk3DtCBow6xuaCBDbG9nbG9nIMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBsw6AgY8OzIGhp4buHdSBzdeG6pXQgZOG7sSBiw6FvIGNhbyBuaOG6pXQgdHJvbmcgYmEgbcO0IGjDrG5oIMSRw6Mga2nhu4NtIMSR4buLbmguIE5nw6JuIGjDoG5nIG7Dqm4gdMOtY2ggaOG7o3AgbcO0IGjDrG5oIG7DoHkgdsOgbyBo4buHIHRo4buRbmcgQ1JNIChDdXN0b21lciBSZWxhdGlvbnNoaXAgTWFuYWdlbWVudCApIMSR4buDIHBow6JuIGxv4bqhaSBraMOhY2ggaMOgbmcgdGnhu4FtIG7Eg25nLCB04burIMSRw7MgY8OhIG5ow6JuIGjDs2EgY2hp4bq/biBk4buLY2ggbWFya2V0aW5nIHbDoCB04buRaSDGsHUgaMOzYSBjaGkgcGjDrSBodXkgxJHhu5luZyB24buRbi4KCioqNC4gS2h1eeG6v24gbmdo4buLIDQ6IMSQYSBk4bqhbmcgaMOzYSBz4bqjbiBwaOG6qW0gdGnhur90IGtp4buHbSB0aGVvIGjhu5Mgc8ahIGtow6FjaCBow6BuZyoqCgpEbyDEkeG6t2MgxJFp4buDbSB0w6BpIGNow61uaCBj4bunYSBraMOhY2ggaMOgbmcgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhu4FuLCBuZ8OibiBow6BuZyBuw6puIHRoaeG6v3Qga+G6vyBjw6FjIHPhuqNuIHBo4bqpbSB0aeG6v3Qga2nhu4dtIGxpbmggaG/huqF0LCBwaMO5IGjhu6NwIHbhu5tpIHThu6tuZyBwaMOibiBraMO6YyBuaMawOiBnw7NpIHRp4bq/dCBraeG7h20gY2hvIG5nxrDhu51pIGtow7RuZyB2YXkgdGnDqnUgZMO5bmcsIGfDs2kgdGnhur90IGtp4buHbSB0w61jaCBsxal5IGNobyBuZ8aw4budaSDEkWFuZyB0cuG6oyBu4bujIG11YSBuaMOgLCBoYXkgxrB1IMSRw6NpIGNobyBraMOhY2ggaMOgbmcgZHV5IHRyw6wgbOG7i2NoIHPhu60gdMOtbiBk4bulbmcgdOG7kXQuCgoKIyMgLiBI4bqhbiBjaOG6vyBj4bunYSDEkeG7gSB0w6BpCgoxLiBHaeG7m2kgaOG6oW4gZOG7ryBsaeG7h3U6IEThu68gbGnhu4d1IG5naGnDqm4gY+G7qXUgY2jhu6cgeeG6v3UgZOG7sWEgdHLDqm4gdGjDtG5nIHRpbiBraOG6o28gc8OhdC9z4bq1biBjw7MgdOG7qyBt4buZdCBuZ3Xhu5NuIGPhu6UgdGjhu4MgdHJvbmcgbeG7mXQga2hv4bqjbmcgdGjhu51pIGdpYW4gbmjhuqV0IMSR4buLbmgsIGPDsyB0aOG7gyBjaMawYSBwaOG6o24gw6FuaCDEkeG6p3kgxJHhu6cgc+G7sSDEkWEgZOG6oW5nIHbhu4EgaMOgbmggdmkgY+G7p2Ega2jDoWNoIGjDoG5nIHThuqFpIGPDoWMgbmfDom4gaMOgbmcga2jDoWMgaG/hurdjIHRyb25nIGPDoWMgZ2lhaSDEkW/huqFuIGtpbmggdOG6vyBraMOhYyBuaGF1LgoKMi4gTcO0IGjDrG5oIHBow6JuIHTDrWNoOiBOZ2hpw6puIGPhu6l1IGNo4buJIHPhu60gZOG7pW5nIG3hu5l0IHPhu5EgbcO0IGjDrG5oIGjhu5NpIHF1eSBuaOG7iyBwaMOibiAobmjGsCBMb2dpdCwgUHJvYml0LCBDbG9nbG9nKSDEkeG7gyDEkcOhbmggZ2nDoSDhuqNuaCBoxrDhu59uZyBj4bunYSBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgxJHhur9uIHF1eeG6v3QgxJHhu4tuaCBn4butaSB0aeG7gW4sIGNoxrBhIHjDqXQgxJHhur9uIGPDoWMgbcO0IGjDrG5oIGjhu41jIG3DoXkgY8OzIGto4bqjIG7Eg25nIHBow6JuIGxv4bqhaSBwaOG7qWMgdOG6oXAgaMahbi4KCgoyLiBUaGnhur91IHnhur91IHThu5EgdMOibSBsw70gdsOgIHjDoyBo4buZaTogQ8OhYyB54bq/dSB04buRIHRodeG7mWMgduG7gSB0w6JtIGzDvSBow6BuaCB2aSwgbmnhu4FtIHRpbiB2w6BvIG5nw6JuIGjDoG5nLCDhuqNuaCBoxrDhu59uZyB04burIG5nxrDhu51pIHRow6JuLCBob+G6t2MgeHUgaMaw4bubbmcgdMOgaSBjaMOtbmggY8OhIG5ow6JuIGNoxrBhIMSRxrDhu6NjIMSRxrBhIHbDoG8gbcO0IGjDrG5oLCB0cm9uZyBraGkgxJHDonkgY8OzIHRo4buDIGzDoCBuaOG7r25nIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgbeG6oW5oIMSR4bq/biBxdXnhur90IMSR4buLbmggZ+G7rWkgdGnhur90IGtp4buHbS4KCgojIyAuIEjGsOG7m25nIG5naGnDqm4gY+G7qXUgdGnhur9wIHRoZW8KCjEuIE3hu58gcuG7mW5nIHBo4bqhbSB2aSBk4buvIGxp4buHdTogTmdoacOqbiBj4bupdSB0aeG6v3AgdGhlbyBjw7MgdGjhu4MgdGh1IHRo4bqtcCBk4buvIGxp4buHdSB04burIG5oaeG7gXUgbmfDom4gaMOgbmcga2jDoWMgbmhhdSBob+G6t2MgbeG7nyBy4buZbmcgduG7gSBt4bq3dCB0aOG7nWkgZ2lhbiDEkeG7gyDEkeG6o20gYuG6o28gdMOtbmggxJHhuqFpIGRp4buHbiB2w6AgbsOibmcgY2FvIMSR4buZIHRpbiBj4bqteSBj4bunYSBr4bq/dCBxdeG6oy4KCjIuIOG7qG5nIGThu6VuZyBtw7QgaMOsbmggaOG7jWMgbcOheTogw4FwIGThu6VuZyBjw6FjIHBoxrDGoW5nIHBow6FwIG5oxrAgUmFuZG9tIEZvcmVzdCwgWEdCb29zdCwgaG/hurdjIG3DtCBow6xuaCBt4bqhbmcgbsahLXJvbiBuaMOibiB04bqhbyAoQU5OKSDEkeG7gyBj4bqjaSB0aGnhu4duIMSR4buZIGNow61uaCB4w6FjIGPhu6dhIG3DtCBow6xuaCBk4buxIMSRb8OhbiB2w6AgcGjDoXQgaGnhu4duIGPDoWMgdMawxqFuZyB0w6FjIHBoaSB0dXnhur9uIGdp4buvYSBjw6FjIGJp4bq/bi4KCjMuIEto4bqjbyBzw6F0IHnhur91IHThu5EgdMOibSBsw70gdMOgaSBjaMOtbmg6IELhu5Ugc3VuZyBjw6FjIGNo4buJIHPhu5EgduG7gSB4dSBoxrDhu5tuZyDEkeG6p3UgdMawLCBt4bupYyDEkeG7mSBjaOG6pXAgbmjhuq1uIHLhu6dpIHJvLCBuaeG7gW0gdGluIHbDoG8gbmfDom4gaMOgbmcgdsOgIHh1IGjGsOG7m25nIHTDoGkgY2jDrW5oIGPDoSBuaMOibiDEkeG7gyBtw7QgaMOsbmggcGjhuqNuIMOhbmggcsO1IGjGoW4gcXV54bq/dCDEkeG7i25oIHRo4buxYyB04bq/IGPhu6dhIGtow6FjaCBow6BuZy4KCjQuIFBow6JuIHTDrWNoIHRoZW8gcGjDom4ga2jDumMga2jDoWNoIGjDoG5nOiBYw6J5IGThu7FuZyBtw7QgaMOsbmggcmnDqm5nIGJp4buHdCBjaG8gdOG7q25nIHBow6JuIGtow7pjICh0aGVvIMSR4buZIHR14buVaSwgbmdo4buBIG5naGnhu4dwLCB0aHUgbmjhuq1w4oCmKSDEkeG7gyDEkcawYSByYSBraHV54bq/biBuZ2jhu4sgcGjDuSBo4bujcCB2w6AgY2jDrW5oIHPDoWNoIGNoxINtIHPDs2Mga2jDoWNoIGjDoG5nIG3hu6VjIHRpw6p1LgoKCiMgVMOASSBMSeG7hlUgVEhBTSBLSOG6ok8gey51bm51bWJlcmVkfQoKClsxXQlUcuG6p24gTeG6oW5oIFTGsOG7nW5nICgyMDI1KSwgR2nDoW8gdHLDrG5oIFBow6JuIHTDrWNoIEThu68gbGnhu4d1IMSQ4buLbmggdMOtbmguCgpbMl0JRGUgR2lvcmdpLCBHLiwgJiBOYWd1aWIsIEMuICgyMDIzKS4gTGlmZSBhZnRlciAoc29mdCkgZGVmYXVsdC4gYXJYaXYuCgpbM10JRklOUkEgSW52ZXN0b3IgRWR1Y2F0aW9uIEZvdW5kYXRpb24uICgyMDE5KS4gTmF0aW9uYWwgRmluYW5jaWFsIENhcGFiaWxpdHkgU3R1ZHkuIAoKWzRdCUdhdGhlcmdvb2QsIEouLCAmIFdlYmVyLCBKLiAoMjAxNCkuIFNlbGYtY29udHJvbCwgZmluYW5jaWFsIGxpdGVyYWN5IGFuZCB0aGUgdXNlIG9mIGNvbnN1bWVyIGNyZWRpdC4gSm91cm5hbCBvZiBFY29ub21pYyBCZWhhdmlvciAmIE9yZ2FuaXphdGlvbiwgMTA3LCA1NDjigJM1NjYuCgpbNV0JR29kd2luLCBELiBELiAoMTk5NCkuIEFudGVjZWRlbnRzIGFuZCBjb25zZXF1ZW5jZXMgb2YgbmV3bHl3ZWRz4oCZIGNhc2ggZmxvdyBtYW5hZ2VtZW50LiBGaW5hbmNpYWwgQ291bnNlbGluZyBhbmQgUGxhbm5pbmcsIDUsIDE2MeKAkzE5MC4KCls2XQlHw7xuZXMsIEUuLCAmIFR1bmMsIEEuICgyMDE4KS4gU2F2aW5nIGltcGFjdCBvZiBtb3J0Z2FnZSBwYXltZW50czogQSBtaWNyby1sZXZlbCBzdHVkeSBmb3IgVS5TLiBob3VzZWhvbGRzLiBKb3VybmFsIG9mIENvbnN1bWVyIEFmZmFpcnMuCgpbN10JS2FobmVtYW4sIEQuLCAmIFR2ZXJza3ksIEEuICgxOTc5KS4gUHJvc3BlY3QgdGhlb3J5OiBBbiBhbmFseXNpcyBvZiBkZWNpc2lvbiB1bmRlciByaXNrLiBFY29ub21ldHJpY2EsIDQ3KDIpLCAyNjPigJMyOTEuCgpbOF0JTGVlLCBKLiwgJiBIYW5uYSwgUy4gRC4gKDIwMTUpLiBTYXZpbmdzIGdvYWxzIGFuZCBzYXZpbmcgYmVoYXZpb3IgZnJvbSBhIHBlcnNwZWN0aXZlIG9mIE1hc2xvd+KAmXMgaGllcmFyY2h5IG9mIG5lZWRzLiBKb3VybmFsIG9mIEZpbmFuY2lhbCBDb3Vuc2VsaW5nIGFuZCBQbGFubmluZywgMjYoMiksIDEyOeKAkzE0Ny4KCls5XQlMdXNhcmRpLCBBLiwgJiBNaXRjaGVsbCwgTy4gUy4gKDIwMTQpLiBUaGUgZWNvbm9taWMgaW1wb3J0YW5jZSBvZiBmaW5hbmNpYWwgbGl0ZXJhY3k6IFRoZW9yeSBhbmQgZXZpZGVuY2UuIEpvdXJuYWwgb2YgRWNvbm9taWMgTGl0ZXJhdHVyZSwgNTIoMSksIDXigJM0NC4KClsxMF0JTWFua2l3LCBOLiBHLiAoMjAxNikuIFByaW5jaXBsZXMgb2YgRWNvbm9taWNzICg3dGggZWQuKS4gQ2VuZ2FnZSBMZWFybmluZwouClsxMV0JTWlzaGtpbiwgRi4gUy4gKDIwMTkpLiBUaGUgRWNvbm9taWNzIG9mIE1vbmV5LCBCYW5raW5nIGFuZCBGaW5hbmNpYWwgTWFya2V0cyAoMTJ0aCBlZC4pLiBQZWFyc29uLgoKWzEyXQkgTW9ybywgUy4sIENvcnRleiwgUC4sICYgUml0YSwgUC4gKDIwMTQpLiBBIGRhdGEtZHJpdmVuIGFwcHJvYWNoIHRvIHByZWRpY3QgdGhlIHN1Y2Nlc3Mgb2YgYmFuayB0ZWxlbWFya2V0aW5nLiBEZWNpc2lvbiBTdXBwb3J0IFN5c3RlbXMsIDYyLCAyMuKAkzMxLgoKWzEzXQkgTmfDom4gaMOgbmcgTmjDoCBuxrDhu5tjIFZp4buHdCBOYW0uICgyMDIzKS4gVGjDtG5nIHRpbiBob+G6oXQgxJHhu5luZyBuZ8OibiBow6BuZyBxdcO9IEkuIAoKWzE0XQkgUm9nZywgQy4gUy4gKDIwMDApLiBUaGUgaW1wYWN0IG9mIGFjY2VzcyB0byBjcmVkaXQgb24gdGhlIHNhdmluZyBiZWhhdmlvciBvZiBtaWNyb2VudHJlcHJlbmV1cnM6IEV2aWRlbmNlIGZyb20gdGhyZWUgTGF0aW4gQW1lcmljYW4gY291bnRyaWVzLiBJbnRlcuKAkUFtZXJpY2FuIERldmVsb3BtZW50IEJhbmsgUHVibGljYXRpb25zLgoKWzE1XQkgVGhhbGVyLCBSLiBILiAoMTk5OSkuIE1lbnRhbCBhY2NvdW50aW5nIG1hdHRlcnMuIEpvdXJuYWwgb2YgQmVoYXZpb3JhbCBEZWNpc2lvbiBNYWtpbmcsIDEyKDMpLCAxODPigJMyMDYuCgpbMTZdCSBYaWFvLCBKLiBKLiwgJiBQb3J0bywgTi4gKDIwMTcpLiBGaW5hbmNpYWwgZWR1Y2F0aW9uIGFuZCBmaW5hbmNpYWwgc2F0aXNmYWN0aW9uOiBGaW5hbmNpYWwgbGl0ZXJhY3ksIGJlaGF2aW9yLCBhbmQgY2FwYWJpbGl0eSBhcyBtZWRpYXRvcnMuIEludGVybmF0aW9uYWwgSm91cm5hbCBvZiBCYW5rIE1hcmtldGluZywgMzUoNSksIDgwNeKAkzgxNy4K