BÀI TẬP 1

CHƯƠNG 1: MÔ HÌNH THỐNG KÊ - STATISTICAL MODELS

1.1 Giới thiệu và tổng quan

Chương này giới thiệu khái niệm về mô hình thống kê, trong đó mô hình tuyến tính tổng quát (generalized linear model) là trọng tâm chính của cuốn sách. Đầu tiên, chương trình bày các khái niệm cơ bản, ký hiệu và những vấn đề quan trọng liên quan đến mô hình thống kê. Các nội dung cụ thể gồm:

  • Cách mô tả dữ liệu bằng ngôn ngữ toán học.
  • Tầm quan trọng của việc vẽ đồ thị dữ liệu.
  • Cách mã hóa các biến không phải số thành dạng số để dùng trong mô hình.
  • Hai thành phần chính của mô hình thống kê: hệ thống và ngẫu nhiên.
  • Giới thiệu các mô hình hồi quy – nhóm mô hình được dùng xuyên suốt cuốn sách.
  • Cách diễn giải mô hình.
  • So sánh mô hình vật lý và mô hình thống kê để làm rõ điểm giống và khác nhau.
  • Mục đích của mô hình thống kê.
  • Hai tiêu chí đánh giá mô hình: độ chính xác và tính đơn giản.
  • Hạn chế của mô hình thống kê và sự khác biệt giữa dữ liệu quan sát và dữ liệu thực nghiệm.
  • Khả năng khái quát hóa của mô hình.
  • Giới thiệu cơ bản về cách sử dụng R cho mô hình thống kê.

1.2 Các quy ước để mô tả dữ liệu

Dữ liệu được biểu diễn theo cách toán học: biến phản hồi \(y\), biến giải thích \(x_1, x_2, \ldots, x_p\).

Phân loại biến

  • Covariates: biến định lượng
  • Factors: biến định tính

1.3 Vẽ biểu đồ

Plotting Data - Vẽ biểu đồ - Dùng đồ thị như scatter plots, strip charts, boxplots để phát hiện xu hướng, outlier.

1.4 Mã hóa biến phân loạiloại

Coding for Factors - Mã hóa biến phân loại

  • Biến giả (Dummy variables): dùng \(k-1\) biến giả cho một yếu tố có \(k\) mức.

  • R mặc định sử dụng mã hóa “treatment coding”

1.5 Statistical Models Describe Both Random and Systematic Features of Data

Statistical Models Describe Both Random and Systematic Features of Data - Mô hình thống kê mô tả cả yếu tố ngẫu nhiên và có hệ thống của dữ liệu

  • Thành phần hệ thống: mô tả trung bình của phản hồi \(E(y) = μ = β₀ + β₁x₁ + ... + βₚxₚ\)

  • Thành phần ngẫu nhiên (Random): \(Var(y) = σ²\)

  • Thành phần ngẫu nhiên (random component) mô tả phân phối giá trị phản hồi ứng với mỗi tổ hợp biến giải thích.

  • Thành phần hệ thống (systematic component) mô tả mối quan hệ toán học giữa trung bình phản hồi và các biến giải thích (chiều cao, tuổi, giới tính, hút thuốc).

  • Mô hình thống kê = thành phần ngẫu nhiên + thành phần hệ thống, mô tả cả hai đặc điểm của dữ liệu thực tế.

Ví dụ thành phần hệ thống đơn giản

\[ \mu_i = \beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i} + \beta_3 x_{3i} + \beta_4 x_{4i} \]

  • \(\mu_i = E[y_i]\) là kỳ vọng của phản hồi \(y_i\) tại quan sát \(i\).

  • \(\beta_j\) là tham số hồi quy chưa biết với \(j = 0, 1, 2, 3, 4\).

  • \(x_1, x_2\): tuổi và chiều cao.

  • \(x_3, x_4\): biến giả cho giới tính và hút thuốc.

Lưu ý

  • Mối quan hệ FEV – chiều cao có thể phi tuyến.

  • Có thể sử dụng các thành phần hệ thống khác như spline, đa thức bậc hai.

Về thành phần ngẫu nhiên

  • Giả sử phương sai không đổi: \(\mathrm{Var}(y_i) = \sigma^2\).

  • Giả định phổ biến:

\[ y_i \sim N(\mu_i, \sigma^2) \]

  • Nghĩa là \(y_i\) phân phối chuẩn với trung bình \(\mu_i\) và phương sai \(\sigma^2\).

  • Dữ liệu thực tế có thể có phương sai thay đổi theo giá trị trung bình, do đó giả định phương sai không đổi có thể chưa phù hợp.

1.6 Regression Models

Regression Models - Mô hình hồi quy

  • Trong phân tích dữ liệu, mô hình hồi quy là một cách phổ biến để mô tả mối quan hệ giữa giá trị trung bình của biến phản hồi \(y\) và các biến giải thích \(x_1, x_2, \ldots, x_p\).

  • Một mô hình hồi quy giả định rằng kỳ vọng của \(y_i\) phụ thuộc vào các biến giải thích \(x_{i1}, x_{i2}, \ldots, x_{ip}\) qua một hàm hệ thống liên quan đến các tham số hồi quy \(\beta_j\):

\[ E[y_i] = \mu_i = f(x_{i1}, \ldots, x_{ip}; \beta_0, \beta_1, \ldots, \beta_p) \]

Phổ biến nhất là khi mô hình tuyến tính trong các tham số:

\[ \mu_i = f(\beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip}) \tag{1.5} \]

Các dạng mô hình hồi quy:

  • Mô hình hồi quy tuyến tính: thành phần hệ thống có dạng:

\[ E[y_i] = \mu_i = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \tag{1.6} \]

  • Mô hình hồi quy tuyến tính tổng quát (GLM): thành phần hệ thống có dạng:

\[ \mu_i = g^{-1}(\beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip}) \]

hoặc:

\[ g(\mu_i) = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \]

Trong đó \(g(\cdot)\) là một hàm liên kết đơn điệu (chẳng hạn như hàm logarit).

Một số quy ước:

  • Số lượng biến giải thích: \(x_1, x_2, \ldots, x_p\).
  • Số lượng tham số hồi quy: \(\beta_0, \beta_1, \ldots, \beta_p\).
  • Nếu \(\beta_0\) không đổi và phần còn lại là \(x_j\) thì số lượng biến giải thích là \(p\), số lượng tham số là \(p + 1\).

Các mô hình hồi quy tuyến tính là trường hợp đặc biệt của mô hình hồi quy tuyến tính tổng quát, với hàm liên kết \(g\) là hàm đồng nhất.

1.7 Interpreting Regression Models

Interpreting Regression Models - Diễn giải mô hình hồi quy

Mô hình chỉ thực sự hữu ích khi có thể diễn giải một cách hợp lý. Hai thành phần hệ thống sau được so sánh:

\[ \mu = \beta_0 + \beta_1 x \tag{1.17} \]

\[ \log \mu = \beta_0 + \beta_1 x \tag{1.18} \]

  • Mô hình (1.17) giả định mối quan hệ tuyến tính giữa \(\mu\)\(x\), tức là khi \(x\) tăng một đơn vị thì \(\mu\) tăng thêm \(\beta_1\).
  • Mô hình (1.18) giả định mối quan hệ tuyến tính giữa \(\log \mu\)\(x\), nghĩa là khi \(x\) tăng một đơn vị thì \(\log \mu\) tăng thêm \(\beta_1\). Điều này ngụ ý rằng \(\mu\) tăng (xấp xỉ) theo hệ số \(\exp(\beta_1)\).

Cụ thể, viết lại phương trình (1.18):

\[ \mu_x = \exp(\beta_0 + \beta_1 x) = \exp(\beta_0) \exp(\beta_1)^x \]

Khi \(x\) tăng từ \(x\) lên \(x + 1\), ta có:

\[ \mu_{x+1} = \exp(\beta_0) \exp(\beta_1)^{x+1} = \mu_x \exp(\beta_1) \]

Do đó, mỗi khi \(x\) tăng 1, \(\mu\) tăng lên một hệ số là \(\exp(\beta_1)\).

Nhà nghiên cứu cần lựa chọn mô hình có khả năng diễn giải hợp lý hơn với ngữ cảnh thực tế. Những mô hình dựa trên lý thuyết nền tảng (như mô hình (1.17) cho hồi quy tuyến tính) sẽ cho cách diễn giải dễ hiểu, trong khi cả hai mô hình (1.17) và (1.18) đều thích hợp cho hồi quy tuyến tính tổng quát (GLM).

Ngoài ra, khi có nhiều biến giải thích, cần cẩn trọng vì các biến có thể liên quan đến nhau (ví dụ: tuổi và chiều cao đều ảnh hưởng đến dung tích phổi). Khi đó, việc diễn giải các hệ số hồi quy cần xem xét mối quan hệ giữa các biến giải thích để tránh nhầm lẫn.

1.8 All Models Are Wrong, but Some Are Useful

Các mô hình thống kê là cách để hiểu dữ liệu, nhưng chúng không phải là đại diện hoàn hảo cho thực tế. Box và Draper (1987) từng nói: “Tất cả các mô hình đều sai, nhưng một số thì hữu ích.”

Ý chính:
- Mô hình thống kê giúp đơn giản hóa, cô đọng thông tin để phục vụ một mục tiêu cụ thể. - Chúng không nhất thiết phải chính xác tuyệt đối, mà chỉ cần đủ để nắm được các đặc điểm quan trọng nhất của thực tế trong bối cảnh sử dụng.

1.9 The Purpose of a Statistical Model Affects How It Is Developed: Prediction vs Interpretation

Mục đích xây dựng mô hình ảnh hưởng lớn đến cách mô hình được phát triển.

Hai mục tiêu chính:

  • Dự đoán (Prediction) Mô hình dùng để dự báo các giá trị tương lai dựa trên dữ liệu hiện tại.

  • Diễn giải (Interpretation) Mô hình giúp hiểu mối quan hệ giữa các biến, ví dụ như biến nào ảnh hưởng mạnh đến kết quả.

Ví dụ:

  • Trong dữ liệu về dung tích phổi (lung capacity), nếu mục tiêu là diễn giải, ta sẽ quan tâm đến chiều cao và tuổi có ảnh hưởng như thế nào đến FEV. Nếu mục tiêu là dự đoán, ta sẽ chọn mô hình nào cho sai số nhỏ nhất, có thể sử dụng nhiều biến hơn hoặc áp dụng biến đổi (như log, sqrt).

1.10 Accuracy vs Parsimony

Trong mô hình thống kê, có rất nhiều cách chọn thành phần hệ thống và ngẫu nhiên. Vấn đề đặt ra là: làm sao chọn được một mô hình phù hợp từ vô số mô hình khả dĩ?

Ba cách tiếp cận chính để chọn mô hình thống kê:

  • Dựa trên lý thuyết nền tảng hoặc hiểu biết vật lý của hiện tượng, ví dụ: mô hình thể tích phổi ∝ chiều cao.
  • Dựa trên xấp xỉ hoặc suy luận đơn giản hóa từ thực tế, như thể tích phổi được ước lượng dựa trên mô hình hình trụ:
    \[ \text{Thể tích} \propto r^2 \cdot h \Rightarrow \text{FEV} \propto x^2 \]
  • Dựa hoàn toàn vào dữ liệu, trong trường hợp không có lý thuyết nền hoặc trạng thái “đúng” thực sự không xác định.

Hai tiêu chí chính để chọn mô hình:

  • Accuracy (Độ chính xác): Mô hình nên mô tả đúng cả hai thành phần hệ thốngngẫu nhiên.
  • Parsimony (Tính đơn giản): Mô hình càng đơn giản càng tốt.

Theo nguyên lý Occam’s Razor, mô hình tốt nhất là mô hình đơn giản nhất mà vẫn mô tả đúng dữ liệu.

Mô hình quá đơn giản sẽ bỏ sót xu hướng dữ liệu; mô hình quá phức tạp thì dễ bị overfitting – tức là chỉ phù hợp với tập dữ liệu hiện tại nhưng kém tổng quát hóa với dữ liệu mới.

Ví dụ minh họa:

Dữ liệu sinh ra từ mô hình:
\[ y \sim \mathcal{N}(\mu, 0.35),\quad \mu = x^3 - 3x + 5 \]

Ba mô hình thử nghiệm:

  • Linear model: Đường thẳng – sai xu hướng, phương sai lớn, không ngẫu nhiên.
  • Cubic model: Theo đúng mô hình sinh dữ liệu – chính xác, đơn giản, ngẫu nhiên đúng.
  • 10th-order polynomial: Dường như khớp mọi điểm dữ liệu – quá phức tạp, biểu diễn cả nhiễu, dẫn đến dự đoán sai lệch.

*Cubic model là mô hình được ưu tiên theo tiêu chí cân bằng giữa accuracy và parsimony**.

1.11 Experiments vs Observational Studies – Causality vs Association

Experiments vs Observational Studies – Causality vs Association: Thí nghiệm vs Nghiên cứu quan sát: Nhân quả vs Tương quan

Mọi mô hình thống kê cần được sử dụng và hiểu trong bối cảnh cách dữ liệu được thu thập. Cách thu thập ảnh hưởng đến kết luận có thể rút ra từ mô hình.

Hai loại nghiên cứu chính:

Nghiên cứu quan sát (Observational Study)

  • Nhà nghiên cứu không can thiệp, chỉ quan sát và ghi nhận dữ liệu có sẵn (ví dụ: qua bảng hỏi, thiết bị đo lường).
  • Kết luận rút ra thường chỉ là mối tương quan (association) giữa các biến.
  • Ví dụ: Dữ liệu lung capacity là nghiên cứu quan sát – không kiểm soát được người tham gia có hút thuốc hay không.

Thí nghiệm (Designed Experiment)

  • Nhà nghiên cứu chủ động áp dụng điều kiện cho từng đối tượng, kiểm soát giá trị của biến giải thích.
  • Cho phép rút ra kết luận về quan hệ nhân quả (causality).

So sánh mô hình:

  • Về mặt kỹ thuật thống kê, cả hai loại dữ liệu được mô hình giống nhau.
  • Tuy nhiên, về mặt khoa học, kết luận từ thí nghiệm được xem là mạnh hơn nhiều.

Cách xử lý trong nghiên cứu quan sát:

  • Không thể kiểm soát hoàn toàn các yếu tố gây nhiễu.
  • Giải pháp: đo lường càng nhiều biến phụ càng tốt (ví dụ: tuổi, chiều cao, giới tính), sau đó điều chỉnh trong phân tích để giảm nhiễu.

Ví dụ 1.8: Lung capacity và hút thuốc

  • Là một nghiên cứu quan sát.
  • Biến chính quan tâm: hút thuốc.
  • Các yếu tố gây nhiễu như tuổi, chiều cao, giới tính được ghi nhận để điều chỉnh.
  • Mục tiêu: phân tích mối liên hệ giữa hút thuốc và FEV sau khi đã điều chỉnh các biến phụ.
  • Cảnh báo: Không nên rút ra kết luận nhân quả chỉ từ dữ liệu quan sát.

1.12 Thu thập dữ liệu và tính khái quát của mô hình thống kê

Tính khái quát (generalizability) của mô hình phụ thuộc vào nguồn dữ liệu được thu thập. Kết luận từ một mô hình thống kê chỉ có giá trị trong phạm vi của quần thể mà dữ liệu được lấy từ đó.

Ví dụ:

Nếu dữ liệu được thu thập từ phụ nữ trên 60 tuổi ở Nhật Bản, thì kết quả phân tích không thể áp dụng cho:

  • Nam giới
  • Phụ nữ Nhật dưới 60 tuổi
  • Phụ nữ trên 60 tuổi ở các quốc gia khác

Ngoài ra:

  • Kết quả từ một mô hình hồi quy không thể suy rộng (extrapolate) ngoài phạm vi dữ liệu ban đầu.
  • Không nên áp dụng mô hình cho những giá trị nằm ngoài tập dữ liệu huấn luyện nếu không có cơ sở rõ ràng.

Ví dụ 1.9 – Dữ liệu dung tích phổi (lung capacity):

  • Thu thập từ thanh thiếu niên tại Boston (tuổi 3–19) trong giai đoạn giữa đến cuối thập niên 1970.

  • Dữ liệu phản ánh hành vi hút thuốc của thanh thiếu niên ở thời điểm và địa phương đó.

  • Suy luận cho:

    • Các thời điểm khác
    • Khu vực khác
    • Hoặc các nhóm tuổi khác

    đều cần thận trọng vì có thể không còn phù hợp.

  • Chiều cao trong dữ liệu nằm trong khoảng 46–74 inches ⇒ mô hình không thể áp dụng cho chiều cao ngoài khoảng đó.

  • Không thể kỳ vọng rằng FEV sẽ tăng tuyến tính mãi mãi với tuổi và chiều cao.

Kết luận: Khi sử dụng mô hình thống kê, cần hiểu rõ phạm vi ứng dụng của kết luận, tránh việc khái quát hóa sai từ mẫu đến quần thể khác.

1.13 Data Collection and Generalizability

  • Tính tổng quát của mô hình thống kê phụ thuộc rất lớn vào cách thu thập dữ liệu.
  • Kết luận từ một mô hình chỉ có thể áp dụng cho quần thể mà từ đó mẫu được lấy.
    • Ví dụ: Nếu dữ liệu chỉ lấy từ phụ nữ trên 60 tuổi ở Nhật Bản, thì kết luận không thể áp dụng cho nam giới hoặc người trẻ tuổi, hay ở quốc gia khác.
  • Không nên ngoại suy mô hình ra ngoài phạm vi dữ liệu gốc.
    • Ví dụ: Dữ liệu dung tích phổi thu thập từ thanh thiếu niên ở Boston năm 1970 không thể áp dụng chắc chắn cho thanh thiếu niên hiện nay hoặc từ nơi khác.
  • Cần thận trọng với phạm vi giá trị của các biến trong dữ liệu:
    • Nếu dữ liệu chỉ bao gồm chiều cao từ 46 đến 74 inches và độ tuổi từ 3 đến 19,
    • thì mô hình không nên được sử dụng cho chiều cao hay độ tuổi ngoài phạm vi đó.
  • Việc giả định tuyến tính hoặc áp dụng mô hình ngoài phạm vi dữ liệu gốc có thể gây ra sai lệch nghiêm trọng.

Ý nghĩa thực tiễn

  • Khi xây dựng và áp dụng mô hình thống kê, cần:
    • Xác định rõ phạm vi dữ liệu.
    • Hiểu giới hạn khái quát hóa.
    • Tránh ngoại suy không có căn cứ.

Ghi nhớ: Dữ liệu chỉ đại diện cho những gì bạn đo lường — đừng dùng mô hình cho những thứ nằm ngoài phạm vi bạn chưa từng khảo sát.


CHƯƠNG 2: MÔ HÌNH HỒI QUY TUYẾN TÍNH - LINEAR REGREESSION MODELS

2.1: Introduction and Overview

Tóm tắt nội dung

  • Linear regression model là mô hình hồi quy phổ biến nhất trong thống kê và là trọng tâm mở đầu của chương 2.
  • Chương này thiết lập ngôn ngữ, ký hiệu và giả định cơ bản cho tất cả người đọc trước khi chuyển sang mô hình tổng quát hơn – generalized linear models (GLMs).
  • Linear regression models được xem như một trường hợp đặc biệt của GLMs.

Cấu trúc nội dung chương 2

  1. Định nghĩa mô hình hồi quy tuyến tính và các giả định liên quan
  2. Ước lượng bình phương tối thiểu (least squares) cho:
    • Hồi quy tuyến tính đơn
    • Hồi quy tuyến tính đa biến
  3. Cách sử dụng R để khớp mô hình
  4. Giải thích hệ số hồi quy
  5. Suy luận thống kê cho các hệ số hồi quy
  6. Phân tích phương sai
  7. So sánh mô hình lồng nhau (nested)
  8. So sánh mô hình không lồng nhau (non-nested) với tiêu chí AIC và BIC
  9. Các công cụ hỗ trợ lựa chọn mô hình

Ý nghĩa

  • Việc bắt đầu từ mô hình tuyến tính giúp người học hiểu rõ nền tảng để tiếp cận các mô hình tổng quát hơn như GLMs.
  • Đây là bước quan trọng nhằm thiết lập cơ sở toán học và suy luận thống kê trong các nghiên cứu thực nghiệm.

Ghi nhớ: Linear regression không chỉ là mô hình đầu tiên mà còn là cửa ngõ để khám phá các mô hình thống kê phức tạp hơn.

2.2 Linear Regression Models Defined

Cấu trúc cơ bản của mô hình hồi quy tuyến tính

Linear regression model gồm 2 thành phần chính:

  • Thành phần ngẫu nhiên (random component):
    • Giả định phương sai của phản hồi \(y_i\) là không đổi:
      \[ \text{var}[y_i] = \sigma^2 / w_i \]
    • \(w_i\)trọng số ưu tiên đã biết (prior weights). Nếu \(w_i = 1\) với mọi \(i\), mô hình được gọi là hồi quy tuyến tính thường (ordinary linear regression).
  • Thành phần hệ thống (systematic component):
    • Kỳ vọng của \(y_i\) là kết hợp tuyến tính của các biến giải thích: \[ \mu_i = E[y_i] = \beta_0 + \sum_{j=1}^{p} \beta_j x_{ji} \]

Phân loại mô hình

  • Simple linear regression: khi chỉ có 1 biến giải thích \((p = 1)\).
  • Multiple linear regression: khi có nhiều hơn 1 biến giải thích \((p > 1)\).
  • Weighted linear regression: khi các trọng số \(w_i\) khác nhau.
  • Ordinary linear regression: khi mọi trọng số \(w_i = 1\).

Các giả định chính

  • Phù hợp (Suitability): Cùng một mô hình áp dụng cho mọi quan sát.
  • Tuyến tính (Linearity): Quan hệ giữa kỳ vọng \(\mu\) và biến giải thích là tuyến tính.
  • Phương sai không đổi (Constant variance): Phương sai \(\sigma^2\) là không đổi (hoặc tỷ lệ với \(1/w_i\)).
  • Độc lập (Independence): Các phản hồi \(y_i\) là độc lập với nhau.

Ví dụ minh họa

  • Dữ liệu cân nặng sơ sinh theo tuần tuổi thai kỳ từ bệnh viện St George’s (London) được dùng để minh họa mô hình hồi quy tuyến tính giữa cân nặng và tuần tuổi.

2.3 Simple Linear Regression

2.3.1 Least-Squares Estimation

  • Mô hình hồi quy tuyến tính đơn có dạng:

\[ \mu_i = E[y_i] = \beta_0 + \beta_1 x_i,\quad \text{Var}[y_i] = \sigma^2 / w_i \]

  • Tổng sai số bình phương có trọng số cần tối thiểu hóa:

\[ S(\beta_0, \beta_1) = \sum_{i=1}^n w_i (y_i - \beta_0 - \beta_1 x_i)^2 \]

2.3.2 Coefficient Estimates

  • Trung bình có trọng số:

\[ \bar{x}_w = \frac{\sum_{i=1}^{n} w_i x_i}{\sum_{i=1}^{n} w_i},\quad \bar{y}_w = \frac{\sum_{i=1}^{n} w_i y_i}{\sum_{i=1}^{n} w_i} \]

  • Ước lượng hệ số:

\[ \hat{\beta}_1 = \frac{\sum_{i=1}^n w_i (x_i - \bar{x}_w)(y_i)}{\sum_{i=1}^n w_i (x_i - \bar{x}_w)^2} \]

\[ \hat{\beta}_0 = \bar{y}_w - \hat{\beta}_1 \bar{x}_w \]

2.3.3 Estimating the Variance \(\sigma^2\)

  • Phần dư:

\[ e_i = y_i - \hat{\mu}_i = y_i - \hat{\beta}_0 - \hat{\beta}_1 x_i \]

  • Tổng bình phương phần dư (RSS):

\[ \text{RSS} = \sum_{i=1}^n w_i e_i^2 \]

  • Ước lượng không chệch của phương sai:

\[ s^2 = \frac{\text{RSS}}{n - 2} \]

2.3.4 Standard Errors of Coefficients

  • Phương sai và sai số chuẩn của \(\hat{\beta}_1\):

\[ \text{Var}[\hat{\beta}_1] = \frac{\sigma^2}{\sum_{i=1}^n w_i (x_i - \bar{x}_w)^2} \]

\[ \text{SE}[\hat{\beta}_1] = \sqrt{ \frac{s^2}{\sum_{i=1}^n w_i (x_i - \bar{x}_w)^2} } \]

  • Sai số chuẩn của \(\hat{\beta}_0\):

\[ \text{SE}[\hat{\beta}_0] = \sqrt{ s^2 \left( \frac{1}{\sum w_i} + \frac{\bar{x}_w^2}{\sum w_i (x_i - \bar{x}_w)^2} \right) } \]

2.3.5 Standard Errors of Fitted Values

  • Sai số chuẩn của giá trị dự đoán:

\[ \hat{\mu}_i = \hat{\beta}_0 + \hat{\beta}_1 x_i \]

\[ \text{SE}[\hat{\mu}_i] = s \cdot \sqrt{ \frac{1}{\sum w_i} + \frac{(x_i - \bar{x}_w)^2}{\sum w_i (x_i - \bar{x}_w)^2} } \]

Tổng kết

  • Hồi quy tuyến tính đơn là bước đầu cơ bản trong phân tích hồi quy. Việc ước lượng hệ số, phương sai và sai số chuẩn cho phép đánh giá mức độ tin cậy của mô hình. Các công thức trên là nền tảng để mở rộng sang hồi quy tuyến tính bội và generalized linear models.

Ghi nhớ: Kiểm tra các giả định của mô hình là rất quan trọng: tuyến tính, phương sai không đổi, độc lập và mô hình áp dụng phù hợp cho toàn bộ mẫu.

2.4 Ước lượng trong hồi quy bội (nhiều biến)

Dạng ma trận của mô hình:

Mô hình hồi quy tuyến tính có thể được viết dưới dạng ma trận:

\[ y = X\beta + \varepsilon \] Trong đó:

  • \(y\): vector phản hồi (cỡ \(n \times 1\))
  • \(X\): ma trận thiết kế (design matrix) kích thước \(n \times (p+1)\), với cột đầu tiên toàn số 1 (ứng với hệ số chặn \(\beta_0\)), các cột còn lại là giá trị của các biến giải thích \(x_j\)
  • \(\beta\): vector hệ số hồi quy (cỡ \((p+1) \times 1\))
  • \(\varepsilon \sim \mathcal{N}(0, \sigma^2 I)\): vector nhiễu có phân phối chuẩn đa biến với trung bình 0 và phương sai \(\sigma^2 I\)

Ước lượng OLS:

\[ \hat{\beta} = (X^T W X)^{-1} X^T W y \]

Phần dư và phương sai ước lượng:

  • Giá trị dự đoán (fitted values):

\[ \hat{\mu}_i = \hat{y}_i = \hat{\beta}_0 + \sum_{j=1}^{p} \hat{\beta}_j x_{ji} \]

  • Ước lượng phương sai phần dư:

\[ s^2 = \frac{RSS}{n - p'} \]

2.5 Sai số chuẩn và khoảng tin cậy

  • Sai số chuẩn của \(\hat{\beta}_j\):

\[ SE(\hat{\beta}_j) = \sqrt{s^{2} \cdot \bigl( X^{T} X \bigr)^{-1}_{jj}} \]

  • Khoảng tin cậy cho \(\hat{\beta}_j\):

\[ \hat{\beta}_j \pm t_{\alpha/2, \, n - p} \times SE(\hat{\beta}_j) \]

2.6 Sử dụng R để hồi quy

Mô hình hóa: model <- lm(y ~ x1 + x2, data = dataset)

Kết quả mô hình:

  • summary(model)

  • confint(model)

  • anova(model)

2.7 Diễn giải hệ số hồi quy

  • \(\beta_0\): giá trị trung bình của \(y\) khi tất cả các biến \(x_j = 0\).

  • \(\beta_j\): mức thay đổi kỳ vọng của \(y\) khi \(x_j\) tăng 1 đơn vị, giữ các biến khác không đổi.

2.8 Suy luận thống kê

  • Giả sử kiểm định với

\[ H_0: \beta_j = 0 \]

  • Thống kê kiểm định

\[ t = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim t_{n-p} \]

  • Trong đó:

    • \(\hat{\beta}_j\) là hệ số ước lượng của biến \(j\),

    • \(SE(\hat{\beta}_j)\) là sai số chuẩn của \(\hat{\beta}_j\),

    • \(t_{n-p}\) là phân phối t với \(n-p\) bậc tự do.

2.9 Phân tích phương sai (ANOVA)

  • Giá trị tổng phương sai \(TSS\) được tính theo công thức:

\[ TSS = \sum_{i=1}^{n} (y_i - \bar{y})^2 \]

  • Tổng phương sai được phân tích thành hai phần:

\[ TSS = SSR + RSS \]

  • Trong đó:

    • \(SSR\) là tổng bình phương phần giải thích (Explained Sum of Squares), được tính bằng:

\[ SSR = \sum_{i=1}^{n} (\hat{y}_i - \bar{y})^2 \]

  • \(RSS\) là tổng bình phương phần dư (Residual Sum of Squares), được tính bằng:

\[ RSS = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 \]

  • Hệ số xác định \(R^2\) được định nghĩa là:

\[ R^2 = \frac{SSR}{TSS} = 1 - \frac{RSS}{TSS} \]

2.10 So sánh mô hình lồng (Nested Models)

Định nghĩa: Hai mô hình được gọi là lồng nhau (nested models) khi mô hình đơn giản hơn (reduced model) là một trường hợp đặc biệt của mô hình phức tạp hơn (full model), tức là nó được tạo ra bằng cách loại bỏ một hay nhiều biến khỏi mô hình đầy đủ.

  • Kiểm định F:

\[ F = \frac{(RSS_{\text{reduced}} - RSS_{\text{full}}) / (p_{\text{full}} - p_{\text{reduced}})}{s^2_{\text{full}}} \]

Trong đó:

  • \(RSS_{\text{reduced}}\) là tổng bình phương phần dư của mô hình rút gọn,

  • \(RSS_{\text{full}}\) là tổng bình phương phần dư của mô hình đầy đủ,

  • \(p_{\text{full}}\)\(p_{\text{reduced}}\) lần lượt là số tham số của mô hình đầy đủ và mô hình rút gọn,

  • \(s^2_{\text{full}}\) là ước lượng phương sai phần dư của mô hình đầy đủ, được tính bằng:

\[ s^2_{\text{full}} = \frac{RSS_{\text{full}}}{n - p_{\text{full}}} \]

với \(n\) là số quan sát.

2.11 So sánh mô hình không lồng (Non-Nested Models)

Định nghĩa: Hai mô hình được gọi là không lồng (non-nested) nếu không có mô hình nào là một trường hợp đặc biệt (submodel) của mô hình còn lại.

  • AIC (Akaike Information Criterion) là chỉ số dùng để đánh giá độ phù hợp của mô hình, đồng thời phạt mức độ phức tạp của mô hình:

\[ AIC = -2 \cdot \ell(\hat{\theta}) + 2k \]

  • Trong đó:

  • \(\ell(\hat{\theta})\) là log-likelihood tại ước lượng MLE \(\hat{\theta}\),

  • \(k\) là số tham số trong mô hình (bao gồm cả hệ số hằng số \(\beta_0\)).

  • BIC (Bayesian Information Criterion) tương tự AIC nhưng mức phạt độ phức tạp mạnh hơn, được tính bằng:

\[ BIC = -2 \cdot \ell(\hat{\theta}) + \log(n) \cdot k \]

  • Trong đó:

    • \(n\) là kích thước mẫu,

    • \(k\)\(\ell(\hat{\theta})\) như trên.

  • Nguyên tắc chọn mô hình:

    • AIC/BIC càng nhỏ càng tốt.

    • Nếu AIC của mô hình A < mô hình B khoảng 2 điểm trở lên, mô hình A được ưu tiên hơn đáng kể.

2.12 Lựa chọn mô hình tự động (Automated Model Selection)

Định nghĩa:Lựa chọn mô hình là quá trình tìm ra tập hợp biến giải thích tốt nhất (phù hợp, đơn giản) để mô hình hóa biến phản hồi.

  • Có nhiều chiến lược lựa chọn mô hình:

    • Forward selection: bắt đầu từ mô hình rỗng, thêm biến từng bước.

    • Backward elimination: bắt đầu từ mô hình đầy đủ, loại bỏ từng biến.

    • Stepwise selection: kết hợp cả thêm và bớt biến ở mỗi bước.

  • Một số hàm sử dụng:

    • step(): chọn mô hình theo hướng forward/backward/stepwise.

    • drop1(), add1(): thêm hoặc bớt biến với kiểm định F.

    • extractAIC(): trả về AIC và số tham số.


CHƯƠNG 3: CHẨN ĐOÁN MÔ HÌNH HỒI QUY TUYẾN TÍNH

Linear Regression Models: Diagnostics and Model-Building (Chẩn đoán mô hình hồi quy tuyến tính)

3.1. Giới thiệu và tổng quan

Sau khi xây dựng một mô hình hồi quy tuyến tính, công việc không kết thúc ở việc ước lượng các hệ số hồi quy và kiểm định ý nghĩa thống kê. Một bước quan trọng không thể thiếu là chẩn đoán mô hình – tức là đánh giá xem mô hình đã được xây dựng có thực sự phù hợp với dữ liệu hay không.

Chẩn đoán mô hình hồi quy là một phần thiết yếu trong phân tích dữ liệu vì nó giúp ta:

  • Xác minh các giả định cơ bản của mô hình hồi quy tuyến tính có được thỏa mãn hay không (ví dụ như quan hệ tuyến tính, phương sai không đổi, phân phối chuẩn…).

  • Phát hiện những quan sát bất thường như điểm ngoại lai (outliers) hoặc điểm có ảnh hưởng lớn (influential observations) – những điểm có thể bóp méo kết quả ước lượng hoặc kiểm định.

  • Đánh giá độ tin cậy của các hệ số ước lượng.

Đề xuất cách cải thiện mô hình, ví dụ: biến đổi biến, thêm hoặc bớt biến giải thích, sử dụng mô hình phi tuyến hoặc tổng quát (GLM) thay thế.

Nếu bỏ qua bước này, người phân tích dễ rơi vào bẫy của việc “phù hợp quá mức” (overfitting), hiểu sai mối quan hệ giữa các biến, hoặc dự đoán sai lệch trong thực tế. Do đó, chẩn đoán mô hình không phải là tùy chọn – mà là một phần bắt buộc trong phân tích hồi quy nghiêm túc.

Trong chương này, chúng ta sẽ học cách:

  • Kiểm tra các giả định của mô hình hồi quy.

  • Sử dụng phần dư (residuals) để kiểm tra độ phù hợp.

  • Phát hiện và xử lý các điểm ảnh hưởng lớn.

  • Đo lường hiện tượng đa cộng tuyến và cách giảm thiểu.

3.2 Giả định trong mô hình hồi quy tuyến tính

Một mô hình hồi quy tuyến tính tiêu chuẩn đòi hỏi phải thỏa mãn 4 giả định cơ bản:

1. Giả định 1: Quan hệ tuyến tính

  • Mô hình giả định rằng trung bình của biến phản hồi \(y\) là hàm tuyến tính của các biến giải thích \(x_1, x_2, \ldots, x_p\).

  • Nếu quan hệ thật sự là phi tuyến mà ta vẫn dùng mô hình tuyến tính, kết quả ước lượng có thể bị thiên lệch và dự đoán sai.

\(\Rightarrow\) Cách kiểm tra: vẽ biểu đồ phần dư so với giá trị dự đoán, nếu thấy xu hướng cong (parabola, S-shape…) thì có thể là mô hình sai dạng.

2. Giả định 2: Phương sai không đổi (Homoscedasticity)

  • Phương sai của sai số \(\varepsilon_i\) là như nhau ở mọi mức giá trị của \(x\):

\[ \text{Var}(y_i) = \sigma^2 \]

  • Nếu phương sai thay đổi theo \(x\), ta có hiện tượng phương sai thay đổi (heteroscedasticity), dẫn đến ước lượng không hiệu quả và sai lệch trong kiểm định.

\(\Rightarrow\) Cách kiểm tra: vẽ đồ thị phần dư. Nếu phần dư có dạng hình nón (rộng dần hoặc hẹp lại) thì có thể bị heteroscedasticity.

3. Giả định 3: Độc lập

  • Các quan sát \((x_i, y_i)\) phải độc lập nhau.

  • Nếu dữ liệu có tính chuỗi thời gian, dữ liệu lồng ghép (nested data) hoặc phân nhóm (clustered), thì mô hình tuyến tính cơ bản không còn phù hợp.

\(\Rightarrow\) Cách kiểm tra: nếu dữ liệu theo thời gian, nên kiểm tra phần dư có xu hướng (autocorrelation) hay không.

4. Giả định 4: Phân phối chuẩn của sai số

  • Mặc dù không bắt buộc để ước lượng OLS, giả định này rất quan trọng để kiểm định giả thuyết và tính khoảng tin cậy: \[ \varepsilon_i \sim \mathcal{N}(0, \sigma^2) \]

\(\Rightarrow\) Cách kiểm tra: dùng biểu đồ Q-Q plot (quantile-quantile) để so sánh phần dư với phân phối chuẩn.

3.3 Các loại phần dư (Residuals)

Phần dư là công cụ trung tâm để chẩn đoán mô hình. Có nhiều cách tính phần dư:

1. Raw residual (Phần dư thô):

\[ e_i = y_i - \hat{y}_i \] Đơn giản là hiệu giữa giá trị thực tế và giá trị dự đoán.

2. Standardized residual (Phần dư chuẩn hóa):

\[ r_i = \frac{e_i}{\hat{\sigma} \sqrt{1 - h_{ii}}} \]

  • Giúp so sánh phần dư giữa các điểm có leverage khác nhau.

  • \(h_{ii}\): leverage – mức ảnh hưởng của điểm \(i\) lên dự đoán \(\hat{y}_i\).

3. Studentized residual:

\[ t_i = \frac{e_i}{\hat{\sigma}_{(i)} \sqrt{1 - h_{ii}}} \]

  • Giống standardized residual nhưng dùng \(\hat{\sigma}_{(i)}\) – phương sai ước lượng không dùng quan sát \(i\) \(\rightarrow\) chính xác hơn.

  • Dùng để phát hiện ngoại lai vì nó gần với phân phối t.

3.4 Biểu đồ phần dư (Residual Plots)

Một số biểu đồ quan trọng:

  • Residual vs Fitted Plot: kiểm tra tuyến tính và phương sai không đổi.

  • Normal Q-Q Plot: kiểm tra phân phối chuẩn của phần dư.

  • Scale-Location Plot: chuẩn hóa phần dư để dễ phát hiện heteroscedasticity.

  • Residuals vs Leverage Plot: xác định điểm ảnh hưởng lớn.

3.5 Ngoại lai (Outliers)

Định nghĩa: Là các điểm dữ liệu mà giá trị phản hồi \(y_i\) khác biệt lớn so với dự đoán từ mô hình, dù biến \(x_i\) không bất thường.

Dùng studentized residual để kiểm tra.

Quy tắc ngưỡng:

  • \(|t_i| > 2\): nghi ngờ.

  • \(|t_i| > 3\): có thể là ngoại lai đáng kể.

\(\Rightarrow\) Ngoại lai không nhất thiết có ảnh hưởng lớn, nhưng cần kiểm tra kỹ.

3.6 Điểm ảnh hưởng (Influential Points)

Định nghĩa: Là những điểm dữ liệu mà nếu bị loại bỏ, mô hình sẽ thay đổi đáng kể.

Các chỉ số phổ biến để đo ảnh hưởng:

1. Leverage (Hệ số đòn bẩy):

\[ h_{ii} = x_i^T (X^T X)^{-1} x_i \]

  • Đo khoảng cách của \(x_i\) đến trung tâm của các điểm \(x\).

  • Nếu \(h_{ii} > \frac{2p}{n}\): điểm có leverage cao.

2. Cook’s Distance (Khoảng cách Cook):

\[ D_i = \frac{p \hat{\sigma}^2 e_i^2}{(1 - h_{ii})^2 h_{ii}} \]

Kết hợp giữa độ lệch (residual) và leverage.

  • Nếu \(D_i > 0.5\): có thể có ảnh hưởng.

  • Nếu \(D_i > 1\): ảnh hưởng lớn cần xem xét kỹ.

3. DFBETAS:

\[ \text{DFBETAS}_{ij} = \frac{\hat{\beta}_j - \hat{\beta}_{j(i)}}{\text{SE}(\hat{\beta}_{j(i)})} \]

  • Mức thay đổi của hệ số \(\beta_j\) khi loại bỏ quan sát \(i\).

  • Dùng để kiểm tra ảnh hưởng của từng điểm lên từng hệ số cụ thể.

3.7 Đa cộng tuyến (Multicollinearity)

Định nghĩa: Xảy ra khi hai hay nhiều biến giải thích có tương quan cao, khiến cho ước lượng \(\beta_j\) không ổn định (nhỏ thay đổi dữ liệu \(\rightarrow\) lớn thay đổi hệ số).

Variance Inflation Factor (VIF):

\[ \mathrm{VIF}_j = \frac{1}{1 - R_j^2} \]

  • \(R_j^2\) : hệ số xác định khi hồi quy \(x_j\) lên tất cả các biến còn lại.

  • Nếu \(\mathrm{VIF}_j > 5\) hoặc \(> 10\): có vấn đề cần xử lý.

3.8 Sửa chữa mô hình sai

Khi mô hình vi phạm giả định:

  • Dùng biến đổi (log, sqrt, Box-Cox…).

  • Dùng mô hình phi tuyến hoặc mô hình GLM.

  • Loại bỏ hoặc thay thế điểm ảnh hưởng quá lớn.

  • Thêm biến bị thiếu hoặc loại bớt biến gây nhiễu.

CHƯƠNG 4: ƯỚC LƯỢNG HỢP LÝ TỐI ĐA

Maximum likehood estimation - MLE (ước lượng hợp lý tối đa)

4.1 Giới thiệu

Phương pháp bình phương tối thiểu (OLS) chỉ hoạt động hiệu quả khi dữ liệu thỏa mãn các giả định như phân phối chuẩn, phương sai không đổi, và biến phản hồi liên tục. Tuy nhiên, nhiều loại dữ liệu thực tế không tuân theo những điều kiện đó – ví dụ: dữ liệu nhị phân, đếm, hoặc dương liên tục. Khi đó, Maximum Likelihood Estimation (MLE) là phương pháp mạnh mẽ hơn, dùng để ước lượng các tham số trong mô hình tổng quát.

MLE là nền tảng cho mô hình tuyến tính tổng quát (GLM), vốn là trung tâm của phần còn lại trong sách.

4.2 Hàm hợp lý (Likelihood Function)

Định nghĩa: Hàm hợp lý là một hàm xác suất của toàn bộ dữ liệu đã quan sát, biểu diễn như một hàm của tham số \(\theta\).

Giả sử ta có một mẫu gồm \(n\) quan sát độc lập \(y_1, y_2, \ldots, y_n\), với mỗi \(y_i\) có phân phối xác suất \(f(y_i; \theta)\), thì:

Hàm hợp lý:

\[ L(\theta) = \prod_{i=1}^{n} f(y_i; \theta) \]

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

  • \(\theta\): vector các tham số cần ước lượng

  • \(f(y_i; \theta)\): mật độ xác suất (hoặc khối xác suất) của \(y_i\)

Log-hợp lý (log-likelihood):

\[ \ell(\theta) = \log L(\theta) = \sum_{i=1}^{n} \log f(y_i; \theta) \]

  • Dễ đạo hàm hơn vì tích thành tổng.

  • Giá trị cực đại của \(\ell(\theta)\) trùng với \(L(\theta)\).

4.3 Ước lượng hợp lý tối đa (Maximum Likelihood Estimation – MLE)

Định nghĩa: MLE là giá trị \(\hat{\theta}\) của tham số \(\theta\) sao cho log-likelihood đạt cực đại.

\[ \hat{\theta} = \arg\max_{\theta} \, \ell(\theta) \] Để tìm \(\hat{\theta}\), ta giải:

\[ \frac{d\ell(\theta)}{d\theta} = 0 \]

\(\Rightarrow\) Đây gọi là phương trình điểm (score equation).

4.4 Ma trận thông tin Fisher và phương sai

1. Hàm điểm (Score Function):

\[ U(\theta) = \frac{d\ell(\theta)}{d\theta} \]

  • \(U(\theta)\): độ dốc của log-likelihood theo \(\theta\)

2. Ma trận thông tin Fisher:

\[ I(\theta) = -\mathbb{E} \left[ \frac{d^2 \ell(\theta)}{d\theta^2} \right] \]

  • \(I(\theta)\): kỳ vọng âm của đạo hàm bậc hai log-likelihood → đo độ cong.

  • Là xấp xỉ ngược lại của phương sai: \[ \mathrm{Var}(\hat{\theta}) \approx \frac{1}{I(\theta)} \]

4.5 Các tính chất của MLE

MLE có nhiều tính chất tốt về mặt lý thuyết, đặc biệt khi kích thước mẫu n lớn:

Tính chất Giải thích
Nhất quán \(\hat{\theta} \to \theta\) khi \(n \to \infty\)
Không chệch tiệm cận Độ lệch giữa \(\hat{\theta}\)\(\theta\) tiến về 0
Hiệu quả MLE đạt giới hạn Cramér–Rao, là ước lượng “tốt nhất”
Tiệm cận chuẩn Khi \(n\) lớn, phân phối của \(\hat{\theta}\) gần chuẩn: \(\hat{\theta} \sim \mathcal{N}(\theta, I(\theta)^{-1})\)

4.6 Kiểm định giả thuyết với MLE

  • Muốn kiểm tra giả thuyết:

\[ H_0: \theta = \theta_0 \]

  • Ta có 3 cách phổ biến:

1. Wald Test:

\[ Z = \frac{\hat{\theta} - \theta_0}{SE(\hat{\theta})}, \quad Z \sim N(0,1) \]

  • Dùng để kiểm định nếu \(SE(\hat{\theta})\) đã có.

2. Likelihood Ratio Test (LRT):

\[ LR = 2 \left[ \ell(\hat{\theta}) - \ell(\theta_0) \right] \sim \chi^2_{df} \]

  • So sánh log-likelihood của mô hình đầy đủ và mô hình rút gọn.

  • \(df\): số tham số bị ràng buộc trong \(H_0\).

3. Score Test (Lagrange Multiplier Test):

\[ S = \frac{U(\theta_0)^2}{I(\theta_0)} \sim \chi^2_1 \]

Không cần ước lượng mô hình đầy đủ.

4.7 So sánh mô hình bằng AIC và BIC

Khi không thể dùng kiểm định LRT (do mô hình không lồng), ta dùng:

1. AIC – Akaike Information Criterion:

\[ \text{AIC} = -2\ell + 2k \]

  • \(k\): số tham số trong mô hình

  • \(\ell\): log-likelihood tại MLE

2. BIC – Bayesian Information Criterion:

\[ \text{BIC} = -2\ell + \log(n) \cdot k \]

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

→ Chọn mô hình có AIC/BIC thấp hơn.

4.8 MLE trong mô hình không tuyến tính chuẩn

  • Hồi quy logistic (nhị phân):

\[ y_i \sim \text{Bernoulli}(\pi_i), \quad \log\left(\frac{\pi_i}{1 - \pi_i}\right) = x_i^T \beta \]

  • Hồi quy Poisson (đếm):

\[ y_i \sim \text{Poisson}(\mu_i), \quad \log(\mu_i) = x_i^T \beta \]

  • Hồi quy Gamma (dương liên tục):

\[ y_i \sim \text{Gamma}(\alpha, \mu_i), \quad \log(\mu_i) = x_i^T \beta \]

→ Cả ba đều dùng MLE để ước lượng \(\beta\), chứ không dùng OLS.

CHƯƠNG 5: CẤU TRÚC CỦA MÔ HÌNH TUYẾN TÍNH TỔNG QUÁT (GLM STRUCTURE)

5.1 Giới thiệu

Mô hình tuyến tính tổng quát (GLM) là một khuôn khổ mạnh mẽ cho việc mô hình hóa các loại dữ liệu khác nhau – không chỉ dữ liệu liên tục có phân phối chuẩn như trong hồi quy tuyến tính. GLM bao gồm hồi quy logistic, hồi quy Poisson, hồi quy Gamma… và mở rộng khả năng phân tích đến dữ liệu nhị phân, đếm, tỷ lệ và dương liên tục.

Mỗi GLM được xây dựng trên cùng một nguyên lý chung gồm ba thành phần chính: phân phối xác suất, hàm liên kết, và thành phần tuyến tính.

5.2 Cấu trúc 3 phần của GLM

1. Thành phần ngẫu nhiên (Random component)

Biến phản hồi \(y_i\) được giả định phân phối theo một phân phối thuộc họ hàm mũ một tham số (One-Parameter Exponential Family):

\[ f(y_i; \theta_i, \phi) = \exp \left\{ \frac{y_i \theta_i - b(\theta_i)}{\phi} + c(y_i, \phi) \right\} \]

  • Ý nghĩa các ký hiệu:

    • \(\theta_i\): tham số tự nhiên (natural parameter)
    • \(\phi\): tham số phân tán (dispersion parameter), không phải lúc nào cũng có (ví dụ Poisson thì \(\phi = 1\))
    • \(b(\theta_i)\): hàm log partition
    • \(c(y_i, \phi)\): hàm chuẩn hóa để bảo toàn tích phân bằng 1

→ Họ hàm mũ bao gồm Normal, Poisson, Binomial, Gamma,…

2. Thành phần hệ thống (Systematic component)

Giống như hồi quy tuyến tính, GLM vẫn dùng một predictor tuyến tính:

\[ \eta_i = x_i^T \beta = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \]

Ý nghĩa:

  • \(\eta_i\): predictor tuyến tính
  • \(x_i\): vector hàng gồm các biến giải thích của quan sát \(i\)
  • \(\beta\): vector hệ số hồi quy

Đây là thành phần chứa ảnh hưởng của các biến độc lập lên mô hình.

3. Hàm liên kết (Link function)

GLM dùng một hàm liên kết \(g(\cdot)\) để kết nối trung bình \(\mu_i = E[y_i]\) với predictor tuyến tính \(\eta_i\):

\[ g(\mu_i) = \eta_i \quad \text{hay} \quad \mu_i = g^{-1}(\eta_i) \]

→ Cho phép mô hình hóa các biến phản hồi có đặc tính phi tuyến, không âm, giới hạn trong khoảng (0,1),…

Hàm liên kết thường dùng:

Phân phối \(\mu_i = E[y_i]\) Link function \(g(\mu)\) Ghi chú
Normal \(\mu \in \mathbb{R}\) \(g(\mu) = \mu\) (identity) Hồi quy tuyến tính chuẩn
Binomial \(\mu \in (0,1)\) \(g(\mu) = \log \frac{\mu}{1-\mu}\) Logistic regression
Poisson \(\mu > 0\) \(g(\mu) = \log(\mu)\) Hồi quy đếm
Gamma \(\mu > 0\) \(g(\mu) = \log(\mu)\) hoặc \(g(\mu) = \frac{1}{\mu}\) Mô hình dữ liệu dương

5.3 Ví dụ mô hình hóa trong GLM

1. Hồi quy Logistic (nhị phân)

\[ y_i \sim \text{Bernoulli}(\pi_i) \]

\[ g(\pi_i) = \log \left(\frac{\pi_i}{1-\pi_i}\right) = \eta_i \]

\[ \pi_i = P(y_i = 1 \mid x_i) \]

  • Dùng cho dữ liệu như: sống/chết, mua/không mua, đúng/sai…

2. Hồi quy Poisson (đếm)

\[ y_i \sim \text{Poisson}(\mu_i) \]

\[ \log(\mu_i) = x_i^T \beta \]

  • \(\mu_i\): số sự kiện kỳ vọng xảy ra.

  • Dùng cho dữ liệu: số ca bệnh, số lần vi phạm, số giao dịch…

3. Hồi quy Gamma (dương liên tục)

\[ y_i \sim \text{Gamma}(\alpha, \mu_i) \]

Hàm liên kết:

\[ g(\mu_i) = \log(\mu_i) \quad \text{hoặc} \quad g(\mu_i) = \frac{1}{\mu_i} \]

  • Dùng cho dữ liệu chi phí, độ dài, thời gian

5.4 Hàm phương sai (Variance Function)

Trong GLM, phương sai của \(y_i\) không cần bằng nhau mà được mô hình hóa như hàm của \(\mu_i\):

\[ \text{Var}(y_i) = \phi \cdot V(\mu_i) \]

Trong đó:

  • \(\phi\): tham số phân tán (dispersion parameter)
  • \(V(\mu)\): hàm phương sai phụ thuộc vào trung bình \(\mu\)

Hàm \(V(\mu)\) tùy theo phân phối như sau:

Phân phối \(V(\mu)\)
Normal 1
Binomial \(\mu (1 - \mu)\)
Poisson \(\mu\)
Gamma \(\mu^2\)

Việc mô hình hóa phương sai như trên giúp xử lý được hiện tượng phương sai thay đổi (heteroscedasticity), vốn là một giả định bị vi phạm trong phương pháp OLS (Hồi quy tuyến tính thông thường).

5.5 Các khái niệm mở rộng

Canonical Link Function là hàm liên kết sao cho predictor tuyến tính chính là tham số tự nhiên \(\theta\) trong phân phối họ hàm mũ:

\[ \theta_i = \eta_i = x_i^T \beta \]

Ví dụ về hàm liên kết chuẩn (canonical link):

Phân phối Hàm liên kết (Link function)
Binomial logit: \(\log\frac{\mu}{1-\mu}\)
Poisson log: \(\log(\mu)\)
Normal identity: \(\mu\)

Lưu ý: Dù GLM gọi là “tuyến tính”, nhưng mối quan hệ giữa \(y\)\(x\) có thể phi tuyến do sử dụng hàm liên kết (link function).

CHƯƠNG 6: ƯỚC LƯỢNG TRONG MÔ HÌNH TUYẾN TÍNH TỔNG QUÁT (GLMs)

6.1 Giới thiệu

Sau khi xác định được cấu trúc của một GLM (gồm phân phối xác suất, hàm liên kết và thành phần tuyến tính), bước tiếp theo là ước lượng các hệ số hồi quy \(\beta\) trong mô hình.

Khác với hồi quy tuyến tính cổ điển – nơi ta dùng phương pháp bình phương tối thiểu (OLS) – trong GLM, các hệ số được ước lượng bằng phương pháp hợp lý tối đa (Maximum Likelihood Estimation - MLE) thông qua một thuật toán gọi là Iteratively Reweighted Least Squares (IRLS).

Phương pháp IRLS thực hiện việc cập nhật các ước lượng \(\beta\) lặp đi lặp lại, mỗi lần dựa trên trọng số được điều chỉnh sao cho phù hợp với phân phối của dữ liệu và hàm liên kết được chọn.

6.2 Tổng quan về ước lượng hợp lý tối đa (MLE) trong GLM

Cho dữ liệu gồm:

  • Biến phản hồi: \(y_1, y_2, \ldots, y_n\) có thể là biến đếm, nhị phân hoặc liên tục dương…

  • Biến giải thích: \(x_{i1}, \ldots, x_{ip}\) với \(i=1, \ldots, n\).

Mô hình GLM được biểu diễn như sau:

\[ g(\mu_i) = \eta_i = \mathbf{x}_i^T \boldsymbol{\beta} \]

với

\[ \mu_i = E[y_i] = g^{-1}(\mathbf{x}_i^T \boldsymbol{\beta}) \]

Mục tiêu là tìm ước lượng \(\hat{\boldsymbol{\beta}}\) sao cho hàm log-likelihood đạt cực đại:

\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \log f(y_i; \theta_i) \]

Trong đó:

  • \(f(y_i; \theta_i)\) là hàm mật độ xác suất (hoặc hàm khối xác suất) của biến \(y_i\),

  • \(\theta_i\) là tham số tự nhiên trong phân phối thuộc họ hàm mũ,

  • \(\theta_i\) có quan hệ với \(\mu_i\), từ đó liên hệ với \(\boldsymbol{\beta}\).

Việc ước lượng này thường được thực hiện bằng phương pháp hợp lý tối đa (MLE), sử dụng thuật toán Iteratively Reweighted Least Squares (IRLS).

6.3 Phương pháp IRLS (Iteratively Reweighted Least Squares)

1. Thuật toán IRLS (Iteratively Reweighted Least Squares):

GLM sử dụng thuật toán IRLS để tìm ước lượng \(\hat{\boldsymbol{\beta}}\). Thuật toán dựa trên việc lặp lại các bước hồi quy tuyến tính có trọng số.

2. Ý tưởng cơ bản:

  • Ở mỗi vòng lặp, mô hình GLM được xấp xỉ bằng một hồi quy tuyến tính với trọng số.

  • Biến giả (working response) \(\mathbf{z}\)ma trận trọng số \(\mathbf{W}\) được cập nhật liên tục ở mỗi bước.

3. Hệ phương trình IRLS:

\[ \mathbf{X}^T \mathbf{W} \mathbf{X} \hat{\boldsymbol{\beta}} = \mathbf{X}^T \mathbf{W} \mathbf{z} \]

Trong đó:

  • \(\mathbf{X}\) là ma trận thiết kế,

  • \(\mathbf{W}\) là ma trận trọng số kích thước \(n \times n\),

  • \(\mathbf{z}\) là vector biến giả \(n \times 1\), tính theo công thức:

\[ z_i = \eta_i + \frac{y_i - \mu_i}{\frac{d \mu_i}{d \eta_i}} \]

  • Trọng số \(W_i\) được tính theo:

\[ W_i = \left(\frac{d \mu_i}{d \eta_i}\right)^2 \Big/ \mathrm{Var}(y_i) \]

Quá trình này được lặp lại cho đến khi các ước lượng \(\boldsymbol{\beta}\) hội tụ.

6.4 Hàm điểm, ma trận Fisher và phương sai của ước lượng

Hàm điểm (Score Function)

Hàm điểm là đạo hàm của log-likelihood theo vector hệ số \(\boldsymbol{\beta}\):

\[ U(\boldsymbol{\beta}) = \frac{\partial \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta}} \]

Đây là hệ phương trình mà khi giải \(U(\boldsymbol{\beta}) = 0\), ta thu được ước lượng cực đại \(\hat{\boldsymbol{\beta}}\).

Ma trận thông tin Fisher

Ma trận thông tin Fisher là kỳ vọng âm của đạo hàm bậc hai của log-likelihood:

\[ \mathcal{I}(\boldsymbol{\beta}) = - \mathbb{E} \left[ \frac{\partial^2 \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta} \, \partial \boldsymbol{\beta}^T} \right] \]

Ma trận này đóng vai trò như một thước đo độ “sắc nét” của log-likelihood tại điểm cực đại và được dùng để đánh giá độ chính xác của ước lượng.

Phương sai của \(\hat{\boldsymbol{\beta}}\)

Khi đã có ma trận thông tin Fisher, phương sai hiệp phương sai của vector hệ số ước lượng được tính là:

\[ \mathrm{Var}(\hat{\boldsymbol{\beta}}) = \mathcal{I}(\hat{\boldsymbol{\beta}})^{-1} \]

Nếu sử dụng thuật toán IRLS, ma trận thông tin Fisher được xấp xỉ bởi:

\[ \mathrm{Var}(\hat{\boldsymbol{\beta}}) = (\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1} \]

Trong đó:

  • \(\mathbf{X}\): ma trận thiết kế,

  • \(\mathbf{W}\): ma trận trọng số tại nghiệm hội tụ,

  • Công thức này xuất hiện tự nhiên từ bước giải hệ phương trình IRLS.

Ghi chú

  • Công thức phương sai trên rất quan trọng để tính khoảng tin cậy và kiểm định giả thuyết trong GLM.

  • Với các mô hình lớn, ma trận \((\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1}\) thường được tính thông qua giải hệ phương trình thay vì đảo trực tiếp để tránh sai số số học.

6.5 Sai số chuẩn và khoảng tin cậy

Sai số chuẩn (Standard Error)

Sau khi có được ước lượng \(\hat{\boldsymbol{\beta}}\) và ma trận phương sai hiệp phương sai \(\mathrm{Var}(\hat{\boldsymbol{\beta}})\), ta tính sai số chuẩn cho từng hệ số \(\hat{\beta}_j\) như sau:

\[ \mathrm{SE}(\hat{\beta}_j) = \sqrt{[\mathrm{Var}(\hat{\boldsymbol{\beta}})]_{jj}} \]

Trong đó, \([\cdot]_{jj}\) là phần tử hàng \(j\), cột \(j\) trong ma trận phương sai.

Khoảng tin cậy \(100(1 - \alpha)\%\)

Khoảng tin cậy cho hệ số \(\hat{\beta}_j\) được tính bằng công thức:

\[ \hat{\beta}_j \pm z_{\alpha/2} \cdot \mathrm{SE}(\hat{\beta}_j) \]

Trong đó:

  • \(z_{\alpha/2}\) là bách phân vị \(1 - \alpha/2\) của phân phối chuẩn chuẩn hóa (thường tra từ bảng Z),

  • Ví dụ: với \(\alpha = 0.05\), \(z_{0.025} \approx 1.96\) (tương ứng khoảng tin cậy 95%).

Kiểm định Wald

Kiểm định Wald giúp đánh giá giả thuyết:

\[ H_0: \beta_j = 0 \quad \text{vs} \quad H_1: \beta_j \neq 0 \]

Thống kê kiểm định:

\[ Z = \frac{\hat{\beta}_j}{\mathrm{SE}(\hat{\beta}_j)} \sim \mathcal{N}(0, 1) \]

Dựa vào giá trị \(Z\), ta có thể tính p-value và đưa ra kết luận thống kê.

Ghi chú

  • Kiểm định Wald được dùng phổ biến do tính đơn giản và có thể thực hiện ngay sau khi có ước lượng và phương sai.

  • Nếu \(|Z| > z_{\alpha/2}\), bác bỏ \(H_0\), tức là hệ số \(\beta_j\) có ý nghĩa thống kê.

6.6 Ước lượng tham số phân tán

Trong một số mô hình GLM, đặc biệt là khi phân phối thuộc họ phân phối mũ (exponential family) không chuẩn hóa, ta cần ước lượng tham số phân tán \(\phi\).

Công thức ước lượng:

\[ \hat{\phi} = \frac{1}{n - p} \sum_{i=1}^{n} \frac{(y_i - \hat{\mu}_i)^2}{V(\hat{\mu}_i)} \]

Trong đó:

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

  • \(p\): số tham số trong mô hình (bao gồm hệ số chặn nếu có)

  • \(\hat{\mu}_i = \mathbb{E}[y_i] = g^{-1}(\eta_i)\): giá trị kỳ vọng được ước lượng

  • \(V(\hat{\mu}_i)\): hàm phương sai, phụ thuộc vào phân phối:

Phân phối Hàm phương sai \(V(\mu)\)
Gaussian \(1\)
Poisson \(\mu\)
Binomial (logit) \(\mu(1 - \mu)\)

CHƯƠNG 7: GENERALIZED LINEAR MODELS: INFERENCE

ĐÁNH GIÁ MỨC ĐỘ PHÙ HỢP VÀ LỰA CHỌN MÔ HÌNH TRONG GLM

7.1 Giới thiệu

Sau khi ước lượng các tham số \(\beta\) trong GLM, bước tiếp theo là đánh giá xem mô hình có phù hợp với dữ liệu không, và nếu có nhiều mô hình cạnh tranh, thì nên chọn mô hình nào là tốt nhất.

Các công cụ đánh giá bao gồm:

  • Deviance (độ lệch)

  • Kiểm định \(\chi^2\)

  • AIC, BIC

  • So sánh mô hình lồng và không lồng

  • Đồ thị phần dư và điểm ảnh hưởng

7.2 Deviance – đo lường mức độ phù hợp của mô hình

Định nghĩa:

Deviance là đại lượng đo sự khác biệt giữa mô hình hiện tại và mô hình đầy đủ (saturated model) – tức mô hình khớp hoàn toàn với dữ liệu.

\[ D(y; \hat{\mu}) = 2 \left[ \ell(y; y) - \ell(\hat{\mu}; y) \right] \]

Giải thích ký hiệu:

  • \(\ell(y; y)\): log-likelihood của mô hình bão hòa (saturated model)

  • \(\ell(\hat{\mu}; y)\): log-likelihood của mô hình đang xét

\(\Rightarrow\) Deviance càng nhỏ → mô hình càng gần với mô hình bão hòa → phù hợp hơn.

7.3 So sánh mô hình bằng kiểm định deviance

Khi hai mô hình lồng nhau, ta có thể so sánh bằng kiểm định sai biệt deviance:

Công thức kiểm định:

\[ \Delta D = D_{\text{reduced}} - D_{\text{full}} \sim \chi^2_{df} \]

Trong đó:

  • \(df\): số tham số bị ràng buộc trong mô hình nhỏ hơn

\(\Rightarrow\) Nếu \(\Delta D\) lớn và p-value nhỏ → mô hình đầy đủ tốt hơn.

7.4 AIC và BIC – lựa chọn giữa các mô hình không lồng

Khi các mô hình không lồng nhau, ta dùng tiêu chí thông tin để so sánh:

AIC (Akaike Information Criterion):

\[ AIC = -2\ell + 2k \]

  • \(\ell\): log-likelihood

  • \(k\): số tham số trong mô hình

BIC (Bayesian Information Criterion):

\[ BIC = -2\ell + \log(n) \cdot k \]

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

\(\Rightarrow\) Chọn mô hình có AIC/BIC thấp hơn.

\(\Rightarrow\) BIC phạt các mô hình phức tạp nhiều hơn so với AIC.

7.5 Đồ thị chẩn đoán và phần dư

Phần dư (residuals):

  • Phần dư thô (raw residual):

\[ e_i = y_i - \hat{\mu}_i \]

  • Phần dư Pearson:

\[ r_i = \frac{y_i - \hat{\mu}_i}{\sqrt{V(\hat{\mu}_i)}} \]

  • Phần dư deviance:

\[ d_i = \text{sign}(y_i - \hat{\mu}_i) \cdot \sqrt{2\left[\ell(y_i; y_i) - \ell(\hat{\mu}_i; y_i)\right]} \]

Biểu đồ kiểm tra mô hình (Diagnostic plots):

  • Residuals vs Fitted

  • Normal Q-Q (nếu mô hình gần phân phối chuẩn)

  • Scale-Location plot

  • Cook’s distance vs Leverage

Các biểu đồ này giúp phát hiện điểm ngoại laiđiểm ảnh hưởng mạnh đến mô hình.

7.6 Kiểm định Pearson Chi-square

Phép kiểm định Pearson đo sự khác biệt giữa dữ liệu quan sát và giá trị kỳ vọng từ mô hình:

\[ X^2 = \sum_{i=1}^n \frac{(y_i - \hat{\mu}_i)^2}{V(\hat{\mu}_i)} \]

Nếu \(X^2\) lớn hơn mức kỳ vọng theo phân phối \(\chi^2_{df}\) → mô hình có thể không phù hợp với dữ liệu.

7.7 Độ phân tán và vấn đề overdispersion

Một số mô hình GLM như Poisson hoặc Binomial giả định hệ số phân tán là:

\[ \phi = 1 \]

Tuy nhiên, trong thực tế, nếu phương sai quan sát lớn hơn phương sai lý thuyết, ta gọi là overdispersion (quá phân tán).

Kiểm tra overdispersion:

Hệ số phân tán ước lượng được tính theo công thức:

\[ \hat{\phi} = \frac{\text{Deviance}}{n - p} \]

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

  • \(p\): số tham số trong mô hình

\(\Rightarrow\) Nếu:

\[ \hat{\phi} > 1.5 \]

→ Mô hình có thể bị overdispersed (quá phân tán)

\(\Rightarrow\) Trong trường hợp này, cần điều chỉnh mô hình, ví dụ:

  • Sử dụng quasi-Poisson

  • Hoặc Negative Binomial

CHƯƠNG 8: HỒI QUY LOGISTIC (LOGISTIC REGRESSION)

8.1 Giới thiệu

Hồi quy logistic là một trong những mô hình phổ biến nhất thuộc họ GLM, được dùng để mô hình hóa dữ liệu nhị phân (binary), tức khi biến phản hồi

\[ y \in \{0,1\} \]

Ví dụ: bệnh/không bệnh, mua/không mua, đạt/không đạt.

Đặc điểm:
\[ \mu_i = E[y_i] = P(y_i=1) \in (0,1) \]

Sử dụng hàm liên kết logit:
\[ g(\mu_i) = \log\left(\frac{\mu_i}{1-\mu_i}\right) = \eta_i = x_i^T \beta \]

8.2 Phân phối Bernoulli và hàm log-likelihood

Biến phản hồi

\[ y_i \in \{0,1\} \]
phân phối theo:

\[ y_i \sim \text{Bernoulli}(\pi_i) \]

Trong đó:

\[ \pi_i = P(y_i=1) \]
và:
\[ \log\left(\frac{\pi_i}{1-\pi_i}\right) = x_i^T \beta \]

Log-likelihood cho toàn bộ mẫu:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (1 - y_i) \log(1-\pi_i) \right] \]

Không có nghiệm giải tường minh → dùng IRLS để tìm \(\hat{\beta}\).

8.3 Diễn giải hệ số hồi quy trong logistic regression

Khi dùng logit link:
\[ \eta_i = \log\left(\frac{\pi_i}{1-\pi_i}\right) = x_i^T \beta \]

\(\beta_j\) đại diện cho log odds ratio:
\[ \text{Odds ratio} = \exp(\beta_j) \]

  • Nếu \(\beta_j > 0\): biến \(x_j\) làm tăng khả năng \(y=1\)

  • Nếu \(\beta_j < 0\): biến \(x_j\) làm giảm khả năng \(y=1\)

8.4 Khoảng tin cậy và kiểm định

Sau khi ước lượng \(\hat{\beta}\), ta kiểm định từng hệ số:

Kiểm định Wald:
\[ Z_j = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim N(0,1) \]

Khoảng tin cậy 95%:
\[ \hat{\beta}_j \pm z_{0.975} \cdot SE(\hat{\beta}_j) \]

Chuyển sang odds ratio bằng
\[ \exp(\hat{\beta}_j) \]

8.5 Đánh giá mô hình

Deviance:
\[ D = -2 \left[ \ell(\hat{\beta}) - \ell_{\text{saturated}} \right] \]

Kiểm định deviance giữa mô hình đầy đủ và mô hình rút gọn.

Pseudo-\(R^2\):
\[ R^2 = 1 - \frac{D_{\text{model}}}{D_{\text{null}}} \]

8.6 Mô hình hóa với nhiều biến (multiple predictors)

Có thể mở rộng logistic regression để bao gồm nhiều biến giải thích:

\[ \log\left(\frac{\pi_i}{1-\pi_i}\right) = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \]

→ Mô hình đa biến logistic.

8.7 Mô hình hóa tỷ lệ (Grouped binomial model)

Khi dữ liệu không phải từng quan sát riêng lẻ, mà là tổng hợp
\[ \frac{y_i}{n_i} \]
ta dùng:
\[ y_i \sim \text{Binomial}(n_i, \pi_i) \]

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

CHƯƠNG 9: HỒI QUY POISSON (POISSON REGRESSION)

9.1 Giới thiệu và ứng dụng thực tế

Hồi quy Poisson là một mô hình thuộc họ GLM, được sử dụng để mô hình hóa các biến phản hồi là số lượng sự kiện đếm được trên một đơn vị quan sát, chẳng hạn như:

  • Số lần nhập viện

  • Số vụ tai nạn giao thông

  • Số lỗi phần mềm phát sinh

Đặc biệt phù hợp khi:

  • Biến phản hồi \(y \in \{0, 1, 2, \ldots \}\)

  • Dữ liệu không âm, rời rạc

  • Mục tiêu là ước lượng số sự kiện trung bình theo các đặc tính \(x\)

9.2 Phân phối Poisson và liên kết log

Hàm xác suất:
\[ P(y_i) = \frac{e^{-\mu_i} \mu_i^{y_i}}{y_i!}, \quad y_i = 0, 1, 2, \ldots \]

Trong đó:

\[ \mu_i = E[y_i] : \text{số sự kiện kỳ vọng của quan sát thứ } i \]

\[ \text{Var}(y_i) = \mu_i \quad : \text{đặc điểm then chốt} \]

Hàm liên kết (canonical):

\[ \eta_i = \log(\mu_i) = x_i^T \beta \implies \mu_i = e^{x_i^T \beta} \]

Hàm log đảm bảo:

\[ \mu_i > 0 \]

Mối quan hệ tuyến tính trên log-scale.

9.3 Hàm log-likelihood và phương trình điểm

Log-likelihood của mô hình:

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

Thay \(\mu_i = e^{x_i^T \beta}\), ta được:

\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i x_i^T \beta - e^{x_i^T \beta} - \log(y_i!) \right] \]

Score function (đạo hàm log-likelihood):

\[ U(\beta) = \sum_{i=1}^n x_i (y_i - \mu_i) \]

Giải phương trình \(U(\beta) = 0\) → tìm \(\hat{\beta}\) bằng IRLS.

9.4 Diễn giải hệ số hồi quy

Trong hồi quy Poisson:

  • Mỗi \(\beta_j\) là tác động log tuyến tính đến số sự kiện trung bình.

  • \(e^{\beta_j}\) là tỷ lệ thay đổi kỳ vọng \(\mu\) khi \(x_j\) tăng 1 đơn vị, giữ các biến khác không đổi.

Ví dụ:

  • \(\beta_j = 0.693 \Rightarrow e^{0.693} = 2\): số sự kiện kỳ vọng gấp đôi khi \(x_j\) tăng 1 đơn vị.

  • \(\beta_j = -0.223\) → giảm khoảng 20%.

9.5 Tỷ lệ xảy ra & offset

Offset là gì?
Khi quan sát không đồng nhất về thời gian/phạm vi, cần điều chỉnh bằng offset.

Ví dụ:

  • Quan sát 1: 5 tai nạn trong 10 ngày

  • Quan sát 2: 2 tai nạn trong 2 ngày

Không thể so sánh số tuyệt đối → dùng tỷ lệ:
\[ \frac{\mu_i}{t_i} \implies \log(\mu_i) = \log(t_i) + x_i^T \beta \]

Trong đó \(\log(t_i)\)offset – không có hệ số, nhưng được đưa vào mô hình.

9.6 Overdispersion (phân tán quá mức)

Trong lý thuyết:

\[ \mathrm{Var}(y_i) = \mu_i \]

Nhưng thực tế thường thấy:

\[ \mathrm{Var}(y_i) > \mu_i \quad \Rightarrow \quad \text{overdispersion} \]

Nguyên nhân do bỏ sót biến quan trọng, quá nhiều giá trị 0, hoặc biến động ngẫu nhiên vượt mức.

Hệ số phân tán:

\[ \hat{\phi} = \frac{\text{Deviance}}{n - p} \]

Nếu \(\hat{\phi} > 1.5\) thì đáng lo ngại.

Cách xử lý:

  • Sử dụng quasi-Poisson: điều chỉnh phương sai mà không thay đổi kỳ vọng.

  • Dùng Negative Binomial: thêm tham số \(\alpha\) để điều chỉnh phương sai.

9.7 Đánh giá mô hình

Deviance: kiểm tra mức độ phù hợp của mô hình.

AIC: chọn mô hình tốt nhất.

Kiểm định deviance: so sánh hai mô hình lồng nhau. Biểu đồ phần dư: - Residuals vs fitted

  • Deviance residuals

  • Cook’s distance

Kiểm định Pearson chi-square:

\[ X^2 = \sum_{i=1}^n \frac{(y_i - \mu_i)^2}{\mu_i} \quad \Rightarrow \quad X^2 \sim \chi^2_{n-p} \]

9.8 So sánh với các mô hình khác

Mô hình Khi nào dùng
Poisson Dữ liệu đếm, phương sai gần bằng kỳ vọng (\(\mathrm{Var}(y) \approx E(y)\))
Quasi-Poisson Khi có overdispersion nhẹ, giữ cùng hàm liên kết (link function)
Negative Binomial Khi overdispersion nặng hoặc dữ liệu có quá nhiều giá trị 0

CHƯƠNG 10: HỒI QUY GAMMA (GAMMA REGRESSION)

10.1 Giới thiệu

Hồi quy Gamma là một mô hình thuộc họ GLM dùng để mô hình hóa các biến phản hồi dương liên tục có phương sai tăng theo giá trị trung bình.

Ví dụ ứng dụng:

  • Chi phí y tế

  • Thời gian sống (survival time)

  • Lượng tiêu thụ năng lượng

10.2 Phân phối Gamma

Giả định biến ngẫu nhiên \(y_i\) phân phối Gamma với tham số:

\[ y_i \sim Gamma(\alpha, \mu_i) \]

Trong đó:

  • \(\mu_i = E[y_i]\) là kỳ vọng.

  • Phương sai:
    \[ Var(y_i) = \frac{\mu_i^2}{\alpha} = \phi \mu_i^2 \]

Phương sai tỷ lệ với bình phương kỳ vọng, phù hợp khi biến thiên tỷ lệ không đổi.

10.3 Hàm mật độ xác suất Gamma (dạng GLM)

Hàm mật độ xác suất:

\[ f(y; \mu, \phi) = \frac{1}{\Gamma(1/\phi)} \left(\frac{1}{\phi \mu}\right)^{1/\phi} y^{\frac{1}{\phi}-1} \exp\left(-\frac{y}{\phi \mu}\right) \]

Hàm này thuộc họ hàm mũ (exponential family), với:

\[ \theta = -\frac{1}{\mu} \]

\[ b(\theta) = -\log(-\theta) \]

Hàm phương sai:

\[ V(\mu) = \mu^2 \]

\(\phi\) là tham số phân tán.

10.5 Ước lượng trong hồi quy Gamma

Ước lượng tham số \(\beta\) bằng phương pháp hợp lý tối đa (MLE) qua thuật toán IRLS.

Hàm log-likelihood:

\[ \ell(\beta) = \sum_{i=1}^n \left[-\log(\mu_i) - \frac{y_i}{\mu_i} \right] + \text{hằng số} \]

với:

\[ \mu_i = e^{x_i^T \beta} \]

Phương trình điểm:

\[ \frac{\partial \ell}{\partial \beta} = \sum_{i=1}^n x_i \left( y_i - \frac{\mu_i}{\mu_i^2} \cdot \frac{d\mu_i}{d\eta_i} \right) = 0 \]

Dùng IRLS để giải phương trình và tìm nghiệm \(\hat{\beta}\).

10.6 Diễn giải hệ số

Với link log:

\[ \log(\mu_i) = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \implies \mu_i = e^{x_i^T \beta} \]

Mỗi hệ số \(\beta_j\) được hiểu là tác động trên log-scale, nghĩa là ảnh hưởng đến log của kỳ vọng trung bình.

  • Khi \(x_j\) tăng 1 đơn vị, trung bình \(\mu\) thay đổi theo tỷ lệ:

\[ e^{\beta_j} \]

tức là hệ số tỷ lệ thay đổi của \(\mu\).

10.7 Kiểm định và khoảng tin cậy

  • Wald test để kiểm định:

\[ Z_j = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim \mathcal{N}(0,1) \]

  • Khoảng tin cậy cho \(\beta_j\):

\[ \hat{\beta}_j \pm z_{\alpha/2} \cdot SE(\hat{\beta}_j) \]

  • Chuyển sang khoảng tin cậy tỷ lệ thay đổi trung bình:

\[ \left(e^{\hat{\beta}_j - z_{\alpha/2} SE(\hat{\beta}_j)}, \quad e^{\hat{\beta}_j + z_{\alpha/2} SE(\hat{\beta}_j)} \right) \]

10.8 Kiểm tra độ phù hợp (Goodness-of-fit)

  • Deviance:

\[ D = 2 \sum_{i=1}^n \left[ \frac{y_i - \mu_i}{\mu_i} - \log\left(\frac{y_i}{\mu_i}\right) \right] \]

  • Pearson chi-square:

\[ X^2 = \sum_{i=1}^n \left( \frac{y_i - \mu_i}{\mu_i} \right)^2 \]

Hai chỉ số này dùng để đánh giá độ phù hợp của mô hình và phát hiện hiện tượng overdispersion nếu có.

10.9 So sánh với mô hình khác

Mô hình Khi dùng
Hồi quy tuyến tính Khi dữ liệu phân phối chuẩn, phương sai không đổi
Hồi quy Gamma Khi dữ liệu dương, phương sai tỷ lệ với bình phương trung bình
Hồi quy log-normal Khi \(\log(y)\) phân phối chuẩn (sau biến đổi log)

CHƯƠNG 11: DỮ LIỆU NHÓM HOẶC TỶ LỆ (GROUPED DATA OR PROPORTIONS)

11.1 Giới thiệu

Dữ liệu nhị phân dạng 0/1 được mô hình hóa bằng hồi quy logistic. Tuy nhiên, nếu dữ liệu có dạng tổng hợp (grouped) hoặc thể hiện dưới dạng tỷ lệ, ví dụ:

20 thành công trong 30 thử nghiệm → \(y = 20, n = 30\)

  • Tỷ lệ mắc bệnh ở mỗi quận

  • Tỷ lệ sinh viên đậu trong từng lớp

→ Cần dùng GLM dạng nhị thức tổng quát (binomial GLM), áp dụng cho số lần thành công trên số lần thử.

11.2 Mô hình hóa số thành công trong nhóm

Với \(y_i \sim \text{Binomial}(n_i, \pi_i)\), ta mô hình hóa:

\[ \log \left(\frac{\pi_i}{1 - \pi_i}\right) = \eta_i = x_i^T \beta \implies \pi_i = \frac{e^{x_i^T \beta}}{1 + e^{x_i^T \beta}} \]

Trong đó:

  • \(y_i\): số thành công trong nhóm \(i\)

  • \(n_i\): tổng số thử nghiệm trong nhóm \(i\)

  • \(\pi_i\): xác suất thành công

  • \(\mu_i = E[y_i] = n_i \pi_i\)

  • \(\text{Var}(y_i) = n_i \pi_i (1 - \pi_i)\)

→ Phù hợp cho dữ liệu dạng “n trials, k successes”.

11.3 Log-likelihood và IRLS

Hàm log-likelihood:

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

Tối đa hóa log-likelihood bằng IRLS (như logistic), nhưng có thêm yếu tố \(n_i\).

Biến giả và trọng số:

\[ w_i = n_i \pi_i (1 - \pi_i) \]

\[ z_i = \eta_i + \frac{y_i - n_i \pi_i}{n_i \pi_i (1 - \pi_i)} \]

11.4 Ưu điểm so với mô hình nhị phân

Dạng dữ liệu Mô hình tương ứng Ghi chú
0/1 từng cá nhân Hồi quy logistic \(y_i \sim \text{Bernoulli}(\pi_i)\)
Nhóm nhiều cá nhân Binomial GLM với \(y_i / n_i\) \(y_i \sim \text{Binomial}(n_i, \pi_i)\)

→ Mô hình nhóm cho kết quả ước lượng chính xác hơn vì dùng nhiều thông tin hơn trên mỗi quan sát.

11.5 Dữ liệu tỷ lệ (proportions)

Nếu \(y_i / n_i\) được ghi dưới dạng tỷ lệ (0 < tỷ lệ < 1), ta vẫn dùng mô hình:

\[ \log \left(\frac{y_i / n_i}{1 - y_i / n_i}\right) = x_i^T \beta \]

→ Nhưng phải chỉ rõ số lần thử \(n_i\) để tính đúng phương sai.

11.6 Kiểm định mô hình

  • Wald test cho các hệ số

  • Kiểm định deviance giữa mô hình đầy đủ và rút gọn

  • AIC/BIC để chọn mô hình

  • Phần dư Pearson / deviance để phát hiện điểm bất thường

11.7 Kiểm tra overdispersion

Giống hồi quy logistic, mô hình binomial giả định:

\[ \text{Var}(y_i) = n_i \pi_i (1 - \pi_i) \]

Nếu thấy phương sai quan sát lớn hơn → overdispersion.

Kiểm tra:

\[ \hat{\phi} = \frac{\text{Deviance}}{n - p} \]

→ Nếu \(\hat{\phi} > 1.5\): cần chuyển sang mô hình quasi-binomial

CHƯƠNG 12: MÔ HÌNH TUYẾN TÍNH TỔNG QUÁT TWEEDEE (TWEEDIE GLMs)

12.1 Giới thiệu

Mô hình Tweedie GLM mở rộng họ hàm mũ bằng cách cho phép phân phối có đặc điểm trung gian giữa các phân phối quen thuộc như:

  • Gaussian

  • Poisson

  • Gamma

  • Inverse Gaussian

Mô hình Tweedie phù hợp với các loại dữ liệu có đặc điểm:

  • Liên tục dương + rất nhiều giá trị 0
    (ví dụ: dữ liệu chi phí, có người không tiêu dùng)

  • Phân tán quá mức (overdispersion)

  • Có cả phần rời rạc (0, 1, 2, …) lẫn liên tục dương

→ Ứng dụng rộng rãi trong bảo hiểm, tài chính, y tế, và các bài toán zero-inflated data.

12.2 Định nghĩa và tính chất

Tweedie là một lớp phân phối thuộc họ hàm mũ (exponential family), với hàm phương sai có dạng:

\[ \text{Var}(Y) = \phi \mu^p \]

Trong đó:

  • \(\mu = \mathbb{E}[Y]\): kỳ vọng

  • \(\phi > 0\): hệ số phân tán

  • \(p\): chỉ số sức mạnh (power index)

12.3 Giá trị đặc biệt của chỉ số \(p\)

\(p\) Phân phối tương ứng
0 Gaussian (Normal)
1 Poisson
\((1, 2)\) Tweedie hỗn hợp (0 + dương liên tục)
2 Gamma
3 Inverse Gaussian

→ Với \(1 < p < 2\), mô hình Tweedie hỗn hợp có thể:

  • Tái hiện được số lượng lớn giá trị 0

  • Mô hình hóa được giá trị dương liên tục

Rất phù hợp cho các bài toán như chi phí bảo hiểm, tổn thất, dữ liệu có số 0 và giá trị tiền tệ.

BÀI TẬP 2

Thực hiện thống kê mô tả cho các biến trong file: Supermarket Transactions.csv

library(csv)
library(readr)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## 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(skimr)
## Warning: package 'skimr' was built under R version 4.3.3
library(psych)
## Warning: package 'psych' was built under R version 4.3.3

1. Đọc file CSV

  • Tệp Supermarket Transactions được lưu dưới định dạng csv. Đọc bộ dữ liệu này vào phần mềm R

  • Sau khi đọc, bộ dữ liệu được gán vào biến data để dễ dàng thao tác.

data <- read.csv("C:/Users/ADMIN/Desktop/PTDL DINH TINH/Supermarket Transactions.csv", header = T)

2. Tổng quan dữ liệu

2.1 Nội dung dữ liệu

  • Bộ dữ liệu Supermarket Transactions này gồm 14,059 giao dịch mua hàng tại siêu thị, với các thông tin liên quan đến khách hàng và sản phẩm bao gồm mã định danh khách hàng và các thông tin liên quan, vị trí địa lý, chi tiết các sản phẩm được mua.

  • Dữ liệu này có thể được sử dụng để phân tích hành vi mua sắm của khách hàng, phân khúc thị trường, hoặc đánh giá hiệu quả kinh doanh theo từng sản phẩm, từng khu vực và từng nhóm đối tượng.

2.2 Danh sách các biến và mô tả

Tên của các biến trong bộ dữ liệu bao gồm:

names(data)
##  [1] "X"                 "PurchaseDate"      "CustomerID"       
##  [4] "Gender"            "MaritalStatus"     "Homeowner"        
##  [7] "Children"          "AnnualIncome"      "City"             
## [10] "StateorProvince"   "Country"           "ProductFamily"    
## [13] "ProductDepartment" "ProductCategory"   "UnitsSold"        
## [16] "Revenue"
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::%+%()   masks psych::%+%()
## ✖ ggplot2::alpha() masks psych::alpha()
## ✖ dplyr::filter()  masks stats::filter()
## ✖ dplyr::lag()     masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
# Tạo bảng mô tả các biến và dịch thuật 
variable_desc <- tibble::tibble(
  Biến = c(
    "X", "PurchaseDate", "CustomerID", "Gender", "MaritalStatus", "Homeowner",
    "Children", "AnnualIncome", "City", "StateorProvince", "Country",
    "ProductFamily", "ProductDepartment", "ProductCategory", "UnitsSold", "Revenue"
  ),
  Dịch_thuật = c(
    "Số thứ tự dòng", "Ngày mua hàng", "Mã khách hàng", "Giới tính", "Tình trạng hôn nhân", "Sở hữu nhà",
    "Số con", "Thu nhập hàng năm", "Thành phố", "Bang/Tỉnh", "Quốc gia",
    "Nhóm sản phẩm", "Bộ phận sản phẩm", "Loại sản phẩm", "Số lượng bán", "Doanh thu"
  )
)

kable(variable_desc, caption = "Tên biến, Dịch thuật")
Tên biến, Dịch thuật
Biến Dịch_thuật
X Số thứ tự dòng
PurchaseDate Ngày mua hàng
CustomerID Mã khách hàng
Gender Giới tính
MaritalStatus Tình trạng hôn nhân
Homeowner Sở hữu nhà
Children Số con
AnnualIncome Thu nhập hàng năm
City Thành phố
StateorProvince Bang/Tỉnh
Country Quốc gia
ProductFamily Nhóm sản phẩm
ProductDepartment Bộ phận sản phẩm
ProductCategory Loại sản phẩm
UnitsSold Số lượng bán
Revenue Doanh thu

3 Thống kê mô tả cho các biến

3.1 Số biến và số quan sát

dim(data)
## [1] 14059    16
  • Bộ dữ liệu data chứa tổng cộng 14.059 quan sát cùng với 16 biến đặc trưng.
  • Mỗi quan sát sẽ tưởng ứng với mỗi giao dịch mua hàng tại siêu thị.

3.2 Kiểm tra cấu trúc tổng quát

Để nắm được cái nhìn tổng quan về bộ dữ liệu, chúng ta cần bắt đầu bằng việc kiểm tra các yếu tố cơ bản như số lượng biến, kiểu dữ liệu của từng biến và một số thống kê mô tả sơ bộ. Bước này đóng vai trò quan trọng trong việc hiểu cấu trúc dữ liệu và hỗ trợ định hướng cho các phân tích chuyên sâu sau này.

str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "18-12-07" "20-12-07" "21-12-07" "21-12-07" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : chr  "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
##  $ City             : chr  "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
##  $ StateorProvince  : chr  "CA" "CA" "WA" "OR" ...
##  $ Country          : chr  "USA" "USA" "USA" "USA" ...
##  $ ProductFamily    : chr  "Food" "Food" "Food" "Food" ...
##  $ ProductDepartment: chr  "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
##  $ ProductCategory  : chr  "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...

Trong bộ dữ liệu thể hiện các biến như sau:

  • Thời gian mua hàng:

    • PurchaseDate: ngày giao dịch mua hàng được ghi nhận (định dạng ngày-tháng-năm).
  • Khách hàng:

    • CustomerID: Mã định danh của từng khách hàng

    • Gender: Giới tính của khách hàng (F: Nữ, M: Nam).

    • MaritalStatus: Tình trạng hôn nhân (S: Độc thân, M: Đã kết hôn).

    • Homeowner: Khách hàng có sở hữu nhà (Y: có nhà, N: không có nhà).

    • Children: Số lượng con cái của khách hàng

    • AnnualIncome: Thu nhập hằng năm phân loại theo nhóm (dưới dạng khoảng).

    • City, StateorProvince, Country: Địa chỉ sinh sống ( Thành phó, Bang/Tỉnh, Quốc gia)

  • Sản phẩm:

    • ProductFamily: Nhóm sản phẩm lớn (ví dụ: Thực phẩm, Đồ uống, v.v.)

    • ProductDepartment: Bộ phận sản phẩm cụ thể hơn trong siêu thị

    • ProductCategory: Loại sản phẩm chi tiết

    • UnitsSold: Số lượng sản phẩm đã bán trong giao dịch.

    • Revenue: Doanh thu từ giao dịch đó (USD).

Bộ dữ liệu được cung cấp bao gồm cả các biến định và biến định lượng, trong đó các biến định tính được đề cập đến như sau:

  • Các thông tin liên quan đến khách hàng, những biến này không thể hiện cụ thể các con số toán học nên rất khó để phân tích và kết luận (ví dụ: doanh thu, số lượng sản phẩm bán ra). Do đó, trong quá trình thống kê mô tả và phân tích, ta cần phân biệt rõ giữa hai nhóm biến này để lựa chọn phương pháp xử lý phù hợp.

3.3 Thống kê mô tả biến định tính và định lượng

# Xác định biến định tính (kiểu character hoặc factor)
categorical_vars <- names(select_if(data, is.character))

# Xác định biến định lượng (kiểu số)
numerical_vars <- names(select_if(data, is.numeric))

# Hiển thị danh sách các biến
cat("Các biến định tính:", paste(categorical_vars, collapse = ", "), "\n\n")
## Các biến định tính: PurchaseDate, Gender, MaritalStatus, Homeowner, AnnualIncome, City, StateorProvince, Country, ProductFamily, ProductDepartment, ProductCategory
cat("Các biến định lượng:", paste(numerical_vars, collapse = ", "))
## Các biến định lượng: X, CustomerID, Children, UnitsSold, Revenue

3.3.1 Thống kê mô tả biến định lượng

# Sử dụng summary để mô tả các biến định lượng
summary(select(data, all_of(numerical_vars)))
##        X           CustomerID       Children      UnitsSold        Revenue     
##  Min.   :    1   Min.   :    3   Min.   :0.00   Min.   :1.000   Min.   : 0.53  
##  1st Qu.: 3516   1st Qu.: 2549   1st Qu.:1.00   1st Qu.:3.000   1st Qu.: 6.84  
##  Median : 7030   Median : 5060   Median :3.00   Median :4.000   Median :11.25  
##  Mean   : 7030   Mean   : 5117   Mean   :2.53   Mean   :4.081   Mean   :13.00  
##  3rd Qu.:10544   3rd Qu.: 7633   3rd Qu.:4.00   3rd Qu.:5.000   3rd Qu.:17.37  
##  Max.   :14059   Max.   :10280   Max.   :5.00   Max.   :8.000   Max.   :56.70
library(knitr)
# Tạo bảng thống kê mô tả thủ công từ kết quả bạn đã cung cấp
desc_table <- data.frame(
  `Thống kê` = c("Min", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max"),
  `Children` = c(0, 1, 3, 2.53, 4, 5),
  `UnitsSold` = c(1, 3, 4, 4.08, 5, 8),
  `Revenue` = c(0.53, 6.84, 11.25, 13.00, 17.37, 56.70)
)

kable(desc_table, align = "c", caption = "Thống kê mô tả cho các biến định lượng")
Thống kê mô tả cho các biến định lượng
Thống.kê Children UnitsSold Revenue
Min 0.00 1.00 0.53
1st Qu. 1.00 3.00 6.84
Median 3.00 4.00 11.25
Mean 2.53 4.08 13.00
3rd Qu. 4.00 5.00 17.37
Max 5.00 8.00 56.70

Children (Số lượng con của khách hàng)

Nhận xét

  • Trung bình mỗi khách hàng có khoảng 2.53 người con.

  • 50% khách hàng có từ 1 đến 4 người con.

  • Có khách hàng không có con (Min = 0), và cao nhất là 5 người con. Sự hiện diện của khách hàng không có con (giá trị min = 0) cũng đáng chú ý, có thể là nhóm độc thân hoặc vợ chồng trẻ – nhóm này có hành vi tiêu dùng khác biệt.

  • Độ lệch giữa trung vị (3) và trung bình (2.53) không quá lớn, cho thấy phân phối khá cân đối, hơi nghiêng nhẹ về phía ít con hơn.

Kết luận:

  • Khách hàng phần lớn là người có gia đình, với số con phổ biến từ 1 đến 4, phù hợp với nhóm tiêu dùng hộ gia đình truyền thống.

UnitsSold (Số lượng sản phẩm bán ra trong mỗi giao dịch)

Nhận xét

  • Trung bình mỗi giao dịch bán được khoảng 4.08 sản phẩm, với trung vị là 4, cho thấy phân phối rất cân đối.

  • Khoảng 50% số giao dịch rơi vào khoảng 3–5 sản phẩm, phản ánh hành vi mua sắm “vừa đủ dùng” trong 1 lần mua, phổ biến ở khách hàng đi siêu thị định kỳ.

  • Mức cao nhất là 8 sản phẩm/giao dịch cho thấy một số khách hàng mua số lượng lớn – có thể là khách hàng mua sỉ hoặc gia đình đông người.

Kết luận:

  • Giao dịch có xu hướng nhỏ lẻ, phù hợp với mô hình bán lẻ nhanh, tiện lợi.

  • Cần tối ưu tiếp thị theo combo/giỏ hàng 3–5 sản phẩm để tăng doanh thu.

Revenue (Doanh thu mỗi giao dịch - USD)

Nhận xét

  • Trung bình mỗi giao dịch mang lại 13 USD, trong khi trung vị là 11.25 USD, tức là có sự lệch phải nhẹ: một số giao dịch có doanh thu cao kéo trung bình tăng lên.

  • Đa số giao dịch có doanh thu trong khoảng 6.84 – 17.37 USD, phù hợp với mức chi tiêu bình quân cho một đợt mua sắm nhanh tại siêu thị.

  • Giá trị lớn nhất là 56.70 USD, chỉ ra rằng vẫn tồn tại các giao dịch mua sắm lớn – có thể là dịp lễ, mua tích trữ hoặc khách hàng thân thiết.

Kết luận

  • Doanh thu mỗi giao dịch ở mức thấp đến trung bình, cho thấy đây là mô hình bán hàng phục vụ nhu cầu tiêu dùng hàng ngày.

  • Cần chú ý đến nhóm khách hàng tạo ra doanh thu cao để xây dựng chiến lược khách hàng thân thiết (loyalty).


3.3.2 Thống kê mô tả biến định tính

install.packages("dplyr")
## Warning: package 'dplyr' is in use and will not be installed
install.packages("janitor", repos = "https://cran.rstudio.com/")
## Installing package into 'C:/Users/ADMIN/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'janitor' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\ADMIN\AppData\Local\Temp\RtmpcnbGEh\downloaded_packages
install.packages("janitor", repos = "https://cran.rstudio.com/")
## Installing package into 'C:/Users/ADMIN/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'janitor' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\ADMIN\AppData\Local\Temp\RtmpcnbGEh\downloaded_packages
library(dplyr)
library(janitor)
## Warning: package 'janitor' was built under R version 4.3.3
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(ggplot2)
3.3.2.1. Gender
table(data$Gender)
## 
##    F    M 
## 7170 6889
ggplot(data, aes(x = Gender)) +
  geom_bar(fill = "steelblue") +
  theme_minimal() +
  labs(title = "Giới tính", x = "Gender", y = "Tần suất")

# Gender
data %>%
  tabyl(Gender) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - Gender") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - Gender
Gender n percent
F 7170 51.00%
M 6889 49.00%

Nhận xét

  • Dữ liệu cho thấy có 7.170 khách hàng là nữ (51.0%) và 6.889 khách hàng là nam (49.0%).

  • Phân bố giới tính gần như đồng đều, không có sự chênh lệch lớn.

  • Điều này phản ánh rằng chuỗi siêu thị không nhắm đến một giới tính cụ thể, mà phục vụ tốt cả hai nhóm.

  • Ngoài ra, tỷ lệ nữ hơi cao hơn có thể do phụ nữ thường đảm nhận vai trò mua sắm thực phẩm và tiêu dùng gia đình, nên khả năng cao họ là người đứng tên giao dịch nhiều hơn trong hóa đơn.

3.3.2.2. MaritalStatus
table(data$MaritalStatus)
## 
##    M    S 
## 6866 7193
ggplot(data, aes(x = MaritalStatus)) +
  geom_bar(fill = "tomato") +
  theme_minimal() +
  labs(title = "Tình trạng hôn nhân", x = "Marital Status", y = "Tần suất")

# MaritalStatus
data %>%
  tabyl(MaritalStatus) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - Marital Status") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - Marital Status
MaritalStatus n percent
M 6866 48.84%
S 7193 51.16%

Nhận xét

  • Số lượng khách hàng độc thân (Single – ký hiệu S) là 7.193 người (51.16%), còn người đã kết hôn (Married – M) là 6.866 người (48.84%).

  • Mặc dù tỷ lệ khá cân bằng, nhưng nhóm độc thân chiếm tỷ lệ cao hơn một chút.

  • Giải thích hợp lý cho điều này có thể là:

    • Những người độc thân có xu hướng tự đi mua sắm nhiều hơn, không dựa vào bạn đời.

    • Ngoài ra, người trẻ độc thân thường sống ở thành thị và sử dụng dịch vụ siêu thị thường xuyên hơn, trong khi người đã kết hôn có thể mua theo nhóm hoặc theo hộ gia đình lớn và ít giao dịch hơn trên mỗi cá nhân.

3.3.2.3 Homeowner
table(data$Homeowner)
## 
##    N    Y 
## 5615 8444
ggplot(data, aes(x = Homeowner)) +
  geom_bar(fill = "darkgreen") +
  theme_minimal() +
  labs(title = "Tình trạng sở hữu nhà", x = "Homeowner", y = "Tần suất")

# Homeowner
data %>%
  tabyl(Homeowner) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - Homeowner") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - Homeowner
Homeowner n percent
N 5615 39.94%
Y 8444 60.06%

Nhận xét

  • 8.444 khách hàng (60.06%) là chủ sở hữu nhà, còn 5.615 người (39.94%) không sở hữu.

  • Đây là một chỉ báo quan trọng về sự ổn định tài chính của khách hàng.

  • Người sở hữu nhà thường có:

    • Chi tiêu ổn định hơn.

    • Nhu cầu mua sắm nhiều hơn cho gia đình (thực phẩm, đồ gia dụng).

  • Trong khi đó, người không sở hữu nhà (có thể thuê nhà hoặc sống tạm thời) có thể:

    • Chi tiêu dè dặt hơn.

    • Ít mua hàng số lượng lớn, hoặc ưu tiên hàng nhỏ gọn, dễ vận chuyển.

3.3.2.4 AnnualIncome
table(data$AnnualIncome)
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613
ggplot(data, aes(x = AnnualIncome)) +
  geom_bar(fill = "orchid") +
  theme_minimal() +
  labs(title = "Thu nhập hàng năm", x = "Annual Income", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# AnnualIncome
data %>%
  tabyl(AnnualIncome) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - Annual Income") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - Annual Income
AnnualIncome n percent
$10K - $30K 3090 21.98%
$110K - $130K 643 4.57%
$130K - $150K 760 5.41%
$150K + 273 1.94%
$30K - $50K 4601 32.73%
$50K - $70K 2370 16.86%
$70K - $90K 1709 12.16%
$90K - $110K 613 4.36%

Nhận xét

  • Nhóm $30K - $50K chiếm nhiều nhất (32.73%), theo sau là:

    • $10K - $30K (21.98%)

    • $50K - $70K (16.86%)

  • Rất ít khách hàng có thu nhập trên $90K.

  • Điều này cho thấy rằng chuỗi siêu thị chủ yếu phục vụ nhóm thu nhập trung bình và thấp – phù hợp với chiến lược giá rẻ, hàng hóa thiết yếu.

  • Chiến lược marketing, khuyến mãi, và chính sách giá nên tập trung vào nhóm này (ví dụ: combo tiết kiệm, chiết khấu theo số lượng).

3.3.2.5 City
table(data$City)
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##           383           143           811           834           452 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##            75           845           926           654           194 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##           464           876          1386           621           866 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##           130           922           875          1257           633 
##      Victoria   Walla Walla        Yakima 
##           176           160           376
ggplot(data, aes(x = City)) +
  geom_bar(fill = "coral") +
  theme_minimal() +
  labs(title = "Thành phố", x = "City", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# City
data %>%
  tabyl(City) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - City") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - City
City n percent
Acapulco 383 2.72%
Bellingham 143 1.02%
Beverly Hills 811 5.77%
Bremerton 834 5.93%
Camacho 452 3.22%
Guadalajara 75 0.53%
Hidalgo 845 6.01%
Los Angeles 926 6.59%
Merida 654 4.65%
Mexico City 194 1.38%
Orizaba 464 3.30%
Portland 876 6.23%
Salem 1386 9.86%
San Andres 621 4.42%
San Diego 866 6.16%
San Francisco 130 0.92%
Seattle 922 6.56%
Spokane 875 6.22%
Tacoma 1257 8.94%
Vancouver 633 4.50%
Victoria 176 1.25%
Walla Walla 160 1.14%
Yakima 376 2.67%

Nhận xét

  • Các thành phố có tỷ lệ giao dịch cao nhất là:

    • Salem (9.86%)

    • Tacoma (8.94%)

    • Los Angeles (6.59%)

    • Seattle (6.56%)

  • Có thể nhận thấy sự tập trung mạnh tại các thành phố bờ Tây Hoa Kỳ, đặc biệt ở các bang Washington, Oregon và California.

  • Điều này gợi ý rằng:

    • Các chi nhánh ở các thành phố này có lưu lượng khách hàng lớn, hoặc

    • Các thành phố này có mật độ dân cư cao, nhu cầu tiêu dùng thường xuyên.

3.3.2.6 StateorProvince
table(data$StateorProvince)
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
ggplot(data, aes(x = StateorProvince)) +
  geom_bar(fill = "goldenrod") +
  theme_minimal() +
  labs(title = "Bang hoặc tỉnh", x = "State or Province", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# StateorProvince
data %>%
  tabyl(StateorProvince) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - State or Province") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - State or Province
StateorProvince n percent
BC 809 5.75%
CA 2733 19.44%
DF 815 5.80%
Guerrero 383 2.72%
Jalisco 75 0.53%
OR 2262 16.09%
Veracruz 464 3.30%
WA 4567 32.48%
Yucatan 654 4.65%
Zacatecas 1297 9.23%

Nhận xét

  • Phân bố:

    • Washington: 32.48%

    • California: 19.44%

    • Oregon: 16.09%

  • Ba bang này đều ở bờ Tây Hoa Kỳ, và là những bang có:

    • Dân số đông, thị trường bán lẻ phát triển.

    • Thói quen tiêu dùng hiện đại, sử dụng dịch vụ siêu thị nhiều hơn so với các khu vực nông thôn.

  • Việc mở rộng kinh doanh hoặc đầu tư thêm vào các bang này là chiến lược khả thi.

3.3.2.7 Country
table(data$Country)
## 
## Canada Mexico    USA 
##    809   3688   9562
ggplot(data, aes(x = Country)) +
  geom_bar(fill = "lightblue") +
  theme_minimal() +
  labs(title = "Quốc gia", x = "Country", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Country
data %>%
  tabyl(Country) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - Country") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - Country
Country n percent
Canada 809 5.75%
Mexico 3688 26.23%
USA 9562 68.01%

Nhận xét

  • Tỷ lệ khách hàng theo quốc gia:

    • USA: 68.01%

    • Mexico: 26.23%

    • Canada: 5.75%

  • US Hoa Kỳ rõ ràng là thị trường trọng điểm.

  • Tuy nhiên, sự hiện diện tại Mexico (hơn 1/4 số giao dịch) cho thấy đây là thị trường thứ cấp tiềm năng, có thể mở rộng hoặc tăng nhận diện thương hiệu.

3.3.2.8 ProductFamily
table(data$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
ggplot(data, aes(x = ProductFamily)) +
  geom_bar(fill = "mediumvioletred") +
  theme_minimal() +
  labs(title = "Nhóm sản phẩm", x = "Product Family", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# ProductFamily
data %>%
  tabyl(ProductFamily) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - Product Family") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - Product Family
ProductFamily n percent
Drink 1250 8.89%
Food 10153 72.22%
Non-Consumable 2656 18.89%

Nhận xét

  • Thực phẩm (Food) chiếm 72.22%, cao vượt trội so với:

    • Non-Consumables (18.89%)

    • Đồ uống (Drink – 8.89%)

  • Điều này cho thấy khách hàng mua sắm chủ yếu là để phục vụ nhu cầu ăn uống hàng ngày.

  • Siêu thị nên tiếp tục đầu tư mạnh vào:

    • Nguồn cung thực phẩm tươi,

    • Các sản phẩm thiết yếu giá tốt,

    • Chính sách ưu đãi số lượng lớn cho thực phẩm.

3.3.2.9 ProductDepartment
table(data$ProductDepartment)
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##                 356                 425                1072                 680 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##                 188                 977                 109                  59 
##            Checkout               Dairy                Deli                Eggs 
##                  82                 903                 699                 198 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##                1382                 893                1420                  89 
##         Periodicals             Produce             Seafood         Snack Foods 
##                 202                1994                 102                1600 
##              Snacks       Starchy Foods 
##                 352                 277
ggplot(data, aes(x = ProductDepartment)) +
  geom_bar(fill = "dodgerblue") +
  theme_minimal() +
  labs(title = "Phòng ban sản phẩm", x = "Product Department", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# ProductDepartment
data %>%
  tabyl(ProductDepartment) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - Product Department") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - Product Department
ProductDepartment n percent
Alcoholic Beverages 356 2.53%
Baked Goods 425 3.02%
Baking Goods 1072 7.63%
Beverages 680 4.84%
Breakfast Foods 188 1.34%
Canned Foods 977 6.95%
Canned Products 109 0.78%
Carousel 59 0.42%
Checkout 82 0.58%
Dairy 903 6.42%
Deli 699 4.97%
Eggs 198 1.41%
Frozen Foods 1382 9.83%
Health and Hygiene 893 6.35%
Household 1420 10.10%
Meat 89 0.63%
Periodicals 202 1.44%
Produce 1994 14.18%
Seafood 102 0.73%
Snack Foods 1600 11.38%
Snacks 352 2.50%
Starchy Foods 277 1.97%

Nhận xét

  • Bộ phận lớn nhất:

    • Produce (Rau quả): 14.18%

    • Snack Foods: 11.38%

    • Household: 10.10%

  • Khách hàng mua nhiều các mặt hàng:

    • Tươi sống, dễ hỏng (produce) ➤ yêu cầu bảo quản và chuỗi cung ứng tốt.

    • Đồ ăn vặt và hàng gia dụng ➤ phản ánh thói quen tiêu dùng nhanh, tiện lợi.

  • Đây là cơ hội để tăng cường marketing nhóm sản phẩm tiện lợi, combo bữa ăn, sản phẩm cho hộ gia đình.

3.3.2.10 ProductCategory
table(data$ProductCategory)
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##                  484                  365                  356 
##                Bread      Breakfast Foods              Candles 
##                  425                  417                   45 
##                Candy     Canned Anchovies         Canned Clams 
##                  352                   44                   53 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##                   35                   40                   38 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##                  404                   87                  154 
##    Cleaning Supplies        Cold Remedies                Dairy 
##                  189                   93                  903 
##        Decongestants               Drinks                 Eggs 
##                   85                  135                  198 
##           Electrical      Frozen Desserts       Frozen Entrees 
##                  355                  323                  118 
##                Fruit             Hardware        Hot Beverages 
##                  765                  129                  226 
##              Hygiene     Jams and Jellies     Kitchen Products 
##                  197                  588                  217 
##            Magazines                 Meat        Miscellaneous 
##                  202                  761                   42 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##                   48                  192                  345 
##                Pizza     Plastic Products Pure Juice Beverages 
##                  194                  141                  165 
##              Seafood          Side Dishes          Snack Foods 
##                  102                  153                 1600 
##            Specialty        Starchy Foods           Vegetables 
##                  289                  277                 1728
ggplot(data, aes(x = ProductCategory)) +
  geom_bar(fill = "seagreen") +
  theme_minimal() +
  labs(title = "Danh mục sản phẩm", x = "Product Category", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# ProductCategory
data %>%
  tabyl(ProductCategory) %>%
  adorn_pct_formatting(digits = 2) %>%
  kable(caption = "Tần suất và tỷ lệ phần trăm - Product Category") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tần suất và tỷ lệ phần trăm - Product Category
ProductCategory n percent
Baking Goods 484 3.44%
Bathroom Products 365 2.60%
Beer and Wine 356 2.53%
Bread 425 3.02%
Breakfast Foods 417 2.97%
Candles 45 0.32%
Candy 352 2.50%
Canned Anchovies 44 0.31%
Canned Clams 53 0.38%
Canned Oysters 35 0.25%
Canned Sardines 40 0.28%
Canned Shrimp 38 0.27%
Canned Soup 404 2.87%
Canned Tuna 87 0.62%
Carbonated Beverages 154 1.10%
Cleaning Supplies 189 1.34%
Cold Remedies 93 0.66%
Dairy 903 6.42%
Decongestants 85 0.60%
Drinks 135 0.96%
Eggs 198 1.41%
Electrical 355 2.53%
Frozen Desserts 323 2.30%
Frozen Entrees 118 0.84%
Fruit 765 5.44%
Hardware 129 0.92%
Hot Beverages 226 1.61%
Hygiene 197 1.40%
Jams and Jellies 588 4.18%
Kitchen Products 217 1.54%
Magazines 202 1.44%
Meat 761 5.41%
Miscellaneous 42 0.30%
Packaged Vegetables 48 0.34%
Pain Relievers 192 1.37%
Paper Products 345 2.45%
Pizza 194 1.38%
Plastic Products 141 1.00%
Pure Juice Beverages 165 1.17%
Seafood 102 0.73%
Side Dishes 153 1.09%
Snack Foods 1600 11.38%
Specialty 289 2.06%
Starchy Foods 277 1.97%
Vegetables 1728 12.29%

Nhận xét

  • Loại phổ biến nhất:

    • Vegetables (Rau): 12.29%

    • Snack Foods: 11.38%

    • Dairy (Sữa): 6.42%

    • Fruit, Meat, Frozen Foods…

  • Đây là những mặt hàng tiêu dùng nhanh, có vòng đời ngắn.

  • Việc khách hàng mua chủ yếu các mặt hàng thiết yếu cho thấy siêu thị hoạt động tốt trong việc phục vụ nhu cầu cơ bản, chứ không phải sản phẩm xa xỉ hay không thường xuyên.

KẾT LUẬN TỔNG QUÁT

  • Dữ liệu cho thấy đối tượng khách hàng chính là:

    • Người Mỹ (đa phần ở bang Washington, Oregon, California)

    • Thu nhập trung bình

    • Chủ yếu mua thực phẩm tươi sống và thiết yếu

    • Giao dịch tập trung ở nhóm tuổi và tình trạng độc thân/có nhà riêng

  • Với đặc điểm này, các siêu thị nên:

    • Tối ưu hóa chuỗi cung ứng thực phẩm tươi

    • Tập trung khuyến mãi cho nhóm thu nhập thấp – trung bình

    • Thiết kế sản phẩm & trải nghiệm mua sắm tiện lợi, giá tốt

LS0tDQp0aXRsZTogIk5ISeG7hk0gVuG7pCAxIg0KYXV0aG9yOiAiVOG6oSBDw7RuZyDEkOG6oXQgLSAyMjIxMDAwMjk0Ig0KZGF0ZTogIjIwMjUtMDUtMTciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQojICoqQsOASSBU4bqsUCAxKioNCiMjICoqQ0jGr8agTkcgMTogTcOUIEjDjE5IIFRI4buQTkcgS8OKIC0gU1RBVElTVElDQUwgTU9ERUxTKioNCg0KIyMjICoqMS4xIEdp4bubaSB0aGnhu4d1IHbDoCB04buVbmcgcXVhbioqIA0KDQogIENoxrDGoW5nIG7DoHkgZ2nhu5tpIHRoaeG7h3Uga2jDoWkgbmnhu4dtIHbhu4EgbcO0IGjDrG5oIHRo4buRbmcga8OqLCB0cm9uZyDEkcOzIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoZ2VuZXJhbGl6ZWQgbGluZWFyIG1vZGVsKSBsw6AgdHLhu41uZyB0w6JtIGNow61uaCBj4bunYSBjdeG7kW4gc8OhY2guIMSQ4bqndSB0acOqbiwgY2jGsMahbmcgdHLDrG5oIGLDoHkgY8OhYyBraMOhaSBuaeG7h20gY8ahIGLhuqNuLCBrw70gaGnhu4d1IHbDoCBuaOG7r25nIHbhuqVuIMSR4buBIHF1YW4gdHLhu41uZyBsacOqbiBxdWFuIMSR4bq/biBtw7QgaMOsbmggdGjhu5FuZyBrw6ouIEPDoWMgbuG7mWkgZHVuZyBj4bulIHRo4buDIGfhu5NtOg0KDQotIEPDoWNoIG3DtCB04bqjIGThu68gbGnhu4d1IGLhurFuZyBuZ8O0biBuZ+G7ryB0b8OhbiBo4buNYy4NCi0gVOG6p20gcXVhbiB0cuG7jW5nIGPhu6dhIHZp4buHYyB24bq9IMSR4buTIHRo4buLIGThu68gbGnhu4d1Lg0KLSBDw6FjaCBtw6MgaMOzYSBjw6FjIGJp4bq/biBraMO0bmcgcGjhuqNpIHPhu5EgdGjDoG5oIGThuqFuZyBz4buRIMSR4buDIGTDuW5nIHRyb25nIG3DtCBow6xuaC4NCi0gSGFpIHRow6BuaCBwaOG6p24gY2jDrW5oIGPhu6dhIG3DtCBow6xuaCB0aOG7kW5nIGvDqjogaOG7hyB0aOG7kW5nIHbDoCBuZ+G6q3Ugbmhpw6puLg0KLSBHaeG7m2kgdGhp4buHdSBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkg4oCTIG5ow7NtIG3DtCBow6xuaCDEkcaw4bujYyBkw7luZyB4dXnDqm4gc3Xhu5F0IGN14buRbiBzw6FjaC4NCi0gQ8OhY2ggZGnhu4VuIGdp4bqjaSBtw7QgaMOsbmguDQotIFNvIHPDoW5oIG3DtCBow6xuaCB24bqtdCBsw70gdsOgIG3DtCBow6xuaCB0aOG7kW5nIGvDqiDEkeG7gyBsw6BtIHLDtSDEkWnhu4NtIGdp4buRbmcgdsOgIGtow6FjIG5oYXUuDQotIE3hu6VjIMSRw61jaCBj4bunYSBtw7QgaMOsbmggdGjhu5FuZyBrw6ouDQotIEhhaSB0acOqdSBjaMOtIMSRw6FuaCBnacOhIG3DtCBow6xuaDogxJHhu5kgY2jDrW5oIHjDoWMgdsOgIHTDrW5oIMSRxqFuIGdp4bqjbi4gDQotIEjhuqFuIGNo4bq/IGPhu6dhIG3DtCBow6xuaCB0aOG7kW5nIGvDqiB2w6Agc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGThu68gbGnhu4d1IHF1YW4gc8OhdCB2w6AgZOG7ryBsaeG7h3UgdGjhu7FjIG5naGnhu4dtLg0KLSBLaOG6oyBuxINuZyBraMOhaSBxdcOhdCBow7NhIGPhu6dhIG3DtCBow6xuaC4NCi0gR2nhu5tpIHRoaeG7h3UgY8ahIGLhuqNuIHbhu4EgY8OhY2ggc+G7rSBk4bulbmcgUiBjaG8gbcO0IGjDrG5oIHRo4buRbmcga8OqLg0KDQojIyMgKioxLjIgIEPDoWMgcXV5IMaw4bubYyDEkeG7gyBtw7QgdOG6oyBk4buvIGxp4buHdSoqIA0KICBE4buvIGxp4buHdSDEkcaw4bujYyBiaeG7g3UgZGnhu4VuIHRoZW8gY8OhY2ggdG/DoW4gaOG7jWM6IGJp4bq/biBwaOG6o24gaOG7k2kgJHkkLCBiaeG6v24gZ2nhuqNpIHRow61jaCAkeF8xLCB4XzIsIFxsZG90cywgeF9wJC4NCiAgDQogIFBow6JuIGxv4bqhaSBiaeG6v24gDQogIA0KICAtICoqQ292YXJpYXRlczoqKiBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZw0KICAtICoqRmFjdG9yczoqKiBiaeG6v24gxJHhu4tuaCB0w61uaA0KICANCiMjIyAqKjEuMyBW4bq9IGJp4buDdSDEkeG7kyoqDQpQbG90dGluZyBEYXRhIC0gVuG6vSBiaeG7g3UgxJHhu5MNCi0gRMO5bmcgxJHhu5MgdGjhu4sgbmjGsCBzY2F0dGVyIHBsb3RzLCBzdHJpcCBjaGFydHMsIGJveHBsb3RzIMSR4buDIHBow6F0IGhp4buHbiB4dSBoxrDhu5tuZywgb3V0bGllci4NCiAgDQojIyMgKioxLjQgTcOjIGjDs2EgYmnhur9uIHBow6JuIGxv4bqhaWxv4bqhaSoqDQpDb2RpbmcgZm9yIEZhY3RvcnMgLSBNw6MgaMOzYSBiaeG6v24gcGjDom4gbG/huqFpDQoNCi0gQmnhur9uIGdp4bqjIChEdW1teSB2YXJpYWJsZXMpOiBkw7luZyAkay0xJCBiaeG6v24gZ2nhuqMgY2hvIG3hu5l0IHnhur91IHThu5EgY8OzICRrJCBt4bupYy4NCiAgDQotIFIgbeG6t2MgxJHhu4tuaCBz4butIGThu6VuZyBtw6MgaMOzYSAidHJlYXRtZW50IGNvZGluZyINCiAgDQojIyMgKioxLjUgIFN0YXRpc3RpY2FsIE1vZGVscyBEZXNjcmliZSBCb3RoIFJhbmRvbSBhbmQgU3lzdGVtYXRpYyBGZWF0dXJlcyBvZiBEYXRhKioNClN0YXRpc3RpY2FsIE1vZGVscyBEZXNjcmliZSBCb3RoIFJhbmRvbSBhbmQgU3lzdGVtYXRpYyBGZWF0dXJlcyBvZiBEYXRhIC0gTcO0IGjDrG5oIHRo4buRbmcga8OqIG3DtCB04bqjIGPhuqMgeeG6v3UgdOG7kSBuZ+G6q3Ugbmhpw6puIHbDoCBjw7MgaOG7hyB0aOG7kW5nIGPhu6dhIGThu68gbGnhu4d1DQoNCi0gKipUaMOgbmggcGjhuqduIGjhu4cgdGjhu5FuZzoqKiBtw7QgdOG6oyB0cnVuZyBiw6xuaCBj4bunYSBwaOG6o24gaOG7k2kgJEUoeSkgPSDOvCA9IM6y4oKAICsgzrLigoF44oKBICsgLi4uICsgzrLigpp44oKaJA0KICANCi0gKipUaMOgbmggcGjhuqduIG5n4bqrdSBuaGnDqm4gKFJhbmRvbSk6KiogJFZhcih5KSA9IM+DwrIkDQogIA0KLSAqKlRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAocmFuZG9tIGNvbXBvbmVudCkqKiBtw7QgdOG6oyBwaMOibiBwaOG7kWkgZ2nDoSB0cuG7iyBwaOG6o24gaOG7k2kg4bupbmcgduG7m2kgbeG7l2kgdOG7lSBo4bujcCBiaeG6v24gZ2nhuqNpIHRow61jaC4NCg0KLSAqKlRow6BuaCBwaOG6p24gaOG7hyB0aOG7kW5nIChzeXN0ZW1hdGljIGNvbXBvbmVudCkqKiBtw7QgdOG6oyBt4buRaSBxdWFuIGjhu4cgdG/DoW4gaOG7jWMgZ2nhu69hIHRydW5nIGLDrG5oIHBo4bqjbiBo4buTaSB2w6AgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCAoY2hp4buBdSBjYW8sIHR14buVaSwgZ2nhu5tpIHTDrW5oLCBow7p0IHRodeG7kWMpLg0KDQotICoqTcO0IGjDrG5oIHRo4buRbmcga8OqKiogPSB0aMOgbmggcGjhuqduIG5n4bqrdSBuaGnDqm4gKyB0aMOgbmggcGjhuqduIGjhu4cgdGjhu5FuZywgbcO0IHThuqMgY+G6oyBoYWkgxJHhurdjIMSRaeG7g20gY+G7p2EgZOG7ryBsaeG7h3UgdGjhu7FjIHThur8uDQoNCiMjIyMgKipWw60gZOG7pSB0aMOgbmggcGjhuqduIGjhu4cgdGjhu5FuZyDEkcahbiBnaeG6o24qKg0KDQokJA0KXG11X2kgPSBcYmV0YV8wICsgXGJldGFfMSB4X3sxaX0gKyBcYmV0YV8yIHhfezJpfSArIFxiZXRhXzMgeF97M2l9ICsgXGJldGFfNCB4X3s0aX0NCiQkDQoNCi0gXCggXG11X2kgPSBFW3lfaV0gXCkgbMOgIGvhu7MgduG7jW5nIGPhu6dhIHBo4bqjbiBo4buTaSBcKCB5X2kgXCkgdOG6oWkgcXVhbiBzw6F0IFwoIGkgXCkuDQoNCi0gXCggXGJldGFfaiBcKSBsw6AgdGhhbSBz4buRIGjhu5NpIHF1eSBjaMawYSBiaeG6v3QgduG7m2kgXCggaiA9IDAsIDEsIDIsIDMsIDQgXCkuDQoNCi0gXCggeF8xLCB4XzIgXCk6IHR14buVaSB2w6AgY2hp4buBdSBjYW8uDQoNCi0gXCggeF8zLCB4XzQgXCk6IGJp4bq/biBnaeG6oyBjaG8gZ2nhu5tpIHTDrW5oIHbDoCBow7p0IHRodeG7kWMuDQoNCiMjIyMgKipMxrB1IMO9KioNCg0KLSBN4buRaSBxdWFuIGjhu4cgRkVWIOKAkyBjaGnhu4F1IGNhbyBjw7MgdGjhu4MgcGhpIHR1eeG6v24uDQoNCi0gQ8OzIHRo4buDIHPhu60gZOG7pW5nIGPDoWMgdGjDoG5oIHBo4bqnbiBo4buHIHRo4buRbmcga2jDoWMgbmjGsCBzcGxpbmUsIMSRYSB0aOG7qWMgYuG6rWMgaGFpLg0KDQojIyMjICoqVuG7gSB0aMOgbmggcGjhuqduIG5n4bqrdSBuaGnDqm4qKg0KDQotIEdp4bqjIHPhu60gcGjGsMahbmcgc2FpIGtow7RuZyDEkeG7lWk6IFwoIFxtYXRocm17VmFyfSh5X2kpID0gXHNpZ21hXjIgXCkuDQoNCi0gR2nhuqMgxJHhu4tuaCBwaOG7lSBiaeG6v246DQoNCiQkDQp5X2kgXHNpbSBOKFxtdV9pLCBcc2lnbWFeMikNCiQkDQoNCi0gTmdoxKlhIGzDoCBcKCB5X2kgXCkgcGjDom4gcGjhu5FpIGNodeG6qW4gduG7m2kgdHJ1bmcgYsOsbmggXCggXG11X2kgXCkgdsOgIHBoxrDGoW5nIHNhaSBcKCBcc2lnbWFeMiBcKS4NCg0KLSBE4buvIGxp4buHdSB0aOG7sWMgdOG6vyBjw7MgdGjhu4MgY8OzIHBoxrDGoW5nIHNhaSB0aGF5IMSR4buVaSB0aGVvIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgsIGRvIMSRw7MgZ2nhuqMgxJHhu4tuaCBwaMawxqFuZyBzYWkga2jDtG5nIMSR4buVaSBjw7MgdGjhu4MgY2jGsGEgcGjDuSBo4bujcC4NCg0KIyMjICoqMS42IFJlZ3Jlc3Npb24gTW9kZWxzKioNClJlZ3Jlc3Npb24gTW9kZWxzIC0gTcO0IGjDrG5oIGjhu5NpIHF1eQ0KDQotIFRyb25nIHBow6JuIHTDrWNoIGThu68gbGnhu4d1LCBtw7QgaMOsbmggaOG7k2kgcXV5IGzDoCBt4buZdCBjw6FjaCBwaOG7lSBiaeG6v24gxJHhu4MgbcO0IHThuqMgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGJp4bq/biBwaOG6o24gaOG7k2kgJHkkIHbDoCBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoICR4XzEsIHhfMiwgXGxkb3RzLCB4X3AkLg0KDQotIE3hu5l0IG3DtCBow6xuaCBo4buTaSBxdXkgZ2nhuqMgxJHhu4tuaCBy4bqxbmcga+G7syB24buNbmcgY+G7p2EgJHlfaSQgcGjhu6UgdGh14buZYyB2w6BvIGPDoWMgYmnhur9uIGdp4bqjaSB0aMOtY2ggJHhfe2kxfSwgeF97aTJ9LCBcbGRvdHMsIHhfe2lwfSQgcXVhIG3hu5l0IGjDoG0gaOG7hyB0aOG7kW5nIGxpw6puIHF1YW4gxJHhur9uIGPDoWMgdGhhbSBz4buRIGjhu5NpIHF1eSAkXGJldGFfaiQ6DQoNCiQkDQpFW3lfaV0gPSBcbXVfaSA9IGYoeF97aTF9LCBcbGRvdHMsIHhfe2lwfTsgXGJldGFfMCwgXGJldGFfMSwgXGxkb3RzLCBcYmV0YV9wKQ0KJCQNCg0KUGjhu5UgYmnhur9uIG5o4bqldCBsw6Aga2hpIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHRyb25nIGPDoWMgdGhhbSBz4buROg0KDQokJA0KXG11X2kgPSBmKFxiZXRhXzAgKyBcYmV0YV8xIHhfe2kxfSArIFxjZG90cyArIFxiZXRhX3AgeF97aXB9KSBcdGFnezEuNX0NCiQkDQoNCiMjIyMgKipDw6FjIGThuqFuZyBtw7QgaMOsbmggaOG7k2kgcXV5OioqDQoNCi0gKipNw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgqKjogdGjDoG5oIHBo4bqnbiBo4buHIHRo4buRbmcgY8OzIGThuqFuZzoNCg0KJCQNCkVbeV9pXSA9IFxtdV9pID0gXGJldGFfMCArIFxiZXRhXzEgeF97aTF9ICsgXGNkb3RzICsgXGJldGFfcCB4X3tpcH0gXHRhZ3sxLjZ9DQokJA0KDQotICoqTcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNKSoqOiB0aMOgbmggcGjhuqduIGjhu4cgdGjhu5FuZyBjw7MgZOG6oW5nOg0KDQokJA0KXG11X2kgPSBnXnstMX0oXGJldGFfMCArIFxiZXRhXzEgeF97aTF9ICsgXGNkb3RzICsgXGJldGFfcCB4X3tpcH0pDQokJA0KDQpob+G6t2M6DQoNCiQkDQpnKFxtdV9pKSA9IFxiZXRhXzAgKyBcYmV0YV8xIHhfe2kxfSArIFxjZG90cyArIFxiZXRhX3AgeF97aXB9DQokJA0KDQpUcm9uZyDEkcOzICRnKFxjZG90KSQgbMOgIG3hu5l0IGjDoG0gbGnDqm4ga+G6v3QgxJHGoW4gxJFp4buHdSAoY2jhurNuZyBo4bqhbiBuaMawIGjDoG0gbG9nYXJpdCkuDQoNCg0KIyMjIyAqKk3hu5l0IHPhu5EgcXV5IMaw4bubYzoqKg0KDQotIFPhu5EgbMaw4bujbmcgYmnhur9uIGdp4bqjaSB0aMOtY2g6ICR4XzEsIHhfMiwgXGxkb3RzLCB4X3AkLg0KLSBT4buRIGzGsOG7o25nIHRoYW0gc+G7kSBo4buTaSBxdXk6ICRcYmV0YV8wLCBcYmV0YV8xLCBcbGRvdHMsIFxiZXRhX3AkLg0KLSBO4bq/dSAkXGJldGFfMCQga2jDtG5nIMSR4buVaSB2w6AgcGjhuqduIGPDsm4gbOG6oWkgbMOgICR4X2okIHRow6wgc+G7kSBsxrDhu6NuZyBiaeG6v24gZ2nhuqNpIHRow61jaCBsw6AgJHAkLCBz4buRIGzGsOG7o25nIHRoYW0gc+G7kSBsw6AgJHAgKyAxJC4NCg0KQ8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggbMOgIHRyxrDhu51uZyBo4bujcCDEkeG6t2MgYmnhu4d0IGPhu6dhIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQsIHbhu5tpIGjDoG0gbGnDqm4ga+G6v3QgJGckIGzDoCBow6BtIMSR4buTbmcgbmjhuqV0Lg0KDQojIyMgKioxLjcgSW50ZXJwcmV0aW5nIFJlZ3Jlc3Npb24gTW9kZWxzKioNCkludGVycHJldGluZyBSZWdyZXNzaW9uIE1vZGVscyAtIERp4buFbiBnaeG6o2kgbcO0IGjDrG5oIGjhu5NpIHF1eQ0KDQpNw7QgaMOsbmggY2jhu4kgdGjhu7FjIHPhu7EgaOG7r3Ugw61jaCBraGkgY8OzIHRo4buDIGRp4buFbiBnaeG6o2kgbeG7mXQgY8OhY2ggaOG7o3AgbMO9LiBIYWkgdGjDoG5oIHBo4bqnbiBo4buHIHRo4buRbmcgc2F1IMSRxrDhu6NjIHNvIHPDoW5oOg0KDQokJA0KXG11ID0gXGJldGFfMCArIFxiZXRhXzEgeCBcdGFnezEuMTd9DQokJA0KDQokJA0KXGxvZyBcbXUgPSBcYmV0YV8wICsgXGJldGFfMSB4IFx0YWd7MS4xOH0NCiQkDQoNCi0gTcO0IGjDrG5oICgxLjE3KSBnaeG6oyDEkeG7i25oIG3hu5FpIHF1YW4gaOG7hyB0dXnhur9uIHTDrW5oIGdp4buvYSAkXG11JCB2w6AgJHgkLCB04bupYyBsw6Aga2hpICR4JCB0xINuZyBt4buZdCDEkcahbiB24buLIHRow6wgJFxtdSQgdMSDbmcgdGjDqm0gJFxiZXRhXzEkLg0KLSBNw7QgaMOsbmggKDEuMTgpIGdp4bqjIMSR4buLbmggbeG7kWkgcXVhbiBo4buHIHR1eeG6v24gdMOtbmggZ2nhu69hICRcbG9nIFxtdSQgdsOgICR4JCwgbmdoxKlhIGzDoCBraGkgJHgkIHTEg25nIG3hu5l0IMSRxqFuIHbhu4sgdGjDrCAkXGxvZyBcbXUkIHTEg25nIHRow6ptICRcYmV0YV8xJC4gxJBp4buBdSBuw6B5IG5n4bulIMO9IHLhurFuZyAkXG11JCB0xINuZyAoeOG6pXAgeOG7iSkgdGhlbyBo4buHIHPhu5EgJFxleHAoXGJldGFfMSkkLg0KDQpD4bulIHRo4buDLCB2aeG6v3QgbOG6oWkgcGjGsMahbmcgdHLDrG5oICgxLjE4KToNCg0KJCQNClxtdV94ID0gXGV4cChcYmV0YV8wICsgXGJldGFfMSB4KSA9IFxleHAoXGJldGFfMCkgXGV4cChcYmV0YV8xKV54DQokJA0KDQpLaGkgJHgkIHTEg25nIHThu6sgJHgkIGzDqm4gJHggKyAxJCwgdGEgY8OzOg0KDQokJA0KXG11X3t4KzF9ID0gXGV4cChcYmV0YV8wKSBcZXhwKFxiZXRhXzEpXnt4KzF9ID0gXG11X3ggXGV4cChcYmV0YV8xKQ0KJCQNCg0KRG8gxJHDsywgbeG7l2kga2hpICR4JCB0xINuZyAxLCAkXG11JCB0xINuZyBsw6puIG3hu5l0IGjhu4cgc+G7kSBsw6AgJFxleHAoXGJldGFfMSkkLg0KDQpOaMOgIG5naGnDqm4gY+G7qXUgY+G6p24gbOG7sWEgY2jhu41uIG3DtCBow6xuaCBjw7Mga2jhuqMgbsSDbmcgZGnhu4VuIGdp4bqjaSBo4bujcCBsw70gaMahbiB24bubaSBuZ+G7ryBj4bqjbmggdGjhu7FjIHThur8uIE5o4buvbmcgbcO0IGjDrG5oIGThu7FhIHRyw6puIGzDvSB0aHV54bq/dCBu4buBbiB04bqjbmcgKG5oxrAgbcO0IGjDrG5oICgxLjE3KSBjaG8gaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgpIHPhur0gY2hvIGPDoWNoIGRp4buFbiBnaeG6o2kgZOG7hSBoaeG7g3UsIHRyb25nIGtoaSBj4bqjIGhhaSBtw7QgaMOsbmggKDEuMTcpIHbDoCAoMS4xOCkgxJHhu4F1IHRow61jaCBo4bujcCBjaG8gaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0IChHTE0pLg0KDQpOZ2/DoGkgcmEsIGtoaSBjw7Mgbmhp4buBdSBiaeG6v24gZ2nhuqNpIHRow61jaCwgY+G6p24gY+G6qW4gdHLhu41uZyB2w6wgY8OhYyBiaeG6v24gY8OzIHRo4buDIGxpw6puIHF1YW4gxJHhur9uIG5oYXUgKHbDrSBk4bulOiB0deG7lWkgdsOgIGNoaeG7gXUgY2FvIMSR4buBdSDhuqNuaCBoxrDhu59uZyDEkeG6v24gZHVuZyB0w61jaCBwaOG7lWkpLiBLaGkgxJHDsywgdmnhu4djIGRp4buFbiBnaeG6o2kgY8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5IGPhuqduIHhlbSB4w6l0IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCDEkeG7gyB0csOhbmggbmjhuqdtIGzhuqtuLg0KDQoNCiMjIyAqKjEuOCBBbGwgTW9kZWxzIEFyZSBXcm9uZywgYnV0IFNvbWUgQXJlIFVzZWZ1bCoqDQoNCkPDoWMgbcO0IGjDrG5oIHRo4buRbmcga8OqIGzDoCBjw6FjaCDEkeG7gyBoaeG7g3UgZOG7ryBsaeG7h3UsIG5oxrBuZyBjaMO6bmcga2jDtG5nIHBo4bqjaSBsw6AgxJHhuqFpIGRp4buHbiBob8OgbiBo4bqjbyBjaG8gdGjhu7FjIHThur8uIEJveCB2w6AgRHJhcGVyICgxOTg3KSB04burbmcgbsOzaTogKioiVOG6pXQgY+G6oyBjw6FjIG3DtCBow6xuaCDEkeG7gXUgc2FpLCBuaMawbmcgbeG7mXQgc+G7kSB0aMOsIGjhu691IMOtY2guIioqDQoNCiAgw50gY2jDrW5oOiAgDQotIE3DtCBow6xuaCB0aOG7kW5nIGvDqiBnacO6cCDEkcahbiBnaeG6o24gaMOzYSwgY8O0IMSR4buNbmcgdGjDtG5nIHRpbiDEkeG7gyBwaOG7pWMgduG7pSBt4buZdCBt4bulYyB0acOqdSBj4bulIHRo4buDLg0KLSBDaMO6bmcga2jDtG5nIG5o4bqldCB0aGnhur90IHBo4bqjaSBjaMOtbmggeMOhYyB0dXnhu4d0IMSR4buRaSwgbcOgIGNo4buJIGPhuqduIMSR4bunIMSR4buDIG7huq9tIMSRxrDhu6NjIGPDoWMgxJHhurdjIMSRaeG7g20gcXVhbiB0cuG7jW5nIG5o4bqldCBj4bunYSB0aOG7sWMgdOG6vyB0cm9uZyBi4buRaSBj4bqjbmggc+G7rSBk4bulbmcuDQoNCg0KIyMjICoqMS45IFRoZSBQdXJwb3NlIG9mIGEgU3RhdGlzdGljYWwgTW9kZWwgQWZmZWN0cyBIb3cgSXQgSXMgRGV2ZWxvcGVkOiBQcmVkaWN0aW9uIHZzIEludGVycHJldGF0aW9uKioNCg0KTeG7pWMgxJHDrWNoIHjDonkgZOG7sW5nIG3DtCBow6xuaCDhuqNuaCBoxrDhu59uZyBs4bubbiDEkeG6v24gY8OhY2ggbcO0IGjDrG5oIMSRxrDhu6NjIHBow6F0IHRyaeG7g24uDQoNCiMjIyMgKipIYWkgbeG7pWMgdGnDqnUgY2jDrW5oOioqDQoNCi0gKipE4buxIMSRb8OhbiAoUHJlZGljdGlvbikqKiBNw7QgaMOsbmggZMO5bmcgxJHhu4MgZOG7sSBiw6FvIGPDoWMgZ2nDoSB0cuG7iyB0xrDGoW5nIGxhaSBk4buxYSB0csOqbiBk4buvIGxp4buHdSBoaeG7h24gdOG6oWkuDQoNCi0gKipEaeG7hW4gZ2nhuqNpIChJbnRlcnByZXRhdGlvbikqKiBNw7QgaMOsbmggZ2nDunAgaGnhu4N1IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24sIHbDrSBk4bulIG5oxrAgYmnhur9uIG7DoG8g4bqjbmggaMaw4bufbmcgbeG6oW5oIMSR4bq/biBr4bq/dCBxdeG6oy4NCg0KIyMjIyAqKlbDrSBk4bulOioqICANCi0gVHJvbmcgZOG7ryBsaeG7h3UgduG7gSBkdW5nIHTDrWNoIHBo4buVaSAobHVuZyBjYXBhY2l0eSksIG7hur91IG3hu6VjIHRpw6p1IGzDoCAqKmRp4buFbiBnaeG6o2kqKiwgdGEgc+G6vSBxdWFuIHTDom0gxJHhur9uIGNoaeG7gXUgY2FvIHbDoCB0deG7lWkgY8OzIOG6o25oIGjGsOG7n25nIG5oxrAgdGjhur8gbsOgbyDEkeG6v24gRkVWLiBO4bq/dSBt4bulYyB0acOqdSBsw6AgKipk4buxIMSRb8OhbioqLCB0YSBz4bq9IGNo4buNbiBtw7QgaMOsbmggbsOgbyBjaG8gc2FpIHPhu5Egbmjhu48gbmjhuqV0LCBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgbmhp4buBdSBiaeG6v24gaMahbiBob+G6t2Mgw6FwIGThu6VuZyBiaeG6v24gxJHhu5VpIChuaMawIGxvZywgc3FydCkuDQoNCg0KIyMjICoqMS4xMCBBY2N1cmFjeSB2cyBQYXJzaW1vbnkqKg0KDQpUcm9uZyBtw7QgaMOsbmggdGjhu5FuZyBrw6osIGPDsyBy4bqldCBuaGnhu4F1IGPDoWNoIGNo4buNbiB0aMOgbmggcGjhuqduIGjhu4cgdGjhu5FuZyB2w6Agbmfhuqt1IG5oacOqbi4gDQpW4bqlbiDEkeG7gSDEkeG6t3QgcmEgbMOgOiAqKmzDoG0gc2FvIGNo4buNbiDEkcaw4bujYyBt4buZdCBtw7QgaMOsbmggcGjDuSBo4bujcCB04burIHbDtCBz4buRIG3DtCBow6xuaCBraOG6oyBkxKk/KioNCg0KICBCYSBjw6FjaCB0aeG6v3AgY+G6rW4gY2jDrW5oIMSR4buDIGNo4buNbiBtw7QgaMOsbmggdGjhu5FuZyBrw6o6DQoNCi0gKipE4buxYSB0csOqbiBsw70gdGh1eeG6v3QgbuG7gW4gdOG6o25nIGhv4bq3YyBoaeG7g3UgYmnhur90IHbhuq10IGzDvSBj4bunYSBoaeG7h24gdMaw4bujbmcqKiwgdsOtIGThu6U6IG3DtCBow6xuaCB0aOG7gyB0w61jaCBwaOG7lWkg4oidIGNoaeG7gXUgY2FvLg0KLSAqKkThu7FhIHRyw6puIHjhuqVwIHjhu4kgaG/hurdjIHN1eSBsdeG6rW4gxJHGoW4gZ2nhuqNuIGjDs2EgdOG7qyB0aOG7sWMgdOG6vyoqLCBuaMawIHRo4buDIHTDrWNoIHBo4buVaSDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgZOG7sWEgdHLDqm4gbcO0IGjDrG5oIGjDrG5oIHRy4bulOiAgDQogICQkIFx0ZXh0e1Ro4buDIHTDrWNofSBccHJvcHRvIHJeMiBcY2RvdCBoIFxSaWdodGFycm93IFx0ZXh0e0ZFVn0gXHByb3B0byB4XjIgJCQNCi0gKipE4buxYSBob8OgbiB0b8OgbiB2w6BvIGThu68gbGnhu4d1KiosIHRyb25nIHRyxrDhu51uZyBo4bujcCBraMO0bmcgY8OzIGzDvSB0aHV54bq/dCBu4buBbiBob+G6t2MgdHLhuqFuZyB0aMOhaSDigJzEkcO6bmfigJ0gdGjhu7FjIHPhu7Ega2jDtG5nIHjDoWMgxJHhu4tuaC4NCg0KIyMjIyAqKkhhaSB0acOqdSBjaMOtIGNow61uaCDEkeG7gyBjaOG7jW4gbcO0IGjDrG5oOioqDQoNCi0gKipBY2N1cmFjeSAoxJDhu5kgY2jDrW5oIHjDoWMpKio6IE3DtCBow6xuaCBuw6puIG3DtCB04bqjIMSRw7puZyBj4bqjIGhhaSB0aMOgbmggcGjhuqduICoqaOG7hyB0aOG7kW5nKiogdsOgICoqbmfhuqt1IG5oacOqbioqLg0KLSAqKlBhcnNpbW9ueSAoVMOtbmggxJHGoW4gZ2nhuqNuKSoqOiBNw7QgaMOsbmggY8OgbmcgxJHGoW4gZ2nhuqNuIGPDoG5nIHThu5F0Lg0KDQpUaGVvIG5ndXnDqm4gbMO9ICoqT2NjYW3igJlzIFJhem9yKiosIG3DtCBow6xuaCB04buRdCBuaOG6pXQgbMOgIG3DtCBow6xuaCAqKsSRxqFuIGdp4bqjbiBuaOG6pXQgbcOgIHbhuqtuIG3DtCB04bqjIMSRw7puZyBk4buvIGxp4buHdSoqLg0KDQpNw7QgaMOsbmggcXXDoSDEkcahbiBnaeG6o24gc+G6vSBi4buPIHPDs3QgeHUgaMaw4bubbmcgZOG7ryBsaeG7h3U7IG3DtCBow6xuaCBxdcOhIHBo4bupYyB04bqhcCB0aMOsIGThu4UgYuG7iyAqKm92ZXJmaXR0aW5nKiog4oCTIHThu6ljIGzDoCBjaOG7iSBwaMO5IGjhu6NwIHbhu5tpIHThuq1wIGThu68gbGnhu4d1IGhp4buHbiB04bqhaSBuaMawbmcga8OpbSB04buVbmcgcXXDoXQgaMOzYSB24bubaSBk4buvIGxp4buHdSBt4bubaS4NCg0KIyMjIyMgKipWw60gZOG7pSBtaW5oIGjhu41hOioqDQpE4buvIGxp4buHdSBzaW5oIHJhIHThu6sgbcO0IGjDrG5oOiAgDQokJCB5IFxzaW0gXG1hdGhjYWx7Tn0oXG11LCAwLjM1KSxccXVhZCBcbXUgPSB4XjMgLSAzeCArIDUgJCQNCg0KQmEgbcO0IGjDrG5oIHRo4butIG5naGnhu4dtOg0KDQotICoqTGluZWFyIG1vZGVsKio6IMSQxrDhu51uZyB0aOG6s25nIOKAkyBzYWkgeHUgaMaw4bubbmcsIHBoxrDGoW5nIHNhaSBs4bubbiwga2jDtG5nIG5n4bqrdSBuaGnDqm4uDQotICoqQ3ViaWMgbW9kZWwqKjogVGhlbyDEkcO6bmcgbcO0IGjDrG5oIHNpbmggZOG7ryBsaeG7h3Ug4oCTIGNow61uaCB4w6FjLCDEkcahbiBnaeG6o24sIG5n4bqrdSBuaGnDqm4gxJHDum5nLg0KLSAqKjEwdGgtb3JkZXIgcG9seW5vbWlhbCoqOiBExrDhu51uZyBuaMawIGto4bubcCBt4buNaSDEkWnhu4NtIGThu68gbGnhu4d1IOKAkyBxdcOhIHBo4bupYyB04bqhcCwgKipiaeG7g3UgZGnhu4VuIGPhuqMgbmhp4buFdSoqLCBk4bqrbiDEkeG6v24gKipk4buxIMSRb8OhbiBzYWkgbOG7h2NoKiouDQoNCipDdWJpYyBtb2RlbCoqIGzDoCBtw7QgaMOsbmggxJHGsOG7o2MgxrB1IHRpw6puIHRoZW8gdGnDqnUgY2jDrSBjw6JuIGLhurFuZyBnaeG7r2EgKiphY2N1cmFjeSB2w6AgcGFyc2ltb255KiouDQoNCiMjIyAqKjEuMTEgRXhwZXJpbWVudHMgdnMgT2JzZXJ2YXRpb25hbCBTdHVkaWVzIOKAkyBDYXVzYWxpdHkgdnMgQXNzb2NpYXRpb24qKg0KRXhwZXJpbWVudHMgdnMgT2JzZXJ2YXRpb25hbCBTdHVkaWVzIOKAkyBDYXVzYWxpdHkgdnMgQXNzb2NpYXRpb246IFRow60gbmdoaeG7h20gdnMgTmdoacOqbiBj4bupdSBxdWFuIHPDoXQ6IE5ow6JuIHF14bqjIHZzIFTGsMahbmcgcXVhbg0KDQogIE3hu41pIG3DtCBow6xuaCB0aOG7kW5nIGvDqiBj4bqnbiDEkcaw4bujYyBz4butIGThu6VuZyB2w6AgaGnhu4N1IHRyb25nIGLhu5FpIGPhuqNuaCAqKmPDoWNoIGThu68gbGnhu4d1IMSRxrDhu6NjIHRodSB0aOG6rXAqKi4gQ8OhY2ggdGh1IHRo4bqtcCDhuqNuaCBoxrDhu59uZyDEkeG6v24gKipr4bq/dCBsdeG6rW4gY8OzIHRo4buDIHLDunQgcmEgdOG7qyBtw7QgaMOsbmgqKi4NCg0KIyMjIyAqKkhhaSBsb+G6oWkgbmdoacOqbiBj4bupdSBjaMOtbmg6KioNCg0KKipOZ2hpw6puIGPhu6l1IHF1YW4gc8OhdCAoT2JzZXJ2YXRpb25hbCBTdHVkeSkqKiANCg0KLSBOaMOgIG5naGnDqm4gY+G7qXUgKipraMO0bmcgY2FuIHRoaeG7h3AqKiwgY2jhu4kgcXVhbiBzw6F0IHbDoCBnaGkgbmjhuq1uIGThu68gbGnhu4d1IGPDsyBz4bq1biAodsOtIGThu6U6IHF1YSBi4bqjbmcgaOG7j2ksIHRoaeG6v3QgYuG7iyDEkW8gbMaw4budbmcpLg0KLSBL4bq/dCBsdeG6rW4gcsO6dCByYSB0aMaw4budbmcgY2jhu4kgbMOgICoqbeG7kWkgdMawxqFuZyBxdWFuIChhc3NvY2lhdGlvbikqKiBnaeG7r2EgY8OhYyBiaeG6v24uDQotIFbDrSBk4bulOiBE4buvIGxp4buHdSBsdW5nIGNhcGFjaXR5IGzDoCBuZ2hpw6puIGPhu6l1IHF1YW4gc8OhdCDigJMga2jDtG5nIGtp4buDbSBzb8OhdCDEkcaw4bujYyBuZ8aw4budaSB0aGFtIGdpYSBjw7MgaMO6dCB0aHXhu5FjIGhheSBraMO0bmcuDQoNCioqVGjDrSBuZ2hp4buHbSAoRGVzaWduZWQgRXhwZXJpbWVudCkqKiAgDQoNCi0gTmjDoCBuZ2hpw6puIGPhu6l1ICoqY2jhu6cgxJHhu5luZyDDoXAgZOG7pW5nIMSRaeG7gXUga2nhu4duKiogY2hvIHThu6tuZyDEkeG7kWkgdMaw4bujbmcsIGtp4buDbSBzb8OhdCBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBnaeG6o2kgdGjDrWNoLg0KLSBDaG8gcGjDqXAgcsO6dCByYSBr4bq/dCBsdeG6rW4gduG7gSAqKnF1YW4gaOG7hyBuaMOibiBxdeG6oyAoY2F1c2FsaXR5KSoqLg0KDQojIyMjICoqU28gc8OhbmggbcO0IGjDrG5oOioqDQoNCi0gVuG7gSBt4bq3dCAqKmvhu7kgdGh14bqtdCB0aOG7kW5nIGvDqioqLCBj4bqjIGhhaSBsb+G6oWkgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbcO0IGjDrG5oIGdp4buRbmcgbmhhdS4NCi0gVHV5IG5oacOqbiwgKip24buBIG3hurd0IGtob2EgaOG7jWMqKiwga+G6v3QgbHXhuq1uIHThu6sgdGjDrSBuZ2hp4buHbSDEkcaw4bujYyB4ZW0gbMOgIG3huqFuaCBoxqFuIG5oaeG7gXUuDQoNCiMjIyMgKipDw6FjaCB44butIGzDvSB0cm9uZyBuZ2hpw6puIGPhu6l1IHF1YW4gc8OhdDoqKg0KDQotIEtow7RuZyB0aOG7gyBraeG7g20gc2/DoXQgaG/DoG4gdG/DoG4gY8OhYyB54bq/dSB04buRIGfDonkgbmhp4buFdS4NCi0gR2nhuqNpIHBow6FwOiDEkW8gbMaw4budbmcgY8Ogbmcgbmhp4buBdSBiaeG6v24gcGjhu6UgY8OgbmcgdOG7kXQgKHbDrSBk4bulOiB0deG7lWksIGNoaeG7gXUgY2FvLCBnaeG7m2kgdMOtbmgpLCBzYXUgxJHDsyDEkWnhu4F1IGNo4buJbmggdHJvbmcgcGjDom4gdMOtY2ggxJHhu4MgKipnaeG6o20gbmhp4buFdSoqLg0KDQojIyMjICoqVsOtIGThu6UgMS44OiBMdW5nIGNhcGFjaXR5IHbDoCBow7p0IHRodeG7kWMqKg0KDQotIEzDoCBt4buZdCBuZ2hpw6puIGPhu6l1IHF1YW4gc8OhdC4NCi0gQmnhur9uIGNow61uaCBxdWFuIHTDom06IGjDunQgdGh14buRYy4NCi0gQ8OhYyB54bq/dSB04buRIGfDonkgbmhp4buFdSBuaMawIHR14buVaSwgY2hp4buBdSBjYW8sIGdp4bubaSB0w61uaCDEkcaw4bujYyBnaGkgbmjhuq1uIMSR4buDIMSRaeG7gXUgY2jhu4luaC4NCi0gTeG7pWMgdGnDqnU6IHBow6JuIHTDrWNoICoqbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgaMO6dCB0aHXhu5FjIHbDoCBGRVYqKiBzYXUga2hpIMSRw6MgxJFp4buBdSBjaOG7iW5oIGPDoWMgYmnhur9uIHBo4bulLg0KLSAqKkPhuqNuaCBiw6FvKio6IEtow7RuZyBuw6puIHLDunQgcmEga+G6v3QgbHXhuq1uIG5ow6JuIHF14bqjIGNo4buJIHThu6sgZOG7ryBsaeG7h3UgcXVhbiBzw6F0Lg0KDQojIyMgKioxLjEyIFRodSB0aOG6rXAgZOG7ryBsaeG7h3UgdsOgIHTDrW5oIGtow6FpIHF1w6F0IGPhu6dhIG3DtCBow6xuaCB0aOG7kW5nIGvDqioqDQoNClTDrW5oIGtow6FpIHF1w6F0IChnZW5lcmFsaXphYmlsaXR5KSBj4bunYSBtw7QgaMOsbmggcGjhu6UgdGh14buZYyB2w6BvICoqbmd14buTbiBk4buvIGxp4buHdSoqIMSRxrDhu6NjIHRodSB0aOG6rXAuIEvhur90IGx14bqtbiB04burIG3hu5l0IG3DtCBow6xuaCB0aOG7kW5nIGvDqiAqKmNo4buJIGPDsyBnacOhIHRy4buLIHRyb25nIHBo4bqhbSB2aSBj4bunYSBxdeG6p24gdGjhu4MgbcOgIGThu68gbGnhu4d1IMSRxrDhu6NjIGzhuqV5IHThu6sgxJHDsyoqLg0KDQojIyMjICoqVsOtIGThu6U6KioNCg0KTuG6v3UgZOG7ryBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB04burICoqcGjhu6UgbuG7ryB0csOqbiA2MCB0deG7lWkg4bufIE5o4bqtdCBC4bqjbioqLCB0aMOsIGvhur90IHF14bqjIHBow6JuIHTDrWNoICoqa2jDtG5nIHRo4buDIMOhcCBk4bulbmcqKiBjaG86DQoNCi0gTmFtIGdp4bubaQ0KLSBQaOG7pSBu4buvIE5o4bqtdCBkxrDhu5tpIDYwIHR14buVaQ0KLSBQaOG7pSBu4buvIHRyw6puIDYwIHR14buVaSDhu58gY8OhYyBxdeG7kWMgZ2lhIGtow6FjDQoNCiMjIyMgKipOZ2/DoGkgcmE6KioNCg0KLSBL4bq/dCBxdeG6oyB04burIG3hu5l0IG3DtCBow6xuaCBo4buTaSBxdXkgKipraMO0bmcgdGjhu4Mgc3V5IHLhu5luZyAoZXh0cmFwb2xhdGUpKiogbmdvw6BpIHBo4bqhbSB2aSBk4buvIGxp4buHdSBiYW4gxJHhuqd1Lg0KLSBLaMO0bmcgbsOqbiDDoXAgZOG7pW5nIG3DtCBow6xuaCBjaG8gbmjhu69uZyBnacOhIHRy4buLIG7hurFtIG5nb8OgaSB04bqtcCBk4buvIGxp4buHdSBodeG6pW4gbHV54buHbiBu4bq/dSBraMO0bmcgY8OzIGPGoSBz4bufIHLDtSByw6BuZy4NCg0KIyMjIyAqKlbDrSBk4bulIDEuOSDigJMgROG7ryBsaeG7h3UgZHVuZyB0w61jaCBwaOG7lWkgKGx1bmcgY2FwYWNpdHkpOioqDQoNCi0gVGh1IHRo4bqtcCB04burIHRoYW5oIHRoaeG6v3UgbmnDqm4gdOG6oWkgQm9zdG9uICh0deG7lWkgM+KAkzE5KSB0cm9uZyBnaWFpIMSRb+G6oW4gZ2nhu69hIMSR4bq/biBjdeG7kWkgdGjhuq1wIG5pw6puIDE5NzAuDQotIEThu68gbGnhu4d1ICoqcGjhuqNuIMOhbmggaMOgbmggdmkgaMO6dCB0aHXhu5FjIGPhu6dhIHRoYW5oIHRoaeG6v3UgbmnDqm4g4bufIHRo4budaSDEkWnhu4NtIHbDoCDEkeG7i2EgcGjGsMahbmcgxJHDsyoqLg0KDQotIFN1eSBsdeG6rW4gY2hvOg0KICAtIEPDoWMgdGjhu51pIMSRaeG7g20ga2jDoWMNCiAgLSBLaHUgduG7sWMga2jDoWMNCiAgLSBIb+G6t2MgY8OhYyBuaMOzbSB0deG7lWkga2jDoWMNCg0KICDEkeG7gXUgKipj4bqnbiB0aOG6rW4gdHLhu41uZyoqIHbDrCBjw7MgdGjhu4Mga2jDtG5nIGPDsm4gcGjDuSBo4bujcC4NCg0KLSAqKkNoaeG7gXUgY2FvKiogdHJvbmcgZOG7ryBsaeG7h3UgbuG6sW0gdHJvbmcga2hv4bqjbmcgNDbigJM3NCBpbmNoZXMg4oeSIG3DtCBow6xuaCBraMO0bmcgdGjhu4Mgw6FwIGThu6VuZyBjaG8gY2hp4buBdSBjYW8gbmdvw6BpIGtob+G6o25nIMSRw7MuDQotIEtow7RuZyB0aOG7gyBr4buzIHbhu41uZyBy4bqxbmcgRkVWIHPhur0gKip0xINuZyB0dXnhur9uIHTDrW5oIG3Do2kgbcOjaSoqIHbhu5tpIHR14buVaSB2w6AgY2hp4buBdSBjYW8uDQoNCg0KKipL4bq/dCBsdeG6rW4qKjogS2hpIHPhu60gZOG7pW5nIG3DtCBow6xuaCB0aOG7kW5nIGvDqiwgY+G6p24gaGnhu4N1IHLDtSAqKnBo4bqhbSB2aSDhu6luZyBk4bulbmcqKiBj4bunYSBr4bq/dCBsdeG6rW4sIHRyw6FuaCB2aeG7h2MgKipraMOhaSBxdcOhdCBow7NhIHNhaSoqIHThu6sgbeG6q3UgxJHhur9uIHF14bqnbiB0aOG7gyBraMOhYy4NCg0KIyMjICoqMS4xMyBEYXRhIENvbGxlY3Rpb24gYW5kIEdlbmVyYWxpemFiaWxpdHkqKg0KDQotICoqVMOtbmggdOG7lW5nIHF1w6F0IGPhu6dhIG3DtCBow6xuaCB0aOG7kW5nIGvDqioqIHBo4bulIHRodeG7mWMgcuG6pXQgbOG7m24gdsOgbyBjw6FjaCAqKnRodSB0aOG6rXAgZOG7ryBsaeG7h3UqKi4NCi0gS+G6v3QgbHXhuq1uIHThu6sgbeG7mXQgbcO0IGjDrG5oIGNo4buJIGPDsyB0aOG7gyDDoXAgZOG7pW5nICoqY2hvIHF14bqnbiB0aOG7gyBtw6AgdOG7qyDEkcOzIG3huqt1IMSRxrDhu6NjIGzhuqV5KiouIA0KICAgIC0gVsOtIGThu6U6IE7hur91IGThu68gbGnhu4d1IGNo4buJIGzhuqV5IHThu6sgcGjhu6UgbuG7ryB0csOqbiA2MCB0deG7lWkg4bufIE5o4bqtdCBC4bqjbiwgdGjDrCBr4bq/dCBsdeG6rW4ga2jDtG5nIHRo4buDIMOhcCBk4bulbmcgY2hvIG5hbSBnaeG7m2kgaG/hurdjIG5nxrDhu51pIHRy4bq7IHR14buVaSwgaGF5IOG7nyBxdeG7kWMgZ2lhIGtow6FjLg0KLSBLaMO0bmcgbsOqbiAqKm5nb+G6oWkgc3V5IG3DtCBow6xuaCoqIHJhIG5nb8OgaSAqKnBo4bqhbSB2aSBk4buvIGxp4buHdSBn4buRYyoqLg0KICAgIC0gVsOtIGThu6U6IEThu68gbGnhu4d1IGR1bmcgdMOtY2ggcGjhu5VpIHRodSB0aOG6rXAgdOG7qyB0aGFuaCB0aGnhur91IG5pw6puIOG7nyBCb3N0b24gbsSDbSAxOTcwICoqa2jDtG5nIHRo4buDIMOhcCBk4bulbmcgY2jhuq9jIGNo4bqvbioqIGNobyB0aGFuaCB0aGnhur91IG5pw6puIGhp4buHbiBuYXkgaG/hurdjIHThu6sgbsahaSBraMOhYy4NCi0gQ+G6p24gdGjhuq1uIHRy4buNbmcgduG7m2kgKipwaOG6oW0gdmkgZ2nDoSB0cuG7iyoqIGPhu6dhIGPDoWMgYmnhur9uIHRyb25nIGThu68gbGnhu4d1Og0KICAgIC0gTuG6v3UgZOG7ryBsaeG7h3UgY2jhu4kgYmFvIGfhu5NtIGNoaeG7gXUgY2FvIHThu6sgNDYgxJHhur9uIDc0IGluY2hlcyB2w6AgxJHhu5kgdHXhu5VpIHThu6sgMyDEkeG6v24gMTksDQogICAgLSB0aMOsIG3DtCBow6xuaCBraMO0bmcgbsOqbiDEkcaw4bujYyBz4butIGThu6VuZyBjaG8gY2hp4buBdSBjYW8gaGF5IMSR4buZIHR14buVaSBuZ2/DoGkgcGjhuqFtIHZpIMSRw7MuDQotIFZp4buHYyAqKmdp4bqjIMSR4buLbmggdHV54bq/biB0w61uaCoqIGhv4bq3YyDDoXAgZOG7pW5nIG3DtCBow6xuaCBuZ2/DoGkgcGjhuqFtIHZpIGThu68gbGnhu4d1IGfhu5FjIGPDsyB0aOG7gyAqKmfDonkgcmEgc2FpIGzhu4djaCBuZ2hpw6ptIHRy4buNbmcqKi4NCg0KIyMjIyAqKsOdIG5naMSpYSB0aOG7sWMgdGnhu4VuKioNCg0KLSBLaGkgeMOieSBk4buxbmcgdsOgIMOhcCBk4bulbmcgbcO0IGjDrG5oIHRo4buRbmcga8OqLCBj4bqnbjoNCiAgLSBYw6FjIMSR4buLbmggcsO1IHBo4bqhbSB2aSBk4buvIGxp4buHdS4NCiAgLSBIaeG7g3UgZ2nhu5tpIGjhuqFuIGtow6FpIHF1w6F0IGjDs2EuDQogIC0gVHLDoW5oIG5nb+G6oWkgc3V5IGtow7RuZyBjw7MgY8SDbiBj4bupLg0KDQoqKkdoaSBuaOG7mzoqKiBE4buvIGxp4buHdSBjaOG7iSDEkeG6oWkgZGnhu4duIGNobyBuaOG7r25nIGfDrCBi4bqhbiDEkW8gbMaw4budbmcg4oCUIMSR4burbmcgZMO5bmcgbcO0IGjDrG5oIGNobyBuaOG7r25nIHRo4bupIG7hurFtIG5nb8OgaSBwaOG6oW0gdmkgYuG6oW4gY2jGsGEgdOG7q25nIGto4bqjbyBzw6F0Lg0KDQotLS0NCg0KIyMgKipDSMavxqBORyAyOiBNw5QgSMOMTkggSOG7kkkgUVVZIFRVWeG6vk4gVMONTkggLSBMSU5FQVIgUkVHUkVFU1NJT04gTU9ERUxTKioNCiMjIyAqKjIuMTogSW50cm9kdWN0aW9uIGFuZCBPdmVydmlldyoqDQoNCiMjIyMgVMOzbSB04bqvdCBu4buZaSBkdW5nDQoNCi0gKipMaW5lYXIgcmVncmVzc2lvbiBtb2RlbCoqIGzDoCBtw7QgaMOsbmggaOG7k2kgcXV5IHBo4buVIGJp4bq/biBuaOG6pXQgdHJvbmcgdGjhu5FuZyBrw6ogdsOgIGzDoCB0cuG7jW5nIHTDom0gbeG7nyDEkeG6p3UgY+G7p2EgY2jGsMahbmcgMi4NCi0gQ2jGsMahbmcgbsOgeSB0aGnhur90IGzhuq1wICoqbmfDtG4gbmfhu68sIGvDvSBoaeG7h3UgdsOgIGdp4bqjIMSR4buLbmggY8ahIGLhuqNuKiogY2hvIHThuqV0IGPhuqMgbmfGsOG7nWkgxJHhu41jIHRyxrDhu5tjIGtoaSBjaHV54buDbiBzYW5nIG3DtCBow6xuaCB04buVbmcgcXXDoXQgaMahbiDigJMgKipnZW5lcmFsaXplZCBsaW5lYXIgbW9kZWxzIChHTE1zKSoqLg0KLSAqKkxpbmVhciByZWdyZXNzaW9uIG1vZGVscyoqIMSRxrDhu6NjIHhlbSBuaMawIG3hu5l0IHRyxrDhu51uZyBo4bujcCDEkeG6t2MgYmnhu4d0IGPhu6dhIEdMTXMuDQoNCiMjIyMgKipD4bqldSB0csO6YyBu4buZaSBkdW5nIGNoxrDGoW5nIDIqKg0KDQoxLiDEkOG7i25oIG5naMSpYSBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdsOgIGPDoWMgZ2nhuqMgxJHhu4tuaCBsacOqbiBxdWFuDQoyLiDGr+G7m2MgbMaw4bujbmcgYsOsbmggcGjGsMahbmcgdOG7kWkgdGhp4buDdSAobGVhc3Qgc3F1YXJlcykgY2hvOg0KICAgLSBI4buTaSBxdXkgdHV54bq/biB0w61uaCDEkcahbg0KICAgLSBI4buTaSBxdXkgdHV54bq/biB0w61uaCDEkWEgYmnhur9uDQozLiBDw6FjaCBz4butIGThu6VuZyBSIMSR4buDIGto4bubcCBtw7QgaMOsbmgNCjQuIEdp4bqjaSB0aMOtY2ggaOG7hyBz4buRIGjhu5NpIHF1eQ0KNS4gU3V5IGx14bqtbiB0aOG7kW5nIGvDqiBjaG8gY8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5DQo2LiBQaMOibiB0w61jaCBwaMawxqFuZyBzYWkNCjcuIFNvIHPDoW5oIG3DtCBow6xuaCBs4buTbmcgbmhhdSAobmVzdGVkKQ0KOC4gU28gc8OhbmggbcO0IGjDrG5oIGtow7RuZyBs4buTbmcgbmhhdSAobm9uLW5lc3RlZCkgduG7m2kgdGnDqnUgY2jDrSBBSUMgdsOgIEJJQw0KOS4gQ8OhYyBjw7RuZyBj4bulIGjhu5cgdHLhu6MgbOG7sWEgY2jhu41uIG3DtCBow6xuaA0KDQojIyMjICoqw50gbmdoxKlhKioNCg0KLSBWaeG7h2MgYuG6r3QgxJHhuqd1IHThu6sgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggZ2nDunAgbmfGsOG7nWkgaOG7jWMgaGnhu4N1IHLDtSBu4buBbiB04bqjbmcgxJHhu4MgdGnhur9wIGPhuq1uIGPDoWMgbcO0IGjDrG5oIHThu5VuZyBxdcOhdCBoxqFuIG5oxrAgR0xNcy4NCi0gxJDDonkgbMOgIGLGsOG7m2MgcXVhbiB0cuG7jW5nIG5o4bqxbSB0aGnhur90IGzhuq1wICoqY8ahIHPhu58gdG/DoW4gaOG7jWMgdsOgIHN1eSBsdeG6rW4gdGjhu5FuZyBrw6oqKiB0cm9uZyBjw6FjIG5naGnDqm4gY+G7qXUgdGjhu7FjIG5naGnhu4dtLg0KDQoqKkdoaSBuaOG7mzoqKiBMaW5lYXIgcmVncmVzc2lvbiBraMO0bmcgY2jhu4kgbMOgIG3DtCBow6xuaCDEkeG6p3UgdGnDqm4gbcOgIGPDsm4gbMOgIGPhu61hIG5nw7UgxJHhu4Mga2jDoW0gcGjDoSBjw6FjIG3DtCBow6xuaCB0aOG7kW5nIGvDqiBwaOG7qWMgdOG6oXAgaMahbi4NCg0KDQoNCiMjIyAqKjIuMiBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbHMgRGVmaW5lZCoqDQoNCiMjIyMgKipD4bqldSB0csO6YyBjxqEgYuG6o24gY+G7p2EgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oKioNCg0KTGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgZ+G7k20gMiB0aMOgbmggcGjhuqduIGNow61uaDoNCg0KLSAqKlRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAocmFuZG9tIGNvbXBvbmVudCkqKjoNCiAgLSBHaeG6oyDEkeG7i25oIHBoxrDGoW5nIHNhaSBj4bunYSBwaOG6o24gaOG7k2kgXCggeV9pIFwpIGzDoCBraMO0bmcgxJHhu5VpOiAgDQogICAgXFsNCiAgICBcdGV4dHt2YXJ9W3lfaV0gPSBcc2lnbWFeMiAvIHdfaQ0KICAgIFxdDQogIC0gXCggd19pIFwpIGzDoCAqKnRy4buNbmcgc+G7kSDGsHUgdGnDqm4qKiDEkcOjIGJp4bq/dCAocHJpb3Igd2VpZ2h0cykuIE7hur91IFwoIHdfaSA9IDEgXCkgduG7m2kgbeG7jWkgXCggaSBcKSwgbcO0IGjDrG5oIMSRxrDhu6NjIGfhu41pIGzDoCAqKmjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHRoxrDhu51uZyAob3JkaW5hcnkgbGluZWFyIHJlZ3Jlc3Npb24pKiouDQoNCi0gKipUaMOgbmggcGjhuqduIGjhu4cgdGjhu5FuZyAoc3lzdGVtYXRpYyBjb21wb25lbnQpKio6DQogIC0gS+G7syB24buNbmcgY+G7p2EgXCggeV9pIFwpIGzDoCBr4bq/dCBo4bujcCB0dXnhur9uIHTDrW5oIGPhu6dhIGPDoWMgYmnhur9uIGdp4bqjaSB0aMOtY2g6DQogICAgXFsNCiAgICBcbXVfaSA9IEVbeV9pXSA9IFxiZXRhXzAgKyBcc3VtX3tqPTF9XntwfSBcYmV0YV9qIHhfe2ppfQ0KICAgIFxdDQoNCiMjIyMgKipQaMOibiBsb+G6oWkgbcO0IGjDrG5oKioNCg0KLSAqKlNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbioqOiBraGkgY2jhu4kgY8OzIDEgYmnhur9uIGdp4bqjaSB0aMOtY2ggXCggKHAgPSAxKSBcKS4NCi0gKipNdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbioqOiBraGkgY8OzIG5oaeG7gXUgaMahbiAxIGJp4bq/biBnaeG6o2kgdGjDrWNoIFwoIChwID4gMSkgXCkuDQotICoqV2VpZ2h0ZWQgbGluZWFyIHJlZ3Jlc3Npb24qKjoga2hpIGPDoWMgdHLhu41uZyBz4buRIFwoIHdfaSBcKSBraMOhYyBuaGF1Lg0KLSAqKk9yZGluYXJ5IGxpbmVhciByZWdyZXNzaW9uKio6IGtoaSBt4buNaSB0cuG7jW5nIHPhu5EgXCggd19pID0gMSBcKS4NCg0KIyMjIyAqKkPDoWMgZ2nhuqMgxJHhu4tuaCBjaMOtbmgqKg0KDQotICoqUGjDuSBo4bujcCAoU3VpdGFiaWxpdHkpKio6IEPDuW5nIG3hu5l0IG3DtCBow6xuaCDDoXAgZOG7pW5nIGNobyBt4buNaSBxdWFuIHPDoXQuDQotICoqVHV54bq/biB0w61uaCAoTGluZWFyaXR5KSoqOiBRdWFuIGjhu4cgZ2nhu69hIGvhu7MgduG7jW5nIFwoIFxtdSBcKSB2w6AgYmnhur9uIGdp4bqjaSB0aMOtY2ggbMOgIHR1eeG6v24gdMOtbmguDQotICoqUGjGsMahbmcgc2FpIGtow7RuZyDEkeG7lWkgKENvbnN0YW50IHZhcmlhbmNlKSoqOiBQaMawxqFuZyBzYWkgXCggXHNpZ21hXjIgXCkgbMOgIGtow7RuZyDEkeG7lWkgKGhv4bq3YyB04bu3IGzhu4cgduG7m2kgXCggMS93X2kgXCkpLg0KLSAqKsSQ4buZYyBs4bqtcCAoSW5kZXBlbmRlbmNlKSoqOiBDw6FjIHBo4bqjbiBo4buTaSBcKCB5X2kgXCkgbMOgIMSR4buZYyBs4bqtcCB24bubaSBuaGF1Lg0KDQojIyMjICoqVsOtIGThu6UgbWluaCBo4buNYSoqDQoNCi0gROG7ryBsaeG7h3UgY8OibiBu4bq3bmcgc8ahIHNpbmggdGhlbyB0deG6p24gdHXhu5VpIHRoYWkga+G7syB04burIGLhu4duaCB2aeG7h24gU3QgR2Vvcmdl4oCZcyAoTG9uZG9uKSDEkcaw4bujYyBkw7luZyDEkeG7gyBtaW5oIGjhu41hIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCBnaeG7r2EgY8OibiBu4bq3bmcgdsOgIHR14bqnbiB0deG7lWkuDQoNCiMjIyAqKjIuMyBTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24qKg0KDQojIyMjICoqMi4zLjEgTGVhc3QtU3F1YXJlcyBFc3RpbWF0aW9uKioNCg0KLSBNw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHGoW4gY8OzIGThuqFuZzoNCg0KJCQNClxtdV9pID0gRVt5X2ldID0gXGJldGFfMCArIFxiZXRhXzEgeF9pLFxxdWFkIFx0ZXh0e1Zhcn1beV9pXSA9IFxzaWdtYV4yIC8gd19pDQokJA0KDQotIFThu5VuZyBzYWkgc+G7kSBiw6xuaCBwaMawxqFuZyBjw7MgdHLhu41uZyBz4buRIGPhuqduIHThu5FpIHRoaeG7g3UgaMOzYToNCg0KJCQNClMoXGJldGFfMCwgXGJldGFfMSkgPSBcc3VtX3tpPTF9Xm4gd19pICh5X2kgLSBcYmV0YV8wIC0gXGJldGFfMSB4X2kpXjINCiQkDQoNCiMjIyMgKioyLjMuMiBDb2VmZmljaWVudCBFc3RpbWF0ZXMqKg0KDQotIFRydW5nIGLDrG5oIGPDsyB0cuG7jW5nIHPhu5E6DQoNCiQkDQpcYmFye3h9X3cgPSBcZnJhY3tcc3VtX3tpPTF9XntufSB3X2kgeF9pfXtcc3VtX3tpPTF9XntufSB3X2l9LFxxdWFkDQpcYmFye3l9X3cgPSBcZnJhY3tcc3VtX3tpPTF9XntufSB3X2kgeV9pfXtcc3VtX3tpPTF9XntufSB3X2l9DQokJA0KDQotIMav4bubYyBsxrDhu6NuZyBo4buHIHPhu5E6DQoNCiQkDQpcaGF0e1xiZXRhfV8xID0gXGZyYWN7XHN1bV97aT0xfV5uIHdfaSAoeF9pIC0gXGJhcnt4fV93KSh5X2kpfXtcc3VtX3tpPTF9Xm4gd19pICh4X2kgLSBcYmFye3h9X3cpXjJ9DQokJA0KDQokJA0KXGhhdHtcYmV0YX1fMCA9IFxiYXJ7eX1fdyAtIFxoYXR7XGJldGF9XzEgXGJhcnt4fV93DQokJA0KDQojIyMjICoqMi4zLjMgRXN0aW1hdGluZyB0aGUgVmFyaWFuY2UgXCggXHNpZ21hXjIgXCkqKg0KDQotIFBo4bqnbiBkxrA6DQoNCiQkDQplX2kgPSB5X2kgLSBcaGF0e1xtdX1faSA9IHlfaSAtIFxoYXR7XGJldGF9XzAgLSBcaGF0e1xiZXRhfV8xIHhfaQ0KJCQNCg0KLSBU4buVbmcgYsOsbmggcGjGsMahbmcgcGjhuqduIGTGsCAoUlNTKToNCg0KJCQNClx0ZXh0e1JTU30gPSBcc3VtX3tpPTF9Xm4gd19pIGVfaV4yDQokJA0KDQotIMav4bubYyBsxrDhu6NuZyBraMO0bmcgY2jhu4djaCBj4bunYSBwaMawxqFuZyBzYWk6DQoNCiQkDQpzXjIgPSBcZnJhY3tcdGV4dHtSU1N9fXtuIC0gMn0NCiQkDQoNCiMjIyMgKioyLjMuNCBTdGFuZGFyZCBFcnJvcnMgb2YgQ29lZmZpY2llbnRzKioNCg0KLSBQaMawxqFuZyBzYWkgdsOgIHNhaSBz4buRIGNodeG6qW4gY+G7p2EgXCggXGhhdHtcYmV0YX1fMSBcKToNCg0KJCQNClx0ZXh0e1Zhcn1bXGhhdHtcYmV0YX1fMV0gPSBcZnJhY3tcc2lnbWFeMn17XHN1bV97aT0xfV5uIHdfaSAoeF9pIC0gXGJhcnt4fV93KV4yfQ0KJCQNCg0KJCQNClx0ZXh0e1NFfVtcaGF0e1xiZXRhfV8xXSA9IFxzcXJ0eyBcZnJhY3tzXjJ9e1xzdW1fe2k9MX1ebiB3X2kgKHhfaSAtIFxiYXJ7eH1fdyleMn0gfQ0KJCQNCg0KLSBTYWkgc+G7kSBjaHXhuqluIGPhu6dhIFwoIFxoYXR7XGJldGF9XzAgXCk6DQoNCiQkDQpcdGV4dHtTRX1bXGhhdHtcYmV0YX1fMF0gPSBcc3FydHsgc14yIFxsZWZ0KCBcZnJhY3sxfXtcc3VtIHdfaX0gKyBcZnJhY3tcYmFye3h9X3deMn17XHN1bSB3X2kgKHhfaSAtIFxiYXJ7eH1fdyleMn0gXHJpZ2h0KSB9DQokJA0KDQojIyMjICoqMi4zLjUgU3RhbmRhcmQgRXJyb3JzIG9mIEZpdHRlZCBWYWx1ZXMqKg0KDQotIFNhaSBz4buRIGNodeG6qW4gY+G7p2EgZ2nDoSB0cuG7iyBk4buxIMSRb8OhbjoNCg0KJCQNClxoYXR7XG11fV9pID0gXGhhdHtcYmV0YX1fMCArIFxoYXR7XGJldGF9XzEgeF9pDQokJA0KDQokJA0KXHRleHR7U0V9W1xoYXR7XG11fV9pXSA9IHMgXGNkb3QgXHNxcnR7IFxmcmFjezF9e1xzdW0gd19pfSArIFxmcmFjeyh4X2kgLSBcYmFye3h9X3cpXjJ9e1xzdW0gd19pICh4X2kgLSBcYmFye3h9X3cpXjJ9IH0NCiQkDQoNCg0KIyMjIyAqKlThu5VuZyBr4bq/dCoqDQoNCi0gSOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHGoW4gbMOgIGLGsOG7m2MgxJHhuqd1IGPGoSBi4bqjbiB0cm9uZyBwaMOibiB0w61jaCBo4buTaSBxdXkuIFZp4buHYyDGsOG7m2MgbMaw4bujbmcgaOG7hyBz4buRLCBwaMawxqFuZyBzYWkgdsOgIHNhaSBz4buRIGNodeG6qW4gY2hvIHBow6lwIMSRw6FuaCBnacOhIG3hu6ljIMSR4buZIHRpbiBj4bqteSBj4bunYSBtw7QgaMOsbmguIEPDoWMgY8O0bmcgdGjhu6ljIHRyw6puIGzDoCBu4buBbiB04bqjbmcgxJHhu4MgbeG7nyBy4buZbmcgc2FuZyBo4buTaSBxdXkgdHV54bq/biB0w61uaCBi4buZaSB2w6AgZ2VuZXJhbGl6ZWQgbGluZWFyIG1vZGVscy4NCg0KKipHaGkgbmjhu5sqKjogS2nhu4NtIHRyYSBjw6FjIGdp4bqjIMSR4buLbmggY+G7p2EgbcO0IGjDrG5oIGzDoCBy4bqldCBxdWFuIHRy4buNbmc6IHR1eeG6v24gdMOtbmgsIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHhu5VpLCDEkeG7mWMgbOG6rXAgdsOgIG3DtCBow6xuaCDDoXAgZOG7pW5nIHBow7kgaOG7o3AgY2hvIHRvw6BuIGLhu5kgbeG6q3UuDQoNCiMjIyAqKjIuNCDGr+G7m2MgbMaw4bujbmcgdHJvbmcgaOG7k2kgcXV5IGLhu5lpIChuaGnhu4F1IGJp4bq/bikqKg0KDQoqKkThuqFuZyBtYSB0cuG6rW4gY+G7p2EgbcO0IGjDrG5oOioqDQoNCk3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCBjw7MgdGjhu4MgxJHGsOG7o2Mgdmnhur90IGTGsOG7m2kgZOG6oW5nIG1hIHRy4bqtbjoNCg0KJCQNCnkgPSBYXGJldGEgKyBcdmFyZXBzaWxvbg0KJCQNCiAgVHJvbmcgxJHDszoNCg0KLSBcKHlcKTogdmVjdG9yIHBo4bqjbiBo4buTaSAoY+G7oSBcKG4gXHRpbWVzIDFcKSkNCi0gXChYXCk6IG1hIHRy4bqtbiB0aGnhur90IGvhur8gKGRlc2lnbiBtYXRyaXgpIGvDrWNoIHRoxrDhu5tjIFwobiBcdGltZXMgKHArMSlcKSwgduG7m2kgY+G7mXQgxJHhuqd1IHRpw6puIHRvw6BuIHPhu5EgMSAo4bupbmcgduG7m2kgaOG7hyBz4buRIGNo4bq3biBcKFxiZXRhXzBcKSksIGPDoWMgY+G7mXQgY8OybiBs4bqhaSBsw6AgZ2nDoSB0cuG7iyBj4bunYSBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoIFwoeF9qXCkNCi0gXChcYmV0YVwpOiB2ZWN0b3IgaOG7hyBz4buRIGjhu5NpIHF1eSAoY+G7oSBcKChwKzEpIFx0aW1lcyAxXCkpDQotIFwoXHZhcmVwc2lsb24gXHNpbSBcbWF0aGNhbHtOfSgwLCBcc2lnbWFeMiBJKVwpOiB2ZWN0b3Igbmhp4buFdSBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4gxJFhIGJp4bq/biB24bubaSB0cnVuZyBiw6xuaCAwIHbDoCBwaMawxqFuZyBzYWkgXChcc2lnbWFeMiBJXCkNCg0KICANCioqxq/hu5tjIGzGsOG7o25nIE9MUzoqKg0KDQokJA0KXGhhdHtcYmV0YX0gPSAoWF5UIFcgWCleey0xfSBYXlQgVyB5DQokJA0KDQoqKlBo4bqnbiBkxrAgdsOgIHBoxrDGoW5nIHNhaSDGsOG7m2MgbMaw4bujbmc6KioNCg0KLSBHacOhIHRy4buLIGThu7EgxJFvw6FuIChmaXR0ZWQgdmFsdWVzKToNCg0KJCQNClxoYXR7XG11fV9pID0gXGhhdHt5fV9pID0gXGhhdHtcYmV0YX1fMCArIFxzdW1fe2o9MX1ee3B9IFxoYXR7XGJldGF9X2ogeF97aml9DQokJA0KDQoNCi0gxq/hu5tjIGzGsOG7o25nIHBoxrDGoW5nIHNhaSBwaOG6p24gZMawOg0KDQokJA0Kc14yID0gXGZyYWN7UlNTfXtuIC0gcCd9DQokJA0KDQojIyMgKioyLjUgU2FpIHPhu5EgY2h14bqpbiB2w6Aga2hv4bqjbmcgdGluIGPhuq15KioNCg0KLSAqKlNhaSBz4buRIGNodeG6qW4gY+G7p2EgXChcaGF0e1xiZXRhfV9qXCk6KioNCg0KJCQNClNFKFxoYXR7XGJldGF9X2opID0gXHNxcnR7c157Mn0gXGNkb3QgXGJpZ2woIFhee1R9IFggXGJpZ3IpXnstMX1fe2pqfX0NCiQkDQoNCi0gKipLaG/huqNuZyB0aW4gY+G6rXkgY2hvIFwoXGhhdHtcYmV0YX1falwpOioqDQoNCiQkDQpcaGF0e1xiZXRhfV9qIFxwbSB0X3tcYWxwaGEvMiwgXCwgbiAtIHB9IFx0aW1lcyBTRShcaGF0e1xiZXRhfV9qKQ0KJCQNCg0KIyMjICoqMi42IFPhu60gZOG7pW5nIFIgxJHhu4MgaOG7k2kgcXV5KioNCg0KKipNw7QgaMOsbmggaMOzYToqKiAgbW9kZWwgPC0gbG0oeSB+IHgxICsgeDIsIGRhdGEgPSBkYXRhc2V0KQ0KDQoqKkvhur90IHF14bqjIG3DtCBow6xuaDoqKg0KDQotIHN1bW1hcnkobW9kZWwpDQoNCi0gY29uZmludChtb2RlbCkNCg0KLSBhbm92YShtb2RlbCkNCg0KIyMjICoqMi43IERp4buFbiBnaeG6o2kgaOG7hyBz4buRIGjhu5NpIHF1eSoqDQoNCi0gXChcYmV0YV8wXCk6IGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgXCh5XCkga2hpIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gXCh4X2ogPSAwXCkuDQoNCi0gXChcYmV0YV9qXCk6IG3hu6ljIHRoYXkgxJHhu5VpIGvhu7MgduG7jW5nIGPhu6dhIFwoeVwpIGtoaSBcKHhfalwpIHTEg25nIDEgxJHGoW4gduG7iywgZ2nhu68gY8OhYyBiaeG6v24ga2jDoWMga2jDtG5nIMSR4buVaS4NCg0KIyMjICoqMi44IFN1eSBsdeG6rW4gdGjhu5FuZyBrw6oqKg0KDQotICoqR2nhuqMgc+G7rSBraeG7g20gxJHhu4tuaCB24bubaSoqDQoNCiQkDQpIXzA6IFxiZXRhX2ogPSAwDQokJA0KDQotICoqVGjhu5FuZyBrw6oga2nhu4NtIMSR4buLbmgqKg0KDQokJA0KdCA9IFxmcmFje1xoYXR7XGJldGF9X2p9e1NFKFxoYXR7XGJldGF9X2opfSBcc2ltIHRfe24tcH0NCiQkDQoNCi0gVHJvbmcgxJHDszoNCg0KICAtIFwoXGhhdHtcYmV0YX1falwpIGzDoCBo4buHIHPhu5EgxrDhu5tjIGzGsOG7o25nIGPhu6dhIGJp4bq/biBcKGpcKSwNCg0KICAtIFwoU0UoXGhhdHtcYmV0YX1failcKSBsw6Agc2FpIHPhu5EgY2h14bqpbiBj4bunYSBcKFxoYXR7XGJldGF9X2pcKSwNCg0KICAtIFwodF97bi1wfVwpIGzDoCBwaMOibiBwaOG7kWkgdCB24bubaSBcKG4tcFwpIGLhuq1jIHThu7EgZG8uDQoNCiMjIyAqKjIuOSBQaMOibiB0w61jaCBwaMawxqFuZyBzYWkgKEFOT1ZBKSoqDQoNCi0gKipHacOhIHRy4buLIHThu5VuZyBwaMawxqFuZyBzYWkgXChUU1NcKSDEkcaw4bujYyB0w61uaCB0aGVvIGPDtG5nIHRo4bupYzoqKg0KDQokJA0KVFNTID0gXHN1bV97aT0xfV57bn0gKHlfaSAtIFxiYXJ7eX0pXjINCiQkDQoNCi0gKipU4buVbmcgcGjGsMahbmcgc2FpIMSRxrDhu6NjIHBow6JuIHTDrWNoIHRow6BuaCBoYWkgcGjhuqduOioqDQoNCiQkDQpUU1MgPSBTU1IgKyBSU1MNCiQkDQoNCi0gKipUcm9uZyDEkcOzOioqDQoNCiAgLSBcKFNTUlwpIGzDoCB04buVbmcgYsOsbmggcGjGsMahbmcgcGjhuqduIGdp4bqjaSB0aMOtY2ggKEV4cGxhaW5lZCBTdW0gb2YgU3F1YXJlcyksIMSRxrDhu6NjIHTDrW5oIGLhurFuZzoNCg0KJCQNClNTUiA9IFxzdW1fe2k9MX1ee259IChcaGF0e3l9X2kgLSBcYmFye3l9KV4yDQokJA0KDQogIC0gXChSU1NcKSBsw6AgdOG7lW5nIGLDrG5oIHBoxrDGoW5nIHBo4bqnbiBkxrAgKFJlc2lkdWFsIFN1bSBvZiBTcXVhcmVzKSwgxJHGsOG7o2MgdMOtbmggYuG6sW5nOg0KDQokJA0KUlNTID0gXHN1bV97aT0xfV57bn0gKHlfaSAtIFxoYXR7eX1faSleMg0KJCQNCg0KLSAqKkjhu4cgc+G7kSB4w6FjIMSR4buLbmggXChSXjJcKSDEkcaw4bujYyDEkeG7i25oIG5naMSpYSBsw6A6KioNCg0KJCQNClJeMiA9IFxmcmFje1NTUn17VFNTfSA9IDEgLSBcZnJhY3tSU1N9e1RTU30NCiQkDQoNCiMjIyAqKjIuMTAgU28gc8OhbmggbcO0IGjDrG5oIGzhu5NuZyAoTmVzdGVkIE1vZGVscykqKg0KDQoqKirEkOG7i25oIG5naMSpYToqKiogSGFpIG3DtCBow6xuaCDEkcaw4bujYyBn4buNaSBsw6AgbOG7k25nIG5oYXUgKG5lc3RlZCBtb2RlbHMpIGtoaSBtw7QgaMOsbmggxJHGoW4gZ2nhuqNuIGjGoW4gKHJlZHVjZWQgbW9kZWwpIGzDoCBt4buZdCB0csaw4budbmcgaOG7o3AgxJHhurdjIGJp4buHdCBj4bunYSBtw7QgaMOsbmggcGjhu6ljIHThuqFwIGjGoW4gKGZ1bGwgbW9kZWwpLCB04bupYyBsw6AgbsOzIMSRxrDhu6NjIHThuqFvIHJhIGLhurFuZyBjw6FjaCBsb+G6oWkgYuG7jyBt4buZdCBoYXkgbmhp4buBdSBiaeG6v24ga2jhu49pIG3DtCBow6xuaCDEkeG6p3kgxJHhu6cuDQoNCi0gKipLaeG7g20gxJHhu4tuaCBGOioqDQoNCiQkDQpGID0gXGZyYWN7KFJTU197XHRleHR7cmVkdWNlZH19IC0gUlNTX3tcdGV4dHtmdWxsfX0pIC8gKHBfe1x0ZXh0e2Z1bGx9fSAtIHBfe1x0ZXh0e3JlZHVjZWR9fSl9e3NeMl97XHRleHR7ZnVsbH19fQ0KJCQNCg0KKipUcm9uZyDEkcOzOioqDQoNCiAgLSBcKFJTU197XHRleHR7cmVkdWNlZH19XCkgbMOgIHThu5VuZyBiw6xuaCBwaMawxqFuZyBwaOG6p24gZMawIGPhu6dhIG3DtCBow6xuaCByw7p0IGfhu41uLA0KDQogIC0gXChSU1Nfe1x0ZXh0e2Z1bGx9fVwpIGzDoCB04buVbmcgYsOsbmggcGjGsMahbmcgcGjhuqduIGTGsCBj4bunYSBtw7QgaMOsbmggxJHhuqd5IMSR4bunLA0KDQogIC0gXChwX3tcdGV4dHtmdWxsfX1cKSB2w6AgXChwX3tcdGV4dHtyZWR1Y2VkfX1cKSBs4bqnbiBsxrDhu6N0IGzDoCBz4buRIHRoYW0gc+G7kSBj4bunYSBtw7QgaMOsbmggxJHhuqd5IMSR4bunIHbDoCBtw7QgaMOsbmggcsO6dCBn4buNbiwNCg0KICAtIFwoc14yX3tcdGV4dHtmdWxsfX1cKSBsw6AgxrDhu5tjIGzGsOG7o25nIHBoxrDGoW5nIHNhaSBwaOG6p24gZMawIGPhu6dhIG3DtCBow6xuaCDEkeG6p3kgxJHhu6csIMSRxrDhu6NjIHTDrW5oIGLhurFuZzoNCg0KJCQNCnNeMl97XHRleHR7ZnVsbH19ID0gXGZyYWN7UlNTX3tcdGV4dHtmdWxsfX19e24gLSBwX3tcdGV4dHtmdWxsfX19DQokJA0KDQp24bubaSBcKG5cKSBsw6Agc+G7kSBxdWFuIHPDoXQuDQoNCiMjIyAqKjIuMTEgU28gc8OhbmggbcO0IGjDrG5oIGtow7RuZyBs4buTbmcgKE5vbi1OZXN0ZWQgTW9kZWxzKSoqDQoNCioqKsSQ4buLbmggbmdoxKlhOioqKiBIYWkgbcO0IGjDrG5oIMSRxrDhu6NjIGfhu41pIGzDoCBraMO0bmcgbOG7k25nIChub24tbmVzdGVkKSBu4bq/dSBraMO0bmcgY8OzIG3DtCBow6xuaCBuw6BvIGzDoCBt4buZdCB0csaw4budbmcgaOG7o3AgxJHhurdjIGJp4buHdCAoc3VibW9kZWwpIGPhu6dhIG3DtCBow6xuaCBjw7JuIGzhuqFpLg0KDQotICoqQUlDKiogKEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24pIGzDoCBjaOG7iSBz4buRIGTDuW5nIMSR4buDIMSRw6FuaCBnacOhIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oLCDEkeG7k25nIHRo4budaSBwaOG6oXQgbeG7qWMgxJHhu5kgcGjhu6ljIHThuqFwIGPhu6dhIG3DtCBow6xuaDoNCg0KJCQNCkFJQyA9IC0yIFxjZG90IFxlbGwoXGhhdHtcdGhldGF9KSArIDJrDQokJA0KDQotICoqVHJvbmcgxJHDszoqKg0KDQogLSBcKFxlbGwoXGhhdHtcdGhldGF9KVwpIGzDoCBsb2ctbGlrZWxpaG9vZCB04bqhaSDGsOG7m2MgbMaw4bujbmcgTUxFIFwoXGhhdHtcdGhldGF9XCksDQoNCiAtIFwoa1wpIGzDoCBz4buRIHRoYW0gc+G7kSB0cm9uZyBtw7QgaMOsbmggKGJhbyBn4buTbSBj4bqjIGjhu4cgc+G7kSBo4bqxbmcgc+G7kSBcKFxiZXRhXzBcKSkuDQoNCg0KLSAqKkJJQyoqIChCYXllc2lhbiBJbmZvcm1hdGlvbiBDcml0ZXJpb24pIHTGsMahbmcgdOG7sSBBSUMgbmjGsG5nIG3hu6ljIHBo4bqhdCDEkeG7mSBwaOG7qWMgdOG6oXAgbeG6oW5oIGjGoW4sIMSRxrDhu6NjIHTDrW5oIGLhurFuZzoNCg0KJCQNCkJJQyA9IC0yIFxjZG90IFxlbGwoXGhhdHtcdGhldGF9KSArIFxsb2cobikgXGNkb3Qgaw0KJCQNCg0KLSAqKlRyb25nIMSRw7M6KioNCg0KICAtIFwoblwpIGzDoCBrw61jaCB0aMaw4bubYyBt4bqrdSwNCg0KICAtIFwoa1wpIHbDoCBcKFxlbGwoXGhhdHtcdGhldGF9KVwpIG5oxrAgdHLDqm4uDQoNCi0gKioqTmd1ecOqbiB04bqvYyBjaOG7jW4gbcO0IGjDrG5oOioqKg0KDQogIC0gQUlDL0JJQyBjw6BuZyBuaOG7jyBjw6BuZyB04buRdC4NCg0KICAtIE7hur91IEFJQyBj4bunYSBtw7QgaMOsbmggQSA8IG3DtCBow6xuaCBCIGtob+G6o25nIDIgxJFp4buDbSB0cuG7nyBsw6puLCBtw7QgaMOsbmggQSDEkcaw4bujYyDGsHUgdGnDqm4gaMahbiDEkcOhbmcga+G7gy4NCg0KIyMjICoqMi4xMiBM4buxYSBjaOG7jW4gbcO0IGjDrG5oIHThu7EgxJHhu5luZyAoQXV0b21hdGVkIE1vZGVsIFNlbGVjdGlvbikqKg0KDQoqKirEkOG7i25oIG5naMSpYToqKipM4buxYSBjaOG7jW4gbcO0IGjDrG5oIGzDoCBxdcOhIHRyw6xuaCB0w6xtIHJhIHThuq1wIGjhu6NwIGJp4bq/biBnaeG6o2kgdGjDrWNoIHThu5F0IG5o4bqldCAocGjDuSBo4bujcCwgxJHGoW4gZ2nhuqNuKSDEkeG7gyBtw7QgaMOsbmggaMOzYSBiaeG6v24gcGjhuqNuIGjhu5NpLg0KDQotICoqQ8OzIG5oaeG7gXUgY2hp4bq/biBsxrDhu6NjIGzhu7FhIGNo4buNbiBtw7QgaMOsbmg6KioNCg0KICAtICoqRm9yd2FyZCBzZWxlY3Rpb246KiogYuG6r3QgxJHhuqd1IHThu6sgbcO0IGjDrG5oIHLhu5duZywgdGjDqm0gYmnhur9uIHThu6tuZyBixrDhu5tjLg0KDQogIC0gKipCYWNrd2FyZCBlbGltaW5hdGlvbjoqKiBi4bqvdCDEkeG6p3UgdOG7qyBtw7QgaMOsbmggxJHhuqd5IMSR4bunLCBsb+G6oWkgYuG7jyB04burbmcgYmnhur9uLg0KDQogIC0gKipTdGVwd2lzZSBzZWxlY3Rpb246Kioga+G6v3QgaOG7o3AgY+G6oyB0aMOqbSB2w6AgYuG7m3QgYmnhur9uIOG7nyBt4buXaSBixrDhu5tjLg0KDQotICoqTeG7mXQgc+G7kSBow6BtIHPhu60gZOG7pW5nOioqDQoNCiAgLSBzdGVwKCk6IGNo4buNbiBtw7QgaMOsbmggdGhlbyBoxrDhu5tuZyBmb3J3YXJkL2JhY2t3YXJkL3N0ZXB3aXNlLg0KDQogIC0gZHJvcDEoKSwgYWRkMSgpOiB0aMOqbSBob+G6t2MgYuG7m3QgYmnhur9uIHbhu5tpIGtp4buDbSDEkeG7i25oIEYuDQoNCiAgLSBleHRyYWN0QUlDKCk6IHRy4bqjIHbhu4EgQUlDIHbDoCBz4buRIHRoYW0gc+G7kS4NCg0KLS0tDQoNCiMjICoqQ0jGr8agTkcgMzogQ0jhuqhOIMSQT8OBTiBNw5QgSMOMTkggSOG7kkkgUVVZIFRVWeG6vk4gVMONTkggKioNCg0KTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWxzOiBEaWFnbm9zdGljcyBhbmQgTW9kZWwtQnVpbGRpbmcgKENo4bqpbiDEkW/DoW4gbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oKSANCg0KIyMjICoqMy4xLiBHaeG7m2kgdGhp4buHdSB2w6AgdOG7lW5nIHF1YW4qKg0KDQpTYXUga2hpIHjDonkgZOG7sW5nIG3hu5l0IG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCwgY8O0bmcgdmnhu4djIGtow7RuZyBr4bq/dCB0aMO6YyDhu58gdmnhu4djIMaw4bubYyBsxrDhu6NuZyBjw6FjIGjhu4cgc+G7kSBo4buTaSBxdXkgdsOgIGtp4buDbSDEkeG7i25oIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gTeG7mXQgYsaw4bubYyBxdWFuIHRy4buNbmcga2jDtG5nIHRo4buDIHRoaeG6v3UgbMOgIGNo4bqpbiDEkW/DoW4gbcO0IGjDrG5oIOKAkyB04bupYyBsw6AgxJHDoW5oIGdpw6EgeGVtIG3DtCBow6xuaCDEkcOjIMSRxrDhu6NjIHjDonkgZOG7sW5nIGPDsyB0aOG7sWMgc+G7sSBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1IGhheSBraMO0bmcuDQoNCkNo4bqpbiDEkW/DoW4gbcO0IGjDrG5oIGjhu5NpIHF1eSBsw6AgbeG7mXQgcGjhuqduIHRoaeG6v3QgeeG6v3UgdHJvbmcgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdsOsIG7DsyBnacO6cCB0YToNCg0KLSAgIFjDoWMgbWluaCBjw6FjIGdp4bqjIMSR4buLbmggY8ahIGLhuqNuIGPhu6dhIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCBjw7MgxJHGsOG7o2MgdGjhu49hIG3Do24gaGF5IGtow7RuZyAodsOtIGThu6UgbmjGsCBxdWFuIGjhu4cgdHV54bq/biB0w61uaCwgcGjGsMahbmcgc2FpIGtow7RuZyDEkeG7lWksIHBow6JuIHBo4buRaSBjaHXhuqlu4oCmKS4NCg0KLSAgIFBow6F0IGhp4buHbiBuaOG7r25nIHF1YW4gc8OhdCBi4bqldCB0aMaw4budbmcgbmjGsCDEkWnhu4NtIG5nb+G6oWkgbGFpIChvdXRsaWVycykgaG/hurdjIMSRaeG7g20gY8OzIOG6o25oIGjGsOG7n25nIGzhu5tuIChpbmZsdWVudGlhbCBvYnNlcnZhdGlvbnMpIOKAkyBuaOG7r25nIMSRaeG7g20gY8OzIHRo4buDIGLDs3AgbcOpbyBr4bq/dCBxdeG6oyDGsOG7m2MgbMaw4bujbmcgaG/hurdjIGtp4buDbSDEkeG7i25oLg0KDQotICAgxJDDoW5oIGdpw6EgxJHhu5kgdGluIGPhuq15IGPhu6dhIGPDoWMgaOG7hyBz4buRIMaw4bubYyBsxrDhu6NuZy4NCg0KxJDhu4EgeHXhuqV0IGPDoWNoIGPhuqNpIHRoaeG7h24gbcO0IGjDrG5oLCB2w60gZOG7pTogYmnhur9uIMSR4buVaSBiaeG6v24sIHRow6ptIGhv4bq3YyBi4bubdCBiaeG6v24gZ2nhuqNpIHRow61jaCwgc+G7rSBk4bulbmcgbcO0IGjDrG5oIHBoaSB0dXnhur9uIGhv4bq3YyB04buVbmcgcXXDoXQgKEdMTSkgdGhheSB0aOG6vy4NCg0KTuG6v3UgYuG7jyBxdWEgYsaw4bubYyBuw6B5LCBuZ8aw4budaSBwaMOibiB0w61jaCBk4buFIHLGoWkgdsOgbyBi4bqreSBj4bunYSB2aeG7h2Mg4oCccGjDuSBo4bujcCBxdcOhIG3hu6lj4oCdIChvdmVyZml0dGluZyksIGhp4buDdSBzYWkgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biwgaG/hurdjIGThu7EgxJFvw6FuIHNhaSBs4buHY2ggdHJvbmcgdGjhu7FjIHThur8uIERvIMSRw7MsIGNo4bqpbiDEkW/DoW4gbcO0IGjDrG5oIGtow7RuZyBwaOG6o2kgbMOgIHTDuXkgY2jhu41uIOKAkyBtw6AgbMOgIG3hu5l0IHBo4bqnbiBi4bqvdCBideG7mWMgdHJvbmcgcGjDom4gdMOtY2ggaOG7k2kgcXV5IG5naGnDqm0gdMO6Yy4NCg0KVHJvbmcgY2jGsMahbmcgbsOgeSwgY2jDum5nIHRhIHPhur0gaOG7jWMgY8OhY2g6DQoNCi0gICBLaeG7g20gdHJhIGPDoWMgZ2nhuqMgxJHhu4tuaCBj4bunYSBtw7QgaMOsbmggaOG7k2kgcXV5Lg0KDQotICAgU+G7rSBk4bulbmcgcGjhuqduIGTGsCAocmVzaWR1YWxzKSDEkeG7gyBraeG7g20gdHJhIMSR4buZIHBow7kgaOG7o3AuDQoNCi0gICBQaMOhdCBoaeG7h24gdsOgIHjhu60gbMO9IGPDoWMgxJFp4buDbSDhuqNuaCBoxrDhu59uZyBs4bubbi4NCg0KLSAgIMSQbyBsxrDhu51uZyBoaeG7h24gdMaw4bujbmcgxJFhIGPhu5luZyB0dXnhur9uIHbDoCBjw6FjaCBnaeG6o20gdGhp4buDdS4NCg0KIyMjICoqMy4yIEdp4bqjIMSR4buLbmggdHJvbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oKioNCg0KTeG7mXQgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHRpw6p1IGNodeG6qW4gxJHDsmkgaOG7j2kgcGjhuqNpIHRo4buPYSBtw6NuIDQgZ2nhuqMgxJHhu4tuaCBjxqEgYuG6o246DQoNCioqMS4gR2nhuqMgxJHhu4tuaCAxOiBRdWFuIGjhu4cgdHV54bq/biB0w61uaCoqDQoNCi0gTcO0IGjDrG5oIGdp4bqjIMSR4buLbmggcuG6sW5nIHRydW5nIGLDrG5oIGPhu6dhIGJp4bq/biBwaOG6o24gaOG7k2kgXCh5XCkgbMOgIGjDoG0gdHV54bq/biB0w61uaCBj4bunYSBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoIFwoeF8xLCB4XzIsIFxsZG90cywgeF9wXCkuDQoNCi0gTuG6v3UgcXVhbiBo4buHIHRo4bqtdCBz4buxIGzDoCBwaGkgdHV54bq/biBtw6AgdGEgduG6q24gZMO5bmcgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmgsIGvhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZyBjw7MgdGjhu4MgYuG7iyB0aGnDqm4gbOG7h2NoIHbDoCBk4buxIMSRb8OhbiBzYWkuDQoNClwoXFJpZ2h0YXJyb3dcKSAqKkPDoWNoIGtp4buDbSB0cmE6KiogduG6vSBiaeG7g3UgxJHhu5MgcGjhuqduIGTGsCBzbyB24bubaSBnacOhIHRy4buLIGThu7EgxJFvw6FuLCBu4bq/dSB0aOG6pXkgeHUgaMaw4bubbmcgY29uZyAocGFyYWJvbGEsIFMtc2hhcGXigKYpIHRow6wgY8OzIHRo4buDIGzDoCBtw7QgaMOsbmggc2FpIGThuqFuZy4NCg0KKioyLiBHaeG6oyDEkeG7i25oIDI6ICBQaMawxqFuZyBzYWkga2jDtG5nIMSR4buVaSAoSG9tb3NjZWRhc3RpY2l0eSkqKg0KDQotIFBoxrDGoW5nIHNhaSBj4bunYSBzYWkgc+G7kSBcKFx2YXJlcHNpbG9uX2lcKSBsw6AgbmjGsCBuaGF1IOG7nyBt4buNaSBt4bupYyBnacOhIHRy4buLIGPhu6dhIFwoeFwpOg0KDQokJA0KXHRleHR7VmFyfSh5X2kpID0gXHNpZ21hXjINCiQkDQoNCi0gTuG6v3UgcGjGsMahbmcgc2FpIHRoYXkgxJHhu5VpIHRoZW8gXCh4XCksIHRhIGPDsyBoaeG7h24gdMaw4bujbmcgKipwaMawxqFuZyBzYWkgdGhheSDEkeG7lWkgKGhldGVyb3NjZWRhc3RpY2l0eSkqKiwgZOG6q24gxJHhur9uIMaw4bubYyBsxrDhu6NuZyBraMO0bmcgaGnhu4d1IHF14bqjIHbDoCBzYWkgbOG7h2NoIHRyb25nIGtp4buDbSDEkeG7i25oLg0KDQpcKFxSaWdodGFycm93XCkgKipDw6FjaCBraeG7g20gdHJhOioqIHbhur0gxJHhu5MgdGjhu4sgcGjhuqduIGTGsC4gTuG6v3UgcGjhuqduIGTGsCBjw7MgZOG6oW5nIGjDrG5oIG7Ds24gKHLhu5luZyBk4bqnbiBob+G6t2MgaOG6uXAgbOG6oWkpIHRow6wgY8OzIHRo4buDIGLhu4sgaGV0ZXJvc2NlZGFzdGljaXR5Lg0KDQoqKjMuIEdp4bqjIMSR4buLbmggMzogxJDhu5ljIGzhuq1wKioNCg0KLSBDw6FjIHF1YW4gc8OhdCBcKCh4X2ksIHlfaSlcKSBwaOG6o2kgxJHhu5ljIGzhuq1wIG5oYXUuDQoNCi0gTuG6v3UgZOG7ryBsaeG7h3UgY8OzIHTDrW5oIGNodeG7l2kgdGjhu51pIGdpYW4sIGThu68gbGnhu4d1IGzhu5NuZyBnaMOpcCAobmVzdGVkIGRhdGEpIGhv4bq3YyBwaMOibiBuaMOzbSAoY2x1c3RlcmVkKSwgdGjDrCBtw7QgaMOsbmggdHV54bq/biB0w61uaCBjxqEgYuG6o24ga2jDtG5nIGPDsm4gcGjDuSBo4bujcC4NCg0KXChcUmlnaHRhcnJvd1wpICoqQ8OhY2gga2nhu4NtIHRyYToqKiBu4bq/dSBk4buvIGxp4buHdSB0aGVvIHRo4budaSBnaWFuLCBuw6puIGtp4buDbSB0cmEgcGjhuqduIGTGsCBjw7MgeHUgaMaw4bubbmcgKGF1dG9jb3JyZWxhdGlvbikgaGF5IGtow7RuZy4NCg0KKio0LiBHaeG6oyDEkeG7i25oIDQ6IFBow6JuIHBo4buRaSBjaHXhuqluIGPhu6dhIHNhaSBz4buRKioNCg0KLSBN4bq3YyBkw7kga2jDtG5nIGLhuq90IGJ14buZYyDEkeG7gyDGsOG7m2MgbMaw4bujbmcgT0xTLCBnaeG6oyDEkeG7i25oIG7DoHkgcuG6pXQgcXVhbiB0cuG7jW5nIMSR4buDIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IHbDoCB0w61uaCBraG/huqNuZyB0aW4gY+G6rXk6DQokJA0KXHZhcmVwc2lsb25faSBcc2ltIFxtYXRoY2Fse059KDAsIFxzaWdtYV4yKQ0KJCQNCg0KXChcUmlnaHRhcnJvd1wpICoqQ8OhY2gga2nhu4NtIHRyYToqKiBkw7luZyBiaeG7g3UgxJHhu5MgUS1RIHBsb3QgKHF1YW50aWxlLXF1YW50aWxlKSDEkeG7gyBzbyBzw6FuaCBwaOG6p24gZMawIHbhu5tpIHBow6JuIHBo4buRaSBjaHXhuqluLg0KDQojIyMgKiozLjMgQ8OhYyBsb+G6oWkgcGjhuqduIGTGsCAoUmVzaWR1YWxzKSoqDQoNClBo4bqnbiBkxrAgbMOgIGPDtG5nIGPhu6UgdHJ1bmcgdMOibSDEkeG7gyBjaOG6qW4gxJFvw6FuIG3DtCBow6xuaC4gQ8OzIG5oaeG7gXUgY8OhY2ggdMOtbmggcGjhuqduIGTGsDoNCg0KKioxLiBSYXcgcmVzaWR1YWwgKFBo4bqnbiBkxrAgdGjDtCk6KioNCg0KJCQNCmVfaSA9IHlfaSAtIFxoYXR7eX1faQ0KJCQNCsSQxqFuIGdp4bqjbiBsw6AgaGnhu4d1IGdp4buvYSBnacOhIHRy4buLIHRo4buxYyB04bq/IHbDoCBnacOhIHRy4buLIGThu7EgxJFvw6FuLg0KDQoqKjIuIFN0YW5kYXJkaXplZCByZXNpZHVhbCAoUGjhuqduIGTGsCBjaHXhuqluIGjDs2EpOioqDQoNCiQkDQpyX2kgPSBcZnJhY3tlX2l9e1xoYXR7XHNpZ21hfSBcc3FydHsxIC0gaF97aWl9fX0NCiQkDQoNCi0gR2nDunAgc28gc8OhbmggcGjhuqduIGTGsCBnaeG7r2EgY8OhYyDEkWnhu4NtIGPDsyBsZXZlcmFnZSBraMOhYyBuaGF1Lg0KDQotIFwoIGhfe2lpfSBcKTogbGV2ZXJhZ2Ug4oCTIG3hu6ljIOG6o25oIGjGsOG7n25nIGPhu6dhIMSRaeG7g20gXCggaSBcKSBsw6puIGThu7EgxJFvw6FuIFwoIFxoYXR7eX1faSBcKS4NCg0KKiozLiBTdHVkZW50aXplZCByZXNpZHVhbDoqKg0KDQokJA0KdF9pID0gXGZyYWN7ZV9pfXtcaGF0e1xzaWdtYX1feyhpKX0gXHNxcnR7MSAtIGhfe2lpfX19DQokJA0KDQotIEdp4buRbmcgc3RhbmRhcmRpemVkIHJlc2lkdWFsIG5oxrBuZyBkw7luZyBcKFxoYXR7XHNpZ21hfV97KGkpfVwpIOKAkyBwaMawxqFuZyBzYWkgxrDhu5tjIGzGsOG7o25nIGtow7RuZyBkw7luZyBxdWFuIHPDoXQgXChpXCkgXChccmlnaHRhcnJvd1wpIGNow61uaCB4w6FjIGjGoW4uDQoNCi0gRMO5bmcgxJHhu4MgcGjDoXQgaGnhu4duIG5nb+G6oWkgbGFpIHbDrCBuw7MgZ+G6p24gduG7m2kgcGjDom4gcGjhu5FpIHQuDQoNCiMjIyAqKjMuNCBCaeG7g3UgxJHhu5MgcGjhuqduIGTGsCAoUmVzaWR1YWwgUGxvdHMpKioNCg0KTeG7mXQgc+G7kSBiaeG7g3UgxJHhu5MgcXVhbiB0cuG7jW5nOg0KDQotICoqUmVzaWR1YWwgdnMgRml0dGVkIFBsb3Q6Kioga2nhu4NtIHRyYSB0dXnhur9uIHTDrW5oIHbDoCBwaMawxqFuZyBzYWkga2jDtG5nIMSR4buVaS4NCg0KLSAqKk5vcm1hbCBRLVEgUGxvdCoqOiBraeG7g20gdHJhIHBow6JuIHBo4buRaSBjaHXhuqluIGPhu6dhIHBo4bqnbiBkxrAuDQoNCi0gKipTY2FsZS1Mb2NhdGlvbiBQbG90OioqIGNodeG6qW4gaMOzYSBwaOG6p24gZMawIMSR4buDIGThu4UgcGjDoXQgaGnhu4duIGhldGVyb3NjZWRhc3RpY2l0eS4NCg0KLSAqKlJlc2lkdWFscyB2cyBMZXZlcmFnZSBQbG90OioqIHjDoWMgxJHhu4tuaCDEkWnhu4NtIOG6o25oIGjGsOG7n25nIGzhu5tuLg0KDQojIyMgKiozLjUgTmdv4bqhaSBsYWkgKE91dGxpZXJzKSoqDQoNCioqxJDhu4tuaCBuZ2jEqWE6KiogTMOgIGPDoWMgxJFp4buDbSBk4buvIGxp4buHdSBtw6AgZ2nDoSB0cuG7iyBwaOG6o24gaOG7k2kgXCggeV9pIFwpIGtow6FjIGJp4buHdCBs4bubbiBzbyB24bubaSBk4buxIMSRb8OhbiB04burIG3DtCBow6xuaCwgZMO5IGJp4bq/biBcKCB4X2kgXCkga2jDtG5nIGLhuqV0IHRoxrDhu51uZy4NCg0KRMO5bmcgc3R1ZGVudGl6ZWQgcmVzaWR1YWwgxJHhu4Mga2nhu4NtIHRyYS4NCg0KUXV5IHThuq9jIG5nxrDhu6FuZzoNCg0KLSBcKHx0X2l8ID4gMlwpOiBuZ2hpIG5n4budLg0KDQotIFwofHRfaXwgPiAzXCk6IGPDsyB0aOG7gyBsw6Agbmdv4bqhaSBsYWkgxJHDoW5nIGvhu4MuDQoNClwoXFJpZ2h0YXJyb3dcKSAqKk5nb+G6oWkgbGFpIGtow7RuZyBuaOG6pXQgdGhp4bq/dCBjw7Mg4bqjbmggaMaw4bufbmcgbOG7m24qKiwgbmjGsG5nIGPhuqduIGtp4buDbSB0cmEga+G7uS4NCg0KIyMjICoqMy42IMSQaeG7g20g4bqjbmggaMaw4bufbmcgKEluZmx1ZW50aWFsIFBvaW50cykqKg0KDQoqKsSQ4buLbmggbmdoxKlhOioqIEzDoCBuaOG7r25nIMSRaeG7g20gZOG7ryBsaeG7h3UgbcOgICoqbuG6v3UgYuG7iyBsb+G6oWkgYuG7jywgbcO0IGjDrG5oIHPhur0gdGhheSDEkeG7lWkgxJHDoW5nIGvhu4MqKi4NCg0KQ8OhYyBjaOG7iSBz4buRIHBo4buVIGJp4bq/biDEkeG7gyDEkW8g4bqjbmggaMaw4bufbmc6DQoNCioqMS4gTGV2ZXJhZ2UgKEjhu4cgc+G7kSDEkcOybiBi4bqpeSk6KioNCg0KJCQNCmhfe2lpfSA9IHhfaV5UIChYXlQgWCleey0xfSB4X2kgDQokJA0KDQotIMSQbyBraG/huqNuZyBjw6FjaCBj4bunYSBcKCB4X2kgXCkgxJHhur9uIHRydW5nIHTDom0gY+G7p2EgY8OhYyDEkWnhu4NtIFwoIHggXCkuDQoNCi0gTuG6v3UgXCggaF97aWl9ID4gXGZyYWN7MnB9e259IFwpOiDEkWnhu4NtIGPDsyBsZXZlcmFnZSBjYW8uDQoNCioqMi4gQ29va+KAmXMgRGlzdGFuY2UgKEtob+G6o25nIGPDoWNoIENvb2spOioqDQoNCiQkDQpEX2kgPSBcZnJhY3twIFxoYXR7XHNpZ21hfV4yIGVfaV4yfXsoMSAtIGhfe2lpfSleMiBoX3tpaX19IA0KJCQgDQoNCkvhur90IGjhu6NwIGdp4buvYSDEkeG7mSBs4buHY2ggKHJlc2lkdWFsKSB2w6AgbGV2ZXJhZ2UuDQoNCi0gTuG6v3UgXCggRF9pID4gMC41IFwpOiBjw7MgdGjhu4MgY8OzIOG6o25oIGjGsOG7n25nLg0KDQotIE7hur91IFwoIERfaSA+IDEgXCk6IOG6o25oIGjGsOG7n25nIGzhu5tuIGPhuqduIHhlbSB4w6l0IGvhu7kuDQoNCioqMy4gREZCRVRBUzoqKg0KDQokJA0KXHRleHR7REZCRVRBU31fe2lqfSA9IFxmcmFje1xoYXR7XGJldGF9X2ogLSBcaGF0e1xiZXRhfV97aihpKX19e1x0ZXh0e1NFfShcaGF0e1xiZXRhfV97aihpKX0pfQ0KJCQNCg0KLSBN4bupYyB0aGF5IMSR4buVaSBj4bunYSBo4buHIHPhu5EgXChcYmV0YV9qXCkga2hpIGxv4bqhaSBi4buPIHF1YW4gc8OhdCBcKGlcKS4NCg0KLSBEw7luZyDEkeG7gyBraeG7g20gdHJhIOG6o25oIGjGsOG7n25nIGPhu6dhIHThu6tuZyDEkWnhu4NtIGzDqm4gdOG7q25nIGjhu4cgc+G7kSBj4bulIHRo4buDLg0KDQojIyMgKiozLjcgxJBhIGPhu5luZyB0dXnhur9uIChNdWx0aWNvbGxpbmVhcml0eSkqKg0KDQoqKsSQ4buLbmggbmdoxKlhOioqIFjhuqN5IHJhIGtoaSBoYWkgaGF5IG5oaeG7gXUgYmnhur9uIGdp4bqjaSB0aMOtY2ggY8OzIHTGsMahbmcgcXVhbiBjYW8sIGtoaeG6v24gY2hvIMaw4bubYyBsxrDhu6NuZyBcKFxiZXRhX2pcKSBraMO0bmcg4buVbiDEkeG7i25oIChuaOG7jyB0aGF5IMSR4buVaSBk4buvIGxp4buHdSBcKFxyaWdodGFycm93XCkgbOG7m24gdGhheSDEkeG7lWkgaOG7hyBz4buRKS4NCg0KKipWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9yIChWSUYpOioqDQoNCiQkDQpcbWF0aHJte1ZJRn1faiA9IFxmcmFjezF9ezEgLSBSX2peMn0NCiQkDQoNCi0gXChSX2peMlwpIDogaOG7hyBz4buRIHjDoWMgxJHhu4tuaCBraGkgaOG7k2kgcXV5IFwoeF9qXCkgbMOqbiB04bqldCBj4bqjIGPDoWMgYmnhur9uIGPDsm4gbOG6oWkuDQoNCi0gTuG6v3UgXChcbWF0aHJte1ZJRn1faiA+IDVcKSBob+G6t2MgXCg+IDEwXCk6IGPDsyB24bqlbiDEkeG7gSBj4bqnbiB44butIGzDvS4NCg0KIyMjICoqMy44IFPhu61hIGNo4buvYSBtw7QgaMOsbmggc2FpKioNCg0KS2hpIG3DtCBow6xuaCB2aSBwaOG6oW0gZ2nhuqMgxJHhu4tuaDoNCg0KLSBEw7luZyBiaeG6v24gxJHhu5VpICoqKGxvZywgc3FydCwgQm94LUNveOKApikqKi4NCg0KLSBEw7luZyBtw7QgaMOsbmggcGhpIHR1eeG6v24gaG/hurdjIG3DtCBow6xuaCBHTE0uDQoNCi0gTG/huqFpIGLhu48gaG/hurdjIHRoYXkgdGjhur8gxJFp4buDbSDhuqNuaCBoxrDhu59uZyBxdcOhIGzhu5tuLg0KDQotIFRow6ptIGJp4bq/biBi4buLIHRoaeG6v3UgaG/hurdjIGxv4bqhaSBi4bubdCBiaeG6v24gZ8OieSBuaGnhu4V1Lg0KDQojIyAqKkNIxq/GoE5HIDQ6IMav4buaQyBMxq/hu6JORyBI4buiUCBMw50gVOG7kEkgxJBBKioNCk1heGltdW0gbGlrZWhvb2QgZXN0aW1hdGlvbiAtIE1MRSAoxrDhu5tjIGzGsOG7o25nIGjhu6NwIGzDvSB04buRaSDEkWEpDQoNCiMjIyAqKjQuMSBHaeG7m2kgdGhp4buHdSoqDQoNClBoxrDGoW5nIHBow6FwIGLDrG5oIHBoxrDGoW5nIHThu5FpIHRoaeG7g3UgKE9MUykgY2jhu4kgaG/huqF0IMSR4buZbmcgaGnhu4d1IHF14bqjIGtoaSBk4buvIGxp4buHdSB0aOG7j2EgbcOjbiBjw6FjIGdp4bqjIMSR4buLbmggbmjGsCBwaMOibiBwaOG7kWkgY2h14bqpbiwgcGjGsMahbmcgc2FpIGtow7RuZyDEkeG7lWksIHbDoCBiaeG6v24gcGjhuqNuIGjhu5NpIGxpw6puIHThu6VjLiBUdXkgbmhpw6puLCBuaGnhu4F1IGxv4bqhaSBk4buvIGxp4buHdSB0aOG7sWMgdOG6vyBraMO0bmcgdHXDom4gdGhlbyBuaOG7r25nIMSRaeG7gXUga2nhu4duIMSRw7Mg4oCTIHbDrSBk4bulOiBk4buvIGxp4buHdSBuaOG7iyBwaMOibiwgxJHhur9tLCBob+G6t2MgZMawxqFuZyBsacOqbiB04bulYy4gS2hpIMSRw7MsIE1heGltdW0gTGlrZWxpaG9vZCBFc3RpbWF0aW9uIChNTEUpIGzDoCBwaMawxqFuZyBwaMOhcCBt4bqhbmggbeG6vSBoxqFuLCBkw7luZyDEkeG7gyDGsOG7m2MgbMaw4bujbmcgY8OhYyB0aGFtIHPhu5EgdHJvbmcgbcO0IGjDrG5oIHThu5VuZyBxdcOhdC4NCg0KTUxFIGzDoCBu4buBbiB04bqjbmcgY2hvIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNKSwgduG7kW4gbMOgIHRydW5nIHTDom0gY+G7p2EgcGjhuqduIGPDsm4gbOG6oWkgdHJvbmcgc8OhY2guDQoNCiMjIyAqKjQuMiBIw6BtIGjhu6NwIGzDvSAoTGlrZWxpaG9vZCBGdW5jdGlvbikqKg0KDQoqKsSQ4buLbmggbmdoxKlhOioqIEjDoG0gaOG7o3AgbMO9IGzDoCBt4buZdCBow6BtIHjDoWMgc3XhuqV0IGPhu6dhIHRvw6BuIGLhu5kgZOG7ryBsaeG7h3UgxJHDoyBxdWFuIHPDoXQsIGJp4buDdSBkaeG7hW4gbmjGsCBt4buZdCBow6BtIGPhu6dhIHRoYW0gc+G7kSBcKFx0aGV0YVwpLg0KDQpHaeG6oyBz4butIHRhIGPDsyBt4buZdCBt4bqrdSBn4buTbSBcKG5cKSBxdWFuIHPDoXQgxJHhu5ljIGzhuq1wIFwoeV8xLCB5XzIsIFxsZG90cywgeV9uXCksIHbhu5tpIG3hu5dpIFwoeV9pXCkgY8OzIHBow6JuIHBo4buRaSB4w6FjIHN14bqldCBcKGYoeV9pOyBcdGhldGEpXCksIHRow6w6DQoNCioqSMOgbSBo4bujcCBsw706KioNCg0KJCQNCkwoXHRoZXRhKSA9IFxwcm9kX3tpPTF9XntufSBmKHlfaTsgXHRoZXRhKQ0KJCQNCg0KLSBcKEwoXHRoZXRhKVwpOiBow6BtIGjhu6NwIGzDvQ0KDQotIFwoXHRoZXRhXCk6IHZlY3RvciBjw6FjIHRoYW0gc+G7kSBj4bqnbiDGsOG7m2MgbMaw4bujbmcNCg0KLSBcKGYoeV9pOyBcdGhldGEpXCk6IG3huq10IMSR4buZIHjDoWMgc3XhuqV0IChob+G6t2Mga2jhu5FpIHjDoWMgc3XhuqV0KSBj4bunYSBcKHlfaVwpDQoNCioqTG9nLWjhu6NwIGzDvSAobG9nLWxpa2VsaWhvb2QpOioqDQoNCiQkDQpcZWxsKFx0aGV0YSkgPSBcbG9nIEwoXHRoZXRhKSA9IFxzdW1fe2k9MX1ee259IFxsb2cgZih5X2k7IFx0aGV0YSkNCiQkDQoNCi0gROG7hSDEkeG6oW8gaMOgbSBoxqFuIHbDrCB0w61jaCB0aMOgbmggdOG7lW5nLg0KDQotIEdpw6EgdHLhu4sgY+G7sWMgxJHhuqFpIGPhu6dhIFwoXGVsbChcdGhldGEpXCkgdHLDuW5nIHbhu5tpIFwoTChcdGhldGEpXCkuDQoNCiMjIyAqKjQuMyDGr+G7m2MgbMaw4bujbmcgaOG7o3AgbMO9IHThu5FpIMSRYSAoTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRpb24g4oCTIE1MRSkqKg0KDQoqKsSQ4buLbmggbmdoxKlhOioqIE1MRSBsw6AgZ2nDoSB0cuG7iyBcKFxoYXR7XHRoZXRhfVwpIGPhu6dhIHRoYW0gc+G7kSBcKFx0aGV0YVwpIHNhbyBjaG8gbG9nLWxpa2VsaWhvb2QgxJHhuqF0IGPhu7FjIMSR4bqhaS4NCg0KDQokJA0KXGhhdHtcdGhldGF9ID0gXGFyZ1xtYXhfe1x0aGV0YX0gXCwgXGVsbChcdGhldGEpDQokJA0KxJDhu4MgdMOsbSBcKFxoYXR7XHRoZXRhfVwpLCB0YSBnaeG6o2k6DQoNCiQkDQpcZnJhY3tkXGVsbChcdGhldGEpfXtkXHRoZXRhfSA9IDANCiQkDQoNClwoXFJpZ2h0YXJyb3dcKSDEkMOieSBn4buNaSBsw6AgKnBoxrDGoW5nIHRyw6xuaCDEkWnhu4NtKiAoc2NvcmUgZXF1YXRpb24pLg0KDQojIyMgKio0LjQgTWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyIHbDoCBwaMawxqFuZyBzYWkqKg0KDQoqKjEuIEjDoG0gxJFp4buDbSAoU2NvcmUgRnVuY3Rpb24pOioqDQoNCiQkDQpVKFx0aGV0YSkgPSBcZnJhY3tkXGVsbChcdGhldGEpfXtkXHRoZXRhfQ0KJCQNCg0KLSBcKFUoXHRoZXRhKVwpOiDEkeG7mSBk4buRYyBj4bunYSBsb2ctbGlrZWxpaG9vZCB0aGVvIFwoXHRoZXRhXCkNCg0KKioyLiBNYSB0cuG6rW4gdGjDtG5nIHRpbiBGaXNoZXI6KioNCg0KJCQNCkkoXHRoZXRhKSA9IC1cbWF0aGJie0V9IFxsZWZ0WyBcZnJhY3tkXjIgXGVsbChcdGhldGEpfXtkXHRoZXRhXjJ9IFxyaWdodF0NCiQkDQoNCi0gXChJKFx0aGV0YSlcKToga+G7syB24buNbmcgw6JtIGPhu6dhIMSR4bqhbyBow6BtIGLhuq1jIGhhaSBsb2ctbGlrZWxpaG9vZCDihpIgxJFvIMSR4buZIGNvbmcuDQoNCi0gTMOgIHjhuqVwIHjhu4kgbmfGsOG7o2MgbOG6oWkgY+G7p2EgcGjGsMahbmcgc2FpOg0KJCQNClxtYXRocm17VmFyfShcaGF0e1x0aGV0YX0pIFxhcHByb3ggXGZyYWN7MX17SShcdGhldGEpfQ0KJCQNCg0KIyMjICoqNC41IEPDoWMgdMOtbmggY2jhuqV0IGPhu6dhIE1MRSoqDQoNCk1MRSBjw7Mgbmhp4buBdSB0w61uaCBjaOG6pXQgdOG7kXQgduG7gSBt4bq3dCBsw70gdGh1eeG6v3QsIMSR4bq3YyBiaeG7h3Qga2hpIGvDrWNoIHRoxrDhu5tjIG3huqt1IG4gbOG7m246DQoNCnwgVMOtbmggY2jhuqV0ICAgICAgICAgICAgICAgIHwgR2nhuqNpIHRow61jaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKipOaOG6pXQgcXXDoW4qKiAgICAgICAgICAgIHwgJFxoYXR7XHRoZXRhfSBcdG8gXHRoZXRhJCBraGkgJG4gXHRvIFxpbmZ0eSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKktow7RuZyBjaOG7h2NoIHRp4buHbSBj4bqtbioqIHwgxJDhu5kgbOG7h2NoIGdp4buvYSAkXGhhdHtcdGhldGF9JCB2w6AgJFx0aGV0YSQgdGnhur9uIHbhu4EgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkhp4buHdSBxdeG6oyoqICAgICAgICAgICAgIHwgTUxFIMSR4bqhdCBnaeG7m2kgaOG6oW4gQ3JhbcOpcuKAk1JhbywgbMOgIMaw4bubYyBsxrDhu6NuZyAidOG7kXQgbmjhuqV0IiAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlRp4buHbSBj4bqtbiBjaHXhuqluKiogICAgICAgfCBLaGkgJG4kIGzhu5tuLCBwaMOibiBwaOG7kWkgY+G7p2EgJFxoYXR7XHRoZXRhfSQgZ+G6p24gY2h14bqpbjogJFxoYXR7XHRoZXRhfSBcc2ltIFxtYXRoY2Fse059KFx0aGV0YSwgSShcdGhldGEpXnstMX0pJCB8DQoNCiMjIyAqKjQuNiBLaeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB24bubaSBNTEUqKg0KDQotICoqTXXhu5FuIGtp4buDbSB0cmEgZ2nhuqMgdGh1eeG6v3Q6KioNCg0KXFsNCkhfMDogXHRoZXRhID0gXHRoZXRhXzANClxdDQoNCi0gKipUYSBjw7MgMyBjw6FjaCBwaOG7lSBiaeG6v246KioNCg0KKioxLiBXYWxkIFRlc3Q6KioNCg0KXFsNClogPSBcZnJhY3tcaGF0e1x0aGV0YX0gLSBcdGhldGFfMH17U0UoXGhhdHtcdGhldGF9KX0sIFxxdWFkIFogXHNpbSBOKDAsMSkNClxdDQoNCi0gRMO5bmcgxJHhu4Mga2nhu4NtIMSR4buLbmggbuG6v3UgXCggU0UoXGhhdHtcdGhldGF9KSBcKSDEkcOjIGPDsy4NCg0KDQoqKjIuIExpa2VsaWhvb2QgUmF0aW8gVGVzdCAoTFJUKToqKg0KDQpcWw0KTFIgPSAyIFxsZWZ0WyBcZWxsKFxoYXR7XHRoZXRhfSkgLSBcZWxsKFx0aGV0YV8wKSBccmlnaHRdIFxzaW0gXGNoaV4yX3tkZn0NClxdDQoNCi0gU28gc8OhbmggbG9nLWxpa2VsaWhvb2QgY+G7p2EgbcO0IGjDrG5oIMSR4bqneSDEkeG7pyB2w6AgbcO0IGjDrG5oIHLDunQgZ+G7jW4uDQoNCi0gXCggZGYgXCk6IHPhu5EgdGhhbSBz4buRIGLhu4sgcsOgbmcgYnXhu5ljIHRyb25nIFwoIEhfMCBcKS4NCg0KDQoqKjMuIFNjb3JlIFRlc3QgKExhZ3JhbmdlIE11bHRpcGxpZXIgVGVzdCk6KioNCg0KXFsNClMgPSBcZnJhY3tVKFx0aGV0YV8wKV4yfXtJKFx0aGV0YV8wKX0gXHNpbSBcY2hpXjJfMQ0KXF0NCg0KS2jDtG5nIGPhuqduIMaw4bubYyBsxrDhu6NuZyBtw7QgaMOsbmggxJHhuqd5IMSR4bunLg0KDQojIyMgKio0LjcgU28gc8OhbmggbcO0IGjDrG5oIGLhurFuZyBBSUMgdsOgIEJJQyoqDQoNCktoaSBraMO0bmcgdGjhu4MgZMO5bmcga2nhu4NtIMSR4buLbmggTFJUIChkbyBtw7QgaMOsbmgga2jDtG5nIGzhu5NuZyksIHRhIGTDuW5nOg0KDQoqKjEuIEFJQyDigJMgQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbjoqKg0KDQpcWw0KXHRleHR7QUlDfSA9IC0yXGVsbCArIDJrDQpcXQ0KDQotIFwoa1wpOiBz4buRIHRoYW0gc+G7kSB0cm9uZyBtw7QgaMOsbmgNCg0KLSBcKFxlbGxcKTogbG9nLWxpa2VsaWhvb2QgdOG6oWkgTUxFDQoNCg0KKioyLiBCSUMg4oCTIEJheWVzaWFuIEluZm9ybWF0aW9uIENyaXRlcmlvbjoqKg0KDQpcWw0KXHRleHR7QklDfSA9IC0yXGVsbCArIFxsb2cobikgXGNkb3Qgaw0KXF0NCg0KLSBcKG5cKTogc+G7kSBxdWFuIHPDoXQNCg0KDQrihpIgQ2jhu41uIG3DtCBow6xuaCBjw7MgQUlDL0JJQyB0aOG6pXAgaMahbi4NCg0KIyMjICoqNC44IE1MRSB0cm9uZyBtw7QgaMOsbmgga2jDtG5nIHR1eeG6v24gdMOtbmggY2h14bqpbioqDQoNCi0gKipI4buTaSBxdXkgbG9naXN0aWMgKG5o4buLIHBow6JuKToqKg0KDQpcWw0KeV9pIFxzaW0gXHRleHR7QmVybm91bGxpfShccGlfaSksIFxxdWFkIFxsb2dcbGVmdChcZnJhY3tccGlfaX17MSAtIFxwaV9pfVxyaWdodCkgPSB4X2leVCBcYmV0YQ0KXF0NCg0KDQotICoqSOG7k2kgcXV5IFBvaXNzb24gKMSR4bq/bSk6KioNCg0KXFsNCnlfaSBcc2ltIFx0ZXh0e1BvaXNzb259KFxtdV9pKSwgXHF1YWQgXGxvZyhcbXVfaSkgPSB4X2leVCBcYmV0YQ0KXF0NCg0KDQotICoqSOG7k2kgcXV5IEdhbW1hIChkxrDGoW5nIGxpw6puIHThu6VjKToqKg0KDQpcWw0KeV9pIFxzaW0gXHRleHR7R2FtbWF9KFxhbHBoYSwgXG11X2kpLCBccXVhZCBcbG9nKFxtdV9pKSA9IHhfaV5UIFxiZXRhDQpcXQ0KDQoNCuKGkiBD4bqjIGJhIMSR4buBdSBkw7luZyAqKk1MRSoqIMSR4buDIMaw4bubYyBsxrDhu6NuZyBcKFxiZXRhXCksIGNo4bupIGtow7RuZyBkw7luZyBPTFMuDQoNCiMjICoqQ0jGr8agTkcgNTogQ+G6pFUgVFLDmkMgQ+G7pkEgTcOUIEjDjE5IIFRVWeG6vk4gVMONTkggVOG7lE5HIFFVw4FUIChHTE0gU1RSVUNUVVJFKSoqDQoNCiMjIyAqKjUuMSBHaeG7m2kgdGhp4buHdSoqDQoNCk3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNKSBsw6AgbeG7mXQga2h1w7RuIGto4buVIG3huqFuaCBt4bq9IGNobyB2aeG7h2MgbcO0IGjDrG5oIGjDs2EgY8OhYyBsb+G6oWkgZOG7ryBsaeG7h3Uga2jDoWMgbmhhdSDigJMga2jDtG5nIGNo4buJIGThu68gbGnhu4d1IGxpw6puIHThu6VjIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbiBuaMawIHRyb25nIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oLiBHTE0gYmFvIGfhu5NtIGjhu5NpIHF1eSBsb2dpc3RpYywgaOG7k2kgcXV5IFBvaXNzb24sIGjhu5NpIHF1eSBHYW1tYS4uLiB2w6AgbeG7nyBy4buZbmcga2jhuqMgbsSDbmcgcGjDom4gdMOtY2ggxJHhur9uIGThu68gbGnhu4d1IG5o4buLIHBow6JuLCDEkeG6v20sIHThu7cgbOG7hyB2w6AgZMawxqFuZyBsacOqbiB04bulYy4NCg0KTeG7l2kgR0xNIMSRxrDhu6NjIHjDonkgZOG7sW5nIHRyw6puIGPDuW5nIG3hu5l0IG5ndXnDqm4gbMO9IGNodW5nIGfhu5NtIGJhIHRow6BuaCBwaOG6p24gY2jDrW5oOiBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQsIGjDoG0gbGnDqm4ga+G6v3QsIHbDoCB0aMOgbmggcGjhuqduIHR1eeG6v24gdMOtbmguDQoNCiMjIyAqKjUuMiBD4bqldSB0csO6YyAzIHBo4bqnbiBj4bunYSBHTE0qKg0KDQoqKjEuIFRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAoUmFuZG9tIGNvbXBvbmVudCkqKg0KDQpCaeG6v24gcGjhuqNuIGjhu5NpIFwoIHlfaSBcKSDEkcaw4bujYyBnaeG6oyDEkeG7i25oIHBow6JuIHBo4buRaSB0aGVvIG3hu5l0IHBow6JuIHBo4buRaSB0aHXhu5ljIGjhu40gaMOgbSBtxakgbeG7mXQgdGhhbSBz4buRIChPbmUtUGFyYW1ldGVyIEV4cG9uZW50aWFsIEZhbWlseSk6DQoNCiQkDQpmKHlfaTsgXHRoZXRhX2ksIFxwaGkpID0gXGV4cCBcbGVmdFx7IFxmcmFje3lfaSBcdGhldGFfaSAtIGIoXHRoZXRhX2kpfXtccGhpfSArIGMoeV9pLCBccGhpKSBccmlnaHRcfQ0KJCQNCg0KLSAqKsOdIG5naMSpYSBjw6FjIGvDvSBoaeG7h3U6KioNCg0KICAtIFwoXHRoZXRhX2lcKTogdGhhbSBz4buRIHThu7Egbmhpw6puIChuYXR1cmFsIHBhcmFtZXRlcikNCiAgLSBcKFxwaGlcKTogdGhhbSBz4buRIHBow6JuIHTDoW4gKGRpc3BlcnNpb24gcGFyYW1ldGVyKSwga2jDtG5nIHBo4bqjaSBsw7pjIG7DoG8gY8WpbmcgY8OzICh2w60gZOG7pSBQb2lzc29uIHRow6wgXChccGhpID0gMVwpKQ0KICAtIFwoYihcdGhldGFfaSlcKTogaMOgbSBsb2cgcGFydGl0aW9uDQogIC0gXChjKHlfaSwgXHBoaSlcKTogaMOgbSBjaHXhuqluIGjDs2EgxJHhu4MgYuG6o28gdG/DoG4gdMOtY2ggcGjDom4gYuG6sW5nIDENCg0K4oaSIEjhu40gaMOgbSBtxakgYmFvIGfhu5NtIE5vcm1hbCwgUG9pc3NvbiwgQmlub21pYWwsIEdhbW1hLC4uLg0KDQoNCioqMi4gVGjDoG5oIHBo4bqnbiBo4buHIHRo4buRbmcgKFN5c3RlbWF0aWMgY29tcG9uZW50KSoqDQoNCkdp4buRbmcgbmjGsCBo4buTaSBxdXkgdHV54bq/biB0w61uaCwgR0xNIHbhuqtuIGTDuW5nIG3hu5l0IHByZWRpY3RvciB0dXnhur9uIHTDrW5oOg0KDQokJA0KXGV0YV9pID0geF9pXlQgXGJldGEgPSBcYmV0YV8wICsgXGJldGFfMSB4X3tpMX0gKyBcY2RvdHMgKyBcYmV0YV9wIHhfe2lwfQ0KJCQNCg0Kw50gbmdoxKlhOg0KDQotIFwoXGV0YV9pXCk6IHByZWRpY3RvciB0dXnhur9uIHTDrW5oDQotIFwoeF9pXCk6IHZlY3RvciBow6BuZyBn4buTbSBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoIGPhu6dhIHF1YW4gc8OhdCBcKGlcKQ0KLSBcKFxiZXRhXCk6IHZlY3RvciBo4buHIHPhu5EgaOG7k2kgcXV5DQoNCsSQw6J5IGzDoCB0aMOgbmggcGjhuqduIGNo4bupYSDhuqNuaCBoxrDhu59uZyBj4bunYSBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgbMOqbiBtw7QgaMOsbmguDQoNCg0KKiozLiBIw6BtIGxpw6puIGvhur90IChMaW5rIGZ1bmN0aW9uKSoqDQoNCkdMTSBkw7luZyBt4buZdCBow6BtIGxpw6puIGvhur90IFwoIGcoXGNkb3QpIFwpIMSR4buDIGvhur90IG7hu5FpIHRydW5nIGLDrG5oIFwoXG11X2kgPSBFW3lfaV1cKSB24bubaSBwcmVkaWN0b3IgdHV54bq/biB0w61uaCBcKFxldGFfaVwpOg0KDQokJA0KZyhcbXVfaSkgPSBcZXRhX2kgXHF1YWQgXHRleHR7aGF5fSBccXVhZCBcbXVfaSA9IGdeey0xfShcZXRhX2kpDQokJA0KDQrihpIgQ2hvIHBow6lwIG3DtCBow6xuaCBow7NhIGPDoWMgYmnhur9uIHBo4bqjbiBo4buTaSBjw7MgxJHhurdjIHTDrW5oIHBoaSB0dXnhur9uLCBraMO0bmcgw6JtLCBnaeG7m2kgaOG6oW4gdHJvbmcga2hv4bqjbmcgKDAsMSks4oCmDQoNCioqSMOgbSBsacOqbiBr4bq/dCB0aMaw4budbmcgZMO5bmc6KioNCg0KfCBQaMOibiBwaOG7kWkgIHwgXChcbXVfaSA9IEVbeV9pXVwpICAgIHwgTGluayBmdW5jdGlvbiBcKGcoXG11KVwpICAgICAgICAgICAgICAgICAgIHwgR2hpIGNow7ogICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBOb3JtYWwgICAgIHwgXChcbXUgXGluIFxtYXRoYmJ7Un1cKSAgfCBcKGcoXG11KSA9IFxtdVwpIChpZGVudGl0eSkgICAgICAgICAgICAgICAgfCBI4buTaSBxdXkgdHV54bq/biB0w61uaCBjaHXhuqluICAgfA0KfCBCaW5vbWlhbCAgIHwgXChcbXUgXGluICgwLDEpXCkgICAgICAgfCBcKGcoXG11KSA9IFxsb2cgXGZyYWN7XG11fXsxLVxtdX1cKSAgICAgICAgfCBMb2dpc3RpYyByZWdyZXNzaW9uICAgICAgICB8DQp8IFBvaXNzb24gICAgfCBcKFxtdSA+IDBcKSAgICAgICAgICAgICB8IFwoZyhcbXUpID0gXGxvZyhcbXUpXCkgICAgICAgICAgICAgICAgICAgICAgfCBI4buTaSBxdXkgxJHhur9tICAgICAgICAgICAgICAgfA0KfCBHYW1tYSAgICAgIHwgXChcbXUgPiAwXCkgICAgICAgICAgICAgfCBcKGcoXG11KSA9IFxsb2coXG11KVwpIGhv4bq3YyBcKGcoXG11KSA9IFxmcmFjezF9e1xtdX1cKSB8IE3DtCBow6xuaCBk4buvIGxp4buHdSBkxrDGoW5nICAgIHwNCg0KIyMjICoqNS4zIFbDrSBk4bulIG3DtCBow6xuaCBow7NhIHRyb25nIEdMTSoqDQoNCioqMS4gSOG7k2kgcXV5IExvZ2lzdGljIChuaOG7iyBwaMOibikqKg0KDQpcWw0KeV9pIFxzaW0gXHRleHR7QmVybm91bGxpfShccGlfaSkNClxdDQoNClxbDQpnKFxwaV9pKSA9IFxsb2cgXGxlZnQoXGZyYWN7XHBpX2l9ezEtXHBpX2l9XHJpZ2h0KSA9IFxldGFfaQ0KXF0NCg0KXFsNClxwaV9pID0gUCh5X2kgPSAxIFxtaWQgeF9pKQ0KXF0NCg0KLSBEw7luZyBjaG8gZOG7ryBsaeG7h3UgbmjGsDogc+G7kW5nL2No4bq/dCwgbXVhL2tow7RuZyBtdWEsIMSRw7puZy9zYWnigKYNCg0KDQoqKjIuIEjhu5NpIHF1eSBQb2lzc29uICjEkeG6v20pKioNCg0KXFsNCnlfaSBcc2ltIFx0ZXh0e1BvaXNzb259KFxtdV9pKQ0KXF0NCg0KXFsNClxsb2coXG11X2kpID0geF9pXlQgXGJldGENClxdDQoNCi0gXChcbXVfaVwpOiBz4buRIHPhu7Ega2nhu4duIGvhu7MgduG7jW5nIHjhuqN5IHJhLg0KDQotIETDuW5nIGNobyBk4buvIGxp4buHdTogc+G7kSBjYSBi4buHbmgsIHPhu5EgbOG6p24gdmkgcGjhuqFtLCBz4buRIGdpYW8gZOG7i2No4oCmDQoNCg0KKiozLiBI4buTaSBxdXkgR2FtbWEgKGTGsMahbmcgbGnDqm4gdOG7pWMpKioNCg0KXFsNCnlfaSBcc2ltIFx0ZXh0e0dhbW1hfShcYWxwaGEsIFxtdV9pKQ0KXF0NCg0KSMOgbSBsacOqbiBr4bq/dDoNCg0KXFsNCmcoXG11X2kpID0gXGxvZyhcbXVfaSkgXHF1YWQgXHRleHR7aG/hurdjfSBccXVhZCBnKFxtdV9pKSA9IFxmcmFjezF9e1xtdV9pfQ0KXF0NCg0KLSBEw7luZyBjaG8gZOG7ryBsaeG7h3UgY2hpIHBow60sIMSR4buZIGTDoGksIHRo4budaSBnaWFuDQoNCiMjIyAqKjUuNCBIw6BtIHBoxrDGoW5nIHNhaSAoVmFyaWFuY2UgRnVuY3Rpb24pKioNCg0KVHJvbmcgR0xNLCBwaMawxqFuZyBzYWkgY+G7p2EgXCggeV9pIFwpIGtow7RuZyBj4bqnbiBi4bqxbmcgbmhhdSBtw6AgxJHGsOG7o2MgbcO0IGjDrG5oIGjDs2EgbmjGsCBow6BtIGPhu6dhIFwoIFxtdV9pIFwpOg0KDQpcWw0KXHRleHR7VmFyfSh5X2kpID0gXHBoaSBcY2RvdCBWKFxtdV9pKQ0KXF0NCg0KVHJvbmcgxJHDszoNCg0KLSBcKCBccGhpIFwpOiB0aGFtIHPhu5EgcGjDom4gdMOhbiAoZGlzcGVyc2lvbiBwYXJhbWV0ZXIpDQotIFwoIFYoXG11KSBcKTogaMOgbSBwaMawxqFuZyBzYWkgcGjhu6UgdGh14buZYyB2w6BvIHRydW5nIGLDrG5oIFwoIFxtdSBcKQ0KDQpIw6BtIFwoIFYoXG11KSBcKSB0w7l5IHRoZW8gcGjDom4gcGjhu5FpIG5oxrAgc2F1Og0KDQp8IFBow6JuIHBo4buRaSAgfCBcKCBWKFxtdSkgXCkgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgTm9ybWFsICAgICB8IDEgICAgICAgICAgICAgICAgICAgICB8DQp8IEJpbm9taWFsICAgfCBcKCBcbXUgKDEgLSBcbXUpIFwpICAgfA0KfCBQb2lzc29uICAgIHwgXCggXG11IFwpICAgICAgICAgICAgIHwNCnwgR2FtbWEgICAgICB8IFwoIFxtdV4yIFwpICAgICAgICAgICB8DQoNClZp4buHYyBtw7QgaMOsbmggaMOzYSBwaMawxqFuZyBzYWkgbmjGsCB0csOqbiBnacO6cCB44butIGzDvSDEkcaw4bujYyBoaeG7h24gdMaw4bujbmcgcGjGsMahbmcgc2FpIHRoYXkgxJHhu5VpIChoZXRlcm9zY2VkYXN0aWNpdHkpLCB24buRbiBsw6AgbeG7mXQgZ2nhuqMgxJHhu4tuaCBi4buLIHZpIHBo4bqhbSB0cm9uZyBwaMawxqFuZyBwaMOhcCBPTFMgKEjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHRow7RuZyB0aMaw4budbmcpLg0KDQojIyMgKio1LjUgQ8OhYyBraMOhaSBuaeG7h20gbeG7nyBy4buZbmcqKg0KDQoqKkNhbm9uaWNhbCBMaW5rIEZ1bmN0aW9uKiogbMOgIGjDoG0gbGnDqm4ga+G6v3Qgc2FvIGNobyBwcmVkaWN0b3IgdHV54bq/biB0w61uaCBjaMOtbmggbMOgIHRoYW0gc+G7kSB04buxIG5oacOqbiBcKFx0aGV0YVwpIHRyb25nIHBow6JuIHBo4buRaSBo4buNIGjDoG0gbcWpOg0KDQpcWw0KXHRoZXRhX2kgPSBcZXRhX2kgPSB4X2leVCBcYmV0YQ0KXF0NCg0KVsOtIGThu6UgduG7gSBow6BtIGxpw6puIGvhur90IGNodeG6qW4gKGNhbm9uaWNhbCBsaW5rKToNCg0KfCBQaMOibiBwaOG7kWkgfCBIw6BtIGxpw6puIGvhur90IChMaW5rIGZ1bmN0aW9uKSAgICB8DQp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfA0KfCBCaW5vbWlhbCAgfCBsb2dpdDogXChcbG9nXGZyYWN7XG11fXsxLVxtdX1cKXwNCnwgUG9pc3NvbiAgIHwgbG9nOiBcKFxsb2coXG11KVwpICAgICAgICAgICAgICB8DQp8IE5vcm1hbCAgICB8IGlkZW50aXR5OiBcKFxtdVwpICAgICAgICAgICAgICAgfA0KDQo+ICoqTMawdSDDvToqKiBEw7kgR0xNIGfhu41pIGzDoCAidHV54bq/biB0w61uaCIsIG5oxrBuZyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIFwoIHkgXCkgdsOgIFwoIHggXCkgY8OzIHRo4buDICoqcGhpIHR1eeG6v24qKiBkbyBz4butIGThu6VuZyBow6BtIGxpw6puIGvhur90IChsaW5rIGZ1bmN0aW9uKS4NCg0KIyMgKipDSMavxqBORyA2OiDGr+G7mkMgTMav4buiTkcgVFJPTkcgTcOUIEjDjE5IIFRVWeG6vk4gVMONTkggVOG7lE5HIFFVw4FUIChHTE1zKSoqDQoNCiMjIyAqKjYuMSBHaeG7m2kgdGhp4buHdSoqDQoNClNhdSBraGkgeMOhYyDEkeG7i25oIMSRxrDhu6NjIGPhuqV1IHRyw7pjIGPhu6dhIG3hu5l0IEdMTSAoZ+G7k20gcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0LCBow6BtIGxpw6puIGvhur90IHbDoCB0aMOgbmggcGjhuqduIHR1eeG6v24gdMOtbmgpLCBixrDhu5tjIHRp4bq/cCB0aGVvIGzDoCDGsOG7m2MgbMaw4bujbmcgY8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5IFwoXGJldGFcKSB0cm9uZyBtw7QgaMOsbmguDQoNCktow6FjIHbhu5tpIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGPhu5UgxJFp4buDbiDigJMgbsahaSB0YSBkw7luZyBwaMawxqFuZyBwaMOhcCBiw6xuaCBwaMawxqFuZyB04buRaSB0aGnhu4N1IChPTFMpIOKAkyB0cm9uZyBHTE0sIGPDoWMgaOG7hyBz4buRIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBi4bqxbmcgKipwaMawxqFuZyBwaMOhcCBo4bujcCBsw70gdOG7kWkgxJFhIChNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAtIE1MRSkqKiB0aMO0bmcgcXVhIG3hu5l0IHRodeG6rXQgdG/DoW4gZ+G7jWkgbMOgICoqSXRlcmF0aXZlbHkgUmV3ZWlnaHRlZCBMZWFzdCBTcXVhcmVzIChJUkxTKSoqLg0KDQpQaMawxqFuZyBwaMOhcCBJUkxTIHRo4buxYyBoaeG7h24gdmnhu4djIGPhuq1wIG5o4bqtdCBjw6FjIMaw4bubYyBsxrDhu6NuZyBcKFxiZXRhXCkgbOG6t3AgxJFpIGzhurdwIGzhuqFpLCBt4buXaSBs4bqnbiBk4buxYSB0csOqbiB0cuG7jW5nIHPhu5EgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIHNhbyBjaG8gcGjDuSBo4bujcCB24bubaSBwaMOibiBwaOG7kWkgY+G7p2EgZOG7ryBsaeG7h3UgdsOgIGjDoG0gbGnDqm4ga+G6v3QgxJHGsOG7o2MgY2jhu41uLg0KDQojIyMgKio2LjIgVOG7lW5nIHF1YW4gduG7gSDGsOG7m2MgbMaw4bujbmcgaOG7o3AgbMO9IHThu5FpIMSRYSAoTUxFKSB0cm9uZyBHTE0qKg0KDQoqKkNobyBk4buvIGxp4buHdSBn4buTbToqKg0KDQotIEJp4bq/biBwaOG6o24gaOG7k2k6IFwoIHlfMSwgeV8yLCBcbGRvdHMsIHlfbiBcKSBjw7MgdGjhu4MgbMOgIGJp4bq/biDEkeG6v20sIG5o4buLIHBow6JuIGhv4bq3YyBsacOqbiB04bulYyBkxrDGoW5n4oCmDQoNCi0gQmnhur9uIGdp4bqjaSB0aMOtY2g6IFwoIHhfe2kxfSwgXGxkb3RzLCB4X3tpcH0gXCkgduG7m2kgXChpPTEsIFxsZG90cywgblwpLg0KDQoqKk3DtCBow6xuaCBHTE0gxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBuaMawIHNhdToqKg0KDQpcWw0KZyhcbXVfaSkgPSBcZXRhX2kgPSBcbWF0aGJme3h9X2leVCBcYm9sZHN5bWJvbHtcYmV0YX0NClxdDQoNCnbhu5tpDQoNClxbDQpcbXVfaSA9IEVbeV9pXSA9IGdeey0xfShcbWF0aGJme3h9X2leVCBcYm9sZHN5bWJvbHtcYmV0YX0pDQpcXQ0KDQpN4bulYyB0acOqdSBsw6AgdMOsbSDGsOG7m2MgbMaw4bujbmcgXChcaGF0e1xib2xkc3ltYm9se1xiZXRhfX1cKSBzYW8gY2hvIGjDoG0gbG9nLWxpa2VsaWhvb2QgxJHhuqF0IGPhu7FjIMSR4bqhaToNCg0KXFsNClxlbGwoXGJvbGRzeW1ib2x7XGJldGF9KSA9IFxzdW1fe2k9MX1ebiBcbG9nIGYoeV9pOyBcdGhldGFfaSkNClxdDQoNCioqVHJvbmcgxJHDszoqKg0KDQotIFwoZih5X2k7IFx0aGV0YV9pKVwpIGzDoCBow6BtIG3huq10IMSR4buZIHjDoWMgc3XhuqV0IChob+G6t2MgaMOgbSBraOG7kWkgeMOhYyBzdeG6pXQpIGPhu6dhIGJp4bq/biBcKHlfaVwpLA0KDQotIFwoXHRoZXRhX2lcKSBsw6AgdGhhbSBz4buRIHThu7Egbmhpw6puIHRyb25nIHBow6JuIHBo4buRaSB0aHXhu5ljIGjhu40gaMOgbSBtxaksDQoNCi0gXChcdGhldGFfaVwpIGPDsyBxdWFuIGjhu4cgduG7m2kgXChcbXVfaVwpLCB04burIMSRw7MgbGnDqm4gaOG7hyB24bubaSBcKFxib2xkc3ltYm9se1xiZXRhfVwpLg0KDQpWaeG7h2MgxrDhu5tjIGzGsOG7o25nIG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gYuG6sW5nIHBoxrDGoW5nIHBow6FwICoqaOG7o3AgbMO9IHThu5FpIMSRYSAoTUxFKSoqLCBz4butIGThu6VuZyB0aHXhuq10IHRvw6FuICoqSXRlcmF0aXZlbHkgUmV3ZWlnaHRlZCBMZWFzdCBTcXVhcmVzIChJUkxTKSoqLg0KDQojIyMgKio2LjMgUGjGsMahbmcgcGjDoXAgSVJMUyAoSXRlcmF0aXZlbHkgUmV3ZWlnaHRlZCBMZWFzdCBTcXVhcmVzKSoqDQoNCioqMS4gVGh14bqtdCB0b8OhbiBJUkxTIChJdGVyYXRpdmVseSBSZXdlaWdodGVkIExlYXN0IFNxdWFyZXMpOioqDQoNCkdMTSBz4butIGThu6VuZyB0aHXhuq10IHRvw6FuIElSTFMgxJHhu4MgdMOsbSDGsOG7m2MgbMaw4bujbmcgXChcaGF0e1xib2xkc3ltYm9se1xiZXRhfX1cKS4gVGh14bqtdCB0b8OhbiBk4buxYSB0csOqbiB2aeG7h2MgbOG6t3AgbOG6oWkgY8OhYyBixrDhu5tjIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGPDsyB0cuG7jW5nIHPhu5EuDQoNCioqMi4gw50gdMaw4bufbmcgY8ahIGLhuqNuOioqDQoNCi0g4bueIG3hu5dpIHbDsm5nIGzhurdwLCBtw7QgaMOsbmggR0xNIMSRxrDhu6NjIHjhuqVwIHjhu4kgYuG6sW5nIG3hu5l0IGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHbhu5tpIHRy4buNbmcgc+G7kS4NCg0KLSAqKkJp4bq/biBnaeG6oyAod29ya2luZyByZXNwb25zZSkqKiBcKCBcbWF0aGJme3p9IFwpIHbDoCAqKm1hIHRy4bqtbiB0cuG7jW5nIHPhu5EqKiBcKCBcbWF0aGJme1d9IFwpIMSRxrDhu6NjIGPhuq1wIG5o4bqtdCBsacOqbiB04bulYyDhu58gbeG7l2kgYsaw4bubYy4NCg0KKiozLiBI4buHIHBoxrDGoW5nIHRyw6xuaCBJUkxTOioqDQoNClxbDQpcbWF0aGJme1h9XlQgXG1hdGhiZntXfSBcbWF0aGJme1h9IFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fSA9IFxtYXRoYmZ7WH1eVCBcbWF0aGJme1d9IFxtYXRoYmZ7en0NClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXChcbWF0aGJme1h9XCkgbMOgIG1hIHRy4bqtbiB0aGnhur90IGvhur8sDQoNCi0gXChcbWF0aGJme1d9XCkgbMOgIG1hIHRy4bqtbiB0cuG7jW5nIHPhu5Ega8OtY2ggdGjGsOG7m2MgXChuIFx0aW1lcyBuXCksDQoNCi0gXChcbWF0aGJme3p9XCkgbMOgIHZlY3RvciBiaeG6v24gZ2nhuqMgXChuIFx0aW1lcyAxXCksIHTDrW5oIHRoZW8gY8O0bmcgdGjhu6ljOg0KDQpcWw0Kel9pID0gXGV0YV9pICsgXGZyYWN7eV9pIC0gXG11X2l9e1xmcmFje2QgXG11X2l9e2QgXGV0YV9pfX0NClxdDQoNCi0gVHLhu41uZyBz4buRIFwoV19pXCkgxJHGsOG7o2MgdMOtbmggdGhlbzoNCg0KXFsNCldfaSA9IFxsZWZ0KFxmcmFje2QgXG11X2l9e2QgXGV0YV9pfVxyaWdodCleMiBcQmlnLyBcbWF0aHJte1Zhcn0oeV9pKQ0KXF0NCg0KUXXDoSB0csOsbmggbsOgeSDEkcaw4bujYyBs4bq3cCBs4bqhaSBjaG8gxJHhur9uIGtoaSBjw6FjIMaw4bubYyBsxrDhu6NuZyBcKFxib2xkc3ltYm9se1xiZXRhfVwpIGjhu5lpIHThu6UuDQoNCiMjIyAqKjYuNCBIw6BtIMSRaeG7g20sIG1hIHRy4bqtbiBGaXNoZXIgdsOgIHBoxrDGoW5nIHNhaSBj4bunYSDGsOG7m2MgbMaw4bujbmcqKg0KDQoqKkjDoG0gxJFp4buDbSAoU2NvcmUgRnVuY3Rpb24pKioNCg0KSMOgbSDEkWnhu4NtIGzDoCDEkeG6oW8gaMOgbSBj4bunYSBsb2ctbGlrZWxpaG9vZCB0aGVvIHZlY3RvciBo4buHIHPhu5EgXChcYm9sZHN5bWJvbHtcYmV0YX1cKToNCg0KXFsNClUoXGJvbGRzeW1ib2x7XGJldGF9KSA9IFxmcmFje1xwYXJ0aWFsIFxlbGwoXGJvbGRzeW1ib2x7XGJldGF9KX17XHBhcnRpYWwgXGJvbGRzeW1ib2x7XGJldGF9fQ0KXF0NCg0KxJDDonkgbMOgIGjhu4cgcGjGsMahbmcgdHLDrG5oIG3DoCBraGkgZ2nhuqNpIFwoVShcYm9sZHN5bWJvbHtcYmV0YX0pID0gMFwpLCB0YSB0aHUgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGPhu7FjIMSR4bqhaSBcKFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fVwpLg0KDQoNCioqTWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyKioNCg0KTWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyIGzDoCBr4buzIHbhu41uZyDDom0gY+G7p2EgxJHhuqFvIGjDoG0gYuG6rWMgaGFpIGPhu6dhIGxvZy1saWtlbGlob29kOg0KDQpcWw0KXG1hdGhjYWx7SX0oXGJvbGRzeW1ib2x7XGJldGF9KSA9IC0gXG1hdGhiYntFfSBcbGVmdFsgXGZyYWN7XHBhcnRpYWxeMiBcZWxsKFxib2xkc3ltYm9se1xiZXRhfSl9e1xwYXJ0aWFsIFxib2xkc3ltYm9se1xiZXRhfSBcLCBccGFydGlhbCBcYm9sZHN5bWJvbHtcYmV0YX1eVH0gXHJpZ2h0XQ0KXF0NCg0KTWEgdHLhuq1uIG7DoHkgxJHDs25nIHZhaSB0csOyIG5oxrAgbeG7mXQgdGjGsOG7m2MgxJFvIMSR4buZICJz4bqvYyBuw6l0IiBj4bunYSBsb2ctbGlrZWxpaG9vZCB04bqhaSDEkWnhu4NtIGPhu7FjIMSR4bqhaSB2w6AgxJHGsOG7o2MgZMO5bmcgxJHhu4MgxJHDoW5oIGdpw6EgxJHhu5kgY2jDrW5oIHjDoWMgY+G7p2EgxrDhu5tjIGzGsOG7o25nLg0KDQoNCioqUGjGsMahbmcgc2FpIGPhu6dhIFwoXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19XCkqKg0KDQpLaGkgxJHDoyBjw7MgbWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyLCBwaMawxqFuZyBzYWkgaGnhu4dwIHBoxrDGoW5nIHNhaSBj4bunYSB2ZWN0b3IgaOG7hyBz4buRIMaw4bubYyBsxrDhu6NuZyDEkcaw4bujYyB0w61uaCBsw6A6DQoNClxbDQpcbWF0aHJte1Zhcn0oXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19KSA9IFxtYXRoY2Fse0l9KFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fSleey0xfQ0KXF0NCg0KTuG6v3Ugc+G7rSBk4bulbmcgdGh14bqtdCB0b8OhbiAqKklSTFMqKiwgbWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyIMSRxrDhu6NjIHjhuqVwIHjhu4kgYuG7n2k6DQoNClxbDQpcbWF0aHJte1Zhcn0oXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19KSA9IChcbWF0aGJme1h9XlQgXG1hdGhiZntXfSBcbWF0aGJme1h9KV57LTF9DQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQotIFwoXG1hdGhiZntYfVwpOiBtYSB0cuG6rW4gdGhp4bq/dCBr4bq/LA0KDQotIFwoXG1hdGhiZntXfVwpOiBtYSB0cuG6rW4gdHLhu41uZyBz4buRIHThuqFpIG5naGnhu4dtIGjhu5lpIHThu6UsDQoNCi0gQ8O0bmcgdGjhu6ljIG7DoHkgeHXhuqV0IGhp4buHbiB04buxIG5oacOqbiB04burIGLGsOG7m2MgZ2nhuqNpIGjhu4cgcGjGsMahbmcgdHLDrG5oIElSTFMuDQoNCg0KKipHaGkgY2jDuioqDQoNCi0gQ8O0bmcgdGjhu6ljIHBoxrDGoW5nIHNhaSB0csOqbiBy4bqldCBxdWFuIHRy4buNbmcgxJHhu4MgdMOtbmgga2hv4bqjbmcgdGluIGPhuq15IHbDoCBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB0cm9uZyBHTE0uDQoNCi0gVuG7m2kgY8OhYyBtw7QgaMOsbmggbOG7m24sIG1hIHRy4bqtbiBcKChcbWF0aGJme1h9XlQgXG1hdGhiZntXfSBcbWF0aGJme1h9KV57LTF9XCkgdGjGsOG7nW5nIMSRxrDhu6NjIHTDrW5oIHRow7RuZyBxdWEgZ2nhuqNpIGjhu4cgcGjGsMahbmcgdHLDrG5oIHRoYXkgdsOsIMSR4bqjbyB0cuG7sWMgdGnhur9wIMSR4buDIHRyw6FuaCBzYWkgc+G7kSBz4buRIGjhu41jLg0KDQojIyMgKio2LjUgU2FpIHPhu5EgY2h14bqpbiB2w6Aga2hv4bqjbmcgdGluIGPhuq15KioNCg0KKipTYWkgc+G7kSBjaHXhuqluIChTdGFuZGFyZCBFcnJvcikqKg0KDQpTYXUga2hpIGPDsyDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgXChcaGF0e1xib2xkc3ltYm9se1xiZXRhfX1cKSB2w6AgbWEgdHLhuq1uIHBoxrDGoW5nIHNhaSBoaeG7h3AgcGjGsMahbmcgc2FpIFwoXG1hdGhybXtWYXJ9KFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fSlcKSwgdGEgdMOtbmggKipzYWkgc+G7kSBjaHXhuqluKiogY2hvIHThu6tuZyBo4buHIHPhu5EgXChcaGF0e1xiZXRhfV9qXCkgbmjGsCBzYXU6DQoNClxbDQpcbWF0aHJte1NFfShcaGF0e1xiZXRhfV9qKSA9IFxzcXJ0e1tcbWF0aHJte1Zhcn0oXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19KV1fe2pqfX0NClxdDQoNClRyb25nIMSRw7MsIFwoW1xjZG90XV97amp9XCkgbMOgIHBo4bqnbiB04butIGjDoG5nIFwoalwpLCBj4buZdCBcKGpcKSB0cm9uZyBtYSB0cuG6rW4gcGjGsMahbmcgc2FpLg0KDQoNCioqS2hv4bqjbmcgdGluIGPhuq15IFwoMTAwKDEgLSBcYWxwaGEpXCVcKSoqDQoNCktob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIFwoXGhhdHtcYmV0YX1falwpIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBjw7RuZyB0aOG7qWM6DQoNClxbDQpcaGF0e1xiZXRhfV9qIFxwbSB6X3tcYWxwaGEvMn0gXGNkb3QgXG1hdGhybXtTRX0oXGhhdHtcYmV0YX1faikNClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXCh6X3tcYWxwaGEvMn1cKSBsw6AgYsOhY2ggcGjDom4gduG7iyBcKDEgLSBcYWxwaGEvMlwpIGPhu6dhIHBow6JuIHBo4buRaSBjaHXhuqluIGNodeG6qW4gaMOzYSAodGjGsOG7nW5nIHRyYSB04burIGLhuqNuZyBaKSwNCg0KLSBWw60gZOG7pTogduG7m2kgXChcYWxwaGEgPSAwLjA1XCksIFwoel97MC4wMjV9IFxhcHByb3ggMS45NlwpICh0xrDGoW5nIOG7qW5nIGtob+G6o25nIHRpbiBj4bqteSA5NSUpLg0KDQoNCioqS2nhu4NtIMSR4buLbmggV2FsZCoqDQoNCktp4buDbSDEkeG7i25oIFdhbGQgZ2nDunAgxJHDoW5oIGdpw6EgZ2nhuqMgdGh1eeG6v3Q6DQoNClxbDQpIXzA6IFxiZXRhX2ogPSAwIFxxdWFkIFx0ZXh0e3ZzfSBccXVhZCBIXzE6IFxiZXRhX2ogXG5lcSAwDQpcXQ0KDQpUaOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaDoNCg0KXFsNClogPSBcZnJhY3tcaGF0e1xiZXRhfV9qfXtcbWF0aHJte1NFfShcaGF0e1xiZXRhfV9qKX0gXHNpbSBcbWF0aGNhbHtOfSgwLCAxKQ0KXF0NCg0KROG7sWEgdsOgbyBnacOhIHRy4buLIFwoWlwpLCB0YSBjw7MgdGjhu4MgdMOtbmggcC12YWx1ZSB2w6AgxJHGsGEgcmEga+G6v3QgbHXhuq1uIHRo4buRbmcga8OqLg0KDQoNCioqR2hpIGNow7oqKg0KDQotIEtp4buDbSDEkeG7i25oIFdhbGQgxJHGsOG7o2MgZMO5bmcgcGjhu5UgYmnhur9uIGRvIHTDrW5oIMSRxqFuIGdp4bqjbiB2w6AgY8OzIHRo4buDIHRo4buxYyBoaeG7h24gbmdheSBzYXUga2hpIGPDsyDGsOG7m2MgbMaw4bujbmcgdsOgIHBoxrDGoW5nIHNhaS4NCg0KLSBO4bq/dSBcKCB8WnwgPiB6X3tcYWxwaGEvMn0gXCksIGLDoWMgYuG7jyBcKEhfMFwpLCB04bupYyBsw6AgaOG7hyBz4buRIFwoXGJldGFfalwpIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCiMjIyAqKjYuNiDGr+G7m2MgbMaw4bujbmcgdGhhbSBz4buRIHBow6JuIHTDoW4qKg0KDQpUcm9uZyBt4buZdCBz4buRIG3DtCBow6xuaCBHTE0sIMSR4bq3YyBiaeG7h3QgbMOgIGtoaSBwaMOibiBwaOG7kWkgdGh14buZYyBo4buNIHBow6JuIHBo4buRaSBtxakgKGV4cG9uZW50aWFsIGZhbWlseSkgKipraMO0bmcgY2h14bqpbiBow7NhKiosIHRhIGPhuqduIMaw4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EgcGjDom4gdMOhbiBcKFxwaGlcKS4NCg0KKipDw7RuZyB0aOG7qWMgxrDhu5tjIGzGsOG7o25nOioqDQoNCiQkDQpcaGF0e1xwaGl9ID0gXGZyYWN7MX17biAtIHB9IFxzdW1fe2k9MX1ee259IFxmcmFjeyh5X2kgLSBcaGF0e1xtdX1faSleMn17VihcaGF0e1xtdX1faSl9DQokJA0KDQoqKlRyb25nIMSRw7M6KioNCg0KLSBcKG5cKTogc+G7kSBxdWFuIHPDoXQgIA0KDQotIFwocFwpOiBz4buRIHRoYW0gc+G7kSB0cm9uZyBtw7QgaMOsbmggKGJhbyBn4buTbSBo4buHIHPhu5EgY2jhurduIG7hur91IGPDsykgIA0KDQotIFwoXGhhdHtcbXV9X2kgPSBcbWF0aGJie0V9W3lfaV0gPSBnXnstMX0oXGV0YV9pKVwpOiBnacOhIHRy4buLIGvhu7MgduG7jW5nIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyAgDQoNCi0gXChWKFxoYXR7XG11fV9pKVwpOiBow6BtIHBoxrDGoW5nIHNhaSwgcGjhu6UgdGh14buZYyB2w6BvIHBow6JuIHBo4buRaToNCg0KfCBQaMOibiBwaOG7kWkgICAgICAgIHwgSMOgbSBwaMawxqFuZyBzYWkgXChWKFxtdSlcKSAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBHYXVzc2lhbiAgICAgICAgIHwgXCgxXCkgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBQb2lzc29uICAgICAgICAgIHwgXChcbXVcKSAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBCaW5vbWlhbCAobG9naXQpIHwgXChcbXUoMSAtIFxtdSlcKSAgICAgICAgICAgICAgfA0KDQoNCiMjICoqQ0jGr8agTkcgNzogR0VORVJBTElaRUQgTElORUFSIE1PREVMUzogSU5GRVJFTkNFICoqDQrEkMOBTkggR0nDgSBN4buoQyDEkOG7mCBQSMOZIEjhu6JQIFbDgCBM4buwQSBDSOG7jE4gTcOUIEjDjE5IIFRST05HIEdMTQ0KDQojIyMgKio3LjEgR2nhu5tpIHRoaeG7h3UqKg0KDQpTYXUga2hpIMaw4bubYyBsxrDhu6NuZyBjw6FjIHRoYW0gc+G7kSAkXGJldGEkIHRyb25nIEdMTSwgYsaw4bubYyB0aeG6v3AgdGhlbyBsw6AgxJHDoW5oIGdpw6EgeGVtIG3DtCBow6xuaCBjw7MgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdSBraMO0bmcsIHbDoCBu4bq/dSBjw7Mgbmhp4buBdSBtw7QgaMOsbmggY+G6oW5oIHRyYW5oLCB0aMOsIG7Dqm4gY2jhu41uIG3DtCBow6xuaCBuw6BvIGzDoCB04buRdCBuaOG6pXQuDQoNCioqQ8OhYyBjw7RuZyBj4bulIMSRw6FuaCBnacOhIGJhbyBn4buTbToqKg0KDQotIERldmlhbmNlICjEkeG7mSBs4buHY2gpDQoNCi0gS2nhu4NtIMSR4buLbmggJFxjaGleMiQNCg0KLSBBSUMsIEJJQw0KDQotIFNvIHPDoW5oIG3DtCBow6xuaCBs4buTbmcgdsOgIGtow7RuZyBs4buTbmcNCg0KLSDEkOG7kyB0aOG7iyBwaOG6p24gZMawIHbDoCDEkWnhu4NtIOG6o25oIGjGsOG7n25nDQoNCiMjIyAqKjcuMiBEZXZpYW5jZSDigJMgxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oKioNCg0KKirEkOG7i25oIG5naMSpYToqKg0KDQpEZXZpYW5jZSBsw6AgxJHhuqFpIGzGsOG7o25nIMSRbyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgbcO0IGjDrG5oIGhp4buHbiB04bqhaSB2w6AgbcO0IGjDrG5oIMSR4bqneSDEkeG7pyAoc2F0dXJhdGVkIG1vZGVsKSDigJMgdOG7qWMgbcO0IGjDrG5oIGto4bubcCBob8OgbiB0b8OgbiB24bubaSBk4buvIGxp4buHdS4NCg0KJCQNCkQoeTsgXGhhdHtcbXV9KSA9IDIgXGxlZnRbIFxlbGwoeTsgeSkgLSBcZWxsKFxoYXR7XG11fTsgeSkgXHJpZ2h0XQ0KJCQNCg0KKipHaeG6o2kgdGjDrWNoIGvDvSBoaeG7h3U6KioNCg0KLSAkXGVsbCh5OyB5KSQ6IGxvZy1saWtlbGlob29kIGPhu6dhIG3DtCBow6xuaCBiw6NvIGjDsmEgKHNhdHVyYXRlZCBtb2RlbCkNCg0KLSAkXGVsbChcaGF0e1xtdX07IHkpJDogbG9nLWxpa2VsaWhvb2QgY+G7p2EgbcO0IGjDrG5oIMSRYW5nIHjDqXQNCg0KXChcUmlnaHRhcnJvd1wpIERldmlhbmNlIGPDoG5nIG5o4buPIOKGkiBtw7QgaMOsbmggY8OgbmcgZ+G6p24gduG7m2kgbcO0IGjDrG5oIGLDo28gaMOyYSDihpIgcGjDuSBo4bujcCBoxqFuLg0KDQojIyMgKio3LjMgU28gc8OhbmggbcO0IGjDrG5oIGLhurFuZyBraeG7g20gxJHhu4tuaCBkZXZpYW5jZSoqDQoNCktoaSBoYWkgbcO0IGjDrG5oIGzhu5NuZyBuaGF1LCB0YSBjw7MgdGjhu4Mgc28gc8OhbmggYuG6sW5nIGtp4buDbSDEkeG7i25oIHNhaSBiaeG7h3QgZGV2aWFuY2U6DQoNCioqQ8O0bmcgdGjhu6ljIGtp4buDbSDEkeG7i25oOioqDQoNCiQkDQpcRGVsdGEgRCA9IERfe1x0ZXh0e3JlZHVjZWR9fSAtIERfe1x0ZXh0e2Z1bGx9fSBcc2ltIFxjaGleMl97ZGZ9DQokJA0KDQoqKlRyb25nIMSRw7M6KioNCg0KLSAkZGYkOiBz4buRIHRoYW0gc+G7kSBi4buLIHLDoG5nIGJ14buZYyB0cm9uZyBtw7QgaMOsbmggbmjhu48gaMahbg0KDQpcKFxSaWdodGFycm93XCkgTuG6v3UgJFxEZWx0YSBEJCBs4bubbiB2w6AgcC12YWx1ZSBuaOG7jyDihpIgbcO0IGjDrG5oIMSR4bqneSDEkeG7pyB04buRdCBoxqFuLg0KDQojIyMgKio3LjQgQUlDIHbDoCBCSUMg4oCTIGzhu7FhIGNo4buNbiBnaeG7r2EgY8OhYyBtw7QgaMOsbmgga2jDtG5nIGzhu5NuZyoqDQoNCktoaSBjw6FjIG3DtCBow6xuaCBraMO0bmcgbOG7k25nIG5oYXUsIHRhIGTDuW5nIHRpw6p1IGNow60gdGjDtG5nIHRpbiDEkeG7gyBzbyBzw6FuaDoNCg0KKipBSUMgKEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24pOioqDQoNCiQkDQpBSUMgPSAtMlxlbGwgKyAyaw0KJCQNCg0KLSAkXGVsbCQ6IGxvZy1saWtlbGlob29kICANCg0KLSAkayQ6IHPhu5EgdGhhbSBz4buRIHRyb25nIG3DtCBow6xuaA0KDQoqKkJJQyAoQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uKToqKg0KDQokJA0KQklDID0gLTJcZWxsICsgXGxvZyhuKSBcY2RvdCBrDQokJA0KDQotICRuJDogc+G7kSBxdWFuIHPDoXQNCg0KXChcUmlnaHRhcnJvd1wpIENo4buNbiBtw7QgaMOsbmggY8OzIEFJQy9CSUMgKip0aOG6pXAgaMahbioqLiAgDQogDQpcKFxSaWdodGFycm93XCkgQklDIHBo4bqhdCBjw6FjIG3DtCBow6xuaCBwaOG7qWMgdOG6oXAgKipuaGnhu4F1IGjGoW4qKiBzbyB24bubaSBBSUMuDQoNCg0KDQojIyMgKio3LjUgxJDhu5MgdGjhu4sgY2jhuqluIMSRb8OhbiB2w6AgcGjhuqduIGTGsCoqDQoNCioqUGjhuqduIGTGsCAocmVzaWR1YWxzKToqKg0KDQotICoqUGjhuqduIGTGsCB0aMO0IChyYXcgcmVzaWR1YWwpOioqDQoNCiQkDQplX2kgPSB5X2kgLSBcaGF0e1xtdX1faQ0KJCQNCg0KLSAqKlBo4bqnbiBkxrAgUGVhcnNvbjoqKg0KDQokJA0Kcl9pID0gXGZyYWN7eV9pIC0gXGhhdHtcbXV9X2l9e1xzcXJ0e1YoXGhhdHtcbXV9X2kpfX0NCiQkDQoNCi0gKipQaOG6p24gZMawIGRldmlhbmNlOioqDQoNCiQkDQpkX2kgPSBcdGV4dHtzaWdufSh5X2kgLSBcaGF0e1xtdX1faSkgXGNkb3QgXHNxcnR7MlxsZWZ0W1xlbGwoeV9pOyB5X2kpIC0gXGVsbChcaGF0e1xtdX1faTsgeV9pKVxyaWdodF19DQokJA0KDQoqKkJp4buDdSDEkeG7kyBraeG7g20gdHJhIG3DtCBow6xuaCAoRGlhZ25vc3RpYyBwbG90cyk6KioNCg0KLSBSZXNpZHVhbHMgdnMgRml0dGVkDQoNCi0gTm9ybWFsIFEtUSAobuG6v3UgbcO0IGjDrG5oIGfhuqduIHBow6JuIHBo4buRaSBjaHXhuqluKQ0KDQotIFNjYWxlLUxvY2F0aW9uIHBsb3QNCg0KLSBDb29r4oCZcyBkaXN0YW5jZSB2cyBMZXZlcmFnZQ0KDQpDw6FjIGJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHBow6F0IGhp4buHbiAqKsSRaeG7g20gbmdv4bqhaSBsYWkqKiB2w6AgKirEkWnhu4NtIOG6o25oIGjGsOG7n25nIG3huqFuaCoqIMSR4bq/biBtw7QgaMOsbmguDQoNCg0KDQojIyMgKio3LjYgS2nhu4NtIMSR4buLbmggUGVhcnNvbiBDaGktc3F1YXJlKioNCg0KUGjDqXAga2nhu4NtIMSR4buLbmggUGVhcnNvbiDEkW8gc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGThu68gbGnhu4d1IHF1YW4gc8OhdCB2w6AgZ2nDoSB0cuG7iyBr4buzIHbhu41uZyB04burIG3DtCBow6xuaDoNCg0KJCQNClheMiA9IFxzdW1fe2k9MX1ebiBcZnJhY3soeV9pIC0gXGhhdHtcbXV9X2kpXjJ9e1YoXGhhdHtcbXV9X2kpfQ0KJCQNCg0KTuG6v3UgJFheMiQgbOG7m24gaMahbiBt4bupYyBr4buzIHbhu41uZyB0aGVvIHBow6JuIHBo4buRaSAkXGNoaV4yX3tkZn0kIOKGkiBtw7QgaMOsbmggY8OzIHRo4buDICoqa2jDtG5nIHBow7kgaOG7o3AqKiB24bubaSBk4buvIGxp4buHdS4NCg0KIyMjICoqNy43IMSQ4buZIHBow6JuIHTDoW4gdsOgIHbhuqVuIMSR4buBIG92ZXJkaXNwZXJzaW9uKioNCg0KTeG7mXQgc+G7kSBtw7QgaMOsbmggR0xNIG5oxrAgKipQb2lzc29uKiogaG/hurdjICoqQmlub21pYWwqKiBnaeG6oyDEkeG7i25oIGjhu4cgc+G7kSBwaMOibiB0w6FuIGzDoDoNCg0KJCQNClxwaGkgPSAxDQokJA0KDQpUdXkgbmhpw6puLCB0cm9uZyB0aOG7sWMgdOG6vywgbuG6v3UgKipwaMawxqFuZyBzYWkgcXVhbiBzw6F0KiogbOG7m24gaMahbiAqKnBoxrDGoW5nIHNhaSBsw70gdGh1eeG6v3QqKiwgdGEgZ+G7jWkgbMOgICoqb3ZlcmRpc3BlcnNpb24qKiAocXXDoSBwaMOibiB0w6FuKS4NCg0KKipLaeG7g20gdHJhIG92ZXJkaXNwZXJzaW9uKio6DQoNCkjhu4cgc+G7kSBwaMOibiB0w6FuIMaw4bubYyBsxrDhu6NuZyDEkcaw4bujYyB0w61uaCB0aGVvIGPDtG5nIHRo4bupYzoNCg0KJCQNClxoYXR7XHBoaX0gPSBcZnJhY3tcdGV4dHtEZXZpYW5jZX19e24gLSBwfQ0KJCQNCg0KLSAkbiQ6IHPhu5EgcXVhbiBzw6F0ICANCg0KLSAkcCQ6IHPhu5EgdGhhbSBz4buRIHRyb25nIG3DtCBow6xuaA0KDQpcKFxSaWdodGFycm93XCkgTuG6v3U6DQoNCiQkDQpcaGF0e1xwaGl9ID4gMS41DQokJA0KDQrihpIgTcO0IGjDrG5oICoqY8OzIHRo4buDIGLhu4sgb3ZlcmRpc3BlcnNlZCoqIChxdcOhIHBow6JuIHTDoW4pDQoNClwoXFJpZ2h0YXJyb3dcKSBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgY+G6p24gxJFp4buBdSBjaOG7iW5oIG3DtCBow6xuaCwgdsOtIGThu6U6DQoNCi0gU+G7rSBk4bulbmcgKipxdWFzaS1Qb2lzc29uKioNCg0KLSBIb+G6t2MgKipOZWdhdGl2ZSBCaW5vbWlhbCoqDQoNCiMjICoqQ0jGr8agTkcgODogSOG7kkkgUVVZIExPR0lTVElDIChMT0dJU1RJQyBSRUdSRVNTSU9OKSoqDQoNCiMjIyAqKjguMSBHaeG7m2kgdGhp4buHdSoqDQoNCkjhu5NpIHF1eSBsb2dpc3RpYyBsw6AgbeG7mXQgdHJvbmcgbmjhu69uZyBtw7QgaMOsbmggcGjhu5UgYmnhur9uIG5o4bqldCB0aHXhu5ljIGjhu40gR0xNLCDEkcaw4bujYyBkw7luZyDEkeG7gyBtw7QgaMOsbmggaMOzYSBk4buvIGxp4buHdSBuaOG7iyBwaMOibiAoYmluYXJ5KSwgdOG7qWMga2hpIGJp4bq/biBwaOG6o24gaOG7k2kNCg0KXFsNCnkgXGluIFx7MCwxXH0NClxdDQoNClbDrSBk4bulOiBi4buHbmgva2jDtG5nIGLhu4duaCwgbXVhL2tow7RuZyBtdWEsIMSR4bqhdC9raMO0bmcgxJHhuqF0Lg0KDQrEkOG6t2MgxJFp4buDbTogIA0KXFsNClxtdV9pID0gRVt5X2ldID0gUCh5X2k9MSkgXGluICgwLDEpDQpcXQ0KDQpT4butIGThu6VuZyBow6BtIGxpw6puIGvhur90IGxvZ2l0OiAgDQpcWw0KZyhcbXVfaSkgPSBcbG9nXGxlZnQoXGZyYWN7XG11X2l9ezEtXG11X2l9XHJpZ2h0KSA9IFxldGFfaSA9IHhfaV5UIFxiZXRhDQpcXQ0KDQoNCg0KIyMjICoqOC4yIFBow6JuIHBo4buRaSBCZXJub3VsbGkgdsOgIGjDoG0gbG9nLWxpa2VsaWhvb2QqKg0KDQpCaeG6v24gcGjhuqNuIGjhu5NpICANCg0KXFsNCnlfaSBcaW4gXHswLDFcfQ0KXF0gIA0KcGjDom4gcGjhu5FpIHRoZW86ICANCg0KXFsNCnlfaSBcc2ltIFx0ZXh0e0Jlcm5vdWxsaX0oXHBpX2kpDQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQpcWw0KXHBpX2kgPSBQKHlfaT0xKQ0KXF0gIA0KdsOgOiAgDQpcWw0KXGxvZ1xsZWZ0KFxmcmFje1xwaV9pfXsxLVxwaV9pfVxyaWdodCkgPSB4X2leVCBcYmV0YQ0KXF0NCg0KTG9nLWxpa2VsaWhvb2QgY2hvIHRvw6BuIGLhu5kgbeG6q3U6ICANClxbDQpcZWxsKFxiZXRhKSA9IFxzdW1fe2k9MX1ebiBcbGVmdFsgeV9pIFxsb2coXHBpX2kpICsgKDEgLSB5X2kpIFxsb2coMS1ccGlfaSkgXHJpZ2h0XQ0KXF0NCg0KS2jDtG5nIGPDsyBuZ2hp4buHbSBnaeG6o2kgdMaw4budbmcgbWluaCDihpIgZMO5bmcgSVJMUyDEkeG7gyB0w6xtIFwoXGhhdHtcYmV0YX1cKS4NCg0KDQojIyMgKio4LjMgRGnhu4VuIGdp4bqjaSBo4buHIHPhu5EgaOG7k2kgcXV5IHRyb25nIGxvZ2lzdGljIHJlZ3Jlc3Npb24qKg0KDQpLaGkgZMO5bmcgbG9naXQgbGluazogIA0KXFsNClxldGFfaSA9IFxsb2dcbGVmdChcZnJhY3tccGlfaX17MS1ccGlfaX1ccmlnaHQpID0geF9pXlQgXGJldGENClxdDQoNCuKGkiBcKFxiZXRhX2pcKSDEkeG6oWkgZGnhu4duIGNobyBsb2cgb2RkcyByYXRpbzogIA0KXFsNClx0ZXh0e09kZHMgcmF0aW99ID0gXGV4cChcYmV0YV9qKQ0KXF0NCg0KLSBO4bq/dSBcKFxiZXRhX2ogPiAwXCk6IGJp4bq/biBcKHhfalwpIGzDoG0gdMSDbmcga2jhuqMgbsSDbmcgXCh5PTFcKQ0KDQotIE7hur91IFwoXGJldGFfaiA8IDBcKTogYmnhur9uIFwoeF9qXCkgbMOgbSBnaeG6o20ga2jhuqMgbsSDbmcgXCh5PTFcKQ0KDQoNCg0KIyMjICoqOC40IEtob+G6o25nIHRpbiBj4bqteSB2w6Aga2nhu4NtIMSR4buLbmgqKg0KDQpTYXUga2hpIMaw4bubYyBsxrDhu6NuZyBcKFxoYXR7XGJldGF9XCksIHRhIGtp4buDbSDEkeG7i25oIHThu6tuZyBo4buHIHPhu5E6DQoNCktp4buDbSDEkeG7i25oIFdhbGQ6ICANClxbDQpaX2ogPSBcZnJhY3tcaGF0e1xiZXRhfV9qfXtTRShcaGF0e1xiZXRhfV9qKX0gXHNpbSBOKDAsMSkNClxdDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSU6ICANClxbDQpcaGF0e1xiZXRhfV9qIFxwbSB6X3swLjk3NX0gXGNkb3QgU0UoXGhhdHtcYmV0YX1faikNClxdDQoNCkNodXnhu4NuIHNhbmcgb2RkcyByYXRpbyBi4bqxbmcgIA0KXFsNClxleHAoXGhhdHtcYmV0YX1faikNClxdDQoNCg0KDQojIyMgKio4LjUgxJDDoW5oIGdpw6EgbcO0IGjDrG5oKioNCg0KRGV2aWFuY2U6ICANClxbDQpEID0gLTIgXGxlZnRbIFxlbGwoXGhhdHtcYmV0YX0pIC0gXGVsbF97XHRleHR7c2F0dXJhdGVkfX0gXHJpZ2h0XQ0KXF0NCg0KS2nhu4NtIMSR4buLbmggZGV2aWFuY2UgZ2nhu69hIG3DtCBow6xuaCDEkeG6p3kgxJHhu6cgdsOgIG3DtCBow6xuaCByw7p0IGfhu41uLg0KDQpQc2V1ZG8tXChSXjJcKTogIA0KXFsNClJeMiA9IDEgLSBcZnJhY3tEX3tcdGV4dHttb2RlbH19fXtEX3tcdGV4dHtudWxsfX19DQpcXQ0KDQoNCg0KIyMjICoqOC42IE3DtCBow6xuaCBow7NhIHbhu5tpIG5oaeG7gXUgYmnhur9uIChtdWx0aXBsZSBwcmVkaWN0b3JzKSoqDQoNCkPDsyB0aOG7gyBt4bufIHLhu5luZyBsb2dpc3RpYyByZWdyZXNzaW9uIMSR4buDIGJhbyBn4buTbSBuaGnhu4F1IGJp4bq/biBnaeG6o2kgdGjDrWNoOg0KDQpcWw0KXGxvZ1xsZWZ0KFxmcmFje1xwaV9pfXsxLVxwaV9pfVxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSB4X3tpMX0gKyBcY2RvdHMgKyBcYmV0YV9wIHhfe2lwfQ0KXF0NCg0K4oaSIE3DtCBow6xuaCDEkWEgYmnhur9uIGxvZ2lzdGljLg0KDQoNCiMjIyAqKjguNyBNw7QgaMOsbmggaMOzYSB04bu3IGzhu4cgKEdyb3VwZWQgYmlub21pYWwgbW9kZWwpKioNCg0KS2hpIGThu68gbGnhu4d1IGtow7RuZyBwaOG6o2kgdOG7q25nIHF1YW4gc8OhdCByacOqbmcgbOG6uywgbcOgIGzDoCB04buVbmcgaOG7o3AgIA0KXFsNClxmcmFje3lfaX17bl9pfQ0KXF0gIA0KdGEgZMO5bmc6ICANClxbDQp5X2kgXHNpbSBcdGV4dHtCaW5vbWlhbH0obl9pLCBccGlfaSkNClxdDQoNCkxvZy1saWtlbGlob29kOiAgDQpcWw0KXGVsbChcYmV0YSkgPSBcc3VtX3tpPTF9Xm4gXGxlZnRbIHlfaSBcbG9nKFxwaV9pKSArIChuX2kgLSB5X2kpIFxsb2coMS1ccGlfaSkgXHJpZ2h0XQ0KXF0NCg0KIyMgKipDSMavxqBORyA5OiBI4buSSSBRVVkgUE9JU1NPTiAoUE9JU1NPTiBSRUdSRVNTSU9OKSoqDQoNCiMjIyAqKjkuMSBHaeG7m2kgdGhp4buHdSB2w6Ag4bupbmcgZOG7pW5nIHRo4buxYyB04bq/KioNCg0KSOG7k2kgcXV5IFBvaXNzb24gbMOgIG3hu5l0IG3DtCBow6xuaCB0aHXhu5ljIGjhu40gR0xNLCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBtw7QgaMOsbmggaMOzYSBjw6FjIGJp4bq/biBwaOG6o24gaOG7k2kgbMOgIHPhu5EgbMaw4bujbmcgc+G7sSBraeG7h24gxJHhur9tIMSRxrDhu6NjIHRyw6puIG3hu5l0IMSRxqFuIHbhu4sgcXVhbiBzw6F0LCBjaOG6s25nIGjhuqFuIG5oxrA6DQoNCi0gU+G7kSBs4bqnbiBuaOG6rXAgdmnhu4duDQoNCi0gU+G7kSB24bulIHRhaSBu4bqhbiBnaWFvIHRow7RuZw0KDQotIFPhu5EgbOG7l2kgcGjhuqduIG3hu4FtIHBow6F0IHNpbmgNCg0KxJDhurdjIGJp4buHdCBwaMO5IGjhu6NwIGtoaToNCg0KLSBCaeG6v24gcGjhuqNuIGjhu5NpIFwoIHkgXGluIFx7MCwgMSwgMiwgXGxkb3RzIFx9IFwpDQoNCi0gROG7ryBsaeG7h3Uga2jDtG5nIMOibSwgcuG7nWkgcuG6oWMNCg0KLSBN4bulYyB0acOqdSBsw6AgxrDhu5tjIGzGsOG7o25nIHPhu5Egc+G7sSBraeG7h24gdHJ1bmcgYsOsbmggdGhlbyBjw6FjIMSR4bq3YyB0w61uaCBcKCB4IFwpDQoNCg0KIyMjICoqOS4yIFBow6JuIHBo4buRaSBQb2lzc29uIHbDoCBsacOqbiBr4bq/dCBsb2cqKg0KDQoqKkjDoG0geMOhYyBzdeG6pXQ6KiogIA0KXFsNClAoeV9pKSA9IFxmcmFje2Veey1cbXVfaX0gXG11X2lee3lfaX19e3lfaSF9LCBccXVhZCB5X2kgPSAwLCAxLCAyLCBcbGRvdHMNClxdDQoNClRyb25nIMSRw7M6DQoNClxbDQpcbXVfaSA9IEVbeV9pXSA6IFx0ZXh0e3Phu5Egc+G7sSBraeG7h24ga+G7syB24buNbmcgY+G7p2EgcXVhbiBzw6F0IHRo4bupIH0gaQ0KXF0NCg0KXFsNClx0ZXh0e1Zhcn0oeV9pKSA9IFxtdV9pIFxxdWFkIDogXHRleHR7xJHhurdjIMSRaeG7g20gdGhlbiBjaOG7kXR9DQpcXQ0KDQoqKkjDoG0gbGnDqm4ga+G6v3QgKGNhbm9uaWNhbCk6KioNCg0KXFsNClxldGFfaSA9IFxsb2coXG11X2kpID0geF9pXlQgXGJldGEgXGltcGxpZXMgXG11X2kgPSBlXnt4X2leVCBcYmV0YX0NClxdDQoNCioqSMOgbSBsb2cgxJHhuqNtIGLhuqNvOioqDQoNClxbDQpcbXVfaSA+IDANClxdDQoNCk3hu5FpIHF1YW4gaOG7hyB0dXnhur9uIHTDrW5oIHRyw6puIGxvZy1zY2FsZS4NCg0KDQojIyMgKio5LjMgSMOgbSBsb2ctbGlrZWxpaG9vZCB2w6AgcGjGsMahbmcgdHLDrG5oIMSRaeG7g20qKg0KDQoqKkxvZy1saWtlbGlob29kIGPhu6dhIG3DtCBow6xuaDoqKg0KDQpcWw0KXGVsbChcYmV0YSkgPSBcc3VtX3tpPTF9Xm4gXGxlZnRbIHlfaSBcbG9nKFxtdV9pKSAtIFxtdV9pIC0gXGxvZyh5X2khKSBccmlnaHRdDQpcXQ0KDQpUaGF5IFwoXG11X2kgPSBlXnt4X2leVCBcYmV0YX1cKSwgdGEgxJHGsOG7o2M6DQoNClxbDQpcZWxsKFxiZXRhKSA9IFxzdW1fe2k9MX1ebiBcbGVmdFsgeV9pIHhfaV5UIFxiZXRhIC0gZV57eF9pXlQgXGJldGF9IC0gXGxvZyh5X2khKSBccmlnaHRdDQpcXQ0KDQoqKlNjb3JlIGZ1bmN0aW9uICjEkeG6oW8gaMOgbSBsb2ctbGlrZWxpaG9vZCk6KioNCg0KXFsNClUoXGJldGEpID0gXHN1bV97aT0xfV5uIHhfaSAoeV9pIC0gXG11X2kpDQpcXQ0KDQpHaeG6o2kgcGjGsMahbmcgdHLDrG5oIFwoIFUoXGJldGEpID0gMCBcKSDihpIgdMOsbSBcKFxoYXR7XGJldGF9XCkgYuG6sW5nIElSTFMuDQoNCiMjIyAqKjkuNCBEaeG7hW4gZ2nhuqNpIGjhu4cgc+G7kSBo4buTaSBxdXkqKg0KDQpUcm9uZyBo4buTaSBxdXkgUG9pc3NvbjoNCg0KLSBN4buXaSBcKFxiZXRhX2pcKSBsw6AgdMOhYyDEkeG7mW5nIGxvZyB0dXnhur9uIHTDrW5oIMSR4bq/biBz4buRIHPhu7Ega2nhu4duIHRydW5nIGLDrG5oLg0KDQotIFwoZV57XGJldGFfan1cKSBsw6AgdOG7tyBs4buHIHRoYXkgxJHhu5VpIGvhu7MgduG7jW5nIFwoXG11XCkga2hpIFwoeF9qXCkgdMSDbmcgMSDEkcahbiB24buLLCBnaeG7ryBjw6FjIGJp4bq/biBraMOhYyBraMO0bmcgxJHhu5VpLg0KDQpWw60gZOG7pToNCg0KLSBcKFxiZXRhX2ogPSAwLjY5MyBcUmlnaHRhcnJvdyBlXnswLjY5M30gPSAyXCk6IHPhu5Egc+G7sSBraeG7h24ga+G7syB24buNbmcgZ+G6pXAgxJHDtGkga2hpIFwoeF9qXCkgdMSDbmcgMSDEkcahbiB24buLLg0KDQotIFwoXGJldGFfaiA9IC0wLjIyM1wpIOKGkiBnaeG6o20ga2hv4bqjbmcgMjAlLg0KDQoNCiMjIyAqKjkuNSBU4bu3IGzhu4cgeOG6o3kgcmEgJiBvZmZzZXQqKg0KDQoqKk9mZnNldCBsw6AgZ8OsPyoqICANCktoaSBxdWFuIHPDoXQga2jDtG5nIMSR4buTbmcgbmjhuqV0IHbhu4EgdGjhu51pIGdpYW4vcGjhuqFtIHZpLCBj4bqnbiDEkWnhu4F1IGNo4buJbmggYuG6sW5nIG9mZnNldC4NCg0KVsOtIGThu6U6DQoNCi0gUXVhbiBzw6F0IDE6IDUgdGFpIG7huqFuIHRyb25nIDEwIG5nw6B5DQoNCi0gUXVhbiBzw6F0IDI6IDIgdGFpIG7huqFuIHRyb25nIDIgbmfDoHkNCg0KS2jDtG5nIHRo4buDIHNvIHPDoW5oIHPhu5EgdHV54buHdCDEkeG7kWkg4oaSIGTDuW5nIHThu7cgbOG7hzogIA0KXFsNClxmcmFje1xtdV9pfXt0X2l9IFxpbXBsaWVzIFxsb2coXG11X2kpID0gXGxvZyh0X2kpICsgeF9pXlQgXGJldGENClxdDQoNClRyb25nIMSRw7MgXChcbG9nKHRfaSlcKSBsw6AgKipvZmZzZXQqKiDigJMga2jDtG5nIGPDsyBo4buHIHPhu5EsIG5oxrBuZyDEkcaw4bujYyDEkcawYSB2w6BvIG3DtCBow6xuaC4NCg0KDQojIyMgKio5LjYgT3ZlcmRpc3BlcnNpb24gKHBow6JuIHTDoW4gcXXDoSBt4bupYykqKg0KDQpUcm9uZyBsw70gdGh1eeG6v3Q6DQoNClxbDQpcbWF0aHJte1Zhcn0oeV9pKSA9IFxtdV9pDQpcXQ0KDQpOaMawbmcgdGjhu7FjIHThur8gdGjGsOG7nW5nIHRo4bqleToNCg0KXFsNClxtYXRocm17VmFyfSh5X2kpID4gXG11X2kgXHF1YWQgXFJpZ2h0YXJyb3cgXHF1YWQgXHRleHR7b3ZlcmRpc3BlcnNpb259DQpcXQ0KDQpOZ3V5w6puIG5ow6JuIGRvIGLhu48gc8OzdCBiaeG6v24gcXVhbiB0cuG7jW5nLCBxdcOhIG5oaeG7gXUgZ2nDoSB0cuG7iyAwLCBob+G6t2MgYmnhur9uIMSR4buZbmcgbmfhuqt1IG5oacOqbiB2xrDhu6N0IG3hu6ljLg0KDQoqKkjhu4cgc+G7kSBwaMOibiB0w6FuOioqDQoNClxbDQpcaGF0e1xwaGl9ID0gXGZyYWN7XHRleHR7RGV2aWFuY2V9fXtuIC0gcH0NClxdDQoNCk7hur91IFwoXGhhdHtccGhpfSA+IDEuNVwpIHRow6wgxJHDoW5nIGxvIG5n4bqhaS4NCg0KKipDw6FjaCB44butIGzDvToqKg0KDQotIFPhu60gZOG7pW5nIHF1YXNpLVBvaXNzb246IMSRaeG7gXUgY2jhu4luaCBwaMawxqFuZyBzYWkgbcOgIGtow7RuZyB0aGF5IMSR4buVaSBr4buzIHbhu41uZy4NCg0KLSBEw7luZyBOZWdhdGl2ZSBCaW5vbWlhbDogdGjDqm0gdGhhbSBz4buRIFwoXGFscGhhXCkgxJHhu4MgxJFp4buBdSBjaOG7iW5oIHBoxrDGoW5nIHNhaS4NCg0KDQojIyMgKio5LjcgxJDDoW5oIGdpw6EgbcO0IGjDrG5oKioNCg0KKipEZXZpYW5jZToqKiBraeG7g20gdHJhIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oLg0KDQoqKkFJQzoqKiBjaOG7jW4gbcO0IGjDrG5oIHThu5F0IG5o4bqldC4NCg0KKipLaeG7g20gxJHhu4tuaCBkZXZpYW5jZToqKiBzbyBzw6FuaCBoYWkgbcO0IGjDrG5oIGzhu5NuZyBuaGF1Lg0KKipCaeG7g3UgxJHhu5MgcGjhuqduIGTGsDoqKg0KLSBSZXNpZHVhbHMgdnMgZml0dGVkDQogIA0KLSBEZXZpYW5jZSByZXNpZHVhbHMNCiAgDQotIENvb2sncyBkaXN0YW5jZQ0KDQoqKktp4buDbSDEkeG7i25oIFBlYXJzb24gY2hpLXNxdWFyZToqKg0KDQpcWw0KWF4yID0gXHN1bV97aT0xfV5uIFxmcmFjeyh5X2kgLSBcbXVfaSleMn17XG11X2l9IFxxdWFkIFxSaWdodGFycm93IFxxdWFkIFheMiBcc2ltIFxjaGleMl97bi1wfQ0KXF0NCg0KIyMjICoqOS44IFNvIHPDoW5oIHbhu5tpIGPDoWMgbcO0IGjDrG5oIGtow6FjKioNCg0KfCBNw7QgaMOsbmggICAgICAgICAgIHwgS2hpIG7DoG8gZMO5bmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqUG9pc3NvbioqICAgICAgIHwgROG7ryBsaeG7h3UgxJHhur9tLCBwaMawxqFuZyBzYWkgZ+G6p24gYuG6sW5nIGvhu7MgduG7jW5nIChcKFxtYXRocm17VmFyfSh5KSBcYXBwcm94IEUoeSlcKSkgfA0KfCAqKlF1YXNpLVBvaXNzb24qKiB8IEtoaSBjw7Mgb3ZlcmRpc3BlcnNpb24gbmjhurksIGdp4buvIGPDuW5nIGjDoG0gbGnDqm4ga+G6v3QgKGxpbmsgZnVuY3Rpb24pICAgICAgICAgICB8DQp8ICoqTmVnYXRpdmUgQmlub21pYWwqKiB8IEtoaSBvdmVyZGlzcGVyc2lvbiBu4bq3bmcgaG/hurdjIGThu68gbGnhu4d1IGPDsyBxdcOhIG5oaeG7gXUgZ2nDoSB0cuG7iyAwICAgICAgICAgICAgICAgfA0KDQojIyAqKkNIxq/GoE5HIDEwOiBI4buSSSBRVVkgR0FNTUEgKEdBTU1BIFJFR1JFU1NJT04pKioNCg0KIyMjICoqMTAuMSBHaeG7m2kgdGhp4buHdSoqDQoNCkjhu5NpIHF1eSBHYW1tYSBsw6AgbeG7mXQgbcO0IGjDrG5oIHRodeG7mWMgaOG7jSBHTE0gZMO5bmcgxJHhu4MgbcO0IGjDrG5oIGjDs2EgY8OhYyBiaeG6v24gcGjhuqNuIGjhu5NpIGTGsMahbmcgbGnDqm4gdOG7pWMgY8OzIHBoxrDGoW5nIHNhaSB0xINuZyB0aGVvIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmguDQoNClbDrSBk4bulIOG7qW5nIGThu6VuZzoNCg0KLSBDaGkgcGjDrSB5IHThur8NCg0KLSBUaOG7nWkgZ2lhbiBz4buRbmcgKHN1cnZpdmFsIHRpbWUpDQoNCi0gTMaw4bujbmcgdGnDqnUgdGjhu6UgbsSDbmcgbMaw4bujbmcNCg0KIyMjICoqMTAuMiBQaMOibiBwaOG7kWkgR2FtbWEqKg0KDQpHaeG6oyDEkeG7i25oIGJp4bq/biBuZ+G6q3Ugbmhpw6puIFwoIHlfaSBcKSBwaMOibiBwaOG7kWkgR2FtbWEgduG7m2kgdGhhbSBz4buROg0KDQpcWw0KeV9pIFxzaW0gR2FtbWEoXGFscGhhLCBcbXVfaSkNClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXCggXG11X2kgPSBFW3lfaV0gXCkgbMOgIGvhu7MgduG7jW5nLg0KDQotIFBoxrDGoW5nIHNhaTogIA0KXFsNClZhcih5X2kpID0gXGZyYWN7XG11X2leMn17XGFscGhhfSA9IFxwaGkgXG11X2leMg0KXF0NCg0KUGjGsMahbmcgc2FpIHThu7cgbOG7hyB24bubaSBiw6xuaCBwaMawxqFuZyBr4buzIHbhu41uZywgcGjDuSBo4bujcCBraGkgYmnhur9uIHRoacOqbiB04bu3IGzhu4cga2jDtG5nIMSR4buVaS4NCg0KIyMjICoqMTAuMyBIw6BtIG3huq10IMSR4buZIHjDoWMgc3XhuqV0IEdhbW1hIChk4bqhbmcgR0xNKSoqDQoNCioqSMOgbSBt4bqtdCDEkeG7mSB4w6FjIHN14bqldDoqKg0KDQpcWw0KZih5OyBcbXUsIFxwaGkpID0gXGZyYWN7MX17XEdhbW1hKDEvXHBoaSl9IFxsZWZ0KFxmcmFjezF9e1xwaGkgXG11fVxyaWdodCleezEvXHBoaX0geV57XGZyYWN7MX17XHBoaX0tMX0gXGV4cFxsZWZ0KC1cZnJhY3t5fXtccGhpIFxtdX1ccmlnaHQpDQpcXQ0KDQpIw6BtIG7DoHkgdGh14buZYyBo4buNIGjDoG0gbcWpIChleHBvbmVudGlhbCBmYW1pbHkpLCB24bubaToNCg0KXFsNClx0aGV0YSA9IC1cZnJhY3sxfXtcbXV9DQpcXQ0KDQpcWw0KYihcdGhldGEpID0gLVxsb2coLVx0aGV0YSkNClxdDQoNCkjDoG0gcGjGsMahbmcgc2FpOg0KDQpcWw0KVihcbXUpID0gXG11XjINClxdDQoNClwoXHBoaVwpIGzDoCB0aGFtIHPhu5EgcGjDom4gdMOhbi4NCg0KIyMjICoqMTAuNCBIw6BtIGxpw6puIGvhur90IChMaW5rIGZ1bmN0aW9uKSoqDQoNCioqTeG6t2MgxJHhu4tuaCB0cm9uZyBHTE06KioNCg0KXFsNCmcoXG11X2kpID0gXGxvZyhcbXVfaSkgPSBcZXRhX2kgPSB4X2leVCBcYmV0YQ0KXF0NCg0KQ8OhYyB0w7l5IGNo4buNbiBraMOhYzoNCg0KLSBJZGVudGl0eTogXCggZyhcbXUpID0gXG11IFwpDQoNCi0gSW52ZXJzZTogXCggZyhcbXUpID0gXGZyYWN7MX17XG11fSBcKQ0KDQpMaW5rIGxvZyDEkcaw4bujYyBkw7luZyBwaOG7lSBiaeG6v24gbmjhuqV0IHbDrCDEkeG6o20gYuG6o28gXCggXG11ID4gMCBcKS4NCg0KIyMjICoqMTAuNSDGr+G7m2MgbMaw4bujbmcgdHJvbmcgaOG7k2kgcXV5IEdhbW1hKioNCg0Kxq/hu5tjIGzGsOG7o25nIHRoYW0gc+G7kSBcKFxiZXRhXCkgYuG6sW5nIHBoxrDGoW5nIHBow6FwIGjhu6NwIGzDvSB04buRaSDEkWEgKE1MRSkgcXVhIHRodeG6rXQgdG/DoW4gSVJMUy4NCg0KKipIw6BtIGxvZy1saWtlbGlob29kOioqDQoNClxbDQpcZWxsKFxiZXRhKSA9IFxzdW1fe2k9MX1ebiBcbGVmdFstXGxvZyhcbXVfaSkgLSBcZnJhY3t5X2l9e1xtdV9pfSBccmlnaHRdICsgXHRleHR7aOG6sW5nIHPhu5F9DQpcXQ0KDQp24bubaToNCg0KXFsNClxtdV9pID0gZV57eF9pXlQgXGJldGF9DQpcXQ0KDQoqKlBoxrDGoW5nIHRyw6xuaCDEkWnhu4NtOioqDQoNClxbDQpcZnJhY3tccGFydGlhbCBcZWxsfXtccGFydGlhbCBcYmV0YX0gPSBcc3VtX3tpPTF9Xm4geF9pIFxsZWZ0KCB5X2kgLSBcZnJhY3tcbXVfaX17XG11X2leMn0gXGNkb3QgXGZyYWN7ZFxtdV9pfXtkXGV0YV9pfSBccmlnaHQpID0gMA0KXF0NCg0KRMO5bmcgSVJMUyDEkeG7gyBnaeG6o2kgcGjGsMahbmcgdHLDrG5oIHbDoCB0w6xtIG5naGnhu4dtIFwoXGhhdHtcYmV0YX1cKS4NCg0KIyMjICoqMTAuNiBEaeG7hW4gZ2nhuqNpIGjhu4cgc+G7kSoqDQoNCioqVuG7m2kgbGluayBsb2c6KioNCg0KXFsNClxsb2coXG11X2kpID0gXGJldGFfMCArIFxiZXRhXzEgeF97aTF9ICsgXGNkb3RzICsgXGJldGFfcCB4X3tpcH0gXGltcGxpZXMgXG11X2kgPSBlXnt4X2leVCBcYmV0YX0NClxdDQoNCk3hu5dpIGjhu4cgc+G7kSBcKFxiZXRhX2pcKSDEkcaw4bujYyBoaeG7g3UgbMOgICoqdMOhYyDEkeG7mW5nIHRyw6puIGxvZy1zY2FsZSoqLCBuZ2jEqWEgbMOgIOG6o25oIGjGsOG7n25nIMSR4bq/biBsb2cgY+G7p2Ega+G7syB24buNbmcgdHJ1bmcgYsOsbmguDQoNCi0gS2hpIFwoeF9qXCkgdMSDbmcgMSDEkcahbiB24buLLCB0cnVuZyBiw6xuaCBcKFxtdVwpIHRoYXkgxJHhu5VpIHRoZW8gdOG7tyBs4buHOg0KDQpcWw0KZV57XGJldGFfan0NClxdDQoNCnThu6ljIGzDoCBo4buHIHPhu5EgdOG7tyBs4buHIHRoYXkgxJHhu5VpIGPhu6dhIFwoXG11XCkuDQoNCiMjIyAqKjEwLjcgS2nhu4NtIMSR4buLbmggdsOgIGtob+G6o25nIHRpbiBj4bqteSoqDQoNCi0gKipXYWxkIHRlc3QqKiDEkeG7gyBraeG7g20gxJHhu4tuaDoNCg0KXFsNClpfaiA9IFxmcmFje1xoYXR7XGJldGF9X2p9e1NFKFxoYXR7XGJldGF9X2opfSBcc2ltIFxtYXRoY2Fse059KDAsMSkNClxdDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IGNobyBcKFxiZXRhX2pcKToNCg0KXFsNClxoYXR7XGJldGF9X2ogXHBtIHpfe1xhbHBoYS8yfSBcY2RvdCBTRShcaGF0e1xiZXRhfV9qKQ0KXF0NCg0KLSBDaHV54buDbiBzYW5nIGtob+G6o25nIHRpbiBj4bqteSB04bu3IGzhu4cgdGhheSDEkeG7lWkgdHJ1bmcgYsOsbmg6DQoNClxbDQpcbGVmdChlXntcaGF0e1xiZXRhfV9qIC0gel97XGFscGhhLzJ9IFNFKFxoYXR7XGJldGF9X2opfSwgXHF1YWQgZV57XGhhdHtcYmV0YX1faiArIHpfe1xhbHBoYS8yfSBTRShcaGF0e1xiZXRhfV9qKX0gXHJpZ2h0KQ0KXF0NCg0KIyMjICoqMTAuOCBLaeG7g20gdHJhIMSR4buZIHBow7kgaOG7o3AgKEdvb2RuZXNzLW9mLWZpdCkqKg0KDQotICoqRGV2aWFuY2UqKjoNCg0KXFsNCkQgPSAyIFxzdW1fe2k9MX1ebiBcbGVmdFsgXGZyYWN7eV9pIC0gXG11X2l9e1xtdV9pfSAtIFxsb2dcbGVmdChcZnJhY3t5X2l9e1xtdV9pfVxyaWdodCkgXHJpZ2h0XQ0KXF0NCg0KLSAqKlBlYXJzb24gY2hpLXNxdWFyZSoqOg0KDQpcWw0KWF4yID0gXHN1bV97aT0xfV5uIFxsZWZ0KCBcZnJhY3t5X2kgLSBcbXVfaX17XG11X2l9IFxyaWdodCleMg0KXF0NCg0KSGFpIGNo4buJIHPhu5EgbsOgeSBkw7luZyDEkeG7gyDEkcOhbmggZ2nDoSDEkeG7mSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCB2w6AgcGjDoXQgaGnhu4duIGhp4buHbiB0xrDhu6NuZyAqKm92ZXJkaXNwZXJzaW9uKiogbuG6v3UgY8OzLg0KDQojIyMgKioxMC45IFNvIHPDoW5oIHbhu5tpIG3DtCBow6xuaCBraMOhYyoqDQoNCnwgTcO0IGjDrG5oICAgICAgICAgICAgfCBLaGkgZMO5bmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IEjhu5NpIHF1eSB0dXnhur9uIHTDrW5oICB8IEtoaSBk4buvIGxp4buHdSBwaMOibiBwaOG7kWkgY2h14bqpbiwgcGjGsMahbmcgc2FpIGtow7RuZyDEkeG7lWkgICAgICAgICAgIHwNCnwgSOG7k2kgcXV5IEdhbW1hICAgICAgfCBLaGkgZOG7ryBsaeG7h3UgZMawxqFuZywgcGjGsMahbmcgc2FpIHThu7cgbOG7hyB24bubaSBiw6xuaCBwaMawxqFuZyB0cnVuZyBiw6xuaCB8DQp8IEjhu5NpIHF1eSBsb2ctbm9ybWFsICB8IEtoaSBcKFxsb2coeSlcKSBwaMOibiBwaOG7kWkgY2h14bqpbiAoc2F1IGJp4bq/biDEkeG7lWkgbG9nKSAgICAgICAgICB8DQoNCiMjICoqQ0jGr8agTkcgMTE6IEThu64gTEnhu4ZVIE5Iw5NNIEhP4bq2QyBU4bu2IEzhu4YgKEdST1VQRUQgREFUQSBPUiBQUk9QT1JUSU9OUykqKg0KDQojIyMgKioxMS4xIEdp4bubaSB0aGnhu4d1KioNCg0KROG7ryBsaeG7h3Ugbmjhu4sgcGjDom4gZOG6oW5nIDAvMSDEkcaw4bujYyBtw7QgaMOsbmggaMOzYSBi4bqxbmcgaOG7k2kgcXV5IGxvZ2lzdGljLiBUdXkgbmhpw6puLCBu4bq/dSBk4buvIGxp4buHdSBjw7MgZOG6oW5nIHThu5VuZyBo4bujcCAoZ3JvdXBlZCkgaG/hurdjIHRo4buDIGhp4buHbiBkxrDhu5tpIGThuqFuZyB04bu3IGzhu4csIHbDrSBk4bulOg0KDQoyMCB0aMOgbmggY8O0bmcgdHJvbmcgMzAgdGjhu60gbmdoaeG7h20g4oaSIFwoIHkgPSAyMCwgbiA9IDMwIFwpDQoNCi0gVOG7tyBs4buHIG3huq9jIGLhu4duaCDhu58gbeG7l2kgcXXhuq1uDQoNCi0gVOG7tyBs4buHIHNpbmggdmnDqm4gxJHhuq11IHRyb25nIHThu6tuZyBs4bubcA0KDQrihpIgQ+G6p24gZMO5bmcgR0xNIGThuqFuZyBuaOG7iyB0aOG7qWMgdOG7lW5nIHF1w6F0IChiaW5vbWlhbCBHTE0pLCDDoXAgZOG7pW5nIGNobyBz4buRIGzhuqduIHRow6BuaCBjw7RuZyB0csOqbiBz4buRIGzhuqduIHRo4butLg0KDQojIyMgKioxMS4yIE3DtCBow6xuaCBow7NhIHPhu5EgdGjDoG5oIGPDtG5nIHRyb25nIG5ow7NtKioNCg0KVuG7m2kgXCggeV9pIFxzaW0gXHRleHR7Qmlub21pYWx9KG5faSwgXHBpX2kpIFwpLCB0YSBtw7QgaMOsbmggaMOzYToNCg0KXFsNClxsb2cgXGxlZnQoXGZyYWN7XHBpX2l9ezEgLSBccGlfaX1ccmlnaHQpID0gXGV0YV9pID0geF9pXlQgXGJldGEgXGltcGxpZXMgXHBpX2kgPSBcZnJhY3tlXnt4X2leVCBcYmV0YX19ezEgKyBlXnt4X2leVCBcYmV0YX19DQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQotIFwoIHlfaSBcKTogc+G7kSB0aMOgbmggY8O0bmcgdHJvbmcgbmjDs20gXChpXCkNCg0KLSBcKCBuX2kgXCk6IHThu5VuZyBz4buRIHRo4butIG5naGnhu4dtIHRyb25nIG5ow7NtIFwoaVwpDQoNCi0gXCggXHBpX2kgXCk6IHjDoWMgc3XhuqV0IHRow6BuaCBjw7RuZw0KDQotIFwoIFxtdV9pID0gRVt5X2ldID0gbl9pIFxwaV9pIFwpDQoNCi0gXCggXHRleHR7VmFyfSh5X2kpID0gbl9pIFxwaV9pICgxIC0gXHBpX2kpIFwpDQoNCuKGkiBQaMO5IGjhu6NwIGNobyBk4buvIGxp4buHdSBk4bqhbmcgIm4gdHJpYWxzLCBrIHN1Y2Nlc3NlcyIuDQoNCiMjIyAqKjExLjMgTG9nLWxpa2VsaWhvb2QgdsOgIElSTFMqKg0KDQoqKkjDoG0gbG9nLWxpa2VsaWhvb2Q6KioNCg0KXFsNClxlbGwoXGJldGEpID0gXHN1bV97aT0xfV5uIFxsZWZ0WyB5X2kgXGxvZyhccGlfaSkgKyAobl9pIC0geV9pKSBcbG9nKDEgLSBccGlfaSkgXHJpZ2h0XQ0KXF0NCg0KVOG7kWkgxJFhIGjDs2EgbG9nLWxpa2VsaWhvb2QgYuG6sW5nIElSTFMgKG5oxrAgbG9naXN0aWMpLCBuaMawbmcgY8OzIHRow6ptIHnhur91IHThu5EgXCggbl9pIFwpLg0KDQoqKkJp4bq/biBnaeG6oyB2w6AgdHLhu41uZyBz4buROioqDQoNClxbDQp3X2kgPSBuX2kgXHBpX2kgKDEgLSBccGlfaSkNClxdDQoNClxbDQp6X2kgPSBcZXRhX2kgKyBcZnJhY3t5X2kgLSBuX2kgXHBpX2l9e25faSBccGlfaSAoMSAtIFxwaV9pKX0NClxdDQoNCiMjIyAqKjExLjQgxq91IMSRaeG7g20gc28gduG7m2kgbcO0IGjDrG5oIG5o4buLIHBow6JuKioNCg0KfCBE4bqhbmcgZOG7ryBsaeG7h3UgICAgICAgICAgfCBNw7QgaMOsbmggdMawxqFuZyDhu6luZyAgICAgICAgICAgICAgIHwgR2hpIGNow7ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IDAvMSB04burbmcgY8OhIG5ow6JuICAgICB8IEjhu5NpIHF1eSBsb2dpc3RpYyAgICAgICAgICAgICAgIHwgXCggeV9pIFxzaW0gXHRleHR7QmVybm91bGxpfShccGlfaSkgXCkgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBOaMOzbSBuaGnhu4F1IGPDoSBuaMOibiAgICB8IEJpbm9taWFsIEdMTSB24bubaSBcKCB5X2kgLyBuX2kgXCkgfCBcKCB5X2kgXHNpbSBcdGV4dHtCaW5vbWlhbH0obl9pLCBccGlfaSkgXCkgICAgICAgICAgICAgICAgICAgICB8DQoNCuKGkiBNw7QgaMOsbmggbmjDs20gY2hvIGvhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZyBjaMOtbmggeMOhYyBoxqFuIHbDrCBkw7luZyBuaGnhu4F1IHRow7RuZyB0aW4gaMahbiB0csOqbiBt4buXaSBxdWFuIHPDoXQuDQoNCiMjIyAqKjExLjUgROG7ryBsaeG7h3UgdOG7tyBs4buHIChwcm9wb3J0aW9ucykqKg0KDQpO4bq/dSBcKCB5X2kgLyBuX2kgXCkgxJHGsOG7o2MgZ2hpIGTGsOG7m2kgZOG6oW5nIHThu7cgbOG7hyAoMCA8IHThu7cgbOG7hyA8IDEpLCB0YSB24bqrbiBkw7luZyBtw7QgaMOsbmg6DQoNClxbDQpcbG9nIFxsZWZ0KFxmcmFje3lfaSAvIG5faX17MSAtIHlfaSAvIG5faX1ccmlnaHQpID0geF9pXlQgXGJldGENClxdDQoNCuKGkiBOaMawbmcgcGjhuqNpIGNo4buJIHLDtSBz4buRIGzhuqduIHRo4butIFwoIG5faSBcKSDEkeG7gyB0w61uaCDEkcO6bmcgcGjGsMahbmcgc2FpLg0KDQojIyMgKioxMS42IEtp4buDbSDEkeG7i25oIG3DtCBow6xuaCoqDQoNCi0gV2FsZCB0ZXN0IGNobyBjw6FjIGjhu4cgc+G7kQ0KDQotIEtp4buDbSDEkeG7i25oIGRldmlhbmNlIGdp4buvYSBtw7QgaMOsbmggxJHhuqd5IMSR4bunIHbDoCByw7p0IGfhu41uDQoNCi0gQUlDL0JJQyDEkeG7gyBjaOG7jW4gbcO0IGjDrG5oDQoNCi0gUGjhuqduIGTGsCBQZWFyc29uIC8gZGV2aWFuY2UgxJHhu4MgcGjDoXQgaGnhu4duIMSRaeG7g20gYuG6pXQgdGjGsOG7nW5nDQoNCiMjIyAqKjExLjcgS2nhu4NtIHRyYSBvdmVyZGlzcGVyc2lvbioqDQoNCkdp4buRbmcgaOG7k2kgcXV5IGxvZ2lzdGljLCBtw7QgaMOsbmggYmlub21pYWwgZ2nhuqMgxJHhu4tuaDoNCg0KXFsNClx0ZXh0e1Zhcn0oeV9pKSA9IG5faSBccGlfaSAoMSAtIFxwaV9pKQ0KXF0NCg0KTuG6v3UgdGjhuqV5IHBoxrDGoW5nIHNhaSBxdWFuIHPDoXQgbOG7m24gaMahbiDihpIgb3ZlcmRpc3BlcnNpb24uDQoNCioqS2nhu4NtIHRyYToqKg0KDQpcWw0KXGhhdHtccGhpfSA9IFxmcmFje1x0ZXh0e0RldmlhbmNlfX17biAtIHB9DQpcXQ0KDQrihpIgTuG6v3UgXChcaGF0e1xwaGl9ID4gMS41XCk6IGPhuqduIGNodXnhu4NuIHNhbmcgbcO0IGjDrG5oIHF1YXNpLWJpbm9taWFsDQoNCiMjICoqQ0jGr8agTkcgMTI6IE3DlCBIw4xOSCBUVVnhur5OIFTDjU5IIFThu5RORyBRVcOBVCBUV0VFREVFIChUV0VFRElFIEdMTXMpKioNCg0KIyMjICoqMTIuMSBHaeG7m2kgdGhp4buHdSoqDQoNCk3DtCBow6xuaCAqKlR3ZWVkaWUgR0xNKiogbeG7nyBy4buZbmcgaOG7jSBow6BtIG3FqSBi4bqxbmcgY8OhY2ggY2hvIHBow6lwIHBow6JuIHBo4buRaSBjw7MgxJHhurdjIMSRaeG7g20gdHJ1bmcgZ2lhbiBnaeG7r2EgY8OhYyBwaMOibiBwaOG7kWkgcXVlbiB0aHXhu5ljIG5oxrA6DQoNCi0gR2F1c3NpYW4NCg0KLSBQb2lzc29uDQoNCi0gR2FtbWENCg0KLSBJbnZlcnNlIEdhdXNzaWFuDQoNCk3DtCBow6xuaCBUd2VlZGllIHBow7kgaOG7o3AgduG7m2kgY8OhYyBsb+G6oWkgZOG7ryBsaeG7h3UgY8OzIMSR4bq3YyDEkWnhu4NtOg0KDQotICoqTGnDqm4gdOG7pWMgZMawxqFuZyArIHLhuqV0IG5oaeG7gXUgZ2nDoSB0cuG7iyAwKiogIA0KICAodsOtIGThu6U6IGThu68gbGnhu4d1IGNoaSBwaMOtLCBjw7MgbmfGsOG7nWkga2jDtG5nIHRpw6p1IGTDuW5nKQ0KICANCi0gKipQaMOibiB0w6FuIHF1w6EgbeG7qWMgKG92ZXJkaXNwZXJzaW9uKSoqDQoNCi0gQ8OzIGPhuqMgcGjhuqduICoqcuG7nWkgcuG6oWMqKiAoMCwgMSwgMiwgLi4uKSAqKmzhuqtuIGxpw6puIHThu6VjIGTGsMahbmcqKg0KDQrihpIg4buobmcgZOG7pW5nIHLhu5luZyByw6NpIHRyb25nICoqYuG6o28gaGnhu4NtKiosICoqdMOgaSBjaMOtbmgqKiwgKip5IHThur8qKiwgdsOgIGPDoWMgYsOgaSB0b8OhbiAqKnplcm8taW5mbGF0ZWQgZGF0YSoqLg0KDQoNCiMjIyAqKjEyLjIgxJDhu4tuaCBuZ2jEqWEgdsOgIHTDrW5oIGNo4bqldCoqDQoNClR3ZWVkaWUgbMOgIG3hu5l0IGzhu5twIHBow6JuIHBo4buRaSB0aHXhu5ljICoqaOG7jSBow6BtIG3FqSAoZXhwb25lbnRpYWwgZmFtaWx5KSoqLCB24bubaSAqKmjDoG0gcGjGsMahbmcgc2FpKiogY8OzIGThuqFuZzoNCg0KXFsNClx0ZXh0e1Zhcn0oWSkgPSBccGhpIFxtdV5wDQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQotIFwoIFxtdSA9IFxtYXRoYmJ7RX1bWV0gXCk6IGvhu7MgduG7jW5nDQoNCi0gXCggXHBoaSA+IDAgXCk6IGjhu4cgc+G7kSBwaMOibiB0w6FuDQoNCi0gXCggcCBcKTogY2jhu4kgc+G7kSBz4bupYyBt4bqhbmggKCoqcG93ZXIgaW5kZXgqKikNCg0KDQojIyMgKioxMi4zIEdpw6EgdHLhu4sgxJHhurdjIGJp4buHdCBj4bunYSBjaOG7iSBz4buRIFwoIHAgXCkqKg0KDQp8IFwoIHAgXCkgICAgICAgIHwgUGjDom4gcGjhu5FpIHTGsMahbmcg4bupbmcgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IDAgICAgICAgICAgICAgIHwgR2F1c3NpYW4gKE5vcm1hbCkgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDEgICAgICAgICAgICAgIHwgUG9pc3NvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFwoICgxLCAyKSBcKSAgIHwgVHdlZWRpZSBo4buXbiBo4bujcCAoMCArIGTGsMahbmcgbGnDqm4gdOG7pWMpICAgICB8DQp8IDIgICAgICAgICAgICAgIHwgR2FtbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDMgICAgICAgICAgICAgIHwgSW52ZXJzZSBHYXVzc2lhbiAgICAgICAgICAgICAgICAgICAgICAgICB8DQoNCuKGkiBW4bubaSBcKCAxIDwgcCA8IDIgXCksIG3DtCBow6xuaCAqKlR3ZWVkaWUgaOG7l24gaOG7o3AqKiBjw7MgdGjhu4M6DQoNCi0gVMOhaSBoaeG7h24gxJHGsOG7o2MgKipz4buRIGzGsOG7o25nIGzhu5tuIGdpw6EgdHLhu4sgMCoqDQoNCi0gTcO0IGjDrG5oIGjDs2EgxJHGsOG7o2MgKipnacOhIHRy4buLIGTGsMahbmcgbGnDqm4gdOG7pWMqKg0KDQoqKlLhuqV0IHBow7kgaOG7o3AqKiBjaG8gY8OhYyBiw6BpIHRvw6FuIG5oxrAgKipjaGkgcGjDrSBi4bqjbyBoaeG7g20qKiwgKip04buVbiB0aOG6pXQqKiwgKipk4buvIGxp4buHdSBjw7Mgc+G7kSAwIHbDoCBnacOhIHRy4buLIHRp4buBbiB04buHKiouDQoNCg0KIyAqKkLDgEkgVOG6rFAgMioqDQoNCioqVGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiBtw7QgdOG6oyBjaG8gY8OhYyBiaeG6v24gdHJvbmcgZmlsZTogU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25zLmNzdioqDQoNCmBgYHtyfQ0KbGlicmFyeShjc3YpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc2tpbXIpDQpsaWJyYXJ5KHBzeWNoKQ0KDQpgYGANCg0KIyMgKioxLiDEkOG7jWMgZmlsZSBDU1YqKg0KDQotIFThu4dwICoqU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25zKiogxJHGsOG7o2MgbMawdSBkxrDhu5tpIMSR4buLbmggZOG6oW5nICoqY3N2KiouIMSQ4buNYyBi4buZIGThu68gbGnhu4d1IG7DoHkgdsOgbyBwaOG6p24gbeG7gW0gUiAgDQoNCi0gU2F1IGtoaSDEkeG7jWMsIGLhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2MgZ8OhbiB2w6BvIGJp4bq/biAqKmRhdGEqKiDEkeG7gyBk4buFIGTDoG5nIHRoYW8gdMOhYy4gDQoNCmBgYHtyfQ0KZGF0YSA8LSByZWFkLmNzdigiQzovVXNlcnMvQURNSU4vRGVza3RvcC9QVERMIERJTkggVElOSC9TdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMuY3N2IiwgaGVhZGVyID0gVCkNCmBgYA0KDQotLS0NCg0KIyMgKioyLiBU4buVbmcgcXVhbiBk4buvIGxp4buHdSoqDQoNCiMjIyAqKjIuMSBO4buZaSBkdW5nIGThu68gbGnhu4d1KioNCg0KLSBC4buZIGThu68gbGnhu4d1ICpTdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMqIG7DoHkgZ+G7k20gMTQsMDU5IGdpYW8gZOG7i2NoIG11YSBow6BuZyB04bqhaSBzacOqdSB0aOG7iywgduG7m2kgY8OhYyB0aMO0bmcgdGluIGxpw6puIHF1YW4gxJHhur9uIGtow6FjaCBow6BuZyB2w6Agc+G6o24gcGjhuqltIGJhbyBn4buTbSAqKm3DoyDEkeG7i25oIGRhbmgga2jDoWNoIGjDoG5nIHbDoCBjw6FjIHRow7RuZyB0aW4gbGnDqm4gcXVhbioqLCAqKnbhu4sgdHLDrSDEkeG7i2EgbMO9KiosICoqY2hpIHRp4bq/dCBjw6FjIHPhuqNuIHBo4bqpbSDEkcaw4bujYyBtdWEqKi4NCg0KLSBE4buvIGxp4buHdSBuw6B5IGPDsyB0aOG7gyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyAqKnBow6JuIHTDrWNoIGjDoG5oIHZpIG11YSBz4bqvbSBj4bunYSBraMOhY2ggaMOgbmcqKiwgKipwaMOibiBraMO6YyB0aOG7iyB0csaw4budbmcqKiwgaG/hurdjICoqxJHDoW5oIGdpw6EgaGnhu4d1IHF14bqjIGtpbmggZG9hbmgqKiB0aGVvIHThu6tuZyBz4bqjbiBwaOG6qW0sIHThu6tuZyBraHUgduG7sWMgdsOgIHThu6tuZyBuaMOzbSDEkeG7kWkgdMaw4bujbmcuIA0KDQojIyMgKioyLjIgRGFuaCBzw6FjaCBjw6FjIGJp4bq/biB2w6AgbcO0IHThuqMqKg0KDQoqKlTDqm4gY+G7p2EgY8OhYyBiaeG6v24gdHJvbmcgYuG7mSBk4buvIGxp4buHdSBiYW8gZ+G7k206KioNCg0KYGBge3J9DQpuYW1lcyhkYXRhKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtuaXRyKQ0KIyBU4bqhbyBi4bqjbmcgbcO0IHThuqMgY8OhYyBiaeG6v24gdsOgIGThu4tjaCB0aHXhuq10IA0KdmFyaWFibGVfZGVzYyA8LSB0aWJibGU6OnRpYmJsZSgNCiAgQmnhur9uID0gYygNCiAgICAiWCIsICJQdXJjaGFzZURhdGUiLCAiQ3VzdG9tZXJJRCIsICJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLA0KICAgICJDaGlsZHJlbiIsICJBbm51YWxJbmNvbWUiLCAiQ2l0eSIsICJTdGF0ZW9yUHJvdmluY2UiLCAiQ291bnRyeSIsDQogICAgIlByb2R1Y3RGYW1pbHkiLCAiUHJvZHVjdERlcGFydG1lbnQiLCAiUHJvZHVjdENhdGVnb3J5IiwgIlVuaXRzU29sZCIsICJSZXZlbnVlIg0KICApLA0KICBE4buLY2hfdGh14bqtdCA9IGMoDQogICAgIlPhu5EgdGjhu6kgdOG7sSBkw7JuZyIsICJOZ8OgeSBtdWEgaMOgbmciLCAiTcOjIGtow6FjaCBow6BuZyIsICJHaeG7m2kgdMOtbmgiLCAiVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIiwgIlPhu58gaOG7r3UgbmjDoCIsDQogICAgIlPhu5EgY29uIiwgIlRodSBuaOG6rXAgaMOgbmcgbsSDbSIsICJUaMOgbmggcGjhu5EiLCAiQmFuZy9U4buJbmgiLCAiUXXhu5FjIGdpYSIsDQogICAgIk5ow7NtIHPhuqNuIHBo4bqpbSIsICJC4buZIHBo4bqtbiBz4bqjbiBwaOG6qW0iLCAiTG/huqFpIHPhuqNuIHBo4bqpbSIsICJT4buRIGzGsOG7o25nIGLDoW4iLCAiRG9hbmggdGh1Ig0KICApDQopDQoNCmthYmxlKHZhcmlhYmxlX2Rlc2MsIGNhcHRpb24gPSAiVMOqbiBiaeG6v24sIEThu4tjaCB0aHXhuq10IikNCmBgYA0KDQoNCi0tLQ0KDQojIyAqKjMgVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGPDoWMgYmnhur9uKioNCg0KIyMjICoqMy4xIFPhu5EgYmnhur9uIHbDoCBz4buRIHF1YW4gc8OhdCoqDQoNCmBgYHtyfQ0KZGltKGRhdGEpDQpgYGANCg0KLSBC4buZIGThu68gbGnhu4d1ICoqZGF0YSoqIGNo4bupYSB04buVbmcgY+G7mW5nICoqMTQuMDU5IHF1YW4gc8OhdCoqIGPDuW5nIHbhu5tpICoqMTYgYmnhur9uKiogxJHhurdjIHRyxrBuZy4NCi0gTeG7l2kgcXVhbiBzw6F0IHPhur0gdMaw4bufbmcg4bupbmcgduG7m2kgbeG7l2kgZ2lhbyBk4buLY2ggbXVhIGjDoG5nIHThuqFpIHNpw6p1IHRo4buLLiANCg0KIyMjICoqMy4yIEtp4buDbSB0cmEgY+G6pXUgdHLDumMgdOG7lW5nIHF1w6F0KioNCg0KxJDhu4MgbuG6r20gxJHGsOG7o2MgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIGLhu5kgZOG7ryBsaeG7h3UsIGNow7puZyB0YSBj4bqnbiBi4bqvdCDEkeG6p3UgYuG6sW5nIHZp4buHYyBraeG7g20gdHJhIGPDoWMgeeG6v3UgdOG7kSBjxqEgYuG6o24gbmjGsCBz4buRIGzGsOG7o25nIGJp4bq/biwga2nhu4N1IGThu68gbGnhu4d1IGPhu6dhIHThu6tuZyBiaeG6v24gdsOgIG3hu5l0IHPhu5EgdGjhu5FuZyBrw6ogbcO0IHThuqMgc8ahIGLhu5kuIELGsOG7m2MgbsOgeSDEkcOzbmcgdmFpIHRyw7IgcXVhbiB0cuG7jW5nIHRyb25nIHZp4buHYyBoaeG7g3UgY+G6pXUgdHLDumMgZOG7ryBsaeG7h3UgdsOgIGjhu5cgdHLhu6MgxJHhu4tuaCBoxrDhu5tuZyBjaG8gY8OhYyBwaMOibiB0w61jaCBjaHV5w6puIHPDonUgc2F1IG7DoHkuDQoNCmBgYHtyfQ0Kc3RyKGRhdGEpDQpgYGANCioqVHJvbmcgYuG7mSBk4buvIGxp4buHdSB0aOG7gyBoaeG7h24gY8OhYyBiaeG6v24gbmjGsCBzYXU6KioNCg0KLSAqKlRo4budaSBnaWFuIG11YSBow6BuZzoqKiANCg0KICAtIFB1cmNoYXNlRGF0ZTogbmfDoHkgZ2lhbyBk4buLY2ggbXVhIGjDoG5nIMSRxrDhu6NjIGdoaSBuaOG6rW4gKMSR4buLbmggZOG6oW5nIG5nw6B5LXRow6FuZy1uxINtKS4NCg0KLSAqKktow6FjaCBow6BuZzoqKg0KDQogIC0gQ3VzdG9tZXJJRDogTcOjIMSR4buLbmggZGFuaCBj4bunYSB04burbmcga2jDoWNoIGjDoG5nDQoNCiAgLSBHZW5kZXI6IEdp4bubaSB0w61uaCBj4bunYSBraMOhY2ggaMOgbmcgKEY6IE7hu68sIE06IE5hbSkuDQoNCiAgLSBNYXJpdGFsU3RhdHVzOiBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gKFM6IMSQ4buZYyB0aMOibiwgTTogxJDDoyBr4bq/dCBow7RuKS4NCg0KICAtIEhvbWVvd25lcjogS2jDoWNoIGjDoG5nIGPDsyBz4bufIGjhu691IG5ow6AgKFk6IGPDsyBuaMOgLCBOOiBraMO0bmcgY8OzIG5ow6ApLg0KDQogIC0gQ2hpbGRyZW46IFPhu5EgbMaw4bujbmcgY29uIGPDoWkgY+G7p2Ega2jDoWNoIGjDoG5nDQoNCiAgLSBBbm51YWxJbmNvbWU6IFRodSBuaOG6rXAgaOG6sW5nIG7Eg20gcGjDom4gbG/huqFpIHRoZW8gbmjDs20gKGTGsOG7m2kgZOG6oW5nIGtob+G6o25nKS4NCg0KICAtIENpdHksIFN0YXRlb3JQcm92aW5jZSwgQ291bnRyeTogxJDhu4thIGNo4buJIHNpbmggc+G7kW5nICggVGjDoG5oIHBow7MsIEJhbmcvVOG7iW5oLCBRdeG7kWMgZ2lhKQ0KDQotICoqU+G6o24gcGjhuqltOioqDQoNCiAgLSBQcm9kdWN0RmFtaWx5OiBOaMOzbSBz4bqjbiBwaOG6qW0gbOG7m24gKHbDrSBk4bulOiBUaOG7sWMgcGjhuqltLCDEkOG7kyB14buRbmcsIHYudi4pDQogIC0gUHJvZHVjdERlcGFydG1lbnQ6IELhu5kgcGjhuq1uIHPhuqNuIHBo4bqpbSBj4bulIHRo4buDIGjGoW4gdHJvbmcgc2nDqnUgdGjhu4sNCiAgLSBQcm9kdWN0Q2F0ZWdvcnk6IExv4bqhaSBz4bqjbiBwaOG6qW0gY2hpIHRp4bq/dA0KDQogIC0gVW5pdHNTb2xkOiBT4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbSDEkcOjIGLDoW4gdHJvbmcgZ2lhbyBk4buLY2guDQoNCiAgLSBSZXZlbnVlOiBEb2FuaCB0aHUgdOG7qyBnaWFvIGThu4tjaCDEkcOzIChVU0QpLg0KDQoNCioqQuG7mSBk4buvIGxp4buHdSDEkcaw4bujYyBjdW5nIGPhuqVwIGJhbyBn4buTbSBj4bqjIGPDoWMgYmnhur9uIMSR4buLbmggdsOgIGJp4bq/biDEkeG7i25oIGzGsOG7o25nLCB0cm9uZyDEkcOzIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggxJHGsOG7o2MgxJHhu4EgY+G6rXAgxJHhur9uIG5oxrAgc2F1OioqDQoNCi0gQ8OhYyB0aMO0bmcgdGluIGxpw6puIHF1YW4gxJHhur9uIGtow6FjaCBow6BuZywgbmjhu69uZyBiaeG6v24gbsOgeSBraMO0bmcgdGjhu4MgaGnhu4duIGPhu6UgdGjhu4MgY8OhYyBjb24gc+G7kSB0b8OhbiBo4buNYyBuw6puIHLhuqV0IGtow7MgxJHhu4MgcGjDom4gdMOtY2ggdsOgIGvhur90IGx14bqtbiAodsOtIGThu6U6IGRvYW5oIHRodSwgc+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gYsOhbiByYSkuDQpEbyDEkcOzLCB0cm9uZyBxdcOhIHRyw6xuaCB0aOG7kW5nIGvDqiBtw7QgdOG6oyB2w6AgcGjDom4gdMOtY2gsIHRhIGPhuqduIHBow6JuIGJp4buHdCByw7UgZ2nhu69hIGhhaSBuaMOzbSBiaeG6v24gbsOgeSDEkeG7gyBs4buxYSBjaOG7jW4gcGjGsMahbmcgcGjDoXAgeOG7rSBsw70gcGjDuSBo4bujcC4NCg0KIyMjICoqMy4zIFRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biDEkeG7i25oIHTDrW5oIHbDoCDEkeG7i25oIGzGsOG7o25nKioNCg0KYGBge3J9DQojIFjDoWMgxJHhu4tuaCBiaeG6v24gxJHhu4tuaCB0w61uaCAoa2nhu4N1IGNoYXJhY3RlciBob+G6t2MgZmFjdG9yKQ0KY2F0ZWdvcmljYWxfdmFycyA8LSBuYW1lcyhzZWxlY3RfaWYoZGF0YSwgaXMuY2hhcmFjdGVyKSkNCg0KIyBYw6FjIMSR4buLbmggYmnhur9uIMSR4buLbmggbMaw4bujbmcgKGtp4buDdSBz4buRKQ0KbnVtZXJpY2FsX3ZhcnMgPC0gbmFtZXMoc2VsZWN0X2lmKGRhdGEsIGlzLm51bWVyaWMpKQ0KDQojIEhp4buDbiB0aOG7iyBkYW5oIHPDoWNoIGPDoWMgYmnhur9uDQpjYXQoIkPDoWMgYmnhur9uIMSR4buLbmggdMOtbmg6IiwgcGFzdGUoY2F0ZWdvcmljYWxfdmFycywgY29sbGFwc2UgPSAiLCAiKSwgIlxuXG4iKQ0KY2F0KCJDw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nOiIsIHBhc3RlKG51bWVyaWNhbF92YXJzLCBjb2xsYXBzZSA9ICIsICIpKQ0KYGBgDQojIyMjICoqMy4zLjEgVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgKioNCg0KYGBge3J9DQojIFPhu60gZOG7pW5nIHN1bW1hcnkgxJHhu4MgbcO0IHThuqMgY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZw0Kc3VtbWFyeShzZWxlY3QoZGF0YSwgYWxsX29mKG51bWVyaWNhbF92YXJzKSkpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoa25pdHIpDQojIFThuqFvIGLhuqNuZyB0aOG7kW5nIGvDqiBtw7QgdOG6oyB0aOG7pyBjw7RuZyB04burIGvhur90IHF14bqjIGLhuqFuIMSRw6MgY3VuZyBj4bqlcA0KZGVzY190YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBgVGjhu5FuZyBrw6pgID0gYygiTWluIiwgIjFzdCBRdS4iLCAiTWVkaWFuIiwgIk1lYW4iLCAiM3JkIFF1LiIsICJNYXgiKSwNCiAgYENoaWxkcmVuYCA9IGMoMCwgMSwgMywgMi41MywgNCwgNSksDQogIGBVbml0c1NvbGRgID0gYygxLCAzLCA0LCA0LjA4LCA1LCA4KSwNCiAgYFJldmVudWVgID0gYygwLjUzLCA2Ljg0LCAxMS4yNSwgMTMuMDAsIDE3LjM3LCA1Ni43MCkNCikNCg0Ka2FibGUoZGVzY190YWJsZSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmciKQ0KYGBgDQoNCg0KDQoqKkNoaWxkcmVuKiogKFPhu5EgbMaw4bujbmcgY29uIGPhu6dhIGtow6FjaCBow6BuZykNCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gVHJ1bmcgYsOsbmggbeG7l2kga2jDoWNoIGjDoG5nIGPDsyBraG/huqNuZyAyLjUzIG5nxrDhu51pIGNvbi4NCg0KLSA1MCUga2jDoWNoIGjDoG5nIGPDsyB04burIDEgxJHhur9uIDQgbmfGsOG7nWkgY29uLg0KDQotIEPDsyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBjb24gKE1pbiA9IDApLCB2w6AgY2FvIG5o4bqldCBsw6AgNSBuZ8aw4budaSBjb24uIFPhu7EgaGnhu4duIGRp4buHbiBj4bunYSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBjb24gKGdpw6EgdHLhu4sgbWluID0gMCkgY8WpbmcgxJHDoW5nIGNow7ogw70sIGPDsyB0aOG7gyBsw6AgbmjDs20gxJHhu5ljIHRow6JuIGhv4bq3YyB24bujIGNo4buTbmcgdHLhursg4oCTIG5ow7NtIG7DoHkgY8OzIGjDoG5oIHZpIHRpw6p1IGTDuW5nIGtow6FjIGJp4buHdC4NCg0KLSDEkOG7mSBs4buHY2ggZ2nhu69hIHRydW5nIHbhu4sgKDMpIHbDoCB0cnVuZyBiw6xuaCAoMi41Mykga2jDtG5nIHF1w6EgbOG7m24sIGNobyB0aOG6pXkgcGjDom4gcGjhu5FpIGtow6EgY8OibiDEkeG7kWksIGjGoWkgbmdoacOqbmcgbmjhurkgduG7gSBwaMOtYSDDrXQgY29uIGjGoW4uDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNCi0gS2jDoWNoIGjDoG5nIHBo4bqnbiBs4bubbiBsw6AgbmfGsOG7nWkgY8OzIGdpYSDEkcOsbmgsIHbhu5tpIHPhu5EgY29uIHBo4buVIGJp4bq/biB04burIDEgxJHhur9uIDQsIHBow7kgaOG7o3AgduG7m2kgbmjDs20gdGnDqnUgZMO5bmcgaOG7mSBnaWEgxJHDrG5oIHRydXnhu4FuIHRo4buRbmcuDQoNCg0KKipVbml0c1NvbGQqKiAoU+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gYsOhbiByYSB0cm9uZyBt4buXaSBnaWFvIGThu4tjaCkNCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gVHJ1bmcgYsOsbmggbeG7l2kgZ2lhbyBk4buLY2ggYsOhbiDEkcaw4bujYyBraG/huqNuZyA0LjA4IHPhuqNuIHBo4bqpbSwgduG7m2kgdHJ1bmcgduG7iyBsw6AgNCwgY2hvIHRo4bqleSBwaMOibiBwaOG7kWkgcuG6pXQgY8OibiDEkeG7kWkuDQoNCi0gS2hv4bqjbmcgNTAlIHPhu5EgZ2lhbyBk4buLY2ggcsahaSB2w6BvIGtob+G6o25nIDPigJM1IHPhuqNuIHBo4bqpbSwgcGjhuqNuIMOhbmggaMOgbmggdmkgbXVhIHPhuq9tIOKAnHbhu6thIMSR4bunIGTDuW5n4oCdIHRyb25nIDEgbOG6p24gbXVhLCBwaOG7lSBiaeG6v24g4bufIGtow6FjaCBow6BuZyDEkWkgc2nDqnUgdGjhu4sgxJHhu4tuaCBr4buzLg0KDQotIE3hu6ljIGNhbyBuaOG6pXQgbMOgIDggc+G6o24gcGjhuqltL2dpYW8gZOG7i2NoIGNobyB0aOG6pXkgbeG7mXQgc+G7kSBraMOhY2ggaMOgbmcgbXVhIHPhu5EgbMaw4bujbmcgbOG7m24g4oCTIGPDsyB0aOG7gyBsw6Aga2jDoWNoIGjDoG5nIG11YSBz4buJIGhv4bq3YyBnaWEgxJHDrG5oIMSRw7RuZyBuZ8aw4budaS4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KLSBHaWFvIGThu4tjaCBjw7MgeHUgaMaw4bubbmcgbmjhu48gbOG6uywgcGjDuSBo4bujcCB24bubaSBtw7QgaMOsbmggYsOhbiBs4bq7IG5oYW5oLCB0aeG7h24gbOG7o2kuDQoNCi0gQ+G6p24gdOG7kWkgxrB1IHRp4bq/cCB0aOG7iyB0aGVvIGNvbWJvL2dp4buPIGjDoG5nIDPigJM1IHPhuqNuIHBo4bqpbSDEkeG7gyB0xINuZyBkb2FuaCB0aHUuDQoNCioqUmV2ZW51ZSoqIChEb2FuaCB0aHUgbeG7l2kgZ2lhbyBk4buLY2ggLSBVU0QpDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIFRydW5nIGLDrG5oIG3hu5dpIGdpYW8gZOG7i2NoIG1hbmcgbOG6oWkgMTMgVVNELCB0cm9uZyBraGkgdHJ1bmcgduG7iyBsw6AgMTEuMjUgVVNELCB04bupYyBsw6AgY8OzIHPhu7EgbOG7h2NoIHBo4bqjaSBuaOG6uTogbeG7mXQgc+G7kSBnaWFvIGThu4tjaCBjw7MgZG9hbmggdGh1IGNhbyBrw6lvIHRydW5nIGLDrG5oIHTEg25nIGzDqm4uDQoNCi0gxJBhIHPhu5EgZ2lhbyBk4buLY2ggY8OzIGRvYW5oIHRodSB0cm9uZyBraG/huqNuZyA2Ljg0IOKAkyAxNy4zNyBVU0QsIHBow7kgaOG7o3AgduG7m2kgbeG7qWMgY2hpIHRpw6p1IGLDrG5oIHF1w6JuIGNobyBt4buZdCDEkeG7o3QgbXVhIHPhuq9tIG5oYW5oIHThuqFpIHNpw6p1IHRo4buLLg0KDQotIEdpw6EgdHLhu4sgbOG7m24gbmjhuqV0IGzDoCA1Ni43MCBVU0QsIGNo4buJIHJhIHLhurFuZyB24bqrbiB04buTbiB04bqhaSBjw6FjIGdpYW8gZOG7i2NoIG11YSBz4bqvbSBs4bubbiDigJMgY8OzIHRo4buDIGzDoCBk4buLcCBs4buFLCBtdWEgdMOtY2ggdHLhu68gaG/hurdjIGtow6FjaCBow6BuZyB0aMOibiB0aGnhur90Lg0KDQoqKkvhur90IGx14bqtbioqDQoNCi0gRG9hbmggdGh1IG3hu5dpIGdpYW8gZOG7i2NoIOG7nyBt4bupYyB0aOG6pXAgxJHhur9uIHRydW5nIGLDrG5oLCBjaG8gdGjhuqV5IMSRw6J5IGzDoCBtw7QgaMOsbmggYsOhbiBow6BuZyBwaOG7pWMgduG7pSBuaHUgY+G6p3UgdGnDqnUgZMO5bmcgaMOgbmcgbmfDoHkuDQoNCi0gQ+G6p24gY2jDuiDDvSDEkeG6v24gbmjDs20ga2jDoWNoIGjDoG5nIHThuqFvIHJhIGRvYW5oIHRodSBjYW8gxJHhu4MgeMOieSBk4buxbmcgY2hp4bq/biBsxrDhu6NjIGtow6FjaCBow6BuZyB0aMOibiB0aGnhur90IChsb3lhbHR5KS4NCg0KLS0tDQoNCg0KDQojIyMjICoqMy4zLjIgVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIMSR4buLbmggdMOtbmggKioNCg0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCmluc3RhbGwucGFja2FnZXMoImphbml0b3IiLCByZXBvcyA9ICJodHRwczovL2NyYW4ucnN0dWRpby5jb20vIikNCmluc3RhbGwucGFja2FnZXMoImphbml0b3IiLCByZXBvcyA9ICJodHRwczovL2NyYW4ucnN0dWRpby5jb20vIikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KDQojIyMjIyAqKjMuMy4yLjEuIEdlbmRlcioqDQpgYGB7cn0NCnRhYmxlKGRhdGEkR2VuZGVyKQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gR2VuZGVyKSkgKw0KICBnZW9tX2JhcihmaWxsID0gInN0ZWVsYmx1ZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJHaeG7m2kgdMOtbmgiLCB4ID0gIkdlbmRlciIsIHkgPSAiVOG6p24gc3XhuqV0IikNCmBgYA0KDQpgYGB7cn0NCiMgR2VuZGVyDQpkYXRhICU+JQ0KICB0YWJ5bChHZW5kZXIpICU+JQ0KICBhZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJU4bqnbiBzdeG6pXQgdsOgIHThu7cgbOG7hyBwaOG6p24gdHLEg20gLSBHZW5kZXIiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkNCg0KYGBgDQoNCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gROG7ryBsaeG7h3UgY2hvIHRo4bqleSBjw7MgNy4xNzAga2jDoWNoIGjDoG5nIGzDoCBu4buvICg1MS4wJSkgdsOgIDYuODg5IGtow6FjaCBow6BuZyBsw6AgbmFtICg0OS4wJSkuDQoNCi0gUGjDom4gYuG7kSBnaeG7m2kgdMOtbmggZ+G6p24gbmjGsCDEkeG7k25nIMSR4buBdSwga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggbOG7m24uDQoNCi0gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIHLhurFuZyBjaHXhu5dpIHNpw6p1IHRo4buLIGtow7RuZyBuaOG6r20gxJHhur9uIG3hu5l0IGdp4bubaSB0w61uaCBj4bulIHRo4buDLCBtw6AgcGjhu6VjIHbhu6UgdOG7kXQgY+G6oyBoYWkgbmjDs20uDQoNCi0gTmdvw6BpIHJhLCB04bu3IGzhu4cgbuG7ryBoxqFpIGNhbyBoxqFuIGPDsyB0aOG7gyBkbyBwaOG7pSBu4buvIHRoxrDhu51uZyDEkeG6o20gbmjhuq1uIHZhaSB0csOyIG11YSBz4bqvbSB0aOG7sWMgcGjhuqltIHbDoCB0acOqdSBkw7luZyBnaWEgxJHDrG5oLCBuw6puIGto4bqjIG7Eg25nIGNhbyBo4buNIGzDoCBuZ8aw4budaSDEkeG7qW5nIHTDqm4gZ2lhbyBk4buLY2ggbmhp4buBdSBoxqFuIHRyb25nIGjDs2EgxJHGoW4uDQoNCiMjIyMjICoqMy4zLjIuMi4gTWFyaXRhbFN0YXR1cyoqDQpgYGB7cn0NCnRhYmxlKGRhdGEkTWFyaXRhbFN0YXR1cykNCmdncGxvdChkYXRhLCBhZXMoeCA9IE1hcml0YWxTdGF0dXMpKSArDQogIGdlb21fYmFyKGZpbGwgPSAidG9tYXRvIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiIsIHggPSAiTWFyaXRhbCBTdGF0dXMiLCB5ID0gIlThuqduIHN14bqldCIpDQpgYGANCg0KYGBge3J9DQojIE1hcml0YWxTdGF0dXMNCmRhdGEgJT4lDQogIHRhYnlsKE1hcml0YWxTdGF0dXMpICU+JQ0KICBhZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJU4bqnbiBzdeG6pXQgdsOgIHThu7cgbOG7hyBwaOG6p24gdHLEg20gLSBNYXJpdGFsIFN0YXR1cyIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIFPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIMSR4buZYyB0aMOibiAoU2luZ2xlIOKAkyBrw70gaGnhu4d1IFMpIGzDoCA3LjE5MyBuZ8aw4budaSAoNTEuMTYlKSwgY8OybiBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gKE1hcnJpZWQg4oCTIE0pIGzDoCA2Ljg2NiBuZ8aw4budaSAoNDguODQlKS4NCg0KLSBN4bq3YyBkw7kgdOG7tyBs4buHIGtow6EgY8OibiBi4bqxbmcsIG5oxrBuZyBuaMOzbSDEkeG7mWMgdGjDom4gY2hp4bq/bSB04bu3IGzhu4cgY2FvIGjGoW4gbeG7mXQgY2jDunQuDQoNCi0gR2nhuqNpIHRow61jaCBo4bujcCBsw70gY2hvIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4MgbMOgOg0KDQogIC0gTmjhu69uZyBuZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIHh1IGjGsOG7m25nIHThu7EgxJFpIG11YSBz4bqvbSBuaGnhu4F1IGjGoW4sIGtow7RuZyBk4buxYSB2w6BvIGLhuqFuIMSR4budaS4NCg0KICAtIE5nb8OgaSByYSwgbmfGsOG7nWkgdHLhursgxJHhu5ljIHRow6JuIHRoxrDhu51uZyBz4buRbmcg4bufIHRow6BuaCB0aOG7iyB2w6Agc+G7rSBk4bulbmcgZOG7i2NoIHbhu6Ugc2nDqnUgdGjhu4sgdGjGsOG7nW5nIHh1ecOqbiBoxqFuLCB0cm9uZyBraGkgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyB0aOG7gyBtdWEgdGhlbyBuaMOzbSBob+G6t2MgdGhlbyBo4buZIGdpYSDEkcOsbmggbOG7m24gdsOgIMOtdCBnaWFvIGThu4tjaCBoxqFuIHRyw6puIG3hu5dpIGPDoSBuaMOibi4NCg0KIyMjIyMgKiozLjMuMi4zIEhvbWVvd25lcioqDQpgYGB7cn0NCnRhYmxlKGRhdGEkSG9tZW93bmVyKQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gSG9tZW93bmVyKSkgKw0KICBnZW9tX2JhcihmaWxsID0gImRhcmtncmVlbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJUw6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCIsIHggPSAiSG9tZW93bmVyIiwgeSA9ICJU4bqnbiBzdeG6pXQiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBIb21lb3duZXINCmRhdGEgJT4lDQogIHRhYnlsKEhvbWVvd25lcikgJT4lDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKGRpZ2l0cyA9IDIpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlThuqduIHN14bqldCB2w6AgdOG7tyBs4buHIHBo4bqnbiB0csSDbSAtIEhvbWVvd25lciIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gOC40NDQga2jDoWNoIGjDoG5nICg2MC4wNiUpIGzDoCBjaOG7pyBz4bufIGjhu691IG5ow6AsIGPDsm4gNS42MTUgbmfGsOG7nWkgKDM5Ljk0JSkga2jDtG5nIHPhu58gaOG7r3UuDQoNCi0gxJDDonkgbMOgIG3hu5l0IGNo4buJIGLDoW8gcXVhbiB0cuG7jW5nIHbhu4Egc+G7sSDhu5VuIMSR4buLbmggdMOgaSBjaMOtbmggY+G7p2Ega2jDoWNoIGjDoG5nLg0KDQotIE5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCB0aMaw4budbmcgY8OzOg0KDQogIC0gQ2hpIHRpw6p1IOG7lW4gxJHhu4tuaCBoxqFuLg0KDQogIC0gTmh1IGPhuqd1IG11YSBz4bqvbSBuaGnhu4F1IGjGoW4gY2hvIGdpYSDEkcOsbmggKHRo4buxYyBwaOG6qW0sIMSR4buTIGdpYSBk4bulbmcpLg0KDQotIFRyb25nIGtoaSDEkcOzLCBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIChjw7MgdGjhu4MgdGh1w6ogbmjDoCBob+G6t2Mgc+G7kW5nIHThuqFtIHRo4budaSkgY8OzIHRo4buDOg0KDQogIC0gQ2hpIHRpw6p1IGTDqCBk4bq3dCBoxqFuLg0KDQogIC0gw410IG11YSBow6BuZyBz4buRIGzGsOG7o25nIGzhu5tuLCBob+G6t2MgxrB1IHRpw6puIGjDoG5nIG5o4buPIGfhu41uLCBk4buFIHbhuq1uIGNodXnhu4NuLg0KDQoNCiMjIyMjICoqMy4zLjIuNCBBbm51YWxJbmNvbWUqKg0KYGBge3J9DQp0YWJsZShkYXRhJEFubnVhbEluY29tZSkNCmdncGxvdChkYXRhLCBhZXMoeCA9IEFubnVhbEluY29tZSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJvcmNoaWQiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiVGh1IG5o4bqtcCBow6BuZyBuxINtIiwgeCA9ICJBbm51YWwgSW5jb21lIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KYGBge3J9DQojIEFubnVhbEluY29tZQ0KZGF0YSAlPiUNCiAgdGFieWwoQW5udWFsSW5jb21lKSAlPiUNCiAgYWRvcm5fcGN0X2Zvcm1hdHRpbmcoZGlnaXRzID0gMikgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiVOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgcGjhuqduIHRyxINtIC0gQW5udWFsIEluY29tZSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIE5ow7NtICQzMEsgLSAkNTBLIGNoaeG6v20gbmhp4buBdSBuaOG6pXQgKDMyLjczJSksIHRoZW8gc2F1IGzDoDoNCg0KICAtICQxMEsgLSAkMzBLICgyMS45OCUpDQoNCiAgLSAkNTBLIC0gJDcwSyAoMTYuODYlKQ0KDQotIFLhuqV0IMOtdCBraMOhY2ggaMOgbmcgY8OzIHRodSBuaOG6rXAgdHLDqm4gJDkwSy4NCg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgY2h14buXaSBzacOqdSB0aOG7iyBjaOG7pyB54bq/dSBwaOG7pWMgduG7pSBuaMOzbSB0aHUgbmjhuq1wIHRydW5nIGLDrG5oIHbDoCB0aOG6pXAg4oCTIHBow7kgaOG7o3AgduG7m2kgY2hp4bq/biBsxrDhu6NjIGdpw6EgcuG6uywgaMOgbmcgaMOzYSB0aGnhur90IHnhur91Lg0KDQotIENoaeG6v24gbMaw4bujYyBtYXJrZXRpbmcsIGtodXnhur9uIG3Do2ksIHbDoCBjaMOtbmggc8OhY2ggZ2nDoSBuw6puIHThuq1wIHRydW5nIHbDoG8gbmjDs20gbsOgeSAodsOtIGThu6U6IGNvbWJvIHRp4bq/dCBraeG7h20sIGNoaeG6v3Qga2jhuqV1IHRoZW8gc+G7kSBsxrDhu6NuZykuDQoNCiMjIyMjICoqMy4zLjIuNSBDaXR5KioNCmBgYHtyfQ0KdGFibGUoZGF0YSRDaXR5KQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gQ2l0eSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJjb3JhbCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJUaMOgbmggcGjhu5EiLCB4ID0gIkNpdHkiLCB5ID0gIlThuqduIHN14bqldCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQpgYGB7cn0NCiMgQ2l0eQ0KZGF0YSAlPiUNCiAgdGFieWwoQ2l0eSkgJT4lDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKGRpZ2l0cyA9IDIpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlThuqduIHN14bqldCB2w6AgdOG7tyBs4buHIHBo4bqnbiB0csSDbSAtIENpdHkiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBDw6FjIHRow6BuaCBwaOG7kSBjw7MgdOG7tyBs4buHIGdpYW8gZOG7i2NoIGNhbyBuaOG6pXQgbMOgOg0KDQogIC0gU2FsZW0gKDkuODYlKQ0KDQogIC0gVGFjb21hICg4Ljk0JSkNCg0KICAtIExvcyBBbmdlbGVzICg2LjU5JSkNCg0KICAtIFNlYXR0bGUgKDYuNTYlKQ0KDQotIEPDsyB0aOG7gyBuaOG6rW4gdGjhuqV5IHPhu7EgdOG6rXAgdHJ1bmcgbeG6oW5oIHThuqFpIGPDoWMgdGjDoG5oIHBo4buRIGLhu50gVMOieSBIb2EgS+G7sywgxJHhurdjIGJp4buHdCDhu58gY8OhYyBiYW5nIFdhc2hpbmd0b24sIE9yZWdvbiB2w6AgQ2FsaWZvcm5pYS4NCg0KLSDEkGnhu4F1IG7DoHkgZ+G7o2kgw70gcuG6sW5nOg0KDQogIC0gQ8OhYyBjaGkgbmjDoW5oIOG7nyBjw6FjIHRow6BuaCBwaOG7kSBuw6B5IGPDsyBsxrB1IGzGsOG7o25nIGtow6FjaCBow6BuZyBs4bubbiwgaG/hurdjDQoNCiAgLSBDw6FjIHRow6BuaCBwaOG7kSBuw6B5IGPDsyBt4bqtdCDEkeG7mSBkw6JuIGPGsCBjYW8sIG5odSBj4bqndSB0acOqdSBkw7luZyB0aMaw4budbmcgeHV5w6puLg0KICANCiMjIyMjICoqMy4zLjIuNiBTdGF0ZW9yUHJvdmluY2UqKg0KYGBge3J9DQp0YWJsZShkYXRhJFN0YXRlb3JQcm92aW5jZSkNCmdncGxvdChkYXRhLCBhZXMoeCA9IFN0YXRlb3JQcm92aW5jZSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJnb2xkZW5yb2QiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQmFuZyBob+G6t2MgdOG7iW5oIiwgeCA9ICJTdGF0ZSBvciBQcm92aW5jZSIsIHkgPSAiVOG6p24gc3XhuqV0IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBTdGF0ZW9yUHJvdmluY2UNCmRhdGEgJT4lDQogIHRhYnlsKFN0YXRlb3JQcm92aW5jZSkgJT4lDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKGRpZ2l0cyA9IDIpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlThuqduIHN14bqldCB2w6AgdOG7tyBs4buHIHBo4bqnbiB0csSDbSAtIFN0YXRlIG9yIFByb3ZpbmNlIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gUGjDom4gYuG7kToNCg0KICAtIFdhc2hpbmd0b246IDMyLjQ4JQ0KDQogIC0gQ2FsaWZvcm5pYTogMTkuNDQlDQoNCiAgLSBPcmVnb246IDE2LjA5JQ0KDQotIEJhIGJhbmcgbsOgeSDEkeG7gXUg4bufIGLhu50gVMOieSBIb2EgS+G7sywgdsOgIGzDoCBuaOG7r25nIGJhbmcgY8OzOg0KDQogIC0gRMOibiBz4buRIMSRw7RuZywgdGjhu4sgdHLGsOG7nW5nIGLDoW4gbOG6uyBwaMOhdCB0cmnhu4NuLg0KDQogIC0gVGjDs2kgcXVlbiB0acOqdSBkw7luZyBoaeG7h24gxJHhuqFpLCBz4butIGThu6VuZyBk4buLY2ggduG7pSBzacOqdSB0aOG7iyBuaGnhu4F1IGjGoW4gc28gduG7m2kgY8OhYyBraHUgduG7sWMgbsO0bmcgdGjDtG4uDQoNCi0gVmnhu4djIG3hu58gcuG7mW5nIGtpbmggZG9hbmggaG/hurdjIMSR4bqndSB0xrAgdGjDqm0gdsOgbyBjw6FjIGJhbmcgbsOgeSBsw6AgY2hp4bq/biBsxrDhu6NjIGto4bqjIHRoaS4NCg0KIyMjIyMgKiozLjMuMi43IENvdW50cnkqKg0KYGBge3J9DQp0YWJsZShkYXRhJENvdW50cnkpDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBDb3VudHJ5KSkgKw0KICBnZW9tX2JhcihmaWxsID0gImxpZ2h0Ymx1ZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJRdeG7kWMgZ2lhIiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KYGBge3J9DQojIENvdW50cnkNCmRhdGEgJT4lDQogIHRhYnlsKENvdW50cnkpICU+JQ0KICBhZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJU4bqnbiBzdeG6pXQgdsOgIHThu7cgbOG7hyBwaOG6p24gdHLEg20gLSBDb3VudHJ5IikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBU4bu3IGzhu4cga2jDoWNoIGjDoG5nIHRoZW8gcXXhu5FjIGdpYToNCg0KICAtIFVTQTogNjguMDElDQoNCiAgLSBNZXhpY286IDI2LjIzJQ0KDQogIC0gQ2FuYWRhOiA1Ljc1JQ0KDQotIFVTIEhvYSBL4buzIHLDtSByw6BuZyBsw6AgdGjhu4sgdHLGsOG7nW5nIHRy4buNbmcgxJFp4buDbS4NCg0KLSBUdXkgbmhpw6puLCBz4buxIGhp4buHbiBkaeG7h24gdOG6oWkgTWV4aWNvIChoxqFuIDEvNCBz4buRIGdpYW8gZOG7i2NoKSBjaG8gdGjhuqV5IMSRw6J5IGzDoCB0aOG7iyB0csaw4budbmcgdGjhu6kgY+G6pXAgdGnhu4FtIG7Eg25nLCBjw7MgdGjhu4MgbeG7nyBy4buZbmcgaG/hurdjIHTEg25nIG5o4bqtbiBkaeG7h24gdGjGsMahbmcgaGnhu4d1Lg0KDQoNCiMjIyMjICoqMy4zLjIuOCBQcm9kdWN0RmFtaWx5KioNCmBgYHtyfQ0KdGFibGUoZGF0YSRQcm9kdWN0RmFtaWx5KQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gUHJvZHVjdEZhbWlseSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJtZWRpdW12aW9sZXRyZWQiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiTmjDs20gc+G6o24gcGjhuqltIiwgeCA9ICJQcm9kdWN0IEZhbWlseSIsIHkgPSAiVOG6p24gc3XhuqV0IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBQcm9kdWN0RmFtaWx5DQpkYXRhICU+JQ0KICB0YWJ5bChQcm9kdWN0RmFtaWx5KSAlPiUNCiAgYWRvcm5fcGN0X2Zvcm1hdHRpbmcoZGlnaXRzID0gMikgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiVOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgcGjhuqduIHRyxINtIC0gUHJvZHVjdCBGYW1pbHkiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBUaOG7sWMgcGjhuqltIChGb29kKSBjaGnhur9tIDcyLjIyJSwgY2FvIHbGsOG7o3QgdHLhu5lpIHNvIHbhu5tpOg0KDQogIC0gTm9uLUNvbnN1bWFibGVzICgxOC44OSUpDQoNCiAgLSDEkOG7kyB14buRbmcgKERyaW5rIOKAkyA4Ljg5JSkNCg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcgbXVhIHPhuq9tIGNo4bunIHnhur91IGzDoCDEkeG7gyBwaOG7pWMgduG7pSBuaHUgY+G6p3UgxINuIHXhu5FuZyBow6BuZyBuZ8OgeS4NCg0KLSBTacOqdSB0aOG7iyBuw6puIHRp4bq/cCB04bulYyDEkeG6p3UgdMawIG3huqFuaCB2w6BvOg0KDQogIC0gTmd14buTbiBjdW5nIHRo4buxYyBwaOG6qW0gdMawxqFpLA0KDQogIC0gQ8OhYyBz4bqjbiBwaOG6qW0gdGhp4bq/dCB54bq/dSBnacOhIHThu5F0LA0KDQogIC0gQ2jDrW5oIHPDoWNoIMawdSDEkcOjaSBz4buRIGzGsOG7o25nIGzhu5tuIGNobyB0aOG7sWMgcGjhuqltLg0KICANCiMjIyMjICoqMy4zLjIuOSBQcm9kdWN0RGVwYXJ0bWVudCoqDQpgYGB7cn0NCnRhYmxlKGRhdGEkUHJvZHVjdERlcGFydG1lbnQpDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBQcm9kdWN0RGVwYXJ0bWVudCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJkb2RnZXJibHVlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIlBow7JuZyBiYW4gc+G6o24gcGjhuqltIiwgeCA9ICJQcm9kdWN0IERlcGFydG1lbnQiLCB5ID0gIlThuqduIHN14bqldCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQpgYGB7cn0NCiMgUHJvZHVjdERlcGFydG1lbnQNCmRhdGEgJT4lDQogIHRhYnlsKFByb2R1Y3REZXBhcnRtZW50KSAlPiUNCiAgYWRvcm5fcGN0X2Zvcm1hdHRpbmcoZGlnaXRzID0gMikgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiVOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgcGjhuqduIHRyxINtIC0gUHJvZHVjdCBEZXBhcnRtZW50IikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBC4buZIHBo4bqtbiBs4bubbiBuaOG6pXQ6DQoNCiAgLSBQcm9kdWNlIChSYXUgcXXhuqMpOiAxNC4xOCUNCg0KICAtIFNuYWNrIEZvb2RzOiAxMS4zOCUNCg0KICAtIEhvdXNlaG9sZDogMTAuMTAlDQoNCi0gS2jDoWNoIGjDoG5nIG11YSBuaGnhu4F1IGPDoWMgbeG6t3QgaMOgbmc6DQoNCiAgLSBUxrDGoWkgc+G7kW5nLCBk4buFIGjhu49uZyAocHJvZHVjZSkg4p6kIHnDqnUgY+G6p3UgYuG6o28gcXXhuqNuIHbDoCBjaHXhu5dpIGN1bmcg4bupbmcgdOG7kXQuDQoNCiAgLSDEkOG7kyDEg24gduG6t3QgdsOgIGjDoG5nIGdpYSBk4bulbmcg4p6kIHBo4bqjbiDDoW5oIHRow7NpIHF1ZW4gdGnDqnUgZMO5bmcgbmhhbmgsIHRp4buHbiBs4bujaS4NCg0KLSDEkMOieSBsw6AgY8ahIGjhu5lpIMSR4buDIHTEg25nIGPGsOG7nW5nIG1hcmtldGluZyBuaMOzbSBz4bqjbiBwaOG6qW0gdGnhu4duIGzhu6NpLCBjb21ibyBi4buvYSDEg24sIHPhuqNuIHBo4bqpbSBjaG8gaOG7mSBnaWEgxJHDrG5oLg0KDQojIyMjIyAqKjMuMy4yLjEwIFByb2R1Y3RDYXRlZ29yeSoqDQpgYGB7cn0NCnRhYmxlKGRhdGEkUHJvZHVjdENhdGVnb3J5KQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gUHJvZHVjdENhdGVnb3J5KSkgKw0KICBnZW9tX2JhcihmaWxsID0gInNlYWdyZWVuIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkRhbmggbeG7pWMgc+G6o24gcGjhuqltIiwgeCA9ICJQcm9kdWN0IENhdGVnb3J5IiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KYGBge3J9DQojIFByb2R1Y3RDYXRlZ29yeQ0KZGF0YSAlPiUNCiAgdGFieWwoUHJvZHVjdENhdGVnb3J5KSAlPiUNCiAgYWRvcm5fcGN0X2Zvcm1hdHRpbmcoZGlnaXRzID0gMikgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiVOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgcGjhuqduIHRyxINtIC0gUHJvZHVjdCBDYXRlZ29yeSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIExv4bqhaSBwaOG7lSBiaeG6v24gbmjhuqV0Og0KDQogIC0gVmVnZXRhYmxlcyAoUmF1KTogMTIuMjklDQoNCiAgLSBTbmFjayBGb29kczogMTEuMzglDQoNCiAgLSBEYWlyeSAoU+G7r2EpOiA2LjQyJQ0KDQogIC0gRnJ1aXQsIE1lYXQsIEZyb3plbiBGb29kcy4uLg0KDQotIMSQw6J5IGzDoCBuaOG7r25nIG3hurd0IGjDoG5nIHRpw6p1IGTDuW5nIG5oYW5oLCBjw7MgdsOybmcgxJHhu51pIG5n4bqvbi4NCg0KLSBWaeG7h2Mga2jDoWNoIGjDoG5nIG11YSBjaOG7pyB54bq/dSBjw6FjIG3hurd0IGjDoG5nIHRoaeG6v3QgeeG6v3UgY2hvIHRo4bqleSBzacOqdSB0aOG7iyBob+G6oXQgxJHhu5luZyB04buRdCB0cm9uZyB2aeG7h2MgcGjhu6VjIHbhu6Ugbmh1IGPhuqd1IGPGoSBi4bqjbiwgY2jhu6kga2jDtG5nIHBo4bqjaSBz4bqjbiBwaOG6qW0geGEgeOG7iSBoYXkga2jDtG5nIHRoxrDhu51uZyB4dXnDqm4uDQoNCioqS+G6vlQgTFXhuqxOIFThu5RORyBRVcOBVCoqDQoNCi0gROG7ryBsaeG7h3UgY2hvIHRo4bqleSDEkeG7kWkgdMaw4bujbmcga2jDoWNoIGjDoG5nIGNow61uaCBsw6A6DQoNCiAgLSBOZ8aw4budaSBN4bu5ICjEkWEgcGjhuqduIOG7nyBiYW5nIFdhc2hpbmd0b24sIE9yZWdvbiwgQ2FsaWZvcm5pYSkNCg0KICAtIFRodSBuaOG6rXAgdHJ1bmcgYsOsbmgNCg0KICAtIENo4bunIHnhur91IG11YSB0aOG7sWMgcGjhuqltIHTGsMahaSBz4buRbmcgdsOgIHRoaeG6v3QgeeG6v3UNCg0KICAtIEdpYW8gZOG7i2NoIHThuq1wIHRydW5nIOG7nyBuaMOzbSB0deG7lWkgdsOgIHTDrG5oIHRy4bqhbmcgxJHhu5ljIHRow6JuL2PDsyBuaMOgIHJpw6puZw0KDQotIFbhu5tpIMSR4bq3YyDEkWnhu4NtIG7DoHksIGPDoWMgc2nDqnUgdGjhu4sgbsOqbjoNCg0KICAtIFThu5FpIMawdSBow7NhIGNodeG7l2kgY3VuZyDhu6luZyB0aOG7sWMgcGjhuqltIHTGsMahaQ0KDQogIC0gVOG6rXAgdHJ1bmcga2h1eeG6v24gbcOjaSBjaG8gbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAg4oCTIHRydW5nIGLDrG5oDQoNCiAgLSBUaGnhur90IGvhur8gc+G6o24gcGjhuqltICYgdHLhuqNpIG5naGnhu4dtIG11YSBz4bqvbSB0aeG7h24gbOG7o2ksIGdpw6EgdOG7kXQNCg==