TỔNG QUAN VÀ XỬ LÝ DỮ LIÊU
Bộ dữ liệu Supermarket Transactions là một tập dữ liệu mô phỏng các
giao dịch mua hàng được thực hiện tại một hệ thống siêu thị. Dữ liệu này
chứa các thông tin đa dạng liên quan đến hành vi tiêu dùng của khách
hàng, đặc điểm nhân khẩu học và chi tiết sản phẩm. Cụ thể, mỗi dòng dữ
liệu đại diện cho một giao dịch duy nhất, bao gồm các trường như ngày
mua hàng (PurchaseDate), mã khách hàng (CustomerID), giới tính (Gender),
tình trạng hôn nhân (MaritalStatus), sở hữu nhà (Homeowner), số lượng
con (Children), thu nhập hàng năm (AnnualIncome), vị trí địa lý (City,
StateorProvince, Country), cũng như thông tin sản phẩm như nhóm ngành
hàng (ProductFamily), bộ phận sản phẩm (ProductDepartment), danh mục sản
phẩm (ProductCategory), số lượng bán (UnitsSold) và doanh thu
(Revenue).
Dữ liệu được đọc ra như sau:
Chọn ra các biến là biến định tính
THỐNG KÊ MÔ TẢ BIẾN ĐỊNH TÍNH
1. Giới tính
Biến Gender là một biến định tính phân loại nhị phân, phản ánh giới
tính của khách hàng trong tập dữ liệu. Việc thống kê mô tả biến này giúp
nhận diện cơ cấu giới tính, từ đó hỗ trợ phân tích hành vi tiêu dùng
hoặc xây dựng mô hình dự báo có phân biệt theo giới.

Kết quả thống kê mô tả cho thấy tỷ lệ giới tính giữa nữ (F) và nam
(M) trong tập dữ liệu khá cân bằng, với nữ chiếm 51% và nam chiếm 49%.
Điều này cho thấy không có sự chênh lệch đáng kể giữa hai nhóm giới
tính, giúp đảm bảo tính đại diện và hạn chế rủi ro sai lệch mẫu
(sampling bias) khi thực hiện phân tích tiếp theo. Ngoài ra, việc phân
bố giới tính đồng đều cũng tạo điều kiện thuận lợi cho các mô hình thống
kê và phân tích dự báo có liên quan đến yếu tố giới.
2. MaritalStatus (tình trạng hôn nhân)
Biến MaritalStatus thể hiện tình trạng hôn nhân của khách hàng, trong
đó giá trị ‘S’ đại diện cho độc thân (Single) và ‘M’ đại diện cho đã kết
hôn (Married). Đây là một biến phân loại định tính nhị phân, thường được
sử dụng trong phân tích hành vi tiêu dùng để tìm hiểu sự khác biệt trong
nhu cầu và xu hướng mua sắm giữa các nhóm khách hàng. Ví dụ, khách hàng
độc thân có thể ưu tiên tiêu dùng cho bản thân, trong khi khách hàng đã
kết hôn có xu hướng chi tiêu cho gia đình hoặc cân nhắc tài chính nhiều
hơn. Việc đưa biến này vào phân tích giúp hiểu sâu hơn về đặc điểm nhân
khẩu học của khách hàng, từ đó phục vụ cho các mục tiêu tiếp thị, dự báo
và phân khúc thị trường hiệu quả hơn.

Kết quả thống kê cho thấy tỷ lệ khách hàng đã kết hôn (M) chiếm
khoảng 48.8%, trong khi tỷ lệ còn lại (51.2%) là khách hàng độc thân
(S). Sự phân bố này tương đối đồng đều giữa hai nhóm tình trạng hôn
nhân, cho thấy tập dữ liệu có tính đại diện tốt về mặt đặc điểm xã hội.
Việc tỷ lệ khách hàng độc thân nhỉnh hơn một chút có thể phản ánh đặc
điểm nhân khẩu học của tệp khách hàng, từ đó gợi ý rằng các chiến lược
kinh doanh hoặc tiếp thị nên xem xét đến nhu cầu tiêu dùng cá nhân và
linh hoạt của nhóm khách hàng này.
3. Homeowner
Biến Homeowner phản ánh tình trạng sở hữu nhà ở của khách hàng, với
giá trị ‘Y’ biểu thị có sở hữu nhà và ‘N’ biểu thị không sở hữu nhà. Đây
là một biến định tính nhị phân, thường được sử dụng để phân tích khả
năng tài chính hoặc mức độ ổn định kinh tế của khách hàng. Việc sở hữu
nhà có thể liên quan đến mức thu nhập, thói quen chi tiêu hoặc nhu cầu
sản phẩm cụ thể, đặc biệt trong các ngành như bảo hiểm, bất động sản,
hoặc tài chính tiêu dùng.

