#define display(v) {for(auto it: v) cout << it << " :: "; cout << endl;}
#include <bits/stdc++.h>
using namespace std;
enum Status {
VERIFIED,
UNVERIFIED
} ;
class Utils {
public :
static vector< string> splitString( string s, char delimiter = ',' ) {
stringstream ss( s) ;
string word;
vector< string> v;
while ( getline( ss, word, delimiter) ) {
v.push_back ( word) ;
}
return v;
}
static string getStatusString( Status s) {
switch ( s) {
case VERIFIED: return "VERIFIED" ;
case UNVERIFIED: return "NOT VERIFIED" ; // todo
default : return "UNKNOWN" ;
}
}
} ;
struct Business {
string productDescription;
string full_statementDescriptor;
string short_statement_descriptor;
string business_name;
string business_profile_name;
string url;
Status kycStatus;
// assumes that array is correct
void createBusinessFromRawData( string rawBusinessData) {
vector< string> parsedBusinessData = Utils:: splitString ( rawBusinessData, ',' ) ;
kycStatus = UNVERIFIED;
if ( parsedBusinessData.size ( ) < 6 )
return ;
productDescription = parsedBusinessData[ 0 ] ;
full_statementDescriptor = parsedBusinessData[ 1 ] ;
short_statement_descriptor = parsedBusinessData[ 2 ] ;
business_name = parsedBusinessData[ 3 ] ; // key
business_profile_name = parsedBusinessData[ 4 ] ;
url = parsedBusinessData[ 5 ] ;
}
} ;
struct KycData {
string businessName;
string status;
void print( ) {
string output = status + " " ;
if ( status == "VERIFIED" )
output + = " " ;
output + = businessName;
cout << output << "\n " ;
}
} ;
class KYCValidator {
public :
vector< KycData> verifyBusinesses( string csvData) {
vector< string> parsedLines = Utils:: splitString ( csvData, '\n ' ) ;
unordered_map< string, Business> businessMap;
for ( int i = 1 ; i < parsedLines.size ( ) ; i++ ) {
Business b;
b.createBusinessFromRawData ( parsedLines[ i] ) ;
if ( b.business_name .empty ( ) )
continue ;
b.kycStatus = getKYVStatusOfBusiness( b) ;
businessMap[ b.business_name ] = b;
}
vector< KycData> res;
for ( auto [ businessName, b] : businessMap) {
res.push_back ( KycData{ businessName, Utils:: getStatusString ( b.kycStatus ) } ) ;
}
return res;
}
private :
Status getKYVStatusOfBusiness( Business b) {
if ( b.business_name .empty ( ) )
return UNVERIFIED;
if ( b.business_profile_name .empty ( ) )
return UNVERIFIED;
if ( b.full_statementDescriptor .empty ( ) )
return UNVERIFIED;
if ( b.productDescription .empty ( ) )
return UNVERIFIED;
if ( b.short_statement_descriptor .empty ( ) )
return UNVERIFIED;
if ( b.url .empty ( ) )
return UNVERIFIED;
return VERIFIED;
}
} ;
int main( ) {
string input = R"(product_description,full_statement_descriptor,short_statement_descriptor,business_name,business_profile_name,url
User experience platform,UXP,U,Users First Inc.,Users First Platform,https://u...content-available-to-author-only...t.com
Process optimization,MUDA WASTE SOLUTIONS,MUDAWASTE,Kaizen Consulting Inc.,Muda Waste Solutions,https://m...content-available-to-author-only...s.com
Artisanal coffee roaster,OYSTER POINT COFFEE,,Oyster Point Coffee Bar LLC,Oyster Point Coffee,https://o...content-available-to-author-only...e.com
Artisan home goods,FIRESIDE HEARTH CRAFTS AND RUSTIC FURNITURE BOUTIQUE,FIRESIDEHTH,Fireside Furniture Studios LLC,Fireside Hearth Crafts,https://f...content-available-to-author-only...h.com
Tech conference,CONVERGE,CON,Convergence Summit Group LLC,Convergence Events,https://c...content-available-to-author-only...t.com
Payment infrastructure,CBPS,CBP,Collison Brothers Payment Systems Inc.,CBPS,https://c...content-available-to-author-only...s.com
Learning platform,RETAIL,RETAILCO,Trailhead Education Solutions Inc.,Trailhead Learning,https://t...content-available-to-author-only...n.com
Digital marketing agency,PREMIUM SALE PLATFORM,PREMIUMSALE,Sail Design Systems LLC,Sail Framework Studio,https://s...content-available-to-author-only...s.com
Artisan sorbet shop,FROSTY SORBET DELIGHTS,FROSTYSRBT,Frosty Sorbet Delights LLC,Frosty Sorbet Paradise,https://f...content-available-to-author-only...s.com
Emergency systems,BRBS,BRB,Big Red Button Systems Inc.,Big Red Button,https://b...content-available-to-author-only...n.com
Payment processing,LPS,LPS,Link Payment Technologies Corporation,Link Payment Solutions,https://l...content-available-to-author-only...h.com
E-commerce analytics,RETAIL,RET,Black Friday Cyber Monday Analytics Inc.,BFCM Retail Analytics,https://b...content-available-to-author-only...s.com
Energy solutions,ECOMMERCE,ECOM,Exothermic Reactions Inc.,Exothermic Energy,https://e...content-available-to-author-only...y.com
Security consulting,BUFO SECURITY LABS,BUFOSEC,Bufo Cybersecurity Consulting LLC,Bufo Security Labs,https://b...content-available-to-author-only...y.com
Restaurant delivery,NOMS,NOMS,Nom Nom Nom Inc.,Nom Delivery Express,https://n...content-available-to-author-only...s.com
Landscaping services,DIRT PILE LANDSCAPING AND EXCAVATION,DIRTPILE,Dirt Pile Earthworks LLC,Dirt Pile Landscaping,https://d...content-available-to-author-only...s.com
Meticulous craft gallery,POWER CRAFT BEAUTY,PCB,Power Craft Beauty Gallery Inc.,Quality = Power + Craft + Beauty,https://p...content-available-to-author-only...y.com
Platform services,SESSIONS PLATFORM SERVICES,SESSIONS,Sessions Management Inc.,Sessions Platform,https://s...content-available-to-author-only...m.com
,URGENCY FOCUS,URGENT,Urgency Focus Solutions Inc.,Urgency and Focus,https://u...content-available-to-author-only...s.com
Advisory services,SEEK FEEDBACK,FEEDBACK,,Seek Feedback Advisory,https://s...content-available-to-author-only...k.com
Performance consulting,DELIVER RESULTS,RESULTS,Outstanding Results Inc.,Deliver Outstanding Results,https://o...content-available-to-author-only...s.com
Llama accessories,Shop,SH,Llama Love Boutique LLC,Llama Shop,https://l...content-available-to-author-only...e.com
,FAL,F,Falafel Paradise Restaurant LLC,Falafel Paradise,https://f...content-available-to-author-only...e.com
Educational technology,LEARN,LRN,Curious Learning Solutions Inc.,Learn Solutions,https://c...content-available-to-author-only...g.com
Infrastructure services,RESILIENT SYSTEMS MGMT SERVICES,RSMS,Resilient Systems Corporation,Resilient Management Services,https://r...content-available-to-author-only...t.systems
E-commerce platform,ONLINE STORE,ONLSTORE,Humble Commerce LLC,Online Store Builders,https://h...content-available-to-author-only...e.com
Investment services,GENERAL MERCHANDISE,GENMERCH,Macro Optimistic Ventures Inc.,General Merchandise Partners,https://m...content-available-to-author-only...c.com
Human resources,Retail,RTL,Talent Elevation Corp,Retail Talent Solutions,https://t...content-available-to-author-only...n.com
Energy consulting,PACE,PCE,Set Pace Energy Solutions Inc.,Pace Energy,https://s...content-available-to-author-only...y.com
Management consulting,CCS,CCS,Clarity Context Solutions LLC,Clarity Context Solutions,https://c...content-available-to-author-only...t.com
Data analytics,FIRST2LAST,F2L,First Principles Analytics Inc.,First 2 Last Data,https://f...content-available-to-author-only...s.com
Risk management consulting,FEAR ANALYSIS,FEARANA,Fear Fear Fear Uncertainty Doubt Inc.,Fear Uncertainty Doubt Solutions,https://f...content-available-to-author-only...s.com
)" ;
KYCValidator * validator = new KYCValidator( ) ;
vector< KycData> kycDataArray = validator- > verifyBusinesses( input) ;
for ( auto kycData: kycDataArray) {
kycData.print ( ) ;
}
return 0 ;
}
I2RlZmluZSBkaXNwbGF5KHYpIHtmb3IoYXV0byBpdDogdikgY291dCA8PCBpdCA8PCAiIDo6ICI7IGNvdXQgPDwgZW5kbDt9CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCmVudW0gU3RhdHVzIHsKICAgIFZFUklGSUVELAogICAgVU5WRVJJRklFRAp9OwoKY2xhc3MgVXRpbHMgewpwdWJsaWM6CiAgICBzdGF0aWMgdmVjdG9yPHN0cmluZz4gc3BsaXRTdHJpbmcoc3RyaW5nIHMsIGNoYXIgZGVsaW1pdGVyID0gJywnKSB7CiAgICAgICAgc3RyaW5nc3RyZWFtIHNzKHMpOwogICAgICAgIHN0cmluZyB3b3JkOwogICAgICAgIHZlY3RvcjxzdHJpbmc+IHY7CiAgICAgICAgd2hpbGUgKGdldGxpbmUoc3MsIHdvcmQsIGRlbGltaXRlcikpIHsKICAgICAgICAgICAgdi5wdXNoX2JhY2sod29yZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2OwogICAgfQoKICAgIHN0YXRpYyBzdHJpbmcgZ2V0U3RhdHVzU3RyaW5nKFN0YXR1cyBzKSB7CiAgICAgICAgc3dpdGNoIChzKSB7CiAgICAgICAgICAgIGNhc2UgVkVSSUZJRUQ6IHJldHVybiAiVkVSSUZJRUQiOwogICAgICAgICAgICBjYXNlIFVOVkVSSUZJRUQ6IHJldHVybiAiTk9UIFZFUklGSUVEIjsgLy8gdG9kbwogICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV04iOwogICAgICAgIH0KICAgIH0KfTsKCgpzdHJ1Y3QgQnVzaW5lc3MgewogICAgc3RyaW5nIHByb2R1Y3REZXNjcmlwdGlvbjsKICAgIHN0cmluZyBmdWxsX3N0YXRlbWVudERlc2NyaXB0b3I7CiAgICBzdHJpbmcgc2hvcnRfc3RhdGVtZW50X2Rlc2NyaXB0b3I7CiAgICBzdHJpbmcgYnVzaW5lc3NfbmFtZTsKICAgIHN0cmluZyBidXNpbmVzc19wcm9maWxlX25hbWU7CiAgICBzdHJpbmcgdXJsOwoKICAgIFN0YXR1cyBreWNTdGF0dXM7CgogICAgLy8gYXNzdW1lcyB0aGF0IGFycmF5IGlzIGNvcnJlY3QKICAgICB2b2lkIGNyZWF0ZUJ1c2luZXNzRnJvbVJhd0RhdGEoc3RyaW5nIHJhd0J1c2luZXNzRGF0YSkgewogICAgICAgIHZlY3RvcjxzdHJpbmc+IHBhcnNlZEJ1c2luZXNzRGF0YSA9IFV0aWxzOjpzcGxpdFN0cmluZyhyYXdCdXNpbmVzc0RhdGEsICcsJyk7CiAgICAgICAga3ljU3RhdHVzID0gVU5WRVJJRklFRDsKCiAgICAgICAgaWYgKHBhcnNlZEJ1c2luZXNzRGF0YS5zaXplKCkgPCA2KQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHByb2R1Y3REZXNjcmlwdGlvbiA9IHBhcnNlZEJ1c2luZXNzRGF0YVswXTsKICAgICAgICBmdWxsX3N0YXRlbWVudERlc2NyaXB0b3IgPSBwYXJzZWRCdXNpbmVzc0RhdGFbMV07CiAgICAgICAgc2hvcnRfc3RhdGVtZW50X2Rlc2NyaXB0b3IgPSBwYXJzZWRCdXNpbmVzc0RhdGFbMl07CiAgICAgICAgYnVzaW5lc3NfbmFtZSA9IHBhcnNlZEJ1c2luZXNzRGF0YVszXTsgLy8ga2V5CiAgICAgICAgYnVzaW5lc3NfcHJvZmlsZV9uYW1lID0gcGFyc2VkQnVzaW5lc3NEYXRhWzRdOwogICAgICAgIHVybCA9IHBhcnNlZEJ1c2luZXNzRGF0YVs1XTsKICAgIH0KfTsKCnN0cnVjdCBLeWNEYXRhIHsKICAgIHN0cmluZyBidXNpbmVzc05hbWU7CiAgICBzdHJpbmcgc3RhdHVzOwoKICAgIHZvaWQgcHJpbnQoKSB7CiAgICAgICAgc3RyaW5nIG91dHB1dCA9IHN0YXR1cyArICIgICI7CiAgICAgICAgaWYgKHN0YXR1cyA9PSAiVkVSSUZJRUQiKQogICAgICAgICAgICBvdXRwdXQgKz0gIiAgICAiOwogICAgICAgIG91dHB1dCArPSBidXNpbmVzc05hbWU7CiAgICAgICAgY291dCA8PCBvdXRwdXQgPDwgIlxuIjsKICAgIH0KfTsKCmNsYXNzIEtZQ1ZhbGlkYXRvciB7CnB1YmxpYzoKICAgIHZlY3RvcjxLeWNEYXRhPiB2ZXJpZnlCdXNpbmVzc2VzKHN0cmluZyBjc3ZEYXRhKSB7CiAgICAgICAgdmVjdG9yPHN0cmluZz4gcGFyc2VkTGluZXMgPSBVdGlsczo6c3BsaXRTdHJpbmcoY3N2RGF0YSwgJ1xuJyk7CgogICAgICAgIHVub3JkZXJlZF9tYXA8c3RyaW5nLCBCdXNpbmVzcz4gYnVzaW5lc3NNYXA7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJzZWRMaW5lcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICBCdXNpbmVzcyBiOwogICAgICAgICAgICBiLmNyZWF0ZUJ1c2luZXNzRnJvbVJhd0RhdGEocGFyc2VkTGluZXNbaV0pOwoKICAgICAgICAgICAgaWYgKGIuYnVzaW5lc3NfbmFtZS5lbXB0eSgpKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBiLmt5Y1N0YXR1cyA9IGdldEtZVlN0YXR1c09mQnVzaW5lc3MoYik7CgogICAgICAgICAgICBidXNpbmVzc01hcFtiLmJ1c2luZXNzX25hbWVdID0gYjsKICAgICAgICB9CgogICAgICAgIHZlY3RvcjxLeWNEYXRhPiByZXM7CiAgICAgICAgZm9yIChhdXRvIFtidXNpbmVzc05hbWUsIGJdOiBidXNpbmVzc01hcCkgewogICAgICAgICAgICByZXMucHVzaF9iYWNrKEt5Y0RhdGF7YnVzaW5lc3NOYW1lLCBVdGlsczo6Z2V0U3RhdHVzU3RyaW5nKGIua3ljU3RhdHVzKX0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgfQpwcml2YXRlOgogICAgU3RhdHVzIGdldEtZVlN0YXR1c09mQnVzaW5lc3MoQnVzaW5lc3MgYikgewogICAgICAgIGlmIChiLmJ1c2luZXNzX25hbWUuZW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIFVOVkVSSUZJRUQ7CiAgICAgICAgaWYgKGIuYnVzaW5lc3NfcHJvZmlsZV9uYW1lLmVtcHR5KCkpCiAgICAgICAgICAgIHJldHVybiBVTlZFUklGSUVEOwogICAgICAgIGlmIChiLmZ1bGxfc3RhdGVtZW50RGVzY3JpcHRvci5lbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gVU5WRVJJRklFRDsKICAgICAgICBpZiAoYi5wcm9kdWN0RGVzY3JpcHRpb24uZW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIFVOVkVSSUZJRUQ7CiAgICAgICAgaWYgKGIuc2hvcnRfc3RhdGVtZW50X2Rlc2NyaXB0b3IuZW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIFVOVkVSSUZJRUQ7CiAgICAgICAgaWYgKGIudXJsLmVtcHR5KCkpCiAgICAgICAgICAgIHJldHVybiBVTlZFUklGSUVEOwogICAgICAgIHJldHVybiBWRVJJRklFRDsKICAgIH0KfTsKCgppbnQgbWFpbigpIHsKICAgIHN0cmluZyBpbnB1dCA9IFIiKHByb2R1Y3RfZGVzY3JpcHRpb24sZnVsbF9zdGF0ZW1lbnRfZGVzY3JpcHRvcixzaG9ydF9zdGF0ZW1lbnRfZGVzY3JpcHRvcixidXNpbmVzc19uYW1lLGJ1c2luZXNzX3Byb2ZpbGVfbmFtZSx1cmwKVXNlciBleHBlcmllbmNlIHBsYXRmb3JtLFVYUCxVLFVzZXJzIEZpcnN0IEluYy4sVXNlcnMgRmlyc3QgUGxhdGZvcm0saHR0cHM6Ly91Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi50LmNvbQpQcm9jZXNzIG9wdGltaXphdGlvbixNVURBIFdBU1RFIFNPTFVUSU9OUyxNVURBV0FTVEUsS2FpemVuIENvbnN1bHRpbmcgSW5jLixNdWRhIFdhc3RlIFNvbHV0aW9ucyxodHRwczovL20uLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tCkFydGlzYW5hbCBjb2ZmZWUgcm9hc3RlcixPWVNURVIgUE9JTlQgQ09GRkVFLCxPeXN0ZXIgUG9pbnQgQ29mZmVlIEJhciBMTEMsT3lzdGVyIFBvaW50IENvZmZlZSxodHRwczovL28uLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tCkFydGlzYW4gaG9tZSBnb29kcyxGSVJFU0lERSBIRUFSVEggQ1JBRlRTIEFORCBSVVNUSUMgRlVSTklUVVJFIEJPVVRJUVVFLEZJUkVTSURFSFRILEZpcmVzaWRlIEZ1cm5pdHVyZSBTdHVkaW9zIExMQyxGaXJlc2lkZSBIZWFydGggQ3JhZnRzLGh0dHBzOi8vZi4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uaC5jb20KVGVjaCBjb25mZXJlbmNlLENPTlZFUkdFLENPTixDb252ZXJnZW5jZSBTdW1taXQgR3JvdXAgTExDLENvbnZlcmdlbmNlIEV2ZW50cyxodHRwczovL2MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQuY29tClBheW1lbnQgaW5mcmFzdHJ1Y3R1cmUsQ0JQUyxDQlAsQ29sbGlzb24gQnJvdGhlcnMgUGF5bWVudCBTeXN0ZW1zIEluYy4sQ0JQUyxodHRwczovL2MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tCkxlYXJuaW5nIHBsYXRmb3JtLFJFVEFJTCxSRVRBSUxDTyxUcmFpbGhlYWQgRWR1Y2F0aW9uIFNvbHV0aW9ucyBJbmMuLFRyYWlsaGVhZCBMZWFybmluZyxodHRwczovL3QuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLm4uY29tCkRpZ2l0YWwgbWFya2V0aW5nIGFnZW5jeSxQUkVNSVVNIFNBTEUgUExBVEZPUk0sUFJFTUlVTVNBTEUsU2FpbCBEZXNpZ24gU3lzdGVtcyBMTEMsU2FpbCBGcmFtZXdvcmsgU3R1ZGlvLGh0dHBzOi8vcy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20KQXJ0aXNhbiBzb3JiZXQgc2hvcCxGUk9TVFkgU09SQkVUIERFTElHSFRTLEZST1NUWVNSQlQsRnJvc3R5IFNvcmJldCBEZWxpZ2h0cyBMTEMsRnJvc3R5IFNvcmJldCBQYXJhZGlzZSxodHRwczovL2YuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tCkVtZXJnZW5jeSBzeXN0ZW1zLEJSQlMsQlJCLEJpZyBSZWQgQnV0dG9uIFN5c3RlbXMgSW5jLixCaWcgUmVkIEJ1dHRvbixodHRwczovL2IuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLm4uY29tClBheW1lbnQgcHJvY2Vzc2luZyxMUFMsTFBTLExpbmsgUGF5bWVudCBUZWNobm9sb2dpZXMgQ29ycG9yYXRpb24sTGluayBQYXltZW50IFNvbHV0aW9ucyxodHRwczovL2wuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmguY29tCkUtY29tbWVyY2UgYW5hbHl0aWNzLFJFVEFJTCxSRVQsQmxhY2sgRnJpZGF5IEN5YmVyIE1vbmRheSBBbmFseXRpY3MgSW5jLixCRkNNIFJldGFpbCBBbmFseXRpY3MsaHR0cHM6Ly9iLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbQpFbmVyZ3kgc29sdXRpb25zLEVDT01NRVJDRSxFQ09NLEV4b3RoZXJtaWMgUmVhY3Rpb25zIEluYy4sRXhvdGhlcm1pYyBFbmVyZ3ksaHR0cHM6Ly9lLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi55LmNvbQpTZWN1cml0eSBjb25zdWx0aW5nLEJVRk8gU0VDVVJJVFkgTEFCUyxCVUZPU0VDLEJ1Zm8gQ3liZXJzZWN1cml0eSBDb25zdWx0aW5nIExMQyxCdWZvIFNlY3VyaXR5IExhYnMsaHR0cHM6Ly9iLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi55LmNvbQpSZXN0YXVyYW50IGRlbGl2ZXJ5LE5PTVMsTk9NUyxOb20gTm9tIE5vbSBJbmMuLE5vbSBEZWxpdmVyeSBFeHByZXNzLGh0dHBzOi8vbi4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20KTGFuZHNjYXBpbmcgc2VydmljZXMsRElSVCBQSUxFIExBTkRTQ0FQSU5HIEFORCBFWENBVkFUSU9OLERJUlRQSUxFLERpcnQgUGlsZSBFYXJ0aHdvcmtzIExMQyxEaXJ0IFBpbGUgTGFuZHNjYXBpbmcsaHR0cHM6Ly9kLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbQpNZXRpY3Vsb3VzIGNyYWZ0IGdhbGxlcnksUE9XRVIgQ1JBRlQgQkVBVVRZLFBDQixQb3dlciBDcmFmdCBCZWF1dHkgR2FsbGVyeSBJbmMuLFF1YWxpdHkgPSBQb3dlciArIENyYWZ0ICsgQmVhdXR5LGh0dHBzOi8vcC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ueS5jb20KUGxhdGZvcm0gc2VydmljZXMsU0VTU0lPTlMgUExBVEZPUk0gU0VSVklDRVMsU0VTU0lPTlMsU2Vzc2lvbnMgTWFuYWdlbWVudCBJbmMuLFNlc3Npb25zIFBsYXRmb3JtLGh0dHBzOi8vcy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ubS5jb20KLFVSR0VOQ1kgRk9DVVMsVVJHRU5ULFVyZ2VuY3kgRm9jdXMgU29sdXRpb25zIEluYy4sVXJnZW5jeSBhbmQgRm9jdXMsaHR0cHM6Ly91Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbQpBZHZpc29yeSBzZXJ2aWNlcyxTRUVLIEZFRURCQUNLLEZFRURCQUNLLCxTZWVrIEZlZWRiYWNrIEFkdmlzb3J5LGh0dHBzOi8vcy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uay5jb20KUGVyZm9ybWFuY2UgY29uc3VsdGluZyxERUxJVkVSIFJFU1VMVFMsUkVTVUxUUyxPdXRzdGFuZGluZyBSZXN1bHRzIEluYy4sRGVsaXZlciBPdXRzdGFuZGluZyBSZXN1bHRzLGh0dHBzOi8vby4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20KTGxhbWEgYWNjZXNzb3JpZXMsU2hvcCxTSCxMbGFtYSBMb3ZlIEJvdXRpcXVlIExMQyxMbGFtYSBTaG9wLGh0dHBzOi8vbC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20KLEZBTCxGLEZhbGFmZWwgUGFyYWRpc2UgUmVzdGF1cmFudCBMTEMsRmFsYWZlbCBQYXJhZGlzZSxodHRwczovL2YuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tCkVkdWNhdGlvbmFsIHRlY2hub2xvZ3ksTEVBUk4sTFJOLEN1cmlvdXMgTGVhcm5pbmcgU29sdXRpb25zIEluYy4sTGVhcm4gU29sdXRpb25zLGh0dHBzOi8vYy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZy5jb20KSW5mcmFzdHJ1Y3R1cmUgc2VydmljZXMsUkVTSUxJRU5UIFNZU1RFTVMgTUdNVCBTRVJWSUNFUyxSU01TLFJlc2lsaWVudCBTeXN0ZW1zIENvcnBvcmF0aW9uLFJlc2lsaWVudCBNYW5hZ2VtZW50IFNlcnZpY2VzLGh0dHBzOi8vci4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4udC5zeXN0ZW1zCkUtY29tbWVyY2UgcGxhdGZvcm0sT05MSU5FIFNUT1JFLE9OTFNUT1JFLEh1bWJsZSBDb21tZXJjZSBMTEMsT25saW5lIFN0b3JlIEJ1aWxkZXJzLGh0dHBzOi8vaC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20KSW52ZXN0bWVudCBzZXJ2aWNlcyxHRU5FUkFMIE1FUkNIQU5ESVNFLEdFTk1FUkNILE1hY3JvIE9wdGltaXN0aWMgVmVudHVyZXMgSW5jLixHZW5lcmFsIE1lcmNoYW5kaXNlIFBhcnRuZXJzLGh0dHBzOi8vbS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYy5jb20KSHVtYW4gcmVzb3VyY2VzLFJldGFpbCxSVEwsVGFsZW50IEVsZXZhdGlvbiBDb3JwLFJldGFpbCBUYWxlbnQgU29sdXRpb25zLGh0dHBzOi8vdC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ubi5jb20KRW5lcmd5IGNvbnN1bHRpbmcsUEFDRSxQQ0UsU2V0IFBhY2UgRW5lcmd5IFNvbHV0aW9ucyBJbmMuLFBhY2UgRW5lcmd5LGh0dHBzOi8vcy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ueS5jb20KTWFuYWdlbWVudCBjb25zdWx0aW5nLENDUyxDQ1MsQ2xhcml0eSBDb250ZXh0IFNvbHV0aW9ucyBMTEMsQ2xhcml0eSBDb250ZXh0IFNvbHV0aW9ucyxodHRwczovL2MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQuY29tCkRhdGEgYW5hbHl0aWNzLEZJUlNUMkxBU1QsRjJMLEZpcnN0IFByaW5jaXBsZXMgQW5hbHl0aWNzIEluYy4sRmlyc3QgMiBMYXN0IERhdGEsaHR0cHM6Ly9mLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbQpSaXNrIG1hbmFnZW1lbnQgY29uc3VsdGluZyxGRUFSIEFOQUxZU0lTLEZFQVJBTkEsRmVhciBGZWFyIEZlYXIgVW5jZXJ0YWludHkgRG91YnQgSW5jLixGZWFyIFVuY2VydGFpbnR5IERvdWJ0IFNvbHV0aW9ucyxodHRwczovL2YuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tCikiOwoKICAgIEtZQ1ZhbGlkYXRvciAqdmFsaWRhdG9yID0gbmV3IEtZQ1ZhbGlkYXRvcigpOwogICAgdmVjdG9yPEt5Y0RhdGE+IGt5Y0RhdGFBcnJheSA9IHZhbGlkYXRvci0+dmVyaWZ5QnVzaW5lc3NlcyhpbnB1dCk7CgogICAgZm9yIChhdXRvIGt5Y0RhdGE6IGt5Y0RhdGFBcnJheSkgewogICAgICAgIGt5Y0RhdGEucHJpbnQoKTsKICAgIH0KICAgIHJldHVybiAwOwp9