var new_fieldname = ""
var allGood = false;
var submitted=false;

function check(form) {    

  var message = ""
  var more_message = ""
  var showmsg = "no"
    
  x = (form.elements.length - 1) 
    
  for (var i = 0; i <= x; i++) {
    
    var fieldname = form.elements[i].name    
      
    var myPrefix = fieldname.substring(1,5)
    var myField  = fieldname.substring(6)		
                  
    if(myPrefix == "MASK") {     
            
      var myMask    = form.elements[i].value
            
      //get the original field            
      for (var y = 0; y <= x; y++) {        
        if (form.elements[y].name == myField)
        break
      }           
      
      var data = form.elements[y].value    
            
      message += validateMask(form, data, myMask, myField, x)      
                       
    }      
    else if(myPrefix == "REQU") {     
            
      var myMask    = form.elements[i].value
            
      //get the original field            
      for (var y = 0; y <= x; y++) {        
        if (form.elements[y].name == myField)
        break
      }           
      
      var data = form.elements[y].value    
            
      message += validateReq(form, data, myMask, myField, x)      
                       
    }  
    else if(myPrefix == "MORE") {      
      
      var myMore    = form.elements[i].value
                               
      //get the original field            
      for (var y = 0; y <= x; y++) {        
        if (form.elements[y].name == myField)
        break
      }           
      
      //data stores the user input
      var data = form.elements[y].value    
                              
      message += validateMore(form, data, myMore, myField, x)        
      
    }
    else if(myPrefix == "TRIM") {
    
      var isCaps        = ""
      var maxLen        = 0          
      var convertedData = ""
      
      var myMore        = form.elements[i].value            
      
      isCaps = getToken(myMore, 0)
      maxLen = getToken(myMore, 1)
                   
      //get the original field            
      for (var y = 0; y <= x; y++) {        
        if (form.elements[y].name == myField)
        break
      }           
      
      //data stores the user input
      var data = form.elements[y].value    
                                          
      convertedData = trimAndConvert(data, isCaps, maxLen)
      
      form.elements[y].value = convertedData     
      
    }
    else if(myPrefix == "VRFY") {
                     
      for (var y = 0; y <= x; y++) {                
        if (form.elements[y].name == myField)        
        break
      }           
      
      //userOriginal stores the original Field
      var userOriginal     = form.elements[y].value          
      
      //location of the comparing field
      var userReconfirmLoc = form.elements[i].value      
      
      for (var y = 0; y <= x; y++) {                
        if (form.elements[y].name == userReconfirmLoc)
        break
      }
      
      //userReConfirm stores the re-confirmed Field
      var userReConfirm = form.elements[y].value         
               
      var errMsgLoc = "_MESSAGE" + form.elements[i].name
      
      if(userOriginal != userReConfirm) {
             
        for (var y = 0; y <= x; y++) {        
          if (form.elements[y].name == errMsgLoc)
          break
        }                  
                        
        message += form.elements[y].value + "\n"
        
      }      
      
    }    
    else if(myPrefix == "MAKE") {
          
      for (var y = 0; y <= x; y++) {        
        if (form.elements[y].name == myField)
        break
      }           
      
      //userOriginal stores the original Field
      var userOriginal  = form.elements[y].value    
      
      //aliasLocatin stores the field name of the ALIAS
      var aliasLocation = form.elements[i].value
            
      //the name of the field that stores the BEFORE info
      var beforeData = "BEFORE_" + myField
      
      //the name of the field that stores the AFTER info
      var afterData = "AFTER_" + myField
                 
      //initialize the pad String
      var padding   = ""
      
      //isBefore is initialized to false
      var isBefore = false
      
      for (var y = 0; y <= x; y++) {        
        if (form.elements[y].name == beforeData) {          
          isBefore = true
          break
        }
        if (form.elements[y].name == afterData) {                    
          isBefore = false
          break        
        }
      }      
      
      padding = form.elements[y].value
      
      for (var y = 0; y <= x; y++) {        
        if (form.elements[y].name == aliasLocation) {                      
          break
        }          
      }
      
      if (isBefore) {                               
        //set the substring BEFORE the padding
        form.elements[y].value = userOriginal.substring(0,4) + padding                
      }
      else {                            
        //set the substring AFTER the padding
        form.elements[y].value = padding + userOriginal.substring(0,4)                
      }     
       
    }    
    else if(myPrefix == "DIFF") {    
     
      var field1    = myField
      var field2    = form.elements[i].value
      var errMsgLoc = "_MESSAGE_DIFF_" + field2      
    
      var returnMsg = ""      
      var value1    = ""
      var value2    = ""
      
      for (var y = 0; y <= x; y++) {        
        if (form.elements[y].name == field1) {                      
          value1 = form.elements[y].value
        }          
        else if (form.elements[y].name == field2) { 
          value2 = form.elements[y].value
        }
        else if (form.elements[y].name == errMsgLoc) {
          returnMsg = form.elements[y].value
        }
      }         
      
      if(value1 == value2) {
        message += returnMsg + "\n"
      }        
            
    }
    else if(myPrefix == "REPT") {
      var numberOfCharactersAllowed = form.elements[i].value                 
      message += repeatCheck(form, myField, numberOfCharactersAllowed, x)
    }
    else if(myPrefix == "NUMB") {     
      var minNumberOfInts = form.elements[i].value
      message += requiredIntegerCheck(form, myField, minNumberOfInts, x)
    }
    else if(myPrefix == "SPAC") {
      var numberOfSpacesAllowed = form.elements[i].value      
      message += spacesAllowedCheck(form, myField, numberOfSpacesAllowed, x)
    }
	else if(myPrefix == "STRP") {	  	  
	  message += stripField(form, myField, x)          
    }
    else {
      //do nothing on this rotation
    }     
    
  }
  
  if (message.length > 0) {
    alert(message)
    return false;
  }
  else {
    if(submitted) {
      return false;
      return true;
    }
    else {
      submitted=true;
      return true;
    }
  }  
    
}

function spacesAllowedCheck(form, field, maxNumberOfSpaces, x) {
  var fieldValue   = ""
  var nameLocation = "_NAME_" + field
  var errName      = ""  
  var count        = 0
  
  for (var y = 0; y <= x; y++) {                 
	
    if (form.elements[y].name == field) {    
      fieldValue = form.elements[y].value
    }
    if (form.elements[y].name == nameLocation) {    
      errName = form.elements[y].value
    }    
  }          
  
  var theErrorString = errName + " must not contain spaces." + "\n"  
  var char           = ""    
  
  for (var z = 0; z<fieldValue.length; z++) { 
    char = fieldValue.charAt(z)      
    if(char == " ") {
      count++
    }
  }
  
  if (count > maxNumberOfSpaces) {
    return theErrorString
  }
  else {
    return ""
  }
  
}

function stripField(form, field, x) {

  var fieldValue   = ""
  var nameLocation = "_NAME_" + field
  var errName      = ""  
  var count        = 0
  
  for (var y = 0; y <= x; y++) {                 
	
    if (form.elements[y].name == field) {    
	
      fieldValue = form.elements[y].value
	  
	  var char            = ""      
	  var strippedField   = ""; 
	  
	  /*
	  for (var z = 0; z<fieldValue.length; z++) { 
        char = fieldValue.charAt(z)      
        if(getAcceptableValue(char) != "x") {
	      strippedField += char;
        }
      } 
	  */
      
	  var accept = "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
  
      for (var z = 0; z<fieldValue.length; z++) { 
        char = fieldValue.charAt(z)      
        if (accept .indexOf(char) !=-1) strippedField += char;
      }	     
	  
      strippedField = strippedField.toUpperCase();
	  
	  form.elements[y].value = strippedField;
	  

    }
    if (form.elements[y].name == nameLocation) {    
      errName = form.elements[y].value
    }    
  }          
  
  var theErrorString  = errName + " Stripped." + "\n"   

  if (strippedField.length == 0) {
  	return errName + " Should not be blank";
  }
  else  {  
    return ""
  }
  
  
}