Kết quả thống kê cho thấy có 60.1% khách hàng trong tập dữ liệu sở
hữu nhà ở (Y), trong khi 39.9% khách hàng không sở hữu nhà (N). Điều này
cho thấy phần lớn khách hàng có mức độ ổn định tài chính tương đối cao.
Việc sở hữu nhà có thể đồng nghĩa với nhu cầu tiêu dùng có xu hướng đầu
tư và bền vững hơn, đồng thời cũng là một đặc điểm quan trọng để phân
khúc khách hàng theo khả năng tài chính hoặc mục tiêu tiếp thị. Tuy
nhiên, tỷ lệ gần 40% không sở hữu nhà cũng phản ánh một nhóm khách hàng
đáng kể với các nhu cầu linh hoạt hơn, có thể hướng đến các sản phẩm
dịch vụ có tính tiện lợi và ngắn hạn.
4. AnunalIncome
Biến AnnualIncome thể hiện khoảng thu nhập hàng năm của khách hàng,
được phân loại thành các nhóm theo mức thu nhập tăng dần. Đây là biến
định tính có thứ tự (ordinal categorical variable), vì các mức thu nhập
được sắp xếp theo thứ tự từ thấp đến cao.

Phân bố thu nhập của khách hàng cho thấy số lượng khách hàng lớn nhất
thuộc nhóm có thu nhập từ 30K đến 50K đô la, với hơn 4,600 khách hàng.
Nhóm có thu nhập thấp nhất, từ 10K đến 30K đô la, cũng có số lượng đáng
kể, gần 3,100 khách hàng. Các nhóm thu nhập trung bình như 50K đến 70K
và 70K đến 90K đô la cũng có lượng khách hàng khá lớn, lần lượt khoảng
2,370 và 1,700 khách hàng. Trong khi đó, số lượng khách hàng ở các nhóm
thu nhập cao hơn, bao gồm từ 90K đến trên 150K đô la, thấp hơn nhiều,
dao động từ khoảng 270 đến 760 khách hàng. Điều này cho thấy phần lớn
khách hàng trong bộ dữ liệu tập trung vào các nhóm thu nhập từ thấp đến
trung bình, với số lượng khách hàng thu nhập cao khá hạn chế.
LS0tDQp0aXRsZTogIkLDgEkgVOG6rFAgVFLDik4gTOG7mlAgKFRV4bqmTiAxKSINCmF1dGhvcjogIk5ndXnhu4VuIFRodSBUaOG6o28iDQpkYXRlOiAiMjAyNS0wNS0xOSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICBudW1iZXIgc2VjdGlvbjogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZSAgIA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIGZpZ193aWR0aDogNiANCiAgICBmaWdfaGVpZ2h0OiA0IA0Ka25pdHI6DQogIG9wdHNfY2h1bms6IA0KICAgIGVjaG86IGZhbHNlDQogICAgbWVzc2FnZTogZmFsc2UNCiAgICB3YXJuaW5nOiBmYWxzZQ0KLS0tDQoNCmBgYHtjc3MsZWNobyA9IEZBTFNFfQ0KaDEgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiANCn0NCg0KaDIgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiANCn0NCg0KaDMgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KaDQge2ZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtc3R5bGU6IGl0YWxpY30NCg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDE4cHg7DQogIA0KfQ0KcDpub3QoaDEpOm5vdChoMik6bm90KGgzKTpub3QoaDQpOm5vdChoNSkgew0KICB0ZXh0LWluZGVudDogMmVtO30NCnAgew0KICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICB9DQoudG9jaWZ5LWhlYWRlciB7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KDQpgYGANCg0KIyMgKipU4buUTkcgUVVBTiBWw4AgWOG7rCBMw50gROG7riBMScOKVSoqDQoNCiAgQuG7mSBk4buvIGxp4buHdSBTdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMgbMOgIG3hu5l0IHThuq1wIGThu68gbGnhu4d1IG3DtCBwaOG7j25nIGPDoWMgZ2lhbyBk4buLY2ggbXVhIGjDoG5nIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gdOG6oWkgbeG7mXQgaOG7hyB0aOG7kW5nIHNpw6p1IHRo4buLLiBE4buvIGxp4buHdSBuw6B5IGNo4bupYSBjw6FjIHRow7RuZyB0aW4gxJFhIGThuqFuZyBsacOqbiBxdWFuIMSR4bq/biBow6BuaCB2aSB0acOqdSBkw7luZyBj4bunYSBraMOhY2ggaMOgbmcsIMSR4bq3YyDEkWnhu4NtIG5ow6JuIGto4bqpdSBo4buNYyB2w6AgY2hpIHRp4bq/dCBz4bqjbiBwaOG6qW0uIEPhu6UgdGjhu4MsIG3hu5dpIGTDsm5nIGThu68gbGnhu4d1IMSR4bqhaSBkaeG7h24gY2hvIG3hu5l0IGdpYW8gZOG7i2NoIGR1eSBuaOG6pXQsIGJhbyBn4buTbSBjw6FjIHRyxrDhu51uZyBuaMawIG5nw6B5IG11YSBow6BuZyAoUHVyY2hhc2VEYXRlKSwgbcOjIGtow6FjaCBow6BuZyAoQ3VzdG9tZXJJRCksIGdp4bubaSB0w61uaCAoR2VuZGVyKSwgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChNYXJpdGFsU3RhdHVzKSwgc+G7nyBo4buvdSBuaMOgIChIb21lb3duZXIpLCBz4buRIGzGsOG7o25nIGNvbiAoQ2hpbGRyZW4pLCB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gKEFubnVhbEluY29tZSksIHbhu4sgdHLDrSDEkeG7i2EgbMO9IChDaXR5LCBTdGF0ZW9yUHJvdmluY2UsIENvdW50cnkpLCBjxaluZyBuaMawIHRow7RuZyB0aW4gc+G6o24gcGjhuqltIG5oxrAgbmjDs20gbmfDoG5oIGjDoG5nIChQcm9kdWN0RmFtaWx5KSwgYuG7mSBwaOG6rW4gc+G6o24gcGjhuqltIChQcm9kdWN0RGVwYXJ0bWVudCksIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIChQcm9kdWN0Q2F0ZWdvcnkpLCBz4buRIGzGsOG7o25nIGLDoW4gKFVuaXRzU29sZCkgdsOgIGRvYW5oIHRodSAoUmV2ZW51ZSkuDQogIA0KICBE4buvIGxp4buHdSDEkcaw4bujYyDEkeG7jWMgcmEgbmjGsCBzYXU6IA0KDQpgYGB7ciwgd2FybmluZz0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgaW5jbHVkZT0gRkFMU0V9DQpsaWJyYXJ5KERUKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGNzdikNCg0KZGEgPC0gcmVhZC5jc3YoJ0M6L1VzZXJzL0FkbWluL09uZURyaXZlL0Rlc2t0b3AvVMOASSBMSeG7hlUgSOG7jEMgVOG6rFAvUFRETERUL1N1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YnLCBoZWFkZXIgPSBULCBzZXAgPSAiOyIpDQpzdHIoZGEpDQpgYGANCg0KYGBge3IsIHdhcm5pbmc9IEZBTFNFLCBlY2hvID0gRkFMU0V9DQpkYXRhdGFibGUoaGVhZChkYSksIG9wdGlvbnMgPSBsaXN0KHNjcm9sbFggPSBUUlVFKSkNCmBgYA0KDQogIENo4buNbiByYSBjw6FjIGJp4bq/biBsw6AgYmnhur9uIMSR4buLbmggdMOtbmggDQogIA0KYGBge3IsIHdhcm5pbmc9IEZBTFNFLCBlY2hvID0gRkFMU0V9DQpkaW5odGluaCA8LSBjKCJHZW5kZXIiLCJNYXJpdGFsU3RhdHVzIiwiSG9tZW93bmVyIiwiQW5udWFsSW5jb21lIiwNCiAgICAgICAgICAgICAiQ2l0eSIsIlN0YXRlb3JQcm92aW5jZSIsIkNvdW50cnkiLCJQcm9kdWN0RmFtaWx5IiwNCiAgICAgICAgICAgICAiUHJvZHVjdERlcGFydG1lbnQiLCJQcm9kdWN0Q2F0ZWdvcnkiKQ0KZGluaHRpbmhfZiA8LSBkYVssZGluaHRpbmhdDQpkYXRhdGFibGUoIGhlYWQoZGluaHRpbmhfZiksIG9wdGlvbiA9bGlzdCggc2Nyb2xseD0gVFJVRSApKQ0KYGBgDQoNCiMjICoqVEjhu5BORyBLw4ogTcOUIFThuqIgQknhur5OIMSQ4buKTkggVMONTkgqKg0KIyMjICoqMS4gR2nhu5tpIHTDrW5oKioNCg0KICBCaeG6v24gR2VuZGVyIGzDoCBt4buZdCBiaeG6v24gxJHhu4tuaCB0w61uaCBwaMOibiBsb+G6oWkgbmjhu4sgcGjDom4sIHBo4bqjbiDDoW5oIGdp4bubaSB0w61uaCBj4bunYSBraMOhY2ggaMOgbmcgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UuIFZp4buHYyB0aOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gbsOgeSBnacO6cCBuaOG6rW4gZGnhu4duIGPGoSBj4bqldSBnaeG7m2kgdMOtbmgsIHThu6sgxJHDsyBo4buXIHRy4bujIHBow6JuIHTDrWNoIGjDoG5oIHZpIHRpw6p1IGTDuW5nIGhv4bq3YyB4w6J5IGThu7FuZyBtw7QgaMOsbmggZOG7sSBiw6FvIGPDsyBwaMOibiBiaeG7h3QgdGhlbyBnaeG7m2kuDQpgYGB7ciwgd2FybmluZz0gRkFMU0UsIGVjaG8gPSBGQUxTRX0NCmdlbmRlcl9mcmVxIDwtIHRhYmxlKGRhJEdlbmRlcikgICAgICAgICAgICAgICAgICMgxJDhur9tIHPhu5EgbMaw4bujbmcgRiB2w6AgTQ0KZ2VuZGVyX3BjdCA8LSByb3VuZChwcm9wLnRhYmxlKGdlbmRlcl9mcmVxKSAqIDEwMCwgMSkgICMgVMOtbmggcGjhuqduIHRyxINtIHbDoCBsw6BtIHRyw7JuIDEgY2jhu68gc+G7kQ0KZ2VuZGVyXyA8LSBkYXRhLmZyYW1lKA0KICBob21lb3duZXIgPSBuYW1lcyhnZW5kZXJfZnJlcSksDQogIEZyZXF1ZW5jeSA9IGFzLnZlY3RvcihnZW5kZXJfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChhcy52ZWN0b3IoZ2VuZGVyX3BjdCksIDIpKQ0KDQoNCmRhdGF0YWJsZShnZW5kZXJfKQ0KDQpnZW5kZXIgPC0gcGFzdGUobmFtZXMoZ2VuZGVyX2ZyZXEpLCAiKCIsIGdlbmRlcl9wY3QsICIlKSIsIHNlcCA9ICIiKSAgIyBH4buZcCBuaMOjbg0KcGllKGdlbmRlcl9mcmVxLA0KICAgIGxhYmVscyA9IGdlbmRlciwNCiAgICBjb2wgPSBjKCJsaWdodHBpbmsiLCAibGlnaHRibHVlIiksDQogICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgcGjDom4gYuG7lSBnaeG7m2kgdMOtbmgiKQ0KYGBgDQogIA0KICBL4bq/dCBxdeG6oyB0aOG7kW5nIGvDqiBtw7QgdOG6oyBjaG8gdGjhuqV5IHThu7cgbOG7hyBnaeG7m2kgdMOtbmggZ2nhu69hIG7hu68gKEYpIHbDoCBuYW0gKE0pIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGtow6EgY8OibiBi4bqxbmcsIHbhu5tpIG7hu68gY2hp4bq/bSA1MSUgdsOgIG5hbSBjaGnhur9tIDQ5JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggxJHDoW5nIGvhu4MgZ2nhu69hIGhhaSBuaMOzbSBnaeG7m2kgdMOtbmgsIGdpw7pwIMSR4bqjbSBi4bqjbyB0w61uaCDEkeG6oWkgZGnhu4duIHbDoCBo4bqhbiBjaOG6vyBy4bunaSBybyBzYWkgbOG7h2NoIG3huqt1IChzYW1wbGluZyBiaWFzKSBraGkgdGjhu7FjIGhp4buHbiBwaMOibiB0w61jaCB0aeG6v3AgdGhlby4gTmdvw6BpIHJhLCB2aeG7h2MgcGjDom4gYuG7kSBnaeG7m2kgdMOtbmggxJHhu5NuZyDEkeG7gXUgY8WpbmcgdOG6oW8gxJFp4buBdSBraeG7h24gdGh14bqtbiBs4bujaSBjaG8gY8OhYyBtw7QgaMOsbmggdGjhu5FuZyBrw6ogdsOgIHBow6JuIHTDrWNoIGThu7EgYsOhbyBjw7MgbGnDqm4gcXVhbiDEkeG6v24geeG6v3UgdOG7kSBnaeG7m2kuDQogIA0KIyMjICoqMi4gTWFyaXRhbFN0YXR1cwkodMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKSAqKg0KICANCiAgQmnhur9uIE1hcml0YWxTdGF0dXMgdGjhu4MgaGnhu4duIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBj4bunYSBraMOhY2ggaMOgbmcsIHRyb25nIMSRw7MgZ2nDoSB0cuG7iyAnUycgxJHhuqFpIGRp4buHbiBjaG8gxJHhu5ljIHRow6JuIChTaW5nbGUpIHbDoCAnTScgxJHhuqFpIGRp4buHbiBjaG8gxJHDoyBr4bq/dCBow7RuIChNYXJyaWVkKS4gxJDDonkgbMOgIG3hu5l0IGJp4bq/biBwaMOibiBsb+G6oWkgxJHhu4tuaCB0w61uaCBuaOG7iyBwaMOibiwgdGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIHBow6JuIHTDrWNoIGjDoG5oIHZpIHRpw6p1IGTDuW5nIMSR4buDIHTDrG0gaGnhu4N1IHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIG5odSBj4bqndSB2w6AgeHUgaMaw4bubbmcgbXVhIHPhuq9tIGdp4buvYSBjw6FjIG5ow7NtIGtow6FjaCBow6BuZy4gVsOtIGThu6UsIGtow6FjaCBow6BuZyDEkeG7mWMgdGjDom4gY8OzIHRo4buDIMawdSB0acOqbiB0acOqdSBkw7luZyBjaG8gYuG6o24gdGjDom4sIHRyb25nIGtoaSBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyBjaGkgdGnDqnUgY2hvIGdpYSDEkcOsbmggaG/hurdjIGPDom4gbmjhuq9jIHTDoGkgY2jDrW5oIG5oaeG7gXUgaMahbi4gVmnhu4djIMSRxrBhIGJp4bq/biBuw6B5IHbDoG8gcGjDom4gdMOtY2ggZ2nDunAgaGnhu4N1IHPDonUgaMahbiB24buBIMSR4bq3YyDEkWnhu4NtIG5ow6JuIGto4bqpdSBo4buNYyBj4bunYSBraMOhY2ggaMOgbmcsIHThu6sgxJHDsyBwaOG7pWMgduG7pSBjaG8gY8OhYyBt4bulYyB0acOqdSB0aeG6v3AgdGjhu4ssIGThu7EgYsOhbyB2w6AgcGjDom4ga2jDumMgdGjhu4sgdHLGsOG7nW5nIGhp4buHdSBxdeG6oyBoxqFuLg0KYGBge3IsIHdhcm5pbmc9IEZBTFNFLCBlY2hvID0gRkFMU0V9DQptYXJyeV9mcmVxIDwtIHRhYmxlKGRhJE1hcml0YWxTdGF0dXMpICAgICAgICAgICAgICAgIA0KbWFycnlfcGN0IDwtIHJvdW5kKHByb3AudGFibGUobWFycnlfZnJlcSkgKiAxMDAsIDEpIA0KbWFycnlfIDwtIGRhdGEuZnJhbWUoDQogIGhvbWVvd25lciA9IG5hbWVzKG1hcnJ5X2ZyZXEpLA0KICBGcmVxdWVuY3kgPSBhcy52ZWN0b3IobWFycnlfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChhcy52ZWN0b3IobWFycnlfcGN0KSwgMikpDQoNCmRhdGF0YWJsZShtYXJyeV8pDQoNCm1hcnJ5IDwtIHBhc3RlKG5hbWVzKG1hcnJ5X2ZyZXEpLCAiKCIsIG1hcnJ5X3BjdCwgIiUpIiwgc2VwID0gIiIpIA0KcGllKG1hcnJ5X2ZyZXEsDQogICAgbGFiZWxzID0gbWFycnksDQogICAgY29sID0gYygicmVkIiwgImdyZWVuIiksDQogICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAiKQ0KYGBgDQogIA0KICBL4bq/dCBxdeG6oyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5IHThu7cgbOG7hyBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIChNKSBjaGnhur9tIGtob+G6o25nIDQ4LjglLCB0cm9uZyBraGkgdOG7tyBs4buHIGPDsm4gbOG6oWkgKDUxLjIlKSBsw6Aga2jDoWNoIGjDoG5nIMSR4buZYyB0aMOibiAoUykuIFPhu7EgcGjDom4gYuG7kSBuw6B5IHTGsMahbmcgxJHhu5FpIMSR4buTbmcgxJHhu4F1IGdp4buvYSBoYWkgbmjDs20gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLCBjaG8gdGjhuqV5IHThuq1wIGThu68gbGnhu4d1IGPDsyB0w61uaCDEkeG6oWkgZGnhu4duIHThu5F0IHbhu4EgbeG6t3QgxJHhurdjIMSRaeG7g20geMOjIGjhu5lpLiBWaeG7h2MgdOG7tyBs4buHIGtow6FjaCBow6BuZyDEkeG7mWMgdGjDom4gbmjhu4luaCBoxqFuIG3hu5l0IGNow7p0IGPDsyB0aOG7gyBwaOG6o24gw6FuaCDEkeG6t2MgxJFp4buDbSBuaMOibiBraOG6qXUgaOG7jWMgY+G7p2EgdOG7h3Aga2jDoWNoIGjDoG5nLCB04burIMSRw7MgZ+G7o2kgw70gcuG6sW5nIGPDoWMgY2hp4bq/biBsxrDhu6NjIGtpbmggZG9hbmggaG/hurdjIHRp4bq/cCB0aOG7iyBuw6puIHhlbSB4w6l0IMSR4bq/biBuaHUgY+G6p3UgdGnDqnUgZMO5bmcgY8OhIG5ow6JuIHbDoCBsaW5oIGhv4bqhdCBj4bunYSBuaMOzbSBraMOhY2ggaMOgbmcgbsOgeS4gDQogIA0KIyMjICoqMy4gSG9tZW93bmVyKiogIA0KICANCiAgQmnhur9uIEhvbWVvd25lciBwaOG6o24gw6FuaCB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCDhu58gY+G7p2Ega2jDoWNoIGjDoG5nLCB24bubaSBnacOhIHRy4buLICdZJyBiaeG7g3UgdGjhu4sgY8OzIHPhu58gaOG7r3UgbmjDoCB2w6AgJ04nIGJp4buDdSB0aOG7iyBraMO0bmcgc+G7nyBo4buvdSBuaMOgLiDEkMOieSBsw6AgbeG7mXQgYmnhur9uIMSR4buLbmggdMOtbmggbmjhu4sgcGjDom4sIHRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBwaMOibiB0w61jaCBraOG6oyBuxINuZyB0w6BpIGNow61uaCBob+G6t2MgbeG7qWMgxJHhu5kg4buVbiDEkeG7i25oIGtpbmggdOG6vyBj4bunYSBraMOhY2ggaMOgbmcuIFZp4buHYyBz4bufIGjhu691IG5ow6AgY8OzIHRo4buDIGxpw6puIHF1YW4gxJHhur9uIG3hu6ljIHRodSBuaOG6rXAsIHRow7NpIHF1ZW4gY2hpIHRpw6p1IGhv4bq3YyBuaHUgY+G6p3Ugc+G6o24gcGjhuqltIGPhu6UgdGjhu4MsIMSR4bq3YyBiaeG7h3QgdHJvbmcgY8OhYyBuZ8OgbmggbmjGsCBi4bqjbyBoaeG7g20sIGLhuqV0IMSR4buZbmcgc+G6o24sIGhv4bq3YyB0w6BpIGNow61uaCB0acOqdSBkw7luZy4gIA0KICANCmBgYHtyLCB3YXJuaW5nPSBGQUxTRSwgZWNobyA9IEZBTFNFfQ0KaG9tZV9mcmVxIDwtIHRhYmxlKGRhJEhvbWVvd25lcikgICAgICAgICAgICAgICAgDQpob21lX3BjdCA8LSByb3VuZChwcm9wLnRhYmxlKGhvbWVfZnJlcSkgKiAxMDAsIDEpIA0KaG9tZV8gPC0gZGF0YS5mcmFtZSgNCiAgaG9tZW93bmVyID0gbmFtZXMoaG9tZV9mcmVxKSwNCiAgRnJlcXVlbmN5ID0gYXMudmVjdG9yKGhvbWVfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChhcy52ZWN0b3IoaG9tZV9wY3QpLCAyKSkNCg0KZGF0YXRhYmxlKGhvbWVfKQ0KDQpob21lIDwtIHBhc3RlKG5hbWVzKGhvbWVfZnJlcSksICIoIiwgaG9tZV9wY3QsICIlKSIsIHNlcCA9ICIiKSANCnBpZShob21lX2ZyZXEsDQogICAgbGFiZWxzID0gaG9tZSAsDQogICAgY29sID0gYygiZ3JleSIsICJ5ZWxsb3ciKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6AgICIpDQpgYGAgIA0KICANCiAgS+G6v3QgcXXhuqMgdGjhu5FuZyBrw6ogY2hvIHRo4bqleSBjw7MgNjAuMSUga2jDoWNoIGjDoG5nIHRyb25nIHThuq1wIGThu68gbGnhu4d1IHPhu58gaOG7r3UgbmjDoCDhu58gKFkpLCB0cm9uZyBraGkgMzkuOSUga2jDoWNoIGjDoG5nIGtow7RuZyBz4bufIGjhu691IG5ow6AgKE4pLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBwaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nIGPDsyBt4bupYyDEkeG7mSDhu5VuIMSR4buLbmggdMOgaSBjaMOtbmggdMawxqFuZyDEkeG7kWkgY2FvLiBWaeG7h2Mgc+G7nyBo4buvdSBuaMOgIGPDsyB0aOG7gyDEkeG7k25nIG5naMSpYSB24bubaSBuaHUgY+G6p3UgdGnDqnUgZMO5bmcgY8OzIHh1IGjGsOG7m25nIMSR4bqndSB0xrAgdsOgIGLhu4FuIHbhu69uZyBoxqFuLCDEkeG7k25nIHRo4budaSBjxaluZyBsw6AgbeG7mXQgxJHhurdjIMSRaeG7g20gcXVhbiB0cuG7jW5nIMSR4buDIHBow6JuIGtow7pjIGtow6FjaCBow6BuZyB0aGVvIGto4bqjIG7Eg25nIHTDoGkgY2jDrW5oIGhv4bq3YyBt4bulYyB0acOqdSB0aeG6v3AgdGjhu4suIFR1eSBuaGnDqm4sIHThu7cgbOG7hyBn4bqnbiA0MCUga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBjxaluZyBwaOG6o24gw6FuaCBt4buZdCBuaMOzbSBraMOhY2ggaMOgbmcgxJHDoW5nIGvhu4MgduG7m2kgY8OhYyBuaHUgY+G6p3UgbGluaCBob+G6oXQgaMahbiwgY8OzIHRo4buDIGjGsOG7m25nIMSR4bq/biBjw6FjIHPhuqNuIHBo4bqpbSBk4buLY2ggduG7pSBjw7MgdMOtbmggdGnhu4duIGzhu6NpIHbDoCBuZ+G6r24gaOG6oW4uDQogIA0KIyMjICoqNC4gQW51bmFsSW5jb21lKioNCg0KICBCaeG6v24gQW5udWFsSW5jb21lIHRo4buDIGhp4buHbiBraG/huqNuZyB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gY+G7p2Ega2jDoWNoIGjDoG5nLCDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGjDoG5oIGPDoWMgbmjDs20gdGhlbyBt4bupYyB0aHUgbmjhuq1wIHTEg25nIGThuqduLiDEkMOieSBsw6AgYmnhur9uIMSR4buLbmggdMOtbmggY8OzIHRo4bupIHThu7EgKG9yZGluYWwgY2F0ZWdvcmljYWwgdmFyaWFibGUpLCB2w6wgY8OhYyBt4bupYyB0aHUgbmjhuq1wIMSRxrDhu6NjIHPhuq9wIHjhur9wIHRoZW8gdGjhu6kgdOG7sSB04burIHRo4bqlcCDEkeG6v24gY2FvLg0KDQpgYGB7ciwgd2FybmluZz0gRkFMU0UsIGVjaG8gPSBGQUxTRX0NCiMgVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0DQp0YWJsZV9pbmNvbWUgPC0gdGFibGUoZGEkQW5udWFsSW5jb21lKQ0KcHJvcF9pbmNvbWUgPC0gcHJvcC50YWJsZSh0YWJsZV9pbmNvbWUpICogMTAwICAjIFThu7cgbOG7hyBwaOG6p24gdHLEg20NCg0KIyBL4bq/dCBo4bujcCB0aMOgbmggZGF0YSBmcmFtZSANCmluY29tZV9mcmVxIDwtIGRhdGEuZnJhbWUoDQogIEFubnVhbGluY29tZSA9IG5hbWVzKHRhYmxlX2luY29tZSksDQogIEZyZXF1ZW5jeSA9IGFzLnZlY3Rvcih0YWJsZV9pbmNvbWUpLA0KICBQZXJjZW50YWdlID0gcm91bmQoYXMudmVjdG9yKHByb3BfaW5jb21lKSwgMikpDQoNCmRhdGF0YWJsZShpbmNvbWVfZnJlcSkNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGluY29tZV9mcmVxLCBhZXMoeCA9IHJlb3JkZXIoQW5udWFsaW5jb21lLCAtRnJlcXVlbmN5KSwgeSA9IEZyZXF1ZW5jeSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAicHVycGxlIikgKw0KICBsYWJzKHRpdGxlID0gIlRodSBuaOG6rXAgaOG6sW5nIG7Eg20gY+G7p2Ega2jDoWNoIGjDoG5nIiwNCiAgICAgICB4ID0gIk3hu6ljIHRodSBuaOG6rXAgIiwNCiAgICAgICB5ID0gIlThuqduIHN14bqldCAiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGAgDQogIA0KICBQaMOibiBi4buRIHRodSBuaOG6rXAgY+G7p2Ega2jDoWNoIGjDoG5nIGNobyB0aOG6pXkgc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgbOG7m24gbmjhuqV0IHRodeG7mWMgbmjDs20gY8OzIHRodSBuaOG6rXAgdOG7qyAzMEsgxJHhur9uIDUwSyDEkcO0IGxhLCB24bubaSBoxqFuIDQsNjAwIGtow6FjaCBow6BuZy4gTmjDs20gY8OzIHRodSBuaOG6rXAgdGjhuqVwIG5o4bqldCwgdOG7qyAxMEsgxJHhur9uIDMwSyDEkcO0IGxhLCBjxaluZyBjw7Mgc+G7kSBsxrDhu6NuZyDEkcOhbmcga+G7gywgZ+G6p24gMywxMDAga2jDoWNoIGjDoG5nLiBDw6FjIG5ow7NtIHRodSBuaOG6rXAgdHJ1bmcgYsOsbmggbmjGsCA1MEsgxJHhur9uIDcwSyB2w6AgNzBLIMSR4bq/biA5MEsgxJHDtCBsYSBjxaluZyBjw7MgbMaw4bujbmcga2jDoWNoIGjDoG5nIGtow6EgbOG7m24sIGzhuqduIGzGsOG7o3Qga2hv4bqjbmcgMiwzNzAgdsOgIDEsNzAwIGtow6FjaCBow6BuZy4gVHJvbmcga2hpIMSRw7MsIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIOG7nyBjw6FjIG5ow7NtIHRodSBuaOG6rXAgY2FvIGjGoW4sIGJhbyBn4buTbSB04burIDkwSyDEkeG6v24gdHLDqm4gMTUwSyDEkcO0IGxhLCB0aOG6pXAgaMahbiBuaGnhu4F1LCBkYW8gxJHhu5luZyB04burIGtob+G6o25nIDI3MCDEkeG6v24gNzYwIGtow6FjaCBow6BuZy4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIGtow6FjaCBow6BuZyB0cm9uZyBi4buZIGThu68gbGnhu4d1IHThuq1wIHRydW5nIHbDoG8gY8OhYyBuaMOzbSB0aHUgbmjhuq1wIHThu6sgdGjhuqVwIMSR4bq/biB0cnVuZyBiw6xuaCwgduG7m2kgc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgdGh1IG5o4bqtcCBjYW8ga2jDoSBo4bqhbiBjaOG6vy4=