Thống kê mô tả đơn biến trong tập Supermarket Transactions.csv

# Đọc file csv
data <- read.csv("C:/Users/HP/Downloads/Supermarket Transactions (1).csv", stringsAsFactors = FALSE)
# Lấy tên các biến định tính
categorical_vars <- c(
  "Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
  "City", "StateorProvince", "Country",
  "ProductFamily", "ProductDepartment", "ProductCategory"
)

Biến Gender (Giới tính)

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
ggplot(data, aes(x = Gender)) +
  geom_bar(fill = "darkblue") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Giới tính", x = "Giới tính", y = "Tần suất")

  • Tỷ lệ khách hàng theo giới tính khá cân bằng giữa nam (M) và nữ (F).

  • Nữ chiếm 51%, nhỉnh hơn một chút so với nam là 49%.

  • Điều này cho thấy không có sự chênh lệch lớn về giới tính trong mẫu dữ liệu này.

  • Cửa hàng/công ty có thể thiết kế chiến lược marketing không cần phân biệt giới tính mạnh, vì cả hai nhóm khách hàng đều tương đương về tỷ lệ.

Biến MaritalStatus (Tình trạng hôn nhân)

library(ggplot2)
table(data$MaritalStatus)
## 
##    M    S 
## 6866 7193
ggplot(data, aes(x = MaritalStatus)) +
  geom_bar(fill = "lightblue") +
  theme_minimal() +
  labs(title = "Tình trạng hôn nhân", x = "Marital Status", y = "Tan suat")

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.

Biến Homeowner (Sở hữu nhà)

ggplot(data, aes(x = Homeowner)) +
  geom_bar(fill = "darkgreen") +
  theme_minimal() +
  labs(title = "Sở hữu nhà", x = "Homeowner", y = "Tần suất")

Khoảng 60% khách hàng trong dữ liệu là người sở hữu nhà, trong khi gần 40% không sở hữu nhà. Điều này phản ánh rằng phần lớn khách hàng của siêu thị thuộc nhóm đã có điều kiện kinh tế ổn định hơn. Tuy nhiên, nhóm không sở hữu nhà vẫn chiếm tỷ lệ đáng kể, cho thấy siêu thị cũng tiếp cận được nhóm khách hàng thuê nhà hoặc chưa có nhà riêng.

Biến AnnualIncome (Thu nhập hàng năm – theo nhóm)

ggplot(data, aes(x = AnnualIncome)) +
  geom_bar(fill = "orangered") +
  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))

Điểm nổi bật:

  • Tập trung vào thu nhập tầm trung: Nhóm có thu nhập trong khoảng 30K – 70K chiếm khoảng 50% tổng số khách hàng. Đây chính là thị trường mục tiêu chính.

  • Thu nhập thấp - trung (10K – 30K) vẫn chiếm gần 22%, cho thấy sự hiện diện rõ rệt của phân khúc tiết kiệm. Nếu sản phẩm hoặc dịch vụ cần định giá, nên cân nhắc gói giá phù hợp nhóm này.

  • Nhóm có thu nhập cao (> 90K) chỉ chiếm khoảng 16%. Riêng nhóm rất cao > 150Krất nhỏ. Do đó, các chiến dịch sản phẩm/dịch vụ cao cấp cần nhắm đúng đối tượng, tránh lan rộng thiếu hiệu quả.

  • Phân bố thu nhập bị lệch trái (left-skewed): Phần lớn khách hàng thuộc nhóm thu nhập thấp - trung. Đỉnh phân bố rơi vào nhóm 30K–50K, càng về mức cao thì số lượng càng giảm.

Biến City (Thành phố)