function requiredIntegerCheck(form, field, minNumber, x) {
  var fieldValue   = ""
  var nameLocation = "_NAME_" + field
  var errName      = ""  
  var count        = 0
  
  for (var y = 0; y <= x; y++) {                
    if (form.elements[y].name == field) {    
      fieldValue = form.elements[y].value
    }
    if (form.elements[y].name == nameLocation) {    
      errName = form.elements[y].value
    }    
  }       
  
  var theErrorString = "Your " + normalizeText(errName) + " must contain at least " + minNumber + " numeric character" + "\n"
  var char           = ""
  
  for (var z = 0; z<fieldValue.length; z++) { 
    char = getType(fieldValue.charAt(z))      
    if(char == "i") {
      count++
    }
  }
  
  if(count < minNumber) {
    return theErrorString
  }
  else {
    return ""
  }  
  
}

function repeatCheck(form, field, allowable, x) {
  
  var fieldValue   = ""
  var nameLocation = "_NAME_" + field
  var errName      = ""
  var count        = 0;
  
  for (var y = 0; y <= x; y++) {                
    if (form.elements[y].name == field) {    
      fieldValue = form.elements[y].value
    }
    if (form.elements[y].name == nameLocation) {    
      errName = form.elements[y].value
    }    
  }     
  
  var theErrorString = "Your " + errName + " must not contain more than " + allowable + " identical characters in a row" + "\n"
  var previousChar   = ""
  
  for (var z = 0; z<fieldValue.length; z++) {
    var char = fieldValue.charAt(z)
   
    if(z == 0) {
      previousChar = char
      count++
    }
    else {
      if(char == previousChar) {
        count++
        if (count > allowable) {
          return theErrorString
        }
      }
      else {
        previousChar = char
        count        = 1
      }
    }       
  }
  
  return ""
  
}

  
function textCounter(field, countfield, maxlimit) {

  if (field.value.length > maxlimit) 
    field.value = field.value.substring(0, maxlimit);  
  else 
    countfield.value = maxlimit - field.value.length;
    
}

function normalizeText(text) {
  var firstLetter      = "";
  var remainingLetters = "";
  firstLetter = text.substring(0,1);
  firstLetter = firstLetter.toUpperCase();
  remainingLetters = text.substring(1);
  return firstLetter + remainingLetters.toLowerCase();
}

/**
 * getPrefix returns the prefix of a "_"
 * separated String. EXAMPLE: getPrefix(111_AAA) 
 * would return "111"
 */
function getPrefix(fld) {
  return getValues(fld, "PRE")
}
/**
 * getField returns the field name of a "_"
 * separated String. EXAMPLE: getPrefix(111_AAA) 
 * would return "AAA"
 */
function getField(fld) {
  getValues(fld, "PST")
}


function Am2Input(wholeString) {  
  


  var invPrefix  = "";
  var invField   = "";
  var splitPoint = wholeString.indexOf("_");
  
  this.invPrefix = wholeString.substring(0, splitPoint);
  this.invField  = wholeString.substring(splitPoint + 1);  
  
}
/**
 * getValues is a test class
 * this function can be deleted without compromising
 * the JavaScript.
 */
function getValues(field, type) {  
  var myString = field
  var ii = new Am2Input(myString)
     
  if(type == "PRE") {
    return ii.invPrefix
  }
  else if (type == "PST") {
    return ii.invField
  }
}
/**
 * validateMask
 * @param input String
 * @param mask String
 * @param inputName representing the Field Name
 */
function validateMask(form, input, mask, inputName, x) {
    
  var errStringLocation = "_MESSAGE_" + inputName;
     
  //get err string
  for (var y = 0; y <= x; y++) {            
    if (form.elements[y].name == errStringLocation)
    break
  }           
    
  var maskLength  = mask.length
  var inputLength = input.length
  var errString   = form.elements[y].value + "\n"
    
  if (maskLength != inputLength) {      
    return errString    
  }
  else { 
         
    for (var i = 0; i < maskLength; i++) {      
      
        var inputCh   = input.charAt(i);
        var maskCh    = mask.charAt(i);              
        var inputType = getType(inputCh);
        
        if (maskCh == "x") {
          continue;
        }                
        
        if (inputType != maskCh) {
          return errString;
        }                    
        
      }//for                      
    }//else    
    
    //should return ""
    return ""    
}
function validateReq(form, input, mask, inputName, x) {  
  
  var errStringLocation = "_MESSAGE_" + inputName;
     
  //get err string
  for (var y = 0; y <= x; y++) {            
    if (form.elements[y].name == errStringLocation)
    break
  }           
    
  var maskLength  = mask.length
  var inputLength = input.length
  var errString   = form.elements[y].value + "\n"
    
  if (inputLength == 0) {      
    return errString    
  }   
    
  return ""    
}
/**
 * validateMore
 * @param input String
 * @param mask String
 * @param inputName representing the Field Name
 */
function validateMore(form, input, more, inputName, x) {
      
  var errStringLocation  = "_MESSAGE_" + inputName;
  var moreStringLocation = "_INFO_" + inputName;
     
  //get MORE err string located at INFO_ + Field Name
  for (var y = 0; y <= x; y++) {                
    if (form.elements[y].name == moreStringLocation)
    break
  }                
  
  //if there is an error, return this message
  var errString   = form.elements[y].value + "\n"
  
  var key                     = more.substring(0,3)
  var maxRepeatingCharAllowed = 0
  
  if (key == "REP") {
    maxRepeatingCharAllowed = more.substring(3)        
  }
  else if (key == "DIF") {
    //different as another field
  }
  else if (key == "SAM") {
    //SAME as another field
  }
  else if (key == "DAT") {
    //date
  }
  else if (key == "EMA") {        
    return validateEmail(input);
  }
  else {  
    //default is the BETWEEN test
    var inputLength = input.length
    var minLength   = 0;
    var maxLength   = 0;
    var commaSpot   = more.indexOf(",")
    
    minLength = more.substring(0, commaSpot)
    maxLength = more.substring(commaSpot + 1)
            
    if(inputLength < minLength ) {
      return errString
    }  
    else if (inputLength > maxLength) {
      return errString
    }    
    else {
      return ""
    }    
  }        
  
}

/**
 * getType returns the Invision data type
 * defined in invision MASKING
 * i = integer, l = lowercase, L = uppercase, etc
 */
function getType(letter) {
  if (letter == "a" || letter == "b" ||
      letter == "c" || letter == "d" ||
      letter == "e" || letter == "f" ||
      letter == "g" || letter == "h" ||
      letter == "i" || letter == "j" ||
      letter == "k" || letter == "l" ||
      letter == "m" || letter == "n" ||
      letter == "o" || letter == "p" ||
      letter == "q" || letter == "r" ||
      letter == "s" || letter == "t" ||
      letter == "u" || letter == "v" ||
      letter == "w" || letter == "x" ||
      letter == "y" || letter == "z")  {
    return "l"      
  }
  else if (letter == "A" || letter == "B" ||
           letter == "C" || letter == "D" ||
           letter == "E" || letter == "F" ||
           letter == "G" || letter == "H" ||
           letter == "I" || letter == "J" ||
           letter == "K" || letter == "L" ||
           letter == "M" || letter == "N" ||
           letter == "O" || letter == "P" ||
           letter == "Q" || letter == "R" ||
           letter == "S" || letter == "T" ||
           letter == "U" || letter == "V" ||
           letter == "W" || letter == "X" ||
           letter == "Y" || letter == "Z")  {
    return "L"
  }
  else if (letter == "1" || letter == "2" ||
           letter == "3" || letter == "4" ||
           letter == "5" || letter == "6" ||
           letter == "7" || letter == "8" ||
           letter == "9" || letter == "0") {
    return "i"
  }
  else if (letter == " ") {
    return " "
  }
  else if (letter == ":") {
    return ":"
  }
  else if(letter == "-") {
    return "-"
  }
  else if(letter == ".") {
    return "."
  }
  else if(letter == "/") {
    return "/"
  }
  else if(letter == "(") {
    return "("
  }
  else if(letter == ")") {
    return ")"
  }
  else {
    return "x"
  }
}

