/**
  * @param string $encoded_str
  * @return ks
  */
 public static function fromSecureString($encoded_str)
 {
     if (empty($encoded_str)) {
         return null;
     }
     $str = base64_decode($encoded_str, true);
     // encode this string
     $ks = new ks();
     $real_str = $str;
     @(list($hash, $real_str) = @explode("|", $str, 2));
     //		echo "[$str]<br>[$hash]<br>[$real_str]<br>[" . self::hash ( $real_str ) . "]<br>";
     $ks->original_str = $encoded_str;
     $parts = explode(self::SEPARATOR, $real_str);
     list($ks->partner_id, $ks->partner_pattern, $ks->valid_until, $ks->type, $ks->rand, ) = $parts;
     if (isset($parts[5])) {
         $ks->user = $parts[5];
     }
     if (isset($parts[6])) {
         $ks->privileges = $parts[6];
     }
     if (isset($parts[7])) {
         $ks->master_partner_id = $parts[7];
     }
     if (isset($parts[8])) {
         $ks->additional_data = $parts[8];
     }
     $salt = $ks->getSalt();
     if (self::hash($salt, $real_str) != $hash) {
         throw new Exception(self::getErrorStr(self::INVALID_STR));
         //$ks->valid_string = false;
         //return $ks;
     }
     $ks->valid_string = true;
     return $ks;
 }