ggplot(data, aes(x = City)) +
  geom_bar(fill = "firebrick") +
  theme_minimal() +
  labs(title = "Thành phố", x = "Thành phố", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Nhận xét tổng quan:

  • Tập trung tại một số thành phố lớn:

    Những thành phố có tỷ lệ khách hàng cao nhất bao gồm:

    • Salem (9.86%)

    • Tacoma (8.94%)

    • Los Angeles (6.59%)

    • Seattle (6.56%)

    • Portland (6.23%)

    • San Diego (6.16%)

    → Đây là những khu vực tập trung đông khách hàng nhất, nên ưu tiên trong các chiến dịch marketing, phân phối hoặc dịch vụ khách hàng.

  • Phân bố tương đối trải đều ở nhóm giữa:

    Một số thành phố như Bremerton, Hidalgo, Spokane, Vancouver,… có tỷ lệ khách hàng ở mức trung bình từ 3% đến 6%, đóng vai trò bổ trợ quan trọng.

  • Nhóm có tỷ lệ thấp (dưới 2%):

    Các thành phố như Guadalajara, Walla Walla, Victoria, San Francisco, Bellingham,… có số lượng khách hàng thấp hơn, có thể không phải là thị trường chính, nhưng có thể khai thác thêm nếu muốn mở rộng.

Biến StateorProvince (Bang hoặc tỉnh)

ggplot(data, aes(x = StateorProvince)) +
  geom_bar(fill = "gray25") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Bang/Tỉnh", x = "Bang/Tỉnh", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Nhận xét tổng quan:

  • Tập trung mạnh tại bang WA (Washington):

    Với 32.48% tổng số khách hàng (tương đương 4,567 khách), bang WA là thị trường trọng điểm, cần được ưu tiên cao nhất trong các chiến lược kinh doanh và tiếp thị.

  • Nhóm quan trọng thứ hai:

    • CA (California) chiếm 19.44%

    • OR (Oregon) chiếm 16.09%

    → Tổng cộng ba bang WA, CA, OR đã chiếm đến gần 70% tổng số khách hàng.

    Đây là vùng thị trường cốt lõi, nên đầu tư mạnh về nhân lực, quảng bá, dịch vụ hậu mãi tại khu vực này.

  • Bang có mức độ khách hàng trung bình:

    • Zacatecas (9.23%)

    • DF (5.80%)

    • BC (5.75%)

    → Đây là những khu vực phụ trợ đáng chú ý, có thể cân nhắc triển khai các chương trình marketing khu vực nhỏ (regional marketing).

  • Bang có tỷ lệ thấp (<5%):

    Guerrero, Jalisco, Veracruz, Yucatan — tuy có số lượng khách ít hơn, vẫn có thể cân nhắc tăng nhận diện thương hiệu, đặc biệt nếu muốn mở rộng thị trường về phía Mexico.

Biến Country (Quốc gia)

ggplot(data, aes(x = Country)) +
  geom_bar(fill = "deeppink") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Quốc gia", x = "Quốc gia", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Nhận xét tổng quan:

  • Mỹ (USA) chiếm 68.01% tổng số khách hàng – đây là thị trường chính yếu và áp đảo tuyệt đối.

    → Các chiến lược kinh doanh, marketing, sản phẩm cần ưu tiên tối đa cho khách hàng Hoa Kỳ.

  • Mexico chiếm 26.23% – là thị trường phụ nhưng rất đáng chú ý với gần 1/4 tổng khách hàng.

    → Có thể cân nhắc bản địa hoá thông điệp, ưu đãi hoặc sản phẩm dành riêng cho khu vực này.

  • Canada chỉ chiếm 5.75% – số lượng tương đối nhỏ.

    → Không phải thị trường trọng tâm hiện tại, nhưng vẫn có thể được duy trì như một khu vực vệ tinh hỗ trợ hoặc để thử nghiệm sản phẩm mới.

Biến ProductFamily (Nhóm sản phẩm lớn)

ggplot(data, aes(x = ProductFamily)) +
  geom_bar(fill = "darkslategray") +
  theme_minimal() +
  labs(title = "Nhóm sản phẩm", x = "Nhóm sản phẩm", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

  • Nhóm Food (thực phẩm) chiếm trên 72% tổng giao dịch, là mảng sản phẩm cốt lõi và chủ đạo.

    → Các quyết định về danh mục, chất lượng, giá, khuyến mãi… nên ưu tiên nhóm này.

  • Non-Consumable (phi tiêu dùng, như đồ gia dụng, điện tử…) chiếm gần 19% – là mảng phụ nhưng tiềm năng.

    → Có thể khai thác thêm về upsell hoặc cross-sell với nhóm khách hàng mua Food.

  • Drink (thức uống) chỉ chiếm gần 9% – là mảng nhỏ, nên cân nhắc tập trung vào các sản phẩm có biên lợi nhuận cao hoặc liên kết combo với Food.

Biến ProductDepartment (Phòng ban sản phẩm)

ggplot(data, aes(x = ProductDepartment)) +
  geom_bar(fill = "midnightblue") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Bộ phận sản phẩm", x = "Bộ phận", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

  • Produce (Rau quả tươi) là phòng ban chiếm tỷ trọng lớn nhất (14.18%), thể hiện xu hướng tiêu dùng thực phẩm tươi sống cao.

  • Snack Foods và Frozen Foods chiếm tỷ trọng lớn thứ 2 và 3 → cho thấy nhu cầu cao với đồ ăn nhanh, tiện lợi, thích hợp cho khách bận rộn hoặc gia đình.

  • Household (Đồ gia dụng) cũng chiếm hơn 10%, là sản phẩm thiết yếu trong đời sống → có thể kết hợp bán chéo.

  • Các nhóm như Meat, Seafood, Periodicals, Checkout, Carousel… chiếm tỷ trọng rất nhỏ → không phải trọng tâm hiện tại.

Biến ProductCategory (Danh mục sản phẩm cụ thể)

ggplot(data, aes(x = ProductCategory)) +
  geom_bar(fill = "dodgerblue4") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Loại sản phẩm", x = "Loại sản phẩm", y = "Tần suất") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Nhận xét:

  • Vegetables là danh mục chiếm tỷ lệ cao nhất (12.29%) → cho thấy ưu tiên hàng đầu với nhóm thực phẩm tươi sống.

  • Snack Foods tiếp tục là danh mục chủ lực (11.38%) → xu hướng tiêu dùng đồ ăn nhanh, tiện dụng rất rõ ràng.

  • Dairy, Fruit và Meat đều nằm trong nhóm top 5 → đây là những sản phẩm thiết yếu, tiêu dùng hàng ngày.

  • Các danh mục như Canned Seafood (Canned Sardines, Tuna, Shrimp…) có tỷ trọng thấp (~0.3–0.6%) → ít được quan tâm, có thể là do khẩu vị, thói quen tiêu dùng.

Các danh mục có tỷ trọng rất thấp (<1%):

  • Candles, Canned Clams, Miscellaneous, Electrical… có lượng mua cực kỳ thấp → không phải ưu tiên chính trong chiến lược kinh doanh.
LS0tDQp0aXRsZTogIkJUMiINCmF1dGhvcjogIlZvSGlldSINCmRhdGU6ICIyMDI1LTA1LTIwIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQo8c3R5bGU+DQpib2R5IHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBzYW5zLXNlcmlmOw0KICBmb250LXNpemU6IDE1cHg7DQogIHRleHQtYWxpZ246IGp1c3RpZnk7DQogIGxpbmUtaGVpZ2h0OiAxLjU7DQo8L3N0eWxlPg0KDQojICoqVGjhu5FuZyBrw6ogbcO0IHThuqMgxJHGoW4gYmnhur9uIHRyb25nIHThuq1wIFN1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YqKg0KDQpgYGB7cn0NCiMgxJDhu41jIGZpbGUgY3N2DQpkYXRhIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9IUC9Eb3dubG9hZHMvU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25zICgxKS5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQojIEzhuqV5IHTDqm4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KY2F0ZWdvcmljYWxfdmFycyA8LSBjKA0KICAiR2VuZGVyIiwgIk1hcml0YWxTdGF0dXMiLCAiSG9tZW93bmVyIiwgIkFubnVhbEluY29tZSIsDQogICJDaXR5IiwgIlN0YXRlb3JQcm92aW5jZSIsICJDb3VudHJ5IiwNCiAgIlByb2R1Y3RGYW1pbHkiLCAiUHJvZHVjdERlcGFydG1lbnQiLCAiUHJvZHVjdENhdGVnb3J5Ig0KKQ0KYGBgDQojIEJp4bq/biBHZW5kZXIgKEdp4bubaSB0w61uaCkNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBHZW5kZXIpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZGFya2JsdWUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCB0aGVvIEdp4bubaSB0w61uaCIsIHggPSAiR2nhu5tpIHTDrW5oIiwgeSA9ICJU4bqnbiBzdeG6pXQiKQ0KYGBgDQoNCi0gVOG7tyBs4buHIGtow6FjaCBow6BuZyB0aGVvIGdp4bubaSB0w61uaCBraMOhIGPDom4gYuG6sW5nIGdp4buvYSBuYW0gKE0pIHbDoCBu4buvIChGKS4NCg0KLSBO4buvIGNoaeG6v20gNTElLCBuaOG7iW5oIGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgbmFtIGzDoCA0OSUuDQoNCi0gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggbOG7m24gduG7gSBnaeG7m2kgdMOtbmggdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UgbsOgeS4NCg0KLSBD4butYSBow6BuZy9jw7RuZyB0eSBjw7MgdGjhu4MgdGhp4bq/dCBr4bq/IGNoaeG6v24gbMaw4bujYyBtYXJrZXRpbmcga2jDtG5nIGPhuqduIHBow6JuIGJp4buHdCBnaeG7m2kgdMOtbmggbeG6oW5oLCB2w6wgY+G6oyBoYWkgbmjDs20ga2jDoWNoIGjDoG5nIMSR4buBdSB0xrDGoW5nIMSRxrDGoW5nIHbhu4EgdOG7tyBs4buHLg0KDQojIEJp4bq/biBNYXJpdGFsU3RhdHVzIChUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4pDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KdGFibGUoZGF0YSRNYXJpdGFsU3RhdHVzKQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gTWFyaXRhbFN0YXR1cykpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJsaWdodGJsdWUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIiwgeCA9ICJNYXJpdGFsIFN0YXR1cyIsIHkgPSAiVGFuIHN1YXQiKQ0KYGBgDQoNCk5o4bqtbiB4w6l0DQoNCi0gU+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgxJHhu5ljIHRow6JuIChTaW5nbGUg4oCTIGvDvSBoaeG7h3UgUykgbMOgIDcuMTkzIG5nxrDhu51pICg1MS4xNiUpLCBjw7JuIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biAoTWFycmllZCDigJMgTSkgbMOgIDYuODY2IG5nxrDhu51pICg0OC44NCUpLg0KDQotIE3hurdjIGTDuSB04bu3IGzhu4cga2jDoSBjw6JuIGLhurFuZywgbmjGsG5nIG5ow7NtIMSR4buZYyB0aMOibiBjaGnhur9tIHThu7cgbOG7hyBjYW8gaMahbiBt4buZdCBjaMO6dC4NCg0KLSBHaeG6o2kgdGjDrWNoIGjhu6NwIGzDvSBjaG8gxJFp4buBdSBuw6B5IGPDsyB0aOG7gyBsw6A6DQoNCi0gTmjhu69uZyBuZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIHh1IGjGsOG7m25nIHThu7EgxJFpIG11YSBz4bqvbSBuaGnhu4F1IGjGoW4sIGtow7RuZyBk4buxYSB2w6BvIGLhuqFuIMSR4budaS4NCg0KTmdvw6BpIHJhLCBuZ8aw4budaSB0cuG6uyDEkeG7mWMgdGjDom4gdGjGsOG7nW5nIHPhu5FuZyDhu58gdGjDoG5oIHRo4buLIHbDoCBz4butIGThu6VuZyBk4buLY2ggduG7pSBzacOqdSB0aOG7iyB0aMaw4budbmcgeHV5w6puIGjGoW4sIHRyb25nIGtoaSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHRo4buDIG11YSB0aGVvIG5ow7NtIGhv4bq3YyB0aGVvIGjhu5kgZ2lhIMSRw6xuaCBs4bubbiB2w6Agw610IGdpYW8gZOG7i2NoIGjGoW4gdHLDqm4gbeG7l2kgY8OhIG5ow6JuLg0KDQojIEJp4bq/biBIb21lb3duZXIgKFPhu58gaOG7r3UgbmjDoCkNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBIb21lb3duZXIpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZGFya2dyZWVuIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIlPhu58gaOG7r3UgbmjDoCIsIHggPSAiSG9tZW93bmVyIiwgeSA9ICJU4bqnbiBzdeG6pXQiKQ0KYGBgDQoNCktob+G6o25nIDYwJSBraMOhY2ggaMOgbmcgdHJvbmcgZOG7ryBsaeG7h3UgbMOgIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCwgdHJvbmcga2hpIGfhuqduIDQwJSBraMO0bmcgc+G7nyBo4buvdSBuaMOgLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggcuG6sW5nIHBo4bqnbiBs4bubbiBraMOhY2ggaMOgbmcgY+G7p2Egc2nDqnUgdGjhu4sgdGh14buZYyBuaMOzbSDEkcOjIGPDsyDEkWnhu4F1IGtp4buHbiBraW5oIHThur8g4buVbiDEkeG7i25oIGjGoW4uDQpUdXkgbmhpw6puLCBuaMOzbSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHbhuqtuIGNoaeG6v20gdOG7tyBs4buHIMSRw6FuZyBr4buDLCBjaG8gdGjhuqV5IHNpw6p1IHRo4buLIGPFqW5nIHRp4bq/cCBj4bqtbiDEkcaw4bujYyBuaMOzbSBraMOhY2ggaMOgbmcgdGh1w6ogbmjDoCBob+G6t2MgY2jGsGEgY8OzIG5ow6AgcmnDqm5nLg0KDQojIEJp4bq/biBBbm51YWxJbmNvbWUgKFRodSBuaOG6rXAgaMOgbmcgbsSDbSDigJMgdGhlbyBuaMOzbSkNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBBbm51YWxJbmNvbWUpKSArDQogIGdlb21fYmFyKGZpbGwgPSAib3JhbmdlcmVkIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIlRodSBuaOG6rXAgaMOgbmcgbsSDbSIsIHggPSAiQW5udWFsIEluY29tZSIsIHkgPSAiVOG6p24gc3XhuqV0IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCioqxJBp4buDbSBu4buVaSBi4bqtdDoqKg0KDQotICoqVOG6rXAgdHJ1bmcgdsOgbyB0aHUgbmjhuq1wIHThuqdtIHRydW5nOioqIE5ow7NtIGPDsyB0aHUgbmjhuq1wIHRyb25nIGtob+G6o25nICoqMzBL4oCv4oCT4oCvNzBLIGNoaeG6v20ga2hv4bqjbmcgNTAlKiogdOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nLiDEkMOieSBjaMOtbmggbMOgICoqdGjhu4sgdHLGsOG7nW5nIG3hu6VjIHRpw6p1IGNow61uaCoqLg0KDQotICoqVGh1IG5o4bqtcCB0aOG6pXAgLSB0cnVuZyAoMTBL4oCv4oCT4oCvMzBLKSoqIHbhuqtuIGNoaeG6v20gZ+G6p24gKioyMiUqKiwgY2hvIHRo4bqleSBz4buxIGhp4buHbiBkaeG7h24gcsO1IHLhu4d0IGPhu6dhIHBow6JuIGtow7pjIHRp4bq/dCBraeG7h20uIE7hur91IHPhuqNuIHBo4bqpbSBob+G6t2MgZOG7i2NoIHbhu6UgY+G6p24gxJHhu4tuaCBnacOhLCAqKm7Dqm4gY8OibiBuaOG6r2MgZ8OzaSBnacOhIHBow7kgaOG7o3AgbmjDs20gbsOgeSoqLg0KDQotIE5ow7NtIGPDsyAqKnRodSBuaOG6rXAgY2FvICg+4oCvOTBLKSoqIGNo4buJIGNoaeG6v20ga2hv4bqjbmcgKioxNiUqKi4gUmnDqm5nIG5ow7NtIHLhuqV0IGNhbyAqKj7igK8xNTBLKiogbMOgICoqcuG6pXQgbmjhu48qKi4gRG8gxJHDsywgY8OhYyBjaGnhur9uIGThu4tjaCBz4bqjbiBwaOG6qW0vZOG7i2NoIHbhu6UgY2FvIGPhuqVwICoqY+G6p24gbmjhuq9tIMSRw7puZyDEkeG7kWkgdMaw4bujbmcsIHRyw6FuaCBsYW4gcuG7mW5nIHRoaeG6v3UgaGnhu4d1IHF14bqjKiouDQoNCi0gKipQaMOibiBi4buRIHRodSBuaOG6rXAgYuG7iyBs4buHY2ggdHLDoWkgKGxlZnQtc2tld2VkKToqKiBQaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nIHRodeG7mWMgbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAgLSB0cnVuZy4gKirEkOG7iW5oIHBow6JuIGLhu5EgcsahaSB2w6BvIG5ow7NtIDMwS+KAkzUwSyoqLCBjw6BuZyB24buBIG3hu6ljIGNhbyB0aMOsIHPhu5EgbMaw4bujbmcgY8OgbmcgZ2nhuqNtLg0KDQojIEJp4bq/biBDaXR5IChUaMOgbmggcGjhu5EpDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gQ2l0eSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJmaXJlYnJpY2siKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiVGjDoG5oIHBo4buRIiwgeCA9ICJUaMOgbmggcGjhu5EiLCB5ID0gIlThuqduIHN14bqldCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0IHThu5VuZyBxdWFuOioqDQoNCi0gKipU4bqtcCB0cnVuZyB04bqhaSBt4buZdCBz4buRIHRow6BuaCBwaOG7kSBs4bubbjoqKiAgDQoNCiAgTmjhu69uZyB0aMOgbmggcGjhu5EgY8OzIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgY2FvIG5o4bqldCBiYW8gZ+G7k206DQogIC0gKipTYWxlbSAoOS44NiUpKioNCiAgDQogIC0gKipUYWNvbWEgKDguOTQlKSoqDQogIA0KICAtICoqTG9zIEFuZ2VsZXMgKDYuNTklKSoqDQogIA0KICAtICoqU2VhdHRsZSAoNi41NiUpKioNCiAgDQogIC0gKipQb3J0bGFuZCAoNi4yMyUpKioNCiAgDQogIC0gKipTYW4gRGllZ28gKDYuMTYlKSoqDQoNCiAg4oaSIMSQw6J5IGzDoCBuaOG7r25nIGtodSB24buxYyAqKnThuq1wIHRydW5nIMSRw7RuZyBraMOhY2ggaMOgbmcgbmjhuqV0KiosIG7Dqm4gKirGsHUgdGnDqm4gdHJvbmcgY8OhYyBjaGnhur9uIGThu4tjaCBtYXJrZXRpbmcsIHBow6JuIHBo4buRaSBob+G6t2MgZOG7i2NoIHbhu6Uga2jDoWNoIGjDoG5nKiouDQoNCi0gKipQaMOibiBi4buRIHTGsMahbmcgxJHhu5FpIHRy4bqjaSDEkeG7gXUg4bufIG5ow7NtIGdp4buvYToqKiANCg0KICBN4buZdCBz4buRIHRow6BuaCBwaOG7kSBuaMawIEJyZW1lcnRvbiwgSGlkYWxnbywgU3Bva2FuZSwgVmFuY291dmVyLOKApiBjw7MgdOG7tyBs4buHIGtow6FjaCBow6BuZyDhu58gbeG7qWMgdHJ1bmcgYsOsbmggdOG7qyAqKjMlIMSR4bq/biA2JSoqLCDEkcOzbmcgdmFpIHRyw7IgYuG7lSB0cuG7oyBxdWFuIHRy4buNbmcuDQoNCi0gKipOaMOzbSBjw7MgdOG7tyBs4buHIHRo4bqlcCAoZMaw4bubaSAyJSkqKjogIA0KDQogIEPDoWMgdGjDoG5oIHBo4buRIG5oxrAgR3VhZGFsYWphcmEsIFdhbGxhIFdhbGxhLCBWaWN0b3JpYSwgU2FuIEZyYW5jaXNjbywgQmVsbGluZ2hhbSzigKYgY8OzIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIHRo4bqlcCBoxqFuLCBjw7MgdGjhu4MgKipraMO0bmcgcGjhuqNpIGzDoCB0aOG7iyB0csaw4budbmcgY2jDrW5oKiosIG5oxrBuZyAqKmPDsyB0aOG7gyBraGFpIHRow6FjIHRow6ptIG7hur91IG114buRbiBt4bufIHLhu5luZyoqLg0KDQojIyBCaeG6v24gU3RhdGVvclByb3ZpbmNlIChCYW5nIGhv4bq3YyB04buJbmgpDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gU3RhdGVvclByb3ZpbmNlKSkgKw0KICBnZW9tX2JhcihmaWxsID0gImdyYXkyNSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IHRoZW8gQmFuZy9U4buJbmgiLCB4ID0gIkJhbmcvVOG7iW5oIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpDQpgYGANCg0KKipOaOG6rW4geMOpdCB04buVbmcgcXVhbjoqKg0KDQotICoqVOG6rXAgdHJ1bmcgbeG6oW5oIHThuqFpIGJhbmcgV0EgKFdhc2hpbmd0b24pOioqIA0KDQogIFbhu5tpICoqMzIuNDglKiogdOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nICh0xrDGoW5nIMSRxrDGoW5nICoqNCw1Njcga2jDoWNoKiopLCBiYW5nIFdBIGzDoCAqKnRo4buLIHRyxrDhu51uZyB0cuG7jW5nIMSRaeG7g20qKiwgY+G6p24gxJHGsOG7o2MgKirGsHUgdGnDqm4gY2FvIG5o4bqldCoqIHRyb25nIGPDoWMgY2hp4bq/biBsxrDhu6NjIGtpbmggZG9hbmggdsOgIHRp4bq/cCB0aOG7iy4NCg0KLSAqKk5ow7NtIHF1YW4gdHLhu41uZyB0aOG7qSBoYWk6KiogIA0KDQogIC0gKipDQSAoQ2FsaWZvcm5pYSkqKiBjaGnhur9tICoqMTkuNDQlKioNCiAgDQogIC0gKipPUiAoT3JlZ29uKSoqIGNoaeG6v20gKioxNi4wOSUqKg0KDQogIOKGkiBU4buVbmcgY+G7mW5nIGJhIGJhbmcgKipXQSwgQ0EsIE9SKiogxJHDoyBjaGnhur9tIMSR4bq/biAqKmfhuqduIDcwJSoqIHThu5VuZyBz4buRIGtow6FjaCBow6BuZy4gIA0KICANCiAgxJDDonkgbMOgICoqdsO5bmcgdGjhu4sgdHLGsOG7nW5nIGPhu5F0IGzDtWkqKiwgbsOqbiDEkeG6p3UgdMawIG3huqFuaCB24buBIG5ow6JuIGzhu7FjLCBxdeG6o25nIGLDoSwgZOG7i2NoIHbhu6UgaOG6rXUgbcOjaSB04bqhaSBraHUgduG7sWMgbsOgeS4NCg0KLSAqKkJhbmcgY8OzIG3hu6ljIMSR4buZIGtow6FjaCBow6BuZyB0cnVuZyBiw6xuaDoqKiAgDQogIC0gWmFjYXRlY2FzICgqKjkuMjMlKiopDQogIA0KICAtIERGICgqKjUuODAlKiopDQogIA0KICAtIEJDICgqKjUuNzUlKiopDQoNCiAg4oaSIMSQw6J5IGzDoCBuaOG7r25nIGtodSB24buxYyAqKnBo4bulIHRy4bujIMSRw6FuZyBjaMO6IMO9KiosIGPDsyB0aOG7gyBjw6JuIG5o4bqvYyB0cmnhu4NuIGtoYWkgY8OhYyBjaMawxqFuZyB0csOsbmggbWFya2V0aW5nIGtodSB24buxYyBuaOG7jyAocmVnaW9uYWwgbWFya2V0aW5nKS4NCg0KLSAqKkJhbmcgY8OzIHThu7cgbOG7hyB0aOG6pXAgKDw1JSkqKjogIA0KDQogIEd1ZXJyZXJvLCBKYWxpc2NvLCBWZXJhY3J1eiwgWXVjYXRhbiDigJQgdHV5IGPDsyBz4buRIGzGsOG7o25nIGtow6FjaCDDrXQgaMahbiwgduG6q24gY8OzIHRo4buDIGPDom4gbmjhuq9jICoqdMSDbmcgbmjhuq1uIGRp4buHbiB0aMawxqFuZyBoaeG7h3UqKiwgxJHhurdjIGJp4buHdCBu4bq/dSBtdeG7kW4gbeG7nyBy4buZbmcgdGjhu4sgdHLGsOG7nW5nIHbhu4EgcGjDrWEgTWV4aWNvLg0KDQojIEJp4bq/biBDb3VudHJ5IChRdeG7kWMgZ2lhKQ0KDQpgYGB7cn0NCmdncGxvdChkYXRhLCBhZXMoeCA9IENvdW50cnkpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZGVlcHBpbmsiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCB0aGVvIFF14buRYyBnaWEiLCB4ID0gIlF14buRYyBnaWEiLCB5ID0gIlThuqduIHN14bqldCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0IHThu5VuZyBxdWFuOioqDQoNCi0gKipN4bu5IChVU0EpKiogY2hp4bq/bSAqKjY4LjAxJSoqIHThu5VuZyBz4buRIGtow6FjaCBow6BuZyDigJMgxJHDonkgbMOgICoqdGjhu4sgdHLGsOG7nW5nIGNow61uaCB54bq/dSB2w6Agw6FwIMSR4bqjbyB0dXnhu4d0IMSR4buRaSoqLiANCg0KICDihpIgQ8OhYyBjaGnhur9uIGzGsOG7o2Mga2luaCBkb2FuaCwgbWFya2V0aW5nLCBz4bqjbiBwaOG6qW0gY+G6p24gKirGsHUgdGnDqm4gdOG7kWkgxJFhIGNobyBraMOhY2ggaMOgbmcgSG9hIEvhu7MqKi4NCg0KLSAqKk1leGljbyoqIGNoaeG6v20gKioyNi4yMyUqKiDigJMgbMOgICoqdGjhu4sgdHLGsOG7nW5nIHBo4bulIG5oxrBuZyBy4bqldCDEkcOhbmcgY2jDuiDDvSoqIHbhu5tpIGfhuqduICoqMS80IHThu5VuZyBraMOhY2ggaMOgbmcqKi4gDQoNCiAg4oaSIEPDsyB0aOG7gyBjw6JuIG5o4bqvYyAqKmLhuqNuIMSR4buLYSBob8OhIHRow7RuZyDEkWnhu4dwKiosIMawdSDEkcOjaSBob+G6t2Mgc+G6o24gcGjhuqltIGTDoG5oIHJpw6puZyBjaG8ga2h1IHbhu7FjIG7DoHkuDQoNCi0gKipDYW5hZGEqKiBjaOG7iSBjaGnhur9tICoqNS43NSUqKiDigJMgc+G7kSBsxrDhu6NuZyB0xrDGoW5nIMSR4buRaSBuaOG7jy4gIA0KDQogIOKGkiBLaMO0bmcgcGjhuqNpIHRo4buLIHRyxrDhu51uZyB0cuG7jW5nIHTDom0gaGnhu4duIHThuqFpLCBuaMawbmcgduG6q24gY8OzIHRo4buDIMSRxrDhu6NjIGR1eSB0csOsIG5oxrAgbeG7mXQgKipraHUgduG7sWMgduG7hyB0aW5oIGjhu5cgdHLhu6MqKiBob+G6t2MgxJHhu4MgKip0aOG7rSBuZ2hp4buHbSBz4bqjbiBwaOG6qW0gbeG7m2kqKi4NCg0KIyBCaeG6v24gUHJvZHVjdEZhbWlseSAoTmjDs20gc+G6o24gcGjhuqltIGzhu5tuKQ0KDQpgYGB7cn0NCmdncGxvdChkYXRhLCBhZXMoeCA9IFByb2R1Y3RGYW1pbHkpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZGFya3NsYXRlZ3JheSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJOaMOzbSBz4bqjbiBwaOG6qW0iLCB4ID0gIk5ow7NtIHPhuqNuIHBo4bqpbSIsIHkgPSAiVOG6p24gc3XhuqV0IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSAqKk5ow7NtIEZvb2QgKHRo4buxYyBwaOG6qW0pKiogY2hp4bq/bSAqKnRyw6puIDcyJSoqIHThu5VuZyBnaWFvIGThu4tjaCwgbMOgICoqbeG6o25nIHPhuqNuIHBo4bqpbSBj4buRdCBsw7VpIHbDoCBjaOG7pyDEkeG6oW8qKi4NCg0KICDihpIgQ8OhYyBxdXnhur90IMSR4buLbmggduG7gSBkYW5oIG3hu6VjLCBjaOG6pXQgbMaw4bujbmcsIGdpw6EsIGtodXnhur9uIG3Do2nigKYgbsOqbiAqKsawdSB0acOqbiBuaMOzbSBuw6B5KiouDQoNCi0gKipOb24tQ29uc3VtYWJsZSoqIChwaGkgdGnDqnUgZMO5bmcsIG5oxrAgxJHhu5MgZ2lhIGThu6VuZywgxJFp4buHbiB04but4oCmKSBjaGnhur9tIGfhuqduICoqMTklKiog4oCTIGzDoCAqKm3huqNuZyBwaOG7pSBuaMawbmcgdGnhu4FtIG7Eg25nKiouICANCg0KICDihpIgQ8OzIHRo4buDIGtoYWkgdGjDoWMgdGjDqm0gduG7gSAqKnVwc2VsbCoqIGhv4bq3YyAqKmNyb3NzLXNlbGwqKiB24bubaSBuaMOzbSBraMOhY2ggaMOgbmcgbXVhIEZvb2QuDQoNCi0gKipEcmluayAodGjhu6ljIHXhu5FuZykqKiBjaOG7iSBjaGnhur9tIGfhuqduICoqOSUqKiDigJMgbMOgICoqbeG6o25nIG5o4buPKiosIG7Dqm4gY8OibiBuaOG6r2MgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjICoqc+G6o24gcGjhuqltIGPDsyBiacOqbiBs4bujaSBuaHXhuq1uIGNhbyoqIGhv4bq3YyAqKmxpw6puIGvhur90IGNvbWJvIHbhu5tpIEZvb2QqKi4NCg0KDQojIEJp4bq/biBQcm9kdWN0RGVwYXJ0bWVudCAoUGjDsm5nIGJhbiBz4bqjbiBwaOG6qW0pDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gUHJvZHVjdERlcGFydG1lbnQpKSArDQogIGdlb21fYmFyKGZpbGwgPSAibWlkbmlnaHRibHVlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgdGhlbyBC4buZIHBo4bqtbiBz4bqjbiBwaOG6qW0iLCB4ID0gIkLhu5kgcGjhuq1uIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotICoqUHJvZHVjZSAoUmF1IHF14bqjIHTGsMahaSkqKiBsw6AgcGjDsm5nIGJhbiAqKmNoaeG6v20gdOG7tyB0cuG7jW5nIGzhu5tuIG5o4bqldCAoMTQuMTglKSoqLCB0aOG7gyBoaeG7h24gKip4dSBoxrDhu5tuZyB0acOqdSBkw7luZyB0aOG7sWMgcGjhuqltIHTGsMahaSBz4buRbmcgY2FvKiouDQoNCi0gKipTbmFjayBGb29kcyB2w6AgRnJvemVuIEZvb2RzKiogY2hp4bq/bSB04bu3IHRy4buNbmcgbOG7m24gdGjhu6kgMiB2w6AgMyDihpIgY2hvIHRo4bqleSBuaHUgY+G6p3UgY2FvIHbhu5tpICoqxJHhu5MgxINuIG5oYW5oLCB0aeG7h24gbOG7o2kqKiwgdGjDrWNoIGjhu6NwIGNobyBraMOhY2ggYuG6rW4gcuG7mW4gaG/hurdjIGdpYSDEkcOsbmguDQoNCi0gKipIb3VzZWhvbGQgKMSQ4buTIGdpYSBk4bulbmcpKiogY8WpbmcgY2hp4bq/bSBoxqFuICoqMTAlKiosIGzDoCBz4bqjbiBwaOG6qW0gdGhp4bq/dCB54bq/dSB0cm9uZyDEkeG7nWkgc+G7kW5nIOKGkiBjw7MgdGjhu4Mga+G6v3QgaOG7o3AgYsOhbiBjaMOpby4NCg0KLSBDw6FjIG5ow7NtIG5oxrAgKipNZWF0KiosICoqU2VhZm9vZCoqLCAqKlBlcmlvZGljYWxzKiosICoqQ2hlY2tvdXQqKiwgKipDYXJvdXNlbCoqLi4uIGNoaeG6v20gdOG7tyB0cuG7jW5nIHLhuqV0IG5o4buPIOKGkiBraMO0bmcgcGjhuqNpIHRy4buNbmcgdMOibSBoaeG7h24gdOG6oWkuDQoNCiMgQmnhur9uIFByb2R1Y3RDYXRlZ29yeSAoRGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7pSB0aOG7gykNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gUHJvZHVjdENhdGVnb3J5KSkgKw0KICBnZW9tX2JhcihmaWxsID0gImRvZGdlcmJsdWU0IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgdGhlbyBMb+G6oWkgc+G6o24gcGjhuqltIiwgeCA9ICJMb+G6oWkgc+G6o24gcGjhuqltIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotICoqVmVnZXRhYmxlcyoqIGzDoCBkYW5oIG3hu6VjIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgKDEyLjI5JSkg4oaSIGNobyB0aOG6pXkgKirGsHUgdGnDqm4gaMOgbmcgxJHhuqd1IHbhu5tpIG5ow7NtIHRo4buxYyBwaOG6qW0gdMawxqFpIHPhu5FuZyoqLg0KDQotICoqU25hY2sgRm9vZHMqKiB0aeG6v3AgdOG7pWMgbMOgIGRhbmggbeG7pWMgY2jhu6cgbOG7sWMgKDExLjM4JSkg4oaSIHh1IGjGsOG7m25nIHRpw6p1IGTDuW5nIMSR4buTIMSDbiBuaGFuaCwgdGnhu4duIGThu6VuZyBy4bqldCByw7UgcsOgbmcuDQoNCi0gKipEYWlyeSwgRnJ1aXQgdsOgIE1lYXQqKiDEkeG7gXUgbuG6sW0gdHJvbmcgbmjDs20gdG9wIDUg4oaSIMSRw6J5IGzDoCBuaOG7r25nICoqc+G6o24gcGjhuqltIHRoaeG6v3QgeeG6v3UsIHRpw6p1IGTDuW5nIGjDoG5nIG5nw6B5KiouDQoNCi0gQ8OhYyBkYW5oIG3hu6VjIG5oxrAgKipDYW5uZWQgU2VhZm9vZCAoQ2FubmVkIFNhcmRpbmVzLCBUdW5hLCBTaHJpbXAuLi4pKiogY8OzIHThu7cgdHLhu41uZyB0aOG6pXAgKH4wLjPigJMwLjYlKSDihpIgw610IMSRxrDhu6NjIHF1YW4gdMOibSwgY8OzIHRo4buDIGzDoCBkbyBraOG6qXUgduG7iywgdGjDs2kgcXVlbiB0acOqdSBkw7luZy4NCg0KKipDw6FjIGRhbmggbeG7pWMgY8OzIHThu7cgdHLhu41uZyBy4bqldCB0aOG6pXAgKDwxJSk6KioNCg0KLSAqKkNhbmRsZXMsIENhbm5lZCBDbGFtcywgTWlzY2VsbGFuZW91cywgRWxlY3RyaWNhbC4uLioqIGPDsyBsxrDhu6NuZyBtdWEgY+G7sWMga+G7syB0aOG6pXAg4oaSIGtow7RuZyBwaOG6o2kgxrB1IHRpw6puIGNow61uaCB0cm9uZyBjaGnhur9uIGzGsOG7o2Mga2luaCBkb2FuaC4NCg0K