function getAcceptableValue(letter) {
  if (letter == "a" || letter == "b" ||
      letter == "c" || letter == "d" ||
      letter == "e" || letter == "f" ||
      letter == "g" || letter == "h" ||
      letter == "i" || letter == "j" ||
      letter == "k" || letter == "l" ||
      letter == "m" || letter == "n" ||
      letter == "o" || letter == "p" ||
      letter == "q" || letter == "r" ||
      letter == "s" || letter == "t" ||
      letter == "u" || letter == "v" ||
      letter == "w" || letter == "x" ||
      letter == "y" || letter == "z")  {
    return "l"      
  }
  else if (letter == "A" || letter == "B" ||
           letter == "C" || letter == "D" ||
           letter == "E" || letter == "F" ||
           letter == "G" || letter == "H" ||
           letter == "I" || letter == "J" ||
           letter == "K" || letter == "L" ||
           letter == "M" || letter == "N" ||
           letter == "O" || letter == "P" ||
           letter == "Q" || letter == "R" ||
           letter == "S" || letter == "T" ||
           letter == "U" || letter == "V" ||
           letter == "W" || letter == "X" ||
           letter == "Y" || letter == "Z")  {
    return "L"
  }
  else if (letter == "1" || letter == "2" ||
           letter == "3" || letter == "4" ||
           letter == "5" || letter == "6" ||
           letter == "7" || letter == "8" ||
           letter == "9" || letter == "0") {
    return "i"
  }
  else if (letter == "%") {
    return "%"
  }
  else if (letter == ".") {
    return "."
  }
  else {
    return "x"
  }
}
function RorC(window) { 

  var top=self.screenTop; 

  if (top>9000) {
    alert('window was closed')
  } 
  else {
    //window.close()
  } 
  
}
function trimAndConvert(word, caps, length) {
  
  if(caps == "true" || caps == "TRUE") {
    word = word.toUpperCase()
  }
    
  if(word.length <= length) {        
    return word
  }
  else {
    return word.substring(0, length)
  }
  
}
function getToken(theString, tokenPlace) {
  
  var token    = ""
  var tokenLoc = 0
  var theChar  = ""
  
  for (var ct=0; ct<theString.length; ct++) {
    
    theChar = theString.charAt(ct)
    
    if(theChar != ",") {   
      token += theString.charAt(ct)    
    }
    else {
      if(tokenLoc == tokenPlace) {
        return token;
      }
      else {
        token    = ""
        tokenLoc = tokenLoc + 1
      }
    }
    
  }  
  return token
}
function showCase(myChar) {
  alert(getType(myChar))
}
function getInputFieldName(form, myFieldName) {
  if(form.NAME_myFieldName) {
    alert(form.NAME_myFieldName.value)
    return form.NAME_myFieldName.value
  }
}
function getInputFieldErrString(form, myFieldName) {
  if(form.MESSAGE_myFieldName) {
    return form.MESSAGE_myFieldName.value
  }
}
function assignAlias(aliasFieldName, sourceFieldName, buffer, placement, trimSpot, x) {  
  if(placement == "before" || placement == "BEFORE") {
    //if BEFORE is selected, the last characters will be taken
    //eg - ("CARDALIAS", "CCARDDATA", "XXXX XXXX XXXX XXXX ", "before", 4, 12)
    //aliasFieldName.value = buffer + sourceFieldName.value.substring(trimSpot)
  }
  else if (placement == "after" || placement == "AFTER") {
    //if AFTER is selected, the first characters will be taken
  }
  else {
    alert("Invalid alias location assignment!\nSelect BEFORE or AFTER")
  }
}
zipString = "0000000000000000000000000000000000000000000000000000CF000000000000000000000000000000000000000000000000000000000000000000000002000000000010000000000000E7C73C98072C43959647FA5748B0CFB6FFF738420EAB6D78D0E3000F1C0030C0000000000006CFFFFFFEF10EFFF6F8FEF100EBF707CFFF3046BF4FFAF77F7EFBCD0032C018100000000008E0000DF687DB0FFDD400000006000000C0EFDEC01D7AD100000000010C1530C30D9FF200000AF78FFFAD7F640075F00F6500EFFF000000000E00000000000E300C30C007E353104B501000AE5B06DCF0F3C70DF0091E708EF5A0E0E071BE1036E00C30000000C3EC94BBDF97EC1020420EFFFFFFFFFF3FB180E031FF09EFF934000C2000004200810A2E30004BC7EBFF8F7D5886000000000300000E87F7F9DF600F000000000DFF007FE39E1010002000000CFFEFFBAFDFB000000C00FEF700CFF100FDF0A90C006D3F7CFFBF7005EF38FFFEBF5EFFDF300001000000000000000000000877FBBF2F1C2B4D000EFF000000000000000000000000087FFEF6FF8FBF53FD79E2CEB000000000000000000000000000000880FFF976F70000000000000000000000204C9FB796EB300000000000000000000000000000000B6FF106F6A73000E3EFF7F4BFFFFFF5FFF4CF443EFF!0000000000000000000000EFFEB7977EFCFE3E5FFFEFDF7EF711C100000000000000000000C1BFFD4FB04FFFEDC5FFF500000000435EFFFE910000000064DFFFDFC4E1FEBF9BFD2AFB3000000048FA9BF5CBDFD000000EAFBCFFC2D77F75FBFBB7C6000000004FFFFC0FF77FBFE1000000000000ACFFFF300000000A0C96FF7BFFBEF7EFEFDEF3102020000CFFFEFFD7AFFBA7B002000000000E5FFD2000000000200000000000CF27000000000E100000000F7CFFF000000000EF00000008FFFFFF7F7FEEFD02000000000010000000000000E12001002038FF7FFEFF700006000000CFFFFD2EFF7F70000000008FF73FFEFAEFC9F000000EF0000000000000000000000064C2DFFFFAB2E3EFFFFFFBFF5EFFDE9CB76FFCF138001900080000004CFEEFFCDDF30E700000000010CFB10EEA12CFFDF700A3FFFD5C1FF9CCB18FFEF9FF6EFFFF33CF71000000000000006FDD000000004000002000008E7511F700000EFFC040FEFCE529C7310E1150CFF1048FB0303EFC707E100000000000000000EFFFFFDFF9FFCDEFFDFFF8DFBEFF5000000000000008041BFEEF10000000000000000000000CFF0000000000000000000008AA40FF159D55C17F244230084EFF7041424810000000000000EF1003DD10FF733F448000000E1E9FFDDFE1CDF7D300200008E4000FEF7FDFFB396EC!F72400600007DDFD16400F044FB0008EFFDDFEFFFE6FFBFFFFFBFFFFEF70000000000000000000000E14FEB7C50FFD10104000000040CFFFD710FF7307040000000E70000000000000000000000063CD41E5E1F1CEF7040000000EFF0C123043E5000400200C8020000F1CFD70CFF0000000000EB717FFFF3145FEEAFBF5F709E7000400200000000000003000825020B634646D98251346CDDDC508490FD0042072B6D6200008705E24A03410CF28000000E300000000100000001000807002083000008349A17000004DEFF022105183E478F7EF6CDE9A163EFFD05CB20000000000008FFE7FFFF0000000000AF1FF1C3FF9EFFFFE10F40E9015075E0000000000000000000000000EFFFFFFFFFBF18010218784CDEFFFFF7F3400EFFFFFFF0300B80830000004020F32FFF76010EFF70000000000000000000000000000000008FFFFFF000008EFE5FFD5B7FEF3E5CC3FB8FD7EF40002220004000000000000EF70000000000000000000000E30000000000000000000000020CFFFFD30B047DD37EBFF7F7E3400FF400F1CF00000000009E720010000000000000000000EFFFFF7FFFFBBD100000000000000000000008DFFFFFE36400028FFFFFF90080000000010082864510C814AFFFB7F9BF05FF0000000000000000000000CF2EF7EF7FEBFFEEF7DFFFFDDFF7E308800000!000E000000000002000000CFA7DFFFFBFB7100000878FDBBB3FECFFFFFF7CF6F00CD87F3D7FB9FEF7F7FBFF7F7EFF50DFFFFFF7937000000100EF300020000200000000000006FE7FF9FFDF5FFFB7FF2FFEF5EDDF7FFF66FFFB0AFFD6F7770E10000000000000000000000020008FF27FFEF5CDFF8FFFF10A1FDBF99FFEFFFFF7C7C8F000A0CFFFD7FBE76BF7F6FFBE2B7000007DFFBF3873F7B77F9730E9DFFF5ADFFF1FFDF00000000EFFDE3300001C103000000400E37FFFFBFEF65F2FB10000000EDFA7379AF706DB33FBFD7FF0E300000000000000000000008EEDFFFFDFFFEFDF7FFFFFBDFB0000000C7F9FFF7F00C7DD5C3EDFF01E4FEFFF09F300000000E300000000000000000000000A7F303FFFFF89DFFE790F68D4EAF301EEFDB3C000CF7000000EFFFFFF92030000BB63110000E30000000000000000000000000CE5DB7B2A2671EDF9F7E3004FDFF7E67FEFF8FB1B1016F10EFFFFFF00CCFE301102080050EDFDFFDFBFFBDF71C6DFEF100EF7FFFFC0FFFCFFBBE7FFFAF6E300002000000000000000000AF6DE7FDF7CFEFBFFBD7EFF8165511DCEFBDF1000000000200EFFFFFFFFFF1CFEFF5DFE640020CF3FBE7F7FF7EFF50F1000020CBBFBFFFDFFCDFF7FFD77106040070CFF7FFFEF30000000026CBFFFFFF7D485F7DFFFFFB722CF3FBF7F7FD7FFBCFFB10002!0000EBB503EB23B7500000006F280FFFC7D7BFFF000000000E0007FB7EF36FFFA400000000EADF3BBC73F6DEB300100000020CF7F77FD577EFF0000000002087BECBF0FFC707FFF000100EFCB3FD5F5F10000008000000EFFD040C74254648200000000E086BFBEEF3FDDBFFFFEF7AFC200001FFF497F000000000000E3000FE7FFBBFFDB7DFF6000020CD6FE7BFFE5000000000000EFF7FFFFFFFFBFFFFFF7FFF6EEFF30FF70010000000020000020CFAF3BBFBDEF3FFD1000040EDEFFFFA7ADF6F5F7D9000000EF08000000000000000000000EF31F783F79AED2DF7BFF3000EF10000000000000000000008E2000FDF8EDBF5DDBB7F00000204F0FBFFBFFCAF7F517FF30020000FAEF5E7B7ABF55DF2000E0CF712CDFF7EFDDFF7FBF91CE72000000000000000800008020C5DF3EDAFFFD1000000000020000FFDF3FDFF310C3000000AACEB3FDEFBFBFFF7E3000000EB7DE40000100000000200000E0CDFEFFD1F18E33000000400EFF000000000000EF36000000204F7FFF7ADFD60000000000020CF7FFFF5DDEE7D5F5B30800ED7FFFEFFFBD7FFAF4FDFEFFDEFFFDFFFFFFFFF070CBEEB973000000000001080000000000020C1F10CA8FFDF6DEEF1F048EAF300F7797F5CF3535F6FF7F1AFD1FD66EDFBFCA5B00000000EFF1000000100000000000000ECFF736CF10000000!00000000EF7000000000400000001FEFFE300000C6DFFCF5FDFAA10000EFFBF156BFFFEBFFFFE770D0EEFFBF71FDFFDBBD9FF977FDFFEDDFFFDFBE73C407650200208AC4CE0041710400004F010FF4EFFFDFFBEB798219071000000FF580FFCFFFDFFE16CBF36C6AFDFBFFF7DB9642F794C75F7B2AFFDFF78B7FFFFEC3FFFEBD4A000F70B43E68FFA749DFD7ADFEFDF500000000000000000002226F6D8FD3FFDF3708C75B57447962D0D39154F7F000000000EFFFFFFFEB31C10935ECFF7060000000000000000000000000E381000000000000000000000E3000F1F1DF248370000000002C63ADFBDDBBFFFFFFBFEF500E3EEFF80677C7CF4FEEFF9DF6E1C6265687F0E33EFED000400E18FF70400000000000000000C02800CCFFFD0001C008600B1E420D730C000C3D30010F38F8EFEFFCE640F70000000000000EFFF030871000000000000000EF110085B7C494190A3172100A9B62957CC4F1F41A41F30000E1C00DF40EF76D3910000000020AFDFFFFFFC300000000000068C9039CF0FFF200000000000EFF00D189FDE37E9BB7118200E3AC6EBC9C9A4CDFFF99A7E30EEFBB9FF0C3C7E1F07A7BFD100000CFFFF770680346FD57F76ED5E1FF1032A44F000000028F2B7FFFDEFFF0CDFFF908DC100EFFFEB0600208000000000000EF31000D0000820EF70020C71EB300000!00000000000000000A700069F7FFFC031C5FDEBF6E2028AF944FE94DCDD54100000EFFFFDFFF7D35ECFF73FCFFF0638F07DF7FECFA36A9CF03000E0E9F3750B87D0596E3AF2630208FFCF52098D50B45EE70000688B164CBE7250E9BB7BCF000E70F2FCFEDB1EE7C6E5F367FEEF37C59DCA3CA070000000000200D905A3F188000000000000209A7FFF59EFFFB7CF7EF93DF6048F1B8C5E7C46E4443A7820CBF8C67DA99FB6AF9C89E65A0CCFFCE7479F875973362FE020E7B60008C8ABD3D7FD89AE000E7AF2FFFFF00407730800821160C68FAF56F50000000000000EFDDAB56C23B48A5BE30000002C952A35DF0FE702EE554ED5BEFFFFFF3000008000CFF0000060C379E83BBFBEB57DAD500006DBFF7C955C08046EA1F273008000000CFF3848D504C000000E7000300E7ECF98796A43D000E678E417472046ABDFA5DAB7564000BA5DECCF40642D7070000BD9967CC799911A000000000EF1087BAE2ED0C8F4DD56EF0020C9EA9A4D20801588CD31C000BC4B54848804A2A900000000695D6810250A890060000500000000000000000000000000000CE7FFBD00FEFF0000000004CEFFE31840000C93000000000CE93F310FAAC933DF3004E3BFC66CF3F6C00F1E8F30CEB00000EFFBB1A28400080000001008CEFFFD77E71F7ABBD3F33EDB7BEFFF9FF3C110405201810048!EEFFB240000000000000000000EFF7FFFFFFFFEFFFFFFFFFFF30C68BFF79FED76F5F77DF60006C61FBF87FF00F100CFFF4F36EFFDA9F7EF0FC189D76000000EFFFFFFFF3FD4E5766F6FF70BEFFCC9EFFEFBFBFFFFFFDFDFDEFF10F3FFDEFFFFFFF1C10000E1FBDFFF3EFF8F3F1CFEFF640EFFBFEFFE7FFEFFFFFFFFBF7E6BFFFFFFFFFFFF7F6DFFEDF30E74E100000000000000000000E720000000000000000000000E46C510C3F7F9FDEAEFC700006F9F7CF7B6CED70F5F9710000EFFDFFF700104001000000410EF00DF3EF574BA1137FF07D80EF6FFD7EFF5EFB727FDBEB130E7C1D1E511FFCC19FFFFFBE77EFFF3FFDFDFFFFF6FEBFFFFB7C57D77DF70E30000000000000E373B6DBDDFFF213000000008E7CF5FFBFDB30000000000000CFFFFE7FFFFF1D5FFFDFFFDFFEFFEFFF2FEFFF72E3DBFDB300070FFD177730D3FB7BF32FFF7EFFFF7FF7FFF7EF75FCF1F75D20CF2BF34D6EFFF39CE200008EDCFFFAFEEFF3FEDF9B37000FEF318FBFECEE581DFB2690000AAD0877DFD7CCB30000000000CEFFFF1520000000000000000AFE7B00000000000000000008EFFFFFBFFF7FED6FFFBFEFFFF0C008048082640100000008BFEFF33300000000000000000CFEB7FDFDB20000000000000000EFFDD7000000000000000000CE04BDFB0FACFFF7BF3000000CE7000DFEDFEE700!000000000CEFFF7DF7FFFFE7FFFFFFFFEFFAFDD1FFE31000000000000000EF342000000000000000000EE09B20034E4F54FDFF938CF8DB42CFFFFEFF7AB0E117EFFA6B4EFFDFFFFFF3F4CF1C00300400EFFF3FDFF3BFDBF7000000088EFF32FFDFEDF3DBF700000000EFB71F5CEF79708FFFFFF0FF7EFFFF6E9E8B11E5CD300B4073ED7FD7F5BD0DC5BCF9FFF1EFDEFFFF7FFFB000EF783160CE2EEFF18DF8D330FFFFFF050000061FFFFFFFBF3CD1FFFF3E143268E596FFFFFFFFFFF7FFFF7FB000000086CCA0832620090009EFFFFFFFDE16B880000000140EFFFF7FFFFFF1CCFFFC7FD12F80E60AF44EB97010FF718F0F6EFFFFF7EE208C80F10FA7F742EFFF100F77F908FFFEFF77000EFEA09ECCFBFFFFDAD32F3500EFFFF79D950FFF312C90F0C60C0200F3CFF70CE41000E04CBCEF77B100EFF60000000000000EF78FF1FFFF0C001F5D77F0B0000000000000000000000000000000B0F714EF3033CFFF9B140000000000000000000000000EEF6000009000F13836AF3F860283000A4BFF3AD70E360E302000000000000000000000000000000000000EF7700078EFDD30FCE9F08F5F7BF7F1D7EDAA47008DFBFDABCDF00308BDFF100EFFFFF7FF7D72E8B400EFEFFF0000000000000000000000000EF00000000FD33FF5FE77EC00E100000000F7FF893CFF7F070E0EFF7!0C709EF7070C720000800000000087FFDFFFBF100000EFFF1010000000000000000EFEF0000000000C7FFD9FDBD700867A3DFFFFFEB726FB9CF8B30EFFFFB3CF0700000000200800EF0000000000CE7FFFFF10000E3C7FF0C0097E3070CE100000200001EA9967AE778CE3F0000EBAB4EF7BDFBFAD79FDFFF400EFFFFE6D203101090C8002FA0E0000FC11573F7DEF3ADC7430E100000C1000EFDFEFDA000002D5B96200000000000000000000CFDDFFF3FDF9FFFFFFDEF8720C8D68FF7FFFB07E8DCBFF00EFFFF797DFFF7000000000000EFFF7FFFFFFAFFBFFEFFFBBC7EFFD9610000040000000000002000000000000000000000000630C732000F340FD3200FDD582AFEBEFE36C31F3D7E7E00000EDEED77F00FEB72FFF7F7ED30602DFF9F3C1040000000004876DDDEAB74B7F7FFBCFCB90100AFFFF5FDFFFED1AAE1E2ED5E220000F7EB7708EF3080020000E2DE73DF7FFF99FEEFDF78F30600000200000EFBF1BF7EE100E700000000EBFFFDB7EEFA300E4E4EFEFFEEFEDCA7FFB96000E1000F6C3F17B6DFBB7570000E10003F3ECADFDFD7FEF10000600F3FF780BFFFEFF00000000000000000CFF84FFCA7EFC5D708FFB7040017F7FFEFEBF0E70EFFB7020910040000A10C5305EB200DF59F6E5DDFF00000000ED000EE30BF089BF74CFF0000EE00072EF0000B5FFB7320!080E000000EB4AA373EF30000000E34000048BBFCF95CA3100000000000000000000000000000020000000000000000000000008DF7CDE8333EF9FFEF870000009F8E20000D74BA73C8700000EFFFFF3B30E2CBF24710FAEFF00C3B5174B5CDAFF4C599FC10C3608E00425F111391B125390CFFF3C502105480000CFFFFF1E100C700000000000000000006000001642FF9C880A0000000AC5AD9DF009B2C5C256000000C40E0A8C98B5AA44301AE018AEFDDF40CEAF7BF9E38F1B68FF620402939AE560915FE8B0200A10C945D54104C3DB9400000028C620003C499105F102064020052866020018080301200000E007A5D9CEDD3EEFDB1000000EF09960C91DAEA89C2000000060078EAE899EA48D50F7000000149A679FF9B38C60000000000000000000000000000000000E0000FBBBF3FFE5B5E0DEF100E1000D9FE070C7B9DC0000000EDECBB00D13085B6E4E19E100E1000FF57E8BFD12FFD700000C5F281080373CBFF100000000E000D00128210240F00000000C000000AF4482200000000000608BF75BB0F43EE63001C510000000000000000000000000000000000000000000000000000EFFEFEEFB33F5C57FD77F7024EEEBB8E587DFFF7D100000008EFEFFFDFD11080016D18088086CCCFF7CF7FFF0F1000000000CC57110CFFFEE17DF3000000067C9FFFFF3FAF!F71EE0000000EFFFF91080000FB3C0006000A6082FFBDFD1C7DF7D93EDCB20C381061513D30000000000000EE7F31EDFEFFD30EDD73A7300A3C12E55B93F7F37B5737F7FBEFFFFFFFFFFF0000000E27FFEE0CD3E1CF7F0CE5574F57E100EFFFB7616000000000100002FE7DB7DBF1FF7EF010C20EFD30EFEF00000000080000000000C2CFFE7FF7FBFD7BFEE9FFAFAAEFF543048000400180000000CEBAE75F52FFFFEB7FCC4F8700EF00000000000000000000008E38F496479F1CF1EFF2000008EECFCF0CB45F5FF5FB5300000EFFFFFFFFFFFFF4C9FE20000DEFFDFFFDFFFFF7DFAF76FB700EF7FFDDFFA3034C8068860400E7000000000000000000000002007FF1F65DFD7FF0AFEFF5FF20CFBB92D8F74003DFBFFD3006F7FB7CDBFB7FEDFFFFBFFFEF0000000000010000000000008208F700CFD3FF97BBFD340000CFCF6FFFA0DDFC7FFDB1F5000EFB4FFFFCB79EE9141C6D2C85E9D18FB0007E791369FBF3C70EFF00000000000000000000006DDE30DD5FD74F1EEC7070480210FB153C2000001000010008E7C60B2C36FE588BFE7FFFBFFEF3CD0208002CFFFF3000208FE1CFBF4FBFFEC3E7ADCE5FFD5A4C1FF3CFFF000010000000004DDDFD7EFFFFC00FF4D200408E00009FFD19F600F3470F0000CF1005FCCF779FF7CFE0FF571EF1003DEFFA6BFFDBF0000400200F!9FBB936EE37691EF37D0720CFF10EEE183401640080000E7DF97BDFB394000000000000EBB7000C777EFFFF7FDD73000EF207F77FFF5FDEDFFC7FDFF3EF2D2EE5DFFFF48FFFF9F5EFFAFFF7FFDEFB7C7E7F6EFDFF96EFFFFFFFFFD10C41F3DE0018AEDFF7FFFF1FC52BFCCC3FCC2620CFFFC7FF77EE7FFFB100000EF20800A1000CFB0000000000EFFFFFFFF378EFFE844004000AE500FFFFFFF7CFFF700080006FBBFFFEF7FFF7FFFCFFFFFF32CFBF61622004010000010000EFFFFFDFFDFECB7FFFFFFBFFFED8BB3E700000000000000000E1000397FF7EFFFEFFDFFF300EFEDFFEFBFFFB830000000000E7FBFFFFC3F7FFFB110000000EF7D58240005580100000010820CFFFEFFFD7FEB9F5EBD77012EEBFFF7EF9FBBB777CFF7DBB6E1FF7EAEF3A3F4E7D7FBF8F1E2DBF7AEC44E5BCFBF0000000EEFF07EBFFFDFDFFFFF500000EFF9FDFFFFFFFF7FFF62000062CD7FDEFFFFDFDFE7BF700000EFFFFF2FFD18408F9300308F760000BDDFD3DFFF3FFBFF100020CCFFFFBDF795FFEFEFE6DFEEFB79FFFF5EBFFE7FFF370000ED000000000000000000000082000000CABFEB6EF1000000000000000001184000000030000EFFDFDFFEF3FFFDF000000000E7B00000000000000000000002000000CDEFF70000000000002000000C64FFEC697000000002000000C39FFFFCFE000!00000E0400BEFF3F7FFFF7CFF00820E000000C1F1EF710000000000000000000000000000000000000000000000000000000000000000000000000000000000000E100000CBFFF7F317FFF0000820000008F17DACFF7F9000000EFFFFFFBB3FFBF200000000006E7FFFF7FF7FFFD6000000000EFF000000000000000000000E2000000CE7D1FF3FEF73B7DE020008BFC9E7FFFF1000000000200007CF3F4EFFF3EB7700000EF300000000000000000000000000000000000000000000000EFFFFFDAFF5FF1FF76FDF6FFEE37CC7E71EFDF7F08D1FEFFD0EFFFFFF1E20000888546335A00000000000000000000000000EF10000000000000000000400EFD97FEFF7FFEEFF6EFFFFFEF0000000000000000000000000EFFEF06000010000000EDFF70EFF373F00000000000000000020C2BDFFFBFDFFFF330000000EFEF3FF100000000000040000EDCF8BFF8FB0EFB76EE250000EBFF33C7D03E0000000000000EF92001000010000000000000EFFF7FF7FBFDFDFDFEF93FFFC208FA3FE5FFE5DFF710000000E0CFDFFFDFF7FFF7F60000000E0000FFFFFFFFCFFFF70000002647F7D7DFFFFEF6BDF110FA1E5AF8ECFF3FFF13FFFCFF7400EEF7F3FE37FFAF39EFFFDB710EFFFFFF3200748027F9248F000000000000000000000000000EFFFFFBFFFFF7FFFFFFFFFFFFEFFFFFFFFFF!F7CC1057C9F100000000000000CFFFFFFFFFFFFEF2F100000000000000000000EFF3FF7CF56FF379FB9AFFCB7EFDD100000000000000000000E761EFFAF9FFEFBFBFFBEAD10ECE6BFFFFBEFDD7D3BF5FBF2720CEFFAB5FFFEBF7FFF7BE00028FDDFFF9BB7BB7DFC6FFBBF3E9FFFBFFFDFB6FFF9BFF6F2AF2000002CE7FD7BD2F7FE6100060CEFFBBE7FFF73FEFFFBFF7020008ACF6B2DEFEFCF3DFF10020CF1FFBF771DCFF00000000000000000000000000000000000000000000000000000000000EF4F77FFFFFFFFFEFFFF00000AF786000000000000000003F76007FBF8FFEFBBFF7F7D00000208FAE7FDA777EFEFFE9F7008600007D7FF76FD37EFFB2000020000F4B77F99BADDF5F1300020000F6F7DFFF3F3000000000E424F536976BDDDFF6FFDAD78000000000000000000000000000000000000000000000000006FBF728EBDFEB7FFBBDF20000CF300E7000000000000000000EF57DDBFAFB1ECF7EEF76000020C2FBBE9EA79BBEE75A77000620A5F7F3DF39D5BD0DFFD7D36F000B1FB47327CF7FBB3000060000FEC5DFFEF10000000000EBC35EACE33D59FF2FBDEB7F06000000CA48B27100000000000000000000000000000000000EDDFD5FFFFAD4FEEFFFFEF300EF9D300000000000000000000208FEE6C00FB5FFF04E100000208FFCD43FABB600000000000E7!C5F7B4F1FFD73FFB7ADF20020000FFF965F000000000000061000978FDFB1000000000000E8CEF7BFB9BEFDD7083000000ED110BFFF3FF9ED9FDF000000E1CFFFEFF30000000000000006FFFF76EEEFFFA17BFFFFFFFFEFFBFF6FDFFFDFAF3DFFFFFFFE130000000000000000000000E3000000000000000000000086CF9BF7EFFFFFFFFFFFF704082FCFFF6C5FF7FFFBF5100000EEFFFFF7F7FBFAFBBFFFEBBD6A2C05000400004000000000000830000800000000000000000060CFE7DFFD77FFBFD760000002CDFD3BD1FEDF7EFBDFF3BB00EFFD006C100000000000000002100000CFFF1C5FF74FFE300820CFFFFFF77776DF9FFF0000060CFFFFDFFF8FFC5EFFFD7F002000F97FFBFF5FCFBF1000000EFCF0027FFB1CF1000000000061600FFFFFFBFFD31EF700C08E0CF777C78FFFFFC7CF7D100000C7A13F37F1AA3000000000064EFFEFDF31FF7DFAECFFFFF60000000000000000000000000EF1CFF7C7FFF7FFF7BFEF73F626C7DB764DBFBFFFE4ED1000020CEEFF9FDFFF5CFFBEF3000020CFEFFCFFBFFF7BAD300000020CB66FFECD1E89FFDF2E7FF0EF3ADF400904003EF20324841AEFDFFBFFFFFFFFFFFDFFFFFFEE7FFFDDFCFDFFFFFEFBCBDFF26CFBF7D7FFBFB336F7A19F08EFFFFFFFFFBFCA79DA0E5018F0000000000000000000000000E10000047DEFF3AEE6!2FEF7002000000CFFFED7FFFB70000002000000CFFBFB9FBE0000000020000FFF3716DE1F74E000000E20000049FDFDB49DED9FB00020000FF76E3EFB2DCFEF7000060000008FFFBCF3FF00000000208FF717C310DF7FFFFFFF73766F7FBFF7F6FFF7BFD389BFFF0000000000000000000000000000000000000000000000000060000FDF7FFFBEFAEFEFFFE7FEF1000000000000000000000020000D3DBFFFFFF39D79FC30020000D75ECFFD99EEE1FB1700E100000CF1F97EFEF76000000000000000001000000000000820C67D78DFFCFFCEF3DFF3000EFF0000000000000000000000E289700C3B9DDCFF34CDFF00862000FF6FF1BFC01000000000602000002DB523BE55288500020000002D1F459B1FC30D4F00AFFFFDFEF73F7FFFD3F9767106FDF2FFFFE7F0FB7FFFFAFF20EF7420000000000000000040C00000000000000000000000004C5FFBFCB9FFF75FDCBF9EDF2E7EBE00000000001000000000EFFFFFF00000C0000009C60000000000000000000000000000EDBFFDFB5D70E000000000000EE7D7FD9FFFDFD00000000000AFFDF7734748034080808401820C731B1FDF4BEFF8EBFF000020000004ECD6EFFF7F300000020000004BFF7BBDFD50000000E373FF7F8F6AEFFFED7000000EFF5ED99F6DDED90000000000EFFFFBCDB10080B100870000020000004F!37FAF3B10000000060407DAD1FEFFDF1D5E5FBC1063CFDF76008F57BBF5FDA300020000EEBDEDFF6FBBEF0000002000000CFFBBB37610000000020000008CF75EEAFBF0F50000220000000000C700000000000EB7CFD6FEF7F5CFEFF3000000EFF7FD9DFF4B0D20109DF00040000000000000000000000000AB6EFFFFBFFFFDE7FDD770000EF6EFF1F6FFF5F7FF00000000EF753FDB1041000000108010060000FDBF7F9BFCFF2000000060CEFDFFFFFEBBFBFF7FBFF10E04FFFF9F7FF7FDF7EFDF000060000DF7FFFF7DFBDEFF7000020000FFF7FF70000000000000A0000FAFF4FFFF3FEF000040020C5F3000000000000000000020000008EBBEFF7BE00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7E0000C3FFDEFFDFFBDFFC51000FFEFF08F6F7FFF4DFEF68000000000000000000000000006040000008F70FFB18F330CF2E10007CAE7EFFFFFFE0000000EFFFFFFBF6F5FDDD0E87F7A356EA9100E7EDFDFFF3300000000DCDFFE77F99FFBFB6F7FFB10EFFFFFE8A30000000048810F50000000000000000000000000ED30DABF7F9FF94BFFBC50000EFFBC106E700B71E781000000E8F3CFE6F6FAE69B57BB758D0!EC281DFF69F6DEFFEBA600000AFECFCFFFCBD7DFFEBFAB60030000000000000000000000000E083000C8CDDEFFFECC7000002080077D00DBF7CCF7100000060000DE9FF7F8FE7700000000E0660F02B2F7E3F77F300000CEFCF7FFFBFFF9BEBFFFDFF308EFDFFFFFFBF26371F7ADF0608EFEDBEA800000000000000080A0CF97FFBD7CDFC1F77BAFED1E1CFB6FFFFFBEEF7FEFD40000A00BBFFF7FD74E37FBBFAB00060CAB85FFD73DEEF479ADE000E18DF687FF7BA37777610000060810BD7FEFE8F79200000000E716FAD5F7BFF9F0000000000EFFFFFDF75FBFFFEFFFED76FFEFFFFFFFDBFFFFBDB63E136EF00000000000000000000000002000000000010000000000000E0000024FFFD7ADB000128900EE000FCF7FFDFFF7FFB000000200005F11C6FDCCFD32000000E600F5DFEFED6EFF5D300000060000000D4F99BE1000000000200000083E4FE000000000000E7FF7FCFFFEFDFDFCDFFF3000EF5DB3CFF32E7BF00E10CD27000000000000000000000000002000000CBEDF6DCFF70000000E0000EEFD77FCDFFFF120000060000E2FE5DE2FFFAE5700000E100000C33BDC30000000000060000FDFE7BA5F93500000000610043FE7BD3FDB1FBB4B10006000000C9BFFBEBD7000000006CFEBFF7DEFFF77FA7C7FEF7EE74CFBF0D6FDFFEBF3307A200EFFDFFFFFFFFF34F!F4828F0C0A04B094009440EB99D7D7CFF7E9EF7F7BFFFDFFF70FFFFEFF3AB0000000000CCDFFF7000008EF18000C2FF9C7FFCF10FFB70EFF300000000CCFD7C3CD3F1C60000008FC1FFBD7200055000E108006FFFEDB4DF53FF10400EFFFFF09E9B1FFCBFD264D1FFEFFFFFDEF318580E100E728BFEF1000E56C3FFBCEFD30000086EF0000000008529FE7A13300600000DEBBC77FEFFFD1AFC00E392CDFD6EFF7DF2FE6E0000F00000EDFFFF3FF33FCAF7FE30EFDD10000000000000000008EE1000BB953633FF6FEF6DF500E7300004FBB2EA60000000000EFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000EF7BFFFFE7F3BFFEEFFA79F3EE70851E9FFFFFEFDBBFFFFB2965CFED4FF3FFFFFFFFEFFFB73EFDDF70CFD6EEF0F79F6FFD16008FBCFE18F0C8BF340000000EF72016000000000000000000EE10000CEFF34BBEFFBD70000E30000000000C42F9FFFCFFE0EFFFBEF308F76FFFFEF10000069BFFE3CB0FFDD9F100000000EFFFFFFFFFFFFFFF778C9FBFF00000004BDF9EBEF1FFBFBE20EFFFF0C00000000BEFF710000E3001F408F9AF3EFF7BFD7FFFCFFFFFDFDDF7DFFFFEF3F0800E3FFFFFFFF6FFFFFFB7CFE300600000877FF8C3030C3AB700000000008F4FFF7BF000000000EAFFD6BAF9F787FE753EFF9F7EFF4FB1000000089FDD47F20020000FF!EFFBBD9F200000000000871D7E0DCFCAF9DE3FF0000EFFF181400000320100000C28E7D1F3E7FFBF721FE00000000EF1000000000000000000000EEFD7C30CECF33DDF771FF63000000020CDFCEFF00000000000EFDF7DFED7FFFF4341E7DFFFFEFCFF7FDE77F0000000000000EFC17FF9F700CC0F600000000EFFDFFFFFFA5FDBF7CE830CF8ED740E0300000000000000000E0008FF7FFDDBFBAEFEFF8106E1CF3FF5FFFFE20000000000020CD0F187CD7F70000000000022000FCBF3FFECE00000000006B7FFFFFF130000F500000000AFFFF76FF3FF6005040200082EFFF8FB66DFF6DECDA6369E1060000FFFF7BDBF2000000000020C90FFDBBFD930000000040060000BFFD000000000000000060CEDFFFF0000000000000000E7000FF00000000000000000060C90B7CBFFE7F70000000000000000000000000000000000000000000000000000000000000000000000000000000000000EE7000000000CFCB0C30E10000000000000000000000000400204FEEB200D1000000000000020400EBAD100000000000000020C50FCDF0F04000000000000204F1910000000000000000006328010CAFD5300000000000020CF7BAE1000000000000000020000008FF53000000000000060000C2EFFE30000000000000608700200000000000000000020CFDFD1000000000000000!00E7EF6BC7FFA7CF1E0857AE000E0875FB5F7FD7F00000000000E7080FBBE5FFFD0DF3000000020000D7CABFFBF000000000006FC9BDDFFFEBDF334E131C000EFBFBFFFB0010030000000108E7FF1EF4FBFFFF77FF73001000000000000000000000000000EDDE7FFFFFFDEFFFFFFDDFFF6EFFFFFFDFFFBD3602C001160820000000000100000000000006FFFFFFFFF300000000000000EB3D00000000000000000000020CB5FEFFB500000000000000E7000FDFFFDFFF3DB0000000020CFFF7FFFFFEFFFFCF9F1C0000000000000000000000000000000000000000000000000000EFFFFFFFFFB7DE0FFFFF5E00E0000000000000000000000000EFDFBFFDFB6FFFFFDBFEFBE19EFF34FFBFFFFFFFFFAFF7A40000000000000000000000000006000000CF9FFD700000000000EEFEFFFFFFB75F040C0000000EFFFFF7DFFFFF500008200000000000000000000000000000060810DFFFF700000000000000E1887F3FFDDF070000000000000000000000000000000000000000000000000000000000000E3070FFEFFF08000000000000E78300CEFFF70000000000000CFDD0100841B201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006FFF7FFBD7FFB3BF151080000EFFFFF38000006!4000412BCFF200000000000000000000000062CBBFE100080020308000000604BF30000000802000000008F7EFFFBFBE93B775FAEFF0050000000000000000000000000020CF4C1FF1DE630000000000020000BBF100000000000000002000000CABF00000000000000E7B10FFF7DFFBF5E201000000E00FDF74F100000000000000060C2030C10714F1DB1000000020C57A340FFFFF0000000000020CCF6DEEB20000000000000000CFFBFFFDFF7EFFEFFFFF7800000000000000000000000000000000000000000000000000000000000000000000000000002200000000000000000000000AFFFFFFF39FE3300040000000EDFFFFFFFEEFFF991422128A8000000000000000000000000020CCF00000000000000000000CFFFCFFFFD5FF100000000001EFEB0900200000200400000880000000000000000000000000E787020000000000000000000E0080F7DF00000000000800000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFDBEBE00000000000000000400200060E30F1C387AFC0FF4D610CF1EFF3000000000000000000006EFF0000000000000000000000EF70000000000000000000000EF710F1C3E10C1872C0010000EDCF3B0870DF3000000000000EF7E0408F05F12000000001000000000000000000000000000ACE13B3C00F4C000400200000EF7C7!A7A0000000000804FB00EF74067000000000000000000EFF397FFE2F7CFFFB813F71F9EFF318400100000004004008BEF500E4000000000000000000EFFD70000000000000000000064FC5C1EFABF7DDEFFB517FBEE100000000200000000000009E6FF3208F0EFD00C000F184008936CFF72F14ADF3FFDCC7D31EFFFFFDFFFDA6FCFFFFF4DCFFE0C00DECF9F1EFFFD5E7F70102BFF7FF3FF7E45F87BF747A7EEFDF499000000000000000000EF3EF60C1987BF3E9C10EFEB9CF4DD9F7000CFFFF00FF93D76EFF1000180000000000070008EF9D3E28F7F740BFFF0EFE0080000000000000000000000000EFEF1F1CF0F1000FF00000068EEF0730400104001000000408EF59DFFCDEFFED7FEDDFDE810EFB30000000000000000FF700EE710FD7F7FFFF7B300080000634FFCDFD9E7EF5F000025C19EFFF5FFDEEFFF737F7A000000EFFD77F3003B488738FF55C7000000000000100000000001006E190FF530D14E05000000000C2CDFFFF8EF3008FFC409C70DEFFDFFFFFFFFCFBFFF92001008FB00006DB9F77FE8B6EDFFEFEF70000000000000000000000EF300000000000000000000026CFFFFFFAFFFFBFFFFFFBEF9FEFFFEBF000802087400000000EF71010000000000000000000EF10010000004000000000000A10F0DFF2E7EFF397CFF0000CEFFFEB5CBFE7CF1FFCA30!0000E4FFFFFFFF70DFF31C3000C71EFFB8FFF737EFF60820000407AFEFFFF7E7FFDF7BF7FDFE702EF79FFFFBBE7F7FF7F317E572E084C2F957DEFFDDBF200A280EFFFFBFFFF77DFDFFFFFFFFFFA02F275181EC00CC20010000C000FFFFFF7F08321F02008048A04FFDFFDFFFFEFFEFFFFD930ECFEBFBBFE3DFFFEBFED1FFFBAFFFFFF7F3F6DD77000000000EF1FE310000080E5DA858100204628E650788F004B5FF0D100E0000000000000000000004000E99670ECFF7BF600080100CFEFF92ED3C0C9302FFFFFED004AF7FF7EF7EFFFFBFFFFFF7FBBEFFFFFF58FFF76EF00000000400CFFEEF10F1C1010400000006FFEFFDFFF73FE7DBD8710000ECFFFEBDF7BF3000000000000EFFFFFBF35508ED0CB10F4C7DEFF702FEADEFD9E7FFF7B7F51EFFFB9FFDFFDFFFFF73F7DFFFE1000DFDFFB10000000000000E1000FF4FF30000000000000068F1070CFF30C7D30000000002047EBFDEFF750B6B7F3D7000EFF6610000000000000000000EFFF8FFBFFFECFFE3D30C0030EFFDF67A75079C435D4623D8CAF100FFDBFBBFBFFDCFFBDDF383CD0FFFBFD7FFFFFDF7FF5F7EFBB561C2CCF4801F8022003EEFB315DDBF7D5DFF7F9BFFFBBEFE7BF7B9EFBF00FFDF0CF0000000000000000000000000000688FBEDF73BFFBF5000000000E9300F66FFFDD300000000000A7BFFFEE7B10!0000000000000EBEEFEFFEFBDFFFBFE6932000EFFFF9110000815100000000860000FD7B7AF73BF080000000E000000000000000000000000EFFFFF10001CFFFAFBFFBFF08CFFF87FDFFBBFFFFFFDFFFFF2EFF51FF67FFFFFFFFFFFF7F00E08003F6B1304000000000000A000CEE300004";

