Simplify form detector password confirm (#541)

This commit is contained in:
Leendert de Borst
2025-02-20 23:16:49 +01:00
parent d674563275
commit d2c24792fe
4 changed files with 741 additions and 47 deletions

View File

@@ -8,7 +8,6 @@ export type FieldPatterns = {
email: string[];
emailConfirm: string[];
password: string[];
passwordConfirm: string[];
birthdate: string[];
gender: string[];
birthDateDay: string[];
@@ -35,7 +34,6 @@ export const EnglishFieldPatterns: FieldPatterns = {
email: ['email', 'mail', 'emailaddress'],
emailConfirm: ['confirm', 'verification', 'repeat', 'retype', 'verify'],
password: ['password', 'pwd', 'pass'],
passwordConfirm: ['confirm', 'verification', 'repeat', 'retype', '2', 'verify'],
birthdate: ['birthdate', 'birth-date', 'dob', 'date-of-birth'],
gender: ['gender', 'sex'],
birthDateDay: ['birth-day', 'birthday', 'day', 'birthdate_d'],
@@ -62,7 +60,6 @@ export const DutchFieldPatterns: FieldPatterns = {
email: ['e-mailadres', 'e-mail'],
emailConfirm: ['bevestig', 'herhaal', 'verificatie'],
password: ['wachtwoord', 'pwd'],
passwordConfirm: ['bevestig', 'herhaal', 'verificatie'],
birthdate: ['geboortedatum', 'geboorte-datum'],
gender: ['geslacht', 'aanhef'],
birthDateDay: ['dag'],
@@ -95,7 +92,6 @@ export const CombinedFieldPatterns: FieldPatterns = {
email: [...new Set([...DutchFieldPatterns.email, ...EnglishFieldPatterns.email])],
emailConfirm: [...new Set([...EnglishFieldPatterns.emailConfirm, ...DutchFieldPatterns.emailConfirm])],
password: [...new Set([...EnglishFieldPatterns.password, ...DutchFieldPatterns.password])],
passwordConfirm: [...new Set([...EnglishFieldPatterns.passwordConfirm, ...DutchFieldPatterns.passwordConfirm])],
birthdate: [...new Set([...EnglishFieldPatterns.birthdate, ...DutchFieldPatterns.birthdate])],
gender: [...new Set([...EnglishFieldPatterns.gender, ...DutchFieldPatterns.gender])],
birthDateDay: [...new Set([...EnglishFieldPatterns.birthDateDay, ...DutchFieldPatterns.birthDateDay])],

View File

@@ -291,51 +291,11 @@ export class FormDetector {
? form.querySelectorAll<HTMLInputElement>('input[type="password"]')
: this.document.querySelectorAll<HTMLInputElement>('input[type="password"]');
let primaryPassword: HTMLInputElement | null = null;
let confirmPassword: HTMLInputElement | null = null;
// Look for the first password field that doesn't appear to be a confirmation field
for (const input of Array.from(candidates)) {
const attributes = [
input.id,
input.name,
input.placeholder
].map(attr => attr?.toLowerCase() ?? '');
if (!CombinedFieldPatterns.passwordConfirm.some(pattern => attributes.some(attr => attr.includes(pattern)))) {
primaryPassword = input;
break;
}
}
// If no clear primary password field is found, use the first password field as primary
if (!primaryPassword && candidates.length > 0) {
primaryPassword = candidates[0];
}
// If we found a primary password, look for a confirmation field
if (primaryPassword) {
for (const input of Array.from(candidates)) {
if (input === primaryPassword) continue;
const attributes = [
input.id,
input.name,
input.className,
input.placeholder
].map(attr => attr?.toLowerCase() ?? '');
const confirmPatterns = ['confirm', 'verification', 'repeat', 'retype', '2', 'verify'];
if (confirmPatterns.some(pattern => attributes.some(attr => attr.includes(pattern)))) {
confirmPassword = input;
break;
}
}
}
const candidateArray = Array.from(candidates);
return {
primary: primaryPassword,
confirm: confirmPassword
primary: candidateArray[0] ?? null,
confirm: candidateArray[1] ?? null
};
}

View File

@@ -33,6 +33,17 @@ describe('FormDetector English tests', () => {
testField(FormField.EmailConfirm, 'reenter_email', htmlFile);
});
describe('English registration form 4 detection', () => {
const htmlFile = 'en-registration-form4.html';
testField(FormField.Email, 'fbclc_userName', htmlFile);
testField(FormField.EmailConfirm, 'fbclc_emailConf', htmlFile);
testField(FormField.Password, 'fbclc_pwd', htmlFile);
testField(FormField.PasswordConfirm, 'fbclc_pwdConf', htmlFile);
testField(FormField.FirstName, 'fbclc_fName', htmlFile);
testField(FormField.LastName, 'fbclc_lName', htmlFile);
});
describe('English email form 1 detection', () => {
const htmlFile = 'en-email-form1.html';

View File

@@ -0,0 +1,727 @@
<div class="content extLoginFormContent">
<input type="hidden" id="fbcs_keyword" name="fbcs_keyword" value="">
<input type="hidden" id="fbcs_dept" name="fbcs_dept" value="">
<input type="hidden" id="fbcs_div" name="fbcs_div" value="">
<input type="hidden" id="fbcs_loc" name="fbcs_loc" value="">
<input type="hidden" id="career_ns" name="career_ns">
<div class="button_row bottomspace">
<div class="left">
<span class="aquabtn mid inactiveAccessible">
<span>
<button type="button" onclick="javascript:setField('career_ns','home');setFieldAndSubmit('userMsgReq','false');">Go Back
</button>
</span>
</span>
</div>
</div>
<p>
<span>Already a registered user?</span>
<a href="/career?company=1657261P&amp;site=&amp;lang=en_GB&amp;requestParams=kLT07rTA9vLxk7NqwAotzGjSnSJ42lvzloG1uIhBMCuxLFGvtCQzR88jsTjDN7GAlf3WwcNiCReZ%0AGZjcGLhy8hNT3BKTS%2FKLPBk4SzKKUosz8nNSKgrsHRhAgKecA0gKADFbCYNgTn56Zp5bTn55UGph%0AaWZRakppEYNwtA%2FYipzEvHS94JKizLx067WXwp6%2FlK12Z2JgqCgA6mUsYWApKSpNBVLFmSWppYUM%0AdQzMEHGGEga%2B5MSi1NSi%2BOT83ILEvEpkWQ5DM1NzIzPDgBIGdvzSLCD7keVYU%2FPi3Z1KGNjii%2FWS%0Ai5KQpXS8SpItAjzSIn3zDJxLq7yr9DOSU5xNowKcAtMic5M8yssKsgxK3INCjMp8bSsA9GBdIQ%3D%3D%0A&amp;_s.crb=Jtc8PHfYMn0CuzKz%2fhcdC5ZPBQfYmbHwvpj0tGRT2vM%3d">Please sign in
</a>
</p>
<p>
<span id="loginHelpText">Login credentials are case-sensitive</span>
</p>
<!-- OTP Authentication Container -->
<div id="otpContainer"></div>
<script type="text/javascript">
var validationObjectContainer = [];
</script>
<table id="fieldsContainer" class="axial noborder bottomspace">
<!-- Fragments include: Starts -->
<!-- Standard Field values initialization -->
<!-- Username -->
<tbody><tr>
<td class="col-sm-4">
<label for="fbclc_userName" title="Required">
Email Address:
<span class="required requiredAccessible" aria-hidden="true">*</span>
</label>
</td>
<td>
<input class="form-control" type="text" size="30" maxlength="99" autocomplete="false" onkeydown="clearErrMsg(event)" id="fbclc_userName" onblur="checkforMandatory(&quot;fbclc_userName&quot;,
&quot;Email%20Address%3a&quot;);" name="fbclc_userName" value="" aria-describedby="fbclc_userName_error" aria-required="true">
<div class="rcmValidationMsgArea hide" id="fbclc_userName_error"></div>
<script type="text/javascript">
validationObjectContainer.push(
{
id: "fbclc_userName",
label: "Email Address:"
});
</script>
</td>
</tr>
<!-- Email Address -->
<!-- Retype Email Address -->
<tr>
<td class="col-sm-4">
<label for="fbclc_emailConf" title="Required">
Retype Email Address:
<span class="required requiredAccessible" aria-hidden="true">*</span>
</label>
</td>
<td>
<input class="form-control" type="text" size="30" maxlength="99" autocomplete="false" id="fbclc_emailConf" name="fbclc_emailConf" title="Retype Email Address:" onkeydown="clearErrMsg(event)" onpaste="SFDOMEvent.preventDefault(event);" onblur="checkforMandatory(&quot;fbclc_emailConf&quot;, &quot;Retype%20Email%20Address%3a&quot;); validateEmail()" value="" '="" aria-describedby="fbclc_emailConf_error" aria-required="true">
<div class="rcmValidationMsgArea hide" id="fbclc_emailConf_error"></div>
<script type="text/javascript">
validationObjectContainer.push(
{
id: "fbclc_emailConf",
label: "Retype Email Address:"
});
</script>
</td>
</tr>
<!-- Password -->
<tr class="">
<td class="col-sm-4">
<label for="fbclc_pwd" title="Required">
Choose Password:
<span class="required requiredAccessible" aria-hidden="true">*</span>
</label>
</td>
<td>
<div class="rcmPwdPolicy">
<input class="form-control" id="fbclc_pwd" type="password" size="30" autocomplete="false" maxlength="99" name="fbclc_pwd" value="" onkeyup="checkPasswordPolicy(event,fbclc_pwdConf);" onblur="checkforMandatory(&quot;fbclc_pwd&quot;, &quot;Choose Password:&quot;);checkPasswordPolicy(event,fbclc_pwdConf);" aria-describedby="fbclc_pwd_error rcmPwdPolicyProgressBar " aria-required="true" aria-autocomplete="list">
</div>
<a id="rcmPwdPolicyAnchor" href="javascript:void(0);" onmouseover="RCMPwdPolicyUtil.showPopup('rcmPwdPolicyAnchor');return false;" onmouseout="RCMPwdPolicyUtil.hidePopup();return false;" onfocus="RCMPwdPolicyUtil.showPopup('rcmPwdPolicyAnchor');return false;" onblur="RCMPwdPolicyUtil.hidePopup();return false;" style="margin-left: 5px; display: none;">Password Policy
</a>
<div id="rcmPwdPolicyProgressBar" style="float: left; margin-left: 5px; display: inline;"><div role="presentation" class="okIcon sapIcon"></div><div id="PasswordPolicyText" aria-live="assertive" style="float:left">Password accepted</div></div>
<div id="fbclc_pwd_error" class="rcmValidationMsgArea hide"></div>
<script type="text/javascript">
validationObjectContainer.push(
{
id:"fbclc_pwd",
label: "Choose Password:"
});
</script>
</td>
</tr>
<!-- Retype Password -->
<tr class="">
<td class="col-sm-4">
<label for="fbclc_pwdConf" title="Required">
Retype Password:
<span class="required requiredAccessible" aria-hidden="true">*</span>
</label>
</td>
<td>
<div class="rcmPwdPolicy">
<input class="form-control invalidInput career-password-text-border" type="password" size="30" maxlength="99" autocomplete="chrome-off" id="fbclc_pwdConf" name="fbclc_pwdConf" value="" onkeyup="checkResetPasswordPolicy(event,fbclc_pwd);" onblur="checkforMandatory(&quot;fbclc_pwdConf&quot;, &quot;Retype Password:&quot;);checkResetPasswordPolicy(event,fbclc_pwd,true);" aria-describedby="fbclc_pwdConf_error pwdMatchOrMismatch" aria-required="true" aria-invalid="true">
</div>
<div id="rcmResetPwdPolicyProgressBar" style="float: left; margin-left: 5px; display: block;" class=" hide"><div class="errorMsg sapIcon"></div><div id="pwdMatchOrMismatch" aria-live="assertive" class="warningMsgText">&nbsp;Passwords dont match</div></div>
<div id="fbclc_pwdConf_error" class="rcmValidationMsgArea"><span>Passwords dont match</span></div>
<script type="text/javascript">
validationObjectContainer.push(
{
id: "fbclc_pwdConf",
label: "Retype Password:"
});
</script>
</td>
</tr>
<!-- First Name -->
<tr>
<td class="col-sm-4">
<label for="fbclc_fName" title="Required">
First Name:
<span class="required requiredAccessible" aria-hidden="true">*</span>
</label>
</td>
<td>
<input class="form-control" type="text" size="30" maxlength="40" autocomplete="chrome-off" id="fbclc_fName" onblur="checkforMandatory(&quot;fbclc_fName&quot;, &quot;First Name:&quot;) &amp;&amp; isValidName(&quot;fbclc_fName&quot;, &quot;First Name:&quot;)" name="fbclc_fName" value="" aria-describedby="fbclc_fName_error" aria-required="true">
<div class="rcmValidationMsgArea hide" id="fbclc_fName_error"></div>
<script type="text/javascript">
validationObjectContainer.push(
{
id: "fbclc_fName",
label: "First Name:"
});
</script>
</td>
</tr>
<!-- Middle Name -->
<!-- Last Name -->
<tr>
<td class="col-sm-4">
<label for="fbclc_lName" title="Required">
Last Name:
<span class="required requiredAccessible" aria-hidden="true">*</span>
</label>
</td>
<td>
<input class="form-control" type="text" size="30" maxlength="40" autocomplete="chrome-off" id="fbclc_lName" onblur="checkforMandatory(&quot;fbclc_lName&quot;, &quot;Last Name:&quot;) &amp;&amp; isValidName(&quot;fbclc_lName&quot;, &quot;Last Name:&quot;)" name="fbclc_lName" value="" aria-describedby="fbclc_lName_error" aria-required="true">
<div class="rcmValidationMsgArea hide" id="fbclc_lName_error"></div>
<script type="text/javascript">
validationObjectContainer.push(
{
id: "fbclc_lName",
label: "Last Name:"
});
</script>
</td>
</tr>
<!-- Dial in Prefix-->
<!-- Country of Residence: Cross border search preference -->
<tr>
<td class="col-sm-4">
<label for="fbclc_country" style="white-space:normal;"><span title="Required">
Country/Region of Residence:<span class="required requiredAccessible" aria-hidden="true">*</span></span></label>
</td>
<td>
<div class="form-group">
<div class="col-xs-* col-md-*" style="padding:0px;">
<select aria-required="true" aria-label="Country/Region of Residence" autocomplete="off" id="fbclc_country" name="fbclc_country" onblur="checkforMandatory(&quot;fbclc_country&quot;, &quot;Country/Region of Residence&quot;)" aria-describedby="fbclc_country_error" onchange="clearDpcsInfo()">
<option value="" role="menuitem">- Select -</option>
<option value="AF" role="menuitem">Afghanistan</option>
<option value="AL" role="menuitem">Albania</option>
<option value="DZ" role="menuitem">Algeria</option>
<option value="AD" role="menuitem">Andorra</option>
<option value="AO" role="menuitem">Angola</option>
<option value="AG" role="menuitem">Antigua and Barbuda</option>
<option value="AR" role="menuitem">Argentina</option>
<option value="AM" role="menuitem">Armenia</option>
<option value="AU" role="menuitem">Australia</option>
<option value="AT" role="menuitem">Austria</option>
<option value="AZ" role="menuitem">Azerbaijan</option>
<option value="BS" role="menuitem">Bahamas</option>
<option value="BH" role="menuitem">Bahrain</option>
<option value="BD" role="menuitem">Bangladesh</option>
<option value="BB" role="menuitem">Barbados</option>
<option value="BY" role="menuitem">Belarus</option>
<option value="BE" role="menuitem">Belgium</option>
<option value="BZ" role="menuitem">Belize</option>
<option value="BJ" role="menuitem">Benin</option>
<option value="BT" role="menuitem">Bhutan</option>
<option value="BA" role="menuitem">Bosnia and Herzegovina</option>
<option value="BW" role="menuitem">Botswana</option>
<option value="BR" role="menuitem">Brazil</option>
<option value="BN" role="menuitem">Brunei Darussalam</option>
<option value="BG" role="menuitem">Bulgaria</option>
<option value="BF" role="menuitem">Burkina Faso</option>
<option value="BI" role="menuitem">Burundi</option>
<option value="KH" role="menuitem">Cambodia</option>
<option value="CM" role="menuitem">Cameroon</option>
<option value="CA" role="menuitem">Canada</option>
<option value="CF" role="menuitem">Central African Republic</option>
<option value="TD" role="menuitem">Chad</option>
<option value="CL" role="menuitem">Chile</option>
<option value="CN" role="menuitem">China</option>
<option value="CO" role="menuitem">Colombia</option>
<option value="KM" role="menuitem">Comoros</option>
<option value="CG" role="menuitem">Congo</option>
<option value="CD" role="menuitem">Congo, the Democratic Republic of the</option>
<option value="CR" role="menuitem">Costa Rica</option>
<option value="CI" role="menuitem">Côte d'Ivoire</option>
<option value="HR" role="menuitem">Croatia</option>
<option value="CU" role="menuitem">Cuba</option>
<option value="CY" role="menuitem">Cyprus</option>
<option value="CZ" role="menuitem">Czech Republic</option>
<option value="DK" role="menuitem">Denmark</option>
<option value="DJ" role="menuitem">Djibouti</option>
<option value="DM" role="menuitem">Dominica</option>
<option value="DO" role="menuitem">Dominican Republic</option>
<option value="EC" role="menuitem">Ecuador</option>
<option value="EG" role="menuitem">Egypt</option>
<option value="SV" role="menuitem">El Salvador</option>
<option value="GQ" role="menuitem">Equatorial Guinea</option>
<option value="ER" role="menuitem">Eritrea</option>
<option value="EE" role="menuitem">Estonia</option>
<option value="ET" role="menuitem">Ethiopia</option>
<option value="FJ" role="menuitem">Fiji</option>
<option value="FI" role="menuitem">Finland</option>
<option value="FR" role="menuitem">France</option>
<option value="GA" role="menuitem">Gabon</option>
<option value="GM" role="menuitem">Gambia</option>
<option value="GE" role="menuitem">Georgia</option>
<option value="DE" role="menuitem">Germany</option>
<option value="GH" role="menuitem">Ghana</option>
<option value="GR" role="menuitem">Greece</option>
<option value="GD" role="menuitem">Grenada</option>
<option value="GT" role="menuitem">Guatemala</option>
<option value="GN" role="menuitem">Guinea</option>
<option value="GW" role="menuitem">Guinea-Bissau</option>
<option value="GY" role="menuitem">Guyana</option>
<option value="HT" role="menuitem">Haiti</option>
<option value="HN" role="menuitem">Honduras</option>
<option value="HU" role="menuitem">Hungary</option>
<option value="IS" role="menuitem">Iceland</option>
<option value="IN" role="menuitem">India</option>
<option value="ID" role="menuitem">Indonesia</option>
<option value="IR" role="menuitem">Iran, Islamic Republic of</option>
<option value="IQ" role="menuitem">Iraq</option>
<option value="IE" role="menuitem">Ireland</option>
<option value="IL" role="menuitem">Israel</option>
<option value="IT" role="menuitem">Italy</option>
<option value="JM" role="menuitem">Jamaica</option>
<option value="JP" role="menuitem">Japan</option>
<option value="JO" role="menuitem">Jordan</option>
<option value="KZ" role="menuitem">Kazakhstan</option>
<option value="KE" role="menuitem">Kenya</option>
<option value="KI" role="menuitem">Kiribati</option>
<option value="KP" role="menuitem">Korea, Democratic People's Republic of</option>
<option value="KR" role="menuitem">Korea, Republic of</option>
<option value="XK" role="menuitem">Kosovo</option>
<option value="KW" role="menuitem">Kuwait</option>
<option value="KG" role="menuitem">Kyrgyzstan</option>
<option value="LA" role="menuitem">Lao People's Democratic Republic</option>
<option value="LV" role="menuitem">Latvia</option>
<option value="LB" role="menuitem">Lebanon</option>
<option value="LS" role="menuitem">Lesotho</option>
<option value="LR" role="menuitem">Liberia</option>
<option value="LI" role="menuitem">Liechtenstein</option>
<option value="LT" role="menuitem">Lithuania</option>
<option value="LU" role="menuitem">Luxembourg</option>
<option value="MG" role="menuitem">Madagascar</option>
<option value="MW" role="menuitem">Malawi</option>
<option value="MY" role="menuitem">Malaysia</option>
<option value="MV" role="menuitem">Maldives</option>
<option value="ML" role="menuitem">Mali</option>
<option value="MT" role="menuitem">Malta</option>
<option value="MH" role="menuitem">Marshall Islands</option>
<option value="MR" role="menuitem">Mauritania</option>
<option value="MU" role="menuitem">Mauritius</option>
<option value="MX" role="menuitem">Mexico</option>
<option value="FM" role="menuitem">Micronesia, Federated States of</option>
<option value="MD" role="menuitem">Moldova, Republic of</option>
<option value="MC" role="menuitem">Monaco</option>
<option value="MN" role="menuitem">Mongolia</option>
<option value="ME" role="menuitem">Montenegro</option>
<option value="MA" role="menuitem">Morocco</option>
<option value="MZ" role="menuitem">Mozambique</option>
<option value="MM" role="menuitem">Myanmar</option>
<option value="NA" role="menuitem">Namibia</option>
<option value="NR" role="menuitem">Nauru</option>
<option value="NP" role="menuitem">Nepal</option>
<option value="NL" role="menuitem">Netherlands</option>
<option value="NZ" role="menuitem">New Zealand</option>
<option value="NI" role="menuitem">Nicaragua</option>
<option value="NE" role="menuitem">Niger</option>
<option value="NG" role="menuitem">Nigeria</option>
<option value="NO" role="menuitem">Norway</option>
<option value="OM" role="menuitem">Oman</option>
<option value="PK" role="menuitem">Pakistan</option>
<option value="PW" role="menuitem">Palau</option>
<option value="PS" role="menuitem">Palestine, State of</option>
<option value="PA" role="menuitem">Panama</option>
<option value="PG" role="menuitem">Papua New Guinea</option>
<option value="PY" role="menuitem">Paraguay</option>
<option value="PE" role="menuitem">Peru</option>
<option value="PH" role="menuitem">Philippines</option>
<option value="PL" role="menuitem">Poland</option>
<option value="PT" role="menuitem">Portugal</option>
<option value="QA" role="menuitem">Qatar</option>
<option value="MK" role="menuitem">Republic of North Macedonia</option>
<option value="RO" role="menuitem">Romania</option>
<option value="RU" role="menuitem">Russian Federation</option>
<option value="RW" role="menuitem">Rwanda</option>
<option value="KN" role="menuitem">Saint Kitts and Nevis</option>
<option value="LC" role="menuitem">Saint Lucia</option>
<option value="VC" role="menuitem">Saint Vincent and the Grenadines</option>
<option value="WS" role="menuitem">Samoa</option>
<option value="SM" role="menuitem">San Marino</option>
<option value="ST" role="menuitem">Sao Tome and Principe</option>
<option value="SA" role="menuitem">Saudi Arabia</option>
<option value="SN" role="menuitem">Senegal</option>
<option value="RS" role="menuitem">Serbia</option>
<option value="SC" role="menuitem">Seychelles</option>
<option value="SL" role="menuitem">Sierra Leone</option>
<option value="SG" role="menuitem">Singapore</option>
<option value="SK" role="menuitem">Slovakia</option>
<option value="SI" role="menuitem">Slovenia</option>
<option value="SB" role="menuitem">Solomon Islands</option>
<option value="SO" role="menuitem">Somalia</option>
<option value="ZA" role="menuitem">South Africa</option>
<option value="SS" role="menuitem">South Sudan</option>
<option value="ES" role="menuitem">Spain</option>
<option value="LK" role="menuitem">Sri Lanka</option>
<option value="SD" role="menuitem">Sudan</option>
<option value="SR" role="menuitem">Suriname</option>
<option value="SE" role="menuitem">Sweden</option>
<option value="CH" role="menuitem">Switzerland</option>
<option value="SY" role="menuitem">Syrian Arab Republic</option>
<option value="TJ" role="menuitem">Tajikistan</option>
<option value="TZ" role="menuitem">Tanzania, United Republic of</option>
<option value="TH" role="menuitem">Thailand</option>
<option value="TL" role="menuitem">Timor-Leste</option>
<option value="TG" role="menuitem">Togo</option>
<option value="TO" role="menuitem">Tonga</option>
<option value="TT" role="menuitem">Trinidad and Tobago</option>
<option value="TN" role="menuitem">Tunisia</option>
<option value="TR" role="menuitem">Turkey</option>
<option value="TM" role="menuitem">Turkmenistan</option>
<option value="TV" role="menuitem">Tuvalu</option>
<option value="UG" role="menuitem">Uganda</option>
<option value="UA" role="menuitem">Ukraine</option>
<option value="AE" role="menuitem">United Arab Emirates</option>
<option value="GB" role="menuitem">United Kingdom</option>
<option value="US" role="menuitem">United States</option>
<option value="UY" role="menuitem">Uruguay</option>
<option value="UZ" role="menuitem">Uzbekistan</option>
<option value="VU" role="menuitem">Vanuatu</option>
<option value="VE" role="menuitem">Venezuela</option>
<option value="VN" role="menuitem">Viet Nam</option>
<option value="YE" role="menuitem">Yemen</option>
<option value="ZM" role="menuitem">Zambia</option>
<option value="ZW" role="menuitem">Zimbabwe</option>
</select>
</div>
<div id="fbclc_country_error" class="rcmValidationMsgArea hide"></div>
</div>
<script type="text/javascript">
validationObjectContainer.push(
{
id: "fbclc_country",
label: "Country/Region of Residence"
});
</script>
</td>
</tr>
<!-- Make Profile Visibile to: -->
<!-- Notifications -->
<!-- Marketing Consent switch in Recruiting settings -->
<!-- Captcha -->
<!-- Data Privacy Statement -->
<tr>
<td>
<label for="dataPrivacyId" style="white-space:normal;">
Terms of Use:<span class="required requiredAccessible" aria-hidden="true">*</span>
</label>
</td>
<td class="dpcsHyperlink">
<span>
<a aria-label="Terms of Use Read and accept the data privacy statement. Required" id="dataPrivacyId" role="button" tabindex="0" style="cursor:pointer;" onblur="checkforMandatory('fbclc_dpcsId', 'Terms of Use')" onkeydown="javascript:var evt = event.keyCode; if(event.keyCode == 32 || event.keyCode == 13) openDpcsDialog(true);" onclick="openDpcsDialog(true);return false;">
Read and accept the data privacy statement.
</a>
</span>
<div class="rcmValidationMsgArea hide" id="fbclc_dpcsId_error" aria-live="assertive"></div>
<input type="hidden" id="fbclc_dpcsId" name="fbclc_dpcsId" value="">
<script type="text/javascript">
validationObjectContainer.push(
{
id: "fbclc_dpcsId",
label: "Terms of Use"
});
</script>
</td>
</tr>
<!-- Fragments include: Ends -->
<!-- Create Account button -->
<tr>
<th></th>
<td class="button_cell">
<div id="dataPrivacyTooltipRegion">
<span id="fbclc_createAccountButton_span" class="aquabtn inactiveAccessible activeAccessible">
<span>
<button id="fbclc_createAccountButton" name="fbclc_createAccountButton" onfocus="readMsg('');" onclick="return submitCreateAccount();">
Create Account
</button>
</span>
</span>
</div>
</td>
</tr>
</tbody></table>
</div>