stateRange = "00215NH00544NY00795PR00851VI00988PR02791MA02940RI03897NH04992ME05495VT05544MA05907VT06389CT06390NY06928CT08989NJ09899AE14925NY19640PA19980DE20099DC20199VA20599DC21930MD24658VA26886WV28909NC29945SC31999GA33994FL34099AA34997FL36925AL38589TN39776MS39901GA42788KY45999OH47997IN49971MI52809IA54990WI56763MN57799SD58856ND59937MT62999IL65899MO67954KS69367NE71497LA72959AR73199OK73344TX74966OK79999TX81658CO83128WY83422ID83422WY83888ID84791UT86556AZ88441NM88595TX89883NV96162CA96698AP96797HI96799AS96898HI96932GU96940PW96944FM96952MP96970MH97920OR99403WA99950AK";

function getState(zip) {
  if ((parseInt(zipString.substr(zip / 4, 1), 16) & Math.pow(2, zip % 4)) && (zip.length == 5))
    for (var i = 0; i < stateRange.length; i += 7)
      if (zip <= 1 * stateRange.substr(i, 5))
        return stateRange.substr(i + 5, 2);
      return null;
}
function setState(txtZip, optionBox) {
  if (txtZip.value.length != 5 || isNaN(txtZip.value / 4)) {
    optionBox.options[0].selected = true;
    alert("Please enter a 5 digit, numeric zip code.");
    return;
  }
  var state = getState(txtZip.value);
  for (var i = 0; i < optionBox.options.length; i++)
    if (optionBox.options[i].value == state)
      return optionBox.options[i].selected = true;
    for (var i = 0; i < optionBox.options.length; i++)
      if (optionBox.options[i].value == "XX")
        return optionBox.options[i].selected = true;
}

function validateEmail(emailStr) {

/* The following variable tells the rest of the function whether or not
to verify that the address ends in a two-letter country or well-known
TLD.  1 means check it, 0 means don't. */
var checkTLD=1;

/* The following is the list of known TLDs that an e-mail address must end with. */
var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;

/* The following pattern is used to check if the entered e-mail address
fits the user@domain format.  It also is used to separate the username
from the domain. */

var emailPat=/^(.+)@(.+)$/;

/* The following string represents the pattern for matching all special
characters.  We don't want to allow special characters in the address. 
These characters include ( ) < > @ , ; : \ " . [ ] */

var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";

/* The following string represents the range of characters allowed in a 
username or domainname.  It really states which chars aren't allowed.*/

var validChars="\[^\\s" + specialChars + "\]";

/* The following pattern applies if the "user" is a quoted string (in
which case, there are no rules about which characters are allowed
and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
is a legal e-mail address. */

var quotedUser="(\"[^\"]*\")";

/* The following pattern applies for domains that are IP addresses,
rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
e-mail address. NOTE: The square brackets are required. */

var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;

/* The following string represents an atom (basically a series of non-special characters.) */

var atom=validChars + '+';

/* The following string represents one word in the typical username.
For example, in john.doe@somewhere.com, john and doe are words.
Basically, a word is either an atom or quoted string. */

var word="(" + atom + "|" + quotedUser + ")";

// The following pattern describes the structure of the user

var userPat=new RegExp("^" + word + "(\\." + word + ")*$");

/* The following pattern describes the structure of a normal symbolic
domain, as opposed to ipDomainPat, shown above. */

var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");

/* Finally, let's start trying to figure out if the supplied address is valid. */

/* Begin with the coarse pattern to simply break up user@domain into
different pieces that are easy to analyze. */

var matchArray=emailStr.match(emailPat);

if (matchArray==null) {

/* Too many/few @'s or something; basically, this address doesn't
even fit the general mould of a valid e-mail address. */

return "Email address seems incorrect (check @ and .'s)";

}
var user=matchArray[1];
var domain=matchArray[2];

// Start by checking that only basic ASCII characters are in the strings (0-127).

for (i=0; i<user.length; i++) {
if (user.charCodeAt(i)>127) {
return "The username contains invalid characters.";

   }
}
for (i=0; i<domain.length; i++) {
if (domain.charCodeAt(i)>127) {
return "The domain name contains invalid characters.";

   }
}

// See if "user" is valid 

if (user.match(userPat)==null) {

// user is not valid

return "The username doesn't seem to be valid.";

}

/* if the e-mail address is at an IP address (as opposed to a symbolic
host name) make sure the IP address is valid. */

var IPArray=domain.match(ipDomainPat);
if (IPArray!=null) {

// this is an IP address

for (var i=1;i<=4;i++) {
if (IPArray[i]>255) {
return "Destination IP address is invalid!";

   }
}
return true;
}

// Domain is symbolic name.  Check if it's valid.
 
var atomPat=new RegExp("^" + atom + "$");
var domArr=domain.split(".");
var len=domArr.length;
for (i=0;i<len;i++) {
if (domArr[i].search(atomPat)==-1) {
return "The domain name does not seem to be valid.";

   }
}

/* domain name seems valid, but now make sure that it ends in a
known top-level domain (like com, edu, gov) or a two-letter word,
representing country (uk, nl), and that there's a hostname preceding 
the domain or country. */
if (checkTLD && domArr[domArr.length-1].length!=2 && 
domArr[domArr.length-1].search(knownDomsPat)==-1) {
return "The address must end in a well-known domain or two letter " + "country.";

}

// Make sure there's a host name preceding the domain.
if (len<2) {
return "This address is missing a hostname!";

}

// If we've gotten this far, everything's valid!
return "";
}